tester_dio.py 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271
  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. for i in range(1, 9):
  79. self.test_do(i)
  80. time.sleep(0.3)
  81. def test_rtc(self):
  82. """Проверка часов, батарейки и переключателя modbus адреса"""
  83. print("[Tester] Установка времени на DUT")
  84. self.dut.sys.set_rtc()
  85. # Снимаем питание с DUT
  86. self.tester.set_output(1, 0)
  87. print(Fore.YELLOW + "Переключите адрес на DUT в положение 'все переключатели вверх'.")
  88. print(Fore.YELLOW + "Затем нажмите 'Enter'")
  89. input()
  90. # Подаем питание на DUT
  91. self.tester.set_output(1, 1)
  92. time.sleep(3)
  93. # Меняем modbus-адрес DUT
  94. self.modbus_dut.address = 15
  95. dut_time = self.dut.sys.get_rtc()
  96. print("Время DUT", dut_time)
  97. print(time.time() + self.dut.sys.utc_offset, dut_time/1000.0)
  98. print(abs(dut_time/1000.0 - (time.time() + self.dut.sys.utc_offset)))
  99. if abs(dut_time/1000.0 - (time.time() + self.dut.sys.utc_offset)) > 1:
  100. print(Fore.RED + f'Время не соответствует реальному. ERROR.')
  101. else:
  102. print(Fore.GREEN + 'Тест RTC и переключателя адреса. OK.')
  103. print(Fore.YELLOW + "Установите modbus адрес в значение 2 и нажмите 'Enter'.")
  104. input()
  105. def test_led(self):
  106. print("[Тест... Проверка LED")
  107. # Зеленые LED индикациии входов
  108. print(Fore.YELLOW + "Посмотрите на зеленые светодиоды индикации входов")
  109. self.tester.set_output(2, 1)
  110. time.sleep(1)
  111. self.tester.set_output(2, 0)
  112. time.sleep(1)
  113. self.tester.set_output(2, 1)
  114. time.sleep(1)
  115. self.tester.set_output(2, 0)
  116. print("Нажмите 'Enter'")
  117. input()
  118. # Зеленые LED индикации
  119. print(Fore.YELLOW + "Посмотрите на зеленые светодиоды индикации выходов")
  120. time.sleep(2)
  121. # включаем все выходы
  122. self.dut.set_outputs_state(0b1111_1111)
  123. for i in range(1, 9):
  124. self.dut.set_output(i, 1)
  125. time.sleep(1)
  126. for i in range(8, 0, -1):
  127. self.dut.set_output(i, 0)
  128. time.sleep(1)
  129. print("Нажмите 'Enter'")
  130. input()
  131. # Красные LED индикации нагрузки/аварии выходов
  132. print(Fore.YELLOW + "Посмотрите на красные светодиоды индикации аварий")
  133. time.sleep(2)
  134. self.dut.set_outputs_state(0b0000_0000)
  135. time.sleep(2)
  136. for i in range(1, 9):
  137. self.dut.set_output_state(i, 1)
  138. time.sleep(1)
  139. for i in range(8, 0, -1):
  140. self.dut.set_output_state(i, 0)
  141. time.sleep(1)
  142. print("Нажмите 'Enter'")
  143. input()
  144. def test_battery_voltage(self):
  145. print("[Тест... Проверка схемы измерения напряжения батарейки CR2032]")
  146. bat_voltage = self.dut.sys.get_bat_votage()/1000.0
  147. if bat_voltage < 3.1:
  148. print(Fore.RED + f' Результат: Напряжение батареи слишком низкое {bat_voltage}. ERROR.')
  149. else:
  150. print(Fore.GREEN + f' Результат: Напряжение батареи в норме: {bat_voltage}. OK')
  151. def test_wdt(self):
  152. print("[Тест... Проверка WDT]")
  153. old_uptime = self.dut.sys.get_uptime()
  154. time.sleep(4)
  155. self.dut.sys.wdt_stop()
  156. time.sleep(2)
  157. new_uptime = self.dut.sys.get_uptime()
  158. if new_uptime > old_uptime:
  159. print(Fore.RED + ' Результат: Ошибка работы WDT [Error]')
  160. else:
  161. print(Fore.GREEN + f' Результат: WDT работает. OK')
  162. def foo(self):
  163. print(self.modbus_dut.address)
  164. print(self.modbus_tester.address)
  165. self.modbus_dut.address = 15
  166. print(self.modbus_dut.address)
  167. def menu(self):
  168. self.tester.set_output(1, 1)
  169. self.startup()
  170. questions = [
  171. inquirer.List('action',
  172. message="Тестирование MDIO_88",
  173. choices=['Прошить IAP и FW',
  174. 'Получить системные настройки',
  175. 'Полный тест',
  176. 'Тест цифровых входов',
  177. 'Тест выхода 1',
  178. 'Тест RTC',
  179. 'Тест LED',
  180. 'Тест напряжения батареи CR2032',
  181. 'Тест WDT'],
  182. ),
  183. ]
  184. answers = inquirer.prompt(questions)
  185. if answers['action'] == 'Прошить IAP и FW':
  186. self.write_iap_fw('bin_dio/fw.bin', 'bin_iap/iap.bin')
  187. elif answers['action'] == 'Получить системные настройки':
  188. print('Получение системных настроек')
  189. self.dut.sys.get_system_vars()
  190. elif answers['action'] == 'Полный тест':
  191. print('Запуск цикла тестирования')
  192. elif answers['action'] == 'Тест цифровых входов':
  193. self.test_di()
  194. elif answers['action'] == 'Тест выхода 1':
  195. # self.test_do()
  196. self.test_all_do()
  197. elif answers['action'] == 'Тест RTC':
  198. self.test_rtc()
  199. elif answers['action'] == 'Тест LED':
  200. self.test_led()
  201. elif answers['action'] == 'Тест напряжения батареи CR2032':
  202. self.test_battery_voltage()
  203. elif answers['action'] == 'Тест WDT':
  204. self.test_wdt()
  205. def main():
  206. tester = DIO_Tester('COM3', 'COM11', 1, 2)
  207. tester.menu()
  208. # tester.foo()
  209. # tester.dut_powerup()
  210. if __name__ == '__main__':
  211. main()