io_module.py 9.7 KB

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