digital_io.py 9.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267
  1. from io_module import IO_Module
  2. from modbus import Modbus, MBError, NoResponseError
  3. from log_reader import DigitalLogReader
  4. import log_reader
  5. import colorama
  6. from colorama import Fore
  7. from time import sleep
  8. import time
  9. from datetime import datetime, timedelta, timezone
  10. from mb_registers import DIO_REGS
  11. from serial import Serial
  12. class IO_Digital(IO_Module):
  13. def __init__(self, modbus: Modbus):
  14. self.modbus = modbus
  15. super().__init__(self.modbus)
  16. self.log = DigitalLogReader(self.modbus)
  17. '''Запрос параметров'''
  18. # 0x0100 - текущее состояние входов
  19. def get_inputs_bit(self) -> str:
  20. data = self.modbus.read_holding_registers(DIO_REGS['in_bits'], 1)
  21. return format(data[0], '08b')
  22. # 0x0101 - 0x0110 Счетчики импульсов
  23. def get_inputs_counters(self):
  24. data = []
  25. for i in range(DIO_REGS['in_cnt'], DIO_REGS['in_cnt'] + 16, 2):
  26. data.append(self.modbus.read_uint32_holding(i))
  27. return data
  28. # 0x0101 - 0x0110 Счетчики импульсов
  29. def get_inputs_counters(self):
  30. data = []
  31. for i in range(DIO_REGS['in_cnt'], DIO_REGS['in_cnt'] + 16, 2):
  32. data.append(self.modbus.read_uint32_holding(i))
  33. return data
  34. # 0x0120 - режим работы входов
  35. def get_inputs_mode(self):
  36. data = self.modbus.read_holding_registers(DIO_REGS['in_mode'], 1)
  37. return format(data[0], '08b')
  38. # 0x0122 - нормальное состояние входов
  39. def get_inputs_norm_state(self):
  40. data = self.modbus.read_holding_registers(DIO_REGS['in_norm'], 1)
  41. return format(data[0], '08b')
  42. # 0x0124 - время антидребезга (ms)
  43. def get_debounce_channel(self, input):
  44. data = self.modbus.read_holding_registers(DIO_REGS['in_deb_start'] + input - 1, 1)
  45. return data[0]
  46. # 0x0130
  47. def get_loads_bit(self):
  48. data = self.modbus.read_holding_registers(DIO_REGS['load_bits'], 1)
  49. return format(data[0], '08b')
  50. # 0x0131
  51. def get_cred_bit(self):
  52. data = self.modbus.read_holding_registers(DIO_REGS['cred_bits'], 1)
  53. return format(data[0], '08b')
  54. def get_debounce_channels(self):
  55. return self.modbus.read_holding_registers(DIO_REGS['in_deb_start'], 8)
  56. '''Установка параметров'''
  57. def set_inputs_mode(self, val):
  58. self.modbus.write_holding_register(DIO_REGS['in_mode'], val)
  59. #
  60. def set_input_mode(self, input, val):
  61. ret = self.modbus.read_holding_registers(DIO_REGS['in_mode'], 1)
  62. if val == 1:
  63. data = ret[0] | (0b1 << (input - 1))
  64. else:
  65. data = ret[0] & ~(0b1 << (input - 1))
  66. self.set_inputs_mode(data)
  67. # 0x0200 - текущее состояние выходов в обычно режиме
  68. def set_outputs(self, val):
  69. self.modbus.write_holding_register(DIO_REGS['out_cur'], val)
  70. # Установить значение на конкретном выходе [1..8]
  71. def set_output(self, output, val):
  72. ret = self.modbus.read_holding_registers(DIO_REGS['out_cur'], 1)
  73. if val == 1:
  74. data = ret[0] | (0b1 << (output - 1))
  75. else:
  76. data = ret[0] & ~(0b1 << (output - 1))
  77. self.set_outputs(data)
  78. def print_inputs(self):
  79. # Значения входов (битовое поле)
  80. print('Inputs values [bit field] :', Fore.GREEN + self.get_inputs_bit())
  81. # Значение счетчиков
  82. data = self.get_inputs_counters()
  83. print('Inputs counters :', Fore.GREEN + ' | '.join(str(el) for el in data))
  84. # Режим работы входов (битовое поле)
  85. print('Inputs mode [bit field] :', Fore.GREEN + self.get_inputs_mode())
  86. # Нормальное состояние входов (битовое поле)
  87. print('Inputs norm [bit field] :', Fore.GREEN + self.get_inputs_norm_state())
  88. # Период антидребезга (ms)
  89. print('Debounce input (ms) :', Fore.GREEN + ' | '.join(str(el) for el in self.get_debounce_channels()))
  90. def print_loads(self):
  91. # Значения датчиков нагрузки (битовое поле)
  92. print('Loads values [bit field] :', Fore.GREEN + self.get_loads_bit())
  93. # Слово достоверности датчиков нагрузки (битовое поле)
  94. print('Credibility loads [bit field] :', Fore.GREEN + self.get_cred_bit())
  95. class IO_DigitalTester:
  96. def __init__(self, dev_tester: IO_Digital, dev_dut: IO_Digital):
  97. self.tester = dev_tester
  98. self.dut = dev_dut
  99. '''Управление DUT'''
  100. # Подать/снять питание на DUT
  101. def dut_switch(self, state: bool):
  102. self.tester.set_output(1, state)
  103. # Установить 1 на нечетных входах DUT
  104. def dut_set_odd_inputs(self):
  105. self.tester.set_output(2, False)
  106. # Установить 1 на четный входах DUT
  107. def dut_set_even_imputs(self):
  108. self.tester.set_output(2, True)
  109. '''Тест входов'''
  110. def test_inputs(self):
  111. self.dut_set_even_imputs()
  112. time.sleep(0.1)
  113. self.dut.print_inputs()
  114. time.sleep(1)
  115. self.dut_set_odd_inputs()
  116. time.sleep(0.1)
  117. self.dut.print_inputs()
  118. time.sleep(1)
  119. '''Тест выходов и датчика обрыва нагрузки'''
  120. def test_load(self):
  121. # Все выходы DUT разомкнуты
  122. print("Все выходы DUT разомкнуты...")
  123. self.dut.set_outputs(0)
  124. self.dut.print_loads()
  125. time.sleep(0.1)
  126. # Замкнуть все выходы DUT (лампочка должна гореть)
  127. print("Все выходы DUT замкнуты...")
  128. self.dut.set_outputs(0b11111111)
  129. time.sleep(0.1)
  130. for i in range(1, 9):
  131. # Разомкнуть i-ый выход DUT
  132. print(f"Разомкнуть выход {i}")
  133. self.dut.set_output(i, 0)
  134. time.sleep(1)
  135. self.dut.print_loads()
  136. self.dut.set_output(i, 1)
  137. time.sleep(1)
  138. def get_load(self):
  139. self.dut.set_outputs(0b11110111)
  140. # self.dut.set_outputs(0)
  141. time.sleep(1)
  142. self.dut.print_loads()
  143. def main():
  144. colorama.init(autoreset=True)
  145. serial_port = Serial('COM56', 115200, timeout=0.05, parity='N', xonxoff=False)
  146. modbus_tester = Modbus(serial_port, 1)
  147. # dev_tester = IO_Digital(modbus_tester)
  148. dio = IO_Digital(modbus_tester)
  149. '''Тесты отдельного модуля DIO'''
  150. dio.sys.get_system_vars()
  151. dio.print_inputs()
  152. dio.get_inputs_counters()
  153. # modbus_dut = Modbus(serial_port, 2)
  154. # dev_dut = IO_Digital(modbus_dut)
  155. # tester = IO_DigitalTester(dev_tester, dev_dut)
  156. '''Включить DUT'''
  157. # tester.dut_switch(True)
  158. '''Запросить системные настройки DUT'''
  159. # dev_dut.sys.get_system_vars()
  160. '''Тест входов. Переключение значений на входах DUT'''
  161. # for i in range(10):
  162. # tester.test_inputs()
  163. '''Тестирование выходов и датчиков обрыва нагрузки'''
  164. # tester.test_load()
  165. # for i in range(100):
  166. # tester.get_load()
  167. '''Системные переменные и параметры'''
  168. # dev_tester.sys.get_system_vars()
  169. ''' Установить текущее время с учетом часового пояса'''
  170. # dev.sys.set_rtc()
  171. '''Лог и архив. Настройки лога.'''
  172. # dev.log.get_log_info()
  173. # dev.log.get_random_entries()
  174. # for i in range(8):
  175. # dev.log.set_archive_period(5 + i*2, i)
  176. # dev.log.get_log_info()
  177. # dev.log.get_all_archive()
  178. # dev.log.get_all_log()
  179. # dev.log.log_clear()
  180. # dev.log.archive_clear()
  181. '''Лог'''
  182. # dev.log.get_all_log()
  183. '''Архив'''
  184. # dev.log.get_all_archive()
  185. # print(dev.log.get_archive_entry(0, 1))
  186. '''Сохранение настроек'''
  187. # dev.sys.save_sattings()
  188. '''Настройки'''
  189. '''Регистры модуля'''
  190. # dev.print_inputs()
  191. '''Настройи модуля'''
  192. # for i in range(1, 9):
  193. # dev.set_input_mode(i, 1)
  194. # print('Inputs mode [bit field] :', Fore.GREEN + dev.get_inputs_mode())
  195. # dev.set_input_mode(4, 1)
  196. # dev.print_inputs()
  197. '''Обновление'''
  198. # dev.updater.update('fw.bin', 'MDIO-88')
  199. if __name__ == '__main__':
  200. main()