io_module.py 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304
  1. from modbus import Modbus
  2. from updater import Updater
  3. from sys_params import IO_SysParams
  4. import colorama
  5. from colorama import Fore
  6. import time
  7. import os
  8. import struct
  9. import random
  10. class IO_Module:
  11. def __init__(self, modbus: Modbus):
  12. self.modbus = modbus
  13. self.updater = Updater(self.modbus)
  14. self.sys = IO_SysParams(self.modbus)
  15. '''
  16. # 0x0100 - текущее состояние входов
  17. def get_inputs_bit(self) -> str:
  18. data = self.read_holding_registers(reg_table['in_bits'], 1)
  19. return format(data[0], '08b')
  20. # 0x0101 - 0x0110 Счетчики импульсов
  21. def get_inputs_counters(self):
  22. data = []
  23. for i in range(reg_table['in_cnt'], reg_table['in_cnt'] + 16, 2):
  24. data.append(self.read_uint32_holding(i))
  25. return data
  26. # 0x0120 - режим работы входов
  27. def get_inputs_mode(self):
  28. data = self.read_holding_registers(reg_table['in_mode'], 1)
  29. return format(data[0], '08b')
  30. def set_inputs_mode(self, val):
  31. self.write_holding_register(reg_table['in_mode'], val)
  32. #
  33. def set_input_mode(self, input, val):
  34. ret = self.read_holding_registers(reg_table['in_mode'], 1)
  35. if val == 1:
  36. data = ret[0] | (0b1 << (input - 1))
  37. else:
  38. data = ret[0] & ~(0b1 << (input - 1))
  39. self.set_inputs_mode(data)
  40. # 0x0122 - нормальное состояние входов
  41. def get_inputs_norm_state(self):
  42. data = self.read_holding_registers(reg_table['in_norm'], 1)
  43. return format(data[0], '08b')
  44. def set_inputs_norm_state(self, val):
  45. self.write_holding_register(reg_table['in_norm'], val)
  46. # 0x0124 - время антидребезга (ms)
  47. def get_debounce_channel(self, input):
  48. data = self.read_holding_registers(reg_table['in_deb_start'] + input - 1, 1)
  49. return data[0]
  50. def get_debounce_channels(self):
  51. return self.read_holding_registers(reg_table['in_deb_start'], 8)
  52. def set_debounce_channel(self, input, val):
  53. self.write_holding_register(reg_table['in_deb_start'] + input - 1, val)
  54. # 0x0200 - текущее состояние выходов в обычно режиме
  55. def get_outputs(self):
  56. data = self.read_holding_registers(reg_table['out_cur'], 1)
  57. return format(data[0], '08b')
  58. # 0x0200 - текущее состояние выходов в обычно режиме
  59. def set_outputs(self, val):
  60. self.write_holding_register(reg_table['out_cur'], val)
  61. def set_output(self, output, val):
  62. ret = self.read_holding_registers(reg_table['out_cur'], 1)
  63. if val == 1:
  64. data = ret[0] | (0b1 << (output - 1))
  65. else:
  66. data = ret[0] & ~(0b1 << (output - 1))
  67. self.set_outputs(data)
  68. # 0x0202 - режим работы выходов; 0 - обычный, 1 - ШИМ
  69. def get_outputs_mode(self):
  70. data = self.read_holding_registers(reg_table['out_mode'], 1)
  71. return format(data[0], '08b')
  72. def set_outputs_mode(self, val):
  73. self.write_holding_register(reg_table['out_mode'], val)
  74. def set_output_mode(self, output, val):
  75. ret = self.read_holding_registers(reg_table['out_mode'], 1)
  76. if val == 1:
  77. data = ret[0] | (0b1 << (output - 1))
  78. else:
  79. data = ret[0] & ~(0b1 << (output - 1))
  80. self.set_outputs_mode(data)
  81. # 0x0203 - состояние выходов (режим обычного выхода) в безопасном режиме работы
  82. def get_outputs_mode_save(self):
  83. data = self.read_holding_registers(reg_table['out_mode_save'], 1)
  84. return format(data[0], '08b')
  85. def set_outputs_mode_save(self, val):
  86. self.write_holding_register(reg_table['out_mode_save'], val)
  87. def set_output_mode_save(self, output, val):
  88. ret = self.read_holding_registers(reg_table['out_mode_save'], 1)
  89. if val == 1:
  90. data = ret[0] | (0b1 << (output - 1))
  91. else:
  92. data = ret[0] & ~(0b1 << (output - 1))
  93. self.set_outputs_mode_save(data)
  94. # 0x0210 - заполнение PWM (%)
  95. def get_pwm_duty(self, output):
  96. data = self.read_holding_registers(reg_table['pwm_duty'] + output - 1, 1)
  97. return data[0]
  98. def get_pwm_duty_all(self):
  99. return self.read_holding_registers(reg_table['pwm_duty'], 8)
  100. def set_pwm_duty(self, output, val):
  101. self.write_holding_register(reg_table['pwm_duty'] + output - 1, val)
  102. # 0x0220 - заполнение PWM (%)
  103. def get_pwm_duty_all_save(self):
  104. return self.read_holding_registers(reg_table['pwm_duty_save'], 8)
  105. def set_pwm_duty_save(self, output, val):
  106. self.write_holding_register(reg_table['pwm_duty_save'] + output - 1, val)
  107. # 0x0230 - период PWM (0.1 сек)
  108. def get_pwm_period_all(self):
  109. return self.read_holding_registers(reg_table['pwm_per'], 8)
  110. def set_pwm_period(self, output, val):
  111. self.write_holding_register(reg_table['pwm_per'] + output - 1, val)
  112. # 0x0240 - период PWM в безопасном режиме (0.1 сек)
  113. def get_pwm_period_all_save(self):
  114. return self.read_holding_registers(reg_table['pwm_per_save'], 8)
  115. def set_pwm_period_save(self, output, val):
  116. self.write_holding_register(reg_table['pwm_per_save'] + output - 1, val)
  117. def get_uptime(self):
  118. return self.read_uint32_holding(reg_table['uptime'])
  119. def get_rtc(self):
  120. return self.read_uint32_holding(reg_table['rtc_unix'])
  121. def set_rtc(self, utc):
  122. self.write_uint32(reg_table['rtc_sinhro'], utc)
  123. '''
  124. def main():
  125. colorama.init(autoreset=True)
  126. dev = IO_Module('COM24', 115200, 15)
  127. dev.MB_DEBUG = False
  128. # dev.update('fw.bin')
  129. # print('Device uptime:', dev.get_uptime())
  130. # unix_time = dev.get_rtc()
  131. # print(f'RTC: {time.ctime(unix_time)}. Unix time stamp: {unix_time}')
  132. # print('Set time:', int(time.time()))
  133. # dev.set_rtc(int(time.time()))
  134. # time.sleep(1)
  135. # unix_time = dev.get_rtc()
  136. # print(f'RTC: {time.ctime(unix_time)}. Unix time stamp: {unix_time}')
  137. return
  138. for i in range(1, 9):
  139. dev.set_input_mode(i, 1)
  140. print('Inputs mode [bit field] :', Fore.GREEN + dev.get_inputs_mode())
  141. for i in range(1, 9):
  142. dev.set_debounce_channel(i, 100 + i)
  143. # dev.set_output(i, 1)
  144. # dev.set_output_mode(i, 1)
  145. # 0x0203 - состояние выходов (режим обычного выхода) в безопасном режиме работы
  146. # for i in range(1, 9):
  147. # dev.set_output_mode_save(i, 0)
  148. # 0x0210 - заполнение PWM (ms)
  149. # 0x0220 - заполнение PWM (%)
  150. # 0x0230 - период PWM (0.1 сек)
  151. # 0x0240 - период PWM в безопасном режиме (0.1 сек)
  152. # for i in range(1, 9):
  153. # dev.set_pwm_duty(i, 10 + i)
  154. # dev.set_pwm_duty_save(i, 20 + i)
  155. # dev.set_pwm_period(i, 10 + i)
  156. # dev.set_pwm_period_save(i, 20 + i)
  157. # -----------------------------------------------------------------------------
  158. # Тесты PWM
  159. # Установить 1-ый выход в режим PWM
  160. # for i in range(3, 9):
  161. # dev.set_output_mode(i, 0)
  162. # dev.set_output_mode(1, 1)
  163. # dev.set_pwm_period(1, 30)
  164. # dev.set_pwm_period(1, 50)
  165. # dev.set_pwm_duty(2, 10)
  166. # return
  167. # Установить нормальное состояние входов
  168. # dev.set_inputs_norm_state(0b00110101)
  169. # print(dev.get_pwm_duty_all())
  170. while True:
  171. print('~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~')
  172. # Значения входов (битовое поле)
  173. print('Inputs values [bit field] :', Fore.GREEN + dev.get_inputs_bit())
  174. # Режим работы входов (битовое поле)
  175. print('Inputs mode [bit field] :', Fore.GREEN + dev.get_inputs_mode())
  176. # Нормальное состояние входов (битовое поле)
  177. print('Inputs norm [bit field] :', Fore.GREEN + dev.get_inputs_norm_state())
  178. # Период антидребезга (ms)
  179. print('Debounce input (ms) :', Fore.GREEN + ' | '.join(str(el) for el in dev.get_debounce_channels()))
  180. # Значение счетчиков
  181. data = dev.get_inputs_counters()
  182. print('Inputs counters :', Fore.GREEN + ' | '.join(str(el) for el in data))
  183. # Текущее состояние выходов в обычном режиме
  184. print('Outputs norm [bit field] :', Fore.GREEN + dev.get_outputs())
  185. # Состояние выходов в безопасном режиме
  186. print('Outputs save [bit field] :', Fore.GREEN + dev.get_outputs_mode_save())
  187. # Режим работы выходов
  188. print('Outputs mode [bit field] :', Fore.GREEN + dev.get_outputs_mode())
  189. # 0x0210 - заполнение PWM (ms)
  190. print('PWM duty cycle [%] :', Fore.GREEN + ' | '.join(str(el) for el in dev.get_pwm_duty_all()))
  191. # 0x0220 - заполнение PWM в безопасном режиме (ms)
  192. print('PWM duty cycle (save) [%] :', Fore.GREEN + ' | '.join(str(el) for el in dev.get_pwm_duty_all_save()))
  193. # 0x0230 - период PWM (0.1 сек)
  194. print('PWM period [0.1 sec] :', Fore.GREEN + ' | '.join(str(el) for el in dev.get_pwm_period_all()))
  195. # 0x0240 - период PWM в безопасном режиме (0.1 сек)
  196. print('PWM period save [0.1 sec] :', Fore.GREEN + ' | '.join(str(el) for el in dev.get_pwm_period_all_save()))
  197. # Дергаем одним выходом
  198. # dev.set_output(2, trigger)
  199. # trigger = not trigger
  200. # # Для проверки выходов в обычном режиме
  201. # for i in range(1, 9):
  202. # dev.set_output(i, 1)
  203. # print('Outputs norm [bit field] :', Fore.GREEN + dev.get_output())
  204. # time.sleep(0.1)
  205. # for i in range(1, 9):
  206. # dev.set_output(i, 0)
  207. # print('Outputs norm [bit field] :', Fore.GREEN + dev.get_output())
  208. # time.sleep(0.1)
  209. # # Режим работы выходов
  210. # for i in range(1, 9):
  211. # dev.set_output_mode(i, 1)
  212. # print('Outputs mode [bit field] :', Fore.GREEN + dev.get_outputs_mode())
  213. # time.sleep(0.1)
  214. # for i in range(1, 9):
  215. # dev.set_output_mode(i, 0)
  216. # print('Outputs mode [bit field] :', Fore.GREEN + dev.get_outputs_mode())
  217. # time.sleep(0.1)
  218. # break
  219. time.sleep(1)
  220. # for i in range(1, 9):
  221. # dev.set_input_mode(i, 1)
  222. # print('Inputs mode [bit field] :', Fore.GREEN + dev.get_inputs_mode())
  223. # for i in range(8, 0, -1):
  224. # dev.set_input_mode(i, 0)
  225. # print('Inputs mode [bit field] :', Fore.GREEN + dev.get_inputs_mode())
  226. if __name__ == '__main__':
  227. main()