digital_io.py 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144
  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. class IO_Digital(IO_Module):
  12. def __init__(self, tty: str, brate: int, address: int):
  13. self.modbus = Modbus(tty, brate, address)
  14. super().__init__(self.modbus)
  15. self.log = DigitalLogReader(self.modbus)
  16. '''Запрос параметров'''
  17. # 0x0100 - текущее состояние входов
  18. def get_inputs_bit(self) -> str:
  19. data = self.modbus.read_holding_registers(DIO_REGS['in_bits'], 1)
  20. return format(data[0], '08b')
  21. # 0x0101 - 0x0110 Счетчики импульсов
  22. def get_inputs_counters(self):
  23. data = []
  24. for i in range(DIO_REGS['in_cnt'], DIO_REGS['in_cnt'] + 16, 2):
  25. data.append(self.modbus.read_uint32_holding(i))
  26. return data
  27. # 0x0101 - 0x0110 Счетчики импульсов
  28. def get_inputs_counters(self):
  29. data = []
  30. for i in range(DIO_REGS['in_cnt'], DIO_REGS['in_cnt'] + 16, 2):
  31. data.append(self.modbus.read_uint32_holding(i))
  32. return data
  33. # 0x0120 - режим работы входов
  34. def get_inputs_mode(self):
  35. data = self.modbus.read_holding_registers(DIO_REGS['in_mode'], 1)
  36. return format(data[0], '08b')
  37. # 0x0122 - нормальное состояние входов
  38. def get_inputs_norm_state(self):
  39. data = self.modbus.read_holding_registers(DIO_REGS['in_norm'], 1)
  40. return format(data[0], '08b')
  41. # 0x0124 - время антидребезга (ms)
  42. def get_debounce_channel(self, input):
  43. data = self.modbus.read_holding_registers(DIO_REGS['in_deb_start'] + input - 1, 1)
  44. return data[0]
  45. def get_debounce_channels(self):
  46. return self.modbus.read_holding_registers(DIO_REGS['in_deb_start'], 8)
  47. '''Установка параметров'''
  48. def set_inputs_mode(self, val):
  49. self.modbus.write_holding_register(DIO_REGS['in_mode'], val)
  50. #
  51. def set_input_mode(self, input, val):
  52. ret = self.modbus.read_holding_registers(DIO_REGS['in_mode'], 1)
  53. if val == 1:
  54. data = ret[0] | (0b1 << (input - 1))
  55. else:
  56. data = ret[0] & ~(0b1 << (input - 1))
  57. self.set_inputs_mode(data)
  58. def print_inputs(self):
  59. # Значения входов (битовое поле)
  60. print('Inputs values [bit field] :', Fore.GREEN + self.get_inputs_bit())
  61. # Значение счетчиков
  62. data = self.get_inputs_counters()
  63. print('Inputs counters :', Fore.GREEN + ' | '.join(str(el) for el in data))
  64. # Режим работы входов (битовое поле)
  65. print('Inputs mode [bit field] :', Fore.GREEN + self.get_inputs_mode())
  66. # Нормальное состояние входов (битовое поле)
  67. print('Inputs norm [bit field] :', Fore.GREEN + self.get_inputs_norm_state())
  68. # Период антидребезга (ms)
  69. print('Debounce input (ms) :', Fore.GREEN + ' | '.join(str(el) for el in self.get_debounce_channels()))
  70. def main():
  71. colorama.init(autoreset=True)
  72. dev = IO_Digital('COM24', 115200, 15)
  73. dev.modbus.MB_DEBUG = False
  74. '''Системные переменные и параметры'''
  75. # dev.sys.get_system_vars()
  76. ''' Установить текущее время с учетом часового пояса'''
  77. # dev.sys.set_rtc()
  78. '''Лог и архив. Настройки лога.'''
  79. # dev.log.get_log_info()
  80. # dev.log.get_random_entries()
  81. # for i in range(8):
  82. # dev.log.set_archive_period(5 + i*2, i)
  83. # dev.log.get_log_info()
  84. # dev.log.get_all_archive()
  85. # dev.log.get_all_log()
  86. # dev.log.log_clear()
  87. # dev.log.archive_clear()
  88. '''Лог'''
  89. # dev.log.get_all_log()
  90. '''Архив'''
  91. dev.log.get_all_archive()
  92. # print(dev.log.get_archive_entry(0, 1))
  93. '''Сохранение настроек'''
  94. # dev.sys.save_sattings()
  95. '''Настройки'''
  96. '''Регистры модуля'''
  97. # dev.print_inputs()
  98. '''Настройи модуля'''
  99. # for i in range(1, 9):
  100. # dev.set_input_mode(i, 1)
  101. # print('Inputs mode [bit field] :', Fore.GREEN + dev.get_inputs_mode())
  102. # dev.set_input_mode(4, 1)
  103. # dev.print_inputs()
  104. '''Обновление'''
  105. # dev.updater.update('fw.bin', 'MDIO-88')
  106. if __name__ == '__main__':
  107. main()