le 12-09-2016 06:19 AM
Bonjour,
J'ai trouvé un vi dans les exemples > Boucles et Structures > Abandon de boucle cadencée.
Je souhaiterais savoir comment faire pour que la boucle s'arrete soit en cliquant sur le bouton "Abandonner la boucle cadendée" de la face-avant comme c'est prévu dans l'exemple, soit lorsque la boucle a fait 3 itérations par exemple.
De plus, je n'arrive pas à comprendre à quoi correspond dans la boucle cadencée, la partie à gauche "Raison du réveil"
A quoi cela sert?
Comment le modifier?
Merci d'avance pour votre aide.
Résolu ! Accéder à la solution.
le 12-09-2016 06:27 AM
Bonjour,
En fait le champ "raison du réveil" t'indique la condition qui a généré le lancement de l'itération de la boucle.
Plusieurs cas sont possible :
- Abandon généré par la requête du même nom
- Timeout : Temps d'attente dépassé
- Erreur rencontré sur l'horloge de synchro
- Fréquence de travail normal
Ce champ va donc te servir par exemple, lorsque du génère un abandon de ta boucle cadencée, tu ne veux pas forcément que son code s'exécute à ce moment là, il te suffit donc de mettre un case, dans lequel tu gères l'arrêt de ta boucle par abandon.
Ce champs est en lecture "seule", tu ne peux pas le piloter directement, c''est tes actions sur la boucle qui vont déterminé son état (vitesse de synchro, cpu de synchro, abandon, timeout,....).
J'espère que ces explications te permettent de mieux cerner son utilisation.
Cdt,
Michael
le 12-09-2016 06:50 AM
Merci pour ta réponse mais je ne comprends pas mieux.
Oui le champ de la face avant "raison du reveil" m'indique la condition qui a arreté la boucle.
Ce que je ne comprends pas c'est dans le diagramme, le cadre bleu a gauche "raison du reveil" dans la boucle cadencée.
Comment l'éditer? Comment est il "relié" à la structure évenement ?
Désolé mais c'est pas facile à comprendre...
le 12-09-2016 06:56 AM
En fait, la nuance dans l'abandon des boucles cadencées, est que tu n'arrêtes pas la boucle comme un "STOP" du vi, ce n'est pas une sortie réelle de la boucle.
Cela correspond à deux étapes, un trigger sur ta boucle cadencée pour la sortir du sommeil (Attente de l'horloge), et la sortie de la boucle comme sur un changement d'état du terminal. Et donc ta raison du réveil va changer par rapport à l'évènement qui déclence cette itération (trig horloge, ou event user).
Donc l'aspect qui est compliqué, c'est de se dire que tu abandonnes la boucle, mais que la sortie se faire à l'itération I+1.
le 12-09-2016 07:35 AM
Merci encore mais je ne comprends toujours pas.
C'est plus des questions pratiques que je me pose que la compréhension complète du code.
Peux tu répondre à cela :
Comment l'éditer?
Comment est il "relié" à la structure évenement ?
Merci
le 12-09-2016 07:51 AM
le 12-09-2016 07:59 AM
Oui je sais bien Michael et je t'en remercie mais j'arrive pas à comprendre le lien entre la boucle cadencée et la structure évenement, mise à part que les 2 sont reliés en entrée par le champ "Example Time loop"
le
12-09-2016
08:24 AM
- dernière modification le
05-14-2025
08:57 AM
par
Content Cleaner
Ces deux liens pourraient peut être aider à ta compréhension
12-12-2016 03:40 AM - modifié 12-12-2016 04:07 AM
Merci pour les liens.
Je vais prendre un exemple cela sera peut etre plus facile:
Je réalise une acquisition d'un inclino en continu par visa, les données renvoyées sont stockées dans un buffer.
Toutes les x secondes, je récupère les 10 dernières lignes de ce buffer, je calcule les angles correspondants, fais la moyenne et l'affiche dans un graph.
J'arrive à faire cela avec une boucle for pour le traitement toutes les x secondes. C'est pas très propre mais cela fonctionne bien. cf vi inclino boucle for
Mon problème, c'est que si x secondes à attendre est important, lorsque je quitte l'acquisition, mon programme attend les x secondes avant de se fermer.
J'ai donc modifié cette boucle for par une boucle while et une machine d'état (3 états: Traitement des 10 dernières lignes du buffer pour faire la moyenne/ temporisation/ arret). Je peux donc arreter ma boucle while avant la fin de la temporisation cf inclino boucle while tempo
Sauf que les données du buffer ne sont plus lues... J'ai toujours en entrée de ma boucle while un buffer vide et je ne peux pas calculer mon angle. Je ne comprends pas pourquoi.
Comment faire pour avoir le comportement du vi avec la boucle for mais que je puisse stopper la temporisation ?
C'est pour cela que je regardais l'exemple "abandon de boucle cadencée" mais je ne comprends toujours pas l'exemple donné...
Pouvez-vous m'aider?
Merci
le 12-12-2016 04:23 AM
J'ai pas encore regardé ton code, mais en regardant la capture "nclino boucle while tempo.png", je peux déjà te dire le problème pour ta boucle de traitement.
Comme tu as mis l'initialisation "Traitement" dans la boucle while principale, tu réinitialises toujours ta boucle "while" secondaire à cette valeur à chaque itération.
Pour que ton "init" fonctionne correctement, tu dois la réalisé à l'extérieure de ta boucle principale avec un registre à décalage supplémentaire.