如何使用最小Modbus写入寄存器写入前两个字节



我正试图弄清楚如何使用minimalModbus写入寄存器命令写入前两个字节。寄存器大小-240(无符号8位int数组(,我使用了write.registers命令并将值作为数组传递,但写入值发生在2和4字节中。

示例:00 03 00 01 00 00 00 00 0 00 00 00 000 00 00 00 0000 00 00 00.00 00 00 00/00 00 00 00-00 00 00 00:00 00 00 00.00 00 00 00.00 00 00 0000 00 00 00 000 00 00 00 0 00 00 00 0000 00 00 00.00 00 00 00/00 00 00 00:00 00 00 00.00 00 00 00 00%00 00 00.00 00 00 00 00-00 00 00 0.00 00 00 00 0000 00 00 00时

相反,我希望结果为03 01,后面跟其他字节。请给一些建议

我从未使用过minimalmodbus,但文档建议寄存器的大小为16位。这解释了为什么您写入的每个值都被一个字节填充。1和3在16位中被表示为0x0001和0x0003。您需要将两个字节打包为一个16位的值。

虽然您可以使用一些位运算符来实现这一点,但使用结构库可能更简单。

你可以这样创造你的打包价值:

bin_data = struct.pack('BB', (3,1)) # Turn into bytes 0x0301
packed_value = struct.unpack('H', bin_data)  # 259 or 769 (depending on endianness)

然后尝试将packed_value传递给write_register()。您可能必须使用endianness(<H>H(才能获得您想要的顺序。

如何使用write_registers

我希望有一个16位int的列表,所以你可以简单地把它写为

write_registers(address, [3, 1, ...])

或者,您可以使用更详细的write_bits来推送您想要的

write_bits(address, [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, ...])

你可以从你的原始int构建一个16位块的二进制视图,比如

>>> list(map(int, "".join(f"{x:016b}" for x in [3, 1])))
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1]

相关内容