Discussions au sujet de NI LabVIEW

annuler
Affichage des résultats de 
Rechercher plutôt 
Vouliez-vous dire : 

Quitter boucles parallèles - Queue Message Handler

Résolu !
Accéder à la solution

Bonjour à tous !

Je sollicite votre aide à nouveau aujourd'hui parce que j'ai un petit soucis que je ne comprends pas ... 

Comme suggéré sur mon programme par @sabri.jatlaoui  , j'ai changé la structure global pour une structure entre Producer-Consummer et QSM et QMH . Et comme j'aime comprendre ce que je fais, j'ai tout fais tout seul sans véritablement me baser sur un template labview (je conçois que ce ne soit pas forcément la bonne methode haha mais je les ai regardé avant ) (je préviens pour les eventuels incohérence Smiley très heureux ).

J'ai donc une boucle d'acquisition+FSM qui gère les autres boucles. (affichage et écriture du fichier).
Dans cette boucle, dans l'état "Running" de la FSM, j'envoi des données aux boucles d'affichage et d'écriture du fichier.

Je peux ensuite cliquer sur stop, puis quitter, cela quitte bien les boucles sans soucis. Ca fonctionne.

 

Maintenant, si je suis dans mon état de départ "Wait-Start", @ m'avait suggéré de pouvoir quitter dès le début, j'ai donc créé un état "direct-quit" qui met fin à la boucle principal et détruit les liste d'attentes si on appui sur quitter au début (je pourrais très bien réutiliser des états mais pour le moment j'ai fais comme ça, je suis ouvert à tout), mais malheur, cela ne permet pas de quitter la boucle d'écriture de fichier ... et donc cela ne quitte pas le programme.


Je ne comprends pas vraiment pourquoi ça fait ça, j'ai pourtant relié l"'arret de la boucle d'écriture du fichier avec l'erreur de la liste d'attente de message, donc dans ma tete, je vois que la liste est vide, je la détruit, cela génère une erreur, et ça quitte la boucle d'écriture. Pourtant ce n'est pas le cas et je ne comprends pas trop pourquoi ... J'ai tenté de relié directement l'erreur à l'arret de la boucle sans passer au "travers" de la structure condition, mais rien n'a faire ...

