plc timers

ladder logic

ton timer

Cascading PLC Timers: Chain TON Logic Right

‌
Flat vector diagram of three cascading PLC TON timers in ladder logic where each timer done bit triggers the next step in a timed sequence

You need a three-step chemical rinse: pre-rinse for 10 seconds, soak for 30 seconds, final rinse for 15 seconds. Each step only starts after the previous one finishes. This is one of the most common timed-sequence problems in industrial automation, and cascading PLC timers is the cleanest way to solve it in ladder logic.

What Are Cascading PLC Timers?

Cascading PLC timers means using the done bit of one TON timer as the enable condition for the next TON timer in the sequence. When Timer 1 finishes, its DN (or Q) bit goes TRUE and enables Timer 2. When Timer 2 finishes, its DN bit enables Timer 3. Each stage runs for exactly its preset time, back to back, driven entirely by the timer outputs themselves. No extra state machine, no integer step counter, just timer bits feeding timer rungs.

Why Cascade Timers Instead of Using One Long Timer?

The obvious alternative is one big TON set to the total time, with comparison instructions checking the accumulated value to decide which output to energise. That works, but it has real downsides. You can't adjust individual step times without recalculating offsets. Adding a step means touching every comparison value. And when you're staring at it at midnight during a commissioning, a chain of named timers (PreRinse_Timer, Soak_Timer, FinalRinse_Timer) is a lot easier to follow than GRT(Cycle_Timer.ACC, 10000) scattered across rungs.

Cascaded timers also pair naturally with the PLC counter instructions you might already have tracking batch cycles, and they fit cleanly into the same rung structure you learned when studying TON, TOF and TONR differences.

The Basic Cascade Pattern: Three Rungs, Three Timers

Here is the skeleton of a three-step cascade in Studio 5000 notation. Timer presets are in milliseconds.

RungEnable ConditionTimer TagPreset (ms)Output Coil
1Seq_Start XIO(Seq_Fault)PreRinse_Timer10000PreRinse_Sol
2PreRinse_Timer.DNSoak_Timer30000Soak_Sol
3Soak_Timer.DNFinalRinse_Timer15000FinalRinse_Sol
4FinalRinse_Timer.DN(none)(none)Seq_Complete
Three-step cascade: each timer's DN bit enables the next rung

Rung 1 starts the moment Seq_Start goes TRUE (and no fault is active). Rung 2 is not enabled until PreRinse_Timer.DN fires. Rung 3 waits for Soak_Timer.DN. The output coil on each rung gives you the physical signal to drive your solenoid valve or contactor for that step.

Tag your timers with the step name, not a number. PreRinse_Timer tells you everything; Timer3 tells you nothing at 2 a.m. when the machine is faulted.

Cascading PLC Timers: Interactive Ladder Example

3-Step Wash Sequence: Cascaded TON Timers (Studio 5000). Ladder logic (10 rungs): Rung 0: examine if Wash_Start is on (XIC), then examine if Wash_FaultLatch is off (XIO), then examine if FinalRinse_Timer.DN is off (XIO), then TON on PreRinse_Timer. Rung 1: examine if PreRinse_Timer.DN is on (XIC), then examine if Wash_FaultLatch is off (XIO), then TON on Soak_Timer. Rung 2: examine if Soak_Timer.DN is on (XIC), then examine if Wash_FaultLatch is off (XIO), then TON on FinalRinse_Timer. Rung 3: examine if PreRinse_Timer.DN is on (XIC), then examine if Soak_Timer.DN is off (XIO), then energize output PreRinse_Sol (OTE). Rung 4: examine if Soak_Timer.DN is on (XIC), then examine if FinalRinse_Timer.DN is off (XIO), then energize output Soak_Sol (OTE). Rung 5: examine if FinalRinse_Timer.DN is on (XIC), then energize output FinalRinse_Sol (OTE). Rung 6: examine if FinalRinse_Timer.DN is on (XIC), then examine if Seq_Done_OS is on (XIC), then CTU on Wash_Cycle_Count. Rung 7: examine if Wash_Start is on (XIC), then TON on Wash_Timeout. Rung 8: examine if Wash_Timeout.DN is on (XIC), then examine if FinalRinse_Timer.DN is off (XIO), then examine if Timeout_OS is on (XIC), then latch output Wash_FaultLatch (OTL). Rung 9: examine if Wash_FaultLatch is on (XIC), then examine if HMI_FaultAck is on (XIC), then examine if Wash_Start is off (XIO), then unlatch output Wash_FaultLatch (OTU). Rungs 1-3 chain three TON timers. Each solenoid output (rungs 4-6) is ON only during its own step: PreRinse_Sol is ON from Timer1.DN to Timer2.DN, keeping it clean. Rung 7 increments a cycle counter on the rising edge of sequence completion. Rungs 8-10 add a 70-second overall timeout fault latch as a safety net in case any timer hangs.

