- improved controller

- plant: added duty cycle to heater control

git-svn-id: http://moon:8086/svn/projects/HendiControl@271 fda53097-d464-4ada-af97-ba876c37ca34
This commit is contained in:
2019-04-26 15:25:56 +00:00
parent aa76e7f8d0
commit dd3c63bebf
2 changed files with 37 additions and 26 deletions
+14 -15
View File
@@ -64,8 +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 = 1500
self.power_hold_offset = 200
self.power_heat_offset = 1500
def onTimer(self, timer):
if timer == self.sensorTimer:
@@ -239,18 +239,15 @@ 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)
if self.ovenState == ovenStates.HOLD:
self.power_hold += self.params['P_max'] * self.pid_hold.get_y()
power_hold = self.power_hold_offset + self.params['P_max'] * self.pid_hold.get_y()
power_heat = self.power_heat_offset + self.params['P_max'] * self.pid_rate.get_y()
power_hold = max(self.params['P_min'], min(self.params['P_max'], power_hold))
power_heat = max(self.params['P_min'], min(self.params['P_max'], power_heat))
power_soll = min(power_hold, power_hold)
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)
power_soll = min(power_heat, power_heat)
self.plant.setPower(power_soll)
power_ist = self.plant.getPower()
@@ -259,8 +256,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, self.power_hold)
self.power_heat_v = np.append(self.power_heat_v, self.power_heat)
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.error_v = np.append(self.error_v, ctrl_theta_err)
self.power_soll = power_soll
@@ -268,11 +265,13 @@ class Controller(TimerListener):
if ovenStateNext != self.ovenState:
self.log("{} -> {}".format(self.ovenState, ovenStateNext))
if ovenStateNext == ovenStates.HEAT:
# self.pid_rate.reset()
self.power_hold_offset = power_hold
self.pid_rate.reset()
self.stirrer.setSpeed(self.stirrSpeedHeat)
self.stirrer.setDutyCycle(1.0)
if ovenStateNext == ovenStates.HOLD:
self.power_heat_offset = power_heat
self.pid_hold.reset()
self.stirrer.setSpeed(self.stirrSpeedRast)
self.stirrer.setDutyCycle(self.stirrDutyRast)
+23 -11
View File
@@ -11,6 +11,9 @@ class Plant(APlant):
self.tempsensor = Max31865()
self.P = 0
self.isOn = False
self.cycleTime = 10
self.dutyCycle = 1
self.cycleCounter = 0
def activate(self, enable=True):
if enable == True:
@@ -20,20 +23,29 @@ class Plant(APlant):
self.heater.setSwitch(enable)
self.heater.remoteEnable(enable)
def process(self):
pass
def process(self, dt=1):
isOn = self.isOn
self.cycleCounter += dt
if self.cycleCounter >= self.cycleTime:
self.cycleCounter -= self.cycleTime
isOn = 0
if self.cycleCounter >= (self.cycleTime * (1-self.dutyCycle)):
if not isOn:
isOn = 1
if self.isOn != isOn:
if isOn:
self.heater.setSwitch(True)
else:
self.heater.setSwitch(False)
self.isOn = isOn
def setPower(self, power_w):
self.P = power_w
self.heater.setPowerWatts(power_w)
if power_w < 250:
if self.isOn:
self.heater.setSwitch(False)
self.isOn = False
elif power_w >= 500:
if not self.isOn:
self.heater.setSwitch(True)
self.isOn = True
self.heater.setPowerWatts(max(500, power_w))
self.dutyCycle = min(1, power_w / 500)
def getPower(self):
return self.heater.getPowerWatts()