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