On va implémenter le grafcet suivant, permettant d'allumer une lampe depuis un intérrupteur de type bouton poussoir.
Premier Grafcet à implémenter dans HomeIO avec c#
Définir les équations
En applications les règles vue en cours avec M. Riera, vous pouvez déterminer les équations.
Calcul des fonctions de transition
Rappel de la règle : FT1(t)=Xn−1(t−1).R1(t)
ft1=X1.↑bpft2=X2.↑bp
Calcul des étapes
Rappel de la règle : Xi(t)=FTpredi(t)+Xi(t−1).FTsucci(t)
X1=ft2+X1.ft1X2=ft1+X2.ft2
Calcul des sorties
Allumer_la_lampe=X2
Rappel du fonctionnement du cycle API
Cycle API à reproduire
Mise en place dans C#
Dans C# (ou tout autre langage de programmation), le cycle API est en fait une boucle, qui se répète, sans fin, toutes les x ms (peut dépendre de l'automate que l'on souhaiterait simuler), afin de simuler le cycle d'un API.
A l'intérieur de cette boucle, le programme doit réaliser les différentes opérations du cycle :
Sauvegarder l'état précédent
Lire les entrées
Calculer les fonctions de transitions
Calculer les étapes
Calculer les sorties
Ecrire les sorties
Quelques éléments en C#
Récupérer une entrée depuis HomeIO
L'extrait de code ci-dessous permet de récupérer l'état d'un capteur (ou d'une entrée en général) et de le sauvegarder dans une variable.
On peut procéder de manière similaire pour récupérer l'état d'une sortie, et ensuite pouvoir le modifier.
Traduction des différentes étapes du cycle
Considérons que le code ci-après se trouve dans une méthode nommée : runCycleApi()
Les extraits de code ci-après suppose que les déclarations sont effectuées. Le code ne concerne que la méthode qui est exécutée cycliquement par le timer.
Etape 1. Sauvegarde des états précédents
Etape 2. Lecture des entrées
La lecture des entrées implique de mettre à jour la memory map qui est en cache. Cette mise à jour ne se fait qu'en début de cycle pour récupérer l'état du système, et en fin de cycle pour écrire les sorties.
Etape 3. Calcul des fonctions de transition
Il est souvent nécessaire de manipuler des fronts (montant ou descendant) afin de traiter la donnée des entrées.
Le calcul d'un front montant peut se faire de la manière suivante :
Il serait très judicieux de définir une méthode pour calculer les fronts sur des exemples plus complexes
Les équations des fonctions de transition se calculent donc avec les lignes suivantes :
ft1, ft2, X1 et X2 sont des variables représentant les éléments du Grafcet. Les étapes (Xn) sont initialisées à false, sauf les étapes initiales qui doivent être à true pour pouvoir exécuter le Grafcet.
Etape 4. Calcul des étapes
La traduction des équations en C# donne :
Etape 5. Calcul des sorties
En fonction des actions associées aux étapes.
Etape 6. Mise à jour des sorties
Il faut maintenant mettre à jour HomeIo en synchronisant le cache et la memory map:
On répète le cycle
Si tout le code précédent est dans une méthode, on peut répéter ce cycle dans un time avec la méthode suivante, associée à un timer dans votre projet :
Ce timer doit se déclencher soit de manière automatique au chargement, soit sur un bouton de votre interface, au choix. Il est nécessaire d'initialiser aussi l'état du grafcet (étape initiale à vraie this.X1 = true)
bool bp = MemoryMap.Instance.GetBit(adresseDuComposant, MemoryType.Input).Value;
MemoryBit lampe = MemoryMap.Instance.GetBit(adresseDuComposant, MemoryType.Output);
//lampe contient l'adresse. Pour accéder à la valeur, il faut utiliser la propriété Value;