关键词:虚拟仪器;VME总线; LabVIEW;动态链接库
Abstract: This paper presents the design of Virtual Instrument technique based VMEbus, Which has been applied in BESIII Main Drift Chamber Electronics successfully. This design, developed in LabVIEW and VC++ 6.0, has realized the communication between LabVIEW and data acquisition card non-NI. LabVIEW and its DLL calling mechanism are introduced briefly. Testing functions of the software, as well as its user interfaces, are described in detail.
Key words: Virtual Instruments; VMEbus;, LabVIEW; Dynamic Link Library
1 引言
美国NI公司提出的虚拟仪器概念,是对传统仪器概念的重大突破。所谓虚拟仪器,是将传统仪器硬件和计算机软件技术充分结合起来,以实现并扩展传统仪器的功能[1]。与传统仪器相比,虚拟仪器在智能化程度、处理能力、性能价格比、可操作性等方面均有明显的技术优势。同时VME总线是目前性能最好、应用最广的国际总线标准之一,因此,它与虚拟仪器的结合为自动测试系统提供了一个更为广阔的发展空间。
2 测试软件在VME总线上的实现
本文在VME总线上使用虚拟仪器技术,设计了一套行之有效的测试软件,实现了对BESIII主漂移室电子学测试系统的硬件调试和性能检测。
测试系统使用的SBS公司生产的VP7型嵌入式单板计算机是基于VME总线的6U主控制器。VP7集成了CPU、内存、硬盘、显示卡、USB接口、串口、并口、10/100M以太网卡接口,可以运行Windows 2000/NT/98,VxWorks,Linux,MS-DOS等操作系统,并且向Windows操作系统提供了一套UniSDK_NT工具包。UniSDK_NT工具包的核心部分是UniAPI接口函数,采用标准C语言编写。UniAPI实现了对VME总线的访问和控制,本设计用到的接口函数主要有:
API_RESULT VmeMasterOpen(VME_MASTER_CHANNEL *pMasterChannel);
API_RESULT VmeMasterClose(VME_MASTER_CHANNEL *pMasterChannel);
API_RESULT VmeWrite32(VME_MASTER_CHANNEL MasterChannel, U32 VmeAddress, U32 Data);
U32 VmeRead32(VME_MASTER_CHANNEL MasterChannel, U32 VmeAddress, API_RESULT* pResult)
等等。
测试软件采用Visual C++ 6.0作为调用VP7 API的开发工具,对VME总线执行读、写操作以及响应中断,并生成动态链接库(Dynamic Link Library,DLL),供上层用户程序调用。
由于需要实现参数设置、数据显示等功能,希望在测试过程中像对真实仪器一样对面板操作,测试软件使用虚拟仪器软件开发平台LabVIEW编写上层用户程序。LabVIEW作为一种图形化编程语言,它的一个极为方便之处就是提供了大量的和实际仪器控制面板类似的图形组件, 这使得界面编程极其简单, 并且在计算机上操作这些图形界面和在现实中操作实际仪器几乎完全一样。但是LabVIEW在访问底层硬件,尤其是用户自行设计的硬件方面,却不如C语言功能强大。为此LabVIEW通过DLL、共享库等途径实现了与外部程序代码相连接,将其自身无法或不易实现的任务通过能够或更适于完成此类任务的外部代码来实现[2]。该软件采用LabVIEW提供的动态链接库机制,通过调用VC++编译生成的DLL,实现对底层各功能插件的访问。调用动态链接库机制是该测试软件使用的关键技术,具体用LabVIEW功能模板中的“调用库函数节点(Call Library Function Node,CLF)”实现。
实现方法如图1所示。
图1 测试软件实现方法示意图
2.1在VC++环境中使用VP7 API编写动态链接库
测试软件使用VP7提供的UniSDK_NT中的接口函数编写和动态链接库的链接。DLL文件的生成过程如下:
1) 在菜单中选择File\New\Project新建一个工程,工程名设为DAQdll;
2) 在工程列表中选择Win32 Dynamic-Link Library;
3) 选择存放目录,这样就创建了DAQdll.dll工程;
4) 在DAQdll工程中,选择Add\Add New File,新建一个文件DAQdll.cpp;
5) 编辑DAQdll.cpp文件:
#include
……
void GetWaveform(VME_MASTER_CHANNEL channel, int nModuleNum,
int nChannel, unsigned long waveform[])
{
API_RESULT Api_Result;
……
for(int i=0; i<63; i++)
{
waveform[i] = VmeRead32(channel, chnAddr, &Api_Result) ;
}
return 0;
}
……
6) 在DAQdll工程中,选择Add\Add New File,新建一个文件为DAQdll.def;
7) 编辑DAQdll.def文件:
LIBRARY DAQdll
EXPORTS
;Explicit exports can go here
GetWaveForm @1
这些代码描述了DLL的属性。第一句给出DLL的名称;第二句用EXPORTS语句列出导出函数列表;第三句是注释语句;第四句是DLL中可被调用的函数名。
8) 编译程序,就成功生成了DAQdll.dll动态链接库文件以供调用。
2.2 LabVIEW调用动态链接库
LabVIEW提供了4种调用外部程序代码的途径,其中动态链接库机制是LabVIEW调用标准共享库和用户自定义库函数的通用方法。具体实现时,是使用LabVIEW功能模板中“Advanced”子模板里的“调用库函数节点(Call Library Function Node)”。本设计中中对此节点的配置如图2所示。
图2 调用库函数节点配置对话框
其中,需要配置的项目有:
1)在“Library Name or Path”选项中键入此节点所要链接的DLL路径名D:\DAQdll;
2)在“Function Name”选项中键入DLL文件中将要调用的函数名GetWaveForm;
3)在“Calling Conventions”选项中选择“C”,即所调用的库为使用C语言自己创建的库;
4)在“Brouse”按钮下方的选项中选择“Run in UI Thread”,即该调用过程运行在用户接口线程中;
5)参数设置和返回值设置中,有三个选项:参数名称(Parameter)、参数类型(Type)和数据类型(Data Type)。参数类型和数据类型设置成与被调用函数的类型完全一致。第一个参数是被调用函数的返回值,单击右侧的Add Parameter After可以给函数添加输入参数和输出结果,每个参数都要设置自己的参数类型和数据类型。设置完成后,被调用的函数原型会显示在“Function Prototype”框中。
3 测试软件在实际中的应用
本设计使用上述虚拟仪器技术,实现了BESIII主漂移室电子学测试系统的软件设计,对测试系统进行了数据的采集与显示,完成了测试系统的波形重建功能,得到如图3所示结果。使用此软件时,可以通过改变左边的参数,对输入波形进行调节,调节的结果均能在虚拟仪器前面板中重建的波形上及时反映出来。对同一输入波形,示波器观测结果和在显示器上虚拟仪器显示的重建结果能够很好地吻合。
图3 波形重建虚拟仪器程序
4 结束语
虚拟仪器技术是计算机技术、软件技术、电子技术的完美组合,其中软件是虚拟仪器的核心。利用LabVIEW调用由VC++编译的动态链接库机制,在VME总线上建立了一套实用、可靠的测试系统,运用在BESIII主漂移室电子学测试系统上,为系统提供了一种有效的测试方案,得到了良好的效果。
5 本文作者创新点
1)通过调用动态链接库,在LabVIEW开发环境中使用非NI板卡实现VME总线上的数据采集,可以降低开发测试系统时,用于购置数据采集硬件的成本。
2)详细介绍了在使用CFLN过程中的步骤和注意点,提高了开发者的程序调试成功率。
参考文献:
[1]. 薛得凤.基于图形化编程语言Labview的一种虚拟仪器的实现[J]. 自动化与仪器仪表,2003年,109(5): 24~26
[2]. 吉顺祥,刘旺锁等.LabVIEW的外部代码接口技术应用[J]. 微计算机信息,2006年,11-1:205~207