Skip to content

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 endpointEquipment LibraryPhases → 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 &gt;= stabilize_time<br/>AND temp &gt;= 95% target<br/>AND level &gt;= 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:

  1. prepare starts the agitator (agitator.CMD = agitator_speed) and waits for agitator.POS >= 50% of setpoint before diverging.
  2. Fill branch: fill_start opens the inlet. filling watches the level sensor. fill_done closes the inlet and sets fill_ok := TRUE.
  3. Heat branch (in parallel): heat_start writes heat_output to temp_controller.CMD. heating watches the temperature sensor. heat_done sets heat_ok := TRUE.
  4. 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

  1. HMI endpointBatch Execution+ Newsim-tempered-fill-m1Start
  2. Click into the phase to see two branches running — both filling and heating active at the same time
  3. Open Data endpointTrends and chart level_sensor.PV, temp_sensor.PV, temp_controller.CMD, inlet_valve.CMD
  4. Watch fill complete (one branch ends), then heat converge (second branch ends), then the stabilize hold tick down before complete