我正试图弄清楚如何使用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]