Ladder logic

À propos des diagrammes Ladder logic

Le ladder logic (logique à contacts) est le langage de programmation graphique utilisé pour décrire les programmes de contrôle dans les automates programmables industriels (API) — les ordinateurs industriels qui pilotent l'automatisation d'usine, les systèmes CVC, les lignes de convoyeurs et les équipements de process dans le monde entier. Le nom vient de l'apparence du diagramme : deux rails d'alimentation verticaux connectés par des barreaux horizontaux, chaque barreau exprimant une règle condition-action. Les électriciens et les ingénieurs en automatisme l'ont adopté parce qu'il reflète les schémas de contacts à relais qu'ils connaissaient déjà.

Schematex suit la norme IEC 61131-3:2013, le standard international pour les langages de programmation d'API, avec les conventions de nommage d'adresses de tag Allen-Bradley (Rockwell) courantes dans la pratique industrielle nord-américaine. Cette page documente ce que le parseur accepte aujourd'hui.

ladder·§ IEC 61131-3
↘ preview
100%
Motor Start/Stop PLC ladder logic diagram with 4 rungs Motor Start/Stop Rung 001 — Seal-in circuit — Rung 002 — Mode select with Set/Reset — Rung 003 — Run timer — Rung 004 — Alarm on cycle complete — Start Button START_PB IN 1.0 Aux Contact MOTOR_AUX BIT 3.0 Stop Button STOP_PB IN 1.1 Motor Command MOTOR_CMD OUT 2.0 Auto Mode Button AUTO_HMIPB BIT 5.10 System Fault SYS_FAULT BIT 3.0 S System Auto Mode SYS_AUTO BIT 3.1 R System Manual Mode SYS_MANUAL BIT 3.2 MOTOR_CMD TON PT=5000 RUN_TMR Cycle Done CYCLE_DONE BIT 4.0 / Alarm Output ALARM_OUT OUT 2.5
UTF-8 · LF · 23 lines · 734 chars✓ parsed·8.9 ms·10.6 KB SVG

1. Votre premier diagramme ladder

Le programme ladder minimal utile : un barreau, deux contacts, une bobine.

ladder·§ IEC 61131-3
↘ preview
100%
First Rung PLC ladder logic diagram with 1 rung First Rung Rung 001 — Start when button pressed, stop on fault — START_PB FAULT MOTOR_RUN
UTF-8 · LF · 5 lines · 110 chars✓ parsed·0.3 ms·3.3 KB SVG

Quatre règles couvrent 80 % des usages :

  1. Commencer par ladder, suivi optionnellement d'un titre entre guillemets.
  2. Chaque barreau commence par rung N "commentaire optionnel": sur sa propre ligne. Le deux-points en fin de ligne est optionnel.
  3. Les éléments sont listés un par ligne, indentés sous le barreau — de gauche à droite signifie série (logique ET).
  4. Un bloc parallel: / branch: introduit la logique OU. Chaque branche contient sa propre liste d'éléments.

Les commentaires peuvent commencer par #, // ou le style Mermaid %% sur leur propre ligne.


2. Contacts

Les contacts représentent des conditions d'entrée — ils laissent passer le courant lorsque le bit associé correspond au type de contact.

TypeNomLaisse passer le courant quand…
XICExamine If ClosedBit de tag = 1 (normalement ouvert)
XIOExamine If OpenBit de tag = 0 (normalement fermé)
ONSOne-Shot RisingLe tag passe de 0 → 1 (front montant, un cycle)
OSFOne-Shot FallingLe tag passe de 1 → 0 (front descendant, un cycle)

Syntaxe :

XIC(tag)
XIC(tag, "address")
XIC(tag, "address", name="Description")
XIC(tag, address="address", name="Description")
  • tag — obligatoire. Le nom de tag API (affiché sous le symbole de contact).
  • "address" — deuxième argument positionnel optionnel. L'adresse E/S (ex. "IN 1.0", "BIT 3.1").
  • name="…" — argument clé-valeur optionnel. Description lisible par l'homme (affichée au-dessus du symbole).
ladder·§ IEC 61131-3
↘ preview
100%
Contact types PLC ladder logic diagram with 1 rung Contact types Rung 001 — All four contact types — Start Button START_PB IN 1.0 Emergency Stop NC E_STOP IN 1.5 One-Shot Rising PULSE_IN BIT 5.0 One-Shot Falling RESET_SIG BIT 5.1 Output Relay OUT_RLY OUT 2.0
UTF-8 · LF · 7 lines · 293 chars✓ parsed·0.3 ms·5.7 KB SVG

3. Bobines

Les bobines représentent des actions de sortie — elles agissent sur un bit de tag lorsque le barreau est alimenté.

