| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160 | 
							- from modbus import Modbus
 
- from mb_registers import SysReg
 
- from colorama import Fore
 
- import time
 
- import random
 
- from datetime import datetime, timedelta, timezone
 
- models = {0x100: 'MDIO_88', 0x200: 'MAO_8', 0x300: 'MAI_12'}
 
- test_state = {0: 'No Test', 1: 'Test OK', 2: 'Test FAIL'}
 
- class IO_SysParams:
 
-     
 
-     SYS_TEST_OK = 0x0001
 
-     SAVE_SYS_SETTINGS = 0x0001
 
-     SAVE_SETTIGNS = 0x0001
 
-     
 
-     def __init__(self, modbus: Modbus):
 
-         self.modbus = modbus
 
-         self.MODEL_MDIO_88 = 0x0100
 
-         self.MODEL_MAO_8 = 0x0200
 
-         self.MODEL_MAI_12 = 0x0300
 
-         t = datetime.now(timezone.utc).astimezone()
 
-         self.utc_offset = t.utcoffset() // timedelta(seconds=1)
 
-         
 
-     def get_system_vars(self):
 
-         """Запрос системных настроек и параметров"""
 
-         print(Fore.LIGHTMAGENTA_EX + "\nSystem settings and params:\n")
 
-         # Модель
 
-         model = self.modbus.read_holding_registers(SysReg.MODEL.value, 1)[0]
 
-         print("Model:       ", Fore.LIGHTMAGENTA_EX + models[model])
 
-         # Ревизия платы
 
-         hw_rev = self.modbus.read_holding_registers(SysReg.HW_REV.value, 1)[0]
 
-         print("HW revision: ", Fore.LIGHTMAGENTA_EX + str(hw_rev))
 
-         # Дата производства    
 
-         prod_date = self.modbus.read_uint32_holding(SysReg.PRODATE.value)
 
-         t = time.gmtime(prod_date)
 
-         print("Prod date:   ", Fore.LIGHTMAGENTA_EX + "{}.{}.{} {}:{}:{}".format(t.tm_mday, t.tm_mon, t.tm_year,
 
-                                                       t.tm_hour, t.tm_min, t.tm_sec))
 
-         # Серийный номер
 
-         serial_number = self.modbus.read_uint32_holding(SysReg.SN.value)
 
-         print("SN:          ", Fore.LIGHTMAGENTA_EX + str(serial_number))
 
-         # Версия ПО
 
-         fw_bytes = b''
 
-         data = self.modbus.read_holding_registers(SysReg.FW_VER.value, 4)
 
-         fw_raw = list(data)
 
-         fw_raw.reverse()
 
-         for i in fw_raw:
 
-             fw_bytes += i.to_bytes(2, 'little')
 
-         fw = fw_bytes.decode('utf-8')
 
-         print("FW version:  ", Fore.LIGHTMAGENTA_EX + fw)
 
-         # Статус тестирования
 
-         status = self.modbus.read_holding_registers(SysReg.TEST_STATUS.value, 1)[0]
 
-         print("Test status: ", Fore.LIGHTMAGENTA_EX + test_state[status])
 
-         # Локальное время модуля
 
-         t = time.ctime(self.get_rtc()/1000 - self.utc_offset)
 
-         print("Local time : ", Fore.LIGHTMAGENTA_EX + t)
 
-         # Пользовательская информация
 
-         info_bytes = b''
 
-         data = self.modbus.read_holding_registers(SysReg.INFO.value, 16)
 
-         info_raw = list(data)
 
-         info_raw.reverse()
 
-         for i in info_raw:
 
-             info_bytes += i.to_bytes(2, 'little')
 
-         info = info_bytes.decode('utf-8')
 
-         print("Info:        ", Fore.LIGHTMAGENTA_EX + info)
 
-     def set_system_vars(self, password: int):
 
-         """Установка системных настроек"""
 
-         # Отправка пароля для разблокирования доступа к системным настройкам
 
-         print("Send password...")
 
-         self.modbus.write_holding_register(SysReg.PASSWORD.value, password)
 
-         time.sleep(0.1)
 
-         # Дата производства. На день назад от текущего момента.
 
-         prod_time = int(time.time()) - time.timezone - 3600*24
 
-         print("Set production date: ", prod_time)
 
-         self.modbus.write_uint32(SysReg.PRODATE.value, prod_time)
 
-         # Серийный номер
 
-         sn = random.randint(10000, 1000000)
 
-         print("Set SN: ", sn)
 
-         self.modbus.write_uint32(SysReg.SN, sn)
 
-         # Статус тестирования
 
-         print("Set test status: Test OK")
 
-         self.modbus.write_holding_register(SysReg.TEST_STATUS.value, self.SYS_TEST_OK)
 
-         # Команда сохранения системных настроек
 
-         print("Save system settings...")
 
-         self.modbus.write_holding_register(SysReg.SAVE_SYS.value, self.SAVE_SYS_SETTINGS)
 
-     def save_sattings(self):
 
-         self.modbus.write_holding_register(SysReg.COMMAND.value, self.SAVE_SETTIGNS)
 
-     def get_uptime(self):
 
-         return self.modbus.read_uint32_holding(SysReg.UPTIME.value)
 
-     def get_save_mode(self):
 
-         return self.modbus.read_holding_registers(SysReg.SAVE_MODE.value, 1)[0]
 
-     def get_save_delay(self):
 
-         return self.modbus.read_holding_registers(SysReg.SAVE_DELAY.value, 1)[0]
 
-     def get_rtc(self):
 
-         return self.modbus.read_uint64_holding(SysReg.RTC.value)
 
-     def get_bat_votage(self):
 
-         return self.modbus.read_float_holding(SysReg.BAT_VOLTAGE.value)
 
-     def set_rtc(self):
 
-         """Установить текущее время"""
 
-         t = int((time.time() + self.utc_offset) * 1000)
 
-         self.modbus.write_uint64(SysReg.RTC.value, t)
 
-     def set_info(self, value: str):
 
-         ascii_data = [ord(char) for char in value]
 
-         if len(ascii_data) < 32:
 
-             for _ in range(32 - len(ascii_data)):
 
-                 ascii_data += b'\0'
 
-         ascii_data.reverse()
 
-         self.modbus.write_holding_registers_raw(SysReg.INFO.value, bytes(ascii_data))
 
-     def set_save_mode(self, value):
 
-         if value in [0, 1]:
 
-             self.modbus.write_holding_register(SysReg.SAVE_MODE.value, value)
 
-     def set_save_delay(self, value):
 
-         if value in range(60, 65536):
 
-             self.modbus.write_holding_register(SysReg.SAVE_DELAY.value, value)
 
- # def set_manager_register(dev: IO_Module, commands: list):
 
- #     foo = 0
 
- #     for command in commands:
 
- #         foo |= command
 
- #     print(foo)
 
-     
 
- #     # dev.write_holding_register(reg_table['param_manager'])
 
- def main():
 
-     pass
 
- if __name__ == '__main__':
 
-     main()
 
 
  |