5.1.3 控件的属性和方法节点


      属性是控件的固有特性,控件是属性的载体,属性不能脱离控件而独立存在。

      属性也可以理解为编程语言结构的任意特性。属性在其包含的信息和复杂性等方面变化很大,例如对于按钮控件的名称、显示的文字、背景色,背景图片等等。大多数控件都具有的属性称为公共属性:名称、标题、背景色、前景色等等。

      LabVIEW图形化编程语言为每个控件都提供了属性节点和方法节点,在程序设计中灵活的使用设置这些节点,会使程序运行时更简洁、更细腻、更合理、更灵活、更强大、更有趣。这也是LabVIEW图形化程序设计高手应具备的条件之一。有句话:“细节决定成败”,在这里也同样适用。

      其实,LabVIEW图形化编程语言为VI和控件都提供了属性节点和方法节点。但现在仅讨论控件的属性节点和方法节点,而重点则是放在属性节点(控件的方法节点也不是很多)。
  
      为了更好的理解这部分内容,我们首先看一个来自NI论坛的实例。


1、例子

Picture
      我们先看一个控件属性的实例。我们知道,电阻单位符号是Ω,读作欧姆,符号见左图所示。显然这是一个特殊的字符,如果我们想在字符串控件中显示它,或者说我们想同时显示电阻的数值和单位,如何才可以做得到呢?

      我们完全可以通过控件的属性节点来实现这样的需求。


Picture
      右图是利用属性节点实现这一目的的程序框图和前面板图。在此足可以看到属性节点的强大之处。

      在这个实例中要注意两点:一是你的操作系统中一定要有“Symbol"字体库(这里使用的是Mac电脑);二是一定要注意用于“单位的字母”的大小写,我们这里使用的是大写字母“W",如果有兴趣的话换成小写的“w"再试一试看!

      这仅仅是一个简单的例子。事实上,属性节点和方法节点能够作的不止是这些,它们功能非常强大。在程序设计中合理、有效的使用它们可以使程序设计更完美、更灵活。

      下面先介绍属性节点。


2、控件的属性节点

Picture
      在LabVIEW开发环境提供的控件板上,除了装饰部件外,LabVIEW图形化编程语言为控件板上的每一个控件都提供了众多的属性节点和方法节点。
      利用属性节点可以设定(读出)控件的大小、颜色、标题、标签、禁用、值等多种控件参数。
      例图中,左边是“字符串”控件在程序框图上的端口图标,右边是该“字符串”的相关属性设置。

      需要提醒大家注意的是:例图中的这个属性实质上是“字符串”控件的映射。换句话说:如果“字符串”控件被删除(在前面板和程序框图中做删除是一样的),那么这个属性也将被删除,不存在了。

      简单的说就是:属性节点是控件实例的映射。
      
      那么有时候,在程序运行到不同的状态时(状态机),需要为该控件配置不同的属性参数(比如:例图中的几个特定的属性在不同的状态都需要修改),而在每个状态中都需要创建、配置这些属性,很不方便。此时可以采用下面的方法对它进行封装。


3、属性节点的封装

Picture
      正因为属性节点的功能强大,又可能经常使用,所以我们希望将它设计成子vi的形式,以便重复使用。所谓“封装”就是共用的将“属性节点”作成一个子VI封装起来,供以后在其它地方使用。

      以上个例图为例,我们希望将这组属性节点封装起来。具体操作如下:

      用鼠标的右键点击“属性节点”的上部,系统弹出一个对话框,见左图。选择对话框中的“断开连接控件”选项。

      此时,系统自动生成一个带有“引用”端的新的“属性节点。

      配置好输入控件的属性参数后,删除“字符串”控件实例。


Picture
      按程序设计需要,将原例图中的属性控制“常数”都用输入控件代替,并连接一个“引用“输入控件和一个”引用“输出控件及错误输入控件和错误输出控件,如左图所示。
      
       按子VI的设计方法和原则,设计好图标和连接端的定义,一个特定的属性节点VI便完成。

       此后,在程序的某个地方使用这个VI时,必须先创建一个“字符串”引用并连接该VI的引用端,然后右键单击该
“字符串”引用,在弹出的快捷菜单中选择:连接到........。其它属性直接使用对应的常数既可。

       这里使用“字符串”的引用来代替“字符串”的实例,这个“字符串”实例放在程序框图的其它地方都可以(必须在同一个VI中,并且有该控件的实例存在),这是一种灵活使用特定属性的好方法。


4、属性封装实例

Picture
      这个属性封装实例在前面的介绍中已经看到,就是DAQmx定时.vi,它就是将DAQmx的属性节点包装成了子vi。还有DAQmx定时触发.vi——也是同样的包装方法。

      属性节点经过包装后就可以作为子vi来使用。与上面例子的区别在于:一个是利用控件的“引用句柄”做“公共线程”而本例则使用DAQmx的“任务/通道”来做“公共线程”。


5、属性节点的传值特性

Picture
      我们知道在程序框图中,属性节点无须与control(控制器)/indicator(指示器)直接连线就可用来传递“控制器”/“指示器”中的数值。这个特点与本地变量有些相似,实际上,虽然它们从传递数值这个特性上有相同之处,但本质上还有许多不同的地方,只有充分了解它们之间的差异,才能有效、合理的在程序中使用它们。
      
       下面就它们之间的差异进行探讨(
仅对本地变量与属性节点之间传递数值这个特性进行讨论):

本地变量


1)内存

      建立本地变量实质就是对“控制器”/“指示器”中数据进行复制(copy),所以要占用内存,当为数组建立多个本地变量时,会占用大量的内存。

      而对本地变量的操作行为是读数据(Read)或写数据(Write)

2)执行速度

      由于本地变量是对内存直接操作,所以它的执行速度很快。


Picture
      安上图试验表明本地变量运行10000次的操作运行时间是:4mS。

3)数据竞争

      本地变量:容易导致数据竞争,很多LabVIEW的书籍都介绍了这方面的例子。原因是本地变量破坏了数据流的工作方式。这也正是LabVIEW及许多书籍中强调的“慎用”本地变量的原因。

属性节点



       建立属性节点实质上是对“控制器”/“指示器”中数据进行查询或置入,不会占用内存。因为在部件创建时已经为此参数分配好了内存,多少有些像VB中的属性设置。
       操作行为是查询(Query)数据或置入(Set)数据。




      相对于本地变量而言,属性节点的执行效率是很低的,或者说更占用CPU的资源。

Picture
      安上图试验表明属性节点运行10000次的操作运行时间是:2472mS。


      可以通过“错误簇”来引导数据流,所以不会发生数据竞争现象。注意,当属性节点的错误簇没有使用(与其它vi相互连接),同样可能会导致数据竞争现象发生。


      属性和方法并不是仅仅控件才具有。实际上,vi、控件、前面版都具有各自的属性和方法。

      尽管本节的标题是介绍控件的属性节点和方法节点,属性节点已经基本介绍完了,至于方法节点我们还是准备放到后面的动态调用部分来做介绍。

Picture
上一页
Picture
下一页

这里也可以留言,但是其他到访者将不会看到