【LabVIEW】引用,属性节点,局部变量

VI内的数据传递一般是通过:
(1)移位寄存器
(2)局部变量
(3)引用与属性节点、调用节点

一、引用
引用常称为引用句柄,在Windows编程中,引用句柄指的是指向指针的指针。
换句话说,引用句柄保存的是其他一些数据类型的地址,例如窗口句柄。

1、控件引用
控件的引用句柄指的也是指向特定数据类型的指针,长度为四个字节。

控件的引用句柄不但能够表示控件的类型,还与空间一一对应,这是通过句柄的编号来实现的。
它自身未代表任何空间,但是通过引用句柄指向特定的实例后,就可以操作具体的控件了。
简单的理解就是通过对引用句柄的操作,可以改变控件的属性参数。

(1)创建

 

 

建立一个控件的引用句柄,然后拖动一个控件到控件引用句柄,这样就可以建立特定数据类型的控件引用句柄,上图分别建立了数字控件和布尔控件的引用句柄。

 

(2)如何通过引用句柄建立属性节点

 

 

 

 (3)区分

 

 

指向布尔控件的引用句柄,因此它的值属性节点是布尔值。

 

 

指向布尔控件引用的引用句柄,因此它的值属性是引用。

 

(4)严格类型控件引用句柄与非严格类型控件引用句柄

严格类型控件引用句柄仅接收数据类型完全相同的控件引用句柄

例如,如果严格类型控件引用句柄的类型是32位的整数滑动条,那么只能把一个32位整数滑动条连接到该引用句柄接线端,而不能将8位整数滑动条、双精度标量滑动杆、32位整数滑动杆簇等数据类型与之连接。

在控件上创建的引用在默认情况下是严格类型的。
前面板上控件引用左下角的红色星形符号表明该控件引用是严格类型的;
在程序框图上,在连接到控件引用接线端的属性节点或调用节点显示(严格)表明该控件引用是严格类型的。
 

② 非严格类型控件引用句柄接收的数据类型较灵活


例如,假设一个非严格类型控件引用的类型属于滑动杆,那么32位整数滑动杆、单精度滑动杆、32位整数滑动杆簇等都可连接到该控件引用接线端。
在非严格类型控件引用状态下,可把任何类型控件与控件引用接线端连接。

当某属性节点与一个非严格类型控件引用接线端连接时,在值属性中会产生变体数据。在使用该数据前可能需要进行数据转换。
只有当图表引用是严格类型时,才能看到图表的历史数据属性。

 


2、VI引用

(1)创建严格类型VI引用以动态调用VI

https://blog.csdn.net/weixin_42341666/article/details/104375775

(2)利用VI引用写入或读取另一个VI的控件值

https://bbs.elecfans.com/m/jishu_294664_1_1.html

(3)异步调用VI的多个实例实现并行执行

https://zone.ni.com/reference/zhs-XX/help/371361R-0118/lvhowto/acbr_call_clones/

 

 

二、属性节点和调用节点

属性节点用于访问控件的属性。
例如需要改变控件在前面板的大小,运行时候的状态等都需要通过属性节点来进行操作,与引用结合起来讲就是属性节点可以设置引用的属性。
但由于属性节点与前面板绑定,无法利用到 LabVIEW 的执行系统多线程优势,并且读写使用 UI Thread,所以效率最低。

 

1、类别设置(一般用于严格类的属性)

对于不同类别的使用(App、VI或控件等),其引用是不同的。在一般的程序设计中,使用更多的是VI的属性和方法。获得VI的属性和方法需要首先确定类别。

鼠标右键——应用程序控制——属性节点——放置

在其上右键——选择类(可选择多个类别)——VI服务器——VI

再将控件的引用连接到其输入引用接口

 

2、创建控件的属性(非严格)

方法1:鼠标右键——应用程序控制——属性节点——放置后在其上右键——连接至——窗格——选择具体控件名

方法2:右键点击控件——创建——属性节点

 

3、优劣

(1)内存
属性节点实质上是对“输入控件、显示控件”中数据进行查询或置入,不会占用内存,因为在部件创建时已经为此参数分配好了内存。

(2)执行速度
相对于局部变量而言,属性节点的执行效率是很低的,或者说更占用CPU的资源。

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

 

三、局部变量

通过局部变量可以在一个VI中访问或者存储数据。
通常这些数据都是存储在不同的显示或者输入控件当中,所以说局部变量不是单独存在的,每一个局部变量都是与特定的控件相对应的。
一个控件可以生成许多局部变量,就相当于在一个函数中定义了一个变量,在函数的任何地方都可以使用这个变量一样。

1、创建局部变量

方法1:控件上右击——创建——局部变量

方法2:应用程序框图空白处右键——局部变量

放置后左键点击该局部变量——选择控件

 

2、优劣

(1)内存
每一个局部变量都要复制对应控件中的数据,因此这将消耗更多的内存。
当为数组建立多个局部变量时,会占用大量的内存。

(2)执行速度
由于局部变量是对内存进行直接读、写操作,所以它的执行速度很快(约快1000倍以上)。

(3)数据竞争
局部变量容易导致数据竞争,原因是局部变量破坏了数据流的工作方式。这也正是LabVIEW 强调“慎用”局部变量的原因。

3、属性节点和局部变量、全局变量

切勿使用局部变量或全局变量来作为一种减少连线的方法。变量增加处理开销,内存使用和程序的复杂性。

此外,变量的使用破坏了LabVIEW数据流原则,遮盖了实际的数据来源。当变量从程序的多个位置读写,就难以确定哪个在实际影响数据值。

简单显示值更新一般用局部变量。

但是有些显示特性,比如变灰,无效,不可见之类操作还是要用属性节点,局部变量办不到。

局部变量和全局变量是内存数值操作,属性节点是对控件值的属性进行的操作。理论上,变量的效率比属性节点高。

但在实际写程序中,大量全局变量的应用和不必要的局部变量会拖慢程序的性能和可读性,并且一般使用变量的时候有很大的随意性,导致后期维护的难度增加,牵一发而动全身,改变了一次赋值后要挨个去找这个变量的影响应用范围。

再者,根据实际经验,全局变量在多层VI嵌套之后再赋值,另个一VI或同VI中其他循环对数据进行轮询,会出现两者不同步的现象,原因可能有循环的时间间隔不同,内存相应时间不同等,尤其是在通讯数据处理过程中,隐藏了很大的BUG。

/*******相与枕藉乎舟中,不知东方之既白*******/
原文地址:https://www.cnblogs.com/Mars-0603/p/15089068.html