Go Down

Topic: Commande automatique de groupe électrogène - machine à états et autres questions (Read 22046 times) previous topic - next topic

bricofoy

Bonjour à tous

Je suis en train de réaliser(enfin, d'essayer, en tout cas) une gestion automatique de groupe électrogène, qui devra permettre un démarrage du moteur sur commande externe à contact sec, commande interne par poussoir, surveiller le moteur (charge batterie, pression d'huile, température) et le couper si nécessaire et surveiller le temps de fonctionnement pour afficher un témoin "maintenance" si le délai entre entretiens est dépassé.

Il y a un certain nombre d'entrées tout ou rien permettant de lire les capteurs du moteur (pression d'huile, charge batterie, etc) et de sorties commandant des relais pour l'alimentation générale, le contact, le démarreur et le préchauffage.

Le fonctionnement général est géré par une machine à états. Le programme se compose finalement d'une boucle infinie qui effectue :
-lecture entrées
-passage par la machine à états qui détermine les sorties
-écritures sorties

Pour le moment, le programme est le suivant : (voir fichier joint)


J'aurais concernant ce code quelques questions, en particulier sur le stockage de valeurs "word" en eeprom. J'utilise  le code suivant, pour décomposer les word en deux bytes et les stocker/relire :

 
Code: (écriture) [Select]

EEPROM.write(adr_tpstotLSB,(byte)tpstot);
EEPROM.write(adr_tpstotMSB,(byte)(tpstot>>8));


pour son écriture, est-ce que la conversion (byte)valeur_en_word retourne bien comme je l'espère le byte LSB ?
et pour la seconde partie, avec une variable de type unsigned int, il ne devrait pas y avoir de problème de "sign extension" lors de >>8 ? et même si le cast (byte) retourne le byte LSB, si il y a un problème de sign extension, ça ne devrait pas interférer ?

Code: (lecture) [Select]

 tpstot = EEPROM.read(adr_tpstotMSB)<<8; //temps fonctionnement total depuis installation
 tpstot += EEPROM.read(adr_tpstotLSB);


ça, si j'ai bien compris le fonctionnement de <<, ça devrait marcher ?

le problème étant que pour le moment, le matériel n'est pas fabriqué, je peux donc difficilement tester le code en situation...

Concernant la machine à états, c'est la première fois que je me lance dans un codage de ce type, donc les remarques des gourous de la question (barbudor ? ) sont les bienvenues :)

Je donnerai bien sûr ici toutes les informations concernant les évolutions du projet, les schémas électriques, etc.




-tu savais que si tu passe le CD de windows à l'envers, tu entends une chanson satanique ?
-non, mais il y a pire : à l'endroit, ça l'installe !

barbudor

Oui, ton code de décalage devrait fonctionner.

Pour mémoire :
- l'opérateur << décale les bits vers la gauche et insère à droite des 0
   Le comportement est le même que le nombre soit signé ou non signé : le bit de poids fort est perdu (il n'y a pas conservation du signe=
   Par exemple : 0x8001 << 1 = 0x0002

- l'opérateur >> décale les bits vers la gauche mais le comportement est différent si le nombre est signé ou non :

i) Sur un nombre signé, le signe (bit de poids fort) est conservé (duppliqué)
Code: [Select]
   int a = -32765; // == 0x8003
   int b = a >> 1;
   Serial.println( b ); // renvoie -16383 == 0xC001


ii) sur un nombre non signé, un zéro est inséré sur le bit de poids fort
Code: [Select]
   unsigned int a = 32771; // == 0x8003
   unsigned int b = a >> 1;
   Serial.println( b ); // renvoie 16385 == 0x4001



Sinon, pour ce qui est des automates, bienvenue dans la secte.
Pour recevoir la bénédiction du Grand Maître, il faut donner la moitié de son stock de composants XD

Des questions ?
Barbuduino: Arduino sur Breadboard & VinciDuino: Clone Leonardo // WR703: Mini-routeur hacké // LauchPad MSP430 et Stellaris // Panda II Arduino-like .NetMF sous VisualC#
RTFC: Read That F.....g Code / RTFD: Read That F.....g Doc / RTFDS: Read That F.....g DataSheet / RTFS: Read That F.....g Schematic / Wot da ya wanna D.I.Y. today ?

fdufnews

Quote
- l'opérateur >> décale les bits vers la gauche mais le comportement est différent si le nombre est signé ou non

Le Grand Maître nous fait un petit coup de fatigue, il doit rendre 1/4 des composants qu'il a reçu

- l'opérateur >> décale les bits vers la droite mais le comportement est différent si le nombre est signé ou non

al1fch

