PickettPLCv2.7

Ladder logic simulator

🏠
ESP32 I/O
SIMULATOR MODE · plug the ESP32 in by USB, then CONNECT
CONTACTS
─┤ ├─ NO
─┤/├─ NC
─┤↑├─ POS EDGE
─┤↓├─ NEG EDGE
COILS
─( )─ OUTPUT
─(/) NOT COIL
─(S)─ SET
─(R)─ RESET
TIMERS
TON ON DELAY
TOF OFF DELAY
┤T├ TMR DONE
RUNGS
CURSOR
⬡ SELECT
// LADDER PROGRAM — DRAG AN INSTRUCTION ONTO A + · USE “+ OR” FOR PARALLEL BRANCHES
// SIMULATION
CHOOSE ▾
OUTPUT Q0.0 STOPPED
SENSOR I0.2 · NOT TRIGGERED
// I/O MEMORY TABLE

Program a PLC in your browser

Build ladder logic, press RUN and watch a conveyor, tank, traffic light, batch mixer or a virtual ESP32 board respond. The notes under the PLC explain each rung while it runs. Plug in an ESP32 by USB and real buttons and lights follow your program too.

Scan status

Rung by rung

Outputs, memory & timers

Connect a real ESP32

Plug an ESP32 into your computer by USB (an ESP32-C3 SuperMini, a classic ESP32 DevKit or an ESP32-S3) and your ladder program drives real LEDs and relay modules, with real push-buttons as inputs. Upload the free PickettPLC firmware once, then press ⚡ CONNECT in the ESP32 bar. The simulation switches to the ESP32 Board view, and the on-screen PRESS buttons keep working alongside the real ones, so an input you add on screen can switch the board's outputs. No board yet? Pick ESP32 Board in the simulation list to try it virtually. USB needs Chrome or Edge on a computer.

View on GitHub ↗

Ladder logic, step by step

Ten short lessons, from how a PLC scans to why the emergency stop never lives only in the program. Most have a button that loads a working example into the PLC above.

SCANThe scan cycleHow a PLC thinks, over and over

A PLC doesn't react to inputs the instant they change. It runs a loop called the scan:

  1. Read inputs: take a snapshot of every input.
  2. Solve the logic: work through the rungs top to bottom, left to right, using that snapshot.
  3. Write outputs: update the real outputs all at once.

This simulator scans every 100 ms so you can watch it happen. Real PLCs typically scan in 1 to 20 ms. Rung order matters: a rung can use a bit that an earlier rung wrote in the same scan.

-| |-NO and NC contactsAsking "is this bit on or off?"

A contact in ladder logic isn't a physical switch. It's a question about a bit:

  • NO (normally open), -| |-: passes power when the bit is 1. Also called "examine if closed" (XIC).
  • NC (normally closed), -|/|-: passes power when the bit is 0. Also called "examine if open" (XIO).

In this simulator the STOP button is a push-button that reads 1 while pressed, so the program uses an NC contact to break the rung.

How real panels do itOn a real machine the stop button is wired normally closed, so the input is ON while everything is healthy. If the wire breaks, the input goes OFF and the machine stops. The program then uses an NO contact on that input. Same result, but it fails safe.
SEALThe seal-in (latching) circuitKeep a motor running after START is released

A START push-button is only pressed for a moment. To keep the motor running, the output "holds itself in" with a contact in parallel with START:

|--[ START ]--+--[/STOP ]------( MOTOR )--| |--[ MOTOR ]--+ |

Press START and the rung energises. The MOTOR contact closes, so when START is released power still flows through it. Pressing STOP breaks the rung and the seal drops out.

This is the same circuit electricians wire with a contactor's auxiliary contact. The PLC version here uses memory bit M0.0 as the seal.

(S)(R)SET and RESET coilsLatches that remember

A normal coil ( ) follows its rung every scan. A SET coil (S) turns its bit on and leaves it on. A RESET coil (R) turns it off. Some other rung has to undo what SET did.

SET/RESET is ideal for step sequences, where one event starts a step and a different event ends it. Keep the SET and RESET for the same bit easy to find, or the program becomes hard to follow.

