123456789101112131415161718192021222324252627282930313233343536373839404142 |
- 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()
|