Oui mais le Grand maïtre pourra peut etre doubler la donation initiale : une moitié pour Mealy, le reste pour Moore !! (sectes jumelles)

barbudor

Oui, oui, c'est la CSG : Contribution de Solidarité des Gurus.
Chaque Grand Maître doit reverser à sa secte mère de manière hierarchique.
Denis Ritchie nous ayant quitté l'année dernière, ca en fait une de moins à payer.
J'ai jamais cotisé à la secte de La Pomme Croquée mais je ne renie pas mon affiliation à Bill Gates : mon premier programme était sur un TRS-80 en Basic ... Microsoft !

Barbuduino: Arduino sur Breadboard & VinciDuino: Clone Leonardo // WR703: Mini-routeur hacké // LauchPad MSP430 et Stellaris // Panda II Arduino-like .NetMF sous VisualC#
RTFC: Read That F.....g Code / RTFD: Read That F.....g Doc / RTFDS: Read That F.....g DataSheet / RTFS: Read That F.....g Schematic / Wot da ya wanna D.I.Y. today ?

bricofoy


Oui, ton code de décalage devrait fonctionner.


ok pour les décalages. mais pour ce qui est du cast (byte)word, ça va bien me renvoyer l'octet de poids faible du word ?
ou faut-il employer byte(word) ? ça change quelquechose ?

Quote



Sinon, pour ce qui est des automates, bienvenue dans la secte.
Pour recevoir la bénédiction du Grand Maître, il faut donner la moitié de son stock de composants XD

Des questions ?

LOL

blague à part, tu cherches des composants en particulier ? j'ai un bon gros stock de trucs avec entre autre des 74LS***, des microcontroleurs anciens (Z80, 68000, etc)  et pas mal de composants passifs qui ne me servent pas à grand chose, si ça peut servir avant que ça tombe en désuétude...
-tu savais que si tu passe le CD de windows à l'envers, tu entends une chanson satanique ?
-non, mais il y a pire : à l'endroit, ça l'installe !

barbudor

Oui le cast (byte)word ne va prendre que l'octet de poids fort. Par exemple, il n'est pas nécessaire de faire (byte)(word & 0xFF).
Barbuduino: Arduino sur Breadboard & VinciDuino: Clone Leonardo // WR703: Mini-routeur hacké // LauchPad MSP430 et Stellaris // Panda II Arduino-like .NetMF sous VisualC#
RTFC: Read That F.....g Code / RTFD: Read That F.....g Doc / RTFDS: Read That F.....g DataSheet / RTFS: Read That F.....g Schematic / Wot da ya wanna D.I.Y. today ?

bricofoy

hu, poids fort ou faible ?

soyons clair, j'ai un doute sur ma compréhension des choses : si par exemple j'ai le word suivant :
word_A = b0011001100001111, j'ai bien 00110011 octet de poids fort, et 00001111 octet de poids faible, non ? ou c'est l'inverse ?

alors (byte)word_A == b00001111  ou b00110011 ?

je sais, j'ai du mal... et j'ai encore plus de mal avec l'hexa :P mes cours d'infos sont loin, loinnnnn.....
-tu savais que si tu passe le CD de windows à l'envers, tu entends une chanson satanique ?
-non, mais il y a pire : à l'endroit, ça l'installe !

barbudor


word_A = b0011001100001111, j'ai bien 00110011 octet de poids fort, et 00001111 octet de poids faible

Oui

Quote

alors (byte)word_A == b00001111  ou b00110011 ?

(byte)word_A == b00001111 
Barbuduino: Arduino sur Breadboard & VinciDuino: Clone Leonardo // WR703: Mini-routeur hacké // LauchPad MSP430 et Stellaris // Panda II Arduino-like .NetMF sous VisualC#
RTFC: Read That F.....g Code / RTFD: Read That F.....g Doc / RTFDS: Read That F.....g DataSheet / RTFS: Read That F.....g Schematic / Wot da ya wanna D.I.Y. today ?

bricofoy

ok, donc il y a une erreur dans ta précédente réponse :


Oui le cast (byte)word ne va prendre que l'octet de poids fort. Par exemple, il n'est pas nécessaire de faire (byte)(word & 0xFF).


il fallait lire, si j'ai bien compris, "ne va prendre que l'octet de poids faible"

j'ai bon ?
-tu savais que si tu passe le CD de windows à l'envers, tu entends une chanson satanique ?
-non, mais il y a pire : à l'endroit, ça l'installe !

barbudor

Oui, oui, tu as raison
Je suis trop fatigué
Je dis n'importe quoi

