pyModbusTCP
pyModbusTCP copied to clipboard
Signed write_single_register
Hello dear,
I have a problem, i can't write signed value in holding registers. When i try write signed value i got error: reg_value out of range (valid from 0 to 65535)
I use server for sensor temperatures, but temperatures can be negative.
Thank you.
Hi,
Here you need to deal with two's complement (https://en.wikipedia.org/wiki/Two%27s_complement).
You can't write directly -1 since modbus request accept only 16 bits unsigned word (0 to 65535), you need to encode it first.
For example:
from pyModbusTCP.client import ModbusClient
from pyModbusTCP.utils import get_2comp
# first, apply 2's complement (for 16 bits register: -1 -> 0xffff)
int_neg = -1
int_neg_2c = get_2comp(int_neg)
print(f"2's complement of {int_neg} is 0x{int_neg_2c:04x}")
# second, write encoded value
c = ModbusClient()
c.write_single_register(reg_addr=0, reg_value=int_neg_2c)