Step by step

How to use the ladder simulator

A PLC ladder simulator that runs in the browser: build a rung, press Run, and watch power flow through it exactly as a controller would solve it. Nothing to install, no licence, and your work saves itself. Here is everything it does, in the order you will need it.

1

Pick something to build

Open Practice and choose an exercise, or open the sandbox if you would rather build whatever you like.

An exercise gives you a goal, a fixed list of I/O and a set of automatic checks. The sandbox gives you the same editor with no checks and no marking: it is the one to use when you want to try an idea.

Tip: Coming back later? The catalogue leads with a Continue button pointing at the exercise you have not done yet.

2

Read the goal and the I/O list

The goal says what the machine has to do. The I/O card lists every tag you have been given: inputs from the field, outputs you can drive, internal coils, timers, counters and number registers.

Those names are what you put on your contacts and coils. You can add your own tags on top of them at any time.

Tip: The I/O card is collapsed by default. Click it to open it, and it stays open next time.

3

Put an element on a rung

Click any empty cell on a rung and pick what goes there: a normally open contact (XIC), a normally closed one (XIO), a rising or falling edge, a compare, an expression, or a plain wire.

Then choose the tag it examines. The list is every tag you have, plus New tag if you need another.

You can also drag an element out of the toolbox on the left, or click a toolbox button to arm it and then click the cell. All three routes do the same thing, so use whichever suits you.

Tip: Contacts go on the left of the rung, in series. Power has to reach the right-hand end for the output to turn on.

4

Give the rung an output

Click the element at the right-hand end of the rung to choose what it does: a coil (OTE), a latch or unlatch (OTL / OTU), a timer (TON, TOF, RTO), a counter (CTU, CTD), a move or a calculation (MOV, ADD, CPT and the rest), or a call to another routine (JSR).

Every rung needs one. The output is what the rung is for; the contacts are only the conditions that decide it.

Tip: A timer preset is in milliseconds, so five seconds is 5000.

5

Add a branch, or a second output

Press + branch in the rung header to add a parallel row. Power gets through if either row conducts, which is how a seal-in is drawn: the start button on one row, the motor's own contact on the other.

The dots between rows join and separate the branch. Click one to toggle it.

Click the dashed + at the right end of a branch row to put a second output on the same rung.

Tip: A start/stop seal-in is the first pattern worth knowing: [XIC(Start), XIC(Motor)] then XIO(Stop), then OTE(Motor).

6

Label what you built

Type a comment in the strip under the rung header to say what the rung does.

Click any placed element and fill in its Description to print a line above it, exactly as real ladder software does. The rung grows to fit it, and long text wraps.

Both are kept in share links and in exported images, so a program you send someone explains itself.

7

Run it and watch the power

Press Run. The program scans continuously, top rung to bottom, over and over, exactly like a controller.

Live rungs turn red: that is power flowing. Pause freezes the scan on the current one, Step runs exactly one scan so you can follow a sequence a scan at a time, and Stop resets everything to its power-up state.

Slow, Normal and Fast change the scan interval, which is also the time your timers count in.

Tip: Nothing happens on its own? That is normal for logic that waits for an input. Sequences and cycles have to be built to drive themselves.

8

Toggle the inputs

Open the I/O panel in the sidebar while the program runs. Every bit has a 1 and a 0: press one to force that bit on or off, and press the active one again to release it.

Timers show their progress, counters their count, registers their value. Click any tag to cross-reference it: the rungs that read or write it are highlighted and everything else dims.

Tip: A forced bit stays forced. The panel header shows how many forces are active and clears them all in one click.

9

Ask what is wrong with it

Press Check my program. It reads your logic the way a compiler would, then runs it for four simulated minutes with nothing touched, and reports what it finds.

Red items stop the program working: a rung with no output, a JSR to a routine that does not exist, a step in a sequence that can never be left. Amber items mean it runs but probably not as you meant: a timer nothing waits on, outputs that only copy their inputs. Grey items are remarks.

Each one is a button. Click it and the editor opens that routine and scrolls to the rung.

Tip: This is the fastest way out of "it does nothing and I do not know why".

10

Pass the exercise

Press Run checks. The exercise drives its own inputs, waits, and looks at your outputs: each check passes or fails on its own, and a failed one says what it expected.

Pass them all and the exercise is marked done, your progress moves, and the next one is one click away.

11

Split a big program into routines

Press + Routine to add one. The first routine is Main and the scan starts there; the others only run when a JSR rung calls them.

Group rungs by the job they do: a Sequence routine, a Motors routine, an Alarms routine. Main then reads as a short list of JSR calls.

A routine nothing calls is marked with a dot on its tab, because it will never run.

Tip: Past about fifteen rungs, a routine is doing too many jobs to read.

12

Describe a machine and have it written

Generate with AI takes a plain description ("traffic light: green 20 seconds, amber 4, red 20, cycling forever") and writes the ladder for it.

You bring your own API key from Anthropic, Google or DeepSeek. It is kept in your browser, sent only to make the call, and never stored on our servers.

What comes back is parsed, checked and actually run before you see it, and rejected and asked again if it does not work. You get a preview, and nothing touches your program until you press Use this program.

Tip: The program you had open is saved to History first, so an answer you do not like costs you nothing.

13

Nothing gets lost

Every change saves to this browser as you make it. Ctrl+Z and Ctrl+Shift+Z undo and redo.

Clear program and the AI both take a snapshot first: press History to see them, preview any one, and restore it.

14

Share it or put it in a document

Share / Export turns the program into a link that carries the whole thing: no account, no expiry, and whoever opens it gets a live editor, not a picture.

The same panel gives you an embed snippet for a blog or an LMS, and PNG or SVG images for documentation and slides.

Tip: Finished an exercise? Share your solution is right there in the congratulation.

When something does not work

I press Run and nothing happens

Most logic waits for an input: open the I/O panel and force one on. If it is meant to cycle by itself, press Check my program, which will say which step it is stuck in and why.

My timer never finishes

A timer counts only while its own rung is true, and it resets to zero the moment that rung goes false. Two instructions on one timer tag fight over the same accumulator, so give each step its own timer.

The output never comes on

Power has to reach the right-hand end of the rung. Run it and follow the red: it stops at the first contact that is not conducting. A normally closed contact (XIO) conducts while its tag is off.

My sequence runs once and stops

Something has to send it back to the first step. The last step's transition rung moves the step number back to 1, and that is what makes it repeat.

Do I need an account?

No. Everything is stored in your own browser, and a share link carries the program itself rather than pointing at a server.

That is the whole tool. The rest is practice.

Browse the exercises →