The pyModbusTCP.utils module provides helper functions for converting Modbus register data into usable Python types, such as handling two's complement, bit manipulation, and floating-point conversions.
Two's Complement (Negative Numbers)
Convert 16-bit register lists to signed integers:
from pyModbusTCP import utils
list_16_bits = [0x0000, 0xFFFF, 0x00FF, 0x8001]
print(utils.get_list_2comp(list_16_bits, 16)) # [0, -1, 255, -32767]
Bit Manipulation
Convert an integer to an array of booleans:
from pyModbusTCP import utils
print(utils.get_bits_from_int(0x05, val_size=8)) # [True, False, True, False, False, False, False, False]
32-bit Register Conversion (Long Format)
Convert a list of 16-bit words into 32-bit integers (supports Big and Little Endian):
from pyModbusTCP import utils
list_16_bits = [0x0123, 0x4567, 0xdead, 0xbeef]
# Big Endian (Default)
list_32_bits = utils.word_list_to_long(list_16_bits)
# Little Endian
list_32_bits = utils.word_list_to_long(list_16_bits, big_endian=False)
IEEE Floating-Point Conversion
Encode/decode 32-bit (single) or 64-bit (double) precision floats:
from pyModbusTCP import utils
# 32-bit Single Precision
encoded = utils.encode_ieee(0.3)
decoded = utils.decode_ieee(encoded)
# 64-bit Double Precision
encoded_64 = utils.encode_ieee(6.62606957e-34, double=True)
decoded_64 = utils.decode_ieee(encoded_64, double=True)
from pyModbusTCP import utils
# Example: get signed 16-bit integers from a list
print(utils.get_list_2comp([0xFFFF], 16))