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
Similar Messages
-
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 KBDuplicate
Flo
Open Diagram First -
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 -
Mettre en pause boucle while qui comporte une attente
Bonjour,
Je cherche à interrompre une attente qui est dans une boucle while.
A l'aide d'un bouton pause par ex. je voudrais interrompre l'attente et en enlevant la pause, reprendre l'attente où elle en était.
Merci pour vos idées.
ManuBonjour Manu,
Tu trouveras un exemple ici :
https://decibel.ni.com/content/docs/DOC-10792
Cdlmt,
Pierre
Pierre V, Application Engineer
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 -
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 KBJe 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 -
Additionner les valeurs à chaque boucle while
Bonjour,
Je cherche à simuler un niveau de carburant qui ne fait que décroitre, mais plus ou moin vite selon la consommation.
Je dispose :
- d'une masse initiale de carburant (kg) => une constante
- d'un taux de consommation (en kg.s^-1) => un slide
A l'aide d'un vumetre par exemple, je voudrais voir baisser le niveau avec le temps qui passe.
Mon idée :
- cadencer une boucle while à 1s (avec le métronome réglé à 1000 ms)
- retirer à la masse de carburant restante celle due à la consommation
etc, etc.
Je bute sur une chose, c'est sur la récupération de la nouvelle masse ; j'essaye avec un registre à décalage mais en fait je ne sais pas quoi rentrer dedans (la masse initiale va bien pour la première itération, mais pas pour les autres !)
J'espère ne pas être trop confus ; merci pour votre aide.
Gilles
Résolu !
Accéder à la solution.Bonjour Gilles,
En effet, commencer un nouveau langage peut s'avérer complexe. Je me permet de vous mettre des liens pour vous aider à gérer vos structures de répertoire et la clarté du diagramme (les bonnes pratiques ):
- repertoire Projet
- diagramme
- le coin astuces de LV
Il existe de nombreux liens sur Internet vous permettant d'apprendre à votre rythme. Je vous conseil aussi de vous référer au exemple LabVIEW (dans aide puis recherche d'exemple). Ils peuvent vous donner une base de travail et d'éventuelles nouvelles idées.
Bon courage pourla continuation.
PS: pourriez vous mettre votre topic en résolu si le VI de Ouadji vous convient (ceci aide à faire le tri quand quelqu'un cherche une information sur le forum).
Cordialement.
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 -
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). -
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 !!
JulieBonjour,
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... -
Comment changer la tension de mon générateur par une boucle while
Bonjour,
Je débute sur Labview et voici mon problème.
Une tension est rentrée manuellement sur mon générateur. Une intensité est calculée par un multimètre. Tout ceci est envoyé sur Labview qui calcul la résistance expérimentale par la loi d'Ohm. Or si la résistance expérimentale est différente de la résistance théorique (rentrée sur Labview auparavant) je veux que Labview calcul et envoie la bonne tension d'entrée pour obtenir une résistance expérimentale proche de la théorique.
Je veux donc utiliser une boucle while qui ferait : while Rth différent Rexp faire U=Rth*I
Sauf que je n'ai pas assez de connaissances sur Labview pour faire ce que j'ai souligné. Je pense que cela n'est pas très compliqué mais je ne trouve pas de tuto qui explique ceci.
Merci d'avance pour votre aideoups ... pas propre.
aligner les fils, éviter les "escaliers" (un peu partout)
les entrées et les sorties sur les "structures" ... sur les bords gauche et droit (si possible, pas au dessus, et ici cela est certainement posible)
jamais de flux de données droite-gauche ... le flux doit toujours se propager de la gauche vers la droite.
Je reviens sur votre code dès qu'il ne me fera plus mal aux yeux -
Sortie des informations "chaîne" d'une boucle While a chaque boucle
Bonjour a tous,
Je souhaiteras avoir des informations pour sortie a chaque bouclage de boucle While une "chaîne" de caractère afin de la traiter en parallèle.
J'ai réussie a récupéré la valeur à la fin de la boucle While mais pas en cour de bouclage.
Je me doute que mon code n'est forcement optimiser, j'ai débuter il y a quelque semaine
Je vous ci-joint mon code.
Merci par avance
Résolu !
Accéder à la solution.
Pièces jointes :
ma problematique.png 47 KBBonjour,
Il n'est pas possible de câbler la chaine comme vous l'avez fait. Les infos à la sortie d'une boucle ne sont dispo que lorsque la boucle a terminé son exécution. Il faut du coup soit passer par une varaible locale, une variable globale fonctionnelle, ou même mettre votre code directement dans la boucle puisqu'il traite une info qui se met à jour comme la boucle....
La boucle n'a pas de cadencement, elle s'exécute rapidement. Vous pouvez aussi récupérer en sortie un tableau de toutes les chaines traitées (ce que vous avez fait en fait), et les traiter juste derrière.
De plus, vous pouvez utiliser un registre à décalage plutôt que des variables locales dans la boucle, ce sera plus propre et plus efficace.
Francis M | Voir mon profil
Certified LabVIEW Developer -
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 -
Deux boucles while simultanée = freeze ?
Bonjour,
J'ai un probléme avec la structure de mon programme :
L'acquisition et l'enregsitrement du signal sont chacun dans une boucle, je dois pouvoir démarrer/arreter l'enregsitrement a n'importe quel moment de l'acquisition.
Seulement, un probléme de taille se pose, si je pose ces deux boucle while dans mon priogramme il se bloque et je suis obligé de redéùmarrer mon ordinateur.
Si je n'utilise qu'une seule boucle while, le programme rentre dans une boucle et n'en resort jamais !
Quelq'un peut m'aider ?
CordialementSalut à vous.
J’ai regardé le code… je suis d’accord il faut reprendre la structure, et les bases.
Pour le coup de gueule… je suis toujours réservé car nous sommes ici pour aider. Mais il faut reconnaître que l’histoire entre Reborn et Doriann est étrange ( ?!) A la lecture des éléments d’ouadji, je trouve la pratique douteuse 27 compliments pour des posts juste avec 27 questions et avec 0 réponse. Je suis gêné par la réciprocité. Certaines personnes prennent du temps pour répondre, le compliment est la façon de dire merci. Doriann a donné 4 compliments, et tous à Reborn ?! et SAMUEL_NIF & Rodéric & DavidS.& ouadji & …
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 -
Error while creating the structure
hello friends,
i have two doubts
1)
i am getting the error while creating the structure in se11.
well i am creating the structure in the following way
in component i am giving the values as bom and in component type i am giving the value as meins.
i am getting the status warning message as the below
'field name does not agree with the proposed name base_bom for bapi table'
2)
and more over can we create the structure as the follwing in se11.
component = f1 and
component type = tablename-fieldname
when i am doing in the second way i am getting the error as the following table is not active though the table is activehi guru,
just component name as --- your field name.
where as component type as give just data element k.
no need to give tablenme-fieldname k.
component component type .
f1 matnr----
data element
thanks anji.
Moderator message: please do not use SMS speak, what does that "k" mean, short for "OK"? please get your act together, these are professional forums.
Edited by: Thomas Zloch on Nov 15, 2010 9:10 AM -
Error while creating Org structure Message no. BBP_LOCATION009
Hi
Iam trying to build an SRM6.0 with backend as R/3 4.7
I have replicated the plats from back end with report BBP_LOCATIONS_GET_FROM_SYSTEM
On errors rectified the same and finally, SLG1 report shows no errors.
But still noticed that T77S0 table entry with GPID=EBP, SEMID= LMIGR is not set to X (Refer note 563180)
Due to the above problem while creating org structure when I click on Att inheritence or Extended attributes Locations tab,
I get the message:
Start program BBP_LOCATIONS_GET_ALL first (see Note 563180 and long text)
Message no. BBP_LOCATION009
Diagnosis
You tried to call a program that uses a location. The locations have not
yet been replicated.
System Response
The current program has been terminated.
Procedure
Start the program to replicate the locations. You can find more
information in SAPNet in Note .
Procedure for System Administration
You can disable this message by starting table maintenance (SM30) for
table T77S0. Change the entry EBP/LMIGR to "X". Note that the system
cannot supply certain information if the locations are not replicated.
Locations that do not exist can be deleted during attribute maintenance.are you working with multiple backend systems?
can you retry downloading the plants with the report
BBP_LOCATIONS_GET_ALL
and then give the logical sys name as yr present backend?
BR
Dinesh
Maybe you are looking for
-
HT3576 how can i verify that the network or firewall is not blocking access to port 5223.
how can i verify that the network or firewall is not blocking access to port 5223?
-
Can an Ipad 2 3G bought in US be used in Spain with a local phone company contract or is it locked to ATT or Verizon? I am buying it here in the US but will be using it primarily in Spain. Thanks
-
How to upgrade ESS/MSS SP7 to SP14
Hi Everyone, we are using ESS1.0 SP 7, MSS1.0 SP 7 in EP 7.0 SP 10 Now i want to upgrade SP 7 to SP 14 can any one tell me stepwise how to upgrade to SP 14. Thanks in Advance, vv.
-
Custom File(Eclipse Resource) Types
In FlashBuilder you can create new files of types: - ActionScript File - ActionScript Class - ActionScript Interface - etc Is there a way to create a custom file-type, so i can attach a custom template to it? in example: - File -> new -> ActionScript
-
Restricting characteristics in report issue based on movement type
Hi I have a requirement to create a report on movement that will include the userID behind the movement. In the report, when we drill down to calender day we get userID on days that there is no movement. and we would like to display the useID that th