我正在做一个学校项目,其中包括徽标和我的计算机之间的 tcp/ip 通信,但我无法使其工作。我并不是想创建一个服务器,我只是想将一个值从我的计算机发送到徽标的网络数字输入。 标志ip:192.168.0.2 网络输入 ID:1 TCP/IP 端口:502 网络输入地址:1
Estoy haciendo un proyecto escolar,que incluye una comunicacion tcp/ip entre un logo y mi computadora,pero no puedo hacer que funcione.没有 estoy tratando de hacer un servidor,solo quiero enviar un valor desde mi computadora a una entrada digital de red en el logo.
Logo ip: 192.168.0.2 红色入口 id:1 TCP/IP 港口:502 红色入口,方向:1
导入插座 从 umodbus 导入conf from umodbus.client import tcp
conf.SIGNED_VALUES = True
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) sock.connect(('192.168.0.2', 502))
消息 = tcp.write_single_coil(slave_id=1, 地址=1, 值=1)
响应 = tcp.send_message(消息, 袜子) 打印(响应) 袜子.close() print("传输完成")
尝试: 从 pymodbus.client.sync 导入 ModbusTcpClient 除了 ModuleNotFoundError: # 如果是法雅第一选项,美国第二进口选项 从 pymodbus.client 导入 ModbusTcpClient
ip_address = '192.168.0.2' port = 502 # Modbus TCP 端口缺陷
client = ModbusTcpClient(ip_address, port)
if not client.connect(): print("No se pudo conectar al cliente Modbus") 别的: print("Conexión exitosa")
# Escribir un valor digital en una bobina
def write_digital(client, address, value):
result = client.write_coil(address, value)
if result.isError():
print(f"Error al escribir el valor en la puerta digital: {result}")
else:
print("Valor escrito correctamente en la puerta digital")
# Dirección de la bobina digital (depende de la configuración del Siemens LOGO!)
coil_address = 0x0001
# Valor a escribir en la bobina digital (True para encender, False para apagar)
digital_value_to_write = True
# Escribir el valor digital
write_digital(client, coil_address, digital_value_to_write)
# Cerrar la conexión
client.close()
print("Conexión cerrada")
Probe dos codigos, pero ninguno funcionó, el primero devolvio este 错误:我尝试了这两个代码,但没有一个起作用,第一个返回此错误: 回溯(最近一次调用最后一次): 文件“C:\Users\ruths\AppData\Local\Programs\Python\Python39\modbus.py”,第 16 行,位于 响应= tcp.send_message(消息,袜子) 文件“C:\Users\ruths\AppData\Local\Programs\Python\Python39\lib\site-packages\umodbus\client\tcp.py”,第 261 行,在 send_message 中 response_error_adu = recv_exactly(sock.recv,Exception_adu_size) 文件“C:\Users\ruths\AppData\Local\Programs\Python\Python39\lib\site-packages\umodbus\utils.py”,第 132 行,recv_exactly 块=recv_fn(大小-recv_bytes) ConnectionResetError: [WinError 10054] Se ha forzado la interrupción de una conexiente por el host remoto
我尝试了这两个代码,但没有一个起作用,第一个返回此错误: 回溯(最近一次调用最后一次): 文件“C:\Users\ruths\AppData\Local\Programs\Python\Python39\modbus.py”,第 16 行,位于 响应= tcp.send_message(消息,袜子) 文件“C:\Users\ruths\AppData\Local\Programs\Python\Python39\lib\site-packages\umodbus\client\tcp.py”,第 261 行,在 send_message 中 response_error_adu = recv_exactly(sock.recv,Exception_adu_size) 文件“C:\Users\ruths\AppData\Local\Programs\Python\Python39\lib\site-packages\umodbus\utils.py”,第 132 行,recv_exactly 块=recv_fn(大小-recv_bytes) ConnectionResetError: [WinError 10054] Se ha forzado la interrupción de una conexente por el host remoto
El segundo codigo devuelve este error:[WinError 10054] Se ha forzado la interrupción de una conexiente por el host remoto
the第二个返回:[WinError 10054] Se ha forzado la interrupción de una conexion exente por el host remoto
我不知道该怎么办。
好的,我明白了。想使用 Python 通过 Modbus TCP/IP 控制 Siemens LOGO!PLC。看来遇到的问题是连接被远程主机重置,这意味着 LOGO!PLC 未响应的请求。
让我们一步一步解决这个问题,并确保的代码能够正常工作。
1. 确认 LOGO!PLC 设置
- 启用 Modbus TCP/IP: 确保在 LOGO!Comfort 软件中启用了 Modbus TCP/IP 通信。这通常在通信设置中完成。
- IP 地址和端口: 确认 LOGO!PLC 的 IP 地址确实是 192.168.0.2,并且端口号是 502。
- 网络数字输入地址: 在 LOGO!Comfort 软件中,确认网络数字输入的地址是否确实是 1。需要注意的是,Modbus 地址通常从 0 开始,因此地址 1 可能对应 LOGO!Comfort 中的地址 0。
- 防火墙: 确保的计算机和 LOGO!PLC 之间没有防火墙阻止 Modbus TCP/IP 通信(端口 502)。
2. 检查 Python 代码
提供的两个代码示例都有一些问题需要修正:
-
第一个代码示例 (umodbus):
-
slave_id
应该是 LOGO!PLC 的 Modbus 从站 ID,而不是 1。请在 LOGO!Comfort 软件中查看正确的从站 ID。 -
需要将
write_single_coil
函数的返回值赋给message
变量。
-
-
第二个代码示例 (pymodbus):
-
coil_address
需要使用正确的 Modbus 地址格式。例如,如果网络数字输入地址在 LOGO!Comfort 中是 1,那么coil_address
应该是0x0000
。
-
3. 修改后的代码示例 (pymodbus)
建议使用
pymodbus
库,因为它更加稳定和易用。以下是一个修正后的代码示例,需要将
slave_id
和
coil_address
替换为实际值:
from pymodbus.client import ModbusTcpClient
ip_address = '192.168.0.2'
port = 502
slave_id = # 替换为 LOGO!PLC 的 Modbus 从站 ID
coil_address = 0x0000 # 替换为网络数字输入的 Modbus 地址
client = ModbusTcpClient(ip_address, port)
try:
client.connect()
print("连接成功")
result = client.write_coil(coil_address, True, unit=slave_id)
if result.isError():
print(f"写入数字输出失败: {result}")
else:
print("已成功写入数字输出")
finally:
client.close()
print("连接已关闭")
4. 测试和调试
- 运行修改后的代码并观察输出。
-
如果仍然遇到
ConnectionResetError
,请使用 Wireshark 等网络分析工具捕获 Modbus TCP/IP 通信数据包,以查看是否存在错误或通信问题。
希望这些步骤可以帮助解决问题!如果还有其他问题,请随时告诉我。
标签:python,tcp,modbus From: 78808844