Discussions au sujet des autres produits NI

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

Vérification qu'un sample est remplie

Résolu !
Accéder à la solution

Bonjour,

 

Je bosse sur un logiciel, en C, utilisant la carte d'acquisition NI PCI-6220.

Mon problème est que j'ai créé une tache, j'ai configuré l'horloge comme ceci :

DAQmxErrChk (DAQmxCfgSampClkTiming(gTaskHandle,
                                NULL,
                                Frequence ,
                                DAQmx_Val_Rising,
                                DAQmx_Val_ContSamps,
                                SAMP_PAR_CHAN));

Frequence = 1600 et SAMP_PAR_CHAN = 1024

J'ai ensuite créé l'évènement :

            // Creation evenements
            DAQmxErrChk (DAQmxRegisterEveryNSamplesEvent(gTaskHandle,
                                    DAQmx_Val_Acquired_Into_Buffer,
                                    SAMP_PAR_CHAN,
                                    0,
                                    NI_Acquisition_RT,
                                    NULL));

 

J'ai bien évidement lancé la tache par la suite.

Mon problème est que j'ai cette erreur qui survient tout le temps au bout de plusieurs minutes :

Attempted to read samples that are no longer available.
The requested sample was previously available, but has since been overwritten.

Increasing the buffer size, reading the data more frequently, or specifying a fixed number of samples to read instead of reading all available samples might correct the problem.

 

J'ai vérifié, logiquement, un évènement devrais survenir toutes les 64 ms(et donc lancé NI_ACQUISITION_RT, fonction dans laquelle je récupère les 1024 données). Mais, des fois, l'évènement n'est pas lancé à temps, et l'erreur survient donc!

 

C'est pour quoi j'aimerais, après avoir récupéré le bloc de 1024 dans la fonction NI_ACQUISITION_RT, vérifié que le bloc suivant ne soit pas plein(et dans le cas où il est plein, je récupère directement les données, ce qui permettra d'éviter l'erreur si je ne me trompe pas?).

J'aimerais donc savoir si une fonction existe pour vérifié qu'un bloc de données est plein dans le buffer de la carte d'acquisition?

 

Merci d'avance pour vos réponses!

 

Ridbark

0 Compliments
Message 1 sur 5
3 334 Visites

Bonjour,

 

Si je résume, vous faites de l'acquisition de 1600 échantillons avec un buffer de 1024 échantillons. Est ce volontaire?

 

Cordialement

David S.| Certified LabVIEW Associate Developer
National Instruments France


0 Compliments
Message 2 sur 5
3 301 Visites

16 000* pas 1600, je me suis trompé d'un 0 ... :S

 

Et ces valeurs ont était choisis volontairement, oui.

 

 

Ridbark

0 Compliments
Message 3 sur 5
3 298 Visites
Solution
Accepté par l'auteur du sujet Ridbark

Bonjour,

 

Le buffer doit être au moins égal voir supérieur à votre vitesse acquisition. Ainsi, si votre vitesse d'échantillonnage est de 16 000,vous devez mettre au minimun un buffer de 16 000 échantillons (SAMP_PAR_CHAN).

 

Cordialement

David S.| Certified LabVIEW Associate Developer
National Instruments France


0 Compliments
Message 4 sur 5
3 273 Visites

J'y avais déjà pensé, et effectivement, dans mon cas, je n'en étais qu'à 4094 échantillons au lieu de 16000, normal que ça bug.

J'ai mis, pour être vraiment tranquille, 50 sous-buffer, étant donné que l'ordinateur sur lequel mon programme tournera est dédié à ce logiciel, et qu'il tournera en continue, j'ai préféré en mettre pas mal, surtout qu'en en mettant 16 (donc 16*1024), ou même 20 pour arrondir, le bug apparait toujours ... tandis qu'a 50, il n'apparait plus.

 

Donc merci pour l'aide!

D'ailleurs, en regardant de plus près la documentation de DAQmx fournie, aucune fonction ne permet de seulement vérifier qu'un sample(donc 1024 échantillons dans mon cas)sont présent dans le buffer, après le pointeur courant.

 

Ridbark

0 Compliments
Message 5 sur 5
3 260 Visites