Comment crée une boucle qui ce répète le même nombre de fois que le nombre d'impultions que reçoit l'entrée compteur de ma carte NI USB-6009 ?

Bonjour à tous,
Je cherche à relever la tension aux bornes d'un capteur en fonction de la position de celui-ci donc en fonction du nombre de pas du moteur qui le déplace.
Pour celà je cherche comment créer une boucle qui ce répète le même nombre de fois que le nombre d'impultions que reçoit l'entrée compteur de ma carte NI USB-6009.
Le problème c'est que lorsque j'utilise pour cela une boucle while, la mesure ce fait en continue même si je n'ai aucune impulsion sur mon compteur (que le moteur ne tourne pas).
Alors que je voudrais que la mesure ne se fasse que quand me moteur tourne et s'arrete lorsque qu'il s'arrete.
Je suis vraiment débutant avec LabView j'ai donc beaucoup de peine malgré plusieurs heures d'essai infructueux.
Ci-joint le .VI actuel.
Merci d'avance à tous pour votre temps et votre aide.
Cordialement,
Alpine13
Attachments:
Presque.vi ‏166 KB

Bonjour Alpine 13,
Pour créer une boucle qui ce répète le même nombre de fois que le nombre d'impultions de compteur, il faut utiliser le boucle "for" qui prend les impulsion de votre compteur comme l'entrée.Je vous suggère de commencer avec un simple exemple. Regardez l'exemple suivant:
LabVIEW >> Help >> Find Examples >> Hardware Input and Output >> DAQmx >> Counter Measurements >> Count Digital Events >> Count Digital Events.vi
Vous pouvez modifier cet exemple, de façon suivant. Mettez un boucle "for" dans le boucle "while" et branchez le sortie "Data" dans le nombre d'itérations de votre boucle "for", de cette façon votre boucle "for" va executer  le même nombre de fois que le nombre d'impultions de votre compteur. Aussi pour devenir plus à l'aise avec la programmation LabVIEW,  je vous recommande les articles suivants:
Learn 10 Functions in NI-DAQmx and Handle 80 Percent of Your Data Acquisition Applications
Getting Started with NI-DAQmx: Main Page
Synchronize Encoder Counter Input and Analog Input
Mikhail
RF Toolkits, Product Support Engineer
National Instruments

