diff --git a/_device_main.py b/_device_main.py index 4fa229e..941b94b 100644 --- a/_device_main.py +++ b/_device_main.py @@ -44,6 +44,15 @@ def get_float(values, strId): window['-StartCycle-'].update(disabled = True) return value +def read_pi_coeff(values, key, params, param_key): + # PI coefficient is entered as a human value and stored as Q8 fixed-point + # (value * 256), clamped to the 16-bit range expected by the firmware. + # On a bad/empty field the previous stored value is kept and Start is disabled. + try: + params[param_key] = max(0, min(65535, int(float(values[key]) * 256))) + except (ValueError, TypeError): + window['-StartCycle-'].update(disabled = True) + def shorten(i): return "{:.2f}".format(round(i, 2)) @@ -119,7 +128,13 @@ if __name__ == "__main__": while True: event, values = window.read(timeout=GUI_TIMEOUT_INTERVAL) - + + if values: + read_pi_coeff(values, '-InputKp1-', params, 'ProportionalCoeff_1') + read_pi_coeff(values, '-InputKi1-', params, 'IntegralCoeff_1') + read_pi_coeff(values, '-InputKp2-', params, 'ProportionalCoeff_2') + read_pi_coeff(values, '-InputKi2-', params, 'IntegralCoeff_2') + enable_manual_settings = window['-EnableManualSettings-'].get() if current_and_temperature_settings_available: window['-EnableT1-'].update(disabled = enable_manual_settings) diff --git a/device_interaction.py b/device_interaction.py index 6e2cb78..8c86edc 100644 --- a/device_interaction.py +++ b/device_interaction.py @@ -88,6 +88,9 @@ def request_state(prt): def send_control_parameters(prt, params): # Send control parameters + print("Sending PI coeffs (Q8): P1={} I1={} P2={} I2={}".format( + params['ProportionalCoeff_1'], params['IntegralCoeff_1'], + params['ProportionalCoeff_2'], params['IntegralCoeff_2'])) hexstring = cmd.encode_Input(params) cmd.send_DECODE_ENABLE(prt,hexstring) time.sleep(WAIT_AFTER_SEND) @@ -100,6 +103,9 @@ def send_control_parameters(prt, params): def send_task_command(prt, sending_param): # Send task command (TASK_ENABLE state in firmware) + print("Sending PI coeffs (Q8): P1={} I1={} P2={} I2={}".format( + sending_param['ProportionalCoeff_1'], sending_param['IntegralCoeff_1'], + sending_param['ProportionalCoeff_2'], sending_param['IntegralCoeff_2'])) hexstring = cmd.create_TaskEnableCommand(sending_param) cmd.send_TASK_ENABLE(prt,hexstring) time.sleep(WAIT_AFTER_SEND) diff --git a/gui.py b/gui.py index 7b3772f..e9239b1 100644 --- a/gui.py +++ b/gui.py @@ -19,6 +19,11 @@ SET_MANUAL_MODE_TEXT = 'Ручной режим ввода' SET_TEXT_WIDTH = 34 SET_INPUT_WIDTH = 5 +SET_KP_TEXT_1 = 'Коэфф. P регулятора лазера 1 (0-255):' +SET_KI_TEXT_1 = 'Коэфф. I регулятора лазера 1 (0-255):' +SET_KP_TEXT_2 = 'Коэфф. P регулятора лазера 2 (0-255):' +SET_KI_TEXT_2 = 'Коэфф. I регулятора лазера 2 (0-255):' + SET_MIN_TEMPERATURE_TEXT_1 = 'Минимальная температура лазера 1 (C):' SET_MAX_TEMPERATURE_TEXT_1 = 'Максимальная температура лазера 1 (C):' SET_DELTA_TEMPERATURE_TEXT_1 = 'Шаг дискретизации температуры лазера 1 (0.05-1 С):' @@ -110,7 +115,13 @@ def setup_gui(params): [sg.Text(SET_CURRENT_TEXT_1, size=(SET_TEXT_WIDTH, 1)), sg.Push(), sg.Input(params['Iset_1'], disabled_readonly_background_color="Gray", size=(SET_INPUT_WIDTH,1), key='-InputI1-', disabled = True)], - + + [sg.Text(SET_KP_TEXT_1, size=(SET_TEXT_WIDTH, 1)), sg.Push(), + sg.Input(params['ProportionalCoeff_1']/256, size=(SET_INPUT_WIDTH,1), key='-InputKp1-')], + + [sg.Text(SET_KI_TEXT_1, size=(SET_TEXT_WIDTH, 1)), sg.Push(), + sg.Input(params['IntegralCoeff_1']/256, size=(SET_INPUT_WIDTH,1), key='-InputKi1-')], + [sg.HSeparator(pad=H_SEPARATOR_PAD)], [sg.Push(), sg.Text(READ_TEMPERATURE_TEXT+' 1: ', key='-TOUT_1-')], @@ -129,9 +140,15 @@ def setup_gui(params): layout_input_col2 = [[sg.Text(SET_TEMPERATURE_TEXT_2, size=(SET_TEXT_WIDTH, 1)), sg.Push(), sg.Input(params['Temp_2'], disabled_readonly_background_color="Gray", size=(SET_INPUT_WIDTH,1), key='-InputT2-', disabled = True)], - [sg.Text(SET_CURRENT_TEXT_2, size=(SET_TEXT_WIDTH, 1)), sg.Push(), + [sg.Text(SET_CURRENT_TEXT_2, size=(SET_TEXT_WIDTH, 1)), sg.Push(), sg.Input(params['Iset_2'], disabled_readonly_background_color="Gray", size=(SET_INPUT_WIDTH,1), key='-InputI2-', disabled = True)], - + + [sg.Text(SET_KP_TEXT_2, size=(SET_TEXT_WIDTH, 1)), sg.Push(), + sg.Input(params['ProportionalCoeff_2']/256, size=(SET_INPUT_WIDTH,1), key='-InputKp2-')], + + [sg.Text(SET_KI_TEXT_2, size=(SET_TEXT_WIDTH, 1)), sg.Push(), + sg.Input(params['IntegralCoeff_2']/256, size=(SET_INPUT_WIDTH,1), key='-InputKi2-')], + [sg.HSeparator(pad=H_SEPARATOR_PAD)], [sg.Push(), sg.Text(READ_TEMPERATURE_TEXT+' 2: ', key='-TOUT_2-')],