- pid can negative
- controller: check user input and continue, removed old stuff, cleaned up git-svn-id: http://moon:8086/svn/projects/HendiControl@275 fda53097-d464-4ada-af97-ba876c37ca34
This commit is contained in:
@@ -58,14 +58,11 @@ if __name__ == '__main__':
|
|||||||
ablauf.pause()
|
ablauf.pause()
|
||||||
if signum == signal.SIGCONT:
|
if signum == signal.SIGCONT:
|
||||||
ablauf.cont()
|
ablauf.cont()
|
||||||
if signum == signal.SIGHUP:
|
|
||||||
ablauf.restart()
|
|
||||||
|
|
||||||
# Set the signal handler and a 5-second alarm
|
# Set the signal handler and a 5-second alarm
|
||||||
signal.signal(signal.SIGABRT, handler)
|
signal.signal(signal.SIGABRT, handler)
|
||||||
signal.signal(signal.SIGINT, handler)
|
signal.signal(signal.SIGINT, handler)
|
||||||
signal.signal(signal.SIGCONT, handler)
|
signal.signal(signal.SIGCONT, handler)
|
||||||
signal.signal(signal.SIGHUP, handler)
|
|
||||||
|
|
||||||
fp = open("brewpi.json")
|
fp = open("brewpi.json")
|
||||||
configJson = json.load(fp)
|
configJson = json.load(fp)
|
||||||
|
|||||||
@@ -10,7 +10,6 @@ from timer import Timer, TimerManager, TimerListener
|
|||||||
|
|
||||||
|
|
||||||
ovenStates = Enum('ovenStates', 'NOP HEAT HOLD')
|
ovenStates = Enum('ovenStates', 'NOP HEAT HOLD')
|
||||||
controllerStates = Enum('controllerStates', 'ACQU TRACK')
|
|
||||||
|
|
||||||
|
|
||||||
class Controller(TimerListener):
|
class Controller(TimerListener):
|
||||||
@@ -19,7 +18,6 @@ class Controller(TimerListener):
|
|||||||
print(json.dumps({'Controller': params}, indent=4, sort_keys=True))
|
print(json.dumps({'Controller': params}, indent=4, sort_keys=True))
|
||||||
self.sim_warp_factor = params['sim_warp_factor']
|
self.sim_warp_factor = params['sim_warp_factor']
|
||||||
self.ovenState = ovenStates.NOP
|
self.ovenState = ovenStates.NOP
|
||||||
self.controllerState = controllerStates.ACQU
|
|
||||||
self.plant = plant
|
self.plant = plant
|
||||||
self.stirrer = stirrer
|
self.stirrer = stirrer
|
||||||
self.dt = params['dt']
|
self.dt = params['dt']
|
||||||
@@ -42,10 +40,7 @@ class Controller(TimerListener):
|
|||||||
self.time = 0
|
self.time = 0
|
||||||
self.report_interval = 1.0
|
self.report_interval = 1.0
|
||||||
self.thread = None
|
self.thread = None
|
||||||
self.rast_abort = False
|
|
||||||
self.receipe_sema = threading.Semaphore(0)
|
self.receipe_sema = threading.Semaphore(0)
|
||||||
self.is_pause = False
|
|
||||||
self.is_restart = False
|
|
||||||
self.receipe = None
|
self.receipe = None
|
||||||
self.theta_sm = Smoother(1.0)
|
self.theta_sm = Smoother(1.0)
|
||||||
self.heatrate_sm = Smoother(0.01)
|
self.heatrate_sm = Smoother(0.01)
|
||||||
@@ -55,7 +50,6 @@ class Controller(TimerListener):
|
|||||||
self.kalman = Kalman(params['kalman'])
|
self.kalman = Kalman(params['kalman'])
|
||||||
self.sensor_dt = params['kalman']['dt']
|
self.sensor_dt = params['kalman']['dt']
|
||||||
self.timerMgr = TimerManager()
|
self.timerMgr = TimerManager()
|
||||||
|
|
||||||
self.rastTimer = Timer("Rast", self)
|
self.rastTimer = Timer("Rast", self)
|
||||||
self.sensorTimer = Timer("Sensor", self)
|
self.sensorTimer = Timer("Sensor", self)
|
||||||
self.plantTimer = Timer("Plant", self)
|
self.plantTimer = Timer("Plant", self)
|
||||||
@@ -112,7 +106,6 @@ class Controller(TimerListener):
|
|||||||
|
|
||||||
|
|
||||||
def start(self, recipe):
|
def start(self, recipe):
|
||||||
self.is_pause = False
|
|
||||||
self.receipe = recipe
|
self.receipe = recipe
|
||||||
print(json.dumps({recipe['Name'] : recipe}, indent=4, sort_keys=True))
|
print(json.dumps({recipe['Name'] : recipe}, indent=4, sort_keys=True))
|
||||||
|
|
||||||
@@ -120,34 +113,24 @@ class Controller(TimerListener):
|
|||||||
self.plantTimer.start(1/self.sim_warp_factor)
|
self.plantTimer.start(1/self.sim_warp_factor)
|
||||||
self.reportTimer.start(self.report_interval)
|
self.reportTimer.start(self.report_interval)
|
||||||
self.rastTimer.start(self.dt/self.sim_warp_factor)
|
self.rastTimer.start(self.dt/self.sim_warp_factor)
|
||||||
|
self.rast_running = False
|
||||||
|
|
||||||
self.thread = threading.Thread(target=self.receipe_run, args=(recipe,))
|
self.thread = threading.Thread(target=self.receipe_run, args=(recipe,))
|
||||||
self.thread.start()
|
self.thread.start()
|
||||||
|
|
||||||
def stop(self):
|
def stop(self):
|
||||||
if self.thread != None:
|
if self.thread != None:
|
||||||
self.rast_abort = True
|
self.receipe = None
|
||||||
self.thread.join()
|
self.thread.join()
|
||||||
self.thread = None
|
self.thread = None
|
||||||
self.rast_abort = False
|
|
||||||
self.receipe = None
|
|
||||||
|
|
||||||
def restart(self):
|
|
||||||
receipe = self.receipe
|
|
||||||
self.is_restart = True
|
|
||||||
self.stop()
|
|
||||||
self.start(receipe)
|
|
||||||
self.is_restart = False
|
|
||||||
|
|
||||||
def pause(self):
|
def pause(self):
|
||||||
if self.thread != None:
|
if self.thread != None:
|
||||||
self.is_pause = True
|
self.ovenState = ovenStates.HOLD
|
||||||
self.stirrer.deactivate()
|
|
||||||
self.plant.activate(False)
|
|
||||||
|
|
||||||
def cont(self):
|
def cont(self):
|
||||||
if self.thread != None:
|
if self.thread != None:
|
||||||
self.is_pause = False
|
self.ovenState = ovenStates.NOP
|
||||||
|
|
||||||
def wait_finished(self):
|
def wait_finished(self):
|
||||||
self.receipe_sema.acquire()
|
self.receipe_sema.acquire()
|
||||||
@@ -172,7 +155,7 @@ class Controller(TimerListener):
|
|||||||
rasten.append(None)
|
rasten.append(None)
|
||||||
rast_count = 0
|
rast_count = 0
|
||||||
self.timer_ist = 0
|
self.timer_ist = 0
|
||||||
while(not self.rast_abort):
|
while(self.receipe is not None):
|
||||||
self.timerMgr.process()
|
self.timerMgr.process()
|
||||||
if self.rastTimer.isElapsed():
|
if self.rastTimer.isElapsed():
|
||||||
rast = rasten[rast_count]
|
rast = rasten[rast_count]
|
||||||
@@ -183,12 +166,10 @@ class Controller(TimerListener):
|
|||||||
self.timer_ist = 0
|
self.timer_ist = 0
|
||||||
else:
|
else:
|
||||||
break
|
break
|
||||||
self.rast_running = True
|
|
||||||
|
|
||||||
waut = self.timerMgr.getMinTimeout()
|
waut = self.timerMgr.getMinTimeout()
|
||||||
time.sleep(waut)
|
time.sleep(waut)
|
||||||
|
|
||||||
self.rast_running = False
|
|
||||||
# Stirrer and plant
|
# Stirrer and plant
|
||||||
self.stirrer.deactivate()
|
self.stirrer.deactivate()
|
||||||
self.plant.activate(False)
|
self.plant.activate(False)
|
||||||
@@ -209,7 +190,6 @@ class Controller(TimerListener):
|
|||||||
# ------------------------------
|
# ------------------------------
|
||||||
# The loop
|
# The loop
|
||||||
# ------------------------------
|
# ------------------------------
|
||||||
controllerStateNext = self.controllerState
|
|
||||||
ovenStateNext = self.ovenState
|
ovenStateNext = self.ovenState
|
||||||
|
|
||||||
# -----------------------------------------
|
# -----------------------------------------
|
||||||
@@ -231,10 +211,6 @@ class Controller(TimerListener):
|
|||||||
self.log("Set rast timer to {:0.1f} min.".format(timer_soll/60))
|
self.log("Set rast timer to {:0.1f} min.".format(timer_soll/60))
|
||||||
self.timer_ist = timer_soll
|
self.timer_ist = timer_soll
|
||||||
|
|
||||||
if self.ovenState == ovenStates.HOLD:
|
|
||||||
if self.timer_ist == 0:
|
|
||||||
ovenStateNext = ovenStates.NOP
|
|
||||||
|
|
||||||
if self.ovenState != ovenStates.NOP:
|
if self.ovenState != ovenStates.NOP:
|
||||||
self.pid_hold.process(self.dt, self.params['Hold']['Pid'], ctrl_theta_err)
|
self.pid_hold.process(self.dt, self.params['Hold']['Pid'], ctrl_theta_err)
|
||||||
self.pid_rate.process(self.dt, self.params['Heat']['Pid'], ctrl_heatrate_err)
|
self.pid_rate.process(self.dt, self.params['Heat']['Pid'], ctrl_heatrate_err)
|
||||||
@@ -261,6 +237,17 @@ class Controller(TimerListener):
|
|||||||
self.error_v = np.append(self.error_v, ctrl_theta_err)
|
self.error_v = np.append(self.error_v, ctrl_theta_err)
|
||||||
self.power_soll = power_soll
|
self.power_soll = power_soll
|
||||||
|
|
||||||
|
self.time += self.dt
|
||||||
|
|
||||||
|
if self.timer_ist > 0:
|
||||||
|
self.timer_ist -= self.dt
|
||||||
|
else:
|
||||||
|
self.timer_ist = 0
|
||||||
|
if self.ovenState == ovenStates.HOLD:
|
||||||
|
if self.timer_ist == 0:
|
||||||
|
if not rast["waitForUser"]:
|
||||||
|
ovenStateNext = ovenStates.NOP
|
||||||
|
|
||||||
# -----------------------------------------
|
# -----------------------------------------
|
||||||
if ovenStateNext != self.ovenState:
|
if ovenStateNext != self.ovenState:
|
||||||
self.log("{} -> {}".format(self.ovenState, ovenStateNext))
|
self.log("{} -> {}".format(self.ovenState, ovenStateNext))
|
||||||
@@ -276,17 +263,7 @@ class Controller(TimerListener):
|
|||||||
self.stirrer.setSpeed(self.stirrSpeedRast)
|
self.stirrer.setSpeed(self.stirrSpeedRast)
|
||||||
self.stirrer.setDutyCycle(self.stirrDutyRast)
|
self.stirrer.setDutyCycle(self.stirrDutyRast)
|
||||||
|
|
||||||
if controllerStateNext != self.controllerState:
|
|
||||||
self.log("{} -> {}".format(self.controllerState, controllerStateNext))
|
|
||||||
|
|
||||||
self.ovenState = ovenStateNext
|
|
||||||
self.controllerState = controllerStateNext
|
|
||||||
# ------------------------------
|
# ------------------------------
|
||||||
self.time += self.dt
|
self.rast_running = True
|
||||||
|
self.ovenState = ovenStateNext
|
||||||
if self.timer_ist > 0:
|
|
||||||
self.timer_ist -= self.dt
|
|
||||||
else:
|
|
||||||
self.timer_ist = 0
|
|
||||||
|
|
||||||
return self.ovenState == ovenStates.NOP
|
return self.ovenState == ovenStates.NOP
|
||||||
|
|||||||
@@ -10,7 +10,7 @@ class Pid():
|
|||||||
self.xd = 0
|
self.xd = 0
|
||||||
|
|
||||||
# Auto windup
|
# Auto windup
|
||||||
self.y_min = 0.0
|
self.y_min = -1.0
|
||||||
self.y_max = 1.0
|
self.y_max = 1.0
|
||||||
|
|
||||||
# Output
|
# Output
|
||||||
|
|||||||
Reference in New Issue
Block a user