Cycle-time bottleneck
A step in a sequence that takes longer than it should, delaying the whole cycle. Bottlenecks often hide in timers (TON/TOF) or wait loops that nobody has revisited since commissioning.
Found 3 bottlenecks: → TON T47 1,200ms Station 4 → TON T12 840ms Conveyor Exit → WAIT loop 300ms PackML Init Longest delay at Station 4. Review T47 first.
Dead code
Logic that is disabled, bypassed, or unreachable — a rung whose condition can never be true, a function block nobody calls anymore, a flag that's written but never read. It adds risk every time someone tries to modify the program without knowing it's inert.
Found 4 inactive blocks: → FC22 bypassed since 2021 → Rung 47 condition always FALSE → DB14.flag written, never read → CALL FB33 commented block No active references found. Safe to review.
Interlock audit
Safety interlocks — E-stops, guard doors, drop chains — are supposed to have a reset path, a bypass timeout, and confirmed feedback before the line re-energizes. An interlock audit checks each chain for the gaps that don't show up until something goes wrong.
12 interlocks scanned. 2 flagged: → E-stop at Cell 3 no reset confirmation → DB5.bypassActive no timeout guard Recommend adding reset logic and bypass timeout.
Missing handshake
Two stations in a sequence are supposed to confirm to each other before the next step proceeds — a robot signals it has cleared before the conveyor advances. A missing or incomplete handshake means one station can act on stale information from the other.
FINDING 1 — Incomplete Handshake (Conv001 → Rob010): bArmReleased is confirmed but bHeightClear is not — conveyor can advance before arm has fully cleared the pick zone.
Race condition
When two parts of a program — two tasks, two interrupts, two routines — can write to the same tag, whichever one runs last wins, and that order isn't always guaranteed. Race conditions are some of the hardest bugs to reproduce because they depend on scan timing.
1 race condition found: → DB3.runCmd written by OB1 and OB35 OB35 fires on interrupt, may override OB1 Last write wins. Add arbitration or priority logic.
Signal trace
Following one tag or signal through every place it's written and read across a project — useful when you're trying to understand why a value changed, or what depends on it before you touch it.
Tracing Motor1_Enable... Write sites (3): → FC10 Rung 4 set on start command → FC10 Rung 19 cleared on fault → OB86 cleared on CPU restart Read sites: 7 found across 4 function blocks.