4.1.3 前面版控件的属性节点和方法节点
LabVIEW图形化编程语言为每个控件都提供了属性节点和方法节点,在程序设计中灵活的使用设置这些节点,会使程序运行时更简洁、更细腻、更合理、更灵活、更强大、更有趣。一连气使用这么多的“更”主要强调这部分还是比较重要的。我想,这也是LabVIEW图形化程序设计高手应具备的条件之一。有句话:“细节决定成败”,在这里也同样适用。
其实,LabVIEW图形化编程语言为VI、甚至应用程序也提供了属性节点和方法节点。但现在仅讨论控件的属性节点和方法节点,而重点则是放在属性节点(控件的方法节点也不是很多)。
1、控件的属性节点
在控件板上,除了装饰部件外,LabVIEW图形化编程语言为控件板上的每一个控件都提供了属性节点和方法节点。
利用属性节点可以设定(读出)控件的大小、颜色、标题、标签、禁用、值等多种控件参数。
例图中,左边是“字符串”控件在程序框图上的端口图标,右边是该“字符串”的相关属性设置。
需要提醒大家注意的是:例图中的这个属性实质上是“字符串”控件的映射。换句话说:如果“字符串”控件被删除(在前面板和程序框图中做删除是一样的),那么这个属性也将被删除,不存在了。
简单的说就是:属性节点是控件实例的映射。
那么有时候,在程序运行到不同的状态时(状态机),需要为该控件配置不同的属性参数(比如:例图中的几个特定的属性在不同的状态都需要修改),而在每个状态中都需要创建、配置这些属性,很不方便。此时可以采用下面的方法对它进行封装。
2、控件属性节点的封装
所谓“封装”就是共用的将“属性节点”作成一个子VI封装起来,供以后在其它地方使用。
在上个例图中,用鼠标的右键点击“属性节点”的上部,系统弹出一个对话框,选择对话框中的“断开连接控件”选项。
此时,系统自动生成一个带有“引用”端的新的“属性节点。
配置好输入控件后,删除“字符串”控件实例。
将原例图中的属性控制“常数”都用输入控件代替,并连接一个“引用“输入控件和一个”引用“输出控件及错误输入控件和错误输出控件,如例图所示。
按子VI的设计方法和原则,设计好图标和连接端的定义,一个特定的属性节点VI便完成。
此后,在其它地方使用这个VI时,先创建一个“字符串”引用并连接该VI的引用端,其它属性直接使用对应的常数既可。
这里使用“字符串”的引用来代替“字符串”的实例,这个“字符串”实例放在程序框图的其它地方都可以(必须在同一个VI中,并且有该控件的实例存在),这是一种灵活使用特定属性的好方法。
来自LabVIEW的属性包装例子
DAQmx定时.vi——就是将属性节点包装成的vi。还有DAQmx定时触发.vi——也是同样的包装方法。属性节点经过包装后就可以作为子vi来使用。与上面例子的区别在于:一个是利用“引用句柄”做“公共线程”而本例使用“任务/通道”来做“公共线程”。
3、属性节点的传值特性
我们知道在程序框图中,本地变量或属性节点无须与control(控制器)/indicator(指示器)直接连线就可用来传递“控制器”/“指示器”中的数值。
这里对本地变量与属性节点之间的讨论也仅限于传递数值这个特性上。
实际上,虽然它们从传递数值这个特性上有相同之处,但本质上还有许多不同的地方,只有充分了解它们之间的差异,才能有效、合理的在程序中使用它们。
下面就它们之间的差异进行探讨:
a、内存
本地变量(local variable) 建立本地变量实质就是对“控制器”/“指示器”中数据进行复制(copy),所以要占用内存,当为数组建立多个本地变量时,会占用大量的内存。 |
属性节点(property node) 建立属性节点实质上是对“控制器”/“指示器”中数据进行查询或置入,不会占用内存。因为在部件创建时已经为此参数分配好了内存,多少有些像VB中的属性设置。 |
b、执行速度
由于本地变量是对内存操作,所以运行速度很快。 |
相对于本地变量来讲,属性节点的效率是很低的,或者说更占用CPU的资源。 |
需要注意的是:这个例子主要是用来进行对比,性能不同的计算机其运行时间应该是不同的。
c、数据竞争
本地变量:容易导致数据竞争,很多LabVIEW的书籍都介绍了这方面的例子。原因是本地变量破坏了数据流的工作方式。这也正是LabVIEW及许多书籍中强调的“慎用”本地变量的原因。 |
可以通过“错误簇”来引导数据流,所以不会发生数据竞争现象。注意,当属性节点的错误簇没有使用(与其它vi相互连接),同样可能会导致数据竞争现象发生。 |
说句实在话,方法节点我使用的不多,好像是在动态调用是用过方法节点,讨论到动态调用时在看看吧!内心中就对方法节点没有下什么功夫了解!