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

问题描述 投票:0回答:1

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

我不明白的两件事......

  1. 为什么字节长度不一致(0x01:1字节对0x04B:2字节对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然而我不确定。

python modbus
1个回答
0
投票

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

因此,如果你去阅读40088,你将有一个不匹配的起始字节。

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

© www.soinside.com 2019 - 2024. All rights reserved.