这篇文章主要是针对LabVIEW早期版本的(8.0以前)写的,在8.0以及随后的8.2版本中LabVIEW自身已经能很好地将Matlab集成进来。但它依然不能独立于Matlab,如果要开发独立于Matlab的应用时,基于DLL和COM组件的方法依然有他们不可替代的优势。 摘要:本文从应用程序接口技术出发,总结了LabVIEW和MATLAB混合编程的方法,并介绍每种方法的特点,比较了它们之间的优势和缺点,为开发人员提供比较全面的参考。利用LabVIEW和MATLAB混合编程,可实现两者优势互补,从而为开发功能更强大性能更优越的测控软件,提供途径。 LabVIEW作为易学易用的图形化编程语言,在虚拟仪器设计和测控软件开发方面已是事实上的工业标准。Matlab提供强大矩阵运算和图像处理能力,在工程计算领域有着广泛的应用,其优势是其他软件无法比拟的。因此,关于将两者结合起来混合编程的思想也广泛被人们所讨论。目前,应用程序之间通信的技术主要有下面几种:动态数据交换(DDE)、动态链接库(DLL)、组件对象模型(COM)、以及基于COM的ActiveX技术。LabVIEW和Matlab都支持这些接口技术,这也就为两者进行数据通信提供了可能。也正是从不同的接口技术出发,人们提出了不同的混合编程方法,下面对这些方法进行简单的介绍和比较,以供开发者参考。 一 基于动态数据交换(DDE)技术 动态数据交换是Windows操作系统中一种基于消息的协议,用于在Windows平台上的两个正在运行的应用程序之间动态交换数据,其中提供数据服务的程序称为服务器程序(DDE Server),请求数据和服务的程序称为客户程序(DDE Client).LabVIEW提供了DDE通信VI,利用这些VI可以创建DDE Server或DDE Client,完成接收/发送数据、请求/提供服务等功能。LabVIEW调用Matlab功能时,需将服务名(service name)指定为”Matlab”,主题名(Topic Name)指定为”Engine”,同时在运行VI之前先启动Matlab或者Matlab计算引擎(在内存中均为Matlab.exe),否则无法通信。DDE VIs可在<LabVIEW>/vi.lib/platform/dde.llb下找到。 二 基于动态链接库(DLL)技术 动态连接库是基于Windows程序设计的一个重要组成部分,它由一系列封装好的可执行代码组成,其内部函数能被其他程序所共享。LabVIEW通过CLF(Call Library Function Node)实现对DLL的调用。另一方面,Matlab编译器能将函数文件编译C/C++代码,这些代码又能被C/C++编译器(如Microsoft Visual C++ 6.0)编译成DLL文件,只要接口(输入输出参数)安排正确,就可以将Matlab编写的算法集成到LabVIEW应用程序中,且脱离了Matlab运行环境,执行效率高。另外,Math works公司为Microsoft Visual C++ 6.0提供了一个插件,可以轻松完成上述工作,当然接口还需开发人员自己安排。CLF在函数面板的“Advanced”子模板下。 三 基于组件对象模型(COM)技术 组件对象模型的核心就是二进制接口规范,此规范独立于编程语言和操作系统。从6.5版本开始,Matlab提供了COM生成器。COM生成器提供了实现Matlab独立应用的一种新途径。它能把Matlab开发的算法做成组件,这些组件作为独立的COM对象,可直接被Visual Basic,Visual C++或其他支持COM的语言所引用[1]。LabVIEW5.0及以上版本支持COM。它通过自动化标识(automation refnum)获取一个已安装在系统中的COM组件的引用,然后借助ActiveX功能子模板中的VI完成对组件的控制和调用工作。利用COM技术的LabVIEW和Matlab无缝集成的应用程序运行效率高,占有系统资源少,而且非常利于用户应用软件的发布。[2] 四 基于ActiveX自动化技术 ActiveX的自动化(automation)是ActiveX最重要的功能之一,是一个程序借助其方法和属性控制另一程序的能力,它包括自动化服务器和自动化控制器。Matlab支持ActiveX自动化技术。Matlab自动化服务器提供一系列方法和属性,借此可以实现在其他应用程序中执行Matlab命令和控制Matlab。LabVIEW5.0及以后的版本提供对ActiveX自动化的支持。在LabVIEW中基于ActiveX实现和Matlab混合编程的方法又有两种,第一种使用Matlab脚本节点,第二种使用ActiveX函数模板。两种方法的基本过程都相同──先打开Matlab自动化服务器,然后执行Matlab命令,最后关闭自动化服务器。LabVIEW中与ActiveX有关函数模板在函数面板中“communication”子面板下的”ActiveX”面板中。 五 其他方法 还有一种将DLL和Matlab计算引擎(基于COM技术)结合起来的方法。这种方法把调用Matlab计算引擎的C代码编译成DLL供LabVIEW调用。Matlab计算引擎采用了客户机/服务器的模式,在windows上通过ActiveX通道与Matlab进行连接,因此这种方法与基于ActiveX自动化技术的方法有些类似。在进行混合编程时,先打开Matlab计算引擎,然后执行Matlab命令,最后关闭Matlab计算引擎。所不同的是使用ActiveX自动化技术传递数据均为变体,数据类型由应用程序和Matlab服务器自动匹配,而通过DLL调用Matlab计算引擎的方法即可传递变体类型数据也可传递标准C类型数据,数据类型之间的转换在DLL中完成,因此需开发人员额外编程。除了上述混合编程方法外,NI公司和Math works公司合作推出一个工具包──SIT(Simulation Interface Toolkit),用来实现LabVIEW和Simulink交互式编程。有了这一工具包,设计工程师们可以建立自定义的用户界面,以便交互式地验证Simulink模型,并轻松地将这些模型配置到实时硬件进行控制原型设计和硬件在环(hardware-in-the-loop)测试,最终节省产品上市时间。但如其名,它仅用于和Simulink通信,且为附加软件需额外购买。 六 比较总结 由于混合编程的方法均基于接口技术,因此每种方法也带上各自接口技术的特点。基于DDE、ActiveX自动化、DLL+计算引擎混合编程的方法需要Matlab环境的支持,开发出来的应用程序缺乏独立性,但能全面支持Matlab的功能,Matlab所有的命令、M函数和工具箱均能在其中调用。三者之中,以DLL+计算引擎混合编程的方法对Matlab控制最强,编程最灵活也最复杂,基于ActiveX自动化技术的方法次之。另外,Matlab计算引擎可放在网络上其他计算机上运行,结合LabVIEW的网络通信功能,可以实现分布式应用,这一点在网络实验室的开发方面很有应用价值。基于DLL和COM技术混合编程的方法,最大一个优点就是可以创建独立的应用,而且在执行效率方面有所改善。但程序的独立性也是相对的,应用程序要正确运行还需要Matlab运行时库的支持──基于DLL技术混合编程开发的应用程序需额外安装,而基于COM技术混合编程的方法将所需的库文件自动打包到COM对象,只要安装COM对象,即可独立运行。此外,执行效率的改善也不是绝对的,[3]它与具体应用有关。在Matlab6.5中Matlab编译器不能编译所有的M文件(其中包括工具箱中的M文件),这就限制了基于DLL和COM技术混合编程方法的应用范围,Matlab7.0使用组件运行环境(MCR),它完全支持Matlab语言,所以可以运行所有支持编译的Matlab及工具箱命令,[4]只是初始化时间比以前要慢得多。 从上面的综述可以看出没混合编程的方法各有自己的优缺点,开发人员可以根据应用的特点选择其中一种或者几种用之。相信利用这些混合编程的技术,可以将LabVIEW和Matlab各自的优势结合起来,开发出功能更强大性能更优越的测控软件
|