Python PyModbus无法通过TCP读取RTU中的输入寄存器

Python PyModbus无法通过TCP读取RTU中的输入寄存器,python,tcp,modbus,pymodbus,Python,Tcp,Modbus,Pymodbus,我试图使用pymodbus读取Modbus信号,但出现错误 来源如下: 当服务器响应TCP时,有一个MAC地址通知功能。Modbus通信如何能够不出错? 如何删除TCP标头部分 手册的地址如下: 结果是: DEBUG:pymodbus.transaction:Current transaction state - IDLE DEBUG:pymodbus.transaction:Running transaction 1 DEBUG:pymodbus.transaction:SEND: 0x1

我试图使用
pymodbus
读取Modbus信号,但出现错误 来源如下:
当服务器响应TCP时,有一个MAC地址通知功能。Modbus通信如何能够不出错? 如何删除TCP标头部分

手册的地址如下:

结果是:

DEBUG:pymodbus.transaction:Current transaction state - IDLE
DEBUG:pymodbus.transaction:Running transaction 1
DEBUG:pymodbus.transaction:SEND: 0x18 0x4 0x0 0x0 0x0 0xa 0x72 0x4
DEBUG:pymodbus.client.sync:New Transaction state 'SENDING'
DEBUG:pymodbus.transaction:Changing transaction state from 'SENDING' to 'WAITING FOR REPLY'
DEBUG:pymodbus.transaction:Changing transaction state from 'WAITING FOR REPLY' to 'PROCESSING REPLY'
DEBUG:pymodbus.transaction:RECV: 0x30 0x30 0x33 0x30 0x66 0x39 0x31 0x31 0x34 0x30 0x38 0x35 0xd 0xa 0x18 0x4 0x14 0xe8 0xf9 0x2 0x45 0xf3 0x88 0x1 0x22
DEBUG:pymodbus.framer.rtu_framer:CRC invalid, discarding header!!
DEBUG:pymodbus.framer.rtu_framer:Resetting frame - Current Frame in buffer - 0x30 0x30 0x33 0x30 0x66 0x39 0x31 0x31 0x34 0x30 0x38 0x35 0xd 0xa 0x18 0x4 0x14 0xe8 0xf9 0x2 0x45 0xf3 0x88 0x1 0x22
DEBUG:pymodbus.framer.rtu_framer:Frame check failed, ignoring!!
DEBUG:pymodbus.framer.rtu_framer:Resetting frame - Current Frame in buffer -
DEBUG:pymodbus.transaction:Getting transaction 24
DEBUG:pymodbus.transaction:Changing transaction state from 'PROCESSING REPLY' to 'TRANSACTION_COMPLETE'
AttributeError: 'ModbusIOException' object has no attribute 'registers'
DEBUG:pymodbus.transaction:Current transaction state - IDLE
DEBUG:pymodbus.transaction:Running transaction 1
DEBUG:pymodbus.transaction:SEND: 0x18 0x4 0x0 0x0 0x0 0xa 0x72 0x4
DEBUG:pymodbus.client.sync:New Transaction state 'SENDING'
DEBUG:pymodbus.transaction:Changing transaction state from 'SENDING' to 'WAITING FOR REPLY'
DEBUG:pymodbus.transaction:Changing transaction state from 'WAITING FOR REPLY' to 'PROCESSING REPLY'
DEBUG:pymodbus.transaction:RECV: 0x30 0x30 0x33 0x30 0x66 0x39 0x31 0x31 0x34 0x30 0x38 0x35 0xd 0xa 0x18 0x4 0x14 0xe9 0x9f 0x2 0x45 0xf3 0xd5 0x1 0x22
DEBUG:pymodbus.framer.rtu_framer:CRC invalid, discarding header!!
DEBUG:pymodbus.framer.rtu_framer:Resetting frame - Current Frame in buffer - 0x30 0x30 0x33 0x30 0x66 0x39 0x31 0x31 0x34 0x30 0x38 0x35 0xd 0xa 0x18 0x4 0x14 0xe9 0x9f 0x2 0x45 0xf3 0xd5 0x1 0x22
DEBUG:pymodbus.framer.rtu_framer:Frame check failed, ignoring!!
DEBUG:pymodbus.framer.rtu_framer:Resetting frame - Current Frame in buffer -
DEBUG:pymodbus.transaction:Getting transaction 24
DEBUG:pymodbus.transaction:Changing transaction state from 'PROCESSING REPLY' to 'TRANSACTION_COMPLETE'
AttributeError: 'ModbusIOException' object has no attribute 'registers'

您收到的消息无效,您可以看到CRC检查失败-问题在于modbusTCP服务器。因此,
响应
没有导致异常的atribute
寄存器。但是,如果您想查看错误的外观,则应在不打印任何其他内容的情况下打印
rr

检查是否有错误的好方法是使用
isError()
method:

if rr.isError():
    # handle error
else:
    # proceed with response
如果您试图解码消息,应使用
BinaryPayloadDecoder
,如下所示:

decoder = BinaryPaloadDecoder.fromRegisters(rr.registers)
value = decoder.decode_32bit_float()
完全参考


不幸的是,我不知道您所说的“如何删除TCP头部分”是什么意思。

我不确定这是否是一个编码问题。我最近做了一个涉及MODBUS over TCP的项目,不需要进行校验和计算,所以不可能出现CRC错误,这显然是您看到的。根据维基百科的说法,TCP上有两种MODBUS——一种涉及校验和,另一种不涉及校验和。我认为您需要检查设备的文档,然后检查PyMODBUS库的配置。请添加您正在与之通信的设备的详细信息;我怀疑您的问题可能与类似。谢谢您的手册。您在(现已删除)回答中提到了“发送MAC地址”设置;这需要关闭(接收MAC地址不是modbus规范的一部分)。在您的示例中,
0x30 0x30 0x33 0x30 0x66 0x39 0x31 0x31 0x34 0x30 0x38 0x35 0xd 0xa
因为ASCII是“0030f9114085”,后跟CR/LF,所以看起来像是MAC地址(并导致问题-后面的位是我所期望的)。没错,MAC地址连接到TCP头,它导致了问题。如何在使用此功能时无误地打印它您需要添加代码以自己从套接字检索MAC(在调用
client.connect()
之后)。注意-您可以编辑您的问题(无需创建新的几乎相同的问题)。由于TCP响应部分附加了更多数据,因此会发生错误。
decoder = BinaryPaloadDecoder.fromRegisters(rr.registers)
value = decoder.decode_32bit_float()