ScaffIQ Sequence Engine · Ladder Visualization

Example_CIP_Wash_Procedure

Engineer
Example Project
Generated
2026-08-26T20:54:05.400Z
Validation hash
C419AC41
State machines
2
⚠ ENGINEER REVIEW REQUIRED: this is a review aid, not the source of truth. Validate against the generated L5X and the Functional Design Specification before commissioning. No safety-rated logic is shown or implied.
State Machines (2)

Fill and Agitate Operation

CIP Wash Procedure/Fill and Agitate/Fill and Agitate Operation
Idle0
→Cmd=1 & permissive: High Level Trip
Fill Tank1
⚠ trips to Idle: High Level Trip
→LT_CIP301 >= 80
Agitate2
→300 seconds
Idle0
SEQ_Fill_and_Agitate_Operation 16 rungs
ENGINEER REVIEW REQUIRED: This routine was generated by ScaffIQ Sequence Engine. All logic requires review, validation and testing by a qualified Controls Engineer before deployment to a controller.
NOP();
Start Fill and Agitate Operation: arm pending request on Cmd=1 rising edge
EQU
SEQ_Fill_and_Agitate_Operation_Cmd = 1
ONS ↑
SEQ_Fill_and_Agitate_Operation_StartONS
L
SEQ_Fill_and_Agitate_Operation_StartPending
EQU(SEQ_Fill_and_Agitate_Operation_Cmd,1)ONS(SEQ_Fill_and_Agitate_Operation_StartONS)OTL(SEQ_Fill_and_Agitate_Operation_StartPending);
Start Fill and Agitate Operation: idle→phase 1 once pending and permissives are satisfied, consumes the request | Permissives: High Level Trip
EQU
SEQ_Fill_and_Agitate_Operation_State = 0
SEQ_Fill_and_Agitate_Operation_StartPending
LES
LT_CIP301 < 95
MOV
Source: 1
Dest: SEQ_Fill_and_Agitate_Operation_State
U
SEQ_Fill_and_Agitate_Operation_StartPending
MOV
Source: 0
Dest: SEQ_Fill_and_Agitate_Operation_Cmd
EQU(SEQ_Fill_and_Agitate_Operation_State,0)XIC(SEQ_Fill_and_Agitate_Operation_StartPending)LES(LT_CIP301,95)MOV(1,SEQ_Fill_and_Agitate_Operation_State)OTU(SEQ_Fill_and_Agitate_Operation_StartPending)MOV(0,SEQ_Fill_and_Agitate_Operation_Cmd);
Phase 1 (Fill Tank): Open CIP inlet isolation valve [gated by: High Level Trip]
EQU
SEQ_Fill_and_Agitate_Operation_State = 1
INTLK_High_Level_Trip_Active
L
XV_CIP101
Local:2:O.Data.2
EQU(SEQ_Fill_and_Agitate_Operation_State,1)XIO(INTLK_High_Level_Trip_Active)OTL(XV_CIP101);
Phase 1 (Fill Tank): interlock "High Level Trip" (A1), trip → idle
EQU
SEQ_Fill_and_Agitate_Operation_State = 1
GEQ
LT_CIP301 ≥ 95
MOV
Source: 0
Dest: SEQ_Fill_and_Agitate_Operation_State
EQU(SEQ_Fill_and_Agitate_Operation_State,1)GEQ(LT_CIP301,95)MOV(0,SEQ_Fill_and_Agitate_Operation_State);
Phase 1 (Fill Tank) transition: LT_CIP301 >= 80 → phase 2
EQU
SEQ_Fill_and_Agitate_Operation_State = 1
GEQ
LT_CIP301 ≥ 80
MOV
Source: 2
Dest: SEQ_Fill_and_Agitate_Operation_State
EQU(SEQ_Fill_and_Agitate_Operation_State,1)GEQ(LT_CIP301,80)MOV(2,SEQ_Fill_and_Agitate_Operation_State);
Phase 2 (Agitate): Start CIP tank agitator motor
EQU
SEQ_Fill_and_Agitate_Operation_State = 2
L
MT_AGT301
Local:2:O.Data.1
EQU(SEQ_Fill_and_Agitate_Operation_State,2)OTL(MT_AGT301);
Phase 2 (Agitate): timer 5.0min (preset=300000ms)
EQU
SEQ_Fill_and_Agitate_Operation_State = 2
TON
SEQ_Fill_and_Agitate_Operation_T2
Preset: 300000 ms
EQU(SEQ_Fill_and_Agitate_Operation_State,2)TON(SEQ_Fill_and_Agitate_Operation_T2,300000,0);
Phase 2 (Agitate) transition: timer done → idle (sequence complete)
EQU
SEQ_Fill_and_Agitate_Operation_State = 2
SEQ_Fill_and_Agitate_Operation_T2.DN
MOV
Source: 0
Dest: SEQ_Fill_and_Agitate_Operation_State
EQU(SEQ_Fill_and_Agitate_Operation_State,2)XIC(SEQ_Fill_and_Agitate_Operation_T2.DN)MOV(0,SEQ_Fill_and_Agitate_Operation_State);
Stop Fill and Agitate Operation: command=2, any state → idle, self-clears Cmd, cancels a pending start request
EQU
SEQ_Fill_and_Agitate_Operation_Cmd = 2
MOV
Source: 0
Dest: SEQ_Fill_and_Agitate_Operation_State
MOV
Source: 0
Dest: SEQ_Fill_and_Agitate_Operation_Cmd
U
SEQ_Fill_and_Agitate_Operation_StartPending
EQU(SEQ_Fill_and_Agitate_Operation_Cmd,2)MOV(0,SEQ_Fill_and_Agitate_Operation_State)MOV(0,SEQ_Fill_and_Agitate_Operation_Cmd)OTU(SEQ_Fill_and_Agitate_Operation_StartPending);
Fill and Agitate Operation running status
NEQ
SEQ_Fill_and_Agitate_Operation_State ≠ 0
SEQ_Fill_and_Agitate_Operation_Status
NEQ(SEQ_Fill_and_Agitate_Operation_State,0)OTE(SEQ_Fill_and_Agitate_Operation_Status);
Fill and Agitate Operation integrity guard: from state 0, only {0, 1} are legal next values
EQU
SEQ_Fill_and_Agitate_Operation_PrevState = 0
NEQ
SEQ_Fill_and_Agitate_Operation_State ≠ 0
NEQ
SEQ_Fill_and_Agitate_Operation_State ≠ 1
MOV
Source: 0
Dest: SEQ_Fill_and_Agitate_Operation_State
L
SEQ_Fill_and_Agitate_Operation_IntegrityFault
EQU(SEQ_Fill_and_Agitate_Operation_PrevState,0)NEQ(SEQ_Fill_and_Agitate_Operation_State,0)NEQ(SEQ_Fill_and_Agitate_Operation_State,1)MOV(0,SEQ_Fill_and_Agitate_Operation_State)OTL(SEQ_Fill_and_Agitate_Operation_IntegrityFault);
Fill and Agitate Operation integrity guard: from state 1, only {1, 2, 0} are legal next values
EQU
SEQ_Fill_and_Agitate_Operation_PrevState = 1
NEQ
SEQ_Fill_and_Agitate_Operation_State ≠ 1
NEQ
SEQ_Fill_and_Agitate_Operation_State ≠ 2
NEQ
SEQ_Fill_and_Agitate_Operation_State ≠ 0
MOV
Source: 0
Dest: SEQ_Fill_and_Agitate_Operation_State
L
SEQ_Fill_and_Agitate_Operation_IntegrityFault
EQU(SEQ_Fill_and_Agitate_Operation_PrevState,1)NEQ(SEQ_Fill_and_Agitate_Operation_State,1)NEQ(SEQ_Fill_and_Agitate_Operation_State,2)NEQ(SEQ_Fill_and_Agitate_Operation_State,0)MOV(0,SEQ_Fill_and_Agitate_Operation_State)OTL(SEQ_Fill_and_Agitate_Operation_IntegrityFault);
Fill and Agitate Operation integrity guard: from state 2, only {2, 0} are legal next values
EQU
SEQ_Fill_and_Agitate_Operation_PrevState = 2
NEQ
SEQ_Fill_and_Agitate_Operation_State ≠ 2
NEQ
SEQ_Fill_and_Agitate_Operation_State ≠ 0
MOV
Source: 0
Dest: SEQ_Fill_and_Agitate_Operation_State
L
SEQ_Fill_and_Agitate_Operation_IntegrityFault
EQU(SEQ_Fill_and_Agitate_Operation_PrevState,2)NEQ(SEQ_Fill_and_Agitate_Operation_State,2)NEQ(SEQ_Fill_and_Agitate_Operation_State,0)MOV(0,SEQ_Fill_and_Agitate_Operation_State)OTL(SEQ_Fill_and_Agitate_Operation_IntegrityFault);
Fill and Agitate Operation: clear integrity fault on acknowledged reset
SEQ_Fill_and_Agitate_Operation_FaultReset
U
SEQ_Fill_and_Agitate_Operation_IntegrityFault
XIC(SEQ_Fill_and_Agitate_Operation_FaultReset)OTU(SEQ_Fill_and_Agitate_Operation_IntegrityFault);
Fill and Agitate Operation: latch this scan's ending state for next scan's integrity check (must stay the last rung in this routine)
MOV
Source: SEQ_Fill_and_Agitate_Operation_State
Dest: SEQ_Fill_and_Agitate_Operation_PrevState
MOV(SEQ_Fill_and_Agitate_Operation_State,SEQ_Fill_and_Agitate_Operation_PrevState);

