Phase Template: tank-tempered-fill¶
Fill the mixing tank to a target level while heating to a target temperature in parallel, then hold for a stabilize time. Use this phase whenever a recipe needs the tank at a specific temperature by the time the fill completes, which is common for solubility-driven dosing or downstream reaction prep. Fill and heat execute as two simultaneous SFC branches that rejoin at the stabilize step.
Where to find it¶
System endpoint → Equipment Library → Phases → select tank-tempered-fill.
graph TD
Start([initial]) --> PR[prepare]
PR -->|"agitator.POS >= 50% speed"| FS[fill_start]
FS -->|"inlet.FB"| FI[filling]
FI -->|"level >= target_level"| FD[fill_done]
PR --> HS[heat_start]
HS --> HT[heating]
HT -->|"temp >= target_temp"| HD[heat_done]
FD --> ST[stabilize]
HD --> ST
ST -->|"stabilize.T >= stabilize_time<br/>AND temp >= 95% target<br/>AND level >= 95% target"| Done([complete])
See Phases for the diagram conventions.
The two parallel branches from prepare are a simultaneous
divergence, and the rejoin at stabilize is a simultaneous
convergence.
What you see when it runs¶
| Element | Meaning |
|---|---|
| Active steps | Two active steps while fill and heat run in parallel — the phase detail shows both branches |
| Parameters | target_level, target_temp, heat_output, agitator_speed, stabilize_time |
| Shared variables | fill_ok and heat_ok latch true as each branch finishes; the stabilize guard checks both |
HMI screenshot pending
An annotated capture of a running tank-tempered-fill phase with
both branches active will be added here.
Parameters¶
| Parameter | Type | Unit | Range | Default | Required |
|---|---|---|---|---|---|
target_level |
REAL | L | 50-450 | — | yes |
target_temp |
REAL | degC | 20-80 | — | yes |
heat_output |
REAL | % | 10-100 | — | yes |
agitator_speed |
REAL | % | 10-80 | 30 |
no |
stabilize_time |
TIME | — | 10s-2m |
30s |
no |
TIME parameters take duration strings ("45s", "1m30s", "5m"),
not bare numbers.
Required control modules¶
| Role | Module type | Description |
|---|---|---|
inlet_valve |
discrete-valve | Tank inlet valve (on/off) |
level_sensor |
analog-sensor | Tank level measurement |
temp_controller |
analog-control | Tank temperature controller |
temp_sensor |
analog-sensor | Tank temperature measurement |
agitator |
analog-control | Tank agitator for heat distribution |
Capability: mixing.
How it works¶
Each scan the SFC engine advances both branches independently:
preparestarts the agitator (agitator.CMD = agitator_speed) and waits foragitator.POS >= 50% of setpointbefore diverging.- Fill branch:
fill_startopens the inlet.fillingwatches the level sensor.fill_donecloses the inlet and setsfill_ok := TRUE. - Heat branch (in parallel):
heat_startwritesheat_outputtotemp_controller.CMD.heatingwatches the temperature sensor.heat_donesetsheat_ok := TRUE. - Both branches converge on
stabilize. The exit transition is a three-way AND: stabilize-timer elapsed, temperature within 95 % of target, level within 95 % of target. The tank must hold both conditions together for the guard to fire.
This is a level-guard phase. Its multi-step holding chart disables
the heater first for thermal safety, then closes the inlet, then
reduces the agitator (an ordered shutdown on a Hold command). See
Phases § Level-guard phase.
Used in recipes¶
Try it¶
- HMI endpoint → Batch Execution → + New →
sim-tempered-fill-m1→ Start - Click into the phase to see two branches running — both
fillingandheatingactive at the same time - Open Data endpoint → Trends and chart
level_sensor.PV,temp_sensor.PV,temp_controller.CMD,inlet_valve.CMD - Watch fill complete (one branch ends), then heat converge (second
branch ends), then the stabilize hold tick down before
complete