Éditeur Structured Text

Vue d’ensemble

Structured Text (ST) est le langage de haut niveau de type Pascal de IEC 61131-3 et l’éditeur par défaut pour les POU PROGRAM, FUNCTION_BLOCK et FUNCTION dans ForgeIEC. L’éditeur est une composition basée sur QWidget d’un tableau de variables et d’une zone de code, couplés par un splitter vertical.

+----------------------------------------+
| Variable table                         |  <- FVariablesPanel
| (VAR/VAR_INPUT/VAR_OUTPUT/VAR_INST)    |
+========================================+  <- QSplitter (vertical)
| Code area                              |  <- FStCodeEdit
| (Tree-sitter highlighting + folding +  |
|  Ctrl-Space completion)                |
+----------------------------------------+

Disposition de l’éditeur

ZoneContenu
Tableau de variables (haut)Déclarations avec colonnes Nom, Type, Valeur initiale, Adresse, Commentaire. Les éditions se synchronisent en direct dans le bloc VAR ... END_VAR du code.
Zone de code (bas)Source ST entre les sections de variables. Pliage de lignes piloté par l’AST tree-sitter, numéros de ligne, surlignage de la ligne du curseur.
Barre de recherche (Ctrl-F / Ctrl-H)Affichée au-dessus de la zone de code, avec mode remplacer pour rechercher-remplacer.

Le splitter mémorise sa position par POU dans l’état de mise en page.

Coloration syntaxique tree-sitter

Au lieu d’un QSyntaxHighlighter à base de regex, ForgeIEC parse la source ST avec Tree-sitter en un AST et colore via des requêtes de capture :

  • Mots-clés (IF, THEN, FOR, FUNCTION_BLOCK, …) : magenta
  • Types de données (BOOL, INT, REAL, TIME, …) : cyan
  • Chaînes + littéraux temps ('abc', T#20ms) : vert
  • Commentaires ((* ... *), // ...) : gris, italique
  • PUBLISH / SUBSCRIBE : mots-clés d’extension Anvil, style dédié

Avantage : la coloration reste correcte sur des constructions complexes (commentaires imbriqués, littéraux temps, références qualifiées), et le même AST pilote les plages pliables pour le pliage de code.

Complétion de code (Ctrl-Espace)

Appuyer sur Ctrl-Espace ou taper deux caractères correspondants ouvre le popup de complétion. Le compléteur connaît :

  • Mots-clés IEC (IF, CASE, FOR, WHILE, RETURN, …)
  • Types de données (BOOL, INT, DINT, REAL, STRING, TIME, …)
  • Variables locales du POU courant
  • Noms de POU dans le projet (PROGRAM, FUNCTION_BLOCK, FUNCTION)
  • Blocs de bibliothèque (TON, R_TRIG, JK_FF, DEBOUNCE, …)
  • Fonctions standard (ABS, SQRT, LIMIT, LEN, …)

Les modifications du pool de variables (signal poolChanged) se propagent dans le modèle de complétion avec un debounce de 100 ms — les nouvelles entrées de pool deviennent disponibles presque instantanément, sans que chaque frappe ne déclenche un rescan complet.

Fondamentaux du langage (IEC 61131-3)

Instructions

InstructionForme
Affectationvar := expression;
IF / ELSIF / ELSEIF cond THEN ... ELSIF cond THEN ... ELSE ... END_IF;
CASECASE x OF 1: ... ; 2,3: ... ; ELSE ... END_CASE;
FORFOR i := 1 TO 10 BY 1 DO ... END_FOR;
WHILEWHILE cond DO ... END_WHILE;
REPEATREPEAT ... UNTIL cond END_REPEAT;
EXIT / RETURNQuitter la boucle / quitter le POU

Expressions

Opérateurs standard avec précédence IEC : **, unaire +/-/NOT, * / MOD, + -, comparaisons, AND / &, XOR, OR. Parenthèses comme en Pascal. Les conversions numériques implicites ne sont pas autorisées — INT_TO_DINT, REAL_TO_INT etc. doivent être appelées explicitement.

Accès bit sur types ANY_BIT

var.<bit> extrait ou définit un seul bit, directement sur des variables BYTE/WORD/DWORD/LWORD :

status.0 := TRUE;             (* set bit 0 *)
alarm := flags.7 OR flags.3;  (* read bits *)

Le compilateur traduit cela en masquage de bits propre avec AND/OR/décalage, sans variables auxiliaires.

Références qualifiées à 3 niveaux

<Catégorie>.<Groupe>.<Variable> accède directement aux entrées du pool, sans avoir à déclarer explicitement des GVL :

PréfixeSource
Anvil.X.YEntrée de pool avec anvilGroup="X"
Bellows.X.YEntrée de pool avec hmiGroup="X"
GVL.X.YEntrée de pool avec gvlNamespace="X"
HMI.X.YSynonyme de Bellows.X.Y

Anvil.X.Y et Bellows.X.Y peuvent indépendamment pointer vers des entrées de pool différentes — le compilateur émet des symboles C distincts dès que les adresses IEC diffèrent.

Variables localisées (AT %...)

Les variables localisées lient une déclaration à une adresse IEC :

button_raw    AT %IX0.0  : BOOL;
motor_speed   AT %QW1    : INT;
flag_persist  AT %MX10.3 : BOOL;

L’adresse est la clé primaire dans le pool — voir Format de fichier de projet.

Exemples de code

Exemple 1 — Appel de TON avec un bloc de bibliothèque

PROGRAM PLC_PRG
VAR
    start_button   AT %IX0.0  : BOOL;
    motor_run      AT %QX0.0  : BOOL;
    fbDelay        : TON;
END_VAR

fbDelay(IN := start_button, PT := T#3s);
motor_run := fbDelay.Q;
END_PROGRAM

fbDelay est une instance du FB de bibliothèque TON. Après 3 secondes de start_button maintenu, motor_run passe à TRUE.

Exemple 2 — Lecture Bellows pilotant une sortie

PROGRAM Lampen
VAR
    relay_lamp  AT %QX0.1 : BOOL;
END_VAR

(* HMI panel can write Bellows.Pfirsich.T_1 *)
relay_lamp := Bellows.Pfirsich.T_1 OR Anvil.Sensors.contact_door;
END_PROGRAM

Bellows.Pfirsich.T_1 et Anvil.Sensors.contact_door sont des références à 3 niveaux que le compilateur résout sans déclaration de GVL — à condition que les deux tags soient gardés dans le pool d’adresses et que l’export HMI pour le groupe Pfirsich soit actif.

Sujets liés