pyModbusTCP icon indicating copy to clipboard operation
pyModbusTCP copied to clipboard

Signed write_single_register

Open advoenkin opened this issue 1 year ago • 1 comments

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.

advoenkin avatar Feb 27 '24 10:02 advoenkin

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)

sourceperl avatar Mar 01 '24 08:03 sourceperl