Shift Register 与 Function Global
扫描二维码
随时随地手机看文章
先看一段C代码,该函数的目的是记录它本身被调用的次数,最好的方式当然是在该函数内部记录,这就要求在两次调用之间保持上次的记录,用static 变量最为合理,一是该变量的作用区域仅在函数内,外部无法直接修改,二是可以自动在首次调用时对变量进行初始化.
int Record(void)
{
static int counter=0; //首次调用初始化
counter++;
return(counter);
}
类似的功能在labview里是如何实现的那,我们当然可以用一个全局变量,在SUBVI中对全局变量执行+1的操作,但是这样做副作用是非常明显的.
一是因为没有封装数据,该全局变量可以在程序任何位置被修改.二是当几个地方同时操作该全局变量,因为没有保护机制,当前结果无法预料.
最好的办法是利用Function Global,也称做LV2型全局变量,可能是LABVIEW2以前没有内置的全局变量,这是唯一的方法.
Function Global核心是Shift Register (未初始化的),大多数书籍都强调Shift Register 初始化的重要性,实际上未初始化的Shift Register 更为重要.
Shift Register的一般用法就不解释了,比如在FOR循环中求平均值的问题.我们要考虑的是Shift Register本质到底是什麽?实际上应该是开辟的一段共享内存空间,这段内存空间是可读写的,既然这样本质上和全局变量就没有区别,一个最基本的Function Global如下图所示:
更正:上图中控制循环的布尔常量应为TRUE,目的使循环只运行一次,目的是使用SHIFT REGISTER
下面演示一下它的使用方法:
这就实现了全局变量的数据交换功能.利用组件编程是LABVIEW的重要编程方法,Funtion Global是它的核心部分.
这段程序存在一个问题,当程序启动,未进行写操作时,那Shift Register的值是什麽那?做为组件编程,应该在它的内部实现自我初始化. 这里引入一个重要的VI,FIRST CALL来解决这个问题.