How to Read Ladder Logic: Diagrams, Contacts & Timers

Ladder logic reads like a simple electrical circuit diagram turned on its side. Two vertical lines (called rails) represent power on the left and ground on the right, and horizontal lines (called rungs) stretch between them. Each rung defines one operation: a set of input conditions on the left that, when satisfied, activate an output on the right. You read each rung left to right, and you read the overall program top to bottom. Once you understand that basic flow, everything else builds on it.

The Structure of a Ladder Diagram

Picture an actual ladder lying on its side. The two vertical side rails are your power rails. The left rail is the power source, and the right rail is the ground or return path. Every rung connecting those two rails represents a single logic operation or control decision.

On each rung, input conditions sit on the left side and outputs sit on the right. The PLC evaluates whether the input conditions create a continuous path from the left rail to the right rail. If they do, the output on that rung turns on. If the path is broken anywhere, the output stays off. This mirrors how a real electrical circuit works: current flows from power through switches to a load and back to ground. That’s why ladder logic was originally designed this way, so electricians could read PLC programs without learning a new language.

The Three Instructions You’ll See Most

Almost every rung uses some combination of three basic instructions. They look like small symbols placed along the rung, and each one checks or controls a single bit (a single on/off point in the PLC’s memory).

  • Examine If Closed (XIC): Drawn as two short vertical lines with a gap between them, like an open contact symbol. This instruction asks, “Is this input ON?” If the bit it references is 1 (true), the instruction passes power through. If the bit is 0 (false), it blocks the path. Think of it as a normally open switch that closes when its signal is active.
  • Examine If Open (XIO): Drawn the same way but with a diagonal slash through it. This one works in reverse: it passes power when the bit is 0 (off) and blocks when the bit is 1 (on). It behaves like a normally closed switch that opens when its signal activates. Beginners often mix up XIC and XIO, so pay attention to that slash mark.
  • Output Energize (OTE): Drawn as two parentheses ( ) at the right end of a rung. When every condition to its left creates an unbroken path, the OTE turns on. When any condition in the path breaks, it turns off. This is your basic output, controlling things like motors, valves, or indicator lights.

How Series and Parallel Contacts Work

The arrangement of contacts on a rung determines the logic. This is where ladder logic maps directly to Boolean logic, and it’s intuitive once you see the pattern.

When two contacts are placed in series (one after the other on the same path), both must be true for power to reach the output. This is an AND condition. A motor might require both a start button AND a safety guard to be closed before it runs.

When two contacts are placed in parallel (on separate paths that reconnect before the output), either one being true will complete the circuit. This is an OR condition. A conveyor might be triggered by a sensor on line A OR a sensor on line B.

A normally closed contact (XIO) acts as a NOT. If you place an XIO referencing an alarm signal in series with your output, the output will stay on only as long as that alarm is NOT active. You can combine series, parallel, and normally closed contacts to build any logic you need. When you encounter a complicated rung, break it down: trace each possible path from left rail to right rail and ask what combination of conditions would complete that path.

How the PLC Reads the Program

A PLC doesn’t execute all rungs simultaneously. It runs through the entire program in a repeating cycle called the scan cycle. First, it reads all physical inputs and stores their states in an input image table (a snapshot of what’s on and off). Then it evaluates the ladder logic, rung by rung, from top to bottom. Within each rung, it evaluates left to right. Finally, it writes all the output results to the physical outputs at once.

This matters when you’re reading a program because the order of rungs can affect behavior. If rung 5 turns on an internal bit and rung 10 checks that same bit, the result from rung 5 is already available by the time rung 10 executes within the same scan. But if rung 10 sets a bit that rung 5 checks, rung 5 won’t see the updated value until the next scan cycle. When tracing logic that doesn’t behave as expected, check whether rung order is causing a one-scan delay.

Timers and Counters

After basic contacts and outputs, timers and counters are the most common instructions you’ll encounter. They each have two key values: a preset (the target) and an accumulated value (the current count or elapsed time).

On-Delay Timer (TON)

An on-delay timer starts counting up when its rung conditions go true. Once the accumulated value reaches the preset, the timer’s “done” bit turns on. If the rung goes false before the timer finishes, the accumulated value resets to zero. You’ll see TON timers used for things like waiting 10 seconds after a sensor triggers before starting a motor, filtering out brief signal glitches, or sequencing operations with specific delays between steps.