TypeNomEffet sur le bit de tag
OTEOutput EnergizeMet le bit à 1 tant que le barreau est vrai ; le remet à 0 quand le barreau est faux
OTLOutput LatchMet le bit à 1 ; conserve même après que le barreau redevient faux (verrouillage)
OTUOutput UnlatchRemet le bit à 0 ; conserve même après que le barreau redevient faux
OTNOutput NegateMet le bit à 0 tant que le barreau est vrai ; le met à 1 quand le barreau est faux
RESResetBobine de remise à zéro de compteur ou minuterie Rockwell / Allen-Bradley

Syntaxe : identique aux contacts — OTE(tag), OTE(tag, "address"), OTE(tag, "address", name="…").

OTL et OTU sont utilisés en paires pour construire des bascules Set/Reset. Le dernier barreau à écrire l'emporte.

ladder·§ IEC 61131-3
↘ preview
100%
Set-Reset latch PLC ladder logic diagram with 2 rungs Set-Reset latch Rung 001 — Set on start — Rung 002 — Reset on stop or fault — Start START_PB IN 1.0 S Motor Latch MOTOR_ON BIT 3.0 Stop STOP_PB IN 1.1 E-Stop E_STOP IN 1.5 R Motor Latch MOTOR_ON BIT 3.0
UTF-8 · LF · 11 lines · 319 chars✓ parsed·0.3 ms·5.5 KB SVG

4. Blocs fonctionnels

Les blocs fonctionnels effectuent des opérations de minuterie, de compteur, de mathématique et de comparaison. Ils apparaissent en ligne dans un barreau et ont des paramètres nommés après l'argument de tag obligatoire.

4.1 Minuteries

TypeNomParamètres clés
TONTimer On-DelayPT= temps de présélection en millisecondes
TOFFTimer Off-DelayPT= temps de présélection en millisecondes
TPTimer PulsePT= temps de présélection en millisecondes
TON(timer_tag, PT=5000)

Le tag de minuterie stocke le temps écoulé. Le bit Q de la minuterie (sortie terminée) est accessible par nom de tag dans les contacts en aval.

4.2 Compteurs

TypeNomParamètres clés
CTUCount UpPV= valeur de présélection (entier)
CTDCount DownPV= valeur de présélection
CTUDCount Up/DownPV= valeur de présélection
CTU(cycle_counter, PV=100)

4.3 Mathématiques

TypeOpération
ADDAddition
SUBSoustraction
MULMultiplication
DIVDivision
MOVDéplacement (copie)
ADD(result_tag, IN1=setpoint, IN2=offset)
MOV(dest_tag, IN1=source_tag)

4.4 Comparaisons

TypeSignification
EQUÉgal
NEQDifférent
GRTSupérieur à
LESInférieur à
GEQSupérieur ou égal
LEQInférieur ou égal
EQU(compare_tag, IN1=speed_actual, IN2=speed_setpoint)
ladder·§ IEC 61131-3
↘ preview
100%
Timer and counter PLC ladder logic diagram with 3 rungs Timer and counter Rung 001 — Start run timer — Rung 002 — Count completed cycles — Rung 003 — Alarm when batch complete — Motor Running MOTOR_CMD BIT 3.0 TON PT=10000 RUN_TIMER Cycle Sensor CYCLE_SENSOR IN 2.0 CTU PV=500 PART_COUNT Count Done PART_COUNT Batch Complete Alarm BATCH_ALARM OUT 3.0
UTF-8 · LF · 10 lines · 359 chars✓ parsed·0.4 ms·5.6 KB SVG

5. Branches parallèles

Un bloc parallel: introduit la logique OU — le barreau est alimenté si au moins une branche conduit. Chaque branche est un sous-bloc branch: avec ses éléments indentés en dessous.

parallel:
  branch:
    XIC(LOCAL_START)
  branch:
    XIC(REMOTE_START)

Les branches dans un parallel: sont évaluées simultanément. Le bloc se ferme quand l'indentation revient au niveau précédant le parallel:.

Règles :

  • parallel: doit apparaître à l'intérieur d'un barreau.
  • branch: doit apparaître à l'intérieur d'un parallel: — l'utiliser seul génère une LadderParseError.
  • Chaque branche contient un ou plusieurs éléments.
  • Les éléments après le bloc parallel: sont en série avec lui (logique ET).
ladder·§ IEC 61131-3
↘ preview
100%
Parallel OR logic PLC ladder logic diagram with 1 rung Parallel OR logic Rung 001 — Start from either local or remote — Local Start LOCAL_START IN 1.0 Remote Start REMOTE_START BIT 5.2 Stop All STOP_ALL IN 1.5 Conveyor Run CONVEYOR OUT 2.0
UTF-8 · LF · 9 lines · 292 chars✓ parsed·0.3 ms·4.5 KB SVG