Similar Messages

  • Quelle est le courant maximum que peux fournir une sortie numérique de la Carte NI USB-6009?

    Bonjours,
    je voulais savoir qu'elle peut être le courant maximum que peux fournir une sortie numérique sans l'endommager de la carte NI USB-6009. 
    Cordialement.
    theolamache

    Salut :
    https://www.google.fr/search?q=NI+USB-6009
    Premier PDF que tu trouves, page 22/30, avec ça tu devrais pouvoir
    en déduire la puissance maximale d'une sortie numérique.
    De toute façon c'est l'appareil qui est le facteur limitant, en général
    c'est pas lui qui va flancher, c'est simplement qu'il ne fournira pas
    assez de courant pour faire fonctionner ton appareil.
    Il faut penser à un étage d'alimentation piloté par commande
    numérique (genre triristor) si tu veux plus de puissance. La
    commande numérique est juste là pour pouvoir piloter ce
    genre de composant, pas plus.
    David Koch

  • Comment dans un évènement exécuter une boucle qui s'arrête avec un bouton stop?

    Je travaille sous LabVIEW 7.1.
    Sur l'exemple "Wave file payer" dans le répertoire E/S/sons, dans l'évènement [2] PLAY une boucle while s'exécute. A l'intérieur de cette boucle while des booléens stop et pause peuvent ête lus.
    Lorsque je crée un diagramme similaire, pendant l'exécution de la boucle while tout la face avant est inaccessible. Le programme se bloque sur la boucle while puisque le bouton stop l'arrêtant est inaccessible.
    Que manque-t-il à mon code?
    Merci.

    Comme je le pensais, c'est un "petit truc à savoir"
    En faisant un clic droit sur la structure Event, on peut aller dant "Edit event handled by this case..."
    Dans cette fenetre, en bas il faut décocher l'option "lock front panel until the event case for this event completes"... cette option parle d'elle même pour peut qu'on y prête attention et qu'on comprenne l'anglais
    J'espère que cela résoudra tes problèmes.
    When my feet touch the ground each morning the devil thinks "bloody hell... He's up again!"

  • Comment sortir d'une boucle

    Bonjour,
    comment je peux sortir d'une boucle while dans mon vi.
    dans "controle du moteur.vi" je dois changer la vitesse de rotation. vu que j'ai besoin d'une vitese qui soit variable, j'ai utiliser le vi pulse widith modulation. le problème c que dans ce vi je ne peux pas sortir de la boucle while tant que je n'ai pas appuyé sur stop.
    comment je dois faire pour que à chaque fois que je change la vitesse dans "controle du moteur.vi" automatiquement la fréquence change.
    Attachments:
    biblio.llb ‏911 KB

    Bonjour Salima,
    Je ne sais pas ci vous avez resous votre problem mais je vais asseyez. Je sais ce que vous voulez faire avec votre program. Le problem est que le subVI que vous utilizer (Pulse Width Modulator Revised.vi) a un boucle (loop) qui ne sort pas excepte quand le "Stop" est appuyer. Alors dans votre program principal (Control du Moteur.vi) vous finiras jamais le premier boucle parceque le program sera toujours entrains de finir le subVI Pulse Width Modulator Revised.
    La meilleur facons de resoudre ce problem c'est d'utilizer des "Global Variable". Pour apprendre comment utilizer global variables vous pouvez regarder les example qui viens avec LabVIEW. Alors dans votre program principal vous pouvez changer la frequence du moteur qui change le
    global variable qui change la frequence pendans que le subVI fonctionne. Vous devez aussi changer le proprete (property) du subVI pour que la boucle principal n'attend pas que le subVI finis avend quel la boucle tourne a la prochaine boucle (next iteration). Dans cette facon, vous pouvez controller les controles sur le subVI qui cours pendant que votre program principal cours.
    Vous devez excuser mons francais. J'espere que ca vous aide un peu. Bonjour.
    Ron

  • Comment créer une source de cadencement à 1MHz dans une boucle cadencée?

    Comment créer une source de cadencement à 1MHz dans une boucle cadencée?

    Bonjour Julie,
    Je ne comprends pas très bien votre question.
    Tout d'abord, à l'avenir, préférez recréer votre propre post sur le forum, celui-ci datant de 2006, vous pouvez être quasiment sûr que les gens qui y ont participé ne sont plus aussi disponible pour vous répondre.
    D'autre part, le module 8451, qui gère la communication SPI peut gérer des horloges jusqu'à 12MHz, je ne vois pas où est votre problème d'horloge à 1MHz.
    Le problème qui se posait dans le poste d'origine était d'avoir une boucle logicielle qui allait à plus d'1MHz, ce qui est très dur et qui demande du matériel particulier. C'est déjà une limite quasiment inatteignable avec un environnement RT, et il faudra plutot se tourner vers de la technologie FPGA.
    En revanche, si votre besoin est de gérer une comm SPI à 1MHz, vous pouvez très bien avoir le module 8451 qui fait le codage et décodage SPI, et votre programme qui lui tourne à quelques ms pour récupérer ou envoyer de nouvelles données sur le bus!
    J'espère vous avoir éclairé!
    Cordialement,
    Olivier L. | Certified LabVIEW Developer

  • 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 aide

    oups ... 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  

  • Comment créer une collection dynamique qui filtre les photos sans titre?

    Comment créer une collection dynamique qui filtre les photos sans titre?
    Il faudrait un critère de recherche vide, existe-il ? genre <vide>

    Comment créer une collection dynamique qui filtre les photos sans titre?
    Il faudrait un critère de recherche vide, existe-il ? genre <vide>

  • 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...

  • Problème de fonctionne​ment de Vi d'exemple avec USB-6009

    Novice sur cet outil que je viens de recevoir, je commence par utiliser les vi exemple pour générer et mesurer une donnée
    par exemple celui ci dessous :
    Cont Gen Voltage Wfm-Int Clk-On-Board Regeneration.vi
    J'ai mis type cadence d'échantillonage "On demand" sinon erreur
    Puis après lancement j'ai le message d'erreur suivant dans le sous vi
    Waveform Buffer Generation (multi).vi
    "L'erreur -200452 s'est produite à : Nœud de propriété DAQmx Timing (arg 1) dans Waveform Buffer Generation (multi).vi->Cont Gen Voltage Wfm-Int Clk-On-Board Regeneration.vi
    Raisons possibles :
    La propriété spécifiée n'est pas supportée par le périphérique ou ne s'applique pas à cette tâche.
    Propriété: HorlÉchant.Fréq
    Nom de tâche : _unnamedTask<20>
    Comme je n'ai touché à rien et que je suppose que les exemples sont bons, est ce que quelqu'un saurait quels infos il me manque pour faire tourné correctement la carte que j'ai testé et qui fonctionne bien

    Bonjour,
    Comme vous avez pu le constater le VI Waveform Buffer Generation (multi).vi qui s'occupe de créer le buffer pour la génération de vos signaux permet de configurer DAQmx et notamment le cadencement de la sortie. Or bien qu'en mettant la propriété à "On Demand" celui-ci essaye de régler la fréquence d'échantillonnage à une certaine valeur, ce qui est impossible avec le matériel USB 6009 qui ne supporte que le cadencement logiciel.
    Il vous faudra alors modifier l'exemple dans sa totalité si vous souhaitez avoir une génération de signaux "quasi" identique. Mais cet exemple n'étant pas fait pour ce matériel, je doute du résultat.
    En vous souhaitant une bonne journée.
    Cordialement,

  • 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).

  • Benchmark d'une boucle

    Bonjour,
    La question est peut-être bête, mais je n'arrive pas pour le moment à avoir ce que je veux.
    La voici : "Comment mesurer le temps d'une itération dans une boucle ?"
    Je sais faire ça avec une structure séquence en plaçant des compteurs d'impulsions avant et après une itération, mais le probème est que ce genre de compteurs donne un résultat en milliseconde. Comment faire si l'on va plus vite ?
    Je pense que chaque itération de ma boucle à une durée d'exécution de l'ordre de quelques microsecondes,
    Y a t'il une solution pour mesurer une itération précisément ? Dois-je par exemple mesurer mon temps sur 1000 itérations et faire une bête division par la suite (je ne trouve pas ça très élégant si c'est la seule solution :/)
    Merci d'avance.
    Solved!
    Go to Solution.

    Bonjour Cyco,
    Tout d'abord merci d'avoir posté sur le forum National Instruments.
    Il existe dans LabVIEW un compteur plus précis que le compteur classique qui se nomme "High Resolution Relative Seconds.vi". Il n'est pas présent sur la palette de base, mais se trouve dans le dossier C:\Program Files\National Instruments\LabVIEW 2010\vi.lib\Utility\
    Vous trouverez ici un lien vers un forum plein d'astuces sur LabVIEW. Les premiers posts parlent de ce vi, snippet à l'appui.
    Bien cordialement,
    Audrey_P
    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;}
    Journées techniques : des fondamentaux aux dernières technologies pour la mesure et le contrôle/comm...

  • Peut on faire une boucle infini dans un sous vi ?

    Bonjour, j'ai créé un sous-vis (joint à ce message) qui simule une température en continu (boucle infini) et j'aimerais pouvoir avoir le signal de ma température lors de l'utilisation de mon sous-vi. Mais quand je l'utilise, je n'obtiens rien à la sortie de mon sous vi(le programme appelant est joint aussi). Pourquoi et comment puis je faire ? Merci de votre réponse
    Attachments:
    Sous_Vis_Simul_Température.vi ‏24 KB
    Utilisation_du_sous_vis_température.vi ‏21 KB

    Ben , c'est normal !
    La valeur de la température ne peut être renvoyée au vi principal que lorsque l'exécution du sous-vi est terminée. Si vous ouvrez la face avant du sous-vi, vous verrez que la température est correctement simulée. Mais bien sûr, rien ne sort de là, puisque la boucle tourne en permanence.
    Il faut organiser le programme de manière différente, par exemple en enlevant la boucle du sous-vi, pour la placer dans le vi principal. Chaque appel au sous-vi renverra la valeur de la température.
    On peut aussi faire appel à une variable globale, mais ça vous posera d'autres difficultés. En effet, il n'est pas recommandable d'avoir un sous-vi qui tourne avec une boucle infinie. Comment sortir de là ? Avec un arrêt sauvage ? Mauvaise idée...
    Est-ce cla
    ir ?
    N'hésitez pas à demander plus d'aide si nécessaire...
    Chilly Charly    (aka CC)
             E-List Master - Kudos glutton - Press the yellow button on the left...        

  • Visualiser des données pendant l'éxécution d'une boucle

    Bonjour,
    J'ai réalisé un programme dans lequel je souhaite visualiser en continu plusieurs données (signaux analogiques, numériques...).
    J'ai également une structure condition qui me permet d'éxécuter une série d'actions selon 3modes différents (pas besoin de rentrer dans le détail).
    Mes données à visualiser en continu se trouvent donc en dehors de cette structure puisqu'elles interagissent avec les 3 modes. Mon problème est que lorsquel'éxécution du prog rentre dans cette structure condition, je ne visualise plus mes données puisqu'elles se trouvent en dehors. Comment puis-je faire pour visualiser ces données en continu peu importe l'éxécution du programme?
    Je vous remercie par avance de votre réponse.
    Cordialement.

    Bonjour,
    Quand on met un indicateur à l'intérieur d'une boucle, cette indicateur affiche la valeur que quand la derniere boucle est executé.
    Alors essayez de mettre votre indicateur a l'intérieur de la boucle, si c'est possible dans votre utilisation. Sinon envoyez moi votre VI.
    Brice S.
    National Instruments France

  • Comment optimiser vitesse de boucle pour grab

    Bonjour,
    J'ai construis un VI qui a pour but de faire le grab d'une camera GigE (1946*1436 ; 40FPS), de pouvoir faire un zoom sur une ROI et de piloter 2 boitiers de commande de platines de translation (GPIB).
    Le problème que j'ai est le suivant :
    La vitesse de boucle (même sans évenements) est trop lente car lorsque je regarde le fichier avi enregistré, je n'ai pas les 40FPS.
    Lorsque je n'avais pas encore mis la commande des platines de translation dans ce programme, tout était OK.
    La question est : comment optimiser mon programme pour supprimer ce problème?
    Ci-joint : le vi en question
    Merci
    Pièces jointes :
    Pilotage Manip Detection-sans texte sur video.vi ‏259 KB

    Bonjour,
    Sous LabVIEW dans le menu Aide>recherche d'exemple, vous avez à disposition de nombreux exemple dont certain propre à l'acquisition d'image (E/S matérielles>IMAQdx. Vous pouvez réaliser un test avec un exemple réalisant un grab cela vous permettra de déterminer si la vitesse d'acquisition est correct.
    Un autre point important est le format d'enregistrement, afin de gagner en efficacité il est préférable d'enregistrer les données en brut (Raw) ceci afin d'économiser du temps sur la sauvegarde de chaque image. Le format AVI est trés répandu mais sera consommateur de temps car il faut compreser chaque image qui sera sauvegardé.
    Je vous suggére donc de réaliser des essais avec l'exemple qui se trouve dans C:\Program Files\National Instruments\LabVIEW 2011\examples\IMAQ\IMAQdx Examples.llb\Low-Level Grab Raw Data.vi afin de vérifier les performances d'acquisition et de stockage de votre systéme PC avant d'intégrer cette fonctionnalité à votre application par la suite.
    Cordialement,
    Christophe S.
    FSE East of France І Certified LabVIEW Associate Developer І National Instruments France

  • Labwindows sortir d'une boucle avec un bouton externe

    Bonjour,
    Je suis actuellement en train de developper un banc de test automatisé. Celui-ci doit effectuer plusieurs cycles.
    Je génére ces cycles via une boucle for que j'incremente. Pour des raison de sécurité, je souhaiterais que l'utilisateur du banc ai la possibilité de stopper la boucle ( finir le cycle en cours et sortir de la boucle).
    Pour cela j'aimerais utiliser un Bouton sur la face avant. J'utilise la fonction GetUserEvent() qui vient controler si le bouton est activé ou non.
    Cela fonctionne, mais le probleme est qu'il faut appuyer sur le bouton à un moment précis ( je suppose pendant le moment ou la fonction scanne la valeur du bouton).
    Sous LabVIEW, il y a la possibilité d'interagir et de valider les boutons a n'importe quel moment, et de gerer le type de déclenchement des boutons.
    existe t-il sous labwindows une fonction/un parametre a mettre a jour qui permettrait d'avoir une interaction avec le PANEL a n'importe quel moment. Puis que la variable soit testée a chaque incrementation de boucle.
    Je vous remercie,
    Cordialement,

    Bonjour,
    Je vous remercie de votre réponse: en effet votre code fonctionne pour sortir de la boucle. Le point bloquant, et qu'il faut encore un timing précis pour appuyer sur le bouton Arret
    N'y a t'il pas une solution qui permet de garder la main sur l'interface principale de facon à pouvoir cliquer sur le bouton n'importe quand.
    Le Langage C ne permet pas de prendre en compte directement la modification, ( lecture à la suite les unes des autres des instructions) mais si l'on peut appuyer n'importe quand sur le bouton et que la fonction s'arrete a un moment précis dans la boucle suite a l'appel de la fonction correspondante ce serait déjà tres bien.
    une autre solution est de scanner le bouton  entre chaque instruction de la boucle, mais j'aimerais beaucoup éviter cela de maniere à ne par ralentir le programme et surtout car je ne trouve pas cela trés propre.
    Cordialement

Maybe you are looking for