1
LabVIEW与MATLAB混合编程方法
2010-06-01 20:03:48 admin 浏览:2484次 【

  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 基本原理

  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 algorithm Double floating point numeric Real t outweight hideb outb result 1D array double floating numeric Real Vector p data inweight Multidimensional array double floating point numeric Real 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(BSTR Command):Execute方法调用MATLAB执行一个合法的MATLAB命令,并将结果以字符串的形式输出。其输入参数Command为字符串类型变量,表示一个合法的MATLAB命令。

  (2)void GetFullMatrix( BSTR Name,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(BSTR Name,BSTR Workspace,SAFEARRAY(double)*pr,SAFEARRAY(double)*pi);此方法向指定的MATLAB工作空间中设置一维或二维数组。如果传递的数据为实数型,pi也必须传送,不过其内容可以为空。

  (4)BSTR GetCharArray(BSTR Name,BSTR Workspace):此方法从指定的MATLAB工作空间中获取字符数组。

  (5)void PutCharArray(BSTR Name,BSTR Workspace,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.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功能强大的算法库,可望开发出更具智能化的虚拟仪器,将会在诸如故障诊断、专家系统、复杂过程控制等方面大有用武之地。

1 条评论
查看更多评论
  • 键盘快捷键描述按住Shift并单击选择多个对象;将对象添加到当前选择。按住Ctrl单击切换单个对象以加入或保留当前选择。方向键一次将所选对象移动一个像素。Sh..

    浏览:5205次 评论:0
    2021-02-06 09:23:02
  • Modbus是全球第一个真正用于工业现场的总线协议,采用的是主从原则,其物理接口主要有串口和以太网口两种。本文主要介绍LabIEW与PLC的通信实现方式。在进行通..

    浏览:12296次 评论:0
    2019-09-22 12:58:51
  • 对实时数据或者历史存储数据进行滤波及校准处理,可以将采样数据转化为具有实际意义的物理量,为用户后续操作提供方便。滤波校准功能的程序设计如图1所示,本..

    浏览:4578次 评论:0
    2019-09-21 16:32:59
  • 在进行LabVIEW程序设计时,一个VI中可以包含一个或若干个子vi。这些子vi是被直接放置在程序框图中,习惯上称这些子vi为:静态链接子vi。这些子vi在VI载入的同..

    浏览:11236次 评论:0
    2018-12-17 15:28:30
  • 新建一个LabVIEW项目,或者打开一个已经建好的项目,项目中包含主vi,子vi以及自定义控件等,确保vi运行正常。    在项目浏览器的-程序生成规范->..

    浏览:9014次 评论:0
    2018-07-18 10:55:21
作者专栏
  • sltang

    注册时间:2024-12-21 15:45:59

  • samhuang63

    注册时间:2024-12-20 09:42:58

  • csq663347

    注册时间:2024-12-05 16:34:39

  • guohuiming

    注册时间:2024-11-14 08:49:44

  • 机飞弹打

    注册时间:2024-11-11 13:46:27

Copyright@http://nilab.com.cn all rights reserved 备案号:京ICP备12043750号-1
Powered by qibosoft V9.0 Code © 2003-2017 qibosoft
LABVIEW之家 QQ:181237912; email:Labviewzj@qq.com 项目合作 微信及手机:18510627229