un peu de réflexion …
Je vous propose aujourd’hui de faire tourner un peu votre cervelle. Pendant un cours d’automatismes, il m’est venu une idée. On a tenté de remplacer un bout de grafcet par un programme en C. Moi j’y ai vu un nouvel automate, mais j’ai (pour le moment) la flemme de développer pour voir ce que ça pourrait donner.
Le reste du post explique ma vision, si vous avez compris ce préambule et que vous avez envie de lire la suite, je vous y invite, sinon, je ne dis pas que vous devez pas lire, mais j’ai bien peur que cela ne vous passionne guère ….
Posons tout d’abord les faits.
Le grafcet doit être suivi à la lettre, pour éviter les erreurs. En somme, on a les étapes et les transitions. On ne franchit une transition que si elle est vraie et que l’étape juste avant est active.
On se décide de se placer dans la programmation en C.
Sur un automate, le grafcet fonctionne en boucle, donc une fois qu’il est allumé, il fonctionne. On peut noter une évolution dans le système :
- On initialise les grafcets
- On récupère l’état des entrées
- On calcule les transitions (si elle sont franchissables ou pas)
- On désactive les étapes qui ne sont plus nécessaires
- On active les nouvelles étapes
- On reboucle en 2
On ne traitera pas ici la gestion des entrées ni celle des sorties. On considèrera que l’on récupère et que l’on envoie les valeurs via 2 méthodes : get_inputs() et set_outputs().
Concrètement, on peut y voir un semblant de main() :
void main(void) { initialisation(); while(1) { get_inputs(); check_transitions(); check_steps(); set_outputs(); } }
En C, un while(1) fera boucler indéfiniment le programme.
Considérons donc que l’on créé un grafcet (virtuellement) linéaire (pas de séparation en ET/OU).
On peut donc avoir une suite d’étapes et de transitions associées.
On va prendre 2 tableaux en C, l’un nommé t et l’autre s (transitions et étapes).
Notons l’étape 0 -> s[0] et t[0] la transition permettant de passer de l’étape 0 à l’étape 1 (s[1]).
On peut considérer l’étape i et sa transition associée, on a :
if (s[i] && t[i]) { s[i+1] = 1; }
puis, dans une seconde boucle :
if (s[i] && t[i]) { s[i] = 0; }
0 est compris comme false par le C (et le php) et 1 pour true.
On respecte la règle du grafcet qui indique que on active l’étape suivante et on désactive l’étape précédente .
On va compliquer un peu la chose avec les divergences et convergences.
Pour les divergences en OU, une étape renvoie vers au moins 2 transitions, l’une seule est active ou toutes. (et elles doivent donc toutes êtres franchies)
Pour les divergences en ET, une transition renvoie vers au moins 2 étapes, elles doivent être là aussi toutes actives.
On notera au passage qu’un grafcet linéaire (en ligne) n’est qu’un cas particulier d’un grafcet avec divergences et convergences.
Là on arrive au blocage du C. En effet, ici prendre le C++ et définir des objet serait plus interressant et plus judicieux …
Je me penche un peu plus sur le problème et vous tiens au courant, ça va m’occuper jusqu’au week end.
le 13 mars 2008 vers 22:12,
fab a déclaré ceci
bon pour faire rire ceux qui passeraient par là, je sèche à mon propre problème.
Je cherche une solution encore ce soir sinon demain je mail un brouillon à mon prof. Je squatte tableaux et pointeurs.
le 15 mars 2008 vers 18:00,
HajaTiana a déclaré ceci
Tagué!!!
P.S. : je comprends le C, mais je ne le parle plus, désolée
le 15 mars 2008 vers 23:11,
fab a déclaré ceci
j’ai vu pour le tag, j’ai commencé ce matin mais je finirai le post demain ou lundi à mon bon vouloir ;p