6. Labels et commentaires

  • Titre : ladder "Motor Control" — première ligne uniquement, chaîne entre guillemets.
  • Numéro de barreau : entier obligatoire après rung.
  • Commentaire de barreau : chaîne entre guillemets optionnelle après le numéro de barreau, avant le deux-points optionnel : rung 3 "Run indicator": ou rung 3 "Run indicator".
  • Tag : premier argument entre parenthèses — affiché sous le symbole.
  • Adresse : deuxième argument positionnel (entre guillemets) : XIC(START_PB, "IN 1.0").
  • Nom : argument nommé name="…" — description lisible par l'homme affichée au-dessus du symbole.
  • Commentaires de ligne : #, // ou %% au début d'une ligne (après les espaces initiaux). Les mêmes marqueurs démarrent également des commentaires en fin de ligne.

7. Mots réservés et échappement

Réservés en début de ligne (insensibles à la casse) : ladder, rung, parallel:, branch:.

Noms d'éléments en ASCII majuscules : XIC, XIO, ONS, OSF, OTE, OTL, OTU, OTN, TON, TOFF, TP, CTU, CTD, CTUD, ADD, SUB, MUL, DIV, MOV, EQU, NEQ, GRT, LES, GEQ, LEQ.

IDs de tag — doivent correspondre à [A-Z][A-Z0-9_]* (le parseur fait correspondre [A-Z][A-Z0-9_]* pour le préfixe du nom d'élément). Les tags en minuscules sont acceptés à l'intérieur des parenthèses.

Chaînes entre guillemets dans les arguments d'adresse ou de nom doivent utiliser des guillemets doubles "…".


8. Erreurs courantes

Ce que vous avez écritCe que dit le parseurCorrection
rung 1 (sans deux-points)Parsé correctementLe deux-points en fin de ligne est optionnel
ONF(TAG)LadderParseError: unknown element type "ONF"Le contact à front descendant est OSF, pas ONF
parallel: sans branch:Bloc parallèle vide — le barreau n'a pas d'élémentAjouter au moins un branch: à l'intérieur du parallel:
branch: avant parallel:LadderParseError: branch: without parallel:Toujours ouvrir parallel: en premier
OTE() — pas de tagLadderParseError: element missing tagLe tag est obligatoire : OTE(MY_TAG)
var StartBtn: bool (déclaration de variable)LadderParseError: invalid element syntaxPas de déclarations de variables — les tags sont utilisés directement
Barreau vide (pas d'éléments après rung N:)LadderParseError: Rung N: empty rungAjouter au moins un élément à chaque barreau
TON(T1, T#5s)LadderParseError: invalid element syntax (T# n'est pas un nombre valide)Utiliser un entier en millisecondes : TON(T1, PT=5000)

9. Grammaire (EBNF)

document      = header NEWLINE rung+

header        = "ladder" ( WS quoted-string )? NEWLINE
quoted-string = '"' any-char-but-quote* '"'

rung          = "rung" WS integer ( WS quoted-string )? ":"? NEWLINE
                  element+

element       = contact-line
              | coil-line
              | fb-line
              | parallel-block

contact-line  = contact-type "(" tag ( "," arg )* ")" NEWLINE
contact-type  = "XIC" | "XIO" | "ONS" | "OSF"

coil-line     = coil-type "(" tag ( "," arg )* ")" NEWLINE
coil-type     = "OTE" | "OTL" | "OTU" | "OTN" | "RES"

fb-line       = fb-type "(" tag ( "," arg )* ")" NEWLINE
fb-type       = "TON" | "TOFF" | "TP"
              | "CTU" | "CTD" | "CTUD"
              | "ADD" | "SUB" | "MUL" | "DIV" | "MOV"
              | "EQU" | "NEQ" | "GRT" | "LES" | "GEQ" | "LEQ"

arg           = quoted-string             // positional (address)
              | key "=" quoted-string     // keyword (e.g. name="…")
              | key "=" number            // keyword (e.g. PT=5000)

parallel-block = INDENT≥2 "parallel:" NEWLINE
                   ( INDENT branch-block )+

branch-block   = "branch:" NEWLINE
                   ( INDENT element )+

tag           = [A-Za-z][A-Za-z0-9_]*
key           = [A-Za-z][A-Za-z0-9_]*
integer       = [0-9]+
number        = [0-9]+ ( "." [0-9]+ )?
comment       = ( "#" | "//" | "%%" ) any NEWLINE

Source faisant autorité : src/diagrams/ladder/parser.ts. En cas de divergence avec le parseur, le parseur prévaut — veuillez ouvrir un ticket.


10. Conformité aux normes

La logique ladder Schematex suit la norme IEC 61131-3:2013 partie 3 pour le langage Ladder Diagram et utilise les conventions de nommage tag-adresse Allen-Bradley (Rockwell) courantes dans la pratique API nord-américaine.

Ce qui est implémenté aujourd'hui :

  • ✅ Quatre types de contacts : XIC (NO), XIO (NC), ONS (front montant), OSF (front descendant)
  • ✅ Cinq types de bobines : OTE (sortie), OTL (verrouillage/set), OTU (déverrouillage/reset), OTN (négation), RES (remise à zéro compteur/minuterie)
  • ✅ Trois blocs fonctionnels de minuterie : TON, TOFF, TP avec paramètre PT= en millisecondes
  • ✅ Trois blocs fonctionnels de compteur : CTU, CTD, CTUD avec paramètre entier PV=
  • ✅ Blocs fonctionnels mathématiques : ADD, SUB, MUL, DIV, MOV
  • ✅ Blocs fonctionnels de comparaison : EQU, NEQ, GRT, LES, GEQ, LEQ
  • ✅ Blocs parallèles / de branche pour la logique OU
  • ✅ Annotations de tag, d'adresse et de nom selon les conventions Allen-Bradley Studio 5000
  • ⏳ Minuterie à mémorisation (RTO) — dans la norme ; pas encore dans le parseur
  • ⏳ Instructions Jump (JMP) / Label (LBL)
  • ⏳ Zone de contrôle maître reset (MCR)
  • ⏳ Instructions E/S immédiates (IIN, IOT)
  • ⏳ Éléments de texte structuré ou de diagramme bloc fonctionnel intégrés dans les barreaux

Références :

  • IEC 61131-3:2013 — Programmable controllers, Part 3: Programming languages
  • NEMA ICS 1-2009 — General Standards for Industrial Control and Systems
  • Rockwell Automation Studio 5000 Logix Designer — Ladder Diagram Programming Manual

11. Exemples connexes

ladder·§ IEC 61131-3
Motor Start/Stop PLC ladder logic diagram with 1 rung Motor Start/Stop Rung 001 — Seal-in circuit — Start Button START_PB IN 1.0 Aux Contact MOTOR_AUX BIT 3.0 Stop Button STOP_PB IN 1.1 Motor Command MOTOR_CMD OUT 2.0
Motor start/stop seal-in circuit
Classic three-wire motor start/stop seal-in circuit in IEC 61131-3 ladder logic — the foundational pattern taught in every PLC certification course.
industrial & process
ladder·§ IEC 61131-3
System Mode Selection PLC ladder logic diagram with 2 rungs System Mode Selection Rung 001 — Set system Auto mode, reset Manual — Rung 002 — Set Manual, reset Auto (with Home seal-in) — Auto Mode HMI Pushbutton AUTO_HMIPB BIT 5.10 Manual Mode HMI Pushbutton MANL_HMIPB BIT 5.11 System Fault SYS_FAULT BIT 3.0 S System Auto Mode SYS_AUTO BIT 3.1 R System Manual Mode SYS_MANUAL BIT 3.2 Manual Mode HMI Pushbutton MANL_HMIPB BIT 5.11 System Home Command SYS_HOMECMD BIT 3.5 Auto Mode HMI Pushbutton AUTO_HMIPB BIT 5.10 System Fault SYS_FAULT BIT 3.0 S System Manual Mode SYS_MANUAL BIT 3.2 R System Auto Mode SYS_AUTO BIT 3.1
System mode selection (Set/Reset)
IEC 61131-3 ladder logic for HMI-driven Auto/Manual mode selection using Set/Reset (OTL/OTU) coils with system fault interlocks.
industrial & process

12. Feuille de route

Prévu — pas encore analysable. Ne pas utiliser dans un DSL généré aujourd'hui ; le parseur les rejettera ou les ignorera.

  • Retentive Timer On (RTO) — minuterie qui conserve le temps écoulé en cas de coupure d'alimentation ; nécessite un contact de remise à zéro séparé.
  • Jump (JMP) / Label (LBL) — branchement vers un barreau étiqueté pour ignorer de la logique conditionnellement ; utilisé dans les grands programmes pour les performances.
  • Zone de contrôle maître reset (MCR) — zone délimitée qui désactive toutes les sorties non mémorisées quand l'entrée MCR est fausse.
  • Texte structuré dans les barreaux — évaluation d'expression en ligne (ex., CALC(result = a * b + c)).
  • E/S immédiates (IIN / IOT) — forcer le scan E/S en milieu de programme pour le contrôle à temps critique.

Suivre dans les tickets GitHub si vous avez besoin de l'un de ces éléments plus tôt.

Found this useful?

Schematex is free, fully open source, and zero-dependency. A star helps other developers discover it.