What is IL?
Instruction List (IL) is a textual, assembler-like programming language for PLCs in which a program consists of a sequence of short instructions, each performing one operation on an intermediate result held in the accumulator. IL was one of the five languages standardised by the first edition of IEC 61131-3 in 1993, alongside Ladder Logic, FBD, ST and SFC. The third edition (2013) marked IL as deprecated, and the fourth edition, published on 22 May 2025, removed the language altogether. Even so, IL code still runs in many plants across industrial automation and process automation, often in the Siemens variant Statement List (STL, German: Anweisungsliste or AWL).
π§ How does Instruction List work?
An IL program is executed line by line. Every line has the same structure:
- Label (optional) - a jump target, followed by a colon
-
Operator - the operation, such as
LD,ANDorST -
Modifier (optional) -
N(negation),C(conditional) or((deferred operation) - Operand - a variable, constant or address
- Comment (optional) - between
(*and*)
At the heart of IL is the current result, the term used in the standard, which most tools
call the accumulator. LD loads a value into the accumulator, a logical or arithmetic operator
combines the accumulator with the operand, and ST writes the result out. Comparisons such as
GT place a Boolean result in the accumulator, after which a conditional jump (JMPC) can act on it.
The model closely resembles a simple processor with a single register. That explains why IL is compact, but also why larger programs are hard to read: the meaning of a line depends on everything that was put in the accumulator before it. Like the other languages, IL runs inside the cyclic PLC scan (read inputs, execute the program, write outputs), which gives the controller its deterministic behaviour.
π Which instructions does IL provide?
The table below lists the operators as defined in IEC 61131-3 (editions 2 and 3) and implemented by tools
such as CODESYS. The N modifier
negates the operand, except with JMPC, CALC and RETC, where N means the action only happens when the result is FALSE.
| Operator | Modifiers | Meaning |
|---|---|---|
| LD | N | Load the operand into the accumulator (LDN: negated) |
| ST | N | Write the accumulator to the operand (STN: negated) |
| S / R | - | Set a BOOL to TRUE (set) or FALSE (reset) when the accumulator is TRUE |
| AND / OR / XOR | N, ( | Logical or bitwise combination with the operand |
| NOT | - | Negate the accumulator itself |
| ADD / SUB / MUL / DIV | ( | Arithmetic operation, result in the accumulator |
| GT / GE / EQ / NE / LE / LT | ( | Comparison, Boolean result in the accumulator |
| JMP | C, N | Jump to a label (JMPC: when TRUE, JMPCN: when FALSE) |
| CAL | C, N | Call a function block (CALC, CALCN) |
| RET | C, N | Return from a POU (RETC, RETCN) |
| ) | - | Execute the deferred operation |
IEC IL has no AND NOT as two separate instructions: a negated operand is written as ANDN, while NOT without an operand inverts the accumulator itself. Siemens STL uses
AN (international) or UN (German, from Und Nicht) for the same
operation.
π How does Siemens STL differ from IEC IL?
Siemens Statement List (STL, German AWL) is
the best-known IL variant in European plants, because the SIMATIC S5 and S7 were the standard for a long time. The principle is the same, but STL works with two kinds of
intermediate result: the RLO (result of logic operation, German VKE) for bit logic and
the accumulators for words and numbers. An S7-300 has two accumulators, an S7-400 four.
Siemens lets you choose between German and international mnemonics, so U E 0.0 and A I
0.0 mean the same thing.
| Function | IEC IL | STL (international) | AWL (German) |
|---|---|---|---|
| First bit check | LD |
A |
U |
| AND NOT | ANDN |
AN |
UN |
| OR | OR |
O |
O |
| Assign bit result | ST |
= |
= |
| Load / transfer word | LD / ST |
L / T |
L / T |
| Unconditional jump | JMP |
JU |
SPA |
| Jump if TRUE / FALSE | JMPC / JMPCN |
JC / JCN |
SPB / SPBN |
In STL a logic string does not start with a load but with a first check (A or U)
that restarts the RLO. As a result, STL code cannot be converted line by line to an IEC environment such
as CODESYS, or the other way round.
π§ What does an IL program look like?
A classic latching circuit for a motor with a start and stop button:
(* Motor start/stop with latching *)
LD Start
OR Motor
ANDN Stop
ST Motor
In ST that is a single line: Motor := (Start OR
Motor) AND NOT Stop;. Parentheses defer an operation until the closing ):
LD A
AND( B
OR C
)
ST D (* D := A AND (B OR C) *)
An example with a comparison and a conditional jump, switching on a pump when the level drops below 20 percent:
LD Level
LT 20
JMPCN DONE
S Pump
DONE: LD Pump
ST Lamp
These examples show why IL was popular: few lines, close to the controllerβs machine code. They also show the drawback: without comments you cannot see at a glance what logic is there, and jumps make the order of execution hard to follow.
π What is the status of IL in IEC 61131-3?
| Edition | Year | What it means for IL |
|---|---|---|
| Edition 1 | 1993 | IL standardised as one of five languages |
| Edition 2 | 2003 | IL remains part of the standard |
| Edition 3 | 2013 | IL marked as deprecated |
| Edition 4 | May 2025 | IL removed; Annex B lists added, removed and deprecated features |
Removal from the standard does not mean IL code stops working. Existing controllers keep executing their programs, and many engineering tools still offer the language for existing projects. You can no longer expect new platforms or new features to support IL, however. For new projects, IL is therefore not a sensible choice.
π How does IL compare with other PLC languages?
| Property | IL | Ladder Logic | ST |
|---|---|---|---|
| Form | Text, one instruction per line | Graphical, contacts and coils | Text, high-level language |
| Readability | Low in larger programs | High for electrical engineers | High for software developers |
| Complex calculations | Cumbersome | Limited | Strong |
| Status in IEC 61131-3 | Removed (2025) | Current | Current |
| Typical use | Legacy code, older compact PLCs | Discrete machine control | Algorithms, data, control loops |
Support differs per vendor:
- Siemens - STL is its own IL variant. In TIA Portal, STL is available on the S7-300, S7-400 and S7-1500, but not on the S7-1200 (see S7).
- CODESYS - still supports IL for existing projects, including in derived environments such as TwinCAT.
- Rockwell - Studio 5000 for Logix controllers has no IL, only ladder, FBD, ST and SFC.
The difference from FBD and SFC is mainly structural: FBD shows signal flows graphically, and SFC divides a process into steps and transitions. IL has neither, so sequences are rebuilt with labels and jumps.
π Where will you still find IL?
IL and STL live mainly in installations with a long service life: production lines, water treatment plants, pumping stations, energy infrastructure and machines that run for ten to thirty years. That code supplies process data to SCADA, HMI, Historian and MES via protocols such as Modbus TCP, ProfiNET, Ethernet IP and, increasingly, OPC UA. The language itself does not determine that communication; the controller and the network configuration do.
It is mostly basic logic: interlocks, start/stop circuits, machine cycles, alarm handling and simple process control. Typical problems with such legacy systems:
- Loss of knowledge - the original programmer has left and documentation is missing
- Spaghetti code - many jumps make changes risky
- Vendor lock-in - STL code cannot be moved directly to another vendor
- Outdated engineering software - old tools often run on unsupported Windows versions
IL is therefore mainly a Lifecycle Management issue, and it limits the scalability of an installation. If the code has to stay for now, limit the damage: use clear labels, comment every network, split long blocks into smaller routines and do not add new jumps.
π§ How do you migrate IL code step by step?
- Take inventory - which controllers, program blocks and tools contain IL or STL, and which firmware is running?
- Capture the current version - make a Backup of the loaded program and put it under Version Control, so you can compare changes.
- Document the function - describe what each block does, preferably with an I/O list and interlocks. This is often the largest part of the work.
- Choose the target language - usually ST for calculations and ladder or FBD for logic that maintenance technicians need to read.
- Rewrite and test - test on a simulator or test rig, and compare outputs with the original for the same inputs.
- Manage the change - follow your change management process and schedule the cut-over during a shutdown.
If IL code implements a safety function on a Safety PLC, every change means re-verification under IEC 61508, IEC 61511 or ISO 13849. Never migrate safety logic as a side task of a general retrofit.
π What security risks come with legacy IL systems?
The risk lies not in the language but in its surroundings: old controllers without authentication, engineering stations with outdated software and little visibility of changes. Stuxnet showed that attackers can modify PLC code blocks and hide those changes from the engineering software.
| Measure | Purpose |
|---|---|
| Network Segmentation | Isolate old controllers from office IT |
| Application Whitelisting | Only approved software on engineering stations |
| MFA | Strong authentication for remote access |
| Logging | Record program changes and downloads |
| Patch Management | Fix vulnerabilities in firmware and tools where possible |
| Backup and Version Control | Restore a known good version and detect deviations |
Where patching is not possible, compensating controls are needed, such as strict access to the engineering network and periodically comparing the loaded program with the last approved version.
β Frequently asked questions
What does IL mean in PLC programming?
IL stands for Instruction List, a textual PLC language with assembler-like instructions such as LD, AND and ST. Each line operates on the current result held in the accumulator. Until 2025, IL was one of the languages of IEC 61131-3.
Is Instruction List still part of IEC 61131-3?
Instruction List was marked as deprecated in the third edition of IEC 61131-3 (2013) and removed in the fourth edition of May 2025. Existing IL programs keep working, but new projects belong in ST, ladder, FBD or SFC.
What is the difference between IL and Siemens STL?
Siemens Statement List (STL, German AWL) is the Siemens variant of Instruction List. The principle of an
accumulator and one instruction per line is the same, but mnemonics and addressing differ, for example
A I 0.0 or U E 0.0 in STL. STL code therefore cannot be used in an IEC IL
environment without changes.
Is IL faster than Structured Text?
Instruction List was often seen as faster because its instructions are close to machine code. On modern controllers, ST and IL compile to comparable code, so the difference in scan time is rarely decisive. Readability and maintainability carry more weight today.
Can you convert IL code to ST automatically?
A simple IL sequence translates fairly directly into ST, but jumps, shared accumulator values and vendor-specific instructions make automatic conversion unreliable. Migrating Instruction List code should therefore always include a functional test that compares old and new behaviour.
Is it still worth learning IL?
Instruction List is not needed for new projects, but anyone maintaining older installations regularly comes across IL or Siemens STL. Being able to read it is useful, especially to understand old code before you migrate it.
π In summary
Instruction List is the assembler-like textual PLC language from IEC 61131-3 that was deprecated in 2013 and removed from the standard in 2025. IL code works with an accumulator and short instructions, is compact but hard to maintain, and still runs in many legacy installations. Inventory that code, capture its versions, secure its environment and migrate it in a controlled way to ST, ladder or FBD.
