1

在获取波形数据(2 个通道)和模拟输入触发(设置为预触发模式 - 负延迟值)时,我在 matlab 中接收到 DataMissed 事件。

这是代码:

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 MB,daqmem 报告有超过 360MB 的可用空间(尽管缓冲模式设置为自动)。我想知道是否需要在 while 循环中定期调用 getdata(ai) 来清除内存。另一种可能性是我运行的系统采样率太高?

硬件:

  • 双核 CPU (Athlon X2 3200)、4GB RAM、500GB SATA 硬盘
  • NI PCI-6122

我应该提到,在按下触发器之前让系统获取的时间越长(及时),获得 DataMissed 事件的可能性就会越高。

我的数据采集代码是否有问题(我最不确定在采集过程中是否有暂停)?硬件?有什么不用担心的吗?Visual Studio 是否更适合处理 NI 板?

4

1 回答 1

1

我没有答案,但我可以告诉你一些我可能用来调试的步骤。在你原来的 Q 中注意到这些事情的答案也可能会给 nidaqmx 用户提供关于你的问题的额外线索。

首先,您是否曾经在仅使用一次触发而不是触发 100 次时错过样本?

您是否错过了较低采集率的样本?

如果您更改参数以仅保留触发前采样,怎么样?只有触发后采样?

记录问题吗?如果您放弃记录到文件,而只是将数据读取到 matlab 变量中,如例中的数据采集工具箱文档中的那样,那会改变什么吗?

您丢失样品的频率如何?每运行 100 个触发器一次?每 100 次触发运行 100 次?还是随机的?

希望我能在代码方面提供更多帮助 - 我总是在 linux 下使用 nidaqmx c api,我的应用程序是一个持续运行的东西,所以我不熟悉 matlab 工具箱或触发。

仅供您和版主参考 - 我想我可能违反了这条规则:“请确保您回答问题;这是一个问答网站,而不是论坛。” 我愿意在评论部分进行谴责和更正 - 感谢您让我知道该网站的适当用法!

于 2011-08-02T03:33:50.060 回答