3-Step Wash Sequence: Cascaded TON Timers (Studio 5000)Ladder logic
Toggle inputs
Rung 0
Ladder logic rung: examine if Wash_Start is on (XIC), then examine if Wash_FaultLatch is off (XIO), then examine if FinalRinse_Timer.DN is off (XIO), then TON on PreRinse_Timer examine if Wash_Start is on (XIC), then examine if Wash_FaultLatch is off (XIO), then examine if FinalRinse_Timer.DN is off (XIO), then TON on PreRinse_Timer XIC Wash_Start Wash_Start Wash_Start XIO Wash_FaultLatch Wash_FaultLatch Wash_FaultLatch XIO FinalRinse_Timer.DN FinalRinse_Timer.DN FinalRinse_Timer.DN TON PreRinse_Timer 10000 0 TONTimerPreRinse_TimerPreRinse_TimerPreset1000010000Accum00
Rung 1
Ladder logic rung: examine if PreRinse_Timer.DN is on (XIC), then examine if Wash_FaultLatch is off (XIO), then TON on Soak_Timer examine if PreRinse_Timer.DN is on (XIC), then examine if Wash_FaultLatch is off (XIO), then TON on Soak_Timer XIC PreRinse_Timer.DN PreRinse_Timer.DN PreRinse_Timer.DN XIO Wash_FaultLatch Wash_FaultLatch Wash_FaultLatch TON Soak_Timer 30000 0 TONTimerSoak_TimerSoak_TimerPreset3000030000Accum00
Rung 2
Ladder logic rung: examine if Soak_Timer.DN is on (XIC), then examine if Wash_FaultLatch is off (XIO), then TON on FinalRinse_Timer examine if Soak_Timer.DN is on (XIC), then examine if Wash_FaultLatch is off (XIO), then TON on FinalRinse_Timer XIC Soak_Timer.DN Soak_Timer.DN Soak_Timer.DN XIO Wash_FaultLatch Wash_FaultLatch Wash_FaultLatch TON FinalRinse_Timer 15000 0 TONTimerFinalRinse_TimerFinalRinse_TimerPreset1500015000Accum00
Rung 3
Ladder logic rung: examine if PreRinse_Timer.DN is on (XIC), then examine if Soak_Timer.DN is off (XIO), then energize output PreRinse_Sol (OTE) examine if PreRinse_Timer.DN is on (XIC), then examine if Soak_Timer.DN is off (XIO), then energize output PreRinse_Sol (OTE) XIC PreRinse_Timer.DN PreRinse_Timer.DN PreRinse_Timer.DN XIO Soak_Timer.DN Soak_Timer.DN Soak_Timer.DN OTE PreRinse_Sol PreRinse_Sol PreRinse_Sol
Rung 4
Ladder logic rung: examine if Soak_Timer.DN is on (XIC), then examine if FinalRinse_Timer.DN is off (XIO), then energize output Soak_Sol (OTE) examine if Soak_Timer.DN is on (XIC), then examine if FinalRinse_Timer.DN is off (XIO), then energize output Soak_Sol (OTE) XIC Soak_Timer.DN Soak_Timer.DN Soak_Timer.DN XIO FinalRinse_Timer.DN FinalRinse_Timer.DN FinalRinse_Timer.DN OTE Soak_Sol Soak_Sol Soak_Sol
Rung 5
Ladder logic rung: examine if FinalRinse_Timer.DN is on (XIC), then energize output FinalRinse_Sol (OTE) examine if FinalRinse_Timer.DN is on (XIC), then energize output FinalRinse_Sol (OTE) XIC FinalRinse_Timer.DN FinalRinse_Timer.DN FinalRinse_Timer.DN OTE FinalRinse_Sol FinalRinse_Sol FinalRinse_Sol
Rung 6
Ladder logic rung: examine if FinalRinse_Timer.DN is on (XIC), then examine if Seq_Done_OS is on (XIC), then CTU on Wash_Cycle_Count examine if FinalRinse_Timer.DN is on (XIC), then examine if Seq_Done_OS is on (XIC), then CTU on Wash_Cycle_Count XIC FinalRinse_Timer.DN FinalRinse_Timer.DN FinalRinse_Timer.DN OSR Seq_Done_OS Seq_Done_OS Seq_Done_OS OSR CTU Wash_Cycle_Count 9999 0 CTUCounterWash_Cycle_CountWash_Cycle_CountPreset99999999Accum00
Rung 7
Ladder logic rung: examine if Wash_Start is on (XIC), then TON on Wash_Timeout examine if Wash_Start is on (XIC), then TON on Wash_Timeout XIC Wash_Start Wash_Start Wash_Start TON Wash_Timeout T#70s 0 TONTimerWash_TimeoutWash_TimeoutPresetT#70sT#70sAccum00
Rung 8
Ladder logic rung: examine if Wash_Timeout.DN is on (XIC), then examine if FinalRinse_Timer.DN is off (XIO), then examine if Timeout_OS is on (XIC), then latch output Wash_FaultLatch (OTL) examine if Wash_Timeout.DN is on (XIC), then examine if FinalRinse_Timer.DN is off (XIO), then examine if Timeout_OS is on (XIC), then latch output Wash_FaultLatch (OTL) XIC Wash_Timeout.DN Wash_Timeout.DN Wash_Timeout.DN XIO FinalRinse_Timer.DN FinalRinse_Timer.DN FinalRinse_Timer.DN OSR Timeout_OS Timeout_OS Timeout_OS OSR OTL Wash_FaultLatch Wash_FaultLatch Wash_FaultLatch L
Rung 9
Ladder logic rung: examine if Wash_FaultLatch is on (XIC), then examine if HMI_FaultAck is on (XIC), then examine if Wash_Start is off (XIO), then unlatch output Wash_FaultLatch (OTU) examine if Wash_FaultLatch is on (XIC), then examine if HMI_FaultAck is on (XIC), then examine if Wash_Start is off (XIO), then unlatch output Wash_FaultLatch (OTU) XIC Wash_FaultLatch Wash_FaultLatch Wash_FaultLatch XIC HMI_FaultAck HMI_FaultAck HMI_FaultAck XIO Wash_Start Wash_Start Wash_Start OTU Wash_FaultLatch Wash_FaultLatch Wash_FaultLatch U
energizedTip: click a contact in the diagram to flip its bit.
Rungs 1-3 chain three TON timers. Each solenoid output (rungs 4-6) is ON only during its own step: PreRinse_Sol is ON from Timer1.DN to Timer2.DN, keeping it clean. Rung 7 increments a cycle counter on the rising edge of sequence completion. Rungs 8-10 add a 70-second overall timeout fault latch as a safety net in case any timer hangs.

