labview动态调用.docx

上传人:b****8 文档编号:23571497 上传时间:2023-05-18 格式:DOCX 页数:12 大小:407.88KB
下载 相关 举报
labview动态调用.docx_第1页
第1页 / 共12页
labview动态调用.docx_第2页
第2页 / 共12页
labview动态调用.docx_第3页
第3页 / 共12页
labview动态调用.docx_第4页
第4页 / 共12页
labview动态调用.docx_第5页
第5页 / 共12页
点击查看更多>>
下载资源
资源描述

labview动态调用.docx

《labview动态调用.docx》由会员分享,可在线阅读,更多相关《labview动态调用.docx(12页珍藏版)》请在冰豆网上搜索。

labview动态调用.docx

labview动态调用

基本概念

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

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&GraphVoltage-IntClk.VI下获得。

它的程序框图见下图。

图1 Acq&GraphVoltage-Int的程序框图

   从图1可看到一个“Acq&GraphVoltage-IntClk.VI”,它本身是由它所包含的6个子vi组成。

它到底是什么类型的VI呢?

从它的“连线板”看到它的确没有进行过任何定义,应该是非严格类型VI。

参见下图。

图2 非严格类型VI的“连线板”图

   我们以图1中的第一个子VI,DAQmxCreateChannel(AI-Voltage-Basic).vi的“连接板”为例,可以看出它是个严格类型VI。

参见下图。

图3 严格类型VI的“连线板”图

   因为存在非严格类型VI和严格类型vi,所以在进行动态调用时其调用方式也应该有所不同。

下面分别列出它们的动态调用方式。

非严格类型VI的动态调用的方式

   假如程序设计要求先后分别动态调用三个VI,它们被存放在项目中的某个文件夹中,名子分别为:

A.VI(打包时的主VI);

C.VI。

   我们希望程序运行时首先运行A.VI(比如进行:

欢迎界面、板卡验证、软件合法性验证等操作),待正确执行完成这些操作后,关闭A.VI,调用运行B.VI(可以是实际的应用程序)然后关闭B.VI,动态打开C.VI(测量结果保存等),关闭C.VI程序停止运行。

并保证前面板上仅运行一个程序界面(实际上内存中也是仅保留一个VI,用LabVIEW提供的Memory可以清楚地看到这点)。

   这个示例程序有些像接力赛,A-B-C。

   当然这三个VI也可以是严格类型vi,但这里的动态调用方式是针对非严格类型VI的。

下面给出每个VI的程序框图。

注意:

这里将动态调用程序设计成为一个子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。

属性节点:

根据A.VI的引用,确定A.VI的前面板状态,这里是:

“Hidden”。

打开VI的引用:

根据B.VI的路径和文件名,打开B.VI的引用,此时载入B.VI程序。

调用节点:

根据B.VI的引用, 确定B.VI的前面板状态,设定参数见图7。

调用节点RunVI:

根据B.VI的引用, 确定B.VI开始运行,参数:

不必等待运行结束和不自动关闭引用。

关闭引用:

已完成B.VI的动态调用,关闭B.VI的引用。

调用节点:

根据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的动态调用为程序设计提供了灵活的设计方法,这仅是我常用设计方法,供大家参考

ABVIEW的深入探索之已链接控件引用与未链接(通用)控件引用  2011-01-0120:

30

 

高老师评论:

是否可以这样说:

在控件所属的vi中,使用属性、方法节点不需要创建引用;而在子vi中如果需要向该控件传值,则必须使用该控件的引用 

 

控件的引用与引用控件的确理解起来很困难,用语言描述经常会出现误解。

今天我们首先明确控件的引用和引用控件这两个不同的概念。

一、已链接控件的引用、属性节点、方法节点与未链接的控件的引用、属性节点和方法节点

1、已链接控件的引用、属性和方法。

对于前面板中创建的控件,通过控件的快捷菜单创建的控件的引用、属性和方法,我们称他们为已链接控件的引用、属性和方法。

对于已连接控件的引用、属性和方法,我们知道它们已经指向一个特定的控件,这样的引用、属性和方法是不能随意更改它们的指向的。

图中,高老师和CSXCS_366数字控件分别各自创建了引用和属性节点。

高老师的引用是指向高老师数字控件的。

高老师的可见属性也是指向高老师数字控件的。

我们称高老师引用和高老师属性已链接到高老师控件。

