在获取波形数据(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 板?