Shift Register 與 Function Global
先看一段C代碼,該函數(shù)的目的是記錄它本身被調(diào)用的次數(shù),最好的方式當(dāng)然是在該函數(shù)內(nèi)部記錄,這就要求在兩次調(diào)用之間保持上次的記錄,用static 變量最為合理,一是該變量的作用區(qū)域僅在函數(shù)內(nèi),外部無法直接修改,二是可以自動在首次調(diào)用時(shí)對變量進(jìn)行初始化.
int Record(void)
{
static int counter=0; //首次調(diào)用初始化
counter++;
return(counter);
}
類似的功能在labview里是如何實(shí)現(xiàn)的那,我們當(dāng)然可以用一個(gè)全局變量,在SUBVI中對全局變量執(zhí)行+1的操作,但是這樣做副作用是非常明顯的.
一是因?yàn)闆]有封裝數(shù)據(jù),該全局變量可以在程序任何位置被修改.二是當(dāng)幾個(gè)地方同時(shí)操作該全局變量,因?yàn)闆]有保護(hù)機(jī)制,當(dāng)前結(jié)果無法預(yù)料.
最好的辦法是利用Function Global,也稱做LV2型全局變量,可能是LABVIEW2以前沒有內(nèi)置的全局變量,這是唯一的方法.
Function Global核心是Shift Register (未初始化的),大多數(shù)書籍都強(qiáng)調(diào)Shift Register 初始化的重要性,實(shí)際上未初始化的Shift Register 更為重要.
Shift Register的一般用法就不解釋了,比如在FOR循環(huán)中求平均值的問題.我們要考慮的是Shift Register本質(zhì)到底是什麼?實(shí)際上應(yīng)該是開辟的一段共享內(nèi)存空間,這段內(nèi)存空間是可讀寫的,既然這樣本質(zhì)上和全局變量就沒有區(qū)別,一個(gè)最基本的Function Global如下圖所示:
更正:上圖中控制循環(huán)的布爾常量應(yīng)為TRUE,目的使循環(huán)只運(yùn)行一次,目的是使用SHIFT REGISTER
下面演示一下它的使用方法:
這就實(shí)現(xiàn)了全局變量的數(shù)據(jù)交換功能.利用組件編程是LABVIEW的重要編程方法,Funtion Global是它的核心部分.
這段程序存在一個(gè)問題,當(dāng)程序啟動,未進(jìn)行寫操作時(shí),那Shift Register的值是什麼那?做為組件編程,應(yīng)該在它的內(nèi)部實(shí)現(xiàn)自我初始化. 這里引入一個(gè)重要的VI,FIRST CALL來解決這個(gè)問題.