数据采集的时候数据会不会丢失?
这是最常见的一个问题,刚开始学数据采集的时候都会在考虑,如果软件上读取数据的循环运行得不够快时,比如100K采样率的时候,软件上循环肯定没这么快,数据是不是就丢失了?
首先我们要清楚的是,数据采集功能是由数据采集卡来完成的,软件只是将采集到的数据接收到电脑上面过来,数据采集卡有自身的办法来解决硬件采集速度快过于软件读取速度的问题。
这需要对数据采集过程中数据的传输作一个介绍:外部的信号进入数据采集卡后,经过各种处理转换,先进入数据采集卡自身的缓冲区里面,缓冲区是先进先出(FIFO,First In First Out)的,NI的数据采集卡应该是都有板载的缓冲区,区别在于缓冲区的大小而已。然后当板载缓冲区中的数据量到了一定的条件时,数据采集卡将缓冲区的数据上传到计算机内存中,一般是以DMA(直接内存访问)方式传入的,但也可以设置为其它方式,比如中断等。上传数据的方式和时机可以通过DAQmx的属性节点进行设置或查看,DAQmx中默认是使用DMA传输方式,传输条件是板载内存非空。
以下蓝色部分摘自NI网站:
数据传输方式包括直接内存访问(DMA),中断请求(IRQ)和可编程I/O。DMA是一种DAQ板卡和PC内存间直接通讯的传输方式,不再需要处理器的干预。NI "MITE"芯片可以处理与PCI总线间的所有总线协议。IRQ传输方式会置高信号并中断处理器,然后由处理器处理数据传输。
IRQ 传输通常很低,只有150 kb/s,而DMA可以高达20 Mb/s。IRQ 传输速率与使用的系统设备相关,如处理器速度等。 图 1 设置模拟输入数据传递方式与时机
数据到了内存后,再由程序中的DAQmx Read.vi从内存中读入到计算机中去。这里计算机的内存要和板载缓冲区区分开来,板载缓冲区是厂商固定死的,改变不了,不会出现溢出的情况,它的空间可以很小,比如1Kbit以下,但计算机中为数据采集开辟的内存建议是采样率的10左右,即是说即使DAQmx Read.vi在10秒钟都没有执行一次的话,那么就会出现内存不足以存放采集到的数据的问题,导致数据丢失,DAQmx Read.vi会报错。内存中的大小可以在DAQmx timing (Sample Clock).vi的每通道采样输入端进行设置,参考下图中DAQmx帮助中的说明: 图2
设置内存缓冲区大小
但是DAQmx会默认设置一个最小值,如果你在每通道采样输入端设置的值小于这个值的话,DAQmx会忽略你输入的这个值而使用默认最小值,见下图:
图3 确定缓冲区大小
不过单单将这个缓冲区设置成10倍,并不一定能保证缓冲区不会溢出,因为缓冲区的存储的数据量不但跟它的输入速度(采样率)有关,还跟它的输出速度有关,它的输出速度就是采集程序从它里面读取的速度,所以一般在使用循环中调用DAQmx Read.vi的时候,一般是选择多态VI中的多采样而不是单采样。
同时将它的每通道采样数设置为-1,表示每次调用DAQmx Read.vi的时候都是将内存中的所有数据读取进来。在一些特殊情况下才将这个输入设置为其它整数,但就得保证循环能尽快的执行,以免缓冲区溢出。如果设置为100的话,表示每次从缓冲区中读取100个数据回来,如果缓冲区的数据不足100个,那么就会等到够了100个后才读进来并输出,程序会在这里等待缓冲区的数据够100个才往后执行,跟串口设置读取缓冲区字节数一样。设置为-1则不会出现等待的情况,有就读,没有就返回空数组。
所以,总结一下,为了保证数据不会失丢,要设置好内存缓冲区的大小,还要保证读取缓冲区的程序(DAQmx Read.vi)循环得尽量快,每一次读取的数据尽量多。
3