# Automatisme : norme 1131-3 et GRAFCET/Techniques de programmations des GRAFCETs

Le grafcet est un langage qui permet de réaliser certaines structures algorithmiques. Nous allons les présenter maintenant même si nous avons déjà eu l’occasion d’en aborder quelques unes.

## Les structures algorithmiques de base

Les structures algorithmiques sont parfois appelées structures de contrôle. En voici quelques unes de référencées dans Wikipédia :
* séquence
* alternatives
* test si
* test si sinon
* test selon
* boucle
* saut inconditionnel
* saut conditionnel
* sous-programme
En ce qui nous concerne ici, les noms seront parfois un peu différents mais les principes sont les mêmes.

### Séquence linéaire

La séquence est la structure algorithmique de base : pour faire une certaine tâche il me faut d’abord effectuer la tâche 1 puis la tache 2... et finalement la tâche N.
La transitioon peut être inconditionnelle, il suffit de remplacer "c" par "=1". En général elle est conditionnelle et "c" représente une variable capapble de nous dire qu'ordre "A" est terminé.

### Sélection de séquence

La sémantique des séquences alternatives est probablement la plus ambigüe de toutes les structures algorithmiques.
Vous n'aurez aucun problème si vous respectez la règle :
Une sélection de séquence ne doit jamais créer de jeton. Autrement dit le jeton doit partir soit dans une branche soit dans l'autre. C'est ce que l’on appelle exclusivité.
Le principe ci-dessus exprime que le OU réalisé par le trait horizontal doit être exclusif. Cette exclusivité peut être réalisée de plusieurs manières :
* logique : vous exprimez des réceptivités qui sont exclusives
* technologique : c’est la Partie opérative qui réalise l'exclusivité. Par exemple deux capteurs de position d'un vérin (sorti et entré) sont exclusifs car un vérin ne peut être à la fois entré et sorti.
* avec priorité : c’est vous qui décidez quelle est la branche qui est prioritaire.
La compréhension de la priorité est importante car très utilisée.
La norme n'oblige pas le respect de la règle ci-dessus ce qui fait qu'elle n’est pas dans la syntaxe du grafcet. Si vous ne veillez pas au respect de cette règle, cela ne sera pas fait automatiquement.

### Saut d'étapes et reprise de séquences

Nous présentons maintenant deux structures algorithmiques différentes.
À gauche il s'agit d'un saut conditionnel, c'est-à-dire réalisé si seulement une certaine condition est vraie. À droite, il s'agit d'une boucle, ou reprise de séquence tant qu'une certaine condition n’est pas vraie.

### Séquences simultanées, séquences parallèles

Pour ceux qui connaissent un peu les langages de programmation, il s'agit d'une structure algorithmique que l’on ne peut pas faire dans les langages traditionnels. Pour être complet sur la question, disons qu'on ne peut pas le faire de manière simple, mais le parallélisme présent dans tous les systèmes d'exploitation peut naturellement être utilisé.
Dans un grafcet on utilise simplement un double trait. Il s'agit du parallélisme structural comme déjà mentionné ailleurs.
Les étapes 22 et 13 de la figure ci-dessus sont un peu particulières : elles n'ont pas d'action associée. Ce sera souvent le cas. Elles sont appelées étapes de synchronisation. Imaginons que l'étape 21 reste active une heure tandis que l'exécution des étapes 11 et 12 prend seulement cinq minutes. Une fois 12 terminée le jeton arrive en 13. Puis une fois 21 terminée le jeton arrive en 22 (55 min après). L'étape 13 permet donc d'attendre que l'action D soit terminée pour aller à la suite. Si au contraire l'action D se terminait avant l'action C, ce serait 22 qui permettrait d'attendre. Voila pourquoi elles sont appelées étapes de synchronisation.

### Macro-étapes

Une macro-étape ressemble à un appel de sous-programme.
La figure ci-dessus présente la notion de macro-étape. Les notations utilisées dépendent beaucoup des logiciels de programmation. La macro-étape à gauche peut être entièrement remplacée par son contenu à droite.

### Ressources communes - Structure d'arbitrage

