11-16-2017 11:07 AM - modifié 11-16-2017 11:15 AM
Bonjour à tous,
J'ouvre un nouveau post car ce nouveau problème sort du cadre (pb Port COM) de mon précédent post.
Bref, j'ai un soucis. Je n'arrive pas à arrêter mes 2 boucles While via un seul bouton Stop. J'ai essayé avec des variables locales, avec des nœud de propriété, des astuces mais rien n'y fait... A vrai dire je n'ai jamais eu vraiment besoin de faire çà mais actuellement j'en aurai besoin car je souhaite scruter un indicateur Char qui selon sa valeur enverra un émail d'alerte. Je remarque aussi qu'il n’envoie les emails que quand j'arrête (abort) mon VI. Il envois après que j'ai lancé mon laser et que j'appuie sur le OFF (bouton) et là il envois. Pourquoi ? J'aimerai que ce soit que pendant l’exécution du VI.
Le VI ci-dessous fonctionne mais si je l'applique au mien non ...
Merci d'avance pour votre aide !
Gaël,
Résolu ! Accéder à la solution.
le 11-16-2017 12:51 PM
le 11-17-2017 07:12 AM
Merci Thib !
J'arrive à arrêter les 2 boucles While et d'ailleurs mon soucis de scrutation avec envoi d'email c'est réglé aussi !
J'avoue ne pas être très familier avec les fonctions "Synchronisation" mais voilà un bon exemple de m'y mettre !
Je te remercie ! 🙂
le 11-17-2017 09:43 AM
Merci à Ouadji
le 11-17-2017 12:06 PM
@GDuBois : " J'arrive à arrêter les 2 boucles While "
tu as trouvé une solution à ton soucis ... chouette.
Mais qu'as-tu utilisé comme méthode ... et surtout, as-tu trouvé pourquoi cela ne fonctionnait pas avec une variable locale ?
Je n'aime pas trop la méthode via une locale (je préfère une fonction événementielle qui envoie une "info-stop") ... ceci dit, stopper 2 While (ou x While) via une locale sur le terminal stop, normalement, ça doit tourner aussi. Alors, c'était quoi le bug avec une locale ? (ce serait pas mal intéressant de connaître le "fond de l'histoire" avec cette locale)
le 11-18-2017 09:46 AM
J'ai tout simplement enlevé mes variables locales (sauf une dans la machine d'état) et utiliser les occurrences que Thib m'a conseillé entre mes 2 boucles While. Ce qui m'a permis de pouvoir arrêter les 2 boucles en même temps. Après des tests répétitifs avec le laser, tout répond très bien.
A vrai dire, je ne sais pas pourquoi mes 2 boucles n'étaient pas capable de s'arrêter avec une variable locale. Peut-être due à la différence de cadencement des 2 boucles ? (100ms contre 30min) ? (Je ne suis pas très à l'aise avec çà mais si tu as une explication à me donner je t'en serais gré ! 😉 )
Le VI en pièce-jointe.
11-18-2017 01:21 PM - modifié 11-18-2017 01:22 PM
Avec une variable locale, pour ton bouton "stop", il fallait utiliser "switch when pressed" et pas "switch until released".
11-18-2017 03:50 PM - modifié 11-18-2017 03:54 PM
Un peu brute comme aide ... mais je suppose que c'est pour m'améliorer ?
J'avais déjà testé avec "switch when pressed" et sa buggé. Tu as pu tester en changeant l'action mécanique sur mon VI ?
Oui mais, je souhaite éviter de croiser les fils (d'ou le droite/gauche) après je me sentirais perdu...
Que me conseilles-tu pour éviter un code sur 2 écrans ... ? des multitudes de sous-VI ?
J'ai refondu graphiquement le code, j'espère qu'il est plus rigoureux 😉
Ps : j'ai laissé une partie pour l'occurrence mais j'ai remis la variable locale avec la bonne action mécanique mais dès que je le lance j'ai l'impression d'un comportement de roue libre.
Gaël,
11-18-2017 04:32 PM - modifié 11-18-2017 04:36 PM
Oui, perso j'ai testé avec ton paramétrage d'origine du bouton "stop", c.a.d. positionné en "switch until released", et effectivement la boucle du dessus stoppe, mais pas celle du dessous .... ce comportement est normal avec "switch until released". Quand tu positionne ton bouton stop en switch-until-released", ton booléen "stop" passe à "1" jusqu'à ce que tu le relâches ... et le contenu de la variable locale associée suis cette même séquence. Simulation .... tu appuies 1sec sur ton bouton stop ... en ce qui concerne la boucle du dessus, c'est une structure Event, aucun soucis la structure a capté l'événement, tu te retrouves dans ta structure case, en code "5", la while supérieure stoppe. Mais ... que fait la structure while du bas ? elle passe 99,9% de son temps dans la tempo (ton ancien code). Quand elle a fini sa tempo, elle boucle et lit "enfin" la variable locale ... qui est repassée à "0" depuis longtemps vu que tu a relâchés le bouton stop. Avec switch-when-pressed", tu "mémorises" ton action. Perso, chez moi, avec switch-when-pressed", et des variables locales ... (j'aime pas) mais ça tourne.
En ce qui concerne ton dernier code, c'est sympa avec une Occurrence ... mais je ferais 2 modifs.
a) pas de variable locale dans le code "5" (structure case) ... mais plus simplement un "true".
b) j'utiliserais la sortie de la fonction "wait on occurrence" pour gérer le stop ... pas de locale ici non plus.
comme ceci :
Et bravo, effectivement, ton dernier code est déjà beaucoup plus propre.
Super aussi pour les Noeuds qui ont rejoints le flux de données.
PS: pour éviter d'avoir un code sur plusieurs écrans
oui, des sous-VIs ... tu peux avoir un code sur plusieurs écrans (le minimum, pas 36) mais alors jamais dans les deux dimensions ... uniquement à l'horizontale c'est préférable.
11-18-2017 04:38 PM - modifié 11-18-2017 04:40 PM
@GDuBois : " dès que je le lance, j'ai l'impression d'un comportement de roue libre."
? ... que veux-tu dire par là ?