全球观天下!局域变量、全局变量和功能型全局变量是什么?三者有什么区别?
来源:动漫在线
•
2022-08-24 14:05:53
(资料图)
在生活中,很多人都不知道局域变量、全局变量和功能型全局变量是什么意思,其实他的意思是非常简单的,下面就是小编搜索到的局域变量、全局变量和功能型全局变量相关的一些知识,我们一起来学习下吧!
图 6 新建全局变量将新建的全局变量VI的图标拖入到VI的背面板中,如同调用一个子VI一样,就可以完成对全局变量的引用,如图 7所示。图中使用了2个不同的VI,分别进行全局变量的读和写操作。图 7 全局变量的引用1.3局域变量和全局变量的使用小结可以看出,LabVIEW中局域变量和全局变量的引入为数据的有效共享提供了非常便捷的途径。但是正如前面所述,局域变量和全局变量需要占用大量的内存空间,降低了程序运行的效率,因此在实际过程中应酌情应用。此外,由于LabVIEW编程环境的并行特性,使得很多程序员在使用局域变量和全局变量时并没有考虑到变量的“竞争冒险”问题。如图 8所示,程序的本意是希望将Numeric的值加1然后再乘以2赋值给Numeric变量,但是由于LabVIEW采用了数据流运行方式,每一段代码的开始运行时间几乎是同时的(并行的),因此导致无法Numeric的输出正确的值。图 8 变量的竞争冒险以上举得是一个比较明显的例子,当程序变得庞大而复杂时,这种问题并不容易被发现并且很容易产生。特别是在使用全局变量时,如果程序员没有非常清楚地明晰各个时刻全局变量中的值,那么很容易地读到一些“意料之外”的数据。同时,在使用全局变量时,应该注意变量的初始化操作。虽然,这可以使用LabVIEW的Make Current Value Default菜单项实现,但是仍然推荐使用独立的初始化VI为每一个全局变量显式地赋初值。1.4Value属性节点和局域变量的效率众所周知,在LabVIEW中为一个Control赋值有Value属性节点和局域变量2种方式;为一个Indicator赋值有直连、Value属性节点和局域变量3种方式。那么这些方式有哪些区别和联系呢?在实际过程中应该使用哪种方式呢?为了表示分析这三种赋值方式的区别,使用3个独立的VI进行测试,如图 9所示。可以看出,从时间上来看:Time(直连赋值) < Time(局域变量赋值) < Time(Value属性节点赋值)。这说明Indicator直连赋值是最有效和直接的方式,它只是完成数据的显示;而局域变量赋值需要完成对数据的拷贝,占用事件其次;Value属性节点使用了VI Server技术,它需要完成对前面板控件的调用和刷新,占用时间较长。因此从运行时间上看,对控件的赋值应尽量采用直连或局域变量的方式,尽量少地使用属性节点。图 9 测试三种赋值方式所占用的时间1.5功能性全局变量为了克服局域变量和全局变量的“竞争冒险”潜在危险和复制数据副本的缺点,在LabVIEW中可以使用功能性全局变量代替全局变量的使用。因为全局变量的应用无非是读取和写入操作,因此可以使用LabVIEW的移位寄存器将数据空间强制共享。本节将建立一个功能性全局变量代替一个Numeric型的全局变量(下载),新建一个VI的前面板如图 10所示,背面板如图 11所示。程序使用了一个只运行一次的while循环,这是为了使用移位寄存器保存变量的值。使用一个枚举控件表示对全局变量的操作(读或者写),而不同的case结构中响应相应的指令。图 10 功能性全局变量的前面板图 11 功能性全局变量的背面板新建一个VI调用上面的VI(称为功能性全局变量),如图 12所示,可以看出能够输出正确的值。图 12 使用功能性全局变量由于每次读和写变量时,都是取自于while循环中的移位寄存器,因此能够避免了数据拷贝的问题(当然,全局性功能变量VI不能够设置为Reentrant可重载的)。由于功能性全局变量VI中加入了“错误簇”端子,因此使用ErrorIn和ErrorOut能够很好地避免“竞争冒险”问题。从理论上说,功能性全局变量能够完全取代传统的全局变量。由于加入了“错误簇”和移位寄存器,避免了数据的重复拷贝。同时,使用枚举型控件(可以设置为Type Def.控件)能够使得整个程序结构更加清晰、明了,实现模块化程序设计的目的。关键词:
局域变量全局变量功能