我如何在LabWindowsTM/CVI中获得DAQmx时间戳?



主要软件:
主要软件版本: 7.0
主要软件修正版本: N/A
次要软件: N/A

问题: 很遗憾的是,我们现在并没有可以直接在LabWindowsTM/CVI或者其它基于C的编程环境中返回时间戳的函数。这就要求我们手动编程地获取时间戳。

解答:

首先,在LabVIEW中DAQmx返回的时间戳t0表示读取第一个样本点的时间。这个时间t0是将调用DAQmx read函数时的系统时间,减去已经采集的样本点数代表的时间得到的。需要注意的一个重要的地方是,在采集完成之后再调用read是不行的,因为没有计算从采集完成到调用read函数之间的时间。

如果您希望了解t0局限和不足的更多信息,在DAQmx help中有简单的概述。您可以在 Start»Programs»National Instruments»NI-DAQ»DAQmx Help下找到帮助文档。打开之后,查找waveform timing limitations即可。另外,t0是由系统时间计算的来的,因此将会传递系统时间的误差。

在LabWindowsTM/CVI中,您并没有办法从驱动直接获取t0,因为您不能直接读取waveform数据类型。因此,我们需要手动地来计算t0。在有了t0和dt之后,我们可以近似计算波形中每一个样本点的时刻。

方法#1:
尝试完成驱动的工作。在获取系统时间之后马上调用DAQmx Read函数,减去dt * x,其中x是已经采集的样本点数。这需要您知道已经采集样本点的准确数目,该数目可以在DAQmx Read前调用Total Samples Per Channel Acquired属性获得。这样会引入一定的误差,例如,您的系统时间已经有一些不准确,加上在调用系统时间、total samples acquired以及DAQmx Read之间的时间。如果在调用系统时间和total samples acquired之间有新的数据样点采集,得到的t0应该偏移新的数据点数乘以dt。对于较低的时钟频率,您得到的时间戳准确度会高一些。

方法#2:
如果您没有使用任何触发以及您的采集任务在调用DAQmxStartTask函数之后立即开始,则可以使用方法#2。您需要做的仅是在DAQmxStartTask调用之前调用系统时间,然后用这个时间作为第一个采样点的时刻。这种方法的误差由系统时间误差以及调用系统时间和开始采集任务之间的时间差造成的。

一些考虑:
如果您使用触发来开始您的采集,则必须使用方法#1。如果您是在所有采样点都获取之后再调用DAQmxRead,则必须使用方法#2。否者,两种方法应该会非常接近第一个样点采集的初始时间。主要是您需要有保留的看待t0,了解使用系统时间获取时间戳有它内在的误差。如果您需要更精确时间戳信息的设备,强烈建议您考虑高速数字化仪。



相关链接: KnowledgeBase 328GJ77U: How Accurate is the Timestamp of the Waveform Returned by my NI-DAQmx Device

附件:





报告日期: 04/21/2009
最近更新: 07/29/2009
文档编号: 4WK812DE