This simulator clears all outputs and memory when you press STOP. Real PLCs can keep chosen bits through a power cut: that's called retentive memory.

-|P|-Edge detection (one-shots)Act once per press, not every scan

A positive edge contact -|P|- passes power for exactly one scan, when its bit changes from 0 to 1. A negative edge -|N|- does the same when it changes from 1 to 0.

Use one-shots when something should happen once per event: counting boxes, stepping a sequence, or toggling a light with one button. Without them, holding a button for half a second would count five times at a 100 ms scan.

TONOn-delay and off-delay timersTON, TOF and the done bit
  • TON (on-delay): while its rung is true, the accumulator counts up. When it reaches the preset, the done bit (DN) turns on. If the rung goes false, it resets to zero.
  • TOF (off-delay): DN turns on straight away with the rung, and stays on for the preset time after the rung goes false.

Use a TMR DONE contact -|T|- to use a timer's DN bit in another rung.

Where you'll see themTON: a 3-second start warning before a conveyor moves. TOF: a cooling fan that keeps running for 2 minutes after a drive stops.
I Q MAddresses: I, Q, M and TWhere every bit lives
  • I = inputs (buttons, sensors). I0.2 means input byte 0, bit 2.
  • Q = outputs (contactors, lamps, valves).
  • M = memory bits, also called markers or internal relays. They exist only inside the PLC.
  • T = timers, each with a preset, an accumulator and a done bit.

This byte.bit style is used by Siemens and many others. Allen-Bradley uses tag names or addresses like I:0/2, but the idea is the same.

STEPStep sequencesFill, mix, drain: one step at a time

