Discussions au sujet de NI LabVIEW

cancel
Showing results for 
Search instead for 
Did you mean: 

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

Solved!
Go to 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 Kudos
Message 1 of 9
(4,450 Views)

Salut Baba59,

tu n'aurais pas le vi, ou un screenshoot plus grand, j'arrive pas à décoder ton image Smiley Very Happy

0 Kudos
Message 2 of 9
(4,410 Views)

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 Kudos
Message 3 of 9
(4,407 Views)

merci pour l'image un peu plus précise Smiley Wink
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 Kudos
Message 4 of 9
(4,398 Views)
Solution
Accepted by topic author 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 of 9
(4,379 Views)

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 Happy

0 Kudos
Message 6 of 9
(4,371 Views)

Ç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 of 9
(4,365 Views)

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 Kudos
Message 8 of 9
(4,347 Views)

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 of 9
(4,335 Views)