学海荡舟手机网

主页 > 实用文摘 > 教育文摘_15 > > 详细内容

LabVIEW与MATLAB混合编程_电测仪表论文

  摘要:结合实例详细介绍了labview通过actviex自动化技术与matlab进行混合编程,达到了利用matlab优化算法库的目的。将labview与matlab有机结合,是一条开发智能虚拟仪器的有效途径。

    关键词:labview语言 matlab activex自动化 虚拟仪器

labview建立在易于使用的图形数据流编程语言——g语言上,大大简化了过程控制和测试软件的开发。matlab以其强大的计算功能、大量稳定可靠的算法库,已在为计算工具方面事实上的标准。但才者各有欠缺,利用混合编程可以相互补充。

matlab是mathworks公司开发的“演算纸”式的程序设计语言。它提供了强大的矩阵运算和图形处理功能,编程效率高,几乎在所有的工程计算领域都提供了准确、高效的工具箱。但matlab也有不足之处,例如界面开发能力较差,并且数据输入、网络通信、硬件控制等方面都比较繁琐。

美国ni公司推出的labview语言是一种非常优秀的面向对象的图形化编程语言。labview是实验室虚拟仪器集成环境(laboratory virtual instrument engineering workbench)的简称,是一个开放型的开发环境,使用图标代替文本代码创建应用程序,拥有大量与其它应用程序通信的vi库。例如labview使用自动化activex、dde和sql,可与其它windows应用程序集成;使用datasocket技术、web server、tcp/ip和udp网络vis,与远程应用程序通信。在对硬件的支持方面,labview集成了与gpib、vxi、pxi、rs-232/485、plc和插入式数字采集设备等进行数据通信的全部功能。在labview下开发的程序称为虚拟仪器vi(virtual instrument),因为其外形和操作可以模拟实际的仪器。在对各种算法的支持方面,labview的工具箱非常有限,这就限制了大型应用程序的快速开发。

鉴于labview和matlab的优点,本文介绍了通过activex技术,在labview(ver6.1)中调用和操作matlab(ver6.5)的方法,实现labview和matlab的混合编程,充分发挥两者的优势。

图1

1 基本原理

activex自动化是基于组件对象模型com(component object model)的技术,允许应用程序或组件控制另一个应用程序或组件的运行,它包括自动化服务器和自动化控制器。matlab支持activex自动化技术。通过使用matlab自动化服务器功能,可以在其它应用程序中执行matlab命令,并与matlab的工作空间进行数据交换。因此可以借助这一特性,把labview与matlab结合,充分利用matlab提供的大量高效可靠的算法和labview的图形化编程能力,混合开发出功能强大的应用软件。

2 应用举例

在混合编程中,通常用labview设计用户图形界面,负责数据采集和网络通信;matlab在后台提供大型算法供labview调用。

2.1 方法一:使用matlab script节点

为了简化调用过程,labview提供了matlab script节点。labview使用activex技术执行该节点,启动一个matlab进程。这样用户就可以很方便地在自己的labview应用程序中使用matlab,包括执行matlab命令、使用功能丰富的各种工具箱,如神经网络工具箱(neural network toolbox)、优化工具箱(optimization toolbox)。值得注意的是:labviewgn matlab之间的数据通信仅支持real、realvector、realmatrix、complex、vectorcomplex、matrix六种格式的数据,且必须根据具体情况进行选择。

当开发涉及工业控制的应用程序时,常常由于控制参数的非线性变化,而无法建立合适的模型。由于此类问题,神经网络提供了一条有效的解决途径。

在labview开发环境下新建一个三层bp神经网络的vi程序,程序框图见图1。网络结构部分主要设置隐层(hidelay)神经元的个数、传递函数(transfer function)以及网络训练算法(algorithm)。经过样本数据(training data)训练过的网络,即可进行仿真测试了。matlab脚本程序可以在matlab环境下调试,再使用matlab script节点导入matlab脚本;也可以直接在matlab script节点中编写。位于function>>mathematics>>formula模板中的matlab script节点可以导入matlab脚本。图1中的脚本程序使用case语句进行传递函数和训练算法的选择。matlab script节点中神经网络的输入层和隐层之间的权值矩阵inweight应指定为realmatrix,在labview中对应的数据类型是二维实数据组net.i-weight。各变量数据类型见表1。

表1 matlab script节点输入、输出变量的数据类型

变量名labview数据类型matlab数据类型
size of algorithmdouble floating point numericreal
t outweight hideb outb result1d array double floating numericreal vector
p data inweightmultidimensional array double floating point numericreal matrix

在此程序中,得到的bp网络各层的权值矩 阵、阈值向量和传递函数三类参非常有用的,它们决定了神经网络的结构与特性。因此当神经网络训练好后,可以直接使用这些参数处理新的数据,得到预测值,而不必重新调用matlab。这样程序的运行效率会更高。另一方面,将调试好的神经网络vi创建成一个子vi,作为模块保存,当需要更新网络时,可以随时调用。

虽然通过matlab script节点进行通信比较易于实现,但以这种方式调用matlab时,在任务栏中将出现一个matlab图标,单击该图形会打开matlab窗口,在其中可以任意输入。通常,这会干扰前台程序的运行,甚至造成程序的崩溃。另一方面,当matlab script节点中的脚本执行完后,matlab也不能自动关闭。

2.2 方法二:使用activex函数模板

在labview中使用引用(refnum,也称“参考”)作为某个对象的唯一标识符,对象可以是文件、设备、网络连接等。由于引用是指向某一对象的临时指针,因此它仅在对象被打开时有效,一旦对象被关闭,labview就会自动断开连接。为了获得对matlab更多的控制,可以在框图程序中使用labview提供的相关子vi创建和获取自动化对象,然后在代码中调用对象拥有的方法和属性。当不再需要对象时,可以随时释放。