Machines usually work in steps. A clean way to program that is one memory bit per step, with exactly one step active at a time:

  1. An event (START, a sensor, a timer's DN) RESETs the current step and SETs the next.
  2. Each step bit drives its outputs with normal coils.

This makes faults easy to find: whichever step bit is on tells you exactly where the machine is waiting.

2×( )Never use a coil twiceThe "double coil" trap

If two rungs both drive ( Q0.0 ), most PLCs simply let the last rung win, because it writes last in the scan. The first rung might as well not be there, and the fault is very hard to spot on a live machine.

If several conditions should run the same output, put them in parallel branches on one rung instead, or combine them through memory bits.

E-STOPSafety: the PLC is not the E-stopWhy safety is hardwired

A standard PLC can crash, stall or be programmed wrongly. So an emergency stop must remove the hazard through a hardwired safety circuit: a safety relay or a certified safety PLC dropping out the contactors directly.

The standard PLC is usually given a contact from the safety circuit so it knows the E-stop was pressed and can show a message, but it is never the thing that stops the machine.

To see how hardwired control circuits are built from contacts and relays, try PickettPanel Lite.

Open PickettPanel Lite ↗

Build it yourself

Three small jobs of the kind you'd get on a real machine. Try each one in the editor first. If you get stuck, load a working solution and compare.

JOB 1 · EASY

Stop the conveyor at the sensor

The conveyor should start and stop with its buttons as normal, but also stop by itself when the box reaches sensor I0.2.

JOB 2 · MEDIUM

3-second start warning

After START, wait 3 seconds before the motor runs, so people have time to stand clear. STOP must still work at any time.

JOB 3 · MEDIUM

Add a JOG button

Maintenance want a JOG button (I0.4) that runs the motor only while it's held, alongside the normal START/STOP. Watch out for the double-coil trap.

Check yourself

Six questions. Pick an answer to see the explanation.

Instruction reference

Every instruction in the toolbar, what it looks like, and what it does.

-| |-NO contactPasses power when the bit is 1.
-|/|-NC contactPasses power when the bit is 0.
-|P|-Positive edgePasses for one scan when the bit goes 0 → 1.
-|N|-Negative edgePasses for one scan when the bit goes 1 → 0.
-( )-Output coilBit = 1 while the rung is true, 0 when it isn't.
-(/)-Negated coilBit = 0 while the rung is true, 1 when it isn't.
-(S)-Set coilTurns the bit on and leaves it on.
-(R)-Reset coilTurns the bit off and leaves it off.
[TON]On-delay timerDN turns on after the rung has been true for the preset time.
[TOF]Off-delay timerDN stays on for the preset time after the rung goes false.
-|T|-Timer done contactPasses power when that timer's DN bit is on.
I · Q · M · TAddress typesInputs, outputs, memory bits and timers.

From ladder logic to real wiring

Ladder diagrams started life as relay circuits. PickettPanel Lite lets you build the hardwired version with contacts, coils and pilot lamps, the way it's done in a control panel.

Open PickettPanel Lite ↗

// PICKETTPLC HELP · v2.7

OVERVIEW
INSTRUCTIONS
WORKFLOW
SIMULATIONS
I/O TABLE
ESP32
TIPS
What is PickettPLC?
PickettPLC is a free browser-based Ladder Logic simulator. Build, edit, and run PLC programs visually — no hardware, no install, no account required. Ladder Logic is the standard programming language used in industrial automation to control motors, conveyors, pumps, and machinery worldwide.
Key Concepts
⚡ Rung
A horizontal circuit in the ladder. One logical rule. Power flows left-to-right when all conditions are satisfied. Lights up blue when energized.
─┤ ├─ Contact
A condition check on the left side of the rung. Passes power if the linked I/O bit matches the expected state (ON or OFF).
─( )─ Coil
An output action on the right column. When the rung energizes, the coil writes a bit in memory or drives a physical output.
🔄 Scan Cycle
Every 100 ms the PLC reads all inputs, evaluates every rung top-to-bottom, then writes all outputs. The SCAN light on the CPU strip flashes each cycle.
⬇ Parallel Branches
Multiple branch rows inside one rung are OR'd together — if any branch passes, the rung energizes. Used for seal-in and alternative conditions.
⏱ Timer
TON counts up while the rung is energized. TOF counts after de-energize. Use a TDN contact on a later rung to act on the Done bit.
Quick Start
STEP 1
Drag a tool from the toolbar
›
STEP 2
Drop it on a + slot
›
STEP 3
Pick I/O address
›
STEP 4
Press ▶ RUN
›
STEP 5
Press inputs in I/O table
💡
PickettPLC opens on the Traffic Light Sequencer with its program loaded. Press ▶ RUN, then PRESS I0.0 (Start): the lights cycle red, green, amber on three timers. Press I0.1 (Stop) to halt. For the classic Seal-In Motor Start/Stop, pick Conveyor Belt in the simulation list.
🖱
Drag & Drop — drag instructions straight from the toolbar onto the ladder, and drag anything already placed onto another + slot to move it. Use + OR under a rung for OR logic. On touch screens, tap a tool and then tap a + slot. Scroll down the page for lessons, practice jobs and a quiz.
🧰
Handy controls: the ‹ › arrows slide the toolbar, 🧹 CLEAN SLATE starts from one empty rung, and the ✕ next to the simulation picker hides the simulation (▾ SHOW brings it back). Dark or light: use the theme button at the top.
Contact Instructions — Conditions (Left Side)
─┤  ├─
NO — Normally Open
CONTACT
Passes power when bit = 1 (ON). Most common instruction. Used for start buttons and sensor triggers.
─┤/├─
NC — Normally Closed
CONTACT
Passes power when bit = 0 (OFF). Used for stop buttons, E-stops, and safety interlocks.
─┤↑├─
POS — Positive Edge
CONTACT
Passes power for exactly one scan on the 0→1 transition. Good for one-shot triggers on button press.
─┤↓├─
NEG — Negative Edge
CONTACT
Passes power for exactly one scan on the 1→0 transition. Triggers on button release.
─┤T├─
TDN — Timer Done Contact
CONTACT
Passes power when a timer's .DN bit is set. Place after a TON or TOF to act on completion. Address must match the timer block.
Coil Instructions — Actions (Right Column)
Coils always live in the right column of a rung, separated by a blue border. They are written when the rung is energized. Multiple coils can stack vertically in one rung — all fire together.
─( )─
OUT — Output Coil
OUTPUT
Sets bit to 1 while rung is energized. Cleared to 0 automatically when rung de-energizes. Standard output for motors, lights, solenoids.
─(/)─
NOT — Negated Coil
OUTPUT
Inverse of OUT. Bit is 0 while rung energized, 1 when de-energized. Useful for fail-safe outputs.
─(S)─
SET — Latch Coil
LATCH
Sets bit to 1 on rung energize. Bit stays ON even after rung de-energizes — requires a RST coil to clear it.
─(R)─
RST — Reset (Unlatch)
UNLATCH
Clears bit to 0 on rung energize. Use with a SET coil on a separate rung to build latching (retentive) circuits.
Timer Instructions
TypeNameBehaviour
TONTimer On-DelayCounts up while rung is energized. DN bit goes ON when accumulator reaches preset. Resets to 0 when rung de-energizes.
TOFTimer Off-DelayDN bit stays ON while rung is energized. Starts counting when rung de-energizes; DN bit clears after preset elapses.
TDNTimer Done ContactA contact that reads the .DN bit of a named timer. Place on a separate rung to trigger actions after the timer completes.
⚠
Add a timer with TON or TOF — it sits after the contacts, in series with them. Then use a TDN contact on a separate rung to read its Done bit. The timer address (e.g. T0) must match in both instructions.
✋
Drag and drop: drag any instruction from the toolbar onto a + slot, drop coils and timers on the right-hand column, or drop onto + NEW RUNG. For OR logic, drag a contact onto + OR under a rung to add a parallel branch. On touch screens, tap a tool and then tap the + slot instead.
Adding Instructions to a Rung
Drag an instruction from the toolbar and drop it on any + slot, or click a tool and then click a + slot. A dialog lets you choose the I/O address and an optional label. Contacts go in the left/middle area; coils always go to the right output column, so you can drop them straight onto that column.
Editing & Deleting Elements
ActionHow
Delete elementHover over it — a red ✕ appears in the top corner. Click it.
Delete an OR branchClick the red × at the right-hand end of that branch.
Reorder elementsDrag any contact or coil and drop it onto a + slot. Works within a branch or across rungs.
Select a rungClick the number badge on the left (e.g. 001) or click anywhere in the rung body.
Managing Rungs
ButtonAction
+ ADD RUNGAppends a new empty rung at the bottom of the program. You can also click + NEW RUNG under the last rung, or drop an instruction on it.
✕ DEL RUNGDeletes the currently selected rung.
↑ / ↓ MOVEReorders the selected rung up or down one position.
‹ ›Arrows at the ends of the toolbar slide it to show more tools. A mouse wheel over the toolbar or a swipe on a phone does the same.
🧹 CLEAN SLATEStarts over: one empty rung, an empty I/O table and the simulation hidden. Add your own addresses with + ADD, or type one in the insert dialog and it is added for you.
Rung Layout — Traditional PLC Format
Each rung has three zones: the left power rail, the contact/logic area (where conditions are placed), and the right coil column (where outputs live). This matches the layout of real Allen-Bradley and Siemens PLC programming software. Multiple coils stack vertically in the right column and all fire simultaneously when the rung is energized.
Parallel Branches (OR Logic)
Branch rows stacked in one rung are evaluated as OR logic — the rung energizes if any branch passes. Each extra branch is marked OR. To add one, drag a contact onto + OR under the rung (or click + OR), then add more contacts to that branch in series. Timers on a branched rung sit after the OR block. The conveyor's Seal-In circuit uses this: Branch A is the Start path, Branch B is the Seal path. Both share the same Stop NC contact.
Seal-In (Motor Latch) Circuit
The most common PLC pattern, loaded when you pick Conveyor Belt. Branch A: Start (NO) in series with Stop (NC). Branch B: Seal bit M0.0 (NO) in series with Stop (NC). Both branches drive Q0.0 Motor and M0.0 Seal coils. Pressing Start sets M0.0, which keeps Branch B alive even after Start is released. Pressing Stop breaks both branches.
Memory Bits (M addresses)
PatternHow it works
Seal-inM0.0 NO contact in parallel branch drives M0.0 OUT coil — holds itself ON after trigger is released.
Step sequencerM0.0 → M0.1 → M0.2: each rung fires when the previous M bit is ON, sets the next bit, resets itself.
Interlock / FaultSet M bit on fault condition. Use NC contact of that M bit on any rung that must stop when fault is active.
One-shotPOS edge contact sets an M bit for exactly one scan — use to trigger a timer without re-triggering every cycle.
⚠
OUT coils are cleared each scan then re-written by the coil instruction. SET coils are retentive — they persist until a RST coil explicitly clears them. Use SET/RST when the bit must survive after the trigger condition goes away.
Running & Stopping
Press ▶ RUN to start the scan cycle. The SCAN dot flashes every 100 ms. Toggle inputs in the I/O table using the green PRESS buttons. Press ⏹ STOP to halt — all outputs and memory bits are cleared on stop.
With an ESP32 connected, real buttons act as the inputs and real LEDs or relay modules follow the outputs. See the ESP32 tab in this help for how to connect one.
Choose a Simulation
🏭
Conveyor Belt
Belt moves when Q0.0 is ON. Box sensor I0.2 triggers automatically when a package passes the detection point.
🛢️
Tank Fill / Drain
Pump Q0.0 fills the tank. HIGH level sensor I0.2 fires at 82% fill. Tank drains slowly at all times.
🚦
Traffic Light Sequencer
Drive Q0.0 RED, Q0.1 AMBER, Q0.2 GREEN with chained TON timers. A classic timing sequence exercise.
⚗️
Batch Mixer Process
3-step sequence: Q0.0 FILL until FULL I0.2, Q0.1 MIX for a timed period, then Q0.2 DRAIN until EMPTY I0.3.
💡
I/O LED Panel
All I/O addresses shown as LEDs. Click blue input LEDs to toggle. Green = outputs. Amber = memory bits. Good for testing logic without a visual process.
🔌
ESP32 Board
A virtual ESP32 on a breadboard. Hold the push-buttons to drive I0.x; the LEDs follow Q0.x, labelled with the real GPIO pins. Choose C3 SuperMini, S3 or classic DevKit (it shares the choice with the setup guide). With an ESP32 connected it mirrors the real board.
I/O Mapping
AddressConveyorTank FillLED Panel
Q0.0Motor — runs beltPump — fills tankOutput LED
I0.0Start button (manual)Start button (manual)Input LED (click)
I0.1Stop button (manual)Stop button (manual)Input LED (click)
I0.2Box position sensor (auto)HIGH level sensor (auto)Input LED (click)
Timer Simulations — I/O Mapping
Address🚦 Traffic Light⚗️ Batch Mixer
Q0.0RED lightFILL valve
Q0.1AMBER lightMIXER motor
Q0.2GREEN lightDRAIN valve
I0.2—FULL sensor (auto, fires at 88%)
I0.3—EMPTY sensor (auto, fires at 4%)
💡
Switching to the Traffic Light or Batch Mixer sim auto-adds the extra Q and I addresses to your I/O table, so they're ready to use in the insert dialog right away.
Practice Exercises
ExerciseGoalBest Animation
Motor Start/StopHold Start (I0.0), release — motor stays on via seal. Press Stop (I0.1) to kill it.Conveyor
Level ControlPump ON below 20%, pump OFF above 82%. Hysteresis using two rungs and M bits.Tank
Traffic SequenceRED 5s → GREEN 5s → AMBER 2s → repeat. Chain three TON timers, each TDN resetting the cycle.Traffic Light
Batch SequenceFILL until I0.2 → MIX (TON 5s) → DRAIN until I0.3 → idle. Use SET/RST M bits for each step.Batch Mixer
Timed OutputTrigger a TON timer from I0.0. Use TDN contact to turn ON Q0.1 after 3 seconds.LED Panel
Seal with InterlockMotor runs via seal-in. Add an M bit fault flag — NC contact of it on the motor rung locks it out.Conveyor
SET / RST LatchUse SET coil on one rung (trigger: I0.0) and RST coil on another (trigger: I0.1). Bit stays on between presses.LED Panel
🚦 How to Build the Traffic Light
A simple non-repeating version to start: hold I0.0 to run the sequence.
RungLogic
001I0.0 (NO) → TON T0 (5000ms) and OUT Q0.0 RED. Red is on while timing.
002TDN T0 (NO) → TON T1 (5000ms) and OUT Q0.2 GREEN. Green after red completes.
003TDN T1 (NO) → TON T2 (2000ms) and OUT Q0.1 AMBER. Amber after green completes.
⏱
For a repeating cycle, add a rung where TDN T2 resets the whole sequence using a SET/RST M bit that gates rung 001.
⚗️ How to Build the Batch Mixer
RungLogic
001I0.0 (NO Start) → SET M0.0 (Fill step active)
002M0.0 (NO) + I0.2 (NC, not full) → OUT Q0.0 FILL
003I0.2 (NO, full) → RST M0.0, SET M0.1 (Mix step)
004M0.1 (NO) → TON T0 (5000ms) and OUT Q0.1 MIX
005TDN T0 (NO) → RST M0.1, SET M0.2 (Drain step)
006M0.2 (NO) + I0.3 (NC, not empty) → OUT Q0.2 DRAIN
007I0.3 (NO, empty) → RST M0.2 (cycle complete)
✅
Switch animations any time using the dropdown above the simulation panel — your ladder program keeps running unchanged. The ✕ next to the dropdown hides the simulation to give the I/O table more room; ▾ SHOW brings it back.
Address Types
PrefixTypeDescription
IInputPhysical field devices — push buttons, sensors, limit switches. Toggle manually with PRESS or driven automatically by a simulation.
QOutputPhysical actuators — motors, solenoids, indicator lights. Written by coil instructions in your ladder program.
MMemoryInternal bits with no physical connection. Used for seal bits, step flags, interlocks, and intermediate logic.
Pressing Inputs
Each Input (I) row has a green PRESS button. Hold it down to activate the input — release to deactivate. This simulates a momentary push button. The PLC must be running for the ladder logic to respond.
With an ESP32 connected, on-screen inputs still work alongside the real buttons (see the ESP32 tab). The ✕ next to the simulation picker hides the simulation so the I/O table gets the space.
Adding Custom Addresses
Use the bar at the bottom of the I/O table. Select the type (I / Q / M), type an address like I0.3, add an optional name, then click + ADD. New addresses appear immediately in the instruction insert dialog when you add instructions to rungs. You can also tick Enter address manually in the insert dialog: a new address is added to the table for you.
Removing Addresses
Every row has a ✕, including the starter rows. If the address is used in your ladder, PickettPLC asks first; those instructions then read 0. Picking the conveyor, tank or mixer simulation puts back the sensor it needs. To clear everything at once, use 🧹 CLEAN SLATE in the toolbar.
Address Naming Convention
RangeTypeExample
I0.0 – I0.7Input bitsI0.0 = Start, I0.1 = Stop, I0.2 = Sensor
Q0.0 – Q0.7Output bitsQ0.0 = Motor, Q0.1 = Lamp
M0.0 – M9.7Memory bitsM0.0 = Seal, M0.1 = Fault
T0, T1, T2…Timer addressesT0 = 3 s delay, T1 = 10 s hold
💡
Output (Q) and Memory (M) bits are read-only in the I/O table — they are written entirely by your ladder program coils. Watch their values and status dots update in real time as the scan cycle runs.
Drive Real Hardware
Your ladder program runs in the browser; an ESP32 acts as remote I/O. Real push-buttons become inputs and real LEDs or relay modules follow the outputs. Supported boards: ESP32-C3 SuperMini, classic ESP32 DevKit and ESP32-S3.
STEP 1
Upload the firmware once
›
STEP 2
Plug in, press ⚡ CONNECT
›
STEP 3
BLINK TEST, then ▶ RUN
The step-by-step guide, pin tables and firmware download are in Connect a real ESP32 further down the page (press Open setup). USB needs Chrome or Edge on a computer.
The ESP32 Bar
ControlWhat it does
USB / WI-FIHow to reach the board. USB works from the website; Wi-Fi only works from a saved copy of this page.
⚡ CONNECTPick the board's port. The status line turns green when it is live. Press again to disconnect: all outputs switch off first.
SENSORS FROM ANIMATIONWhen ticked, I0.2 and I0.3 keep coming from the conveyor, tank or mixer animation even with a board connected.
💡 BLINK TESTLoads a one-rung program that flashes Q0.0 once a second: the quickest way to prove the board works.
While Connected
The simulation switches to the ESP32 Board view, which mirrors the real LEDs and buttons. Inputs work from both places: an input is ON when its real button or its on-screen PRESS button is pressed. So you can add an input in the I/O table, use it in a rung, and switch the real outputs from the screen.
No Board Yet?
Pick 🔌 ESP32 Board in the simulation list. It is a virtual board on a breadboard: hold its push-buttons to drive the inputs and watch the LEDs follow your outputs, on the same GPIO pins as the real firmware. Choose C3 SuperMini, S3 or classic DevKit; the choice is shared with the setup guide.
Keyboard Shortcuts
KeyAction
EnterConfirm the insert dialog (same as clicking OK).
EscapeCancel / close any open dialog or the help modal.
Mouse wheelOver the toolbar, slides it sideways to reach more tools.
Space / EnterOn a focused ESP32 Board push-button, presses it.
Drag & Drop Tips
Drag instructions from the toolbar, or drag anything already on the ladder, onto a + slot. While you drag, every valid drop point lights up blue. Drop a contact on + OR to start a parallel branch, or on + NEW RUNG to start a new rung. Coils always end up in the output column, wherever you drop them.
💡
You can drag an element from one rung into a different rung entirely — just hover over the destination rung's + slot and release. Drag a contact onto + OR to move it into its own new branch.
Common Mistakes
ProblemCauseFix
Rung never energizesAn NC contact's bit is ON, blocking power flowCheck the I/O table — the bit driving that NC contact may already be 1
Motor won't stay on after releasing StartNo seal-in branch — the rung needs a parallel M bitDrag an NO contact for M0.0 onto + OR, add an NC I0.1 after it, and add an M0.0 OUT coil
Timer never firesTDN contact address doesn't match the TON/TOF addressBoth must use the same timer address, e.g. T0
Nothing happens when you press inputsThe PLC is stopped, so no logic runsPress ▶ RUN — PRESS buttons only update bits; logic only runs during the scan cycle
An output behaves strangelyTwo rungs drive the same coil, so the last rung winsUse one rung with + OR branches instead of two rungs
New OR branch does nothingAn empty branch is ignored until it has a contactDrop a contact onto the branch's + slot
ESP32 won't connectNo firmware, wrong browser, or the port is busyOpen the setup guide (Connect a real ESP32 → Open setup), and use Chrome or Edge on a computer
Learning Resources
🏭 Start Here
Pick Conveyor Belt to load the seal-in. Press RUN → hold I0.0 Start → release → press I0.1 Stop. Understand the seal-in before building anything new.
⏱ Timer Exercise
Add a TON timer to rung 001 (T0, 3000 ms). Add rung 002 with a TDN contact (T0) and an OUT coil for Q0.1. Press RUN and hold I0.0 — Q0.1 fires after 3 s.
🔒 SET/RST Pattern
Rung 001: I0.0 NO → SET M0.0. Rung 002: I0.1 NO → RST M0.0. Rung 003: M0.0 NO → OUT Q0.0. The output latches on I0.0 and only clears on I0.1.
🛢️ Tank Hysteresis
Rung 001: I0.2 NC (HIGH sensor) → OUT Q0.0 Pump. This turns the pump off when the tank is full. Add a second rung for low-level restart using M bits.
✅
Scroll down this page for 10 lessons, three build-it-yourself jobs with solutions, a quiz and an instruction reference. PickettPLC is part of the free PICKETTECH platform — visit pickettech.com for electronics calculators, lean manufacturing tools, OEE trackers, and more.
// SIMULATION INFO
▶ Press RUN first to activate the PLC