我有一个 modbus 模拟器,其中定义了 4 个从属 [1,2,3,4] [使用 modbus_tk],我还有一个 pymodbus 客户端通过 TCP 与这个 modbus 从属通信。只要我们使用正确的从设备 id(单元 id),一切都可以正常工作,但是一旦使用了无效的 id,即使对于有效的设备地址,所有事务都开始返回 None 。
下面提供了客户端代码和调试日志的示例片段以供参考,可以看出“5”是无效的从属 ID,并且它按预期失败(调试日志显示 0x83 0x4),即使对于有效设备( "1") 结果返回为 None ,从调试日志看来 data is available 。非常感谢任何关于可能出错的提示
代码
from pymodbus.client.sync import ModbusTcpClient
import logging
logging.basicConfig()
log = logging.getLogger('pymodbus')
log.setLevel(logging.DEBUG)
client = ModbusTcpClient('127.0.0.1', 5440)
for x in range(2):
log.debug( "iteration %s " % x)
for slave in [1, 5]:
try:
log.debug( "Slave ID %s" % slave)
result = client.read_holding_registers(0,1, unit=slave)
print result.registers[0]
except Exception as e :
# Attribute error due to result as None
log.debug( "In Exception for slave ID %s" % slave)
client.close()
日志
DEBUG:pymodbus:iteration 0
DEBUG:pymodbus:Slave ID 1
DEBUG:pymodbus.transaction:Running transaction 1
DEBUG:pymodbus.transaction:0x0 0x1 0x0 0x0 0x0 0x5 0x1 0x3 0x2 0x0 0x52
82 comment-----> This is the actual Value for holding registers from print statement(0x52)
DEBUG:pymodbus.factory:Factory Response[3]
DEBUG:pymodbus.transaction:adding transaction 1
DEBUG:pymodbus.transaction:getting transaction 1
DEBUG:pymodbus:Slave ID 5
DEBUG:pymodbus.transaction:Running transaction 2
DEBUG:pymodbus.transaction:0x83 0x4
DEBUG:pymodbus.transaction:getting transaction 2
DEBUG:pymodbus:In Exception for slave ID 5
DEBUG:pymodbus:iteration 1
DEBUG:pymodbus:Slave ID 1
DEBUG:pymodbus.transaction:Running transaction 3
DEBUG:pymodbus.transaction:0x0 0x3 0x0 0x0 0x0 0x5 0x1 0x3 0x2 0x0 0x52
comment ---> Value (0x52) appears to be recieved but somehow not reached
DEBUG:pymodbus.transaction:getting transaction 3
DEBUG:pymodbus:In Exception for slave ID 1
DEBUG:pymodbus:Slave ID 5
DEBUG:pymodbus.transaction:Running transaction 4
DEBUG:pymodbus.transaction:0x83 0x4
DEBUG:pymodbus.transaction:getting transaction 4
DEBUG:pymodbus:In Exception for slave ID 5