le 01-17-2018 11:52 AM
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.
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
Résolu ! Accéder à la solution.
le 01-18-2018 01:13 AM
Salut Baba59,
tu n'aurais pas le vi, ou un screenshoot plus grand, j'arrive pas à décoder ton image
le 01-18-2018 01:19 AM
Bonjour, désolé je pensais que en cliquant dessus on pouvait avoir un agrandissement de l'image 😄 .
Voila l'image en plus grand 🙂
Baba59
le 01-18-2018 02:55 AM
merci pour l'image un peu plus précise
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????
le 01-18-2018 09:33 AM
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.
Ben64
le 01-18-2018 11:43 AM
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ù
le 01-18-2018 12:09 PM
Ç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
01-19-2018 04:34 AM - modifié 01-19-2018 04:36 AM
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.
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
le 01-19-2018 08:50 AM
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