tester_dio.py 7.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226
  1. from tester import *
  2. from modbus import Modbus
  3. from digital_io import IO_Digital
  4. from serial import Serial
  5. import colorama
  6. from colorama import Fore
  7. class DIO_Tester(Tester):
  8. def __init__(self, dut_debug_port, mb_port, tester_addr=1, dut_address=2):
  9. super().__init__(dut_debug_port)
  10. serial_port = Serial(mb_port, 115200, timeout=0.05, parity='N', xonxoff=False)
  11. self.modbus_tester = Modbus(serial_port, tester_addr)
  12. self.modbus_dut = Modbus(serial_port, dut_address)
  13. self.tester = IO_Digital(self.modbus_tester)
  14. self.dut = IO_Digital(self.modbus_dut)
  15. def startup(self):
  16. """Предварительная настройка tester, dut"""
  17. # Отключаем безопасные режимы
  18. self.tester.sys.set_save_mode(0)
  19. self.dut.sys.set_save_mode(0)
  20. # Подача питания на DUT
  21. self.tester.set_output(1, 1)
  22. time.sleep(0.3)
  23. def test_di(self):
  24. """Тест цифровых вхдов"""
  25. print('[Тестер] Установка выхода 2 --> 0')
  26. self.tester.set_output(2, 0)
  27. time.sleep(0.5)
  28. ret = self.dut.get_inputs_bit()
  29. even_inputs = ret[::2] # четные
  30. odd_inputs = ret[1::2] # нечетные
  31. if odd_inputs != '1111':
  32. print(Fore.RED + f'Нечетные входы не замкнуты [{odd_inputs}]. ERROR.')
  33. else:
  34. print(Fore.GREEN + 'Нечетные входы замкнуты. OK.')
  35. if even_inputs != '0000':
  36. print(Fore.RED + f'Четные входы не разомкнуты [{even_inputs}]. ERROR.')
  37. else:
  38. print(Fore.GREEN + 'Четные входы разомкнуты. OK.')
  39. print('[Тестер] Установка выхода 2 --> 1')
  40. self.tester.set_output(2, 1)
  41. time.sleep(0.5)
  42. ret = self.dut.get_inputs_bit()
  43. even_inputs = ret[::2] # четные
  44. odd_inputs = ret[1::2] # нечетные
  45. if odd_inputs != '0000':
  46. print(Fore.RED + f'Нечетные входы не разомкнуты [{odd_inputs}]. ERROR.')
  47. else:
  48. print(Fore.GREEN + 'Нечетные входы разомкнуты. OK.')
  49. if even_inputs != '1111':
  50. print(Fore.RED + f'Четные входы не замкнуты [{even_inputs}]. ERROR.')
  51. else:
  52. print(Fore.GREEN + 'Четные входы замкнуты. OK.')
  53. def test_do(self, do_number=1):
  54. """Проверка выхода"""
  55. self.dut.set_outputs_state(0b0000_0001)
  56. self.dut.set_outputs(0b1111_1111)
  57. time.sleep(1)
  58. self.dut.set_outputs(0b1111_1110)
  59. time_start = time.time()
  60. time.sleep(1)
  61. while True:
  62. ret = self.dut.get_loads_bit()
  63. time.sleep(0.1)
  64. if ret != '00000000':
  65. print(ret)
  66. print(time.time() - time_start)
  67. break
  68. return
  69. self.dut.set_outputs(0b1111_1100)
  70. time.sleep(1)
  71. ret = self.dut.get_loads_bit()
  72. print(ret)
  73. def test_rtc(self):
  74. """Проверка часов, батарейки и переключателя modbus адреса"""
  75. print("[Tester] Установка времени на DUT")
  76. self.dut.sys.set_rtc()
  77. # Снимаем питание с DUT
  78. self.tester.set_output(1, 0)
  79. print(Fore.YELLOW + "Переключите адрес на DUT в положение 'все переключатели вверх'.")
  80. print(Fore.YELLOW + "Затем нажмите 'Enter'")
  81. input()
  82. # Подаем питание на DUT
  83. self.tester.set_output(1, 1)
  84. time.sleep(3)
  85. # Меняем modbus-адрес DUT
  86. self.modbus_dut.address = 15
  87. dut_time = self.dut.sys.get_rtc()
  88. print("Время DUT", dut_time)
  89. print(time.time() + self.dut.sys.utc_offset, dut_time/1000.0)
  90. print(abs(dut_time/1000.0 - (time.time() + self.dut.sys.utc_offset)))
  91. if abs(dut_time/1000.0 - (time.time() + self.dut.sys.utc_offset)) > 1:
  92. print(Fore.RED + f'Время не соответствует реальному. ERROR.')
  93. else:
  94. print(Fore.GREEN + 'Тест RTC и переключателя адреса. OK.')
  95. def test_led(self):
  96. # Зеленые LED индикациии входов
  97. print(Fore.YELLOW + "Посмотрите на зеленые светодиоды индикации входов")
  98. self.tester.set_output(2, 1)
  99. time.sleep(1)
  100. self.tester.set_output(2, 0)
  101. time.sleep(1)
  102. self.tester.set_output(2, 1)
  103. time.sleep(1)
  104. self.tester.set_output(2, 0)
  105. print("Нажмите 'Enter'")
  106. input()
  107. # Зеленые LED индикации
  108. print(Fore.YELLOW + "Посмотрите на зеленые светодиоды индикации выходов")
  109. time.sleep(2)
  110. # включаем все выходы
  111. self.dut.set_outputs_state(0b1111_1111)
  112. for i in range(1, 9):
  113. self.dut.set_output(i, 1)
  114. time.sleep(1)
  115. for i in range(8, 0, -1):
  116. self.dut.set_output(i, 0)
  117. time.sleep(1)
  118. print("Нажмите 'Enter'")
  119. input()
  120. # Красные LED индикации нагрузки/аварии выходов
  121. print(Fore.YELLOW + "Посмотрите на красные светодиоды индикации аварий")
  122. time.sleep(2)
  123. self.dut.set_outputs_state(0b0000_0000)
  124. time.sleep(2)
  125. for i in range(1, 9):
  126. self.dut.set_output_state(i, 1)
  127. time.sleep(1)
  128. for i in range(8, 0, -1):
  129. self.dut.set_output_state(i, 0)
  130. time.sleep(1)
  131. print("Нажмите 'Enter'")
  132. input()
  133. def foo(self):
  134. print(self.modbus_dut.address)
  135. print(self.modbus_tester.address)
  136. self.modbus_dut.address = 15
  137. print(self.modbus_dut.address)
  138. def menu(self):
  139. self.tester.set_output(1, 1)
  140. self.startup()
  141. questions = [
  142. inquirer.List('action',
  143. message="Тестирование MDIO_88",
  144. choices=['Прошить IAP и FW',
  145. 'Получить системные настройки',
  146. 'Полный тест',
  147. 'Тест цифровых входов',
  148. 'Тест выхода 1',
  149. 'Тест RTC',
  150. 'Тест LED'],
  151. ),
  152. ]
  153. answers = inquirer.prompt(questions)
  154. if answers['action'] == 'Прошить IAP и FW':
  155. self.write_iap_fw('bin_dio/fw.bin', 'bin_iap/iap.bin')
  156. elif answers['action'] == 'Получить системные настройки':
  157. print('Получение системных настроек')
  158. self.dut.sys.get_system_vars()
  159. elif answers['action'] == 'Полный тест':
  160. print('Запуск цикла тестирования')
  161. elif answers['action'] == 'Тест цифровых входов':
  162. self.test_di()
  163. elif answers['action'] == 'Тест выхода 1':
  164. self.test_do()
  165. elif answers['action'] == 'Тест RTC':
  166. self.test_rtc()
  167. elif answers['action'] == 'Тест LED':
  168. self.test_led()
  169. def main():
  170. tester = DIO_Tester('COM3', 'COM11', 1, 2)
  171. tester.menu()
  172. # tester.foo()
  173. # tester.dut_powerup()
  174. if __name__ == '__main__':
  175. main()