TempController(Smith).__init__ no longer takes model_params/theta_amb - set_model_plant_params() and the existing set_ambient_temperature() must be called instead (mirrors components/plant/pot.py's own Pot constructor refactor). temp_controller.py's now-pointless model_params/theta_amb constructor placeholders (kept only for "compatibility" with Smith) are dropped too. Both TempController variants now raise a clear RuntimeError from process() itself if set_params() wasn't called, instead of letting it surface deep inside Pid.process() as an opaque "'NoneType' object is not subscriptable". Smith additionally checks its internal models via Pot.is_configured() (new) and raises if set_model_plant_params()/set_ambient_temperature() weren't called either. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01DkkuG48uHFCGKe6dPSERFk
32 lines
973 B
Python
32 lines
973 B
Python
from components.pid.temp_controller_base import TempControllerBase
|
|
|
|
|
|
class TempController(TempControllerBase):
|
|
def __init__(self, dt):
|
|
TempControllerBase.__init__(self, dt)
|
|
self.dt = dt
|
|
self.last_theta_ist = 20
|
|
self.heatrate_ist = 0
|
|
|
|
def process(self):
|
|
self._require_params()
|
|
|
|
# Process Kalman
|
|
self.theta_ist = self.theta_ist_set
|
|
heatrate = (self.theta_ist - self.last_theta_ist)/self.dt*60
|
|
|
|
alpha = 0.1
|
|
self.heatrate_ist = (1-alpha) * self.heatrate_ist + alpha*heatrate
|
|
self.last_theta_ist = self.theta_ist
|
|
|
|
# Compensate for max heat rate to reduce overshoot
|
|
hold_scale = 1.0/self.heatrate_soll_set if self.heatrate_soll_set > 0 else 1.0
|
|
|
|
self.heatrate_soll = self.heatrate_soll_set * self.pid_hold.get_y()
|
|
theta_err = self.theta_soll_set - self.theta_ist
|
|
heatrate_err = self.heatrate_soll - self.heatrate_ist
|
|
|
|
diff = self.theta_soll_set - self.theta_ist
|
|
self.process_fsm(diff)
|
|
self.process_pid(theta_err, heatrate_err, hold_scale)
|