labvIEW vi动态调用

基本概念
众所周知,LabVIEW程序又称虚拟仪器,即VI。

电脑软件

  • 01

    名称: labvIEW

  • 02

    大小: 1000MB 版本: 2013 类别: 音频媒体 语言: 中文

  • 03

    应用平台: windows / Mac OS X / Linux

  • 04

    VI是由以下三部分构成: ·前面板——即用户界面。 ·程序框图——包含用于定义VI功能的图形化源代码。 ·图标和连线板——用以识别VI的接口,以便在创建VI时调用另一个VI。当一个vi可以应用在其它VI中,则称为子vi。子vi相当于文本编程语言中的子程序。 在进行LabVIEW程序设计时,一个VI中可以包含一个或若干个子vi。这些子vi是被直接放置在程序框图中,习惯上称这些子vi为:静态链接子vi。这些子vi在VI载入的同时也被加载到内存中。 动态调用VI 在应用程序设计时,我们希望能够自由地、任意切换操作界面和测量程序界面,并且希望在任何时候,前面板上仅运行一个程序界面。这样就能够保证良好地、准确地实现“人机对话”。完成这样的操作,就需要动态的调用不同的VI。 与静态链接的子vi不同,动态加载VI只有在打开VI引用时VI的调用程序才会将其加载。如果VI调用程序较大,采用动态加载VI的方式可以节省加载时间和内存,这是因为在调用程序需要运行该VI以前无需将其加载,在操作结束后又可将其从内存中释放。 问题是:在涉及到动态调用的LabVIEW帮助文件中,看到了这样的概念:“严格类型VI”。那么与此相对应一定还存在着:“非严格类型VI”。似乎将VI分成了两种不同的形式?到底“什么是严格类型VI和非严格类型VI”?它们有什么内在联系和不同以及区别呢? 前几天我还和NI的AE讨论这个问题,就是:“什么是严格类型vi和非严格类型VI”?但一直没有得到明确的答复。察看一些LabVIEW的资料,也没有弄明白这个问题。直到开始写这篇博客时,因涉及到这个概念,才开始对这个问题进行了仔细的分析,分析的结果似乎找到了一些答案。 严格类型vi: 严格类型vi就是可以被其它VI调用的子vi(静态链接子vi)。进一步说LabVIEW提供的“函数”选板上的vi都是严格类型vi。严格类型的vi能够和其它VI通过连接板的定义与其它VI进行直接的数据交换,既可以独立运行也可以作为子vi被调用,作为子vi调用时通常不打开前面板。 非严格类型VI: 非严格类型VI是不能作为子vi来使用的,因为我们没有对它进行类型定义(除非你将它定义为严格类型vi)。非严格类型VI通常是一个独立的VI(或者称为:例程),它不能和其它VI进行直接的数据交换(可以通过全局变量来传递数据),可以独立作为一个程序运行,通常在导入时就将前面板打开。 二者的本质区别就是:是否准确地定义了“连线板”。 为了能够更清楚地说明这个概念,我们通过LabVIEW提供的一个例程,来进一步说明这个问题。该例程可以通过“NI范例查找器”在路径为:硬件输入输出/DAQmx/模拟测量/Acq&Graph Voltage-Int Clk.VI下获得。它的程序框图见下图。 图1 Acq&Graph Voltage-Int Clk.VI的程序框图 从图1可看到一个“Acq&Graph Voltage-Int Clk.VI”,它本身是由它所包含的6个子vi组成。它到底是什么类型的VI呢?从它的“连线板”看到它的确没有进行过任何定义,应该是非严格类型VI。参见下图。 图2 非严格类型VI的“连线板”图 我们以图1中的第一个子VI,DAQmx Create Channel (AI-Voltage-Basic).vi的“连接板”为例,可以看出它是个严格类型VI。参见下图。 图3 严格类型VI的“连线板”图 因为存在非严格类型VI和严格类型vi,所以在进行动态调用时其调用方式也应该有所不同。下面分别列出它们的动态调用方式。 非严格类型VI的动态调用的方式 假如程序设计要求先后分别动态调用三个VI,它们被存放在项目中的某个文件夹中,名子分别为: A.VI(打包时的主VI); B.VI C.VI。 我们希望程序运行时首先运行A.VI(比如进行:欢迎界面、板卡验证、软件合法性验证等操作),待正确执行完成这些操作后,关闭A.VI,调用运行B.VI(可以是实际的应用程序)然后关闭B.VI,动态打开C.VI(测量结果保存等),关闭C.VI程序停止运行。并保证前面板上仅运行一个程序界面(实际上内存中也是仅保留一个VI,用LabVIEW提供的Memory Monitor.Vi可以清楚地看到这点)。 这个示例程序有些像接力赛,A-B-C。 当然这三个VI也可以是严格类型vi,但这里的动态调用方式是针对非严格类型VI的。下面给出每个VI的程序框图。 注意:这里将动态调用程序设计成为一个子VI(动态调用1.VI) 图4 A.VI的程序框图 图5 B.VI的程序框图 图6 C.VI的程序框图 图7 动态调用1子VI的程序代码 图4、图5、图6的程序都比较简单,大家一看就清楚,无需多说。这里重点谈谈图7的程序代码和编程思路。 Case结构选择LabVIEW推荐的子VI形式,点击“文件”/新建/带错误处理的子VI。 下面以运行A.VI后,关闭A.VI,动态调用运行B.VI这个过程来对程序代码加以进一步说明(动态调用的本质就是利用VI的“属性节点”和“调用节点”来实现的) : 图7的上半部分是利用“属性节点”和“调用节点”对A.VI进行控制;图7的下半部分是利用“属性节点”和“调用节点”对B.VI进行控制。错误簇是它们的“公共线程”。 VI引用句柄:由于A.VI已经载入内存,所以使用“本VI”(也就是A.VI)的引用”见图4。 属性节点FP.State:根据A.VI的引用,确定A.VI的前面板状态,这里是:“Hidden”。 打开VI的引用:根据B.VI的路径和文件名,打开B.VI的引用,此时载入B.VI程序。 调用节点FP.Open:根据B.VI的引用, 确定B.VI的前面板状态,设定参数见图7。 调用节点Run VI:根据B.VI的引用, 确定B.VI开始运行,参数:不必等待运行结束和不自动关闭引用。 关闭引用:已完成B.VI的动态调用,关闭B.VI的引用。 调用节点FP.Close:根据A.VI的引用,关闭A.VI的前面板(A.VI退出内存)。 关闭引用:关闭A.VI的引用。整个动态调用过程结束,只有B.VI运行。 上面的描述是依据“公共线程”(数据流)的。 在程序设计中还有另一种动态调用的方式:A-B-A 也就是说:程序先运行A,然后动态调用B,直到B执行完毕,再返回程序A。 程序框图见下图: 图8 动态调用2子VI的程序代码 关于图7与图8的区别,有兴趣的自己进行分析、理解吧。 图9 动态调用1、2子VI的前面板图 严格类型VI的动态调用的方式 我看到许多书的例子都是严格类型VI的调用,这里也就不再说的更多了,仅以LabVIEW帮助文件中的一个实例来表明。查看LabVIEW帮助文件中的:“引用节点调用和严格类型VI引用句柄调用”。 假如:有一个严格类型的“频率响应.vi”,其动态调用程序框图见下图。 图10 严格类型VI引用句柄调用实例 注意:不论对VI的调用还是对节点的调用,在引用打开后,必须销毁(关闭),防止内存泄露。 VI的动态调用为程序设计提供了灵活的设计方法,这仅是我常用设计方法,供大家参考。

