Как избежать события "Пропущенные данные" в Matlab при получении данных с платы NI?

Я получаю событие (и) 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?

1 ответ

Решение

У меня нет ответа, но я могу рассказать вам о некоторых шагах, которые я мог бы использовать для отладки. Отмечая ответы на эти вопросы в исходном вопросе Q, вы также можете получить от пользователей nidaqmx дополнительную информацию о вашей проблеме.

Во-первых, вы когда-нибудь пропускаете сэмплы, когда используете только один триггер, а не триггер?

Вы пропускаете образцы при более низких показателях сбора?

Как насчет того, чтобы изменить параметры, чтобы сохранить только предварительные сэмплы? Только после триггерных выборок?

Ведение журнала проблемы? Если вы отказываетесь входить в файл и вместо этого просто считываете данные в переменную matlab, как в этом примере из документации панели инструментов сбора данных, это что-то меняет?

Как часто вы пропускаете образцы? Один раз за прогон 100 триггеров? 100 раз за 100 срабатываний? Или стохастически?

Хотел бы я предложить больше помощи с кодом - я всегда использую nidaqmx c api под linux, и мое приложение постоянно работает, поэтому я не знаком с набором инструментов или триггерами для matlab.

К вашему сведению и модераторам - я думаю, что могу нарушить это правило: "Пожалуйста, убедитесь, что вы ответили на вопрос; это сайт вопросов и ответов, а не дискуссионный форум". Я открыт для выговоров и исправлений в разделе комментариев - спасибо, что сообщили мне правильное использование сайта!

Другие вопросы по тегам