labview可以调用matlab(ver6.5)activex接口提供的8个方法和1个属性:

(1)bstr execute([in]bstr command):execute方法调用matlab执行一个合法的matlab命令,并将结果以字符串的形式输出。其输入参数command为字符串类型变量,表示一个合法的matlab命令。

(2)void getfullmatrix([in] bstr name,[in]bstr workspace,[in,out]safearray(double)*pr,[in,out]safearray(double)*pi):使用getfullmatrix方法,labview从指定的matlab工作空间中获取一维或二维数组。name为数组名,workspace标识包含数组的工作空间,其默认值是“base”。pr了所提取数组的实部,pi包含了所提取数组的虚部,它们在labview中为变体(variant_数据类型。

(3)void putfullmatrix([in]bstr name,[in]bstr workspace,[in]safearray(double)*pr,[in]safearray(double)*pi);此方法向指定的matlab工作空间中设置一维或二维数组。如果传递的数据为实数型,pi也必须传送,不过其内容可以为空。

(4)bstr getchararray([in]bstr name,[in]bstr workspace):此方法从指定的matlab工作空间中获取字符数组。

(5)void putchararray([in]bstr name,[in]bstr workspace,[in]bstr chararray):此方法向指定的工作空间中的变量写入一个字符数组。

(6)void minimizecommandwindow():此方法使matlab窗口最小化。

(7)void maximizecommandwindow():此方法使matlab窗口最大化。

(8)void quit():用于matlab退出。

(9)属性visible:当visible为1时,matlab窗口显示在桌面上;当visible为0时,隐含matlab窗口。

举例说明:labview程序中有二维数组a、b,通过matlab计算表达式b=a.*3(即a的每个元素均乘以3),得到的结果保存在labview的数组b中,并显示在前面板上。其matlab window为枚举量,值为lnvisible或visible,目的是用于控制任务上是否出现matlab图标。数组a为控制量,用于输入二维数组数据。数组b为指示量,用于显示经matlab计算后返回的结果。框图程序见图2。此程序较完整地描述了调用matlab过程的总体框架,至于复杂的算法可以在matlab中实现。

首先必须引用自动化对象。为此在labview的controls>>activex>>automation refnum模板中选择自动化引用(automation refnum)控制量,将其放置在前面板上,设置控件的visible属性为false,从对象列表中选择matlab application(version6.5)type library version1.0。这样matlabr的引用就添加到程序中,其对应的图标为mlapp.dimlapp。为了简化访问自动化服务器的过程,labview在其function>l>communication>>activex模板中提供了一组与activex操作相关的子vi,其中automation open.vi打开引用,启动matlab自动化服务器,并将引用传递给其它节点,如属性节点(property node)、调用方法节点(invoke node)。程序中labview调用putfullmatrix方法,将二维组a通过参数pr传到matlab的“base”工作空间。虽然a为双精度浮点型数组,pr和pi的数据类型为变体(variant),数据类型不同,但labview会自动将输入数据的类型转换为变化,以满足输入要求。程序中a为实数数组,无虚部,所以给pi赋空值。接着labview调用mlapp.dimlapp提供的execute方法,向matlab传送一条命令“b=a.*3”,于是matlab将数组a的每个元素与3相乘,计算后的结果保存在数组b中。再调用getfullmatrix方法,从“base”工作空间中获取数组b的实部。这里必须使用variant to data.vi,将变体类型的输出转化为labview中的二维数组。最后用quit方法退出matlab,automation close.vi随即断开引用。运行程序,可以看到matlab一经启动,任何标上底图标例立即消失,计算结果返回到labview的前面板上。这里仅介绍了activex函数模板的基本使用以及调用matlab过程的总体框架,读者可以根据需要进行扩充。

图2

    2.3 两种调用方法的比较

(1)matlab script节点具有多输入、多输出的特点,一次处理的量要以很大。matlab脚本可以先在matlab下调试。无误后再导入到matlabseript节点中。matlab script节点对输入、输出数据的类型有明确的要求。只有labview中的数据类型与matlab中的数据型相匹配,才能进行数据传输。使用matlab script节点的方法,快捷方便,但不利于较大的应用程序开发。当需要使用时,可将其模块化,采用主程序动态加载。

(2)使用activex函数模的方法,具有对matlab更强的控制能力。如随时打开和关闭matlab,隐藏在务栏中的matlab图标,与matlab进行字符数组传输,这些都是matlab script节点都不具有的。使用activex函数模板时,经常 会遇到数据类型的转换,尤其是变体(variant)与其他类型的转换。当高用大型算法时,必须明确输入、输出数据的具体类型,而且要尽量减少数据传输量和启动matlab自动化服务器的次数activex函数模板,适于较大的应用程序开发。在labview顺序结构中,不提供使用。原因是顺序结构妨碍了作为labview优点之一的程序并行运行机制,而且matlab自动化服务器启动也需要一定时间,这会使整个程序不能及时处理其它的用户操作。总之,两种调用方法其自身的优势和不足。在开发一个大的复杂应用程序时,综合不同的应用要求,合理选择可以显著提高开发效率。

采用虚拟仪器技术,通过labview构建测试仪器开发效率高、可维护性强、测试精度、稳定性和可靠性能够得到充保证;具有很高的性价比,节省投资,但于设备更新和功能扩充。如果能利用matlab功能强大的算法库,可望开发出更具智能化的虚拟仪器,将会在诸如故障诊断、专家系统、复杂过程控制等方面大有用武之地。