from modbus import Modbus, MBError, NoResponseError import time class IO_Module(Modbus): def __init__(self, tty: str, brate: int, address: int): super().__init__(tty, brate, address) self.update_segment_number = 0 def iap_start(self): """Reboot device in IAP mode""" request = bytes((self.address, 0x41, 0x01)) response = self.raw_communicate(request + self._crc(request)) def write_fw_start(self, size: int): """Ask device to start update""" self.update_segment_number = 0 request = bytes((self.address, 0x41, 0x01, 0xEF, 0xBE, 0xAD, 0xDE)) + size.to_bytes(4, 'big') response = self.raw_communicate(request + self._crc(request), 5) if len(response) == 0: raise NoResponseError('No response on WRITE_START command') if len(response) != 5: raise MBError('Incorrect response length') if response[:3] != bytes((self.address, 0x41, 0x01)): raise MBError('Incorrect response') def update(self): self.iap_start() time.sleep(4) self.write_fw_start(123) def main(): dev = IO_Module('COM22', 115200, 1) dev.update() if __name__ == '__main__': main()