from io_module import IO_Module from modbus import Modbus, MBError, NoResponseError from log_reader import DigitalLogReader import log_reader import colorama from colorama import Fore from time import sleep import time from datetime import datetime, timedelta, timezone from mb_registers import DIO_REGS class IO_Digital(IO_Module): def __init__(self, tty: str, brate: int, address: int): self.modbus = Modbus(tty, brate, address) super().__init__(self.modbus) self.log = DigitalLogReader(self.modbus) '''Запрос параметров''' # 0x0100 - текущее состояние входов def get_inputs_bit(self) -> str: data = self.modbus.read_holding_registers(DIO_REGS['in_bits'], 1) return format(data[0], '08b') # 0x0101 - 0x0110 Счетчики импульсов def get_inputs_counters(self): data = [] for i in range(DIO_REGS['in_cnt'], DIO_REGS['in_cnt'] + 16, 2): data.append(self.modbus.read_uint32_holding(i)) return data # 0x0101 - 0x0110 Счетчики импульсов def get_inputs_counters(self): data = [] for i in range(DIO_REGS['in_cnt'], DIO_REGS['in_cnt'] + 16, 2): data.append(self.modbus.read_uint32_holding(i)) return data # 0x0120 - режим работы входов def get_inputs_mode(self): data = self.modbus.read_holding_registers(DIO_REGS['in_mode'], 1) return format(data[0], '08b') # 0x0122 - нормальное состояние входов def get_inputs_norm_state(self): data = self.modbus.read_holding_registers(DIO_REGS['in_norm'], 1) return format(data[0], '08b') # 0x0124 - время антидребезга (ms) def get_debounce_channel(self, input): data = self.modbus.read_holding_registers(DIO_REGS['in_deb_start'] + input - 1, 1) return data[0] def get_debounce_channels(self): return self.modbus.read_holding_registers(DIO_REGS['in_deb_start'], 8) '''Установка параметров''' def set_inputs_mode(self, val): self.modbus.write_holding_register(DIO_REGS['in_mode'], val) # def set_input_mode(self, input, val): ret = self.modbus.read_holding_registers(DIO_REGS['in_mode'], 1) if val == 1: data = ret[0] | (0b1 << (input - 1)) else: data = ret[0] & ~(0b1 << (input - 1)) self.set_inputs_mode(data) def print_inputs(self): # Значения входов (битовое поле) print('Inputs values [bit field] :', Fore.GREEN + self.get_inputs_bit()) # Значение счетчиков data = self.get_inputs_counters() print('Inputs counters :', Fore.GREEN + ' | '.join(str(el) for el in data)) # Режим работы входов (битовое поле) print('Inputs mode [bit field] :', Fore.GREEN + self.get_inputs_mode()) # Нормальное состояние входов (битовое поле) print('Inputs norm [bit field] :', Fore.GREEN + self.get_inputs_norm_state()) # Период антидребезга (ms) print('Debounce input (ms) :', Fore.GREEN + ' | '.join(str(el) for el in self.get_debounce_channels())) def main(): colorama.init(autoreset=True) dev = IO_Digital('COM24', 115200, 15) dev.modbus.MB_DEBUG = False '''Системные переменные и параметры''' dev.sys.get_system_vars() ''' Установить текущее время с учетом часового пояса''' # dev.sys.set_rtc() '''Лог и архив. Настройки лога.''' # dev.log.get_log_info() # dev.log.get_random_entries() # for i in range(8): # dev.log.set_archive_period(5 + i*2, i) # dev.log.get_log_info() # dev.log.get_all_archive() # dev.log.get_all_log() # dev.log.log_clear() # dev.log.archive_clear() '''Лог''' # dev.log.get_all_log() '''Архив''' # dev.log.get_all_archive() # print(dev.log.get_archive_entry(0, 1)) '''Сохранение настроек''' # dev.sys.save_sattings() '''Настройки''' '''Регистры модуля''' # dev.print_inputs() '''Настройи модуля''' # for i in range(1, 9): # dev.set_input_mode(i, 1) # print('Inputs mode [bit field] :', Fore.GREEN + dev.get_inputs_mode()) # dev.set_input_mode(4, 1) # dev.print_inputs() '''Обновление''' # dev.updater.update('fw.bin', 'MDIO-88') if __name__ == '__main__': main()