From Friday, April 19th (11:00 PM CDT) through Saturday, April 20th (2:00 PM CDT), 2024, ni.com will undergo system upgrades that may result in temporary service interruption.

We appreciate your patience as we improve our online experience.

Discussions au sujet des autres produits NI

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

probleme de buffer

Résolu !
Accéder à la solution

Bonjour à tous,

 

J'ai rencontré dans mon application un problème de buffer. J'effectue dans mon programme une acquisition multifonction (analogique,numérique ,compteur) et lorsque je lance l'acquisition, j'ai un message d'erreur qui m'indique que des échantillons ne peuvent plus être lus et sont écrasés. J'ai remarqué que ce problème a été rencontré par des personnes de ce forum.

Pour résoudre mon problème, j'ai utilisé le vi "configurer un buffer d'entrée" et j'ai régler la taille du buffer à 150000 échantillons. Le message d'erreur ne s'affiche plus.

Cependant, je me demande si c'est une bonne méthode, si cela n'utilise pas trop de ressource inutilement, et si je récupère tous les échantillons.

En effet , lorsque je lance l'acquisition, la réponse du programme n'est pas immédiate.

Les fréquences d'acquisition vont de 1000 éch/s à 50 000 éch/s et la durée de l'acquisition de 500ms à 10s.

 

Ci joint une partie de mon programme.

 

Cordialement

0 Compliments
Message 1 sur 13
7 234 Visites

Bonjour,

 

Ces problèmes de buffer reviennent souvent comme tu l'as vu sur les forums. Le tout est de bien comprendre comment se passe le transfert de données. La carte acquiert des données et les transfert dans un buffer circulair (une partie de la mémoire), ce buffer peut avoir une taille choisi par l'utilisateur ou automatiquement avec les DAQmx.

 

Ce buffer se remplit à la vitesse d'échantillonnage de la carte ( si Fe=100e/s alors nous aurons 1e toutes les 0.01s mis dans le buffer), suivant le nombre d'échantillons que tu indiques avec DAQmx read tu liras un certain nombre d'échantillons tous les t ms que dure ta boucle.

 

Donc des problèmes peuvent intervenir si tu ne lis pas assez vite les échantillons et que le nombre d'échantillons envoyés dans le buffer dépasse sa capacité d'où l'erreur observé. Tu as donc besoin de prendre les valeurs du buffer aussi vite ou plus vite qu'il ne se remplit ou alors à un moment il sera remplit. (problème de vase que tu remplit à une certaine vitesse avec de l'eau et en même temps tu en enlève => si tu n'enlève pas l'eau assez vite le vase débordera).

 

Avec ce problème de vase tu peux voir qu'augmenter le buffer n'est pas non plus une solution parfaite c'est comme si tu prends un vase plus grand, simplement le temps de remplissage sera augmenté et l'erreur pourra intervenir plus tard. Retiens le fait qu'il faut essayer de vider aussi vite que tu remplis.

J'espère que j'ai été clair dans mon explication.

Greg S.
CNRS
LV 7.1 8.2 8.6 2009 2011 2012 2013 2014
LPMC - CNRS
N'oubliez pas de complimenter cela fait toujours plaisir.
Message 2 sur 13
7 221 Visites

Bonjour Gregory,

 

Merci pour toutes ces explications. Le problème me paraît plus clair à présent.

Cependant, j'ai des difficultés pour le résoudre. J'ai vu que pour que les échantillons ne soient pas écrasés, il fallait intervenir sur les paramètres suivants:

- Fréquence d'échantillonnage

- Durée de ma boucle for pour lire les échantillons

- Taille du buffer

 

Je ne peux pas modifier les deux premiers paramères, et concernant la taille du buffer, cela n'empeche pas l'erreur.

 

 Je ne vois pas comment lire les échantillons avant que le buffer ne soit rempli. Si vous pouvez me conseiller.

 

Cordialement

 

 

0 Compliments
Message 3 sur 13
7 194 Visites
Solution
Accepté par l'auteur du sujet jcprudor
blank_page

blank_page

Bonjour,

 

Il reste aussi un paramètre le nombre d'échantillons à lire à chaque tour de boucle.

 

Maintenant pour savoir si le problème est vraiment le buffer (hé oui cela arrive que ce ne soit pas forcément ce problème alors que labVIEW le dit), en modifiant la taille du buffer le problème persiste ?

si oui essayez en baissant la fréquence d'échantillonnage ? le problème persiste ? si oui augmenter le nombre d'échantillons à lire ? le problème persiste ? là je me pose des questions.

 

Est ce que la modification de la taille du buffer à entrainé un retard à l'errreur par rapport à avant ? si non doublez encore le buffer et refaites un essai si pareil encore une fois ( mettez par exemple 10 fois la fréquence d'échantillonage puis 100 fois) si le temps mis pour que l'erreur prend plus de temps c'est vraiment un problème de buffer et il faut donc jouer sur la taille, la fréquence d'echantillonngae et le nombre d'échantillons lus aussi.