The Output Overlap Trick Most Guides Skip

Notice rungs 4 to 6 in the example above. Instead of using each timer's own enable condition to drive the solenoid, the outputs use XIC(ThisTimer.DN) XIO(NextTimer.DN). That means PreRinse_Sol turns ON the moment PreRinse_Timer.DN fires and turns OFF the moment Soak_Timer.DN fires. You get a clean, exactly-bounded pulse for each step with no overlap and no gap.

If you just use XIC(Wash_Start) for PreRinse_Sol, the solenoid stays energised through all three steps because Wash_Start never drops. I've seen that exact mistake on a bottle-washing cell where the pre-rinse valve was staying open through the chemical soak, diluting the detergent. The machine ran for two weeks before anyone noticed the wash quality dropping.

Resetting the Sequence: What You Need to Know

Non-retentive TON timers in Logix reset automatically when their enable rung goes FALSE. So when Wash_Start drops out (operator presses Stop, or an E-stop fires), all three timers reset immediately. You don't need explicit RES instructions for a normal stop.

But there's a catch. Notice the XIO(FinalRinse_Timer.DN) contact on rung 1 in the example. Without it, once FinalRinse_Timer.DN is TRUE, the enable rung for PreRinse_Timer stays TRUE (assuming Wash_Start is still asserted), and the whole sequence immediately re-triggers. That extra XIO contact breaks the re-trigger loop and forces the operator to release and re-assert Wash_Start to run another cycle. This is the most common bug I see in student and junior-engineer cascade implementations.

