from modbus import Modbus from analog_in import IO_AnalogInput from serial import Serial from colorama import Fore from mb_registers import * import inquirer from dataclasses import dataclass import time CALIBRATION_MODE = ['VOLT'] @dataclass(frozen=True) class Const: VOLTAGE_0_10 = 0 VOLTAGE_1_10 = 1 FIRST_POINT_VOLTAGE = 1.0 SECOND_POINT_VOLTAGE = 10.0 MIDLE_POINT_VOLTAGE = 5.0 class Calibration_AI: CHANNEL_NUMBER = 12 def __init__(self, mb_port): serial_port = Serial(mb_port, 115200, timeout=0.05, parity='N', xonxoff=False) self.modbus = Modbus(serial_port, 1) self.dut = IO_AnalogInput(self.modbus) self.mid_point_factors = [0]*self.CHANNEL_NUMBER self.first_point_data = [0]*self.CHANNEL_NUMBER self.second_point_data = [0]*self.CHANNEL_NUMBER self.k_factors = [0]*self.CHANNEL_NUMBER self.b_factors = [0]*self.CHANNEL_NUMBER def voltage_0_10(self): print("Калибровка напряжения в режиме 0-10 В") self.setup_module(Const.VOLTAGE_0_10) def get_filtered_data(self, sample_count: int): raw_data = [] for i in range(sample_count): raw = self.dut.get_fil_inputs() raw_data.append(raw) time.sleep(0.5) tmp_data = [0]*self.CHANNEL_NUMBER for j in range(self.CHANNEL_NUMBER): for i in range(sample_count): tmp_data[j] += raw_data[i][j]/sample_count return tmp_data def middle_point(self, point: float): """Расчет коэффициента средней точки""" print(f"Установите значение напряжения {point} и нажмите 'Enter'") input() raw_data = self.get_filtered_data(10) print(raw_data) for i in range(self.CHANNEL_NUMBER): self.mid_point_factors[i] = (point - raw_data[i])/10.0 def point(self, point: float): """Расчет коэффициентов для точки""" print(f"Установите значения напряжения {point} и назмите 'Enter'") input() return self.get_filtered_data(10) def test_factors(self, point:float): """Проверка коэффициентов""" print(f"Установите значения напряжения {point} и назмите 'Enter'") input() data = self.get_filtered_data(10) for i in range(self.CHANNEL_NUMBER): data[i] = (point - (data[i]*self.k_factors[i] + self.b_factors[i]))/10.0 return data def calibration_mode(self, mode: int): # Настройка входов self.setup_module(mode) # Средняя точка 5 В self.middle_point(Const.MIDLE_POINT_VOLTAGE) # Первая точка 1 В self.first_point_data = self.point(Const.FIRST_POINT_VOLTAGE) # Вторая точка 10 В self.second_point_data = self.point(Const.SECOND_POINT_VOLTAGE) # Расчет коэффициентов уравнения прямой for i in range(self.CHANNEL_NUMBER): self.k_factors[i] = ((self.second_point_data[i] - self.first_point_data[i]) / \ (Const.SECOND_POINT_VOLTAGE - Const.FIRST_POINT_VOLTAGE)) self.b_factors[i] = self.second_point_data[i] - self.k_factors[i]*Const.SECOND_POINT_VOLTAGE self.k_factors[i] = 1.0/self.k_factors[i] # self.k_factors[i] = 1.0/((self.second_point_data[i] - self.first_point_data[i]) / \ # (Const.SECOND_POINT_VOLTAGE - Const.FIRST_POINT_VOLTAGE)) # self.b_factors[i] = Const.SECOND_POINT_VOLTAGE - self.second_point_data[i] # Проверка коэффициентов print(self.mid_point_factors) print(self.test_factors(5.0)) # print("First point data") # print(self.first_point_data) # print("Secon point data") # print(self.second_point_data) # print("k, b factors") # print(self.k_factors) # print(self.b_factors) def setup_module(self, channel_mode: int): """Настройка измеретельных каналов модуля в нужном режиме""" # Настройка каналов в режиме измерения напряжения 0 - 10 В if channel_mode == Const.VOLTAGE_0_10: print("Настройка модуля в режиме измерения напряжения 0 - 10 В...", end='') self.dut.set_inputs_state(0b1111_1111_1111) self.dut.set_inputs_mode(0b0000_0000_0000) self.dut.set_voltage_range(0b0000_0000_0000) for i in range(1, 13): self.dut.set_k_factor(i, 1.0) self.dut.set_b_factor(i, 0.0) # self.dut.sys.save_settings() # self.dut.print_inputs() print('OK') def menu(self): menu_items = [ inquirer.List('action', message="Калибровка MAI_12", choices=['Калибровка напряжения 0-10 В', 'Завершить'], ), ] while True: answers = inquirer.prompt(menu_items) if answers['action'] == 'Калибровка напряжения 0-10 В': self.calibration_mode(Const.VOLTAGE_0_10) elif answers['action'] == 'Завершить': return def main(): calibration = Calibration_AI('COM12') calibration.menu() if __name__ == '__main__': main()