由于各自指向(链接)到不同的控件,所以对高老师的引用、属性和方法的操作是针对高老师控件的,绝对不会影响到CSXCS_366控件。

是否可以这样说:

在控件所属的vi中,使用属性、方法节点不需要创建引用;

从上图看高老师的说法是正确的

2、未链接控件的引用、属性和方法

我过去的文章中称未链接控件的引用、属性和方法为通用引用、属性和方法,这里采用未链接控件的引用、属性和方法,更容易区分已链接控件的引用、属性和方法。

由于LV中文版出现的很晚,即使现在中文帮助文件中,很多翻译方法很难反映原来的意思,这也造成我们沟通理解的困难。

所以我们能理解清楚,我特意强调了这两个概念的不同。

在上图中,高老师数字控件和CSXCS_366数字控件,所代表的数值类型是完全一致的,具有很多共同的属性、方法。

-------------------------------------------------------------------------------------------------

二、为什么要用未链接控件的属性节点和方法节点?

假设我们要解决下面的问题,将高老师输入控件和CSXCS_366控件修改为显示控件,这两个控件用来显示随机数,当随机数大于时,控件闪烁。

首先我们在一个主VI中解决这个问题。

上图中我们使用两个属性节点,分别是已链接到控件的闪烁属性,假设我们有很多的这样的随机数显示,那么按照上图中的编程方法,将会有大量的重复工作。

首先我们考虑如何能消除多个同样性能的闪烁属性节点,自然我们会考虑,避免大量重复工作最好的办法是FOR循环。

我们设想在FOR循环中只放置一个闪烁的属性节点,很显然循环中是不能放置已链接的控件属性节点,因为那样只会多次修改同一个控件。

所以循环中要放置一个为链接控件的闪烁属性节点,然后利用高老师和CSXCS_366显示控件的引用来调用这个未链接的属性节点。

 

 

 

假设我们有100个显示随机数的控件,那么之需要创建100个控件的引用,把这些引用创建成数组,FOR循环中不需要任何改动。

从上图中我们可以知道,对于已链接控件的属性节点,在运行过程中是无法再次链接到其它同类型的控件中。

而未连接(通用)属性节点可以在运行中通过不同的控件引用,动态链接到其它同类型的控件中,这是我们使用未链接控件属性节点关键所在。

是否可以这样说:

在控件所属的vi中,使用属性、方法节点不需要创建引用;

从上图看高老师的说法有局限性,在控件所属VI中,也可能需要创建引用来使用属性、方法节点。

三、为什么要用为链接控件的引用(通用引用)

任何编程软件都强调模块化的重要性,为了简化上图中的程序框图,我们希望把上图中的FOR循环容封装在一个子VI中。

主VI的程序框图简化为:

下面我们增加一个“李老师”显示控件,子VI不需要任何改动。

程序框图和运行效果图如下所示:

从上面两个程序框图中,我们可以领会到这个子VI功能是非常强大的,子VI是如何实现的那?

下图是子VI的前面板和程序框图。

子VI的输入端子为未链接的数字控件引用数组,输出为双精度数组。

我们通过未链接控件的引用成功地操作了调用VI中的三个数字控件:

高老师、李老师、CSXCS_366.

而在子vi中如果需要向该控件传值,则必须使用该控件的引用 

 高老师实际的意思应该是这样的,如果在“在子VI中操作主VI中的控件,则必须使用该控件的引用”,高老师的这个说法是完全正确的。

LV有关引用有几个重要的特点:

1、数据流意味着是传值方式而不是传引用(地址)方式,在C语言中,值传递和引用传递都是支持的。

2、链接到特定控件的引用代表一个地址,因此同一控件的多个引用,它们的值(地址)肯定是相同的。

3、未链接到特定控件的引用(通用引用),它的值为0,相当于C语言中空指针。

4、运行时,未链接到特定控件的引用可以指向同类型(严格类型)的特定控件。

 

引用无处不在,应用程序引用、VI引用、窗格引用、控件引用,如果我们获得了一个控件的引用,我们就可以控制这个控件的一切。

如果在控件所属VI中控制这个控件,我们自然不需要未链接控件的引用,但是如果需要在子VI中控制,则必须在主VI中先获取这个控件的引用,并把这个引用(地址值)按照值传递的方式传递到子VI中,这样子VI直接获得的是主VI中控件的引用(地址值)。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 教学研究 > 教学计划

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1