calibration_analog_in.py 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174
  1. from modbus import Modbus
  2. from analog_in import IO_AnalogInput
  3. from serial import Serial
  4. from colorama import Fore
  5. from mb_registers import *
  6. import inquirer
  7. from dataclasses import dataclass
  8. import time
  9. CALIBRATION_MODE = ['VOLT']
  10. @dataclass(frozen=True)
  11. class Const:
  12. VOLTAGE_0_10 = 0
  13. VOLTAGE_1_10 = 1
  14. FIRST_POINT_VOLTAGE = 1.0
  15. SECOND_POINT_VOLTAGE = 10.0
  16. MIDLE_POINT_VOLTAGE = 5.0
  17. class Calibration_AI:
  18. CHANNEL_NUMBER = 12
  19. def __init__(self, mb_port):
  20. serial_port = Serial(mb_port, 115200, timeout=0.05, parity='N', xonxoff=False)
  21. self.modbus = Modbus(serial_port, 1)
  22. self.dut = IO_AnalogInput(self.modbus)
  23. self.mid_point_factors = [0]*self.CHANNEL_NUMBER
  24. self.first_point_data = [0]*self.CHANNEL_NUMBER
  25. self.second_point_data = [0]*self.CHANNEL_NUMBER
  26. self.k_factors = [0]*self.CHANNEL_NUMBER
  27. self.b_factors = [0]*self.CHANNEL_NUMBER
  28. def voltage_0_10(self):
  29. print("Калибровка напряжения в режиме 0-10 В")
  30. self.setup_module(Const.VOLTAGE_0_10)
  31. def get_filtered_data(self, sample_count: int):
  32. raw_data = []
  33. for i in range(sample_count):
  34. raw = self.dut.get_fil_inputs()
  35. raw_data.append(raw)
  36. time.sleep(0.5)
  37. tmp_data = [0]*self.CHANNEL_NUMBER
  38. for j in range(self.CHANNEL_NUMBER):
  39. for i in range(sample_count):
  40. tmp_data[j] += raw_data[i][j]/sample_count
  41. return tmp_data
  42. def middle_point(self, point: float):
  43. """Расчет коэффициента средней точки"""
  44. print(f"Установите значение напряжения {point} и нажмите 'Enter'")
  45. input()
  46. raw_data = self.get_filtered_data(10)
  47. print(raw_data)
  48. for i in range(self.CHANNEL_NUMBER):
  49. self.mid_point_factors[i] = (point - raw_data[i])/10.0
  50. def point(self, point: float):
  51. """Расчет коэффициентов для точки"""
  52. print(f"Установите значения напряжения {point} и назмите 'Enter'")
  53. input()
  54. return self.get_filtered_data(10)
  55. def test_factors(self, point:float):
  56. """Проверка коэффициентов"""
  57. print(f"Установите значения напряжения {point} и назмите 'Enter'")
  58. input()
  59. data = self.get_filtered_data(10)
  60. for i in range(self.CHANNEL_NUMBER):
  61. data[i] = (point - (data[i]*self.k_factors[i] + self.b_factors[i]))/10.0
  62. return data
  63. def calibration_mode(self, mode: int):
  64. # Настройка входов
  65. self.setup_module(mode)
  66. # Средняя точка 5 В
  67. self.middle_point(Const.MIDLE_POINT_VOLTAGE)
  68. # Первая точка 1 В
  69. self.first_point_data = self.point(Const.FIRST_POINT_VOLTAGE)
  70. # Вторая точка 10 В
  71. self.second_point_data = self.point(Const.SECOND_POINT_VOLTAGE)
  72. # Расчет коэффициентов уравнения прямой
  73. for i in range(self.CHANNEL_NUMBER):
  74. self.k_factors[i] = ((self.second_point_data[i] - self.first_point_data[i]) / \
  75. (Const.SECOND_POINT_VOLTAGE - Const.FIRST_POINT_VOLTAGE))
  76. self.b_factors[i] = self.second_point_data[i] - self.k_factors[i]*Const.SECOND_POINT_VOLTAGE
  77. self.k_factors[i] = 1.0/self.k_factors[i]
  78. # self.k_factors[i] = 1.0/((self.second_point_data[i] - self.first_point_data[i]) / \
  79. # (Const.SECOND_POINT_VOLTAGE - Const.FIRST_POINT_VOLTAGE))
  80. # self.b_factors[i] = Const.SECOND_POINT_VOLTAGE - self.second_point_data[i]
  81. # Проверка коэффициентов
  82. print(self.mid_point_factors)
  83. print(self.test_factors(5.0))
  84. # print("First point data")
  85. # print(self.first_point_data)
  86. # print("Secon point data")
  87. # print(self.second_point_data)
  88. # print("k, b factors")
  89. # print(self.k_factors)
  90. # print(self.b_factors)
  91. def setup_module(self, channel_mode: int):
  92. """Настройка измеретельных каналов модуля в нужном режиме"""
  93. # Настройка каналов в режиме измерения напряжения 0 - 10 В
  94. if channel_mode == Const.VOLTAGE_0_10:
  95. print("Настройка модуля в режиме измерения напряжения 0 - 10 В...", end='')
  96. self.dut.set_inputs_state(0b1111_1111_1111)
  97. self.dut.set_inputs_mode(0b0000_0000_0000)
  98. self.dut.set_voltage_range(0b0000_0000_0000)
  99. for i in range(1, 13):
  100. self.dut.set_k_factor(i, 1.0)
  101. self.dut.set_b_factor(i, 0.0)
  102. # self.dut.sys.save_settings()
  103. # self.dut.print_inputs()
  104. print('OK')
  105. def menu(self):
  106. menu_items = [
  107. inquirer.List('action',
  108. message="Калибровка MAI_12",
  109. choices=['Калибровка напряжения 0-10 В',
  110. 'Завершить'],
  111. ),
  112. ]
  113. while True:
  114. answers = inquirer.prompt(menu_items)
  115. if answers['action'] == 'Калибровка напряжения 0-10 В':
  116. self.calibration_mode(Const.VOLTAGE_0_10)
  117. elif answers['action'] == 'Завершить':
  118. return
  119. def main():
  120. calibration = Calibration_AI('COM12')
  121. calibration.menu()
  122. if __name__ == '__main__':
  123. main()