Always block the first timer's enable with XIO(LastTimer.DN) or a latch bit. Without it, the sequence will auto-repeat continuously as long as the start condition stays TRUE.

Adding a Sequence Timeout Fault

Rungs 8 to 10 in the example add a 70-second overall watchdog timer. The total of the three steps is 55 seconds, so 70 seconds gives a comfortable margin. If the sequence hasn't completed by then (because a valve is stuck open or a sensor lied), the timeout fires a fault latch and shuts everything down. This is the same pattern described in the PLC timer ladder logic examples article, and it's non-negotiable on any sequence that controls fluids or heat.

For the fault latch itself, the OTL/OTU pattern keeps the alarm visible even after the start condition drops. If you're not familiar with latching coils, the OTL and OTU latch coil guide covers the mechanics in detail.

How the Scan Cycle Affects Cascade Timing

Each timer's DN bit goes TRUE during the scan in which the accumulated value first reaches the preset. The next timer's enable rung sees that TRUE bit one full scan later. On a typical 10 ms scan cycle this is invisible. On a slow scan (50 ms or more), you'll see a one-scan gap between steps. For most wash and soak applications this is fine. For tight electromechanical sequences, consider moving the cascade to a faster task or tightening your scan time. The PLC scan cycle troubleshooting article has the details if you're chasing timing errors.

Siemens TIA Portal: The Same Logic, Different Syntax

The cascade principle is identical in TIA Portal. You use IEC TON function blocks with instance data blocks. Timer 1's Q output connects to the IN pin of Timer 2, and so on. The tag names follow the pattern PreRinse_Timer.Q instead of PreRinse_Timer.DN. If you are working on an S7-1200, the S7-1200 timers guide walks through the instance DB naming and the subtle difference in how TIA Portal IEC timers handle the PT (preset time) input.

When to Stop Cascading and Use a Sequencer Instead

Cascaded timers are clean up to about four or five steps. Beyond that, the rung count grows fast and adding or reordering steps becomes error-prone. If you have more than five timed steps, different step times for different product recipes, or steps that can be skipped based on a sensor, you want a proper step sequencer: an integer step counter, an array of preset times, and a CTU advancing the step on each DN bit. You can see that pattern in the array-indexed sequencer already published in the 3-motor start sequence exercise.

For applications that do need recipe-based timing, you might also look at how the PLC bottle filling machine project handles variable fill times alongside timed sequences. The underlying cascade structure is the same, but recipe values replace hard-coded presets.

