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?
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