武 剑,李巴津
摘 要:针对功能强大,应用广泛的虚拟仪器开发软件LabVIEW只能直接支持NI公司的数据采集卡,而不能直接使用普通数据采集卡的问题。重点研究在LabVIEW平台下驱动普通数据采集卡的重要方法即调用动态链接库,并结合具体实例介绍了在LabVIEW中调用动态链接库的关键技术及步骤,实现了LabVIEW与普通数据采集卡的结合。实际证明,采用这种方法省去了复杂的语言编程,缩短了软件的开发时间,节约了系统开发成本,同时也增加了应用的灵活性。
关键词:LabVIEW;动态链接库;虚拟仪器;数据采集
中图分类号:TP399文献标识码:A
文章编号:1004-373X(2009)12-149-03
Research on Driver of General Data Acquisition Card Based on LabVIEW
WU Jian,LI Bajin
(College of Information Engineering,Inner Mongolia University of Technology,Hohhot,010051,China)
Abstract:Facing the problem that virtual instrumentation development software such as LabVIEW can only support its company′s card and can not support other company′s DAQ card,an important method of using an ordinary DAQ card in virtual instrumentation development software which is calling dynamic link library functions is studied.And from the examples,the key process and procedure of calling dynamic link library functions in LabVIEW is presented.It realizes the combination of LabVIEW and ordinary DAQ card.It proves that this method can avoid the complicated computer program,shorten software-developing time,save cost and increase the application agility.
Keywords:LabVIEW;dynamic link library;virtual instrument;data acquisition
0 引 言
虚拟仪器技术是20世纪90年代发展起来的一种新技术,融计算机和总线技术、微电子技术、测量技术于一身,它是对传统仪器的重大突破,是计算机技术与仪器技术相结合的产物。它利用计算机系统的强大功能,结合相应的硬件,大大突破传统仪器在数据处理、显示和存储以及系统维护和扩展等方面的限制。虚拟仪器的众多优点使其得到了广泛的应用,然而当今著名的虚拟仪器开发软件(如LabVIEW等)只能支持NI公司生产的数据采集卡,而不能直接驱动普通的数据采集卡。本文重点研究了在虚拟仪器开发软件平台LabVIEW下使用普通数据采集卡的方法。
1 虚拟仪器开发平台 LabVIEW与数据采集卡的连接
LabVIEW是美国NI公司推出的一种基于G语言(Graphics Language),即图形化编程语言的虚拟仪器软件开发工具,具有强大的数据采集功能,通常只支持NI公司的数据采集卡,而这些卡的价格比较昂贵。因此,为了能在LabVIEW平台上驱动普通的数据采集卡,用户必须通过LabVIEW所提供的调用库函数节点(Call Library Function Node,CLFN)及代码接口节点(Code Interface Node,CIN)等功能,将功能强大、编程灵活、而且已有很多现成程序模块的C语言同LabVIEW中编程直观方便的图形化G语言结合起来,从而实现用普通的数据采集卡来采集数据的功能,使LabVIEW在对硬件的支持上有了一个质的飞跃。
在LabVIEW中利用CLFN节点可以较容易地实现访问动态链接库(DLL),而且在购买数据采集卡的时,厂商一般会给用户提供动态链接库。所以研究在LabVIEW平台下调用动态链接库驱动普通的数据采集卡来实现数据采集更具有普遍性。
2 基于动态链接库的普通数据采集卡的驱动
2.1 动态链接库概述
动态链接是一种应用程序在运行时与库文件连接起来的技术。动态链接库(DLL)是一个可以多方共享的程序模块,提供函数供Windows应用程序或其他的动态链接函数库直接或间接调用,只有在别的模块中调用了它的某个函数以后才发生作用。它是在应用程序运行时被装入和链接的,而不是把库代码复制到应用程序中,只是在程序中记录了函数的入口点和接口。动态链接库独立于编程语言,因此LabVIEW可以调用用大多数语言(如Visual C++,C++ Builder等)编写生成的动态链接库。在调用DLL的函数时,必须知道以下4个信息:函数返回的数据类型,函数调用的方式,函数的参数及类型,DLL库文件的位置等。
2.2 LabVIEW对DLL的调用
通过对Call Library Function Node的配置可以实现DLL的调用,关键要了解被调用的函数名称、功能及其输入/输出参数。配置节点的目的在于指定DLL模块中与LabVIEW数据交换的相应驱动函数。调用Call Library Function模块,双击此模块,在弹出CLF对话框中进行节点配置,CLF函数配置对话框见图1。第一个参数“库名或路径”,填入需要调用的动态链接库文件的名字和路径。第二个参数“函数名”,是链接库中要调用的函数名称。当在库名或路径栏中设定了DLL的路径后,在函数名下拉框中就可以看到该动态链接库所包含的所有函数名。第三个参数“调用规范”,此栏中可以设置该动态链接库是标准WINAPI调用还是普通的C调用。一般来说,都采用C调用,但是对于API调用则必须选择stdcall(WINAPI),最后一个需要注意的参数选项是线程安全选择,此栏中可以选择DLL是否可以被重入调用,默认情况是在UI线程中运行,即该动态链接库只能在User Interface Thread下运行。如果动态链接库中被调用的函数返回时间很长,那么就会导致LabVIEW不能执行UI线程中的其他任务,因此界面反应可能会很慢,甚至停止。这时候最好把它设为重入,若设置为重入,则该动态链接库可以由多个线程同时调用,但前提是必须保证该DLL能被多个线程同时安全调用。
图1 Call Library Function配置对话框
在参数配置菜单下设置函数的返回值类型和输入参数。对话框右侧对应每一个参数的参数名称、类型、数据类型、参数传递方式。其中,需要注意的是数据类型选项,在不同的编译平台下,数据类型的定义名称是不一样的。为了将数据类型一一对应,在LabVIEW中必须对数据类型名称定义进行转换。
3 普通数据采集卡在LabVIEW平台下的应用实例
以北京优采公司的UA301A型A/D数据采集卡为例,该采集卡在LabVIEW平台下不能直接被驱动。该采集卡提供了一个动态链接库ua300a.dll,此动态链接库中提供了许多简洁高效的采集和控制函数,支持UA301A采集器的各种功能。
UA301A为12位的A/D卡,系统中采用的是双极性输入信号和双极性原码的编码方法,转换的结果为二进制数,转换后得到0~4 095的数字量。为了直观表示被测物理量,需将转换后的数字量变换为具有实际工程意义的数值。当单极性信号输入时,模拟电压值V与数字量D的对应关系可描述为:V=D/4 095×10;当输入信号为双极性时,两者的对应关系为:V=(D-2 048)/4 095×10。这个转换过程在驱动设计中可采用Case结构来完成,把选择输入信号为单极性还是双极性作为这个Case结构的布尔值输入。数据采集驱动程序框图如图2所示。
图2 调用DLL的数据采集驱动程序框图
图2中4个CLF节点分别用来调用OpenUA300,minitz,readdataz,CloseUA300这四个函数。
对于LabVIEW与DLL函数之间传递数组类型数据,无论采用何种数组格式进行传递,都需要在LabVIEW中为数组预先分配空间,也就是给该数组开辟缓存,不然会导致程序崩溃。该程序在采集数据前预先为其初始化一个二维数组空间,为了使采集到的数据在数组中的位置始终对应于采样的每一通道,初始化数组空间时设置每通道采样点数为行,采集通道数为列,这样数据从采集卡FIFO存入缓存时,每一列对应每一通道的数据,省去了后续通过循环索引出各通道数据的繁琐。
为了实现数据的连续采集,系统应保持在循环状态,设计中采用While循环来实现这一功能,但是LabVIEW在执行While循环时,如果用户没有给它设定循环时间间隔,则它将以CPU的极限速度运行。这样可能会导致整个LabVIEW程序看上去像死机一样,所以需要给While循环加上一个指定的时间间隔。
在采集前首先设置采样通道、采样频率、采样点数、增益和数据传输方式等参数,该接口驱动的前面板见图3。
图3 数据采集驱动程序前面板
4 结 语
由此可以看出,在LabVIEW中调用动态链接库函数,来驱动普通数据采集卡的技术,显示出了LabVIEW强大的外部程序接口能力。应用此方法设计数据采集系统一方面可充分利用LabVIEW的界面友好、图形显示和虚拟仪器强大的开发功能等优点;另一方面又能大大降低系统的开发成本,可以使LabVIEW在对硬件的支持上有一个质的飞跃。
通过LabVIEW的外部程序接口CLF节点访问动态链接库来调用Windows标准库函数,使得LabVIEW支持的数据采集板卡范围突破了限制,同时也为LabVIEW访问底层函数提供了一种新的思路。
参考文献
[1]魏海燕,杨建新,都鼎新,等.基于LabVIEW的虚拟仪器开发[J].机械工程师,2004(4):50-51.
[2]Using External Code in LabVIEW[Z].National Instruments LabVIEW User Manual,2000.
[3]张凯,周陬,郭栋.虚拟仪器工程设计与开发[M].北京:国防工业出版社,2004.
[4]林康红,唐海峰.动态链接库DLL在虚拟仪器中的应用[J].计算机应用,2002(5):56-60.
[5]熊焕庭.在LabVIEW中数据采集卡的三种驱动方法[J].电测与仪表,2001,38(8):35-37.
[6]杨乐平,李海涛.LabVIEW高级程序设计[M].北京:清华大学出版社,2003.
[7]龙志强,吕治国.LabVIEW与通用数据采集卡的接口方法研究[J].微计算机信息,2001(9):11-13.
[8]北京优采测控有限公司.UA301A型A/D采集器使用说明[Z].2003.
[9]李广军,王厚军.实用接口技术[M].成都:电子科技大学出版社,1998.
[10]陈锡辉,张银鸿.LabVIEW8.20程序设计从入门到精通[M].北京:清华大学出版社,2007.