123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305 |
- from tester import *
- from modbus import Modbus
- from digital_io import IO_Digital
- from serial import Serial
- import colorama
- from colorama import Fore
- from mb_registers import *
- class DIO_Tester(Tester):
- def __init__(self, dut_debug_port, mb_port, tester_addr=1, dut_address=2):
- super().__init__(dut_debug_port)
- serial_port = Serial(mb_port, 115200, timeout=0.05, parity='N', xonxoff=False)
- self.modbus_tester = Modbus(serial_port, tester_addr)
- self.modbus_dut = Modbus(serial_port, dut_address)
-
- self.tester = IO_Digital(self.modbus_tester)
- self.dut = IO_Digital(self.modbus_dut)
- def startup(self):
- """Предварительная настройка tester, dut"""
- self.tester.set_outputs_state(0b1111_1111)
- # Подача питания на DUT
- self.tester.set_output(1, 0)
- time.sleep(0.3)
- self.tester.set_output(1, 1)
- time.sleep(0.3)
- # Отключаем безопасные режимы
- self.tester.sys.set_save_mode(0)
- # self.dut.sys.set_save_mode(0)
-
- def test_di(self):
- """Тест цифровых вхдов"""
- print('[Тестер] Установка выхода 2 --> 0')
- self.tester.set_output(2, 0)
- time.sleep(0.5)
- ret = self.dut.get_inputs_bit()
- even_inputs = ret[::2] # четные
- odd_inputs = ret[1::2] # нечетные
- if odd_inputs != '1111':
- print(Fore.RED + f'Нечетные входы не замкнуты [{odd_inputs}]. ERROR.')
- else:
- print(Fore.GREEN + 'Нечетные входы замкнуты. OK.')
- if even_inputs != '0000':
- print(Fore.RED + f'Четные входы не разомкнуты [{even_inputs}]. ERROR.')
- else:
- print(Fore.GREEN + 'Четные входы разомкнуты. OK.')
- print('[Тестер] Установка выхода 2 --> 1')
- self.tester.set_output(2, 1)
- time.sleep(0.5)
- ret = self.dut.get_inputs_bit()
- even_inputs = ret[::2] # четные
- odd_inputs = ret[1::2] # нечетные
- if odd_inputs != '0000':
- print(Fore.RED + f'Нечетные входы не разомкнуты [{odd_inputs}]. ERROR.')
- else:
- print(Fore.GREEN + 'Нечетные входы разомкнуты. OK.')
- if even_inputs != '1111':
- print(Fore.RED + f'Четные входы не замкнуты [{even_inputs}]. ERROR.')
- else:
- print(Fore.GREEN + 'Четные входы замкнуты. OK.')
- def test_do(self, do_number=1):
- """Проверка выхода"""
- self.tester.set_output(4, 1)
- self.dut.set_outputs_state(0b1111_1111)
- time.sleep(0.5)
- self.dut.set_outputs(0b1111_1111)
- time.sleep(0.5)
- # Разомкнуть нужный выход DUT
- self.dut.set_output(do_number, 0)
- time.sleep(1)
- ret = self.dut.get_loads_bit()
- if ret[-do_number] != '0':
- print(Fore.RED + f'Нагрузка к выходу {do_number} не подключена {ret}. ERROR.')
- return
- self.tester.set_output(4, 0)
- time.sleep(0.5)
- ret = self.dut.get_loads_bit()
- if ret[-do_number] == '0':
- print(Fore.RED + f'Датчик обрыва назгрузки выхода {do_number} не работает {ret}. ERROR.')
- return
-
- print(Fore.GREEN + f'Датчик обрыва нагрузки выхода {do_number}. OK.')
- def test_all_do(self):
- for i in range(1, 9):
- self.test_do(i)
- time.sleep(0.3)
- def test_rtc(self):
- """Проверка часов, батарейки и переключателя modbus адреса"""
- print("[Tester] Установка времени на DUT")
- self.dut.sys.set_rtc()
- # Снимаем питание с DUT
- self.tester.set_output(1, 0)
- print(Fore.YELLOW + "Переключите адрес на DUT в положение 'все переключатели вверх'.")
- print(Fore.YELLOW + "Затем нажмите 'Enter'")
- input()
- # Подаем питание на DUT
- self.tester.set_output(1, 1)
- time.sleep(3)
- # Меняем modbus-адрес DUT
- self.modbus_dut.address = 15
- dut_time = self.dut.sys.get_rtc()
- print("Время DUT", dut_time)
- print(time.time() + self.dut.sys.utc_offset, dut_time/1000.0)
- print(abs(dut_time/1000.0 - (time.time() + self.dut.sys.utc_offset)))
- if abs(dut_time/1000.0 - (time.time() + self.dut.sys.utc_offset)) > 1:
- print(Fore.RED + f'Время не соответствует реальному. ERROR.')
- else:
- print(Fore.GREEN + 'Тест RTC и переключателя адреса. OK.')
- print(Fore.YELLOW + "Установите modbus адрес в значение 2 и нажмите 'Enter'.")
- input()
-
- def test_led(self):
- print("[Тест... Проверка LED")
- # Зеленые LED индикациии входов
- print(Fore.YELLOW + "Посмотрите на зеленые светодиоды индикации входов")
- self.tester.set_output(2, 1)
- time.sleep(1)
- self.tester.set_output(2, 0)
- time.sleep(1)
- self.tester.set_output(2, 1)
- time.sleep(1)
- self.tester.set_output(2, 0)
- print("Нажмите 'Enter'")
- input()
- # Зеленые LED индикации
- print(Fore.YELLOW + "Посмотрите на зеленые светодиоды индикации выходов")
- time.sleep(2)
- # включаем все выходы
- self.dut.set_outputs_state(0b1111_1111)
- for i in range(1, 9):
- self.dut.set_output(i, 1)
- time.sleep(1)
- for i in range(8, 0, -1):
- self.dut.set_output(i, 0)
- time.sleep(1)
- print("Нажмите 'Enter'")
- input()
- # Красные LED индикации нагрузки/аварии выходов
- print(Fore.YELLOW + "Посмотрите на красные светодиоды индикации аварий")
- time.sleep(2)
- self.dut.set_outputs_state(0b0000_0000)
- time.sleep(2)
- for i in range(1, 9):
- self.dut.set_output_state(i, 1)
- time.sleep(1)
- for i in range(8, 0, -1):
- self.dut.set_output_state(i, 0)
- time.sleep(1)
- print("Нажмите 'Enter'")
- input()
- def test_battery_voltage(self):
- print("[Тест... Проверка схемы измерения напряжения батарейки CR2032]")
- bat_voltage = self.dut.sys.get_bat_votage()/1000.0
- if bat_voltage < 3.1:
- print(Fore.RED + f' Результат: Напряжение батареи слишком низкое {bat_voltage}. ERROR.')
- else:
- print(Fore.GREEN + f' Результат: Напряжение батареи в норме: {bat_voltage}. OK')
- def test_wdt(self):
- print("[Тест... Проверка WDT]")
- old_uptime = self.dut.sys.get_uptime()
- time.sleep(4)
- self.dut.sys.wdt_stop()
- time.sleep(2)
- new_uptime = self.dut.sys.get_uptime()
- if new_uptime > old_uptime:
- print(Fore.RED + ' Результат: Ошибка работы WDT [Error]')
- else:
- print(Fore.GREEN + f' Результат: WDT работает. OK')
- def set_sys_params(self):
- print("Введите серийный номер устройства и нажмите 'Enter'")
- print('SN: ', end='')
- sn = input()
- # Отправка пароля для разблокирования доступа к системным настройкам
- self.dut.modbus.write_holding_register(SysReg.PASSWORD.value, 1234)
- time.sleep(0.1)
- # Актуальная дата производства
- prod_time = int(time.time()) - time.timezone
- self.dut.modbus.write_uint32(SysReg.PRODATE.value, prod_time)
- # Серийный номер
- self.dut.modbus.write_uint32(SysReg.SN.value, int(sn))
-
- # Статус тестирования
- self.dut.modbus.write_holding_register(SysReg.TEST_STATUS.value, 0x0001)
- # Команда сохранения системных настроек
- self.dut.modbus.write_holding_register(SysReg.SAVE_SYS.value, 0x0001)
- def test_all(self):
- pass
- def foo(self):
- print(self.modbus_dut.address)
- print(self.modbus_tester.address)
- self.modbus_dut.address = 15
- print(self.modbus_dut.address)
- def menu(self):
- self.tester.set_output(1, 1)
- self.startup()
-
- questions = [
- inquirer.List('action',
- message="Тестирование MDIO_88",
- choices=['Прошить IAP и FW',
- 'Прочитать системные настройки',
- 'Записать системные настройки',
- 'Полный тест',
- 'Тест цифровых входов',
- 'Тест цифровых выходов',
- 'Тест RTC',
- 'Тест LED',
- 'Тест напряжения батареи CR2032',
- 'Тест WDT',
- 'Завершить'],
- ),
- ]
- while True:
- answers = inquirer.prompt(questions)
- if answers['action'] == 'Прошить IAP и FW':
- self.write_iap_fw('bin_dio/fw.bin', 'bin_iap/iap.bin')
- elif answers['action'] == 'Прочитать системные настройки':
- self.dut.sys.get_system_vars()
- elif answers['action'] == 'Полный тест':
- print('Запуск цикла тестирования...')
- self.test_all()
- elif answers['action'] == 'Записать системные настройки':
- self.set_sys_params()
- elif answers['action'] == 'Тест цифровых входов':
- self.test_di()
- elif answers['action'] == 'Тест цифровых выходов':
- self.test_all_do()
- elif answers['action'] == 'Тест RTC':
- self.test_rtc()
- elif answers['action'] == 'Тест LED':
- self.test_led()
- elif answers['action'] == 'Тест напряжения батареи CR2032':
- self.test_battery_voltage()
- elif answers['action'] == 'Тест WDT':
- self.test_wdt()
- elif answers['action'] == 'Завершить':
- return
- def main():
- tester = DIO_Tester('COM3', 'COM11', 1, 2)
- tester.menu()
- # tester.foo()
- # tester.dut_powerup()
- if __name__ == '__main__':
- main()
|