在 python 中使用 modbus 在 16 位寄存器中写入特定位

Write a specific bit in a 16bits register with modbus in python

我尝试与使用 modbus 协议的 m221 模块 (schneider Electrique) 进行通信。 我可以使用 pymodbus (read_input_register, write_register) 读取和写入寄存器的值,但是为了控制 m221 模块,我只需要将寄存器的一位设置为 1。(例如:寄存器的第 11 位10).

有谁知道我该怎么做,或者是否可能?

你必须读取16位寄存器,修改位并写回。这当然不是原子操作,所以如果在读-修改-写周期中间有其他东西修改了其他位之一,那么您将覆盖它们的更改。

一些设备支持功能 0x16,这是对寄存器的掩码写入,即提供 AND + OR 位掩码以指示实际写入寄存器中的哪些位,然后其他位将保持不变。

编辑:实际上 pymodbus 似乎支持 Mask Write Register。

设置寄存器 10 的第 11 位:

client.mask_write_register(10, and_mask=0xFFFF, or_mask=0b0000000000100000)

这里假设第 11 位表示从 MSB 到 LSB 的第 11 位。