Bonjour,

 

 

Il reste aussi un paramètre le nombre d'échantillons à lire à chaque tour de boucle.

 

Maintenant pour savoir si le problème est vraiment le buffer (hé oui cela arrive que ce ne soit pas forcément ce problème alors que labVIEW le dit), en modifiant la taille du buffer le problème persiste ?

si oui essayez en baissant la fréquence d'échantillonnage ? le problème persiste ? si oui augmenter le nombre d'échantillons à lire ? le problème persiste ? là je me pose des questions.

 

Est ce que la modification de la taille du buffer à entrainé un retard à l'errreur par rapport à avant ? si non doublez encore le buffer et refaites un essai si pareil encore une fois ( mettez par exemple 10 fois la fréquence d'échantillonage puis 100 fois) si le temps mis pour que l'erreur prend plus de temps c'est vraiment un problème de buffer et il faut donc jouer sur la taille, la fréquence d'echantillonngae et le nombre d'échantillons lus aussi.

 

Après si ce n'est toujours pas régler interessons nous à ce qu'il se passe : Calculer le temps de boucle pour les 100 iterations (regarder si elle augmente pas trop aussi), la fréquence d'échantillonnage utilisée ? le nombre d'échantillons lus pour chaque boucle ? taille du buffer utilisé? au bout de combien de temps l'erreur apparait ?

 

Voilà ce qu'il faut pour pouvoir voir d'où cela vient précisement.

Greg S.
CNRS
LV 7.1 8.2 8.6 2009 2011 2012 2013 2014
LPMC - CNRS
N'oubliez pas de complimenter cela fait toujours plaisir.
Message 4 sur 13
7 190 Visites
J'allais oublier, moi j'aurais fais un test d'erreur dans la boucle For pour l'arreter si une erreur dans un tour de boucle.
Greg S.
CNRS
LV 7.1 8.2 8.6 2009 2011 2012 2013 2014
LPMC - CNRS
N'oubliez pas de complimenter cela fait toujours plaisir.
Message 5 sur 13
7 188 Visites
merci pour la reponse si rapide, je vais tester ces idées dès demain.
0 Compliments
Message 6 sur 13
7 186 Visites

Bonjour.

 

L'erreur que vous avez se produit lorsque la mémoire allouée à votre acquisition sur la RAM du PC est remplie.

 

Elle se remplit si vous ne lisez pas vos échantillons suffisamment vite (vous la videz lorsuqe vous lisez des échantillons avce DAQmx Lire) , c'est à dire si votre fréquence d'acquistion est trop grande ou si le nombre d'échantillons que vous lisez à chaque tour de boucle est insuffisant.

 

Comme dit précedemment, augmenter la taille du buffer retardera l'instant où l'erreur se produit, mais ne résoud pas l'origine du problème.

 

De plus, si votre boucle met trop de temps à s'exécuter à chaque itération à cause d'un très grand nombre de VI à l'intérieur, cela provoquera également cette erreur.

 

Pour voir si la mémoire allouée sur le PC se remplit trop vitre, vous pouvez utilser dans la boucle whilele noeud de propriété DAQmx Lire (Etat<<Nombre d'échantillons disponibles par voie) qui va vous indiquer combien d'échantillons ont été acquis sans être lus. Vous verrez ainsi à quelle vitesse votre buffer se remplit.

 

De plus, si c'est votre boucle qui s'exécute trop lentement, je vous conseille de faire votre lecture de voies dans une boucle et votre traitement dans une boucle parallèle: c'est le modèle Producteur/Consommateur. cela évitera de ralentir votre lecture d'échantillons.

 

Cordialement.

 

Message 7 sur 13
7 161 Visites

Merci a Gregory et Mehdi pour leur explications, je comprend mieux à présent le principe du buffer.

Je n'ai pas pu résoudre tout mes problemes par faute de temps (bientot la fin de mon stage), mais mon programme fonctionne correctement pour des fréquences d'échantillonnage plus faibles.

0 Compliments
Message 8 sur 13
7 130 Visites

dsl pour le post précedent,

 

Salut tu peux mettre résolu pour le message, cela sera pratique pour les autres qui auront le même  problème

 

Merci

Greg S.
CNRS
LV 7.1 8.2 8.6 2009 2011 2012 2013 2014
LPMC - CNRS
N'oubliez pas de complimenter cela fait toujours plaisir.
0 Compliments
Message 9 sur 13
7 073 Visites

Bonjour,

 

J'utilise une carte d'acquisition NI-6000 et la fonction NI-DAQmx afin d'acquérir des données. Je voudrais savoir si il y a une règle pour fixer le nombre d'échantillons par voie par rapport à la vitesse d'échantillonage. Le fait de mettre vitesse d'échantillonage = nombre d'échantillon par voie est-il correcte? Cela génére un buffer toute les secondes  de dimmension: nombre de voie * nombre d'échantillon par voie. Merci et bonne journée.

Cordialement,

TTP38.

0 Compliments
Message 10 sur 13
5 695 Visites