首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在从NI板进行数据采集时,如何避免matlab中的数据丢失事件?

在从NI板进行数据采集时,如何避免matlab中的数据丢失事件?
EN

Stack Overflow用户
提问于 2011-07-26 23:00:30
回答 1查看 1.3K关注 0票数 1

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

以下是代码:

代码语言:javascript
复制
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输出的一个示例:

代码语言:javascript
复制
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报告有超过360 MB的空闲(尽管缓冲区模式被设置为Auto)。我想知道是否需要定期调用while循环中的getdata(ai)来清除内存。另一种可能是我对系统的抽样率太高了?

硬件:

  • 双核CPU (Athlon X2 3200),4GB内存,500 GB SATA硬盘
  • 镍PCI-6122

我应该指出,在按下触发器之前,我让系统获取的时间越长,获得DataMissed事件的可能性就越大。

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-08-02 03:33:50

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

首先,当只使用单个触发器而不是触发100次时,您是否错过过示例?

你会错过低收购率的样品吗?

如果您更改参数以只保留触发前的samps,怎么样?只有触发后的桑普?

记录问题了吗?如果您放弃将日志记录到文件中,而只是像数据获取工具箱文档中的示例那样,将数据读入matlab变量,这会改变什么吗?

你多久漏掉样本一次?每次运行100次触发器?每100次触发器运行100次?或者是随机的?

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

我想我可能违反了这条规则:“请务必回答问题,这是一个问答网站,而不是一个讨论论坛。”我是开放的批评和纠正在评论部分-谢谢你让我知道适当的网站使用!

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6837625

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档