关于数据采集时缓冲区大小的探讨
- 格式:pdf
- 大小:1.22 MB
- 文档页数:7
关于数据采集时缓冲区大小的探讨
在做数据采集时经常碰到缓冲区大小的问题,很多朋友在遇到此类问题时往往束手无策,即使通过调整参数解决了此问题,但还是很难避免下次不再出现此问题,鉴于网上对该问题的解决方法不够好,因此有必要对此问题探讨一下。
在探讨之前,先说明一下,由于我没有真实的数据采集卡,因此我用虚拟的NI PCI-6251采集卡来代替真实的数据采集卡,为此,我在MAX中创建了一个仿真设备,如下图:
紧接着我利用该仿真设备在MAX中创建了一个多通道(双通道)电压多点连续采样任务,如下图:
其各个参数配置如下:
采集模式为连续采样,待读取采样为800,采样率是20K,其余参数均采用默认值。
配置好之后点击上面的保存按钮保存该任务。
红色框中的三个参数从左至右分别对应于DAQmx定时.vi的采样模式、每通道采样、采样率。
如下图:
接下来,我们打开LabVIEW创建一个数据采集演示示例程序。
其前面板和程序框图分别如下:
现在我们程序,等待一段时间后程序弹出错误,如下图:
点击继续关闭对话框,此时的前面板运行结果如下:
我们注意到程序已经运行了5610毫秒。
出现上面错误的原因是数据采集卡采集数据速度要远快于读取数据速度,致使缓冲区已满。
那么我们如何避免这种情况呢?
我们来关注在这个数据采集演示示例中的几个重要的参数,采样率(我们用f s表示)、单次循环执行时间(我们用T表示)、每次循环读取的采样数(我们用n表示)、缓冲区大小(我们用N表示)。
在本次示例中,各个参数的值如下:
f s= 20K Hz (见下图红色部分)
T = 0.1 S (见下图红色部分)
n = 200 (见下图红色部分)
在NI – DAQmx帮助文档中有如下说明:
从说明中我们可以知道当采样率为20KHz时,NI – DAQmx将把100K作为缓冲区的大小,因此N = 100K。
由于缓冲区是环形的,程序在执行的过程中不断的从缓冲区读取数据,每当读取一部分数据后缓冲区中读取之前的该部分将在读取后变为可写,便于数据采集卡不断的从外部采集数据存储到环形缓冲区中。
当缓冲区中的数据被填满即没有可写的部分后将发生溢出从而导致上述错误。
我们假设在发生错误之前程序运行之后的任意时刻程序运行时间为t,那么在这t时间内数据采集卡一共采集的数据点数N1为
N1= f s×t
在t时间内DAQmx读取.vi一共读取的数据点数N2为
×t
N2= n
T
要想使环形缓冲区不溢出,就必须满足如下条件:
N1- N2< N
由于在实际的程序中,f s、n、T、N都是确定的值,这就意味着N1- N2的结果是关于t的一,则当K > 0时,随着t的增加,最终会存在一个临界值t0使得K×t0=N,次函数,令K = f s- n
T
虽然我不能阻止缓冲区的溢出,但是我们可以使程序出错时的t足够大。
当K = 0时,N1- N2< N永远成立!这是理想的情况,它表示在任意时刻,数据采集卡放进环形缓冲区的数据点数和DAQmx读取.vi从环形缓冲区中读取的数据点数相等,当K < 0时,N1- N2< N 也是永远成立!但是这种情况一般不采用。
现在我们把前面演示示例程序的参数数值带入上述公式:
t= 100000
20000t - 200
0.1
解出时间t = 5.556s = 5556ms。
这说明程序运行5556毫秒后缓冲区溢出,程序弹出错误,这与我们前面观察到的5610毫秒非常接近。
现在我们假设改变参数n和T,并且保证程序在3个小时内不发生上述错误,那么n和T应满足如下关系:
< 20000
19990.7407 < n
T
考虑到n是一个整数,并且T的小数点后三位有效,经过实际的计算,我们发现这个n和T 的具体指的确很难选取,比如我们取n = 1000,那么T的范围是(0.05,0.050023158),由于T是以秒为单位,转换为毫秒后T就只能取50毫秒,n取其它值时的情况也是如此,那么这样一来就是K=0的情况,即永远不会出现缓冲区溢出的情况。
本文的探讨到此为止。