- Controller have separate PID controller for heat and hold
- do actor fusion - PID : fixed reset() git-svn-id: http://moon:8086/svn/projects/HendiControl@259 fda53097-d464-4ada-af97-ba876c37ca34
This commit is contained in:
@@ -25,6 +25,7 @@ class Controller(TimerListener):
|
||||
self.dt = params['dt']
|
||||
self.params = params
|
||||
self.pid = Pid()
|
||||
self.pid_rate = Pid()
|
||||
self.timer_ist = 0
|
||||
self.sensorTime_v = np.empty(0)
|
||||
self.theta_raw_v = np.empty(0)
|
||||
@@ -34,6 +35,8 @@ class Controller(TimerListener):
|
||||
self.heatrate_k_v = np.empty(0)
|
||||
self.time_v = np.empty(0)
|
||||
self.power_v = np.empty(0)
|
||||
self.power_heat_v = np.empty(0)
|
||||
self.power_hold_v = np.empty(0)
|
||||
self.error_v = np.empty(0)
|
||||
self.time = 0
|
||||
self.report_interval = 1.0
|
||||
@@ -199,9 +202,6 @@ class Controller(TimerListener):
|
||||
# ------------------------------
|
||||
# The loop
|
||||
# ------------------------------
|
||||
if self.ctrl_theta_soll < self.ctrl_theta:
|
||||
return True
|
||||
|
||||
controllerStateNext = self.controllerState
|
||||
ovenStateNext = self.ovenState
|
||||
|
||||
@@ -218,43 +218,23 @@ class Controller(TimerListener):
|
||||
if ctrl_theta < self.ctrl_theta_soll:
|
||||
ovenStateNext = ovenStates.HEAT
|
||||
|
||||
pid_err = 0
|
||||
if self.ovenState == ovenStates.HEAT:
|
||||
pid_err = ctrl_heatrate_err
|
||||
pid_params_acqu = self.params['Heat']['Acqu']['Pid']
|
||||
pid_params_track = self.params['Heat']['Track']['Pid']
|
||||
pid_thresh_acqu = self.params['Heat']['Acqu']['thresh_leave']
|
||||
pid_thresh_track = self.params['Heat']['Track']['thresh_leave']
|
||||
if (ctrl_theta + 1.0) >= self.ctrl_theta_soll:
|
||||
ovenStateNext = ovenStates.HOLD
|
||||
self.log("Set rast timer to {:0.1f} min.".format(timer_soll/60))
|
||||
self.timer_ist = timer_soll
|
||||
|
||||
if self.ovenState == ovenStates.HOLD:
|
||||
pid_err = ctrl_theta_err
|
||||
pid_params_acqu = self.params['Hold']['Acqu']['Pid']
|
||||
pid_params_track = self.params['Hold']['Track']['Pid']
|
||||
pid_thresh_acqu = self.params['Heat']['Acqu']['thresh_leave']
|
||||
pid_thresh_track = self.params['Heat']['Track']['thresh_leave']
|
||||
if self.timer_ist == 0:
|
||||
ovenStateNext = ovenStates.NOP
|
||||
doLoop = False
|
||||
|
||||
if self.ovenState != ovenStates.NOP:
|
||||
if self.controllerState == controllerStates.ACQU:
|
||||
pid_params = pid_params_acqu
|
||||
if abs(pid_err) < pid_thresh_acqu:
|
||||
controllerStateNext = controllerStates.TRACK
|
||||
self.pid.process(self.dt, self.params['Hold']['Acqu']['Pid'], ctrl_theta_err)
|
||||
self.pid_rate.process(self.dt, self.params['Heat']['Acqu']['Pid'], ctrl_heatrate_err)
|
||||
|
||||
if self.controllerState == controllerStates.TRACK:
|
||||
pid_params = pid_params_track
|
||||
if abs(pid_err) > pid_thresh_track:
|
||||
controllerStateNext = controllerStates.ACQU
|
||||
|
||||
self.pid.process(self.dt, pid_params, pid_err)
|
||||
|
||||
y = self.pid.get_y()
|
||||
power_soll = max(self.params['P_min'], min(self.params['P_max'], self.params['P_max']*y))
|
||||
power_hold = max(self.params['P_min'], min(self.params['P_max'], self.params['P_max']*self.pid.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)
|
||||
self.plant.setPower(power_soll)
|
||||
power_ist = self.plant.getPower()
|
||||
|
||||
@@ -262,13 +242,15 @@ 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_ist)
|
||||
self.error_v = np.append(self.error_v, pid_err)
|
||||
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)
|
||||
|
||||
# -----------------------------------------
|
||||
if ovenStateNext != self.ovenState:
|
||||
self.log("{} -> {}".format(self.ovenState, ovenStateNext))
|
||||
self.pid.reset()
|
||||
if ovenStateNext == ovenStates.HEAT:
|
||||
self.pid_rate.reset()
|
||||
self.stirrer.setSpeed(self.stirrSpeedHeat)
|
||||
self.stirrer.setDutyCycle(1.0)
|
||||
|
||||
@@ -289,4 +271,4 @@ class Controller(TimerListener):
|
||||
else:
|
||||
self.timer_ist = 0
|
||||
|
||||
|
||||
return self.ovenState == ovenStates.NOP
|
||||
|
||||
Reference in New Issue
Block a user