diff --git a/brewpi_win.py b/brewpi_win.py index 962c81b..93f3f51 100644 --- a/brewpi_win.py +++ b/brewpi_win.py @@ -1277,7 +1277,7 @@ class Ui_MainWindow(object): self.label_5.setText(_translate("MainWindow", "Power [W]")) self.label_7.setText(_translate("MainWindow", "State")) self.label_state.setText(_translate("MainWindow", "State")) - self.plainTextUri.setPlainText(_translate("MainWindow", "ws://brewpi:8765")) + self.plainTextUri.setPlainText(_translate("MainWindow", "ws://localhost:8765")) self.label_8.setText(_translate("MainWindow", "Host")) self.menu_File.setTitle(_translate("MainWindow", "&File")) self.menu_Help.setTitle(_translate("MainWindow", "&Help")) diff --git a/components/pid/temp_controller.py b/components/pid/temp_controller.py index af0e47c..0eaf410 100644 --- a/components/pid/temp_controller.py +++ b/components/pid/temp_controller.py @@ -29,12 +29,15 @@ class TempController(APid): self.y = -1 self.state = States.IDLE self.use_kalman = True - self.kalman.initial((self.theta_ist_set, 0)) self.pid_hold.set_params(params['Hold']) self.pid_rate.set_params(params['Heat']) + self.is_startup = True def set_theta_ist(self, value): self.theta_ist_set = value + if self.is_startup: + self.is_startup = False + self.kalman.initial((value, 0)) def get_theta_ist(self): return self.theta_ist @@ -82,44 +85,50 @@ class TempController(APid): theta_err = self.theta_soll_set - self.theta_ist heatrate_err = self.heatrate_soll - self.heatrate_ist + diff = self.theta_soll_set - self.theta_ist + self.process_fsm(diff) + self.process_pid(theta_err, heatrate_err) + + def process_fsm(self, diff): + THRESH_HOLD_IDLE = 0.1 + THRESH_HOLD_HEAT = 2.0 + THRESH_IDLE_HEAT = 1.0 + THRESH_IDLE_HOLD = 0.1 + THRESH_HEAT_HOLD = 2.0 + THRESH_HEAT_IDLE = 2.0 + # Process state state_next = self.state - diff = self.theta_soll_set - self.theta_ist - - THRESH_HEAT = 1.0 - THRESH_IDLE = 1.0 - THRESH_IDLE_HOLD = 0.1 - THRESH_HEAT_HOLD = 1.0 - if self.state == States.IDLE: - if diff > THRESH_HEAT: + self.pid_rate.reset() + if diff > THRESH_IDLE_HEAT: state_next = States.HEAT - self.pid_rate.reset() elif diff > -THRESH_IDLE_HOLD: state_next = States.HOLD - self.pid_rate.reset() elif self.state == States.HOLD: - if diff > THRESH_HEAT: + self.pid_rate.reset() + if diff > THRESH_HOLD_HEAT: state_next = States.HEAT - self.pid_rate.reset() - elif diff < -THRESH_IDLE_HOLD: + elif diff < -THRESH_HOLD_IDLE: state_next = States.IDLE elif self.state == States.HEAT: - if diff < -THRESH_IDLE: + if diff < -THRESH_HEAT_IDLE: state_next = States.IDLE elif diff < THRESH_HEAT_HOLD: state_next = States.HOLD self.pid_hold.reset() - - self.pid_hold.process(theta_err, -self.theta_ist) - self.pid_rate.process(heatrate_err, -self.heatrate_ist) - - self.y = self.pid_rate.get_y() + self.pid_rate.reset() if state_next != self.state: self.state = state_next print("New state = {}".format(state_next)) + def process_pid(self, theta_err, heatrate_err): + self.pid_hold.process(theta_err, -self.theta_ist) + self.pid_rate.process(heatrate_err, -self.heatrate_ist) + + self.y = self.pid_rate.get_y() + def get_power(self): return self.y diff --git a/components/pid/temp_controller_smith.py b/components/pid/temp_controller_smith.py index b11a56c..5488c12 100644 --- a/components/pid/temp_controller_smith.py +++ b/components/pid/temp_controller_smith.py @@ -30,16 +30,19 @@ class TempController(APid): self.y = -1 self.state = States.IDLE self.use_kalman = True - self.kalman_model.initial((self.theta_ist_set, 0)) - self.kalman_plant.initial((self.theta_ist_set, 0)) self.pid_hold.set_params(params['Hold']) self.pid_rate.set_params(params['Heat']) self.model = Pot(dt, params['Model']) - self.theta_ist_delay_model = Delay(dt, params['Model']['Td']) - self.dtheta_ist_delay_model = Delay(dt, params['Model']['Td']) + self.theta_ist_delay_model = Delay(dt, params['Model']['Td'], 0) + self.dtheta_ist_delay_model = Delay(dt, params['Model']['Td'], 0) + self.is_startup = True def set_theta_ist(self, value): self.theta_ist_set = value + if self.is_startup: + self.is_startup = False + self.kalman_model.initial((value, 0)) + self.kalman_plant.initial((value, 0)) def get_theta_ist(self): return self.theta_ist @@ -98,36 +101,46 @@ class TempController(APid): theta_err = self.theta_soll_set - theta_ist_plant heatrate_err = self.heatrate_soll - (heatrate_ist_plant - self.dtheta_ist_delay_model.get() + heatrate_ist_model) + diff = self.theta_soll_set - self.theta_ist + + self.process_fsm(diff) + self.process_pid(theta_err, heatrate_err) + + def process_fsm(self, diff): + THRESH_HOLD_IDLE = 0.1 + THRESH_HOLD_HEAT = 2.0 + THRESH_IDLE_HEAT = 1.0 + THRESH_IDLE_HOLD = 0.1 + THRESH_HEAT_HOLD = 2.0 + THRESH_HEAT_IDLE = 2.0 # Process state state_next = self.state - diff = self.theta_soll_set - self.theta_ist - - THRESH_HEAT = 1.0 - THRESH_IDLE = 1.0 - THRESH_IDLE_HOLD = 0.1 - THRESH_HEAT_HOLD = 2.0 - if self.state == States.IDLE: - if diff > THRESH_HEAT: + self.pid_rate.reset() + if diff > THRESH_IDLE_HEAT: state_next = States.HEAT - self.pid_rate.reset() elif diff > -THRESH_IDLE_HOLD: state_next = States.HOLD - self.pid_rate.reset() elif self.state == States.HOLD: - if diff > THRESH_HEAT: + self.pid_rate.reset() + if diff > THRESH_HOLD_HEAT: state_next = States.HEAT - self.pid_rate.reset() - elif diff < -THRESH_IDLE_HOLD: + elif diff < -THRESH_HOLD_IDLE: state_next = States.IDLE elif self.state == States.HEAT: - if diff < -THRESH_IDLE: + if diff < -THRESH_HEAT_IDLE: state_next = States.IDLE elif diff < THRESH_HEAT_HOLD: state_next = States.HOLD self.pid_hold.reset() + self.pid_rate.reset() + if state_next != self.state: + self.state = state_next + print("New state = {}".format(state_next)) + + def process_pid(self, theta_err, heatrate_err): self.pid_hold.process(theta_err, -self.theta_ist) self.pid_rate.process(heatrate_err, -self.heatrate_ist) @@ -135,10 +148,6 @@ class TempController(APid): self.model.set_power(max(0, 250 + 3500 * self.y)) self.model.process() - if state_next != self.state: - self.state = state_next - print("New state = {}".format(state_next)) - def get_power(self): return self.y diff --git a/components/plant/delay.py b/components/plant/delay.py index 16a04cb..5604eaa 100644 --- a/components/plant/delay.py +++ b/components/plant/delay.py @@ -2,9 +2,9 @@ import numpy as np class Delay: - def __init__(self, dt, delay): + def __init__(self, dt, delay, ic): nd = int(delay/dt + 0.5) - self.delay_line = np.zeros(nd+1) + self.delay_line = np.ones(nd+1)*ic self.ri = 0 self.wi = 0 diff --git a/components/plant/pot.py b/components/plant/pot.py index aa08143..48e423f 100644 --- a/components/plant/pot.py +++ b/components/plant/pot.py @@ -16,13 +16,13 @@ class Pot(APlant): self.L = params['L'] self.Td = params['Td'] self.kn = params['kn'] - self.temp = params['theta'] + self.temp = 0 self.temp_intermediate = params['theta'] self.theta_amb = theta_amb self.power_set = 0 - self.delay = Delay(self.dt, self.Td) + self.delay = Delay(self.dt, self.Td, params['theta']) def activate(self, enable): pass