Séquence évènement-Arrêt boucle while interne.

Bonjour,
J'ai une séquence évènement lancé par le changement d'état d'un  bouton "Marche".
Dans cette séquence évènement une boucle While est démarrée et trace des données sur un graph  .
A partir de ce moment LV ne rend pas la main pour une autre action comme l'arrêt par  "Stop" .
Peux t'on arrêter cette boucle while ? Si oui, comment ?
Merci
Cordialement.
Pièces jointes :
Essai1.vi ‏13 KB

Je suis d’accord avec Rodéric L, tu n’utilises pas la structure évènementiel correctement. Le but est effectivement de programmer des détections d’actions, principalement utilisateur. Le code doit pouvoir réagir rapidement, pour que l’IHM soit réactive, par exemple si appui sur un bouton stop…
Dans ton cas, l’IHM se bloque car lorsque tu programmes un évènement (édition de l’évènement) par défaut il y a une option « bloque l’IHM tant que le code dans l’évènement n’est pas terminé » (je n’ai pas LV ouvert alors je n’ai pas le texte exacte), mais c’est en bas à gauche dans l’édition de l’évènement.
Par exemple si tu programmes un évènement sans code mais juste avec un wait de 10 minutes, ton IHM sera bloquée pendant 10 minutes. Par contre si tu désactives l'option d'attendre, alors la structure évènement va exécuter le code d'attendre 10 minutes, mais tu peux toujours agir sur l'IHM, et la structure mémorise les évènements à exécuter.
Par contre je pense que tu dois pouvoir faire fonctionner ton exemple, en désactivant le blocage de l’IHM tant que l’évènement n’est pas terminé, et comme ton bouton stop est dans le même état….
>>>> Mais ton code ne sera pas évolutif et il est condamné à ne plus rien faire d’autre.
La solution réside dans une autre structure de code, par exemple de type producteur consommateur, avec comme producteur la structure évènementielle. Tu peux regarder dans les exemples de NI dans Fichier > nouveaux (je crois, je n’ai toujours pas LV d’ouvert !)
Luc Desruelle | Voir mon profil | LabVIEW Code & blog
Co-auteur livre LabVIEW : Programmation et applications
CLA : Certified LabVIEW Architect / Certifié Architecte LabVIEW
CLD : Certified LabVIEW Developer / Certifié Développeur LabVIEW