Drain and Rinse Operation

CIP Wash Procedure/Drain and Rinse/Drain and Rinse Operation
Idle0
→Cmd=1
Drain Tank1
→TT_CIP301 <= 30
Rinse2
→120 seconds
Idle0
SEQ_Drain_and_Rinse_Operation 15 rungs
ENGINEER REVIEW REQUIRED: This routine was generated by ScaffIQ Sequence Engine. All logic requires review, validation and testing by a qualified Controls Engineer before deployment to a controller.
NOP();
Start Drain and Rinse Operation: arm pending request on Cmd=1 rising edge
EQU
SEQ_Drain_and_Rinse_Operation_Cmd = 1
ONS ↑
SEQ_Drain_and_Rinse_Operation_StartONS
L
SEQ_Drain_and_Rinse_Operation_StartPending
EQU(SEQ_Drain_and_Rinse_Operation_Cmd,1)ONS(SEQ_Drain_and_Rinse_Operation_StartONS)OTL(SEQ_Drain_and_Rinse_Operation_StartPending);
Start Drain and Rinse Operation: idle→phase 1 once pending and permissives are satisfied, consumes the request
EQU
SEQ_Drain_and_Rinse_Operation_State = 0
SEQ_Drain_and_Rinse_Operation_StartPending
MOV
Source: 1
Dest: SEQ_Drain_and_Rinse_Operation_State
U
SEQ_Drain_and_Rinse_Operation_StartPending
MOV
Source: 0
Dest: SEQ_Drain_and_Rinse_Operation_Cmd
EQU(SEQ_Drain_and_Rinse_Operation_State,0)XIC(SEQ_Drain_and_Rinse_Operation_StartPending)MOV(1,SEQ_Drain_and_Rinse_Operation_State)OTU(SEQ_Drain_and_Rinse_Operation_StartPending)MOV(0,SEQ_Drain_and_Rinse_Operation_Cmd);
Phase 1 (Drain Tank): Open CIP drain valve
EQU
SEQ_Drain_and_Rinse_Operation_State = 1
L
XV_CIP102
Local:2:O.Data.3
EQU(SEQ_Drain_and_Rinse_Operation_State,1)OTL(XV_CIP102);
Phase 1 (Drain Tank) transition: TT_CIP301 <= 30 → phase 2
EQU
SEQ_Drain_and_Rinse_Operation_State = 1
LEQ
TT_CIP301 ≤ 30
MOV
Source: 2
Dest: SEQ_Drain_and_Rinse_Operation_State
EQU(SEQ_Drain_and_Rinse_Operation_State,1)LEQ(TT_CIP301,30)MOV(2,SEQ_Drain_and_Rinse_Operation_State);
Phase 2 (Rinse): Open rinse water supply valve
EQU
SEQ_Drain_and_Rinse_Operation_State = 2
L
XV_RNS103
Local:2:O.Data.4
EQU(SEQ_Drain_and_Rinse_Operation_State,2)OTL(XV_RNS103);
Phase 2 (Rinse): timer 2.0min (preset=120000ms)
EQU
SEQ_Drain_and_Rinse_Operation_State = 2
TON
SEQ_Drain_and_Rinse_Operation_T2
Preset: 120000 ms
EQU(SEQ_Drain_and_Rinse_Operation_State,2)TON(SEQ_Drain_and_Rinse_Operation_T2,120000,0);
Phase 2 (Rinse) transition: timer done → idle (sequence complete)
EQU
SEQ_Drain_and_Rinse_Operation_State = 2
SEQ_Drain_and_Rinse_Operation_T2.DN
MOV
Source: 0
Dest: SEQ_Drain_and_Rinse_Operation_State
EQU(SEQ_Drain_and_Rinse_Operation_State,2)XIC(SEQ_Drain_and_Rinse_Operation_T2.DN)MOV(0,SEQ_Drain_and_Rinse_Operation_State);
Stop Drain and Rinse Operation: command=2, any state → idle, self-clears Cmd, cancels a pending start request
EQU
SEQ_Drain_and_Rinse_Operation_Cmd = 2
MOV
Source: 0
Dest: SEQ_Drain_and_Rinse_Operation_State
MOV
Source: 0
Dest: SEQ_Drain_and_Rinse_Operation_Cmd
U
SEQ_Drain_and_Rinse_Operation_StartPending
EQU(SEQ_Drain_and_Rinse_Operation_Cmd,2)MOV(0,SEQ_Drain_and_Rinse_Operation_State)MOV(0,SEQ_Drain_and_Rinse_Operation_Cmd)OTU(SEQ_Drain_and_Rinse_Operation_StartPending);
Drain and Rinse Operation running status
NEQ
SEQ_Drain_and_Rinse_Operation_State ≠ 0
SEQ_Drain_and_Rinse_Operation_Status
NEQ(SEQ_Drain_and_Rinse_Operation_State,0)OTE(SEQ_Drain_and_Rinse_Operation_Status);
Drain and Rinse Operation integrity guard: from state 0, only {0, 1} are legal next values
EQU
SEQ_Drain_and_Rinse_Operation_PrevState = 0
NEQ
SEQ_Drain_and_Rinse_Operation_State ≠ 0
NEQ
SEQ_Drain_and_Rinse_Operation_State ≠ 1
MOV
Source: 0
Dest: SEQ_Drain_and_Rinse_Operation_State
L
SEQ_Drain_and_Rinse_Operation_IntegrityFault
EQU(SEQ_Drain_and_Rinse_Operation_PrevState,0)NEQ(SEQ_Drain_and_Rinse_Operation_State,0)NEQ(SEQ_Drain_and_Rinse_Operation_State,1)MOV(0,SEQ_Drain_and_Rinse_Operation_State)OTL(SEQ_Drain_and_Rinse_Operation_IntegrityFault);
Drain and Rinse Operation integrity guard: from state 1, only {1, 2, 0} are legal next values
EQU
SEQ_Drain_and_Rinse_Operation_PrevState = 1
NEQ
SEQ_Drain_and_Rinse_Operation_State ≠ 1
NEQ
SEQ_Drain_and_Rinse_Operation_State ≠ 2
NEQ
SEQ_Drain_and_Rinse_Operation_State ≠ 0
MOV
Source: 0
Dest: SEQ_Drain_and_Rinse_Operation_State
L
SEQ_Drain_and_Rinse_Operation_IntegrityFault
EQU(SEQ_Drain_and_Rinse_Operation_PrevState,1)NEQ(SEQ_Drain_and_Rinse_Operation_State,1)NEQ(SEQ_Drain_and_Rinse_Operation_State,2)NEQ(SEQ_Drain_and_Rinse_Operation_State,0)MOV(0,SEQ_Drain_and_Rinse_Operation_State)OTL(SEQ_Drain_and_Rinse_Operation_IntegrityFault);
Drain and Rinse Operation integrity guard: from state 2, only {2, 0} are legal next values
EQU
SEQ_Drain_and_Rinse_Operation_PrevState = 2
NEQ
SEQ_Drain_and_Rinse_Operation_State ≠ 2
NEQ
SEQ_Drain_and_Rinse_Operation_State ≠ 0
MOV
Source: 0
Dest: SEQ_Drain_and_Rinse_Operation_State
L
SEQ_Drain_and_Rinse_Operation_IntegrityFault
EQU(SEQ_Drain_and_Rinse_Operation_PrevState,2)NEQ(SEQ_Drain_and_Rinse_Operation_State,2)NEQ(SEQ_Drain_and_Rinse_Operation_State,0)MOV(0,SEQ_Drain_and_Rinse_Operation_State)OTL(SEQ_Drain_and_Rinse_Operation_IntegrityFault);
Drain and Rinse Operation: clear integrity fault on acknowledged reset
SEQ_Drain_and_Rinse_Operation_FaultReset
U
SEQ_Drain_and_Rinse_Operation_IntegrityFault
XIC(SEQ_Drain_and_Rinse_Operation_FaultReset)OTU(SEQ_Drain_and_Rinse_Operation_IntegrityFault);
Drain and Rinse Operation: latch this scan's ending state for next scan's integrity check (must stay the last rung in this routine)
MOV
Source: SEQ_Drain_and_Rinse_Operation_State
Dest: SEQ_Drain_and_Rinse_Operation_PrevState
MOV(SEQ_Drain_and_Rinse_Operation_State,SEQ_Drain_and_Rinse_Operation_PrevState);
Interlocks (1)
A1 High Level Trip Manual reset
LT_CIP301 >= 95 → close XV_CIP101
SEQ_Interlocks routine 4 rungs
ENGINEER REVIEW REQUIRED: This routine was generated by ScaffIQ Sequence Engine. All logic requires review, validation and testing by a qualified Controls Engineer before deployment to a controller.
NOP();
Interlock "High Level Trip" (A1): >= 95 → close XV_CIP101 (manual reset)
GEQ
LT_CIP301 ≥ 95
U
XV_CIP101
Local:2:O.Data.2
GEQ(LT_CIP301,95)OTU(XV_CIP101);
Interlock "High Level Trip": latch tripped state (clears only via INTLK_High_Level_Trip_Reset)
GEQ
LT_CIP301 ≥ 95
L
INTLK_High_Level_Trip_Active
GEQ(LT_CIP301,95)OTL(INTLK_High_Level_Trip_Active);
Interlock "High Level Trip": clear tripped state on acknowledged reset
INTLK_High_Level_Trip_Reset
U
INTLK_High_Level_Trip_Active
XIC(INTLK_High_Level_Trip_Reset)OTU(INTLK_High_Level_Trip_Active);
Alarms (2)
A2 TT_CIP301 HH setpoint 85
CIP tank temperature high high
Action required: Check heater control loop
A3 LT_CIP301 LL setpoint 5
CIP tank level low low
SEQ_Alarms routine 5 rungs
ENGINEER REVIEW REQUIRED: This routine was generated by ScaffIQ Sequence Engine. All logic requires review, validation and testing by a qualified Controls Engineer before deployment to a controller.
NOP();
Alarm TT_CIP301 HH (A2): GEQ(TT_CIP301, 85) "CIP tank temperature high high"
GEQ
TT_CIP301 ≥ 85
L
ALM_TT_CIP301_HH
GEQ(TT_CIP301,85)OTL(ALM_TT_CIP301_HH);
Alarm TT_CIP301 HH: clear ALM_TT_CIP301_HH on acknowledged reset
ALM_TT_CIP301_HH_Ack
U
ALM_TT_CIP301_HH
XIC(ALM_TT_CIP301_HH_Ack)OTU(ALM_TT_CIP301_HH);
Alarm LT_CIP301 LL (A3): LEQ(LT_CIP301, 5) "CIP tank level low low"
LEQ
LT_CIP301 ≤ 5
L
ALM_LT_CIP301_LL
LEQ(LT_CIP301,5)OTL(ALM_LT_CIP301_LL);
Alarm LT_CIP301 LL: clear ALM_LT_CIP301_LL on acknowledged reset
ALM_LT_CIP301_LL_Ack
U
ALM_LT_CIP301_LL
XIC(ALM_LT_CIP301_LL_Ack)OTU(ALM_LT_CIP301_LL);
Dispatch
SEQ_Main routine 5 rungs
ScaffIQ Sequence Engine dispatch routine. Calls all sequence, interlock and alarm subroutines.
NOP();
Execute interlock logic (runs every scan)
JSR
SEQ_Interlocks
JSR(SEQ_Interlocks,0);
Execute sequence: Fill and Agitate Operation
JSR
SEQ_Fill_and_Agitate_Operation
JSR(SEQ_Fill_and_Agitate_Operation,0);
Execute sequence: Drain and Rinse Operation
JSR
SEQ_Drain_and_Rinse_Operation
JSR(SEQ_Drain_and_Rinse_Operation,0);
Execute alarm logic
JSR
SEQ_Alarms
JSR(SEQ_Alarms,0);