sys_params.py 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142
  1. from modbus import Modbus
  2. from mb_registers import SysReg
  3. from colorama import Fore
  4. import time
  5. import random
  6. from datetime import datetime, timedelta, timezone
  7. models = {0x100: 'MDIO_88', 0x200: 'MAO_8', 0x300: 'MAI_12'}
  8. test_state = {0: 'No Test', 1: 'Test OK', 2: 'Test FAIL'}
  9. class IO_SysParams:
  10. SYS_TEST_OK = 0x0001
  11. SAVE_SYS_SETTINGS = 0x0001
  12. SAVE_SETTIGNS = 0x0001
  13. def __init__(self, modbus: Modbus):
  14. self.modbus = modbus
  15. self.MODEL_MDIO_88 = 0x0100
  16. self.MODEL_MAO_8 = 0x0200
  17. self.MODEL_MAI_12 = 0x0300
  18. t = datetime.now(timezone.utc).astimezone()
  19. self.utc_offset = t.utcoffset() // timedelta(seconds=1)
  20. def get_system_vars(self):
  21. """Запрос системных настроек и параметров"""
  22. print(Fore.LIGHTMAGENTA_EX + "\nSystem settings and params:\n")
  23. # Модель
  24. model = self.modbus.read_holding_registers(SysReg.MODEL.value, 1)[0]
  25. print("Model: ", Fore.LIGHTMAGENTA_EX + models[model])
  26. # Ревизия платы
  27. hw_rev = self.modbus.read_holding_registers(SysReg.HW_REV.value, 1)[0]
  28. print("HW revision: ", Fore.LIGHTMAGENTA_EX + str(hw_rev))
  29. # Дата производства
  30. prod_date = self.modbus.read_uint32_holding(SysReg.PRODATE.value)
  31. t = time.gmtime(prod_date)
  32. print("Prod date: ", Fore.LIGHTMAGENTA_EX + "{}.{}.{} {}:{}:{}".format(t.tm_mday, t.tm_mon, t.tm_year,
  33. t.tm_hour, t.tm_min, t.tm_sec))
  34. # Серийный номер
  35. serial_number = self.modbus.read_uint32_holding(SysReg.SN.value)
  36. print("SN: ", Fore.LIGHTMAGENTA_EX + str(serial_number))
  37. # Версия ПО
  38. fw_bytes = b''
  39. data = self.modbus.read_holding_registers(SysReg.FW_VER.value, 4)
  40. fw_raw = list(data)
  41. fw_raw.reverse()
  42. for i in fw_raw:
  43. fw_bytes += i.to_bytes(2, 'little')
  44. fw = fw_bytes.decode('utf-8')
  45. print("FW version: ", Fore.LIGHTMAGENTA_EX + fw)
  46. # Статус тестирования
  47. status = self.modbus.read_holding_registers(SysReg.TEST_STATUS.value, 1)[0]
  48. print("Test status: ", Fore.LIGHTMAGENTA_EX + test_state[status])
  49. # Локальное время модуля
  50. t = time.ctime(self.get_rtc()/1000 - self.utc_offset)
  51. print("Local time : ", Fore.LIGHTMAGENTA_EX + t)
  52. # Пользовательская информация
  53. info_bytes = b''
  54. data = self.modbus.read_holding_registers(SysReg.INFO.value, 16)
  55. info_raw = list(data)
  56. info_raw.reverse()
  57. for i in info_raw:
  58. info_bytes += i.to_bytes(2, 'little')
  59. info = info_bytes.decode('utf-8')
  60. print("Info: ", Fore.LIGHTMAGENTA_EX + info)
  61. def set_system_vars(self, password: int):
  62. """Установка системных настроек"""
  63. # Отправка пароля для разблокирования доступа к системным настройкам
  64. print("Send password...")
  65. self.modbus.write_holding_register(SysReg.PASSWORD.value, password)
  66. time.sleep(0.1)
  67. # Дата производства. На день назад от текущего момента.
  68. prod_time = int(time.time()) - time.timezone - 3600*24
  69. print("Set production date: ", prod_time)
  70. self.modbus.write_uint32(SysReg.PRODATE.value, prod_time)
  71. # Серийный номер
  72. sn = random.randint(10000, 1000000)
  73. print("Set SN: ", sn)
  74. self.modbus.write_uint32(SysReg.SN, sn)
  75. # Статус тестирования
  76. print("Set test status: Test OK")
  77. self.modbus.write_holding_register(SysReg.TEST_STATUS.value, self.SYS_TEST_OK)
  78. # Команда сохранения системных настроек
  79. print("Save system settings...")
  80. self.modbus.write_holding_register(SysReg.SAVE_SYS.value, self.SAVE_SYS_SETTINGS)
  81. def save_sattings(self):
  82. self.modbus.write_holding_register(SysReg.COMMAND.value, self.SAVE_SETTIGNS)
  83. def get_uptime(self):
  84. return self.modbus.read_uint32_holding(SysReg.UPTIME.value)
  85. def get_rtc(self):
  86. return self.modbus.read_uint64_holding(SysReg.RTC.value)
  87. def set_rtc(self):
  88. """Установить текущее время"""
  89. t = int((time.time() + self.utc_offset) * 1000)
  90. self.modbus.write_uint64(SysReg.RTC.value, t)
  91. def set_info(self, value: str):
  92. ascii_data = [ord(char) for char in value]
  93. if len(ascii_data) < 32:
  94. for _ in range(32 - len(ascii_data)):
  95. ascii_data += b'\0'
  96. ascii_data.reverse()
  97. self.modbus.write_holding_registers_raw(SysReg.INFO.value, bytes(ascii_data))
  98. # def set_manager_register(dev: IO_Module, commands: list):
  99. # foo = 0
  100. # for command in commands:
  101. # foo |= command
  102. # print(foo)
  103. # # dev.write_holding_register(reg_table['param_manager'])
  104. def main():
  105. pass
  106. if __name__ == '__main__':
  107. main()