Bonjour,
Je développe un logiciel (Windows) d'initiation à la pratique des automates programmables avec un simulateur simplifié. Il permet notamment de réaliser des grafcet et d'en tester le fonctionnement.
Dans la dernière version, j'ai ajouté un convertisseur qui traduit le programme en code Arduino. J'ai fait quelques tests avec Tinkercad (je n'ai pas d'Arduino), ça a l'air de marcher. Le fonctionnement sous Tinkercad est par contre extrêmement lent … (?)
Si ça peut être utile à certains, je serais intéressé par un retour sur le modèle d'Arduino, la rapidité d'exécution, les bugs éventuels…
Merci.
Le lien : Apimou
ça ressemble à du Windows, je ne peux pas tester (suis sur Mac).
pouvez vous poster un code généré pour Arduino, histoire de voir à quoi ça ressemble - ça donnera peut-être des idées pour expliquer la lenteur perçue
Je n'ai pas bien compris ce qu'il faut faire, je ne vois que des exécutables, et pas de code Arduino.
Mais le problème est philosophique. Si je prend l'ascenseur, que je l'implante dans 'arduino, comment je peux le tester, la partie opérative qui étati sur l'écran du PC n'y est plus?
Si on veut faire du grafcet sur Arduino, il suffit de faire une librairie sur l'arduino
Je pense que son idée est d’envoyer des ordres à l’arduino par un canal série et peut être de récupérer des infos de capteurs et utiliser la partie PC pour l’affichage (outre la génération du code correspondant pour l’arduino).
Bonjour,
J'ai dû mal m'exprimer. Le logiciel ne fait que traduire un (ou des) grafcet(s) quelconque(s) en code arduino, c'est tout. Il n'y a aucune communication avec l'arduino. Bon, ce n'est peut-être pas très utile.
Le problème de lenteur avec Tinkercad n'existe pas avec UnoArduSim, donc c'est OK.
Si ça peut servir à générer une machine à etat fonctionnelle, pourquoi pas.
Comment gérez vous les signaux en entrées ?
Bonjour,
Il n'y a pas de switch dans le traitement. C'est une traduction systématique de grafcet(s) en équations logiques, c'est tout. Donc on dessine la ou les séquence(s) qu'on veut avec les constructions qu'on veut (séquences uniques, sélections de séquences, séquences simultanées), des tempos et des compteurs si besoin, on clique sur un bouton et ça génère le code correspondant.
Donc par exemple on dessine ça dans l'éditeur :
On définit l'affectation des broches :
On clique sur le bouton Créer le sketch et ça génère ce code :
//Entrees
bool I[3];
const byte i0 = 2;
const byte i1 = 3;
const byte i2 = 4;
//Sorties
bool O[3];
const byte q1 = 5;
const byte q2 = 6;
const byte q3 = 7;
//Etapes
bool X[4];
//Transitions
bool T[4];
void setup() {
// Configuration des broches (entrees)
pinMode(i0, INPUT_PULLUP);
pinMode(i1, INPUT_PULLUP);
pinMode(i2, INPUT_PULLUP);
// Configuration des broches (sorties)
pinMode(q1, OUTPUT);
pinMode(q2, OUTPUT);
pinMode(q3, OUTPUT);
// Initialisation du grafcet
X[0] = true;
X[1] = false;
X[2] = false;
X[3] = false;
}
void loop() {
// Acquisition des entrees
I[0] = !digitalRead(i0);
I[1] = !digitalRead(i1);
I[2] = !digitalRead(i2);
//Traitement des transitions
T[0] = X[0] && (I[0]);
T[1] = X[2] && (I[1] && !(I[2]));
T[2] = X[3] && (!(I[1]));
T[3] = X[1] && X[2] && (I[1] && I[2]);
//Traitement des etapes
X[0] = X[0] && !T[0] || T[3];
X[1] = X[1] && !T[3] || T[0];
X[2] = X[2] && !T[1] && !T[3] || T[0] || T[2];
X[3] = X[3] && !T[2] || T[1];
//Traitement des sorties
O[0] = X[1];
O[1] = X[2];
O[2] = X[3];
// Ecriture des sorties
digitalWrite(q1, O[0]);
digitalWrite(q2, O[1]);
digitalWrite(q3, O[2]);
}
Ce genre de truc existe pour le Ladder (par exemple Waltech Ladder Maker). Là c'est un peu le même esprit, en moins abouti (pas de compilation, pas d'upload, pas de com avec l'Arduino, ) mais c'est pour du grafcet (ou SFC).
OK - oui pas de raison que ça pédale lentement alors !
dans l'absolu je suis partisan de respecter le "types conceptuels", on ne passe pas true ou false à la fonction digitalWrite() mais HIGH ou LOW.
Sur ce principe, il serait mieux de générer un truc du genre
// Acquisition des entrees
I[0] = (digitalRead(i0) == LOW);
ou encore
// Ecriture des sorties
digitalWrite(q1, O[0] ? HIGH : LOW);
Outre la satisfaction morale de respecter les concepts, il se peut que dans le futur HIGH et LOW deviennent un vrai type (d'un enum) et procéder de la sorte évitera des erreurs de compilation.
Bonjour,
ça ne me rajeunis pas ce genre de chose...
https://github.com/jfs59/delphi-prog/blob/main/Sans%20titre%201.jpg
simulateur de fonctionnement GRAFCET du simple au complexe certaines règles ont été volontairement omisses ou simplifiée mais ça respecte a plus de 90%.
il était prévu de brancher une interface ou un système réel sur ce programme mais il y a plus de 20 ans c’était moins réalisable qu’aujourd’hui.
a noter que ce programme a été utilisé par des élèves de collèges en visite aussi bien que par des BTS a un niveau différent.
si ca peut donner des idées a l'époque déjà ça ne ramait pas donc maintenant ça passe sur tout pc educ nat!
un élève de bac était capable d'écrire un programme de gestion d'embouteillage minimaliste.
ensuite il fallait passer a un niveau de réflexion supérieur mais pas insurmontable pour les meilleurs.
le programme est sur le github



