tester_dio.py 8.6 KB

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