- 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
This commit is contained in:
2019-04-25 20:57:28 +00:00
parent 09041d8ed8
commit 107003f452
2 changed files with 22 additions and 10 deletions
+19 -7
View File
@@ -64,6 +64,8 @@ class Controller(TimerListener):
self.timerMgr.registerTimer(self.plantTimer) self.timerMgr.registerTimer(self.plantTimer)
self.timerMgr.registerTimer(self.reportTimer) self.timerMgr.registerTimer(self.reportTimer)
self.rast_running = False self.rast_running = False
self.power_hold = 0
self.power_heat = 1000
def onTimer(self, timer): def onTimer(self, timer):
if timer == self.sensorTimer: 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_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)
power_hold = max(self.params['P_min'], min(self.params['P_max'], self.params['P_max'] * self.pid_hold.get_y())) if self.ovenState == ovenStates.HOLD:
power_heat = max(self.params['P_min'], min(self.params['P_max'], self.params['P_max'] * self.pid_rate.get_y())) self.power_hold += self.params['P_max'] * self.pid_hold.get_y()
power_soll = min(power_hold, power_heat)
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) self.plant.setPower(power_soll)
power_ist = self.plant.getPower() power_ist = self.plant.getPower()
@@ -247,8 +259,8 @@ class Controller(TimerListener):
self.theta_v = np.append(self.theta_v, ctrl_theta) self.theta_v = np.append(self.theta_v, ctrl_theta)
self.heatrate_v = np.append(self.heatrate_v, ctrl_heatrate) self.heatrate_v = np.append(self.heatrate_v, ctrl_heatrate)
self.power_v = np.append(self.power_v, power_soll) self.power_v = np.append(self.power_v, power_soll)
self.power_hold_v = np.append(self.power_hold_v, power_hold) self.power_hold_v = np.append(self.power_hold_v, self.power_hold)
self.power_heat_v = np.append(self.power_heat_v, power_heat) 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.error_v = np.append(self.error_v, ctrl_theta_err)
self.power_soll = power_soll self.power_soll = power_soll
@@ -256,12 +268,12 @@ class Controller(TimerListener):
if ovenStateNext != self.ovenState: if ovenStateNext != self.ovenState:
self.log("{} -> {}".format(self.ovenState, ovenStateNext)) self.log("{} -> {}".format(self.ovenState, ovenStateNext))
if ovenStateNext == ovenStates.HEAT: if ovenStateNext == ovenStates.HEAT:
self.pid_rate.reset() # self.pid_rate.reset()
self.stirrer.setSpeed(self.stirrSpeedHeat) self.stirrer.setSpeed(self.stirrSpeedHeat)
self.stirrer.setDutyCycle(1.0) self.stirrer.setDutyCycle(1.0)
if ovenStateNext == ovenStates.HOLD: if ovenStateNext == ovenStates.HOLD:
# self.pid_hold.reset() self.pid_hold.reset()
self.stirrer.setSpeed(self.stirrSpeedRast) self.stirrer.setSpeed(self.stirrSpeedRast)
self.stirrer.setDutyCycle(self.stirrDutyRast) self.stirrer.setDutyCycle(self.stirrDutyRast)
+3 -3
View File
@@ -11,7 +11,7 @@ class Pid():
# Auto windup # Auto windup
self.y_min = 0.0 self.y_min = 0.0
self.y_max = 500.0 self.y_max = 2.0
self.diff_aw = 0.0 self.diff_aw = 0.0
# Output # Output
@@ -35,7 +35,7 @@ class Pid():
rho = params['rho'] rho = params['rho']
err_aw = err + self.diff_aw err_aw = err + self.diff_aw
yi = rho*self.yi + err_aw yi = rho*self.yi + ki*dt * err_aw
if derr: if derr:
yd = derr yd = derr
@@ -43,7 +43,7 @@ class Pid():
yd = err - self.xd yd = err - self.xd
_yp = kp * err _yp = kp * err
_yi = ki*dt * yi _yi = yi
_yd = kd/dt * yd _yd = kd/dt * yd
self.y = _yp + _yi + _yd self.y = _yp + _yi + _yd