fix: split inner-loop yi_max clamp to fix HOLD-state windup overshoot
Renames pid_hold/pid_heat/pid_cool to pid_outer/pid_inner/pid_inner_cool
to match what actually runs when, and splits inner-loop config into
Inner.Heat/Inner.Hold/Inner.Cool so the same PID instance gets a tight
yi_max ceiling only while HOLD drives it, without capping legitimate
1.5 K/min ramps. Fixes the overshoot from docs/overshoot_hold_windup.md
where a cold-water disturbance during HOLD wound up pid_heat's integral
term with no anti-windup engagement, taking ~35s+ to unwind naturally.
Breaking config change: Hold/Heat/Cool -> Outer/Inner.{Heat,Hold,Cool}
in config.json, both .tpl templates, the pid/sud demo scripts, and
replay_sim.py's CLI flags. Adds tests/components/pid/ (stdlib unittest)
covering the Pid clamp/recovery behavior and closed-loop disturbance,
ramp, and HOLD<->HEAT transition cases.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DGQhVQ2Y3yXAQTXhrxVd5u
This commit is contained in:
@@ -222,4 +222,19 @@ mode):
|
||||
|
||||
## Status
|
||||
|
||||
Plan only — nothing in this document has been implemented yet.
|
||||
Implemented: `pid.py`'s `yi_max` clamp, the `pid_outer`/`pid_inner`/
|
||||
`pid_inner_cool` rename, the `Outer`/`Inner.{Heat,Hold,Cool}` config
|
||||
restructure (`config.json`, both `.tpl` templates, and the three demo
|
||||
scripts), and `utils/replay_sim.py`'s matching CLI-flag/print-loop rename.
|
||||
Tests added under `tests/components/pid/` (`test_pid.py` for the isolated
|
||||
`Pid` clamp behavior, `test_temp_controller_closed_loop.py` for the
|
||||
closed-loop disturbance/ramp/transition cases) — all passing.
|
||||
|
||||
One subtlety found while writing the closed-loop transition test that
|
||||
this plan didn't anticipate: `Inner.Hold`'s `yi_max` clamp applies
|
||||
retroactively. If a sustained `HEAT` ramp pushes `yi` above the `Hold`
|
||||
ceiling before the `HeatHold` threshold fires, the very next tick after
|
||||
the `HEAT→HOLD` transition clamps `yi` back down immediately, producing a
|
||||
small (~0.07 in testing, well below the pre-fix disturbance's ~0.74 peak)
|
||||
step in `y` rather than the fully bumpless transfer described above. Not
|
||||
addressed here — flagged for awareness, not a blocker.
|
||||
|
||||
Reference in New Issue
Block a user