计算机与现代化 2007年第8期JIS UAN JI YU X IAN DA I HUA总第144期文章编号:1006-2475(2007)08-0093-03收稿日期:2006-08-14基金项目:广西自然科学基金资助项目(0663022)作者简介:彭宇宁(1959-),女,四川成都人,广西大学电气工程学院高级工程师,研究方向:过程控制工程,网络化控制,虑拟仪器技术。
利用DLL 技术实现Lab V I E W 和MATL AB 混合编程彭宇宁,朱 后(广西大学电气工程学院,广西南宁530004)摘要:介绍了利用DLL 技术实现LabV IE W 和MA TLAB 进行混合编程的基本原理,并详细阐述了使用M ATLA B 插件和使用M ATLA B 引擎两种方法的步骤,最后对两种方法进行了比较,总结了基于DLL 混合编程的技术特点。
关键词:动态连接库;Lab V IE W ;MA TLAB ;混合编程中图分类号:TP311.13 文献标识码:AUsi n g DLL Techni q ue to Reali z eM ixed Progra mm ing wit h La bVI E W andMATLABPE NG Yu -ning ,ZHU H ou(Instit u t e o f E lectrica l Eng i neering ,Guangx i Un i ve rsit y ,N anning 530004,China )Ab stract :T his paper i n troduces t he keystone o f usi ng D LL to rea lize the m ixed prog ramm i ng w it h Lab V I E W and M ATLA B .A t t he sa m e ti m e ,t he st eps of bo t h m ethods are expa tia t ed :using M ATLA B A dd -i n and i nvoking M ATLA B engine .In the end o f t he ar ticle ,w e co m pa re t hese t wo m ethods ,and s umm arize the advantages o fm i xed progra mm ing v ia DLL .K ey w ords :DLL ;LabV IE W ;MA TLAB ;m i xed progra mm ing0 引 言Lab V I E W 作为虚拟仪器的开发软件,具有功能完整、应用灵活、易于理解、编程简单、开发效率高等优点,已成为虚拟仪器开发事实上的工业标准。
但其在工程计算、图形处理、先进控制、系统建模和仿真方面远不及MATL AB 功能强大。
而MATL AB 在循环处理、图形界面开发、数据输入、网络通信、硬件控制等方面也不如Lab V I E W 。
因此实现两者混合编程,将两者的优势结合互补不足,对于开发功能更为强大的虚拟仪器具有巨大的推动作用。
目前Lab V I E W 和MATLAB 的混合编程方法有三种:第一种基于A ctive X 控件技术,包括MATL AB 脚本节点和Active X 函数模板;第二种基于动态数据交换(DDE )技术;第三种基于组件对象模型(C OM )技术。
前面两种方法都不能脱离MATL AB 环境独立运行,第三种方法相对独立且执行效率较高,但不能全面支持MATL AB 的应用。
本文利用DLL (动态连接库)技术将La bVI E W 、VC 、MATL AB 混合编程有机结合起来,提出一种新的LabVI E W 和MATLAB 进行数据交换和控制的方法。
1 基本原理DLL (Dyna m ic -Link Li b r ary )-动态连接库是基于W indo w s 程序设计的一个重要组成部分,它由一系列封装好的可执行代码组成,其内部函数能被其他程序所共享。
DLL 的编制与具体的编程语言及编译器无关,只要遵守DLL 的开发规范和编程策略,并安排正确的接口,不管用何种编程语言编制的DLL 都具有通用性。
LabV I E W 通过CLF (Ca ll Librar y Function N ode )实现对DLL 的函数[1]。
另一方面,MATLAB 通过MATL AB 编译器和计算引擎为C 语言提供了功能强大的接口,可将与MATLAB 通讯的C 代码编制成DLL 文件供LabV I E W 调用,实现LabV I E W 和MAT -LAB 间接数据交换。
下面举一个简单的例子(本例已在LabV I E W 7.1,M icroso ftV isual C ++6.0,MAT -LAB 6.5上通过),介绍利用DLL 实现LabV I E W 和MATL AB 混合编程的两种途径。
94 计 算 机 与 现 代 化2007年第8期方法一:使用MATLAB 插件生成的共享库(shared M -DLL )。
MATL AB 编译器可以将M 文件编译成C /C ++代码,然后利用C /C ++编译器将其再编译成DLL 供LabV I E W 调用。
工作原理如图1所示。
图1 Lab V I E W 调用M 文件的原理图M a t h W o r ks 公司为V isua l Studi o 开发环境提供了一个MATL AB 插件,该插件可使在VC ++工程中插入M 文件的工作自动化。
因此在下面的工作开始之前,应先为VC 6.0安装这个插件。
为了方便理解,以求一个阵列的正弦值的简单例子来说明其具体步骤。
(1)编写求一个阵列正弦值的M 文件(算法),此处M 文件应为函数文件。
functi on y =sin w ave (x )y =si n (x );(2)保存好M 文件后,切换到VC 环境中新建包含此M 文件的shar edM -DLL 工程。
(3)向工程添加数据交换和算法调用函数。
函数文件经MATLAB 编译器后,其输入输出类型均为m x A rray 指针。
LabV I E W 支持标准C 数据类型(包括数值、数组、字符串、指针等)但不支持m x A r -r ay ,所以必须将m xA rray 转换成标准C 数据才能正确传递给Lab V I E W ,反之,标准C 数据必须转换成m x A rray 也才能作为M -DLL 中函数的参数。
这两个工作可分别通过m x G et P r ()和m xSetPr ()或者m e m cpy ()来完成。
下面给出本例的数据交换和算法调用代码,其他应用与之类同#i nclude "sin w ave .h "//这个头文件与M 文件名相同#i nclude "m _tes.t h "//这个头文件的名字与工程名相同#i nclude "m atl ab .h "//包含mx *()函数的声明/*_declspec (dll expo rt )为VC 中D LL 声明导出函数的关键字,也可用.def 文件指定导出函数。
本例中此函数作为导出函数供L abV IE W 调用,完成数据交换和算法调用等工作。
*/_dec lspec (d llexport )vo id si ne (doub l e *x ,double *y ,i n t len ){m x A rray *t m p =NU LL ,*rslt =NULL ;double *t ;int i ;m _testIn itia lize ();//此函数由MA TLAB 插件自动生成,与工程名有关,用来初始化库函数。
//给m xA rray 实部赋值t mp =m xC rea t eD oub l e M a trix (1,l en ,mxRE A L );m xSe t P r (t mp ,x );/M /文件中的函数转化成C 代码后,带了一个前缀m lf ,参数类型则变为m xA rray 指针rslt =m lfSin w ave (t m p );//获取m xA rray 实部内容t =mxG e t P r (rslt );for (i =0;i <len ;i ++)y [i ]=t [i ];//终止库函数调用m _test Te r m ina te ();}(4)编译此工程,然后在Lab V IE W 中用CLF 调用该D LL 。
图2为Lab V IE W 中调用此M -DLL 中si ne 函数的程序框图,他相当于求阵列[0:∏/10:2∏]的正弦值,其运行结果如图3所示。
图2 程序框图 图3 运行结果方法二:利用MATLAB 计算引擎。
MATL AB 计算引擎是一系列允许用户在别的程序中与MATL AB 交互的函数库和程序库。
在调用过程中,MATLAB 引擎函数库工作在后台,MATL AB 通过它与别的应用程序进行通信。
因此将MATLAB 引擎函数包装在DLL 中供LabV I E W 调用,就可以实现LabV I E W 和MATL AB 间的数据通讯。
下面给出上述例子用MATL AB 引擎实现的DLL 代码,将其编译成DLL ,在LabV I E W 中用CLF 调用并做好相关参数设置即可,其他应用与此相似:#i nc l ude <eng i ne .h >#i nc l ude <w i ndow s .h >//启动MA TLAB 引擎_dec lspec (d llexpor t )int openEng (int *addr ){Eng i ne *ep ;if ((ep =engOpen (NULL ))==NULL )re t u rn 0;else {engSe t V isi b l e (ep ,0);//隐藏M ATLAB 命令窗口*addr =(int )ep ;re t u rn 1;//打开m a tlab 引擎成功}}//关闭MA TLAB 引擎 2007年第8期彭宇宁等:利用DLL技术实现Lab V I E W和MA TLAB混合编程95_dec lspec(d llexport)int c l o seEng(int addr){if(engC lose((Eng ine*)addr))re t u rn0;e lsere t u rn1;//关闭成功}//执行MATLAB命令,在这之前和之后做必要的数据传递。
_dec lspec(dll expo rt)vo id si ne(i n t addr,double*x,doub l e *y,i n t len){m x A rray*A=NU LL,*B=NULL;double*bRea l;int i;Eng i ne*ep;ep=(Eng i ne*)addr;A=m xC rea t eD ouble M atri x(1,len,m xREA L);m e m cpy((void*)mxG e t P r(A),(void*)x,sizeof(x));engPu t V a ri able(ep,"A",A);engEva l Stri ng(ep,"Y=sin(A);");B=engG e t V a ri able(ep,"Y");bR eal=mxG e t P r(B);for(i=0;i<len;i++)y[i]=bRea l[i];}使用MATL AB计算引擎前,先调用openEng打开计算引擎,并将引擎指针保存在addr中,供后面的程序使用。