Skip to content

Phase Template: react

Execute a reaction hold: heat, agitate, hold at temperature, then cool. Use this phase whenever a recipe needs to drive the reactor jacket to a configurable output, spin the agitator, and hold the combination for the requested duration. It is the core reaction step of every riverbend reactor recipe.

Where to find it

System endpoint → Equipment Library → Phases → select react.

graph TD
    Start([initial]) --> S1[start_reaction]
    S1 -->|"start_reaction.T >= duration"| S2[cool_down]
    S2 --> Done([done])
    S1 -.->|"interlock: jacket PV > maxTemp"| SH[safe_hold]
    S2 -.->|"interlock: jacket PV > maxTemp"| SH

See Phases for the diagram conventions.

What you see when it runs

Clicking the active phase on HMI endpoint → Batch Execution opens a detail panel with:

Element Meaning
Active step start_reaction while heating and holding; cool_down during the final cooling moment; safe_hold if the over-temperature interlock trips
Parameters jacketOutput, agitatorSpeed, duration, maxTemp resolved from the recipe formula
Bound modules The concrete jacket_controller and agitator instances for this unit
Elapsed Step-elapsed timer compared against duration

Open a trend chart on the unit's temperature sensor, the jacket CMD/POS, and the agitator CMD/POS to see the hold profile evolve.

HMI screenshot pending

An annotated capture of a running react phase alongside the temperature trend will be added here.

Parameters

Parameter Type Unit Range Default Required
jacketOutput REAL % 0-100 — yes
agitatorSpeed REAL % 0-100 — yes
duration TIME — 30s-1h — yes
maxTemp REAL degC 0-200 120 no

TIME parameters take duration strings ("45s", "1m30s", "5m"), not bare numbers.

Required control modules

Role Module type Description
jacket_controller analog-control Jacket heating/cooling control
agitator analog-control Reactor agitator

Capability: reaction.

How it works

A linear timed phase. Each scan the SFC engine:

  1. Activates start_reaction. The action ST writes jacketOutput to jacket_controller.CMD and agitatorSpeed to agitator.CMD.
  2. Holds on start_reaction until start_reaction.T >= duration.
  3. Advances to cool_down, which writes 0 to jacket_controller.CMD. The agitator is intentionally left running so operators can stop it explicitly in a later phase.

In parallel, two interlock transitions (marked interlock: true, priority: -1 so they evaluate before the normal flow) guard both start_reaction and cool_down. If the jacket temperature (READ('jacket_controller.PV')) exceeds maxTemp, the SFC jumps to safe_hold, which kills the heater and agitator and drops the phase to a held state for operator intervention. This is a BPCS-level protection layer. It is not an SIS function. See Alarms and Interlocks for the distinction and how it factors into protection-layer (PHA/LOPA) analysis.

This is a timed phase. The timer cannot detect a failed jacket or a stuck agitator. Pair this phase with deviation alarms on the jacket temperature (critical, since a silent heater failure wastes the hold) and the agitator, plus a timeoutSeconds backstop on the phase call. See Phases § Timed phase.

Used in recipes

Try it

  1. HMI endpoint → Batch Execution → + New
  2. Choose sim-reactor-heat-m1 and create the batch
  3. Click Start and wait for the procedural tree to reach the react step
  4. Expand the phase detail to see start_reaction active and the step-elapsed timer counting up
  5. Open Data endpoint → Trends and chart reactor temperature, jacket_controller.CMD, jacket_controller.POS, agitator.CMD, and agitator.POS on one view to see the ramp, hold, and shutoff