Les ressources d'arbitrages sont des structures de contrôle liées au parallélisme. Dans le monde de la programmation on appelle cela l’exclusion mutuelle qui peut être réalisée à l'aide de sémaphore par exemple.
Un exemple concret sera encore une fois plus parlant qu'une grande théorie. Imaginons une double voie ferrée sur laquelle circulent deux trains en sens inverse. Si à un moment donné cette double voie se transforme en une seule voie, il est clair que ce tronçon doit être partagée entre deux trains arrivant de sens contraires. C'est cela que l’on appelle une ressource commune : une ressource ne pouvant pas être partagée (sous peine d'accident ou de casse).
Comme le montre la figure ci-dessus, il existe plusieurs façon de partager une ressource commune : soit directement avec des réceptivités adaptées (à gauche), soit en utilisant une étape symbolisant la ressource à droite. La ressource est notée comme action dans cette figure mais ce n’est pas forcément le cas !
Dans la technique utilisé en partie droite de la figure ci-dessus, nous n'avons pas dessiné le mécanisme permettant d'amener un jeton dans l'étape 10. Un moyen est de transformer cette étape 10 en étape initiale. Un autre moyen est d’utiliser une transition non dessinée...

## Le forçage dans les GRAFCETs

Le forçage consiste à donner la possibilité aux grafcets de s'arrêter (figeage) ou de se mettre dans un état particulier (forçage).

### Hiérarchie de grafcets

Dès que l’on s'intéresse au forçage, il nous faut :
* considérer plusieurs grafcets et les nommer
* définir une hiérarchie sur les grafcets
La hiérarchie est très importante car en cas de forçage car il nous faut respecter la règle suivante :
Les seuls grafcets qui ont le droit de forcer un grafcet donné doivent se trouver plus haut dans la hiérarchie.
Cette règle simple est destinée à éviter les interblocages.

### Les forçages

Les noms des grafcets ne sont pas choisis au hasard en principe. Nous n'allons pas les présenter tous, il faut mieux les découvrir au fur et à mesure, mais nous avons besoin de quelques noms pour la suite :
* GPN Grafcet de Production Normale : c’est le grafcet qui est destiné à réaliser les pièces demandées
* GC : Grafcet de Conduite. c’est un grafcet destiné à gérer les différentes phases : mise en production, production, ...
* GS : Grafcet de Sécurité. C'est le grafcet destiné à gérer les arrêts d'urgence,...
Puisqu'on a parlé de hiérarchie tout à l’heure, GC est toujours plus haut dans la hiérarchie que GPN : c’est GC qui décide quand lancer GPN.
Commentons et expliquons maintenant la figure ci-contre.
Lorsque l’étape 2 est active, le GRAFCET nommé GPN est forcé dans la situation caractérisée par l’activité de l’étape 10 (l’étape 10 est activée et les autres étapes sont désactivées). Notons que tant qu’il y a un jeton dans l'étape 2, le grafcet GPN reste figé dans l'étape 2 !
Lorsque l’étape 20 est active, le GRAFCET nommé GC est forcé dans la situation caractérisée par l’activité des étapes 30 et 35 (les étapes 30 et 35 sont activées et les autres étapes sont désactivées).
Lorsque l’étape 25 est active, le GRAFCET nommé GPN est forcé dans la situation où il se trouve à l’instant du forçage. On appelle également cet ordre « figeage ».
Lorsque l’étape 22 est active, le GRAFCET nommé GPN est forcé dans la situation vide. Dans ce cas aucune de ses étapes n’est active.
Lorsque l’étape 34 est active, le GRAFCET nommé G4 est forcé dans la situation dans laquelle seules ses étapes initiales sont actives.
Tous les outils de programmation ne proposent pas forcément la possibilité de dessiner des actions de forçages ou de figeages. Si vous avez conçu votre programme avec ces actions, il est important de pouvoir les implanter. C'est ce que nous allons examiner maintenant.

#### Les équations de récurrences du forçage

Cela se fait facilement en remarquant qu'un forçage fonctionne de la même manière qu'une initialisation, à savoir : certaines étapes sont forcées activées d'autres sont forcées désactivées. Pour une initialisation on utilisait une entrée (ou bit interne) appelé "Init" et le principe général était :
* rajouter un + Init à l'équation de récurrence pour les étapes (initiales) à activer
* rajouter un ./Init à l'équation de récurrence pour les étapes à désactiver.
On peut garder ce même principe pour le forçage mais "Init" sera remplacé par la variable d'étape qui force. Tout cela complique un peu les équations de récurrences d'autant qu’il faudra garder les deux, l'initialisation et le forçage. Quand vous écrivez vos équations, introduisez la partie "Init" en dernier car c’est le plus prioritaire.
On peut travailler de manière plus subtile sur les équations de récurrence :
* $AC_{i}$ est remplacé par $AC'_{i}=AC_{i}+$Forçage pour étape à forcer activée
* $D_{i}$ est remplacé par $D'_{i}=D_{i}+$Forçage pour étape à forcer déactivée
Mais pour bien faire il faut vérifier qu'une même étape en cas de forçage ne sera pas à la fois activée et désactivée car dans ce cas l'étape sera activée (conformément à la norme) ce qui peut poser problème.
Cette remarque nous montre que la multiplication globale de l'équation de récurrence par /Forçage résout tous les problèmes de priorité. Cependant s'il y a beaucoup de forçage cela complique vraiment les équations et c’est à ce moment là qu’il faudra chercher s'il n'y a pas des choses à faire sur simplement les $D_{i}$.

#### Les équations de récurrences du figeage

Les choses sont peut être moins intuitives ici. L’idée est de travailler sur les $D_{i}$ en les modifiant pour qu'un figeage le rende nul. Par exemple si l'étape 10 d'un grafcet (appelé GMM) fige un grafcet (appelé GPN), alors tous les $D_{i}$ de GPN sont à remplacer par :
$D'_{i}=D_{i}\cdot {\overline {X10}}$
| Transitions, Actions et temps | Le langage IL de la norme 1131-3 |