HoldCool=0.1 was inherited from the pre-COOL-state era, where it meant "eagerly give up active holding and coast" - harmless, since coasting had no side effects. COOL is a real, actively-controlled state now (its own pid_cool, reset on every entry), so a threshold this tight relative to a real heater's discrete power steps (or even just sensor noise) caused the system to flip in and out of COOL nearly every tick once resting near a setpoint - resetting both pid_hold's and pid_cool's integrators each time and never letting either actually converge. Confirmed via a full multi-task simulation (real Pot/Sensor/Heater/ TempCtrl tasks, not a simplified loop) of sude/sud_0010.json: 44+ TempCtrl state changes and the run not settling within hours at HoldCool=0.1, dropping to 8 state changes and a clean 186.5 min finish at HoldCool=1.0 (matching the other thresholds). This was the dominant cause of real brews taking far longer than their nominal schedule duration - not just a forecasting inaccuracy, an actual control- quality bug.
49 lines
710 B
Templ
49 lines
710 B
Templ
{
|
|
"ambient_temperature": 20,
|
|
"Controller" : {
|
|
"dt": 1,
|
|
"sim_warp_factor": 10.0,
|
|
"stirrer_name": "sim",
|
|
"heater_name": "sim",
|
|
"sensor_name": "sim",
|
|
"plant_name": "sim",
|
|
"pid_type": "Smith"
|
|
},
|
|
"TempCtrl": {
|
|
"Hold": {
|
|
"kp": 0.4,
|
|
"ki": 0.0,
|
|
"kd": 0.0,
|
|
"kt": 0.0
|
|
},
|
|
"Heat": {
|
|
"kp": 0.05,
|
|
"ki": 0.01,
|
|
"kd": 0.0,
|
|
"kt": 1.5
|
|
},
|
|
"Cool": {
|
|
"kp": 0.05,
|
|
"ki": 0.01,
|
|
"kd": 0.0,
|
|
"kt": 1.5
|
|
},
|
|
"Thresholds": {
|
|
"HoldHeat": 1.0,
|
|
"HoldCool": 1.0,
|
|
"HeatHold": 1.0,
|
|
"HeatCool": 1.0,
|
|
"CoolHold": 1.0,
|
|
"CoolHeat": 1.0
|
|
}
|
|
},
|
|
"Heater": {
|
|
"port": "/dev/ttyUSB0",
|
|
"speed": "115200"
|
|
},
|
|
"Stirrer": {
|
|
"port": "/dev/ttyACM0",
|
|
"speed": "115200"
|
|
}
|
|
}
|