analog_in.py 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310
  1. from io_module import IO_Module
  2. from modbus import Modbus
  3. from log_reader import AnalogInputLogReader
  4. import colorama
  5. from colorama import Fore
  6. from time import sleep
  7. from serial import Serial
  8. from mb_registers import AI_REGS, AiReg
  9. import matplotlib.pyplot as plt
  10. import matplotlib.animation as animation
  11. from mb_registers import SysReg
  12. ai_name = {'AIN_1': 0, 'AIN_2': 1, 'AIN_3': 2, 'AIN_4': 3, 'AIN_5': 4,
  13. 'AIN_6': 5, 'AIN_7': 6, 'AIN_8': 7, 'AIN_9': 8, 'AIN_10': 9,
  14. 'AIN_11': 10, 'AIN_12': 11, 'V_ISO_CL': 12, 'V_ISO': 13,
  15. 'CRNT_LIM_U_BFR_R': 14, 'CRNT_LIM_U_ABFR_R': 15,
  16. 'AIN_FIL_1': 0, 'AIN_FIL_2': 1, 'AIN_FIL_3': 2, 'AIN_FIL_4': 3,
  17. 'AIN_FIL_5': 4, 'AIN_FIL_6': 5, 'AIN_FIL_7': 6, 'AIN_FIL_8': 7,
  18. 'AIN_FIL_9': 8, 'AIN_FIL_10': 9, 'AIN_FIL_11': 10, 'AIN_FIL_12': 11
  19. }
  20. class IO_AnalogInput(IO_Module):
  21. GRAPTH_LEN = 100
  22. def __init__(self, modbus: Modbus):
  23. self.modbus = modbus
  24. super().__init__(self.modbus)
  25. self.log = AnalogInputLogReader(self.modbus)
  26. self.fig = plt.figure(1)
  27. self.input = self.fig.add_subplot(1, 1, 1)
  28. self.input.set_title('input_1')
  29. self.x = [0]
  30. self.data = []
  31. self.graph_input = ai_name['AIN_1']
  32. self.graph_input_func = 0
  33. # Чтение параметров
  34. def get_inputs_state(self):
  35. 'Значения состояний входов вкл./выкл. (битовое поле)'
  36. data = self.modbus.read_holding_registers(AiReg.IN_STATE.value, 1)
  37. return format(data[0], '012b')
  38. def get_inputs_mode(self):
  39. 'Режим измерения входов (0 - напряжение или 1 - ток. (битовое поле))'
  40. data = self.modbus.read_holding_registers(AiReg.IN_MODE.value , 1)
  41. return format(data[0], '012b')
  42. def get_inputs_alarm(self):
  43. 'Аварии аналоговых входов (битовое поле)'
  44. data = self.modbus.read_holding_registers(AiReg.IN_FAILURE.value, 1)
  45. return format(data[0], '012b')
  46. def get_ext_sens_power(self):
  47. 'Состояние питания внешних датчиков (вкл./выкл.)'
  48. data = self.modbus.read_holding_registers(AiReg.EXT_SENS_POWER.value, 1)
  49. def get_input_gain(self, channel):
  50. 'Коэффициент усиления канала [1..12] (внутренний коэф-т ADC)'
  51. data = self.modbus.read_holding_registers(AiReg.IN_GAINE_FACTOR.value + channel - 1, 1)
  52. return data[0]
  53. def get_k_factor(self, channel):
  54. 'Коэффициент пересчета K канала [1..12]'
  55. return self.modbus.read_float_holding(AiReg.IN_K_FACTOR.value + 2*(channel - 1))
  56. def get_b_factor(self, channel):
  57. 'Коэффициент пересчета B канала [1..12]'
  58. return self.modbus.read_float_holding(AiReg.IN_B_FACTOR.value + 2*(channel - 1))
  59. def get_raw_input(self, channel):
  60. 'Сырые данные по отдельному каналу [1..12]'
  61. return self.modbus.read_holding_registers(AiReg.IN_RAW.value + channel - 1, 1)[0]
  62. def get_raw_inputs(self):
  63. 'Сырые данные по всем каналам'
  64. data = self.modbus.read_holding_registers(AiReg.IN_RAW.value, 16)
  65. return data
  66. def get_fil_inputs(self):
  67. 'Фильтрованные данные'
  68. data = []
  69. for i in range(12):
  70. data.append(self.modbus.read_float_holding(AiReg.IN_FILTER.value + i*2))
  71. return data
  72. # Установка параметров
  73. def set_inputs_state(self, val):
  74. 'Значения состояний входов вкл./выкл. (битовое поле)'
  75. self.modbus.write_holding_register(AiReg.IN_STATE.value , val)
  76. def set_inputs_mode(self, val):
  77. 'Режим измерения входов (0 - напряжение или 1 - ток. (битовое поле))'
  78. self.modbus.write_holding_register(AiReg.IN_STATE.value, val)
  79. def set_ext_sens_power(self, val):
  80. 'Состояние питания внешних датчиков (вкл./выкл.)'
  81. self.modbus.write_holding_register(AiReg.EXT_SENS_POWER.value , val)
  82. def set_input_gain(self, input, value):
  83. '''
  84. Коэффициент усиления канала [1..12] (внутренний коэф-т ADC)
  85. Допустимые значения: 1, 2, 4, 8, 16, 32, 64, 128
  86. '''
  87. if value not in (1, 2, 4, 8, 16, 32, 64, 128):
  88. return None
  89. self.modbus.write_holding_register(AiReg.IN_GAINE_FACTOR.value + input - 1, value)
  90. def set_k_factor(self, channel, value):
  91. 'Коэффициент пересчета K канала [1..12]'
  92. self.modbus.write_float(AiReg.IN_K_FACTOR.value + 2*(channel - 1), value)
  93. def set_b_factor(self, channel, value):
  94. 'Коэффициент пересчета K канала [1..12]'
  95. self.modbus.write_float(AiReg.IN_B_FACTOR.value + 2*(channel - 1), value)
  96. '''Настройки входов'''
  97. def print_inputs(self):
  98. print(Fore.GREEN + '____________________________________________')
  99. print(Fore.GREEN + 'Analog inputs settings:')
  100. # Значения состояний входов вкл./выкл. (битовое поле)
  101. print('Inputs state [bit field] :', Fore.GREEN + self.get_inputs_state())
  102. # Режим измерения входов напряжение или ток. (битовое поле)
  103. print('Inputs mode [bit field] :', Fore.GREEN + self.get_inputs_mode())
  104. # Коэффициенты усиления
  105. for i in range(1, 13):
  106. print(f'Gain factor channel {i} : ', end='')
  107. print(Fore.GREEN + str(self.get_input_gain(i)))
  108. '''Вывод параметров. Сырые данные 16 входов'''
  109. def print_raw_inputs(self):
  110. data = self.get_raw_inputs()
  111. print(f"[ADC raw] IN_1: {data[0]}, IN_2: {data[1]}, IN_3: {data[2]}, IN_4: {data[3]}")
  112. print(f"[ADC raw] IN_5: {data[4]}, IN_6: {data[5]}, IN_7: {data[6]}, IN_8: {data[7]}")
  113. print(f"[ADC raw] IN_9: {data[8]}, IN_10: {data[9]}, IN_11: {data[10]}, IN_12: {data[11]}")
  114. print(f"[ADC raw] V_ISO_CL: {data[12]}, V_ISO: {data[13]}")
  115. print(f"[ADC raw] CRNT_LIM_U_BFR_R: {data[14]}, CRNT_LIM_U_ABFR_R: {data[15]}")
  116. '''Вывод параметров. Фильтрованные данные 12 входов'''
  117. def print_filtered_inputs(self):
  118. data = self.get_fil_inputs()
  119. print(f"[ADC fil] IN_1: {data[0]}, IN_2: {data[1]}, IN_3: {data[2]}, IN_4: {data[3]}")
  120. print(f"[ADC fil] IN_5: {data[4]}, IN_6: {data[5]}, IN_7: {data[6]}, IN_8: {data[7]}")
  121. print(f"[ADC fil] IN_9: {data[8]}, IN_10: {data[9]}, IN_11: {data[10]}, IN_12: {data[11]}")
  122. '''Вывод данных на график'''
  123. def show_graph(self, func, channel: str):
  124. self.graph_input_func = func
  125. self.graph_input = ai_name[channel]
  126. ani = animation.FuncAnimation(self.fig, self.draw, interval=50)
  127. plt.show()
  128. def show_graph_filtered(self, channel: str):
  129. self.graph_input = ai_name[channel]
  130. def draw(self, i):
  131. data = self.graph_input_func()
  132. self.data.append(data[self.graph_input])
  133. self.input.clear()
  134. self.input.plot(self.x, self.data)
  135. if len(self.data) == self.GRAPTH_LEN:
  136. self.data.pop(0)
  137. self.x.pop(0)
  138. self.x.append(self.x[-1] + 1)
  139. # print(self.in1)
  140. # print(self.x)
  141. def main():
  142. colorama.init(autoreset=True)
  143. serial_port = Serial('COM7', 115200, timeout=0.05, parity='N', xonxoff=False)
  144. modbus_tester = Modbus(serial_port, 1)
  145. modbus_tester.MB_DEBUG = False
  146. # modbus_tester.MB_DEBUG = True
  147. # dev_tester = IO_Digital(modbus_tester)
  148. ai = IO_AnalogInput(modbus_tester)
  149. '''Режим работы аналоговых входов'''
  150. # ai.print_inputs()
  151. '''Установка коэффициентов усиления. Канал, коэффициент'''
  152. '''
  153. for channel in range(1, 13):
  154. ai.set_input_gain(channel, 8)
  155. for channel in range(1, 13):
  156. print(ai.get_input_gain(channel))
  157. '''
  158. '''Коэффициенты K и B'''
  159. # for i in range(1, 13):
  160. # ai.set_k_factor(i, 1.0)
  161. # ai.set_b_factor(i, 0.0)
  162. '''Последовательное включение входов по одному.'''
  163. '''
  164. while True:
  165. for i in range(12):
  166. ai.set_inputs_state(1 << i)
  167. print(ai.get_inputs_state())
  168. sleep(1)
  169. '''
  170. '''Настройка режима измерения'''
  171. '''
  172. while True:
  173. for i in range(12):
  174. ai.set_inputs_mode(1 << i)
  175. print(ai.get_inputs_mode())
  176. sleep(1)
  177. '''
  178. ai.sys.get_system_vars()
  179. # print(ai.sys.get_bat_votage())
  180. # ai.sys.set_rtc()
  181. # ai.sys.set_system_vars(1234)
  182. # ai.sys.get_system_vars()
  183. # print(ai.sys.get_rtc())
  184. # print(ai.get_inputs_state())
  185. # ai.set_inputs_state(0b1111_1111_1111)
  186. # print(ai.sys.get_module_state())
  187. # ai.set_inputs_state(0b0000_0000_0000)
  188. # ai.set_inputs_state(0b1111_1111_1111)
  189. # print(ai.get_inputs_state())
  190. # sleep(1)
  191. # ai.set_inputs_state(0b0)
  192. # print(ai.get_inputs_mode())
  193. # ai.set_inputs_mode(0b0000_0000_0000)
  194. # print(ai.get_inputs_mode())
  195. '''Питание внешних датчиков'''
  196. # ai.set_ext_sens_power(0)
  197. '''Аварии аналоговых входов'''
  198. # for i in range(100):
  199. # print(ai.get_inputs_alarm())
  200. # sleep(1)
  201. '''Данные каналов'''
  202. # while True:
  203. # ai.print_raw_inputs()
  204. # ai.print_filtered_inputs()
  205. # sleep(1)
  206. # ai.get_raw_inputs()
  207. # ai.print_raw_inputs()
  208. '''Сырые данные'''
  209. # while True:
  210. # print(ai.get_raw_input(12))
  211. # sleep(1)
  212. '''Вывод на график. Сырые данные'''
  213. # ai.show_graph(ai.get_raw_inputs, 'AIN_1')
  214. '''Вывод на график. Фильтрованные данные'''
  215. # ai.show_graph(ai.get_fil_inputs, 'AIN_FIL_12')
  216. '''Системные настройки'''
  217. # ai.sys.get_system_vars()
  218. '''Сохранение настроек'''
  219. # ai.sys.save_sattings()
  220. '''Обновление прошивки'''
  221. # serial_port.timeout = 1
  222. # modbus_tester.MB_DEBUG = True
  223. # ai.updater.update('fw.bin', 'MAI_12')
  224. if __name__ == '__main__':
  225. main()