A TON timer has three status bits worth knowing. The enable bit is on whenever the rung feeding the timer is true. The timing bit is on only while the timer is actively counting (enabled but not yet done). The done bit turns on when accumulated time reaches the preset and stays on as long as the rung remains true. When reading a program, you’ll often see other rungs reference these status bits to trigger downstream actions.

Off-Delay Timer (TOF)

An off-delay timer works in the opposite direction. Its done bit is on while the rung is true. When the rung goes false, the timer starts counting, and the done bit stays on until the accumulated value reaches the preset. This is used for things like keeping a cooling fan running for 30 seconds after a machine shuts down.

Count-Up Counter (CTU)

A counter increments its accumulated value by one each time its rung transitions from false to true (each rising edge). When the accumulated value reaches the preset, the done bit turns on. Unlike timers, counters retain their accumulated value and done status even after the rung goes false. They only reset when a separate reset instruction clears them. If you’re reading a program and see a counter that seems stuck, look for the corresponding reset instruction, because a missing or misplaced reset is one of the most common programming errors.

The Seal-In Circuit Pattern

One of the most important patterns to recognize is the seal-in (or latching) circuit, used in nearly every motor control application. Here’s the scenario: an operator presses a momentary start button, and the motor needs to keep running after the button is released.

The rung uses a start button contact in parallel with an auxiliary contact from the motor’s own output. A stop button contact sits in series with both. When the operator presses start, the output energizes. The motor’s auxiliary contact, now closed, creates an alternate path around the start button. So when the operator releases the start button, the output keeps itself energized through its own contact. This is why it’s called a “seal-in”: the output seals itself on. Pressing the stop button breaks the series path, de-energizing the output and opening the seal-in contact, which returns everything to the off state.

Once you can spot this pattern, you’ll recognize it everywhere. It’s the foundation of most start/stop control logic, and variations of it appear in alarm acknowledgment circuits, mode selection, and batch sequencing.

Data-Handling and Comparison Instructions

Not every rung deals with simple on/off logic. You’ll also encounter instruction blocks that handle numbers. These appear as rectangular boxes on the rung, usually with a name, a source, and a destination labeled inside.

A Move (MOV) instruction copies a value from one memory location to another when its rung conditions are true. You might see it used to load a new speed setpoint into a motor drive or transfer a recipe value into a timer’s preset. Comparison instructions like Greater Than, Less Than, and Equal check whether one value meets a condition relative to another. If the comparison is true, the instruction passes continuity to the rest of the rung, just like a closed contact would. Math instructions (Add, Subtract, Multiply, Divide) perform calculations and store the result in a destination address. When reading these, focus on what data is being moved or compared and what output depends on the result.

Tips for Reading Unfamiliar Programs

Start with the outputs. Find the device you care about (a motor, a valve, a light) and identify which rung controls its output. Then work backward through the conditions on that rung. Each input address will have a tag name or comment telling you what physical device or condition it represents. If the program is well-documented, rung comments will describe the overall purpose of each section.

If you’re troubleshooting online (connected to a live PLC), most programming software highlights energized paths in green. This lets you visually trace where power flow stops on a rung and identify exactly which condition is preventing an output from turning on. Look for the first contact in the chain that isn’t highlighted, and that’s your culprit.

A few common traps to watch for when reading programs:

  • Latch without unlatch: If an output uses a latch instruction (OTL) but has no corresponding unlatch (OTU) elsewhere in the program, it will stay on indefinitely once triggered. Always search for the matching pair.
  • Overcomplicated rungs: Rungs with deeply nested branches and dozens of conditions are hard to follow. Break them down path by path. Trace each parallel branch independently, then combine the results.
  • Missing documentation: Undocumented programs are significantly harder to read. If you’re responsible for maintaining a program, add comments to every rung and label every address. Your future self will thank you.
  • Timer and counter resets: When a timer or counter behaves unexpectedly, check whether it’s being reset at the right point in the process. A counter that never resets will hit its preset on the first cycle and stay done forever.

Ladder logic follows the IEC 61131-3 international standard, which defines the syntax and symbols across PLC platforms. While different manufacturers (Allen-Bradley, Siemens, Mitsubishi) have minor differences in naming and appearance, the core concepts, symbols, and reading techniques covered here apply universally. Once you can read ladder logic from one platform, adapting to another is mostly a matter of learning new label conventions rather than new logic.