在前面几篇有关计数器的文章中,谈到了缓冲区的概念。对于数据采集的另外两种类型,模拟量输入(AD)和模拟量输出,缓冲区的概念更为重要。
在数据采集过程中经常遇到缓冲区重写错误,一般提示,原来采集的数据已经被重写。这样的错误与缓冲区密切相关。
在传统DAQ中 缓冲区非常明显,但是在新的DAQMX中,缓冲区的分配被隐含了,从程序框图上看不到缓冲区的概念 ,这一方面简化了编程的复杂性,对于初学者非常有利, 但是另一方面,由于不了解缓冲区的基本原理,导致采集程序的低效和错误无法处理。
下面谈一下NI板卡模拟量缓冲区是如何确定的,这些知识在DAQMX文档中解释的非常清楚。
输入类型任务这里指的模拟量输入,我们知道模拟量输入可以分为单点采集方式、定点采集方式和连续采集方式。
A、单点采集方式不需要分配缓冲区。
B、定点采集方式
所谓定点采集,是由用户确定需要采样的点数,这可以通过设置Samples Per Channel参数实现。比如每通道采集1000个采样,采集8个通道,则分配的缓冲区大小为1000×8,因此LV分配的缓冲区是足够容纳所有采样点的。
上面是定点采集的程序框图,红色箭头处表示与分配缓冲区相关的参数。
C、连续采集方式
同定点采集方式类似,连续采集方式下,LV分配的最小缓冲区等于每通道采样数X通道数,保证能容纳规定的采样数量。但是与定点采样不同,根据每通道采样数和采样速率设置不同,LV会对缓冲区进一步调整,如下表所示。连续采集方式下,缓冲区的大小不仅取决于Samples Per Channel,也取决于Sample Rate,缓冲区的大小取二者之间较大的数。
连续采集方式缓冲区的大小与采样率相同,这是可以理解的。设想一下,在高速采样的情况下,采样速率为100万每秒,每通道采样1000个,假设为单通道采集,则1000个采样需要时间为1毫秒。如果缓冲区为1000,则必须保证1MS 读取一次,每次1000个。这对于WINDOWS操作系统,由于其非实时性,根本无法保证1MS循环一次。所以必须要扩大缓冲区的大小,才能满足要求。
一般情况下,连续采集的缓冲区大小决定于采样速率,其分配情况如下表所示。
| Sample Rate | Buffer Size |
|---|---|
| No rate specified | 10 kS |
| 0–100 S/s | 1 kS |
| 100–10,000 S/s | 10 kS |
| 10,000–1,000,000 S/s | 100 kS |
| >1,000,000 S/s | 1 MS |
看一下连续采集方式下的程序框图。
不仅仅是AD采集需要缓冲区,缓冲计数方式和DA波形输出都涉及到缓冲区分配的问题。对于AD采集,为了充分利用缓冲区的内存,采用循环缓冲的方式,在以后的文章中,会专门说明循环缓冲区的工作原理。