Add editable PI controller coefficient fields to GUI

This commit is contained in:
awe
2026-07-29 17:37:50 +03:00
parent 43d490e2f8
commit c6a7e84558
3 changed files with 42 additions and 4 deletions
+16 -1
View File
@@ -44,6 +44,15 @@ def get_float(values, strId):
window['-StartCycle-'].update(disabled = True) window['-StartCycle-'].update(disabled = True)
return value 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): def shorten(i):
return "{:.2f}".format(round(i, 2)) return "{:.2f}".format(round(i, 2))
@@ -119,7 +128,13 @@ if __name__ == "__main__":
while True: while True:
event, values = window.read(timeout=GUI_TIMEOUT_INTERVAL) 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() enable_manual_settings = window['-EnableManualSettings-'].get()
if current_and_temperature_settings_available: if current_and_temperature_settings_available:
window['-EnableT1-'].update(disabled = enable_manual_settings) window['-EnableT1-'].update(disabled = enable_manual_settings)
+6
View File
@@ -88,6 +88,9 @@ def request_state(prt):
def send_control_parameters(prt, params): def send_control_parameters(prt, params):
# Send control parameters # 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) hexstring = cmd.encode_Input(params)
cmd.send_DECODE_ENABLE(prt,hexstring) cmd.send_DECODE_ENABLE(prt,hexstring)
time.sleep(WAIT_AFTER_SEND) time.sleep(WAIT_AFTER_SEND)
@@ -100,6 +103,9 @@ def send_control_parameters(prt, params):
def send_task_command(prt, sending_param): def send_task_command(prt, sending_param):
# Send task command (TASK_ENABLE state in firmware) # 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) hexstring = cmd.create_TaskEnableCommand(sending_param)
cmd.send_TASK_ENABLE(prt,hexstring) cmd.send_TASK_ENABLE(prt,hexstring)
time.sleep(WAIT_AFTER_SEND) time.sleep(WAIT_AFTER_SEND)
+20 -3
View File
@@ -19,6 +19,11 @@ SET_MANUAL_MODE_TEXT = 'Ручной режим ввода'
SET_TEXT_WIDTH = 34 SET_TEXT_WIDTH = 34
SET_INPUT_WIDTH = 5 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_MIN_TEMPERATURE_TEXT_1 = 'Минимальная температура лазера 1 (C):'
SET_MAX_TEMPERATURE_TEXT_1 = 'Максимальная температура лазера 1 (C):' SET_MAX_TEMPERATURE_TEXT_1 = 'Максимальная температура лазера 1 (C):'
SET_DELTA_TEMPERATURE_TEXT_1 = 'Шаг дискретизации температуры лазера 1 (0.05-1 С):' 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.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.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.HSeparator(pad=H_SEPARATOR_PAD)],
[sg.Push(), sg.Text(READ_TEMPERATURE_TEXT+' 1: ', key='-TOUT_1-')], [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(), 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.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.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.HSeparator(pad=H_SEPARATOR_PAD)],
[sg.Push(), sg.Text(READ_TEMPERATURE_TEXT+' 2: ', key='-TOUT_2-')], [sg.Push(), sg.Text(READ_TEMPERATURE_TEXT+' 2: ', key='-TOUT_2-')],