[Python] Pymodbus reads incorrect register

Discussão em 'Python' iniciado por Stack, Junho 11, 2025.

  1. Stack

    Stack Membro Participativo

    I'm learning python and how to use the pymodbus library, I wrote some code for testing, and at first it works ok, but after a few hours, while trying to read registers from a TCP modbus slave that is far away and has some connectivity issues, the register values that are being read get scrambled between the instances of the class. I tried with other modbus clients and it doesn't happen so the problem is my code but I can't find my error.

    This is the code:

    import time

    from pymodbus.client import ModbusTcpClient
    from pymodbus.exceptions import ModbusException

    import logging

    logger = logging.getLogger(__name__)
    logger.setLevel(logging.INFO)


    file_handler = logging.FileHandler('app.log')
    stream_handler = logging.StreamHandler()


    formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
    file_handler.setFormatter(formatter)
    stream_handler.setFormatter(formatter)

    logger.addHandler(file_handler)
    logger.addHandler(stream_handler)


    test_slave = ModbusTcpClient('192.168.192.233')

    class ReadRegister:
    def __init__(self, ip_address, register, count, slave, min_val, max_val, height, name, threshold):

    self.address = ip_address
    self.register = register
    self.count = count
    self.slave = slave
    self.min_val = min_val
    self.max_val = max_val
    self.height = height
    self.name = name
    self.threshold = threshold

    self.result = None
    self.result_exists = False
    self.value = 0
    self.oldvalue = 0
    self.procvalue = 0

    def read(self):

    try:
    self.address.connect()
    self.result = self.address.read_input_registers(self.register, count=self.count, slave=self.slave)

    except ModbusException as exc:
    logger.error(f"ERROr: 1 {exc} {self.name}")
    # self.address.close()

    except Exception as random:
    print ("Error occurred")
    logger.error(f"ERROR: 2 {random} {self.name}")
    self.address.close()


    try:
    self.result
    except NameError:
    self.result_exists = False

    else:
    self.result_exists = True

    try:
    if self.result_exists is True and self.result is not None:

    self.value = self.address.convert_from_registers(self.result.registers, data_type=self.address.DATATYPE.INT16)

    print(self.value, end="")

    if self.value < 0:
    self.procvalue = round ( ( ( (self.value + 65536)- self.min_val) * self.height) / self.max_val, 2)

    else:
    self.procvalue = round( ( (self.value - self.min_val) * self.height) / self.max_val, 2)

    self.oldvalue = self.procvalue

    return {self.name: self.procvalue}
    else:
    return {self.name: self.oldvalue}

    except ModbusException as exc:
    logger.error(f"ERROR: {exc} {self.name}")
    return {self.name: self.oldvalue}
    # self.address.close()

    except Exception as error:
    print("ERROR")
    logger.error(f"ERROR: 3 {error} {self.name}")
    return {self.name: self.oldvalue}
    # self.address.close()

    alfa_read = ReadRegister(ip_address=test_slave, register=2054, count=1, slave=1, min_val=800, max_val=3200, height=6, name='alfa', threshold=1)
    bravo_read = ReadRegister(ip_address=test_slave, register=2566, count=1, slave=1, min_val=800, max_val=3200, height=4.9, name='bravo', threshold=1)
    charlie_read = ReadRegister(ip_address=test_slave, register=3078, count=1, slave=1, min_val=800, max_val=3200, height=2.36, name='charlie', threshold=1)
    delta_read = ReadRegister(ip_address=test_slave, register=3334, count=1, slave=1, min_val=800, max_val=3200, height=2.40, name='delta', threshold=1)

    data = {}

    def loop():

    alfa = alfa_read.read()
    if alfa is not None and isinstance(alfa, dict):
    data.update(alfa)
    print(alfa)

    bravo_data = bravo_read.read()
    if bravo_data is not None and isinstance(bravo_data, dict):
    data.update(bravo_data)
    print(bravo_data)

    charlie_data = charlie_read.read()
    if charlie_data is not None and isinstance(charlie_data, dict):
    data.update(charlie_data)
    print(charlie_data)

    delta_data = delta_read.read()
    if delta_data is not None and isinstance(delta_data, dict):
    data.update(delta_data)
    print(delta_data)

    while True:
    loop()
    time.sleep(10)


    I tried with other modbus clients and they work correctly so the problem is my code but I can't find the error.

    Continue reading...

Compartilhe esta Página