关于在C++Builder中集成Labwindow功能模块的研究

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

第13卷专辑军械工程学院学报Vol.13Supp2001年11月JournalofOrdnanceEngineeringCollegeOct2001收稿日期:2001-10-15作者简介:刘金宁(1979-)男,在读研究生关于在C++Builder中集成面向虚拟仪器的Labwindows/CVI功能模块的研究刘金宁杨锁昌方新(军械工程学院导弹工程系,河北石家庄050003)摘要:把Labwindows/CVI的虚拟仪表设计和C++Builder强大的开发功能结合在一起,实现了良好的测试效果、数据管理和人机交互设计,以Labwindows/CVI作为测试工具,通过动态链接库(DLL)的形式实现了与C++Builder的集成开发。关键词:Labwindows/CVI;C++Builder;动态链接库;虚拟仪表目前,基于VXI、PXI、GPIB总线结构和Labwindows、Labview、HPVEE等编程平台的虚拟仪器设计不断涌现,而这几种平台存在一个共同点是:仪器控制能力很强,虚拟面板设计思想突出,数据采集、分析方便,但对数据库操作、数据打印、多媒体实现及仿Windows界面设计上略显不足,本文针对这一点,把Labwindows的虚拟仪器设计作为可被C++Builder调用的动态链接库(DLL),将Labwindows和C++Builder集成在一起,实现良好的仪器控制和外围开发功能。1Labwindows/CVI的动态链接库在Windows编程设计上,用动态链接库(DLL)实现程序间的互连既达到了程序的模块化设计、又使多平台间可实现快速、便捷的互相调用,达到良好的移植、兼容效果。Labwindows/CVI是良好的虚拟仪器开发平台,可对仪器进行方便的控制,实现数据的采集、显示、分析等功能。若能把它与其它编程平台结合起来将对虚拟仪器编程带来极大的方便。原则上Labwindows/CVI编译的动态链接库可与任意平台进行集成,只要在编译动态链接库的importlibrary文件时选择与外围平台兼容的模式,而且用Labwindows/CVI自己提供的办法解决如数据类型、参数传送方式等兼容问题就可以,如不同平台对于“结构”数据类型默认元素的个数有不同的定义,在Labwindows/CVI中可用#pragmapack进行不同的设定,以实现兼容。DLLMain函数规定了Labwindows/CVI动态链接库的调用机制,所以在每个动态链接库中均包括一个DLLMain函数,当编辑完动态链接库的仪器界面和源代码后,用GeneratedynamiclinkLibrary命令就可以实现动态链接库的编译、链接,生成动态链接库及其.lib文件。2Labwindows/CVI的动态链接库与C++Builder的集成C++Builder是Borland公司推出的继Delphi之后的又一功能强大、操作简单的编程平台,它在以BDE为引擎的数据库编程方面有控制灵活、操作简便的特点,把它与Labwindows/CVI的仪器控制、数据采集结合起来会实现良好的虚拟仪器开发。把通过Labwindows/CVI编程进行测试所得到的数据送到C++Builder的后台数据库有多种办法,如DDE连接、DLL链接、外围模块调用等,其中DLL链接是最好的,它操作简单,速度最快、最灵活,而且不用考虑兼容问题。22.1Labwidows/CVI的动态链接库生成格式和运行机制用Labwindows/CVI的GeneratedynamiclinkLibrary命令生成动态链接库时,系统会提供诸多选项以供选择,如生成动态链接库的存储路径、输出函数选择、外围库链接选择等,当在其他程序中实现了动态链接库的调用后,若Labwindows/CVI用IncludeFileMethod方式生成动态链接库,则外围程序可以调用Labwindows/CVI头文件中声明的全局变量和函数,若用ExportQualifierMethod方式,则可调用带有输出标记_declspec(dllexport或export)的函数、变量,并均需在头文件中声明。在Labwindows/CVI的动态链接库被其他程序调用时,动态链接库有自己的运行机制,它会在自己的主函数DLLMain()中定义两个事件句柄――PROCESS_ATTACH和PROCESS_DETACH,前者在启动时由系统触发,调用InitCVIRTE()进行引擎机制的初始化,后者在调用结束时由系统触发,调用CloseCVIRTE()释放动态链接库所占用的内存。然而在调用多个动态链接库时PROCESS_DETACH信息容易造成混乱,Labwindows/CVI的Run-timeEngine中提供了一RunStateCallback()函数,可对程序的执行情况进行纪录,如开始、结束、中断、重复执行等,但很可惜这一机制在外围平台上无法运行,为此Labwindows/CVI提供了另一种机制,那就是即用即放,与此相关有一CVIRTEHasBeenDetached()函数,在调用完动态链接库中的函数后就调用此函数,它会一直返回FALSE直到当前动态链接库接受到PROCESS_DETACH事件以释放资源后才返回TRUE。CVIRTEHasBeenDetached()在cvirte.dll中,可用加载cvirte.h的方法实现调用。2.2Labwindows/CVI的动态链接库在C++Builder中调用C++Builder调用Labwindows/CVI的动态链接库象调用自己的动态链接库一样,有显式连接和隐式连接两种,其中隐式连接是通过动态链接库的importlibraryfile(.lib文件)实现,.lib文件在Labwindows/CVI生成动态链接库的同时生成,而显式连接是通过C++Builder的Loadlibrary函数实现。利用Labwindows/CVI可设计出良好的仪器操作界面,它是虚拟仪器设计中最关键的部分,但这同时也给动态链接库的调用带来了困难,因为外围平台在调用Labwindows/CVI的动态链接库时,共用户界面库只在调用程序的函数列表中查找与动态链接库的.UIR文件中包含的函数相匹配的函数、变量声明,这就直接导致了外围平台找不到在.UIR文件中有但不被动态链接库输出的函数、变量,发生链接错误。然而Labwindows/CVI提供了解决这一问题的办法,它用LoadPanelEx或LoadPanelEx函数代替LoadPanel或LoadPanel,因为当用外围平台的LoadLibrary函数得到动态链接库的句柄传给LoadPanelEx或LoadPanelEx函数后,在调用动态链接库的界面时,共用户界面库会首先在动态链接库函数列表中查找.UIR文件中的匹配函数、变量,这样就会实现良好的链接调用,实现界面互连。2.3Labwindows/CVI的动态链接库和C++Builder间的数据传递在Labwindows/CVI的动态链接库被C++Builder调用的过程中,C++Builder是程序主体,它的全局、局部变量对于Labwindows/CVI的被调用函数和C++Builder来说都是可见的,都可以作为参数传递给动态链接库中C++Builder可见的变量和函数,但Labwindows/CVI的变量中却只有全局变量定义输出后才可被C++Builder调用,因为只有通过这种形式,变量象函数一样在.h文件中声明或作了输出标记,才可以被C++Builder象输出函数一样识别,综上Labwindows/CVI和C++Builder间传递数据有两种方法:(1)共享全局变量的方式,在C++Builder和Labwindows/CVI声明的全局变量均可共享。(2)参数传递方式,在C++Builder中声明并通过函数的形式参数传递到Labwindows/CVI中。Labwindows/CVI和C++Builder结合的目的也是为了传递数据到C++Builder,方便数据的管理和被其它模块调用,以实现数据共享,但是用全局变量传递数据存在问题,那就是若在C++Builder和Labwindows/CVI中均由某个全局变量的定义,将会导致识别错误,为此本课题采用了函数形式参数传递数据的方法,把待赋值变量和待输出变量用某个函数连接起来,实现Labwindows/CVI的测试数据导入C++Builder中,如下所示:3在Labwindows/CVI中A,B,C......代表采集数据的值,a、b、c......代表待赋值变量,作为某个函数的参数即intCVICallbackShuchu(a,b,c......),在这个函数中把Labwindows/CVI的测试数据A,B,C传递给a,b,c......因此只要利用参数传递数据方式,在调用此函数时把C++Builder的待赋值变量作为参数传递给此函数代替a,b,c就可以了,如此就实现了Labwindows/CVI的测试数据在两平台上的共享。2.4Labwindows/CVI的功能模块在C++Builder中的集成实例本例中C++Builder调用Labwindows/CVI的面板显示和数据采集模块,以达到Labwindows/CVI的功能模块在C++Builder中集成调用的目的。(1)Labwindows/CVI的功能模块以动态链接库的形式被调用,代码如下:①Labwindows/CVI在.h文件中对输出函数进行声明intmain1(HINSTANCECVIUserHInst);②Labwindows/CVI在.c文件中对输出函数进行定义#includeconvolv5.h……int__stdcallDllMain(HINSTANCEhinstDLL,DWORDfdwReason,LPVOIDlpvReserved)//在DllMain和DllEntryPoint函数中定义了Labwindows/CVI动态连接库的运行机制,如前所述{switch(fdwReason){caseDLL_PROCESS_ATTACH://模块被外围程序调用时CVI自身的运行机制if(InitCVIRTE(hinstDLL,0,0)==0)return0;/*outofmemory*/break;caseDLL_PROCESS_DETACH:CloseCVIRTE();}return1;}int__stdcallDllEntryPoint(HINSTANCEhinstDLL,DWORDfdwReason,LPVOIDlpvReserved){returnDllMain(hinstDLL,fdwReason,lpvReserved);}intmain1(HINSTANCECVIUserHInst)//对Labwindows/CVI的调用面板函数main1进行定义并采集数据{mainpnl=LoadPanelEx(0,convolve.uir,MAINPNL,CVIUserHInst);intbe;……//控制仪器采集数据并赋予变量beDisplayPanel(mainpnl);RunUserInterface();return0;}4(2)C++Builder的主调用模块,代码如下:①C++Builder在.h文件中对调用函数进行声明#includeForms.hpp……externC_declspec(dllimport)_stdcallintmain1(HINSTANCECVIUserHInst);②C++Bilder在.cpp文件中对面板显示函数main1和采集数据进行调用#include“Unit1.h”……void__fastcallTForm1::Button1Click(TObject*Sender){HINSTANCEDLLinst=NULL;//定义动态连接库的调用句柄DLLinst并赋初值DLLinst=LoadLibrary(convolv5.dll);//装载动态连接库convolv5.dllmain1(DL

1 / 5
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功