Registre à décalage et initialisation DMM

Bonjour,
Je developpe actuellement un logiciel permettant le contrôle d'étalonnage de capteur de pression avec des carte PXI 4065.
La structure de mon programme est un registre à décalage, plusieurs étapes me permettant d'initialiser les matériels que j'utilise (générateur de pression étalon et cartes multimétre).
Afin de réaliser des mesures de qualité, je dois respecter un temps de chauffe matériel et pour cela initialiser la communication quelques étapes avant de réaliser ma mesure.
Malheureusement, je n'arrive pas à garder "fermé" le contact de ma carte au moment de la mesure, celle-ci se réinitialise de façon systématique au moment de l'acquisition de la valeur.
Est-il possible de lire uniquement la valeur sans recharger la configuration hardware dans la carte d'acquisition. (Je suis obligé d'utiliser un bloc Initiate sinon j'ai une erreur "handle instrument error" avant le bloc read)
D'avance merci!
Cordialement

Hello Pod_Bol,
The issue is you're reinitializing the DMM.  I recommend wiring the DMM session handle from NI-DMM Initiate to a front panel indicator, so you can pass the session handle to the Mesure subVI.  It would look something like this:
Of course, you could also accomplish this by closing the session in one VI and then reinitializing it in another without resetting the device, but this is sloppy coding:
General comments:
-Are you using the PXI-4060?  The PXI-4060 is the only PXI DMM NI sells that has a 200mV range.  If you're using any PXI-407x DMM, I recommend using the 100mV for better sensitivity (if your measurement is less than 100mV, of course) or specifically set the 1V range.  As your code is written, requesting the 200mV range on a PXI-407x DMM will coerce to the 1V range.
-The flat sequence structure in Mode measure.jpg is unneccessary.
-There is no reason to add a delay to the DMM while calling commit (ExpressVI inside Vrai case structure).
-There's probably a better way to store the data than in the dynamic data array you're generating from each measurement. 
Are you possibly trying to acquire multiple data points from the DMM?  If so, I recommend using the excellent NI-DMM Example VIs, located here:
Example Finder»Hardware Input and Output»Modular Instruments»NI-DMM»Multi-Point Measurements
Let us know if you have any other questions and I'm happy to clarify.  Have a great day!
-John Sullivan
Analog Engineer

