Cours:TPS 2103 Grafcet

De troyesGEII
Aller à : navigation, rechercher

Ex 6: POUR ALLER PLUS LOIN : lien avec l'automatisme

Les GRAFCETs abordés en automatisme (Module M2102) peuvent être transformés en équations de récurrences puis en programmes.

Équation de récurrences

La méthode simple consiste à écrire pour chacune des étapes les conditions d'activations (notées Échec d'analyse (L’exécutable <code>texvc</code> est introuvable. Lisez math/README pour le configurer.): AC_i ) et les conditions de désactivations (notées Échec d'analyse (L’exécutable <code>texvc</code> est introuvable. Lisez math/README pour le configurer.): D_i ).

Définition

La condition d'activation Échec d'analyse (L’exécutable <code>texvc</code> est introuvable. Lisez math/README pour le configurer.): AC_i s'obtient en se posant la question : comment activer l'étape i si elle n'est pas active ?

La condition de désactivation s'obtient quant à elle en se posant la question : quelles sont les conditions nécessaires pour que le jeton quitte l'étape i s'il est dedans ?

Transformation en équations de récurrences

Avec ces conditions on va pouvoir former les équations de récurrences :

  • Pour la ou les étapes initiales : Échec d'analyse (L’exécutable <code>texvc</code> est introuvable. Lisez math/README pour le configurer.): x_i^+=AC_i + \overline{D_i} \cdot x_i + Init
  • Pour les étapes non initiales : Échec d'analyse (L’exécutable <code>texvc</code> est introuvable. Lisez math/README pour le configurer.): x_i^+=(AC_i + \overline{D_i} \cdot x_i) \cdot \overline{Init}

L'entrée "Init" sera abandonnée dans toute cette section !

L'indice i parcourant toutes les étapes, il y a autant d'équations de récurrences que d'étapes. En terme matériel, cela signifie que l'on utilisera un bit mémoire par étape. Pour nous on utilisera une variable (de type char) par étape, ce qui est un énorme gaspillage ! mais simplifie la programmation.

Bien sûr, un codage des états (abordé ICI) permet de faire des économies de ce côté là mais rappelez-vous qu'à ce point on a que des étapes et pas encore des états.

Grafcet d'exemple

Nous allons partir d'un GRAFCET assez général pour réaliser un exemple complet.

Prenez un peu de temps pour relire l'équation de AC1 et celle de D3 qui prennent en compte le parallélisme. C'est le seul type de situation qui diffère du Logique séquentielle : Description par graphe d'état.

Trouvez l'erreur dans l'équation de récurrence x4+.

Transformation en programme

Un programme gérant un GRAFCET devra comporter trois parties :

  • une partie pour gérer (et éventuellement calculer) les entrées (temporisées ou pas)
  • une partie pour gérer les équations de récurrences
  • une partie pour gérer les actions

Le tout est dans une boucle infinie

Exemple correspondant au GRAFCET ci-dessus

Les LEDs du shield IUT Troyes sont couplés à l'arduino MEGA2560. Une lecture de son schéma fait apparaître la correspondance :

Numéro f5 f4 f3 f2 f1 f0 p1 p0
Couleur r o v r o v v r
Arduino Pin 13 12 11 10 9 8 7 6
Port UNO PB5 PB4 PB3 PB2 PB1 PB0 PD7 PD6
Port MEGA2560 PB7 PB6 PB5 PB4 PH6 PH5 PH4 PH3
Etape de GRAFCET 1 2 3 4 5 - - -

Le code donné ci-dessous est pour la carte MEGA2560. Il devra être adapté par vos soins pour la carte UNO.

Voici le code correspondant :

//*********** Programme pour MEGA2560 ********************
char x1; // étape 1
void setup(){
  //******* sorties
  DDRB |= 0xF0;//f5 f4 f2 f1
  DDRH |= 0x40;// f0
  //******* entrees
  DDRE &= 0xCF; // 2 and 3
  DDRF &= 0xFC; //A0 et A1 
  //******* initialisation du GRAFCET
  x1 = 1;
}
void loop(){
  char e1,e2,e3,e4;
  static char x2,x3,x4,x5;
  char xf1,xf2,xf3,xf4,xf5; // f pour futur remplace le +
  //******* calcul des entrées
  if (PINE & 0x20) e1 = 1; else e1 = 0; // 2:Bas gauche
  if (PINE & 0x10) e2 = 1; else e2 = 0; // 3:Haut gauche
  if (PINF & 0x02) e3 = 0; else e3 = 1; // A0:bas droite
  if (PINF & 0x01) e4 = 0; else e4 = 1; // A1:Haut droite
  //******* calcul des equations de récurrence
  xf1 = x3 & x5 & e4 | x1 & !e1;
  xf2 = x1 & e1 | x2 & !e2;  
  xf3 = x2 & e2 | x3 & !(e4 & x5);
  xf4 = x1 & e1 | x4 & ! e3;
  xf5 = x4 & e3 | x5 & !(e4 & x3);
  // mise à jour du present avec le futur
  x1 = xf1;
  x2 = xf2;
  x3 = xf3;
  x4 = xf4;
  x5 = xf5;
  //******* calcul des sorties (pour MEGA2560)
  if (x1) PORTB |= (1<<PB7); else PORTB &= ~(1<<PB7);
  if (x2) PORTB |= (1<<PB6); else PORTB &= ~(1<<PB6);
  if (x3) PORTB |= (1<<PB5); else PORTB &= ~(1<<PB5);
  if (x4) PORTB |= (1<<PB4); else PORTB &= ~(1<<PB4);
  if (x5) PORTH |= (1<<PH6); else PORTH &= ~(1<<PH6);
  delay(500);
}

La partie calcul des entrées sera mieux comprise avec les informations suivantes :

Bouton Position Arduino Pin Port MEGA2560 Résistance de tirage Niveau logique si bouton appuyé
A Bas Gauche 2 PE4 Pull Up + inverseur 1
D Haut Gauche 3 PE5 Pull Up + inverseur 1
B Bas Droite A0 PF0 Pull Down + inverseur 0
C Haut Droite A1 PF1 Pull Down + inverseur 0

La documentation correspondante pour votre carte UNO est disponible ICI.

Travail à faire

Question.jpg Modifier le programme précédent pour :

  • l'adapter à votre carte UNO. Pourquoi x1 est une variable globale ?
  • que l'arrivée dans l'étape 5 fasse clignoter la LED correspondante
  • que l'arrivée dans l'étape 3 fasse clignoter la LED correspondante à une autre fréquence
  • que la transition e1 soit sur front montant (sans utiliser d'interruption)
  • que la transition e1 soit sur front montant (en utilisant une interruption)