Discussions au sujet de NI LabVIEW

annuler
Affichage des résultats de 
Rechercher plutôt 
Vouliez-vous dire : 

Utilisation d'un Module 9227 Fréquence échantillonnage et nombre d'échantillon

Résolu !
Accéder à la solution

Bonsoir la communauté,

 

j'ai de nouveau besoin de vous pour une partie qui commence à être énervante. Car je comprends pas trop comment cela fonctionne, j'ai à ma disposition un module NI 9227 associé à un rack 1 slot USB. Le but est de mesurer le courant allant jusqu'à 2.5 A, pour faire cette mesure je me sers de ce Sous VI.

Mesure_Courant.png

Pour ma mesure je me sers d'une seule voie et je souhaite récupérer cette mesure toutes les 100 ms ou au mieux 10 ms à travers ma boucle d'acquisition. Mais quelque minutes après le lancement de mon VI j'ai une erreur comme quoi le système à ne suis pas l’acquisition et qu'il faut augmenter la taille du buffer. J'ai essayé de modifier la fréquence d’échantillonnage et le nombre d’échantillon, j'ai toujours le même problème.

 

Pouvez vous m'éclairer s'il vous plait ?

 

Cordialement.

Baba59

0 Compliments
Message 1 sur 9
4 418 Visites

Salut Baba59,

tu n'aurais pas le vi, ou un screenshoot plus grand, j'arrive pas à décoder ton image Smiley très heureux

0 Compliments
Message 2 sur 9
4 378 Visites

Bonjour, désolé je pensais que en cliquant dessus on pouvait avoir un agrandissement de l'image 😄 .

Voila l'image en plus grand 🙂

Mesure_Courant.png

Baba59

0 Compliments
Message 3 sur 9
4 375 Visites

merci pour l'image un peu plus précise Smiley clignant de l'œil
J'ai fait le même Vi que toi, je n'ai pas de soucis actuellement, il tourne depuis presque 20 minutes.
Après combien de temps plante-t-il chez toi????

0 Compliments
Message 4 sur 9
4 366 Visites
Solution
Accepté par Baba59

La première chose à faire est d'éliminer la fonction Wait Until Next ms Multiple. Comme la valeur de cette temporisation est égale à la période de la fréquence d'échantillonage et que ta boucle contient également une opération de multiplication il est possible que la boucle dure plus de 10 ms (surtout avec un système non déterministe comme Windows). Cette fonction attendra alors le prochain multiple de 10 ms du timer. Dans le pire des cas on manquera alors une itération sur 2 et comme la taille du buffer est de 1000 on aura une erreur de buffer overflow après 20 secondes, sinon l'erreur surviendra plus tard. Il est inutile de temporiser la boucle d'acquisition, la fonction DAQmx Read attend que le nombre d'échantillons disponible dans le buffer soit égal au nombre d'échantillons demandés avant de s'exécuter (si on ne connecte aucune valeur à cette entrée tous les échantillons disponibles seront lus dans le cas 1Voie Néchantillons, dans le cas 1Voie 1échantillon on ne lira qu'un échantillon bien sur). 

 

Il n'y a aucun avantage à lire 1 seul échantillon à tous les 10ms, cela consomme du CPU inutilement, l'affichage est illisible et cela laisse très peu de temps pour effectuer d'autres opérations dans la boucle (ces opérations devrait être minimale sinon il est préférable de transférer le data au moyen d'une file). En lisant des blocs de 25 échantillons on ralenti la boucle à 250ms ce qui laisse du temps d'attente à la fonction DAQmx Read. Il est également possible d'appliquer une échelle à la mesure ce qui évite la multiplication par 1000 de la valeur lue.

 

Échantillons en continue.png

Ben64

 

Message 5 sur 9
4 347 Visites

j'ai tout de même fait tourner le vi (enfin, une copie de l'original) pendant plus de 3 heures sans soucis!!!
J'y avais même ajouté une mesure de temps et bouton STOP pour au cas où Smiley heureux

0 Compliments
Message 6 sur 9
4 339 Visites

Ça tournerait encore plus longtemps avec un plus gros buffer mais la mesure n'est plus synchro. L'erreur à arrêté l'acquisition lorsque le buffer s'est rempli, ce qui signifie qu'il y a eu 1001 échantillons non lu après la dernière valeur affichée. Donc la valeur affichée a été mesurée plusieurs secondes auparavant. Le temps nécessaire avant erreur dépend également des performances de la machine mais elle finira par arriver ce qui indique qu'il y a quelque chose d'incorrect à la base.

 

Ben64

Message 7 sur 9
4 333 Visites

Bonjour, merci de vos réponses à tous les deux, généralement l'erreur survenait au bout de 2 min. Après j'ai regardé la fonction lire la mesure notamment l'entrée timeout qui impose 10 ms si elle n'est pas câblée, donc je pense que  mon problème survenait de ce timeout. Effectivement échantillonner sur une seule voie à une grande fréquence n’apporte peu d’intérêt au programme. Par ailleurs j'ai modifié mon programme pour avoir un nombre d'échantillon fini avec une période de 100 ms qui semble plus adapté à ce que je cherche.

 

 

Mesure_Courant.png

 

A partant de ce principe je n'ai pas d'erreur, je ne suis pas sur mon projet en ce moment. Je vous tiens informés si votre idée fonctionne sur le projet.

 

Cordialement.

 

Baba59

0 Compliments
Message 8 sur 9
4 315 Visites

La valeur par défaut du timeout de la fonction DAQmx Read est de 10 secondes et non de 10 millisecondes. Ce n'est pas une erreur de timeout que tu obtenais mais une erreur de buffer overflow, indiquant que tu ne réussissait pas à lire le data assez rapidement. Je le répète, la fonction Wait Until Nest ms Multiple est inutile et devrait être enlevé. La fonction DAQmx Read attendra jusqu'à ce que le nombre d'échantillons demandés soit disponible dans le buffer (1 dans ce cas) ou qu'il y ait timeout (que tu as changé de 10 sec à 1 sec). Le timing se fait par l'horloge d'échantillonage. J'utilise une temporisation (Wait, jamais Wait Until Next ms Multiple) uniquement lorsque j'utilise DAQmx Read dans le mode 1 échantillon sur demande.

 

Ton nouveau code contient l'erreur suivante, Tu lis une nombre d'échantillons fini (1e+6) dans une boucle while qui se termine uniquement à l'aide d'un bouton stop. Donc éventuellement tu auras une erreur de timeout qui n'arrêtera pas la boucle while. Pour un nombre d'échantillons fini tu devrais utiliser une boucle FOR.

 

Ben64

Message 9 sur 9
4 303 Visites