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...