利用DLL技术实现LabVIEW和MATLAB混合编程_彭宇宁

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

计算机与现代化

 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 文献标识码:A

Usi n g DLL Techni q ue to Reali z eM ixed Progra mm ing wit h La bVI E W andMATLAB

PE 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 ing

0 引 言

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

终止库函数调用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 #i nc l ude //启动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 引擎

相关文档
最新文档