RTU设备有2字节、3字节和4字节的响应;即(0x03,0x04B,0xclff),给出了什么?

RTU device has both 2 byte, 3 byte and 4 byte in repsonse; ie(0x03,0x04B,0xclff), what gives?

我正在与带有 32 位宽寄存器的 modbus rtu 设备通信,显然是自定义的。
我尝试使用开箱即用的 modbus 库,但没有成功,因为我收到如下错误 modbus_tk.exceptions.ModbusInvalidResponseError: Response length is invalid 0

两件事我不明白...

  1. 为什么字节长度不一致(0x01 :1 字节 vs 0x04B:2 字节 vs 0xclff:3 字节)。
  2. 如果这是 unicode,为什么我会收到错误 response.decode('utf-8') UnicodeDecodeError: 'utf-8' codec can't decode byte 0xc1 in position 4: invalid start byte

最终响应消息是一个压力读数,看起来应该类似于 97.6。我不知道如何将字节字符串解释为 97.6.

非常感谢任何帮助。

我尝试解码为 utf-8 并将十六进制字节转换为 ascii,但没有成功。

所以我尝试了我的持有注册请求,我尝试了 ser.write(b'\x01\x03\x07\xd0\x00\x01\xc4\x86') 我得到了回应。 response = b'\x01\x03\x04B\xc1ff\x14=' 我认为这是 unicode,但我不确定。

是的,我想你遇到了一个错误,因为 modbus 寄存器的长度是 16 位。无效的起始字节很可能意味着您在错误的寄存器中开始读取。 Modbus 寄存器是顺序的,并且与文档有一个奇怪的偏移量。比如,假设您的参考地址为 40088。通过成为 40xxx,我们可以假设这是一个功能 3 寄存器,但不是强制性的。现在,实际上地址可以是基数0或基数1,即减1或加1,大多数情况下实际地址为40087。

因此,如果您去读取 40088,您将得到一个不匹配的起始字节。

关于编码,modbus 是字和字节的大端,所以你必须验证解码器,最后 RTU 帧附带的信息比请求的值多得多。您需要阅读 modbus 规范才能知道,但通常函数有 1 个字节,长度有 2 个字节,答案有 2 个字节,然后有 1 个字节用于关闭,或类似的东西。我不太清楚细节,我用的是pymodbus!哈哈干杯