2011-07-26 2 views
1

Je reçois des événements DataMissed dans matlab lors de l'acquisition de données de forme d'onde (2 canaux) et d'un déclencheur d'entrée analogique (configuré en mode pré-déclenchement - valeur de retard négatif).Comment éviter un événement Data Missed dans matlab lors de l'acquisition de données à partir d'une carte NI?

Voici le code:

sampleRate = 500000; 
pretrigger = 8; 
trigger_value = 0.6; 
ai = analoginput('nidaq','Dev1'); 
ch = addchannel(ai,0:channels); 
set(ai,'SampleRate',sampleRate); 
requiredSamples = floor(pretrigger*sampleRate); 
set(ai,'SamplesPerTrigger',requiredSamples); 

%triggering 
set(ai,'TriggerChannel',ch(channels+1)); 
set(ai,'TriggerType','Software'); 
set(ai,'TriggerCondition','Rising'); 
set(ai,'TriggerConditionValue',trigger_value); 
set(ai,'TriggerDelay',-pretrigger); 
set(ai, 'TriggerRepeat', 0); 

set(ai,'LoggingMode','Disk'); 
set(ai,'LogToDiskMode','Index'); 
set(ai,'LogFileName',[filename '_01']); 

waitTime = pretrigger * 1.1 + 0.5; 

for k = 1:100 
    start(ai); 
    CurrentFile = get(ai,'LogFileName'); 
    disp(['Acquiring for ' CurrentFile]); 
    while strcmp((get(ai, 'Running')), 'On') 
    pause(1); 
    end 
    wait(ai,waitTime); 
    showdaqevents(ai) 
    disp(['Triggered ' CurrentFile]); 
    while strcmp((get(ai, 'Logging')), 'On'); end; 
    disp(['Saved ' CurrentFile]); 
end 

stop(ai); 
delete(ai); 
clear ai; 

Lors de l'exécution de ce code, je reçois des données après des événements manqués l'événement déclencheur est reçu (en utilisant les showdaqevents (ai)). Cependant, les événements de données manquées ont un numéro d'échantillon de NA, donc je ne suis pas complètement certain qu'ils viennent après le déclencheur.

Voici un exemple de la sortie de showdaqevents:

1 Start    (14:55:35, 0) 
2 Trigger#1   (14:56:02, 0)  Channel: [3] 
3 DataMissed   ( N/A , 13959168) 
4 DataMissed   ( N/A , 13959168) 
5 DataMissed   ( N/A , 13959168) 
6 DataMissed   ( N/A , 13959168) 
7 DataMissed   ( N/A , 13959168) 
8 DataMissed   ( N/A , 13959168) 
9 Stop    (14:56:03, 5) 

Recherche en données Manquer Evènements dans Matlab documentation, il y a deux explications:

  • Le moteur ne peut pas suivre le taux de acquisition.
  • Le pilote a écrit de nouvelles données dans le tampon FIFO du matériel avant que les données précédemment acquises aient été lues. Vous pouvez généralement éviter ce problème en augmentant la taille du bloc de mémoire avec la propriété BufferingConfig.

J'ai essayé d'augmenter la mémoire disponible avec la commande daqmem, mais je n'ai pas trouvé que cela fonctionne. 500000 échantillons/seconde, 3 canaux représentent environ 90 Mo au total par déclencheur, et les rapports daqmem ont plus de 360 ​​Mo (bien que le buffermode soit réglé sur Auto). Je me demande si j'ai besoin d'appeler périodiquement getdata (ai) dans la boucle while pour effacer la mémoire. L'autre possibilité est que je cours à un taux d'échantillonnage trop élevé pour le système?

Le matériel:

  • CPU dual core (Athlon X2 3200), 4 Go de RAM, disque dur 500 Go SATA
  • NI PCI-6122

Je dois mentionner que la probabilité d'obtenir un L'événement DataMissed augmente le plus longtemps (dans le temps) que je laisse le système acquérir avant d'appuyer sur le déclencheur.

Y a-t-il un problème avec mon code d'acquisition de données (je ne suis pas sûr d'avoir la pause au milieu de l'acquisition)? Le matériel? Est-ce quelque chose à ne pas s'inquiéter? Visual Studio est-il mieux adapté aux cartes NI?

Répondre

1

Je n'ai pas de réponse, mais je peux vous dire certaines des étapes que je pourrais utiliser pour déboguer. En notant les réponses à ces questions dans votre Q d'origine, vous pourriez également donner aux utilisateurs de nidaqmx des informations supplémentaires sur votre problème. Tout d'abord, avez-vous déjà manqué des échantillons lorsque vous utilisez un seul déclencheur, plutôt que de déclencher 100 fois?

Vous manquez des échantillons à des taux d'acquisition inférieurs?

Que diriez-vous si vous changez les paramètres pour ne garder que les samps de pré-déclenchement? Seuls les samps post-déclenchement?

La connexion est-elle en cours?Si vous renoncez à la journalisation dans un fichier et que vous lisez simplement les données dans une variable matlab comme dans this exemple à partir des documents de la boîte à outils d'acquisition de données, cela change-t-il quelque chose?

À quelle fréquence manque-t-il des échantillons? Une fois par série de 100 déclencheurs? 100 fois par 100 déclencheurs? Ou plutôt stochastique? J'aimerais pouvoir offrir plus d'aide avec le code - j'utilise toujours nidaqmx c api sous linux et mon application est en cours de fonctionnement, donc je ne suis pas familier avec la boîte à outils matlab ou le déclenchement.

FYI à vous et les modérateurs - Je pense que je peux enfreindre cette règle: "S'il vous plaît assurez-vous de répondre à la question, c'est un Q & Un site, pas un forum de discussion." Je suis ouvert à la réprimande et la correction dans la section des commentaires - merci de me faire savoir l'utilisation appropriée du site!

+0

Les événements de données manquées se produisent moins souvent à des fréquences d'échantillonnage faibles ou des durées d'enregistrement plus courtes. La consignation fortuite résout le problème et je n'obtiens plus d'événements DataMissed. – Ben

Questions connexes