基于LabVIEW的通用数据采集卡软件系统
2015-01-27宋方伟
宋方伟,陈 航
(中国兵器工业第五八研究所 特种电子技术部,四川 绵阳 621000)
0 引言
传统数据采集系统的开发流程包括:底层硬件设计、底层驱动设计、动态链接库设计和应用程序设计。其中,底层硬件设计是开发具有数据采集功能的计算机扩展卡,并通过USB、PXI、PCI、PCI Express、RapidIO等总线接入主控机。软件系统包括:驱动程序、动态链接库和数据采集应用程序。以Windows 系统下的底层驱动开发为例,通常使用DDK 和DriverStudio 等Windows驱动开发工具,在VC++开发环境下进行底层驱动的开发并提供数据采集应用程序调用的动态链接库。用VC++开发数据采集卡的应用程序较为常用,但其缺点显而易见:①VC++没有集成信号的采集、分析和图形化显示功能,开发图形化分析应用程序难度大;②应用程序需要评审,以保证其正确性;③应用程序的可移植性不好,不同公司的代码不能复用。
鉴于上述问题,本文提出基于LabVIEW 的通用数据采集卡软件系统的设计方法。利用LabVIEW 内置信号采集、测量分析与数据显示功能,实现不同数据采集卡软件系统的标准化和通用化。
1 系统开发结构
基于LabVIEW 的通用数据采集卡软件系统的开发流程如图1 所示。图中:首先,基于DriverStudio 开发驱动程序,封装成为LabVIEW 调用库函数节点(CLF)调用的动态链接库(DLL)要求的标准库函数,然后Lab-VIEW 通过CLF 节点方式调用标准DLL 函数接口并封装成常用的LabVIEW 数据采集子VI,最后利用通用的LabVIEW 数据采集应用程序完成数据采集。从流程可以看出,只要将DLL 按照标准的函数接口规范封装,Lab-VIEW 子VI 和应用程序的代码完全通用。
图1 系统开发流程
2 驱动设计和动态链接库接口定义
2.1 基于DriverStudio 的数据采集卡驱动程序
使用DriverStudio 驱动开发工具,从开始菜单启动Driver Wizards,选择Driver Works Project,开始创建一个驱动程序框架[1]。以基于PCI 总线的数据采集卡为例:
(1)选择总线类型时,选用PCI 总线,依据采集卡手册填写PCI 厂商ID 号和PCI 设备的ID 号。
(2)添加I/O 资源和内存资源时,添加的资源需和硬件的基地址寄存器对应。
(3)最后,为I/O 通信方式添加控制代码。例如添加PCI_AD_IOCTL_GetSampleData 采集数据帧的控制代码,完成驱动程序框架。会看到需要的i/o 通讯头文件包括添加控制命令定义:
#define PCI_AD_IOCTL_GetSampleData CTL_CODE(FILE_DEVICE_UNKNOWN,0x807,METHOD_IN_DIRECT,FILE_ANY_ACCESS)
2.2 CLF 的调用DLL 函数接口定义
DLL 使用CDeviceInterfaceClass 的实例去获得DeviceInterface 实例。DeviceInterface 成员函数DevicePath 返回一个路径名指针,发送给CreateFile 去打开设备。打开设备以后,DLL 通过函数ReadFile,WriteFile 和DeviceIoControl 函数调用访问设备。DLL 通过DeviceIoControl 向系统发出读取采集数据的命令后,系统向驱动程序发送KIrp(I/O 请求包),驱动程序获取该请求包,然后执行上节添加的函数[2]。
通用LabVIEW 数据采集应用程序常用5 个子VI,因此DLL 定义5 个CLF 调用的函数接口,其名称、参数及其描述如下[3]:
int AiConfig_interface(int nDevNo ,int nStart_Chan ,int Chans, int nFifo);
** 函数描述:打开板卡,初始化,设置起始通道和中断事件。
** 输入参数:nDevNo: 设备号;nStart_Chan:起始通道;Chans: 通道个数; nFifo:缓冲区大小;
int AiStart_interface (int nFreq ,int nSampleDataCount) ;
** 函数描述:设置采样频率和采样点数,然后启动采样
** 输入参数:nFreq: 单通道采样频率
SampleDataCount: 需采样的点数(设置为通道个数的倍数)
int AiRread_interface(int ndlen,double chnBuf [][]);
** 函数描述:等待中断到来,然后读取采集的数据
** 输入参数:dlen :读取采样点的数目
** 输出参数:chnBuf: 采集数据数组
int AiClear_interface (void) ;
** 函数描述:停止采样,并释放分配资源
3 数据采集子VI 封装和通用应用程序设计
3.1 基于FCL 的常见数据采集子VI 封装
LabVIEW 提供的数据采集卡的常用驱动方式有两种,调用C 语言源代码方式(CIN 方式),以及调用CLF方式[3]。本文选择通过CLF 方式,路径为在LabVIEW 开发工具面板依次选择(Function ->Advanced ->Call Library Function)实现对上节形成的DLL 库函数的调用,并根据函数返回值产生错误簇。例如:将AiClear_interface 函数作为CLF 调用的函数,其参数作为子VI 的端子,通过连接器进行图形化编程,形成AIClear.vi 子VI,如下:
图2 AI Clear.vi 代码
通过这种方式形成LabVIEW 数据采集应用程序常用的5 个子Vi,AI Config.vi、AI Start.vi、AI Read.vi、AI Clear.vi。
3.2 LabVIEW 下通用的数据采集应用程序
LabVIEW 下通用的数据采集应用程序如图3 所示,代码十分简洁,开发容易。另外,LabVIEW 可以自动规划多线程任务,可充分利用系统处理器的处理能力,从而提高模块的采集效率。
图3 LabVIEW 下通用的数据采集应用程序
4 结束语
笔者使用两张不同的CPCI 数据采集卡,按照本文方法封装标准的动态链接库接口。安装驱动后仅更换DLL,向采集卡的两个通道输入正弦波和三角波,使用通用的LabVIEW 数据采集程序,两张采集卡都采集到如图4 的信号。另外可以使用LabVIEW 强大的信号分析工具进行信号分析。
图4 基于LabVIEW 的通用DAQ 代码采集的信号
综上所述:本文采取方法成功集成了VC++和LabVIEW 图形化编程语言各自优势,开发人员只需注重底层驱动开发,开发难度降低,开发周期大大缩短,并可以使用LabVIEW 强大可视化信号分析工具,排除了在VC++环境下应用程序引入错误的可能性,软件系统质量得以提升。具有通用性强、易于开发、数据处理简单、性能稳定等特点,值得数据采集卡软件人员采用。
[1]武安河,邰铭,于洪涛.Windows 2000/XP WDM 设备驱动程序开发[M].北京: 电子工业出版社,2003.
[2]张春雨. PCI 总线数据输出板驱动程序的开发[J].重庆工学院学报(自然科学版),2008,6.
[3]LabVIEW Advanced Performance&Communication Course Manual[Z].NationalInstruments Corporation,2001.
[4]熊焕庭.在LabVIEW 中数据采集卡的三种驱动方法[J]. 电测与仪表,2001,428.