1

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

示例:00 03 00 01 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 00 00 0 0 00 00 0 0 0 0 00 00 0 0 0 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 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 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 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 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 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 00 00 00 00 00 0

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

4

2 回答 2

0

你怎么用write_registers

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

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, ...])

您可以从原始整数构建 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]
于 2022-01-14T01:48:29.333 回答
0

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

虽然您可以使用一些位运算符来做到这一点,但为此使用struct 库可能更直接。

您可以像这样创建您的打包价值:

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_valuewrite_register(). 您可能必须使用字节顺序(<Hvs. >H)才能获得所需的顺序。

于 2022-01-14T01:56:09.377 回答