- refactored
This commit is contained in:
+1
-1
@@ -1277,7 +1277,7 @@ class Ui_MainWindow(object):
|
|||||||
self.label_5.setText(_translate("MainWindow", "Power [W]"))
|
self.label_5.setText(_translate("MainWindow", "Power [W]"))
|
||||||
self.label_7.setText(_translate("MainWindow", "State"))
|
self.label_7.setText(_translate("MainWindow", "State"))
|
||||||
self.label_state.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.label_8.setText(_translate("MainWindow", "Host"))
|
||||||
self.menu_File.setTitle(_translate("MainWindow", "&File"))
|
self.menu_File.setTitle(_translate("MainWindow", "&File"))
|
||||||
self.menu_Help.setTitle(_translate("MainWindow", "&Help"))
|
self.menu_Help.setTitle(_translate("MainWindow", "&Help"))
|
||||||
|
|||||||
@@ -29,12 +29,15 @@ class TempController(APid):
|
|||||||
self.y = -1
|
self.y = -1
|
||||||
self.state = States.IDLE
|
self.state = States.IDLE
|
||||||
self.use_kalman = True
|
self.use_kalman = True
|
||||||
self.kalman.initial((self.theta_ist_set, 0))
|
|
||||||
self.pid_hold.set_params(params['Hold'])
|
self.pid_hold.set_params(params['Hold'])
|
||||||
self.pid_rate.set_params(params['Heat'])
|
self.pid_rate.set_params(params['Heat'])
|
||||||
|
self.is_startup = True
|
||||||
|
|
||||||
def set_theta_ist(self, value):
|
def set_theta_ist(self, value):
|
||||||
self.theta_ist_set = value
|
self.theta_ist_set = value
|
||||||
|
if self.is_startup:
|
||||||
|
self.is_startup = False
|
||||||
|
self.kalman.initial((value, 0))
|
||||||
|
|
||||||
def get_theta_ist(self):
|
def get_theta_ist(self):
|
||||||
return self.theta_ist
|
return self.theta_ist
|
||||||
@@ -82,44 +85,50 @@ class TempController(APid):
|
|||||||
theta_err = self.theta_soll_set - self.theta_ist
|
theta_err = self.theta_soll_set - self.theta_ist
|
||||||
heatrate_err = self.heatrate_soll - self.heatrate_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
|
# Process state
|
||||||
state_next = self.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 self.state == States.IDLE:
|
||||||
if diff > THRESH_HEAT:
|
|
||||||
state_next = States.HEAT
|
|
||||||
self.pid_rate.reset()
|
self.pid_rate.reset()
|
||||||
|
if diff > THRESH_IDLE_HEAT:
|
||||||
|
state_next = States.HEAT
|
||||||
elif diff > -THRESH_IDLE_HOLD:
|
elif diff > -THRESH_IDLE_HOLD:
|
||||||
state_next = States.HOLD
|
state_next = States.HOLD
|
||||||
self.pid_rate.reset()
|
|
||||||
elif self.state == States.HOLD:
|
elif self.state == States.HOLD:
|
||||||
if diff > THRESH_HEAT:
|
|
||||||
state_next = States.HEAT
|
|
||||||
self.pid_rate.reset()
|
self.pid_rate.reset()
|
||||||
elif diff < -THRESH_IDLE_HOLD:
|
if diff > THRESH_HOLD_HEAT:
|
||||||
|
state_next = States.HEAT
|
||||||
|
elif diff < -THRESH_HOLD_IDLE:
|
||||||
state_next = States.IDLE
|
state_next = States.IDLE
|
||||||
elif self.state == States.HEAT:
|
elif self.state == States.HEAT:
|
||||||
if diff < -THRESH_IDLE:
|
if diff < -THRESH_HEAT_IDLE:
|
||||||
state_next = States.IDLE
|
state_next = States.IDLE
|
||||||
elif diff < THRESH_HEAT_HOLD:
|
elif diff < THRESH_HEAT_HOLD:
|
||||||
state_next = States.HOLD
|
state_next = States.HOLD
|
||||||
self.pid_hold.reset()
|
self.pid_hold.reset()
|
||||||
|
self.pid_rate.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()
|
|
||||||
|
|
||||||
if state_next != self.state:
|
if state_next != self.state:
|
||||||
self.state = state_next
|
self.state = state_next
|
||||||
print("New state = {}".format(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):
|
def get_power(self):
|
||||||
return self.y
|
return self.y
|
||||||
|
|
||||||
|
|||||||
@@ -30,16 +30,19 @@ class TempController(APid):
|
|||||||
self.y = -1
|
self.y = -1
|
||||||
self.state = States.IDLE
|
self.state = States.IDLE
|
||||||
self.use_kalman = True
|
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_hold.set_params(params['Hold'])
|
||||||
self.pid_rate.set_params(params['Heat'])
|
self.pid_rate.set_params(params['Heat'])
|
||||||
self.model = Pot(dt, params['Model'])
|
self.model = Pot(dt, params['Model'])
|
||||||
self.theta_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'])
|
self.dtheta_ist_delay_model = Delay(dt, params['Model']['Td'], 0)
|
||||||
|
self.is_startup = True
|
||||||
|
|
||||||
def set_theta_ist(self, value):
|
def set_theta_ist(self, value):
|
||||||
self.theta_ist_set = 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):
|
def get_theta_ist(self):
|
||||||
return self.theta_ist
|
return self.theta_ist
|
||||||
@@ -98,36 +101,46 @@ class TempController(APid):
|
|||||||
theta_err = self.theta_soll_set - theta_ist_plant
|
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)
|
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
|
# Process state
|
||||||
state_next = self.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 self.state == States.IDLE:
|
||||||
if diff > THRESH_HEAT:
|
|
||||||
state_next = States.HEAT
|
|
||||||
self.pid_rate.reset()
|
self.pid_rate.reset()
|
||||||
|
if diff > THRESH_IDLE_HEAT:
|
||||||
|
state_next = States.HEAT
|
||||||
elif diff > -THRESH_IDLE_HOLD:
|
elif diff > -THRESH_IDLE_HOLD:
|
||||||
state_next = States.HOLD
|
state_next = States.HOLD
|
||||||
self.pid_rate.reset()
|
|
||||||
elif self.state == States.HOLD:
|
elif self.state == States.HOLD:
|
||||||
if diff > THRESH_HEAT:
|
|
||||||
state_next = States.HEAT
|
|
||||||
self.pid_rate.reset()
|
self.pid_rate.reset()
|
||||||
elif diff < -THRESH_IDLE_HOLD:
|
if diff > THRESH_HOLD_HEAT:
|
||||||
|
state_next = States.HEAT
|
||||||
|
elif diff < -THRESH_HOLD_IDLE:
|
||||||
state_next = States.IDLE
|
state_next = States.IDLE
|
||||||
elif self.state == States.HEAT:
|
elif self.state == States.HEAT:
|
||||||
if diff < -THRESH_IDLE:
|
if diff < -THRESH_HEAT_IDLE:
|
||||||
state_next = States.IDLE
|
state_next = States.IDLE
|
||||||
elif diff < THRESH_HEAT_HOLD:
|
elif diff < THRESH_HEAT_HOLD:
|
||||||
state_next = States.HOLD
|
state_next = States.HOLD
|
||||||
self.pid_hold.reset()
|
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_hold.process(theta_err, -self.theta_ist)
|
||||||
self.pid_rate.process(heatrate_err, -self.heatrate_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.set_power(max(0, 250 + 3500 * self.y))
|
||||||
self.model.process()
|
self.model.process()
|
||||||
|
|
||||||
if state_next != self.state:
|
|
||||||
self.state = state_next
|
|
||||||
print("New state = {}".format(state_next))
|
|
||||||
|
|
||||||
def get_power(self):
|
def get_power(self):
|
||||||
return self.y
|
return self.y
|
||||||
|
|
||||||
|
|||||||
@@ -2,9 +2,9 @@ import numpy as np
|
|||||||
|
|
||||||
|
|
||||||
class Delay:
|
class Delay:
|
||||||
def __init__(self, dt, delay):
|
def __init__(self, dt, delay, ic):
|
||||||
nd = int(delay/dt + 0.5)
|
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.ri = 0
|
||||||
self.wi = 0
|
self.wi = 0
|
||||||
|
|
||||||
|
|||||||
@@ -16,13 +16,13 @@ class Pot(APlant):
|
|||||||
self.L = params['L']
|
self.L = params['L']
|
||||||
self.Td = params['Td']
|
self.Td = params['Td']
|
||||||
self.kn = params['kn']
|
self.kn = params['kn']
|
||||||
self.temp = params['theta']
|
self.temp = 0
|
||||||
self.temp_intermediate = params['theta']
|
self.temp_intermediate = params['theta']
|
||||||
|
|
||||||
self.theta_amb = theta_amb
|
self.theta_amb = theta_amb
|
||||||
|
|
||||||
self.power_set = 0
|
self.power_set = 0
|
||||||
self.delay = Delay(self.dt, self.Td)
|
self.delay = Delay(self.dt, self.Td, params['theta'])
|
||||||
|
|
||||||
def activate(self, enable):
|
def activate(self, enable):
|
||||||
pass
|
pass
|
||||||
|
|||||||
Reference in New Issue
Block a user