(0)

相关推荐

  • LabVIEW-动态调用VI

    LabVIEW调用子VI(subVI)有两种方法:1)通过程序框图-查看(菜单)-函数-选择VI...,在程序框图上添加子VI时,该子VI的调用方法是静态链接的,即编译生成可执行程序后,子VI的代码将 ...

  • ASP基础与动态网页开发工具

    ASP是目前流行的站点开发技术,由于ASP技术简单,并且已经成熟,所以已成为中小 型站点的主要开发技术. 操作方法 01 C/S(Client/Server)模式即客户/服务器模式是最早的网络服务模式 ...

  • 如何创建与调用动态链接库

    操作方法 01 静态链接库与动态链接库区别: 静态链接库:lib中的指令被直接包含在最终生成的EXE文件中. 动态链接库:dll不必被包含在最终的EXE中,EXE文件执行时可以动态地引用和卸载DLL文 ...

  • 教你认识主板整合显示卡

    整合显卡的2D性能差不多能完全满足现在一般人士工作和学习的需要,其最大瓶颈落在3D性能上,而决定整合显卡3D性能的主要因素除了显示核心外,就是整合显卡的显存大小了。因整合芯片组较多,整合显卡的显存大小 ...

  • Linux命令集

    Abstract 在安装、使用和维护Linux系统中,我们都会用到大量的命令,而且命令参数繁多,这也可说是linux系统的一大特色,所以经常会忘记。这里记录我使用Linux当中用到过的命令,用于备查。 ...

  • VDM(Vision Developments Module)视觉开发包

    NI Vision Developments Module(VDM)视觉开发包,集成了NI视觉所有的图像处理函数库:为保证使用LabVIEW作为开发环境的程序员可以正常使用,需要安装和LabVIEW相 ...

  • java反射机制的核心

    java反射机制是怎样使用的? 操作方法 01 1.Class是什么:类的类,一个Class实例完整地描述了一个类的信息        Student,一个Student实例完整地描述了一个学生的信息 ...

  • 易语言使用与研究

    看到一篇好论文,把主要的抄写下来,论文对易语言开发环境,语句,具有特色的易语言类,易模块,支持库,易语言输入法以及怎样引用API底层函数,外部支持库等外部资源的研究学习,并且通过与常用的程序开发软件进 ...

  • LabVIEW创建子VI的接线端

    在使用LabVIEW的时候经常会用到子VI,而在调用子VI的时候往往需要一些接线端,以方便子程序的调用.对于LabVIEW新手来说可能不会是那么简单,毕竟原版教程对于创建流程没有解释的那么详细. 操作 ...