用python中的modbus在一个16位寄存器中写入一个特定的位



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

有人知道我是怎么做到的,或者如果可能的话?

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

一些设备支持函数0x16,它是对寄存器的掩码写入,即提供AND+OR位掩码来指示寄存器中的哪些位实际上正在被写入,然后其他位将保持不变。

编辑:实际上pymodbus似乎支持掩码写入寄存器。

设置寄存器10的第11位:

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

这是假设比特11意味着从MSB向LSB计数的第11个比特。

相关内容