123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266 |
- from io_module import IO_Module
- from modbus import Modbus, MBError, NoResponseError
- from log_reader import DigitalLogReader
- import colorama
- from colorama import Fore
- from time import sleep
- import time
- from datetime import datetime, timedelta, timezone
- from mb_registers import DIO_REGS
- from serial import Serial
- class IO_Digital(IO_Module):
- def __init__(self, modbus: Modbus):
- self.modbus = modbus
- super().__init__(self.modbus)
- self.log = DigitalLogReader(self.modbus)
-
- '''Запрос параметров'''
-
- def get_inputs_bit(self) -> str:
- data = self.modbus.read_holding_registers(DIO_REGS['in_bits'], 1)
- return format(data[0], '08b')
-
- 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
-
- 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
-
- def get_inputs_mode(self):
- data = self.modbus.read_holding_registers(DIO_REGS['in_mode'], 1)
- return format(data[0], '08b')
-
- def get_inputs_norm_state(self):
- data = self.modbus.read_holding_registers(DIO_REGS['in_norm'], 1)
- return format(data[0], '08b')
-
- 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_loads_bit(self):
- data = self.modbus.read_holding_registers(DIO_REGS['load_bits'], 1)
- return format(data[0], '08b')
-
- def get_cred_bit(self):
- data = self.modbus.read_holding_registers(DIO_REGS['cred_bits'], 1)
- return format(data[0], '08b')
- 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 set_outputs(self, val):
- self.modbus.write_holding_register(DIO_REGS['out_cur'], val)
-
- def set_output(self, output, val):
- ret = self.modbus.read_holding_registers(DIO_REGS['out_cur'], 1)
- if val == 1:
- data = ret[0] | (0b1 << (output - 1))
- else:
- data = ret[0] & ~(0b1 << (output - 1))
- self.set_outputs(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())
-
- print('Debounce input (ms) :', Fore.GREEN + ' | '.join(str(el) for el in self.get_debounce_channels()))
-
- def print_loads(self):
-
- print('Loads values [bit field] :', Fore.GREEN + self.get_loads_bit())
-
- print('Credibility loads [bit field] :', Fore.GREEN + self.get_cred_bit())
- class IO_DigitalTester:
- def __init__(self, dev_tester: IO_Digital, dev_dut: IO_Digital):
- self.tester = dev_tester
- self.dut = dev_dut
- '''Управление DUT'''
-
- def dut_switch(self, state: bool):
- self.tester.set_output(1, state)
-
- def dut_set_odd_inputs(self):
- self.tester.set_output(2, False)
-
- def dut_set_even_imputs(self):
- self.tester.set_output(2, True)
- '''Тест входов'''
- def test_inputs(self):
- self.dut_set_even_imputs()
- time.sleep(0.1)
- self.dut.print_inputs()
- time.sleep(1)
- self.dut_set_odd_inputs()
- time.sleep(0.1)
- self.dut.print_inputs()
- time.sleep(1)
- '''Тест выходов и датчика обрыва нагрузки'''
- def test_load(self):
-
- print("Все выходы DUT разомкнуты...")
- self.dut.set_outputs(0)
- self.dut.print_loads()
- time.sleep(0.1)
-
- print("Все выходы DUT замкнуты...")
- self.dut.set_outputs(0b11111111)
- time.sleep(0.1)
-
- for i in range(1, 9):
-
- print(f"Разомкнуть выход {i}")
- self.dut.set_output(i, 0)
- time.sleep(1)
- self.dut.print_loads()
- self.dut.set_output(i, 1)
- time.sleep(1)
- def get_load(self):
- self.dut.set_outputs(0b11110111)
-
- time.sleep(1)
- self.dut.print_loads()
- def main():
- colorama.init(autoreset=True)
-
- serial_port = Serial('COM56', 115200, timeout=0.05, parity='N', xonxoff=False)
-
- modbus_tester = Modbus(serial_port, 1)
-
- dio = IO_Digital(modbus_tester)
- '''Тесты отдельного модуля DIO'''
- dio.sys.get_system_vars()
-
-
-
-
-
- '''Включить DUT'''
-
- '''Запросить системные настройки DUT'''
-
- '''Тест входов. Переключение значений на входах DUT'''
-
-
- '''Тестирование выходов и датчиков обрыва нагрузки'''
-
-
-
- '''Системные переменные и параметры'''
-
- ''' Установить текущее время с учетом часового пояса'''
-
-
- '''Лог и архив. Настройки лога.'''
-
-
-
-
-
-
-
-
-
-
-
- '''Лог'''
-
- '''Архив'''
-
-
- '''Сохранение настроек'''
-
- '''Настройки'''
- '''Регистры модуля'''
-
- '''Настройи модуля'''
-
-
-
-
-
- '''Обновление'''
-
-
-
- if __name__ == '__main__':
- main()
|