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 endpointEquipment LibraryPhases → 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 endpointBatch 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 endpointBatch 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 endpointTrends 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