tester_dio.py 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305
  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. from mb_registers import *
  8. class DIO_Tester(Tester):
  9. def __init__(self, dut_debug_port, mb_port, tester_addr=1, dut_address=2):
  10. super().__init__(dut_debug_port)
  11. serial_port = Serial(mb_port, 115200, timeout=0.05, parity='N', xonxoff=False)
  12. self.modbus_tester = Modbus(serial_port, tester_addr)
  13. self.modbus_dut = Modbus(serial_port, dut_address)
  14. self.tester = IO_Digital(self.modbus_tester)
  15. self.dut = IO_Digital(self.modbus_dut)
  16. def startup(self):
  17. """Предварительная настройка tester, dut"""
  18. self.tester.set_outputs_state(0b1111_1111)
  19. # Подача питания на DUT
  20. self.tester.set_output(1, 0)
  21. time.sleep(0.3)
  22. self.tester.set_output(1, 1)
  23. time.sleep(0.3)
  24. # Отключаем безопасные режимы
  25. self.tester.sys.set_save_mode(0)
  26. # self.dut.sys.set_save_mode(0)
  27. def test_di(self):
  28. """Тест цифровых вхдов"""
  29. print('[Тестер] Установка выхода 2 --> 0')
  30. self.tester.set_output(2, 0)
  31. time.sleep(0.5)
  32. ret = self.dut.get_inputs_bit()
  33. even_inputs = ret[::2] # четные
  34. odd_inputs = ret[1::2] # нечетные
  35. if odd_inputs != '1111':
  36. print(Fore.RED + f'Нечетные входы не замкнуты [{odd_inputs}]. ERROR.')
  37. else:
  38. print(Fore.GREEN + 'Нечетные входы замкнуты. OK.')
  39. if even_inputs != '0000':
  40. print(Fore.RED + f'Четные входы не разомкнуты [{even_inputs}]. ERROR.')
  41. else:
  42. print(Fore.GREEN + 'Четные входы разомкнуты. OK.')
  43. print('[Тестер] Установка выхода 2 --> 1')
  44. self.tester.set_output(2, 1)
  45. time.sleep(0.5)
  46. ret = self.dut.get_inputs_bit()
  47. even_inputs = ret[::2] # четные
  48. odd_inputs = ret[1::2] # нечетные
  49. if odd_inputs != '0000':
  50. print(Fore.RED + f'Нечетные входы не разомкнуты [{odd_inputs}]. ERROR.')
  51. else:
  52. print(Fore.GREEN + 'Нечетные входы разомкнуты. OK.')
  53. if even_inputs != '1111':
  54. print(Fore.RED + f'Четные входы не замкнуты [{even_inputs}]. ERROR.')
  55. else:
  56. print(Fore.GREEN + 'Четные входы замкнуты. OK.')
  57. def test_do(self, do_number=1):
  58. """Проверка выхода"""
  59. self.tester.set_output(4, 1)
  60. self.dut.set_outputs_state(0b1111_1111)
  61. time.sleep(0.5)
  62. self.dut.set_outputs(0b1111_1111)
  63. time.sleep(0.5)
  64. # Разомкнуть нужный выход DUT
  65. self.dut.set_output(do_number, 0)
  66. time.sleep(1)
  67. ret = self.dut.get_loads_bit()
  68. if ret[-do_number] != '0':
  69. print(Fore.RED + f'Нагрузка к выходу {do_number} не подключена {ret}. ERROR.')
  70. return
  71. self.tester.set_output(4, 0)
  72. time.sleep(0.5)
  73. ret = self.dut.get_loads_bit()
  74. if ret[-do_number] == '0':
  75. print(Fore.RED + f'Датчик обрыва назгрузки выхода {do_number} не работает {ret}. ERROR.')
  76. return
  77. print(Fore.GREEN + f'Датчик обрыва нагрузки выхода {do_number}. OK.')
  78. def test_all_do(self):
  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. print(Fore.YELLOW + "Установите modbus адрес в значение 2 и нажмите 'Enter'.")
  105. input()
  106. def test_led(self):
  107. print("[Тест... Проверка LED")
  108. # Зеленые LED индикациии входов
  109. print(Fore.YELLOW + "Посмотрите на зеленые светодиоды индикации входов")
  110. self.tester.set_output(2, 1)
  111. time.sleep(1)
  112. self.tester.set_output(2, 0)
  113. time.sleep(1)
  114. self.tester.set_output(2, 1)
  115. time.sleep(1)
  116. self.tester.set_output(2, 0)
  117. print("Нажмите 'Enter'")
  118. input()
  119. # Зеленые LED индикации
  120. print(Fore.YELLOW + "Посмотрите на зеленые светодиоды индикации выходов")
  121. time.sleep(2)
  122. # включаем все выходы
  123. self.dut.set_outputs_state(0b1111_1111)
  124. for i in range(1, 9):
  125. self.dut.set_output(i, 1)
  126. time.sleep(1)
  127. for i in range(8, 0, -1):
  128. self.dut.set_output(i, 0)
  129. time.sleep(1)
  130. print("Нажмите 'Enter'")
  131. input()
  132. # Красные LED индикации нагрузки/аварии выходов
  133. print(Fore.YELLOW + "Посмотрите на красные светодиоды индикации аварий")
  134. time.sleep(2)
  135. self.dut.set_outputs_state(0b0000_0000)
  136. time.sleep(2)
  137. for i in range(1, 9):
  138. self.dut.set_output_state(i, 1)
  139. time.sleep(1)
  140. for i in range(8, 0, -1):
  141. self.dut.set_output_state(i, 0)
  142. time.sleep(1)
  143. print("Нажмите 'Enter'")
  144. input()
  145. def test_battery_voltage(self):
  146. print("[Тест... Проверка схемы измерения напряжения батарейки CR2032]")
  147. bat_voltage = self.dut.sys.get_bat_votage()/1000.0
  148. if bat_voltage < 3.1:
  149. print(Fore.RED + f' Результат: Напряжение батареи слишком низкое {bat_voltage}. ERROR.')
  150. else:
  151. print(Fore.GREEN + f' Результат: Напряжение батареи в норме: {bat_voltage}. OK')
  152. def test_wdt(self):
  153. print("[Тест... Проверка WDT]")
  154. old_uptime = self.dut.sys.get_uptime()
  155. time.sleep(4)
  156. self.dut.sys.wdt_stop()
  157. time.sleep(2)
  158. new_uptime = self.dut.sys.get_uptime()
  159. if new_uptime > old_uptime:
  160. print(Fore.RED + ' Результат: Ошибка работы WDT [Error]')
  161. else:
  162. print(Fore.GREEN + f' Результат: WDT работает. OK')
  163. def set_sys_params(self):
  164. print("Введите серийный номер устройства и нажмите 'Enter'")
  165. print('SN: ', end='')
  166. sn = input()
  167. # Отправка пароля для разблокирования доступа к системным настройкам
  168. self.dut.modbus.write_holding_register(SysReg.PASSWORD.value, 1234)
  169. time.sleep(0.1)
  170. # Актуальная дата производства
  171. prod_time = int(time.time()) - time.timezone
  172. self.dut.modbus.write_uint32(SysReg.PRODATE.value, prod_time)
  173. # Серийный номер
  174. self.dut.modbus.write_uint32(SysReg.SN.value, int(sn))
  175. # Статус тестирования
  176. self.dut.modbus.write_holding_register(SysReg.TEST_STATUS.value, 0x0001)
  177. # Команда сохранения системных настроек
  178. self.dut.modbus.write_holding_register(SysReg.SAVE_SYS.value, 0x0001)
  179. def test_all(self):
  180. pass
  181. def foo(self):
  182. print(self.modbus_dut.address)
  183. print(self.modbus_tester.address)
  184. self.modbus_dut.address = 15
  185. print(self.modbus_dut.address)
  186. def menu(self):
  187. self.tester.set_output(1, 1)
  188. self.startup()
  189. questions = [
  190. inquirer.List('action',
  191. message="Тестирование MDIO_88",
  192. choices=['Прошить IAP и FW',
  193. 'Прочитать системные настройки',
  194. 'Записать системные настройки',
  195. 'Полный тест',
  196. 'Тест цифровых входов',
  197. 'Тест цифровых выходов',
  198. 'Тест RTC',
  199. 'Тест LED',
  200. 'Тест напряжения батареи CR2032',
  201. 'Тест WDT',
  202. 'Завершить'],
  203. ),
  204. ]
  205. while True:
  206. answers = inquirer.prompt(questions)
  207. if answers['action'] == 'Прошить IAP и FW':
  208. self.write_iap_fw('bin_dio/fw.bin', 'bin_iap/iap.bin')
  209. elif answers['action'] == 'Прочитать системные настройки':
  210. self.dut.sys.get_system_vars()
  211. elif answers['action'] == 'Полный тест':
  212. print('Запуск цикла тестирования...')
  213. self.test_all()
  214. elif answers['action'] == 'Записать системные настройки':
  215. self.set_sys_params()
  216. elif answers['action'] == 'Тест цифровых входов':
  217. self.test_di()
  218. elif answers['action'] == 'Тест цифровых выходов':
  219. self.test_all_do()
  220. elif answers['action'] == 'Тест RTC':
  221. self.test_rtc()
  222. elif answers['action'] == 'Тест LED':
  223. self.test_led()
  224. elif answers['action'] == 'Тест напряжения батареи CR2032':
  225. self.test_battery_voltage()
  226. elif answers['action'] == 'Тест WDT':
  227. self.test_wdt()
  228. elif answers['action'] == 'Завершить':
  229. return
  230. def main():
  231. tester = DIO_Tester('COM3', 'COM11', 1, 2)
  232. tester.menu()
  233. # tester.foo()
  234. # tester.dut_powerup()
  235. if __name__ == '__main__':
  236. main()