From 107003f452923bc28b50d90e92d277dda1f00624 Mon Sep 17 00:00:00 2001 From: Jens Ahrensfeld Date: Thu, 25 Apr 2019 20:57:28 +0000 Subject: [PATCH] - Controller have integrator on power level - improved integral part in PID git-svn-id: http://moon:8086/svn/projects/HendiControl@268 fda53097-d464-4ada-af97-ba876c37ca34 --- Control/brewpi/controller.py | 26 +++++++++++++++++++------- Control/brewpi/pid.py | 6 +++--- 2 files changed, 22 insertions(+), 10 deletions(-) diff --git a/Control/brewpi/controller.py b/Control/brewpi/controller.py index a773649..8ca9cbd 100644 --- a/Control/brewpi/controller.py +++ b/Control/brewpi/controller.py @@ -64,6 +64,8 @@ class Controller(TimerListener): self.timerMgr.registerTimer(self.plantTimer) self.timerMgr.registerTimer(self.reportTimer) self.rast_running = False + self.power_hold = 0 + self.power_heat = 1000 def onTimer(self, timer): if timer == self.sensorTimer: @@ -237,9 +239,19 @@ class Controller(TimerListener): 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) - power_hold = max(self.params['P_min'], min(self.params['P_max'], self.params['P_max'] * self.pid_hold.get_y())) - power_heat = max(self.params['P_min'], min(self.params['P_max'], self.params['P_max'] * self.pid_rate.get_y())) - power_soll = min(power_hold, power_heat) + if self.ovenState == ovenStates.HOLD: + self.power_hold += self.params['P_max'] * self.pid_hold.get_y() + + if self.ovenState == ovenStates.HEAT: + self.power_heat += self.params['P_max'] * self.pid_rate.get_y() + + self.power_hold = max(self.params['P_min'], min(self.params['P_max'], self.power_hold)) + self.power_heat = max(self.params['P_min'], min(self.params['P_max'], self.power_heat)) + + power_soll = min(self.power_hold, self.power_hold) + if self.ovenState == ovenStates.HEAT: + power_soll = min(self.power_heat, self.power_heat) + self.plant.setPower(power_soll) power_ist = self.plant.getPower() @@ -247,8 +259,8 @@ class Controller(TimerListener): self.theta_v = np.append(self.theta_v, ctrl_theta) self.heatrate_v = np.append(self.heatrate_v, ctrl_heatrate) self.power_v = np.append(self.power_v, power_soll) - self.power_hold_v = np.append(self.power_hold_v, power_hold) - self.power_heat_v = np.append(self.power_heat_v, power_heat) + self.power_hold_v = np.append(self.power_hold_v, self.power_hold) + self.power_heat_v = np.append(self.power_heat_v, self.power_heat) self.error_v = np.append(self.error_v, ctrl_theta_err) self.power_soll = power_soll @@ -256,12 +268,12 @@ class Controller(TimerListener): if ovenStateNext != self.ovenState: self.log("{} -> {}".format(self.ovenState, ovenStateNext)) if ovenStateNext == ovenStates.HEAT: - self.pid_rate.reset() +# self.pid_rate.reset() self.stirrer.setSpeed(self.stirrSpeedHeat) self.stirrer.setDutyCycle(1.0) if ovenStateNext == ovenStates.HOLD: -# self.pid_hold.reset() + self.pid_hold.reset() self.stirrer.setSpeed(self.stirrSpeedRast) self.stirrer.setDutyCycle(self.stirrDutyRast) diff --git a/Control/brewpi/pid.py b/Control/brewpi/pid.py index 080d097..f5500c9 100644 --- a/Control/brewpi/pid.py +++ b/Control/brewpi/pid.py @@ -11,7 +11,7 @@ class Pid(): # Auto windup self.y_min = 0.0 - self.y_max = 500.0 + self.y_max = 2.0 self.diff_aw = 0.0 # Output @@ -35,7 +35,7 @@ class Pid(): rho = params['rho'] err_aw = err + self.diff_aw - yi = rho*self.yi + err_aw + yi = rho*self.yi + ki*dt * err_aw if derr: yd = derr @@ -43,7 +43,7 @@ class Pid(): yd = err - self.xd _yp = kp * err - _yi = ki*dt * yi + _yi = yi _yd = kd/dt * yd self.y = _yp + _yi + _yd