Similar Messages

  • Arrêter boucle while pour appeler un VI

    Bonjour,
    Je rencontre un problème pour l'appel d'un VI. En effet j'ai deux boucles while, une servant à configurer mon port COM  (plusieurs configurations sont disponibles via un enum) et l'autre servant à appeler le VI souhaité.
    Comment faire pour pouvoir appeler le VI ?
    Ci-joint une image de mon diagramme, et sinon mon VI est "Interface_HM"
    Cdt
    Résolu !
    Accéder à la solution.
    Pièces jointes :
    PASTEC 1.0.zip ‏524 KB
    Interface_HM.JPG ‏56 KB

    Bonjour aznnath11,
    D’après l’image que vous m’avez envoyez, je pense qu’il y a un souci au niveau de la programmation.
    La deuxième boucle ne s’exécutera seulement lorsque la première aura finie de s’exécutée.
    En effet le principe de flux de donnée di qu’Un nœud du diagramme s'exécute lorsqu'il a reçu toutes ses entrées de données. Ors la condition d’arrêt de la première boucle ne passe jamais à vrai et donc ne s’arrêtera jamais.
    Pour que deux boucles s’exécutent en parallèles et communiquent entre elles, il faut utiliser une communication Asynchrone.
    Je vous propose donc de consulter cette vidéo de 20 minutes et notamment les parties sur les boucles maître/esclave et  producteur/consommateur
    http://www.ni.com/webcast/1102/fr/
    Je vous souhaite une bonne journée,
    Cordialement,
    Sabri JATLAOUI - Certified LabVIEW Developer

  • Stopper plusieurs boucle while dans une structure évènement

    Bonjour.
    Je gère actuellement l'acquisition de données sous LabVIEW et ai mis en place une structure évènementielle.
    Mon programme possède 6 fonctionnalités principales correspondant à 6 boutons :
    - paramètres de sécurité
    - étalonnage des capteurs
    - paramètres de l'essai
    - quitter le programme
    - démarrer l'essai
    - arrêt de l'essai
    Jusqu'à présent, les 5 premières fonctionnalités s'exécutent à merveille.
    Le problème réside dans l'interruption du code (sans le quitter attention !!) lors de l'appui du bouton "arreter essai".
    Lors de l'appui du bouton démarrer, 5 boucles while s'exécutent simultanément (soit dans l'évènement "Demarrer Essais : value change").
    J'ai tenté de relier chaque condition d'arrêt de ces boucles à la variable locale "Arreter Essais" (cf. ex ici http://forums.ni.com/t5/Discussions-de-produit-de-NI/Quitter-une-boucle-While-dans-une-structure-Eve... post n°7/9).
    Le programme semble alors bien s'interrompre... mais repart de plus belle sans que je ne sache pourquoi :/
    Autre test : relier les conditions d'arrêt à une variable globale prenant la valeur vraie dans l'évènement "Arreter essais : value change", là encore échec cuisant.
    Je vous joint une imprécran d'une des 5 boucles while en question, afin d'illustrer peut-être de meilleure manière mon problème.
    Si vous avez une piste de résolution du problème, n'hésitez surtout pas.
    Pour finir, je travaille sous LabVIEW 8.6.1
    Merci d'avance.
    Arnaud
    Attachments:
    Boucle WHILE d'affichage sur le graphe.png ‏29 KB

    Duplicate
    Flo
    Open Diagram First

  • Mettre boucle While en pause/ structure séquence

    Bonjour,
    Actuellement en stage il m'a été demandé de développer une interface LabVIEW en vue du pilotage d'une alimentation triphasé.
    Pour l'instant la majeure partie de mon programme fonctionne mais je me heurte à un problème. Il m'a été aussi demandé que mon programme récupère les informations de mesure provenant de l'alimentation. Cette partie fonctionne également à une exception près : si l'on appuie sur un bouton alors que la commande Write de mesure est en exécution (commande TST dans mon VI), une autre commande sera alors transmise au générateur et la fonction READ ne lira plus de mesure et le VI affichera une erreur de TimeOut. Je cherche donc depuis 2 jours une solution qui me permettrait de mettre la boucle While de mesure en pause en cas d'appuie sur un bouton lors d'une mesure et la reprendre a la fin d'un temps donné.
    Je vous fournie un exemplaire de mon VI afin que cela paraisse plus clair (PS : Je suis sur LabVIEW 2009).
    Je vous remercie d'avance de votre réponse.
    Cordialement.
    Résolu !
    Accéder à la solution.
    Pièces jointes :
    VI.vi ‏55 KB

    Je vous remercie beaucoup de vos réponse. J'ai utilsé vos amélioration et idée et je pense que en théorie ça devrait marcher mais avant d'entamer les tests sur l'alimentation je suis confronté à un nouveau problème : j'ai ajouté des onglets qui devrait me permettre de passer d'un type de langage de commande à un autre. Pour gérer le changement d'onglet j'ai utilisé une structure condition avec une boucle While et une structure évènement. Sur le papier l'idée me paraissait bonne mais après test l'interface se bloque lors du premier changement. La faute est due à la structure évènement qui bloque sur changement d'onglet : valeur changé. Si vous connaissez une alternative à cette solution je vous serez très reconnaissant si vous pouviez me la faire connaitre.
    En vous remerciant par avance.
    Pièces jointes :
    FGV style Visa(1).vi ‏22 KB
    ELGAR TEST 2.vi ‏86 KB

  • Arrêt forcé d'une boucle while

    Bonjour,
    Est-il possible d'arrêter une boucle while avant la fin de l'exécution de la boucle ou avant la fin du temps d'attente ?
    Exemple si je programme un temps de cycle de 5 secondes ou plus (quelques minutes), et que j'appuie sur le bouton stop de la boucle j'observe alors une tempo de 5 s (ou plus) avant l'arrêt de la boucle.
    Merci.

    Oui, c'est possible. Vous pouvez remplacer la fonction d'attente avec une structure de gestion des évenements avec un timeout correspondant.
    J'attache un example.
    Paolo
    LV 7.0, 7.1, 8.0.1, 2011
    Attachments:
    Example.vi ‏18 KB

  • Arrêt une boucle While

    Bonjour,
    Pourriez-vous me donner des infos pour arrêter une boucle while ci-joint le vi. Merci par avance  
    Résolu !
    Accéder à la solution.
    Pièces jointes :
    VGL.lvlib ‏2 KB
    Test-de ProducerConsumerDataNI.vi ‏51 KB

    Bonjour,
    Le problème de non arrêt est provoqué du fait que votre 2eme boucle attendra un élément de la file d'attente qui n'arrive pas car la première boucle est déjà arrêtée.
    Mais plusieurs problème subsiste dans votre programme puisque vous utilisez une file d'attente pour envoyer vos résultat d'acquisition mais vous n'utiliser pas cette file d'attente pour enregistrer vos données. La file d'attente avec une constante chaine vide ne sert à rien ?
    N'oubliez pas que le test de votre variable globale est faite en meme temps que l'attente d'un élément dans la file d'attente, donc elle est lue avant qu'il y est la possibilité d'avoir un élément dans cette file et donc comme vous n'avez configuré aucun time out sur cette fonction elle attendra indéfiniment un élément qui ne viendra jamais.
    Vous pouvez observer le phénomène après avoir appuyé sur le bouton stop, passez sur votre diagramme et animez l'exécution, votre 2éme boucle est bloquée sur "supprimer le premier élément d'une file d'attente"
    Cordialement
    Greg S.
    CNRS
    LV 7.1 8.2 8.6 2009 2011 2012 2013
    LPMC - CNRS
    N'oubliez pas de complimenter cela fait toujours plaisir.

  • Arrêter une boucle FOR dans une boucle While

    Bonjour à tous, 
    J'ai une boucle while me permettant de faire une acquisition de température et en même temps, exécuter des commandes en fonction des sections.. 
    Néanmoins une fois toutes mes sections exécutées à partir de mon fichier ini, l'execution recommence. 
    Ce que je ne souhaite pas.. 
    Auriez-vous une solution ?
    Résolu !
    Accéder à la solution.
    Pièces jointes :
    Mode _Auto_Cluster.vi ‏124 KB

    TiTou a écrit : Tu comptes finir un jour ce blog post?
    Je ne sais pas... j'ai commencé en LV2010, et en 2012 des "choses" ont été modifiées par le "process" NI qui gére les templates. Le principe de départ reste le même, mais avec quelques modification sur le specpage, et surtout le postcopy. Je travaille parfois, à mes heures perdues, tardivement dessus. Mais je voudrai faire beaucoup plus via le gestionnaire custom, donc il y a du travail, hors j'ai pas beaucoup d'heures perdues!!!
    TiTou a écrit : Vous avez des templates de projets personnalisés chez Mesulog?
    oui nous avons, 2 modèles de projet, réalisés suivant
    Partie 1/3 : Créer des modèles de projet personnalisés avec le gestionnaire de projet LabVIEW - Pour...
    et distribué aujourd'hui suivant le gestionnaire "standard" de NI
    Partie 2/3 : Distribuer des modèles de projet personnalisés avec le gestionnaire de projet LabVIEW -...
    il reste donc "quelques opérations manuels", surtout concernant le build, et du renommage de vi, comme le main et fichier ini.
    TiTou a écrit : On a un framework chez QMT et j'aimerai le distribuer sous forme de package VIPM et pour ça j'aimerai d'abord l'intégrer au templates gérés par LabVIEW.
    J'avais proposé pour les rencontres LUGE, users group de la région, de discuter de cela. Mais pas beaucoup de retour. Les personnes étaient plus intéressées par une présentation sur les techniques de programmation LabVIEW que par les projets...
    Si cela intéresse d'autres personnes...
    Sinon nous pourrions réflechir à une journée technique MESULOG - SAPHIR - QUALIMATEST...
    @+
    Luc Desruelle | Voir mon profil | LabVIEW Code & blog
    Co-auteur livre LabVIEW : Programmation et applications
    CLA : Certified LabVIEW Architect / Certifié Architecte LabVIEW
    CLD : Certified LabVIEW Developer / Certifié Développeur LabVIEW

  • Déclencher un évènement unique dans un While

    Bonjour à tous,
    Voici mon problème : Dans mon vi, j'effectue une remontée de données de manière cyclique selon un pas d'échantillonnage à l'aide d'une boucle while qui contient deux séquences. Cependant j'aimerais générer un évènement unique (l'envoi d'un e-mail) selon un booléen (dépassement d'un certain seuil sur les mesures). Jusqu'à présent nous avons réussi à envoyer le mail, mais il s'envoie à chaque itération de boucle... Comment pourrions nous adapter notre vi afin d'envoyer un mail unique ?
    Je vous joins une capture du VI en question :
    Ne faites pas attention aux éventuelles erreurs (je ne suis pas sur la machine sur laquelle je développe, il manque donc des Sous-vi). Aussi, la fonction envoyer un email appartient normalement à une boucle if qui s'éxécute tant que le booléen est vrai (ce qui est le cas tant que la valeur dépasse le seuil...), on aimerait donc pouvoir envoyer un seul mail si possible.

    placer "envoyer email" dans une structure condition.
    utiliser un registre à décalage (booléen) qui mémorisera la 1ere action "envoyer",
    et qui interdira cette même action lors des itérations suivantes.
    ce serait bien aussi de supprimer la structure "séquencse empillées"

  • Problème boucle while bouton

    bonjour,
    je voudrais arrêter une boucle while quand un bouton  change de valeur ( qu'il soit sur on ou off peu importe , juste qu'il change de valeur) et je ne sais pas comment faire.
    Pouvez-vous m'aider ?
     Meri d'avance !!
    Julie

    Bonjour,
    Je vois plusieurs possibilités pour résoudre ton problème :
    - Tu peux mettre une structure d'évènement qui détectera ton changement de valeur (après configuration de ta structure bien sûr)
    - Tu peux également mettre un registre à décalage sur ta boucle While afin de détecter une différence entre ton bouton et le retour du registre...
    Bastien

  • Ecriture sur fichier sans boucle while

    Bonjour,
    J'ai créé un vi d'enregistrement de données qui ne comporte pas de boucle while, le but étant de pouvoir éxécuter d'autres fonctions durant cet enregistrement. Il se compose en plusieurs sous-vi et fonctionne de la manière suivante:
    1- Récupération de deux entrées analogiques (effectué en permanence pour affichage sur graphe),
    2- Au top, création d'un tableau 1D comprenant: heure / Analog Input 1 / Analog Input 2, puis insertion de ces lignes 1D dans un tableau 2D (et ce jusqu'au second top).
    3- Au second top, ecriture de ce tableau 2D dans un fichier tableur.
    Le programme fonctionne bien mais mon problème réside dans le fait que je ne peux pas gérer ma fréquence d'enregistrement, même en insérant une horloge d'échantillonnage dans la lecture de mes analog inputs.
    Savez-vous d'où vient le problème?
    Je vous remercie par avance de vos réponses.

    Bonjour,
    Quel type de matériel utilisez-vous ? Quelle type de fichier écrivez-vous ?
    Ceci étant, d'après votre description, la seule façon que vous avez de "cadencer" l'écriture dans votre fichier dans votre cas précis, est la fréquence du second top. Pour cadencer votre enregistrement, il faut l'intégrer dans une boucle qui à ce que cette boucle ne s'exécute qu'une fois. Utilisez alors la fonction "attendre en ms" plutôt que la fonction "attendre un multiple de milliseconde" pour se faire.
    N'hésitez pas à nous contacter pour toute demande ou renseignement complémentaire.
    Bien cordialement,
    Yannick.
    Yannick D.
    National Instruments France
    #adMrkt{text-align: center;font-size:11px; font-weight: bold;} #adMrkt a {text-decoration: none;} #adMrkt a:hover{font-size: 9px;} #adMrkt a span{display: none;} #adMrkt a:hover span{display: block;}
    >> Du 30 juin au 25 août, embarquez pour 2 mois de vidéo-t'chat ! Prenez place pour un voyage au coe...

  • Ralentissement boucle while

    Bonjour à tous,
    Dans le cadre d'une application, j'ai besoin d'envoyer un notificateur toutes les 50 ms - de façon très précise. La marge d'erreur acceptée est de 1ms, le temps entre deux notificateurs envoyés ne doit donc pas dépasser 51 ms.
    J'ai tout simplement placé l'envoi du notificateur dans une boucle While cadencée à 50 ms ; je me suis aperçue de plusieurs retards (certaines itérations prennent jusqu'à 300 ms !) 
    J'ai donc enlevé les notificateurs de ma boucle afin de la faire tourner (vide) et de mesurer le temps des itérations ; je me suis aperçue que de façon aléatoire, certaines itérations dépassaient le temps de cadencement (52 ms jusqu'à 150 ms).
    J'ai donc remplacé ma boucle While par une structure While cadencée mais là, même problème (quoique moins fréquent) : certaines itérations prennent beaucoup de temps, et dépassent les 50 ms, alors que la boucle est vide et que rien ne s'éxécute !
    Je ne comprends pas d'où vient ce problème : limites LabVIEW / Windows ?
    Il est impératif, pour l'application, que l'envoi de ces notificateurs s'effectue à une fréquence très précise.
    En PJ un VI très simple (while cadencée et mesure du temps de boucle, si une itération est  supérieure à 51 ms : on allume un booléen).
    Merci,

    Bonjour D1431,
    Tel que décrit, je pense que ton problème vient bien du fait que Windows n'est pas un OS temps-réel. Globalement, il suffit que pour une raison ou une autre Windows décide d'allouer des ressources à une autre tâche plus prioritaire, et ton cadencement est fichue.
    Je ne suis donc pas sûr que tu puisses atteindre ton objectif sans cible temps-réel. D'autres sauront sûrement mieux te renseigner que moi

  • Redemarrer une boucle while

    Bonjour a tous !
    J'aimerais savoir comment faire pour relancer une boucle while. Je m'explique : quand la boucle est lancee, on peut creer un bouton stop tout simple pour l'arreter. Seulement, existe t'il un moyen tout aussi simple de faire s'executer une nouvelle fois cette boucle ?
    L'idee est de pouvoir simplement : lancer le trace d'un graphe a partir d'une DAQ, pouvoir l'arreter (en gardant la courbe a l'ecran), puis de le relancer (et de rafraichir le graph a partir de rien).
    Je vous remercie d'avance pour votre aide.
    ps : desole pour l'absence d'accents mais il n'y en a pas sur un clavier allemand :/

    Tu me conseilles donc de creer une structure event, selectionnee par un bouleen ou enum, dans laquelle il y aura : un etat ou le graphique affiche les donnees, un deuxieme etat ''pause'' ou rien ne sera relie au graphique, et un troisieme etat avec une constante ''null'' reliee au noeud de propriete history data pour avoir une sorte de clear chart ?
    Regarde les exemples qu'on trouve sur le web 
    Le concept c'est d'utiliser l'Enum pour faire discuter de ce qu'on veut faire : initialiser, acquérir, attendre l'appui sur un bouton... et on discture de ça dans une structure condition.
    Le plus propre est de laisser une seule structure event qui est dans l'étape où on attends une interaction de l'utilisateur (avec plusieurs structures event on risque de bloquer l'interface par mégarde, donc surtout à éviter).
    Edit : plusieurs intérêts :
    on rend le code arbitrairement séquentiel : on se sait ce qui se passe dans quel ordre,
    on peut s'arranger pour que le code ne prenne qu'un seul écran : plus facile à lire/maintenir,
    on a le flux d'erreur toujours accessible si on le fait passer via un registre à décalage dans la boucle while,
    on peut ranger les données dans un cluster : on évite le diagramme spaghetti en ne sortant que ce dont on a besoin pour l'étape du calcul,
    on met toutes les interactions utilisateurs à un seul endroit (structure événement) : plus facile à gérer et maintenir (et on évite le bug d'une structure événement qui bloque la face avant en attendant un événement, empêchant une autre structure d'interagir).

  • Problème arrêt boucle esclave

    Bonjour,
    Je rencontre un problème pour l'arrêt de ma boucle esclave. Pourtant, j'ai 3 boucles while avec un booléen et des varaibles locales pour arrêter ces boucles.
    Néanmoins, dans une boucle esclave, j'ai une tempo, et celle-ci doit être terminée pour que mon programme s'arrête.
    Or, je cherche à arrêter mon programme instantanément ou presque ( quelques secondes au maximum ).
    Ci-joint une image pour comprendre mon problème et mon VI.
    Résolu !
    Accéder à la solution.
    Pièces jointes :
    Mode _Auto_Cluster.vi ‏151 KB
    Erreur_arrêt.JPG ‏142 KB

    Je comprends mieux votre explication comme cela, oui cela pourrait fonctionner mais dans mon VI, ce n'est pas un temps d'attente de 60 secondes.
    Le 60 sert à convertir en min, le temps d'attente correspond donc au temps du palier (temporisation) multiplié par le 60.
    J'ai testé avec une structure event mais le programme se bloque.
    Donc, soit il faudrait un nouveau moyen pour la temporisation ou un moyen d'arrêter mon case même si l'attente est en cours d'execution.
    Cependant, je n'ai pas trop d'idée là-dessus..
    Pièces jointes :
    Erreur_arrêt.JPG ‏142 KB

  • Modif de valeurs pour un sousvi dans une boucle while

    Bonjour, j'ai une question qui a surement l'air un peu idiote mais j'essaie de modifier une frequence de sinusoide en utilisant un sous vi. Ce sous vi est dans une boucle while et helas il ne prend en compte que la premiere valeur au demarrage du vi. Comment je peux modifier les vi de facons a ce que je puisse modifier la valeur de la frequence a mon gre. D'avance merci, je joins un projet exemple de ce que j'aimerais faire, merci de votre aide
    Pièces jointes :
    essai.lvproj ‏8 KB

    Bonjour,
    Vous pouvez utiliser les références pour contrôler votre sous-VI. Voici un exemple : Using Control References to Pass Access of Front Panel Controls to SubVIs
    Cordialement,
    Charlotte F. | CLAD
    National Instruments France
    #adMrkt{text-align: center;font-size:11px; font-weight: bold;} #adMrkt a {text-decoration: none;} #adMrkt a:hover{font-size: 9px;} #adMrkt a span{display: none;} #adMrkt a:hover span{display: block;}
    >> "Du 11 octobre au 17 novembre, 2 sessions en parallèle : bien démarrer - approfondir vos connais...

  • Mesure de temps dans une boucle while

    Bonjour,
    Je travaille sur une application qui doit exécuter les ligne d'un tableau contenant différent paramètre les unes après les autres.
    Il faudrait que la boucle While se stoppe quand le temps passer dans la boucle est égale au paramètre de temps contenu dans le tableau. C'est pour la partie mesure du temps dans la boucle que je galère.
    Si quelqu'un a des idées, merci d'avance.

    Bonjour,
    Excusez moi mais j'ai un peu de mal à comprendre votre problème.
    J'ai essayé de faire un test que je vous envoie en pièce jointe.
    Ici j'ai initialisé mon tableau et chaque itération de boucle se fait au bout de 1 sec.
    Etant donné que la seule donnée logique de mon tableau initialisé se trouve à la ligne n ou je met n (attention le tableau commence à l'indice 0) alors je sortirai de la boucle ou bout de n+1 sec.
    J'espère que ce VI répondra à votre question, sinon, n'hésitez pas à revenir vers nous et à nous donner plus d'informations.
    Cordialement.
    Pierre Denis
    National Instrument
    Pierre_D
    National Instruments France
    #adMrkt{text-align: center;font-size:11px; font-weight: bold;} #adMrkt a {text-decoration: none;} #adMrkt a:hover{font-size: 9px;} #adMrkt a span{display: none;} #adMrkt a:hover span{display: block;}
    LabVIEW Tour
    Journées Techniques dans 10 villes en France, du 4 au 20 novembre 2014
    Attachments:
    test.vi ‏9 KB

Maybe you are looking for