Я получаю событие (и) DataMissed в Matlab при получении данных формы сигнала (2 канала) и триггера аналогового входа (настроен в режиме предварительного запуска - отрицательное значение задержки).
Вот код:
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;
При запуске этого кода я получаю события пропущенных данных после получения события триггера (с помощью showdaqevents (ai)). Тем не менее, события пропущенных данных имеют номер выборки NA, поэтому я не совсем уверен, что они идут после триггера.
Вот пример вывода 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 )
Глядя на события пропущенных данных в matlab Документация , есть два объяснения:
- Двигатель не может угнаться за скоростью приобретения.
- Драйвер записал новые данные в аппаратный буфер FIFO до того, как
ранее полученные данные были прочитаны. Обычно вы можете избежать этой проблемы
путем увеличения размера блока памяти с помощью BufferingConfig
свойство.
Я попытался увеличить объем памяти, доступной с помощью команды daqmem, но я не нашел, чтобы это работало. 500000 выборок в секунду, 3 канала - это около 90 МБ общего на триггер, и отчеты daqmem имеют более 360 МБ свободного места (хотя для режима буфера установлено значение Авто). Мне интересно, нужно ли мне периодически вызывать getdata (ai) в цикле while, чтобы очистить память. Другая возможность заключается в том, что у меня слишком высокая частота дискретизации для системы?
Аппаратное обеспечение:
- Двухъядерный процессор (Athlon X2 3200), 4 ГБ ОЗУ, жесткий диск SATA 500 ГБ
- NI PCI-6122
Следует отметить, что вероятность получения события DataMissed возрастает, чем дольше (во времени) я позволяю системе получать данные перед нажатием триггера.
Есть ли проблема с моим кодом сбора данных (я больше всего не уверен в наличии паузы в середине сбора данных)? Аппаратное обеспечение? Не о чем ли беспокоиться? Visual Studio лучше подходит для работы с платами NI?