# Automatisme : norme 1131-3 et GRAFCET/Le langage IL de la norme 1131-3

La norme CEI_61131-3 définit deux langages texte. Nous en présentons un dans ce chapitre. Il s’appelle Instructions List (à traduire par liste d'instructions) et ressemble énormément à de l’assembleur. Nous pensons cependant que son apprentissage est beaucoup plus aisé que l'apprentissage d'un assembleur. Pourquoi ? Tout simplement parce que son champ d'application n’est pas tout à fait le même, en tout cas dans ce cours d'automatisme.

## Langage IL

Le présent paragraphe définit la sémantique du langage IL (Liste d'instructions) dont la syntaxe formelle est donnée dans l'annexe B.2. de la norme. Si vous n'avez pas la norme sous les yeux, c’est pas grave on va essayer de la résumer ici.

### Les champs d'écriture des instructions

Comme l'indique le Tableau 1, une liste d'instructions est composée d'une suite d'instructions. Chaque instruction doit débuter sur une nouvelle ligne et doit contenir un opérateur accompagné de modificateurs optionnels et, si cela est nécessaire pour l'opération considérée, un ou plusieurs opérandes séparés par des virgules. Les opérandes peuvent être choisis parmi les représentations des variables en tableau 3.
L'instruction peut être précédée d'une étiquette d'identification suivie de deux points ":". s'il y a un commentaire, il doit constituer le dernier élément d'une ligne. Des lignes vides peuvent être insérées entre les instructions.

#### Tableau 1 - Exemples de champs d'instructions

    EtiquetteInstructionOpérandeCommentaire START:LD%IX1(* BOUTON POUSSOIR *) ANDN%MX5(* NON INHIBEE *) S%QX2(* MARCHE VENTILATEUR *)
Le champ étiquette n’est pas obligatoirement rempli.

### Instructions, modificateurs et opérandes

Les instructions (on parle parfois des opérateurs) standards ainsi que leurs modificateurs et opérandes autorisés doivent être tels qu'énumérés dans le tableau 3 (un peu plus loin).
Le modificateur "N" indique une négation booléenne de l'opérande.
Par exemple l'instruction ANDN %IX2 est interprétée de la manière suivante :
resultat := resultat AND NOT %IX2
Le modificateur parenthèse gauche "(" indique que l'évaluation de l'opérateur est différée jusqu'à ce qu'un opérateur parenthèse droit ")" soit rencontré ; par exemple la séquence d'instructions suivante:
doit être interprétée de la manière suivante :
resultat := resultat AND (%IX1 OR %IX2)
Le modificateur "C" indique que l'instruction donnée ne doit être exécutée que si le résultat faisant l’objet de l'évaluation en cours a la valeur booléenne 1 (ou la valeur booléenne 0 si l'opérateur est combiné avec le modificateur "N").

#### Tableau 2 - Opérateurs du langage Instructions List (p 230 de la norme)

| n$^o$ | Opérateur | Modificateur | Opérande | Sémantique |
| 1 | LD | N | Note 2 | Rendre le résultat courant égal à l'opérande |
| 2 | ST | N | Note 2 | Mémoriser le résultat à l'emplacement de l'opérande |
| 3 | S R | Note 3 Note 3 | BOOL BOOL | Positionner l'opérande booléen à 1 Remettre l'opérande booléen à 0 |
| 4 5 6 7 | AND & OR XOR | N, ( N, ( N, ( N, ( | BOOL BOOL BOOL BOOL | AND booléen AND booléen OR booléen OR exclusif booléen |
| 8 9 10 11 | ADD SUB MUL DIV | ( ( ( ( | Note 2 Note 2 Note 2 Note 2 | Addition Soustraction Multiplication Division |
| 12 13 14 15 16 17 | GT GE EQ NE LE LT | ( ( ( ( ( ( | Note 2 Note 2 Note 2 Note 2 Note 2 Note 2 | Comparaison : > Comparaison : >= Comparaison : = Comparaison : <> Comparaison : <= Comparaison : < |
| 18 19 20 | JMP CAL RET | C, N C, N C, N | LABEL NAME | Saut vers l'étiquette Appel d'un bloc fonctionnel (Note 4) Retour d'une fonction appelée ou d'un bloc fonctionnel |
| 21 | ) | | | Evaluation d'une opération différée |
| NOTES 1 Se reporter au texte précédent pour toute explication relative aux modificateurs et à l'évaluation des expressions. 2 Ces opérateurs doivent être soit surchargés soit saisis comme défini en 2.5.1.4. Le résultat courant et l'opérande doivent être du même type 3 Ces opérations sont effectuées si et seulement si le résultat courant a la valeur booléenne 1 4 Le nom du bloc fonctionnel est suivi par une liste d'arguments entre parenthèses, tels que définis en 3.2.3. 5 Lorsqu'une instruction JMP est contenue dans une construction ACTION...END_ACTION l'opérande doit être une étiquette à l'intérieur de la même construction |||||
ST prend l'accumulateur et le stocke dans l'opérande tandis que S (qui n'a pas de modificateur C) agit comme s'il avait un modificateur C : l'opérande sera mis à 1 si l'accumulateur est à 1.

### Opérandes

Les opérandes sont décrits dans le tableau ci-dessous.

#### Tableau 3

| n$^o$ | Préfixe | Signification |
| 1 2 3 | I Q M | Emplacement d'entrée Emplacement de sortie Emplacement de mémoire |
| 4 5 6 7 8 9 | X Aucun B W D L | Taille d'un seul bit Taille d'un seul bit Taille d'un octet (8bits) Taille d'un mot (16 bits) Taille d'un double mot (32 bits) Taille d'un mot long (Quad) (64 bits) |
| NOTES 1 Sauf déclaration contraire, le type de donnée d'une variable directement adressable, de la taille d'un "seul bit" doit être BOOL. 2 Les organismes nationaux de normalisation peuvent publier des tables de traduction de ces préfixes. |||

## Les blocs fonctionnels et les fonctions

Pour éviter toute confusion dans la terminologie, nous regroupons dans cette section les problèmes concernant les fonctions et les blocs fonctionnels. Il vous faut essayer de distinguer ces deux usages ainsi que leurs différences. Notons que les langages graphiques ou textuels permettent en général de définir des blocs fonctionnels.

### Les fonctions standards

Citons pèle mêle les fonctions standards : ADD, SUB, MUL, DIV, SHL, SHR, SEL, MUX, MAX, MIN, LIMIT (limiteur, écrêteur), GT, GE, EQ, LE, LT, NE, des fonctions de chaîne de caractères.
Les fonctions sont appelées directement en langage IL comme l'exemple ci-dessous où les fonctions appelées sont des fonctions de conversions BCD_TO_INT et INT_TO_BCD.

#### Tableau 4 – Appel de fonctions

    EtiquetteInstructionOpérandeCommentaire START:LDPoids_brut(* Poids brut *) BCD_TO_INT(* Conversion par exemple*) SUBtare(* Soustraction de la tare *) INT_TO_BCD

### Fonctions et blocs fonctionnels avec IL

Les blocs fonctionnels, tels que définis dans un autre chapitre, peuvent être lancés sous condition ou inconditionnellement à l'aide de l'opérateur CAL (Appel). Comme l'illustre le tableau 5, ce lancement peut prendre trois formes.

#### Tableau 5 - Caractéristiques du lancement de bloc fonctionnel en langage IL (p 232)

| n$^o$ | Description / exemple |
| 1 | CAL avec liste d'entrées CAL C10 (CU := %IX10, PV:=15) |
| 2 | CAL avec entrées de charge/mémoire LD 15 ST C10.PV LD %IX10 ST C10.CU CAL C10 |
| 3 | Utilisation d'opérateurs d'entrée: LD 15 PV C10 LD %IX10 CU C10 |
| NOTE - Une déclaration telle que VAR C10 : CTU; END_VAR est supposée dans les exemples ci-dessus ||
Les blocs fonctionnels doivent être déclarés comme des variables dont le type est justement le nom du bloc fonctionnel : c’est la différence avec les fonctions.

## Programmation de GRAFCETs en langage IL

Un problème à se poser est comment programmer un GRAFCET à l'aide du langage IL.
Première méthode : on utilise les équations de récurrence.
Deuxième méthode : des éléments prédefinis existent :
* construction STEP ... END_STEP ou INITIAL_STEP ... END_STEP
* construction TRANSITION ... END_TRANSITION (TRANSITION FROM et TO)
* construction ACTION ...END_ACTION
Exemples :
* en langage IL cela donne :
ou encore pour donner un exemple avec action temporisée :
* de manière équivalente en langage ST on pourrait écrire :
| Techniques de programmations des GRAFCETs | Les modes de marche et d'arrêt |