Common Mistakes Summary

  • Forgetting XIO(LastTimer.DN) on the first rung, causing infinite auto-repeat.
  • Driving solenoid outputs from the start condition instead of the timer window (XIC(ThisDN) XIO(NextDN)), causing overlapping valve opens.
  • No overall timeout watchdog. A stuck valve or wiring fault leaves the sequence running indefinitely.
  • Using TONR (retentive) timers in a cascade without explicit RES instructions. The accumulated value survives a power cycle and the sequence jumps ahead on restart.
  • Chaining more than five steps without switching to a step counter, making the program nearly unreadable in six months.
  • Not testing what happens when the start condition drops mid-sequence. The auto-reset behaviour of TON is your friend here, but only if you understand it.

If you are ever debugging a cascade that behaves unexpectedly, the PLC troubleshooting with online monitoring article shows exactly how to watch timer accumulated values update in real time without stopping the program. And if you want to test a cascade before wiring up real hardware, simulating ladder logic without a PLC gives you options for every major platform.


Keep Learning

Once you are comfortable cascading TON timers, the natural next step is understanding how retentive and non-retentive timers differ so you know when TONR changes your reset strategy. You might also want to study the TON vs TOF vs TP comparison to see how a TOF cascade works for controlled shutdown sequences. For bigger multi-step projects that go beyond pure timer logic, the PLC pump station exercise and the car wash PLC exercise both use timed sequences you can adapt directly.

Related Blogs

Flat vector diagram of three PLC timer ladder rungs labeled TON, TOF and TP each with a timing waveform showing input and output signal behavior
plc timersladder logicton tof tp

PLC Timer Ladder Logic: 5 Practical Examples

Five practical PLC timer ladder logic examples covering TON, TOF and TP instructions, with timing diagrams, gotchas and field-tested advice for Rockwell and generic platforms.

8 min read

TON TOF TONR PLC timer comparison diagram showing input and output timing waveforms
timersladder logicplc programming

TON, TOF and TONR Timers: What Actually Differs

TON, TOF and TONR timers behave very differently under power loss and input cycling. Here's exactly how each one works, with real ladder examples and common gotchas.

7 min read

Flat vector infographic comparing TON on-delay, TOF off-delay and TP pulse PLC timer waveforms side by side with labeled input and output signal bars
plc timersladder logiciec 61131-3

TON vs TOF vs TP: PLC Timer Comparison

TON, TOF and TP are the three IEC 61131-3 standard timer types. Learn exactly how each one behaves, where each one fails you, and which to pick for your application.

8 min read

Flat vector timing diagram comparing a TON timer that resets on false rung with a retentive TONR timer that holds its accumulated value across multiple enable pulses
retentive timerplc timersladder logic

Retentive Timer in PLC Ladder Logic Explained

A retentive timer keeps its accumulated value when power is lost or the rung goes false. Learn how TONR works, when to use it, and see real ladder examples.

9 min read

Side-by-side timing diagram comparing a retentive PLC timer that holds its accumulated value versus a non-retentive timer that resets to zero when the enable signal drops
plc timersretentive timerladder logic

Retentive vs Non-Retentive PLC Timers: Key Differences

Retentive and non-retentive PLC timers behave completely differently when the enable bit drops. Learn which to use, how each resets, and see real ladder examples across platforms.

8 min read

CTU CTD and CTUD PLC counter instructions diagram showing preset and accumulated count values
countersladder logicplc programming

PLC Counter Instructions: CTU, CTD and CTUD Explained

CTU, CTD and CTUD counters explained with real preset values, accumulated counts, reset behaviour, and vendor-specific differences you need to know.

9 min read

Flat vector diagram of S7-1200 TON TOF and TONR IEC timer function blocks connected to a PLC CPU icon
siemens s7-1200tia portalplc timers

S7-1200 Timers in TIA Portal: TON, TOF and TONR

Learn how TON, TOF and TONR timers work on the S7-1200 in TIA Portal, including IEC timer data types, instance DBs, preset syntax and real wiring gotchas.

9 min read