io_module.py 1.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142
  1. from modbus import Modbus, MBError, NoResponseError
  2. import time
  3. class IO_Module(Modbus):
  4. def __init__(self, tty: str, brate: int, address: int):
  5. super().__init__(tty, brate, address)
  6. self.update_segment_number = 0
  7. def iap_start(self):
  8. """Reboot device in IAP mode"""
  9. request = bytes((self.address, 0x41, 0x01))
  10. response = self.raw_communicate(request + self._crc(request))
  11. def write_fw_start(self, size: int):
  12. """Ask device to start update"""
  13. self.update_segment_number = 0
  14. request = bytes((self.address, 0x41, 0x01, 0xEF, 0xBE, 0xAD, 0xDE)) + size.to_bytes(4, 'big')
  15. response = self.raw_communicate(request + self._crc(request), 5)
  16. if len(response) == 0:
  17. raise NoResponseError('No response on WRITE_START command')
  18. if len(response) != 5:
  19. raise MBError('Incorrect response length')
  20. if response[:3] != bytes((self.address, 0x41, 0x01)):
  21. raise MBError('Incorrect response')
  22. def update(self):
  23. self.iap_start()
  24. time.sleep(4)
  25. self.write_fw_start(123)
  26. def main():
  27. dev = IO_Module('COM22', 115200, 1)
  28. dev.update()
  29. if __name__ == '__main__':
  30. main()