:(=>[]
Barbuduino: Arduino sur Breadboard & VinciDuino: Clone Leonardo // WR703: Mini-routeur hacké // LauchPad MSP430 et Stellaris // Panda II Arduino-like .NetMF sous VisualC#
RTFC: Read That F.....g Code / RTFD: Read That F.....g Doc / RTFDS: Read That F.....g DataSheet / RTFS: Read That F.....g Schematic / Wot da ya wanna D.I.Y. today ?

bricofoy

pas de soucis :)

je m'interroge sur l'opportunité de séparer ma machine à états en deux, une qui gère uniquement le fonctionnement du moteur, et une qui gère les entrées pour pouvoir simplifier les conditions de changement d'état.
Mais comme les deux seraient amenées à agir sur les mêmes sorties, je doute de la faisabilité de la chose. Ou alors je sépare mon registre de sorties en deux. Mais au final cela va t-il vraiment simplifier ? vu que du coup je vais me retrouver avec une machine dont les conditions de changement d'état dépendent de l'état de l'autre machine... oula non, en fait ça va pas le faire. Heu oui désolé je réfléchis en live, là
-tu savais que si tu passe le CD de windows à l'envers, tu entends une chanson satanique ?
-non, mais il y a pire : à l'endroit, ça l'installe !

bricofoy

Nouvelle version du code (en pièce jointe), nettement plus complète. Normalement la machine à états est finie, à deux ou trois correction dans les conditions près.

-tu savais que si tu passe le CD de windows à l'envers, tu entends une chanson satanique ?
-non, mais il y a pire : à l'endroit, ça l'installe !

barbudor

J'aime bien ton code : define (au lieu de variables inutiles comme dans beaucoup d'exemples Arduino), machine d'état.
C'est dommage que tu n'ai pas une syntaxe différente pour les variables, les états, .. qui rendrait le code plus lisible.
Pour la packing des bits dans le BYTE, j'aurais utilisé des décalages plutot qu'une multiplication.

Tu sautes 2 échelons direct dans la secte des Adorateurs de la Machine d'Etat :)
Barbuduino: Arduino sur Breadboard & VinciDuino: Clone Leonardo // WR703: Mini-routeur hacké // LauchPad MSP430 et Stellaris // Panda II Arduino-like .NetMF sous VisualC#
RTFC: Read That F.....g Code / RTFD: Read That F.....g Doc / RTFDS: Read That F.....g DataSheet / RTFS: Read That F.....g Schematic / Wot da ya wanna D.I.Y. today ?

bricofoy


J'aime bien ton code : define (au lieu de variables inutiles comme dans beaucoup d'exemples Arduino), machine d'état.

Merci :)
Quote

C'est dommage que tu n'ai pas une syntaxe différente pour les variables, les états, .. qui rendrait le code plus lisible.

Ben pourtant, j'ai justement essayé de faire un truc où les nom indiquent ce que ça représente, comme vet_** pour "valeur état ***", ve_** pour "valeur entrée **" etc etc

Tu verrais ça plutôt comment ?

Quote


Pour la packing des bits dans le BYTE, j'aurais utilisé des décalages plutot qu'une multiplication.


Heu, où donc ? J'utilise partout des additions, il me semble ?

Il n'y a que dans
Code: [Select]
void lecture_entrees() {
  // lecture des entrées, stockage dans une seule variable byte pour economiser de la ram et faciliter les manipulations
  entrees = ve_alim * digitalRead(e_alim);
  entrees += ve_ext * digitalRead(e_ext);
  entrees += ve_prh * digitalRead(e_prh);
  entrees += ve_run * digitalRead(e_run);
  entrees += ve_rst * digitalRead(e_rst);
  ubat = coef_ubat * analogRead(e_ubat);
  temps_courant = millis();
}


qu'il y a des multiplications, mais c'est une multiplication par 1 ou 0 de la constante à additionner ou non au registre. Donc au final, ça reste une addition :-D

Quote


Tu sautes 2 échelons direct dans la secte des Adorateurs de la Machine d'Etat :)



Ciel !  8)


Depuis que j'ai fait du grafcet au lycée et des réseaux de pétri en école d'ingé, j'aime bien les MET, au moins c'est pas (trop) le bordel dans les conditions.

Reste que pour la mise en oeuvre, j'ai comme d'habitude fait les choses à l'envers. En partant du codage "en live" au lieu de faire ma machine sur le papier avant.

Et du coup, j'ai une zone merdique autour des état et_decomp et et _demarreur, qui sont plus ou moins inter-dépendants, et mon état et_run qui regroupe en fait des sortes de sous-états puisque les sorties diffèrent selon certaines conditions...
-tu savais que si tu passe le CD de windows à l'envers, tu entends une chanson satanique ?
-non, mais il y a pire : à l'endroit, ça l'installe !

Go Up