Similar Messages

  • Comment ça marche un registre à décalage qui remplace une variable globale

    Bonjour,
    L'utilisation des variables Globales n'est pas conseillée.
    Pour les éviter, il existe une méthode qui consiste à utiliser une boucle While composée d'un registre à décalage non initialiser.
    J'aurais besoin de comprendre comment LabView gère les registres à décalage. Lorsqu'on modifie la valeur du registre (pour remplacer la fonction écriture vers globale), comment et où LabView stocke-il l'information ?
    Merci pour vos nombreuses réponses.
    AKIRA.

    Bonjour,
    Lorsque l'on utilise un registre à décalage, la variable est stockée dans la RAM mais il n'est pas possible de savoir où exactement car cela permettrait de la changer, ce qui n'est pas le but d'un registre à décalage car il sert à protéger les valeurs stockées.
    Cordialement
    David S.| Certified LabVIEW Associate Developer
    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 LabVIEW 2012 : du 27 septembre au 22 novembre
    2 sessions en parallèle : Débuter a...

  • Registre à décalage, problème d'initialisation

    Bonjour,
    Sur l'image en PJ, j'ai réalisé un registre à décalage pour ma T_Consigne.
    Je souhaite l'initialiser avec la 1ère valeur relevée et ensuite comparer ma dernière valeur en mémoire avec ma nouvelle valeur.
    Néanmoins, à chaque itération, la valeur est à nouveau initialisée avec la nouvelle..
    Pourtant l'initialisation ne se fait qu'une seule fois?
    Résolu !
    Accéder à la solution.
    Pièces jointes :
    Registre à décalage.JPG ‏91 KB

    salut, j'étais en train d'écrire, et j'ai vu la réponse de ouadji, qui effectivement ouadji est bonne :
    le fond :
    > pour être utilisé dans la boucle, les contrôles doivent être dans la boucle
    > il te faut un case "init", au démarrage, qui va servir à lire la valeur des contrôles et initialiser les registres à déclages
    la forme : une image permet de regarder rapidement, un exemple permet de comprendre ton problème.
    A+
    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

  • Fonctionne​ment registre à décalage

    Bonjour,
    Pour éviter d'utiliser les variables globales, il est conseillé d'utiliser un VI composé d'une boucle While avec un registre à décalage non initialisé.
    Comment et où sont stockées les informations du registre à décalage ? En quoi finalement cette méthode améliore l'usage de la mémoire comparativement à la variable globale classique ? 
    Merci pour vos nombreuse réponses.
    Slts
    Solved!
    Go to Solution.

    Merci de ne pas soumettre plusiers copies de la meme question.  Vous avez poser la question en francais dans un forum qui est majorite anglophone; il existe aussi un forum francophone.
    En plus, votre question n'est pas completement logique.  La registre a decalage stocke des donnees en soi - c'est la fonction d'une registre a decalage.
    Une registre a decalage non initialise n'est pas forcement mieux qu'une variable globale - par exemple l'acces a une variable globale est plus vite.  L'avantage d'une registre a decalage est qu'il est possible de faire des actions plus complexe que lire et ecrire sans la risque d'une "race condition" (je ne connais pas la bonne traduction de cette phrase).  Une presentation sur l'usage des registres a decalage: https://decibel.ni.com/content/docs/DOC-21226
    Translation of the original question into English:
    Hello,
    To avoid using global variables, the use of a VI containing a While loop with an uninitialized shift register is recommended.
    Where and how is the data stored in a shift register?  How does this method improve memory use compared to a global variable?
    Thanks for your many replies.

  • Registre à décalage

    Bonjour,
    J'ai développé récemment une IHM dans le cadre de mes études d'ingénieur. Cette IHM devait envoyer des commandes de tensions vers une carte électronique via une liaison RS232. La carte électronique envoyant ensuite cette commande de tension sur une ou plusieurs voies (24 au totale) afin de polariser une antenne.
    J'ai donc mis 24 controls numérique (pour l'envoi de la valeur de tension/ un par voie) ainsi que 24 cases à cocher (pour la sélection des voies) sur mon IHM. J'ai ensuite mis une structure évenement (avec un évenement sur chaque sélection de la case à coché pour l'envoi de la valeur de la tension) je stock ensuite les 24 valeurs dans un tableau. Lorsque j'appuis sur le bouton "envoi", je "dépile" mon tableau dans le VI d'envoie sur la liaison RS232. Un programme sur la carte électronique se chargant ensuite du traitement des valeurs différentes de 0V pour envoie vers l'antenne.
    J'ai don du utilisé 24 registres à décalage pour avoir accés à chaque valeur dans tous les évenements de ma strucuture évenement. Je suis finalement arrivé à une IHM parfaitement fonctionnelle mais je me posais la question s'il n'existait pas d'autre alternative que le registre à décalage pour mon IHM (parce que j'en ai passé des heures à relier chaque ligne de mes registre à décalage). Même question pour l'utilisation du tableau.
    J'epère avoir été clair.
    Merci
    Benjamin
     

    " extraire un à un les éléments d'un Cluster" ... ?
    il n'est pas possible " d'indexer " un Cluster.
    par contre, si tous les éléments du cluster sont du même type, tu peux convertir ton Cluster en Tableau ("cluser to array" dans la palette cluster)
    et ensuite ... indexer le Tableau obtenu.
    attention, les éléments dans le Tableau se trouveront dans l'ordre dans lequel il se trouve dans le cluster
    Tu me diras .... bein oui, je m'en doute :-)
    attention ... l'ordre dans le cluster n'est pas oblibatoirement l'ordre avec lequel ils sont graphiquement visibles (dans le cluster)
    Au départ ... l'ordre dans un cluster est l'ordre suivant lequel tu introduis les éléments dans le cluster.
    ensuite .... tu peux réorganiser cet ordre ... clic droit sur le bord du cluster + reorder controls in cluster.

  • Boucle FOR dans une boucle while avec un registre à décalage

    Bonjour à tous,
    je rencontre un problème au niveau de l'indexation de l'execution de mes commandes.
    Lorsque j'exécute mon programme, seulement la dernière commande est prise en compte.
    Faut-il enlever mon registre à décalage? Changer le mode du tunnel ?
    Cordialement
    Pièces jointes :
    Boucle FOR, while.JPG ‏134 KB

    ça peut avoir son utilité lorsque le diagramme est conséquent et illisible
    alors c'est que tu "reprends en main" le diagram d'un autre .... 
    sinon... si c'est le tien ... il ne sera jamais illisible.
    Et si tu veux "gagner du temps" ... je t'assure ... cable "propre" du premier coup.
    Lisibilité, compréhensibilité, évolutivité ... tu seras gagnant à tous les coups. (à 1000%)
    Sans compter "le coup d'oeil" quand "un autre" ouvrira ton code.
    Avant d'aller plus loin et de comprendre quoi que ce soit dans ce que tu as fait ...
    la propreté de ton diagram sera "ta signature".
    Ah oui ... un diagramme aussi propre que ça ... ça ne peut être que Geoffrey !
    ça l'fait non ?  

  • Variable ou Registre à décalage ?

    Bonjour à Tous,
    J'ai des questions sur le choix entre variable ou registre à décalage.
    Exemple :   
             Dans une boucle While, il y a une machine d'état comportant 10 Conditions. A la condition 1, vous générez un indicateur comprenant un résultat que vous voulez utiliser dans les conditions 8 et 9.
    Les questions à répondre sont les suivantes :
    - Vous choisissez quoi : registre à décalage ou variable ?
    - Lequel est le moins gourmand en ressource ?
    - Si vous choisissez la variable, a partir de combien de conditions dans lequelles vous avez besoin de ce résultat vous passerez à un registre à décalage ?
    Merci beaucoup, si possible répondre au trois questions
    Résolu !
    Accéder à la solution.

    Bonjour,
    Le concept majeur de la programmation sous LabVIEW est le concept de flux de donnees, le fait d'utiliser une variable locale va casser ce concept via les noeuds "lire/ecrire dans une variable locale...".
    L'utilisation d'un registre a decalage va permetre d'assurer la continuite de ce flux de donnees a travers la boucle while.
    C'est donc la meilleure methode a suivre et ne prendra pas plus de memoire au cours de l'execution du VI qu'une variable locale.
    Dans certains cas on pourra meme remplacer le registre a decalage par un noeud de retroaction.
    Cordialement,
    Da Helmut

  • Comment remplacer un registre à décalager par une variable globale

    Bonjour tout le monde,
    Je vous sollicite encore une fois par manque d'expérience....
    Alors cette fois-ci j'ai un VI qui va acquérir une tension et faire la moyenne de celle-ci, mais mon problème est que j'utilise une boucle while avec un registre à décalage et d'après mon tuteur c'est à cause de cette boucle que je n'obtiens pas les résultats escontés.
    Il m'a donc conseillé de supprimer ma boucle while et de mette une variable globale qui gère la période de moyennage à la place de mon registre à décalage. 
    Le souci c'est que je ne connais ni d'adem ni d'eve cette variable...
    Est-ce que quelqu'un aurait l'amabilité de m'expliquer un peu cmt ça fonctionne parce que je ne trouve pas mon bonheur dans les exemples et les autres sujets?
    Et surtout est-ce la bonne solution?
    REM: le VI a été créé par une autre personne je n'est fais que de modifier la partie moyennage, donc les autres variables globales ne sont pas de moi.
    Merci d'avance!
    Attachments:
    VI_TEST2.vi ‏50 KB
    VI_TEST2.vi ‏50 KB

    Bonjour à toi,
    Tu trouveras ci-dessous un exemple d'implémentation d'une variable globale fonctionnelle :
    Basic Functional Global Variable Example
    J'ai regardé ton programme mais je ne suis pas sûr d'avoir bien compris ce qu'il devait faire, aussi je ne peux pas te conseiller entre les deux solutions, essaye avec la variable globale fonctionnelle cela sera de toute facon un bon exercice d'apprentissage.
    Pour le reste du programme, il est en principe fortement déconseillé d'utiliser des structures séquences déroulées. Il vaut mieux, si on veut s'assurer du bon déroulement de son programme, utiliser une structure de machine à état ou bien tout simplement le flux de données, principe natif de LabVIEW :
    Programmation par flux de données dans LabVIEW
    Machine à états simple
    J'espère que cela t'aidera,
    Bonne journée,
    M-Junior

  • Problème d'initialisation Itunes/Iphone

    J'ai initialisé mon pc, puis installé à nouveau Itunes et depuis la synchronisation avec mon Iphone 5 n'est plus possible. Je n'arrive plus à transféré les fichiers et Itunes ne reconnaît pas mon Iphone

    la réponse est une utilisation "classique" des registres à décalages. Initialiser au départ. Si tu ne fais pas l'initialisation, le registre mémorise alors la donnée, cela est appelé "FGV", variable globale fonctionnelle, cela devient une zone mémoire.
    Tu peux noter la réponse comme solution, cela aidera d'autres personnes dans la recherche, et tu peux aussi mettre des "compliments" à ceux qui ont répondus.
    Bon we A+
    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

  • Problème graphe en temps relatif

    Bonjour,
    J'ai crée un VI d'acquisition de tension avec un port USB NI9219 qui mesure différentes tension d'entrée à une fréquence élevée(ex : 100 Hz). De plus mon VI enregistre les mesures que lorsque la tension mesurée change de 0,01v. Le VI trace également les courbes de tension dans un graphe déroulant qui comporte tous les points enregistrés (et seulement ceux la) depuis le lancement de l'application.
    C'est sur ce point que je n'arrive pas à avoir un graphe déroulant avec plusieurs courbes (4 maximum) avec une échelle des x en temps relatif. C'est à dire de t=0 (ex : minutes) jusqu'a t=fin du VI
    Lorsque je met les x en temps relatif il ne me met pas de temps mais des valeurs abérantes. De plus il n'incrémente pas du temps éffectué entre 2 mesures, il incrémente le temps de 1.
    (ex : on a t=5min entre 2 mesure enregistrées mais la courbe incréménte le temps de 1 sur la valeur abérante).
    Avez vous des solutions pour mon problème. Merci.
    Cordialement.
    Solved!
    Go to Solution.

    Cette valeur correspond à l'heure de la mesure, 952500:36:41 correspondant à 14h36 et 41s.
    Cela permet d'horodater les points plus précisément.
    Si vous souhaitez recréer votre échelle de temps en X, il faudra modifier le T0 de votre courbe.
    Pour cela vous allez devoir utiliser la fonction Construire une waveform permettant d’insérer votre courbe et aussi de modifier le t0, on insère cette fonction dans une boucle For afin de traiter les 4 courbes.
    Au départ du VI on initialise un registre à décalage à 0 afin que nos premiers points commencent à 0, puis on devra multiplier l’horloge d’échantillonnage par le nombre de point afin de définir le t0 des tours de boucles suivants.
    Cela devrait résoudre votre probléme.
    Cordialement
    Christophe S.
    FSE East of France І Certified LabVIEW Associate Developer І National Instruments France

  • Probleme insertion valeurs dans un tableau

    Bonjour,
    Je rencontre un petit probleme sous Labview 7.1.
    J'obtient des valeurs RMS d'un signal. J'aimerai faire une moyenne de 20 valeurs prisent toute les 1/4 ou 1/2 secondes. Le probleme est que je n'arrive pas a inserer ces valeurs dans mon tableau, la valeur precedente est remise a zero.
    De plus, quand j'initialise mon tableau en dehors de ma boucle, je ne peut pas raccorder mon initialized array car le format n'est pas le meme.
    merci.
    Attachments:
    test_file_record_4.vi ‏682 KB

    Pour ne pas perdre la dernière valeur entrée dans le tableau, il faut utiliser un registre à décalage.
    Le pb de connection est du à l'autoindexation  (clic droit sur le point d'entrée...). Par défaut les boucles For autoindexent les entrées de type tableau. C'est l'inverse avec les boucles while.
    J'ai corrigé et fait un peu de ménage dans votre vi.
    Ceci dit, je ne pense pas que vous arriviez ainsi à calculer votre moyenne... il faudra probablement revoir votre algorithme .
    Chilly Charly    (aka CC)
             E-List Master - Kudos glutton - Press the yellow button on the left...        
    Attachments:
    test_file_record_4[1].vi ‏703 KB

  • Enlever une erreur

    Bonjour,
    J'ai une erreur qui s'est produit car j'ai oublié de mettre une voie quand j'ai lancé mon acquisition.
    Jusque là pas forcement un soucis, sauf que lorsque je modifie mon interfcae, et que je spécifie mon entrée, mes sondes m'indiquent que l'érreur est toujours présente (assez logique puisque ils sont placé dans un registre à décalage pour eviter de perdre mes erreurs).
    Toutefois si j'arrete mon programme et que je le relance l'erreur est toujours présente.
    Est il possible de supprimer cette état de mémoire lorsque je relance mon programme ou même lorsque l'erreur est corriger (mon interface est gérée par gestion d'évenement).
    Merci à tous pour vos réponses éclairées.

    Bonjour,
    effectivement il est nécessaire d'initialiser le cluster d'erreur sinon on se retrouve
    dans le cas que tu décris avec une mémorisation de l’état d'un lancement à l'autre.
    Pour supprimer une erreur il suffit de gerer celle ci avec un case ,  on affiche le message et on réinitialise le cluster
    , quand on connait son numero id on agit en consequence : retour a une étape précédente,
    on continue si c'est un simple warning ou on stoppe tout.
    Cdt
    Tinnitus
    CLAD / Labview 2011, Win Xp
    Mission d'une semaine- à plusieurs mois laissez moi un MP...
    RP et Midi-pyrénées .Km+++ si possibilité de télétravail
    Kudos always accepted / Les petits clicks jaunes sont toujours appréciés
    Don't forget to valid a good answer / pensez à valider une réponse correcte

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

  • Code (débutant) demande avis

    Bonjour à tous,
    Je propose au yeux des anciens un petit exercice que je me suis imposé ...
    vos avis, remarques ... tout m'intéresse.
    Description de la manip:
    Je génère 1000 nombres aléatoires, fourchette de [0 .. 9].
    Le but de ce VI : Quel est le nombre qui a été généré le plus souvent ?
    en A: j'initialise un Tableau de 10 éléments (à 0)
    en B: le générateur
    en C: J'utilise chaque nb généré comme un index,
             et pour chaque nombre généré, avec cet index, j'incrémente l'élement correspondant du Tableau.
             Ici, une question ... y a-t-il d'autres façons d'incrémenter un élément dans un Tableau ?
    en D: Je recherche l'élement le plus grand du Tableau.
             Le code de "D" me "plait" assez bien.
             J'utiliser un noeud de rétroaction avec son terminal "enable/disable".
             Impossible d'utiliser un registre à décalage, celui-ci ne ne proposant pas de fonction "enable/disable"
             Ca fonctionne tip-top (en termes de résultats) ,mais le résultat c'est une chose... et faire du beau code, c'est autre chose.
    Le résultat final se trouve dans "nb max".
    <EDIT>
    En fait non, le résultat final c'est l'index de ce nombre maximum dans le tableau.
    mais le time-out du forum ne me permettra pas d'ajouter le (petit) code manquant.
    Sans avis "extérieurs", difficile d'avancer.
    remarques, conseils, critiques ... je prends tout.
    Un grand merci à tous.

    Rodéric,
    j'ai fait la comparaison. Création / initialisation d'un Tableau de 10 éléments. ( 10e7 fois et mesure du temps)
    au dessus   : avec une boucle For et indexation
    en dessous : avec la fonction Initialize array
    Je ne comprends pas, vous parliez de performances supérieures avec "boucle For + indexation"
    Quelque chose doit certainement m'avoir échappé, car ici, je remarque l'inverse.
    au dessus   : avec une boucle For et indexation : 460ms
    en dessous : avec la fonction Initialize array : 38ms
    (comprends pas !)

  • Communique​r avec un instrument de mesure via TCP

    Bonjour,
    Je dois relever les données d'un baromètre via ethernet.
    J'ai donc retrouvé le baromètre grâce à NI MAX et commencé un programme sur LabVIEW (avec un exemple trouvé sur ce forum) : Je suis débutant sur Labview et donc ne sais pas quoi câbler au niveau du "buffer d'écriture", si quelqu'un pouvait m'expliquer clairement ce qu'est un buffer d'écriture cela pourrait sûrement m'aider.
    De même, est ce que l'allure générale du programme vous paraît correcte?
    Merci d'avance pour votre aide
    Thom.76

    Salut à toi Tom,
    Il faut câbler ce que tu souhaites envoyer à ton baromètre !!!
    Dans le cas ou ton baromètre attends une trame d'initialisation, ou autre chose, LabVIEW te permet de la lui envoyer grâce au VI VISA Write. Après, tout dépend de ton protocole de communication...
    - Si ton baromètre envoi directement les valeurs sans que tu n'aies besoin de lui demander "envoi moi quelque chose s'il te plait", tu peux carrément retirer ton VI VISA Write.
    - Si tu dois lui demander une seule fois "envoi moi toutes les valeurs que tu mesures s'il te plait", il s'agit à ce moment là de câbler ton VISA Write hors de la boucle While.
    Dernier point: utilise des registres à décalages pour ton fil d'erreur et ton nom de ressource VISA en cliquant droit sur le noeud entre le fil et la boucle While, c'est plus propre et de cette manière si une erreur apparait au milieu de la boucle, tu la verras.
    Bilsix.

Maybe you are looking for