(J'ai aussi pensé a creer un état "quitter" dans la FSM de ma boucle d'écriture de fichier et de ne pas relier l'erreur à la commande d'arret, mais j'ai peur de ne pas savoir gérer le fait que je veu écrire toutes les données avant de quitter ....). Je pense quand meme qu'il y a une solution simple à mon problème actuel Smiley très heureux

 

Du coup je pense qu'actuellement cela doit marcher plus ou moins par miracle et que je n'ai pas du tout bien comprendre dans ces listes d'attentes ...

 

En résumé :

- START+STOP+QUITTER => ça fonctionne 

- QUITTER => la boucle d'écriture ne se quitte pas 

 

Petite question bonus (j'avoue ne pas encore avoir cherché la réponse) :

Comment faire pour "regrouper les erreurs de plusieurs endroit en une erreur" ?

 

Merci beaucoup de votre aide !

Cdlt,

 

Erwan

 

 

 

Message 1 sur 12
4 926 Visites

Dans la palette, tu trouveras la fonction "fusionner les erreurs", cela te permet de cabler plusieurs fils d'erreurs, et labview ressortira la 1er erreur rencontrée, en parcourant ce "tableau" de haut en bas.

 

Cdt,
Michael

“En science, la phrase la plus excitante que l'on peut entendre, celle qui annonce des nouvelles découvertes, ce n'est pas "Eureka" mais c'est "drôle"
Isaac ASIMOV
Message 2 sur 12
4 917 Visites

Merci Michael.C ! Je vais compléter mon programme alors !

Bon après j'ai pas trouvé la solution au problème principal encore ...

0 Compliments
Message 3 sur 12
4 915 Visites

Je viens de regarder ton VI main producer.


Cable tes handles de notifier dans ton cas "initialisation", cela pourrait expliquer le pb.

Quand on fait une structure de type machine à état, selon moi, il faut proscrire le cas "valeur par défaut" si non cablé de la structure case, car cela peut vite tourner aux bugs incompréhensibles.


Cdt,

Michael


EDIT : en regarde ta face avant, tu as quelques retouches à faire sur les polices d'écritures, il y a des chevauchements sur les indicateurs.


Sinon le contraste entre ta face avant et ton graphique est un peu trop brutal à mon gout.
Enfin je pencherais plus pour tes teintes pastels, à l'usage, la teinte foncée de l'arrière plan peut être fatiguante je pense.

Sinon dernières remarques, ta face avant est très remplie, as tu penser à gérer les différentes résolutions d'écran en cas de poste multiples ?

“En science, la phrase la plus excitante que l'on peut entendre, celle qui annonce des nouvelles découvertes, ce n'est pas "Eureka" mais c'est "drôle"
Isaac ASIMOV
Message 4 sur 12
4 905 Visites

- START+STOP+QUITTER => ça fonctionne 

- QUITTER => la boucle d'écriture ne se quitte pas

 

ok ... j'ai compris.

 

1ere question : " START+STOP+QUITTER => ça fonctionne "

 

ah oui ???  START+STOP+QUITTER ... tu n'as pas une erreur "1122" quand tu essayes de quitter de cette façon ?

 

et " QUITTER (tout seul)" ... ça ne fonctionne pas (normal que cela ne fonctionne pas)

 

mais j'aimerais avoir la réponse à ma " 1ere question" avant de te montrer où ça coince.

Message 5 sur 12
4 898 Visites

J'étais justemement en train de répondre que ça ne fonctionne pas ^^ quel idiot, désolé !

j'ai bien une erreur quand je fais start-stop-quitter si je cable l'arret de la boucle comme ci-dessous !

 

bug.png

 

en revanche si je la cable "au travers" de la structure event comme j'avais fais auparavant, donc à la suite de l'erreur dequeu comme ci-dessous, la ça fonctionne.

 

bug-2.png

 

En gros, ça veut dire (si j'ai bien compris) qu'il cherche à écrire une data de plus, mais comme il n'y a plus rien, il quitte ! C'est bien comme ça qu'on doit faire (les templates semblent etre sovent construit comme ceci)? Et de la manière dont je l'ai fait précédemment (en fait je voulais tenter quelquechose et je n'ai pas recorrigé, désolé) ça ne marche pas.


La question est donc, comment astucieusement, je pourrais quitter dès le départ ... je suis en train de me dire que la seule soltion serait un nouvel état et envoyer un message quitter !

PS: Merci Michael, je dois m'absenter une petite demi-heure, je te réponds juste après !

 

0 Compliments
Message 6 sur 12
4 893 Visites

Bon, à tête reposé et après avoir formulé avec des mots le problème (je me rends compte que ça m'aide) j'ai trouvé une solution, c'est peut etre un peu bourrin mais ça semble marcher !

 

bug-corrected.png

en gros j'envoi un message DirectQuit à la boucle, qui entre dans un nouvel état DirectQuit qui recherche une data, mais comme il n'y en a pas, et bien ça génère une erreur et ça quitte.
Je pense que c'est comme ça qu'il faut faire, vu que dans les templates producer-consummer, la boucle est stoppé de cette manière mais j'ai encore du mal à concevoir que l'on arrete une boucle sur une erreur quoi, je me dis que si jamais il se produit une erreur, je ne sais pas moi, un saut de donnée avec un slot "vide", ça va quitter ...


@Michael.C

 

Par sécurité, j'ai connecté mes handles !

Merci d'avoir jeté un oeil à la face avant ! Les polices qui se chevauchent doit etre du au fait que vous ne l'avez pas, j'utilise Source sans pro et Digital-7 ! Après je n'ai toujours pas définis le nombre de chiffre significatifs necessaire ...
Pour le coté trop brutal, c'est tut simplement du au fait que sur avion c'est toujours fonds noir, enfin c'est ce style, et c'est cela qu'on m'a demandé. Enfin le style de couleur quoi !

 

"ta face avant est très remplie, as tu penser à gérer les différentes résolutions d'écran en cas de poste multiples"

Alors non, en fait comme je travail sur l'écran qui servira plus tard, un 22 pouces ... je n'ai absolument pas géré les différentes résolutions 'écran. Je croyais qu'en cochant la case correspondante dans les propriété du VI ça le gèrerai tout seul, mais ça ne fait que démolir l'UI. Donc pour "éviter" le problème j'ai décidé de ne pas le gérer mais il va falloir que je trouve le temps de le faire !

0 Compliments
Message 7 sur 12
4 889 Visites

Une bonne piste pour t'aider le jour où tu veux gérer une résolution d'écran.

L'arrangement de ta face avant de permet de scinder ta face avant en plusieurs "sous-panneaux", cela sera beaucoup plus simple à gérer, car tu peux adapter ton besoin, par exemple, tu peux privilégier l'agrandissement d'une zone par rapport à une autre,  et encore plein de possibilité.

 

http://zone.ni.com/reference/fr-XX/help/371361H-0114/lvhowto/creating_splitter_bars_and_panes/

“En science, la phrase la plus excitante que l'on peut entendre, celle qui annonce des nouvelles découvertes, ce n'est pas "Eureka" mais c'est "drôle"
Isaac ASIMOV
Message 8 sur 12
4 887 Visites
Solution
Accepté par l'auteur du sujet ErwanHut

(en vitesse, j'ai pas trop le temps)

 

yyyyyy.png

 

[edit]

ou alors utiliser ta solution précédente ... (mais alors ton flux d'erreur doit traverser la while dans les 3 cas ... le cas "initialize-default" aussi)

et de toute manière ... il faut fermer la Ref reprise sur l'image (ci-dessus)

et en réalité ...  la fonction "create all message queues" crée 3 Ref ... il faudrait les fermer toutes les 3.

[/edit]

Message 9 sur 12
4 884 Visites

Merci Michael, je regarde ça de ce pas !

 

Ouadji, alors la chapeau ... je sais pas comment tu fais pour voir que j'avais pas fermé cette référence ... je m'en étais absolument pas rendu compte !
Bon en soit, ce ne fut pas aussi simpe que ça, mais la, je crois avoir compris, trouvé une solution correcte et surtout, je viens de prendre conscience de l'importance de la gestion d'erreur !

Comme tu l'as suggéré, j'ai fermé la référence "une fois vide" à la fin de la boucle principale. Le soucis étant : dans ma boucle d'enregistrement de données, j'envoyais le message "écrire" à nouveau. En gros j'envoie le message "écrire" (qui permet de reboucler) puis je récupère un élément de la liste d'attente,et, à la fin, comme il n'y a plus d'élément, je génère une erreur qui quitte la boucle. Et donc, le programme ne se fermait jamais parce qu'il y avait toujours ce message "ecrire" dans la liste d'attente, sans que personne le lise, donc je ne pouvais pas détruire la liste.

Jme suis donc dit, si je pouvais voir qu'il n'y a plus rien PUIS envoyer le message, mais en fait ne pas l'envoyer grace à une erreur car il n'y a plus rien, ce serait le top !

( Et la j'ai repensé à mon précédent post et ces réponses "la gestion d'erreur te permet de savoir ce que tu veux faire quand tu en rencontre une" et "tout sousVI attends d'avoir toute les données pour s'executer").

 

J'ai donc cablé comme ceci : (jvais arranger le serpentin que nous fais le cable d'erreur, ne me gronde pas ouadji Smiley très heureux)bug-corrected-proper.png

 

En fin de compte ça fonctionne, et j'ai pris conscience de certaine chose ! Merci de votre aide, toujours très apréciable !

Erwan

 

Message 10 sur 12
4 874 Visites