Académique Documents
Professionnel Documents
Culture Documents
Le Grafcet est un manière de représenter un automatisme, très utilisée dans le monde francophone.
Il diffère des graphes d'état par la terminologie utilisée et sur un point fondamental :
– Les termes utilisée sont un peu différents: on parle d'étapes et non d'état. La condition d'une
transition s'appellent la réceptivité. Lorsque qu'une étape donnée peut être suivie soit d'une
étape, soit d'une autre, on parle de divergence en OU.
– Mais de manière plus fondamentale, alors qu'une machine d'état ne peut avoir qu'un seul état
actif à un instant donné, plusieurs étapes d'un Grafcet peuvent être actives en même temps.
En effet, le concept de divergence en ET permet l'activation de plusieurs étapes par le
franchissement d'une transition.
Le but de cette fiche n'est pas de présenter la théorie des Grafcet, le lecteur se réfèrera à l'un des
nombreux documents pédagogiques qu'on trouve sur Internet à ce sujet. Le but est simplement de
présenter une technique simple permettant de « traduire » un Grafcet en un programme C, en vue de
l'exécuter sur un microcontrôleur.
Voici le squelette d'un programme permettant d'implémenter un Grafcet:
#include <MSP430G2553.h>
#define MaxEtapes 10 // nombre maximal d'étapes
#define MaxTransitions 10 // nombre maximal de transitions
char Etapes[MaxEtapes]; // Variables des étapes, vrai si une étape est active
char Transitions[MaxTransitions]; // vrai si la transition est franchissable
void InitIO() { // Initialisation des entrées et sorties
PxREN...|=(Bit...); ...
PxDIR...|=(Bit...); ...
}
void LitEntrees() { // Lecture des entrées
if(!(Pin...&(Bit...))) ...=1; else ...=0; ...
}
void CalculeTransitions() { // Recherche des transitions franchissables
Transitions[x]=Etapes[y] && Receptivite; ...
}
void DesactiveEtapes() { // Désactive les étapes précédant les transitions franchissables
if (Transitions[x]) Etapes[y]=0; ...
}
void ActiveEtapes() { // Active les étapes suivant les transitions franchissables
if (Transitions[x]) { Etapes[z]=1; } ...
}
void AffecteSorties () { // Gère les sorties en fonction des étapes actives
SortieX=Etapes[x]; ...
if(SortieX)Port...|=(Bit...); else Port...&=~(Bit...); ...
}
int main () { // Programme principal
InitIO();
int i; for (i=0; i<MaxEtapes; i++) Etapes[i]=0;
Etapes[0]=1; // Activation de l'étape initiale
while (1) { // boucle infinie
AffecteSorties();
LitEntrees();
CalculeTransitions();
DesactiveEtapes();
ActiveEtapes();
}
}
Le tableau Etapes[] est constitué d'une variable booléenne pour chaque étape du Grafcet. Chaque
étape peut être inactive (valeur nulle) ou active (valeur non nulle). Au début du programme, seule
l'étape initiale est activée.
De même, le tableau Transitions[] indique pour chaque transition si elle est non-franchissable
(valeur nulle) ou franchissable (valeur non nulle).
Pour un problème aussi simple, cette méthode peut sembler bien compliquée ! Son avantage est
qu'elle consiste simplement à suivre systématiquement chaque élément du Grafcet. Elle se prête
donc bien à des Grafcet complexe. On peut facilement lui ajouter des temporisations.