變量,有別于LabVIEW圖形化編程環(huán)境所倡導的數(shù)據(jù)流(連線)形式,看似簡單,其實在LabVIEW編程中是一個高級的話題。使用變量,如果理解不透,處理不好,輕則影響程序執(zhí)行效率,重則產(chǎn)生一些意想不到的后果。
這篇推送里我們講解一下LabVIEW中常見的變量,它們各自的作用范圍、使用方法和使用時的注意事項。相信你認真看完后一定會有所收獲。
LabVIEW里常見的變量類型:局部變量、全局變量、移位寄存器、反饋節(jié)點。
1.局部變量Local Variable 局部變量作用范圍為當前VI內,必須在前面板上有對應的控件。 在程序框圖里局部變量用一個帶小房子的圖標表示。

創(chuàng)建/使用局部變量的方法:
1)程序框圖界面下從Structure分類里選擇Local Variable,放置到代碼框圖里,選擇需要關聯(lián)的控件。
2)選中前面板或程序框圖中的控件,右鍵彈出快捷菜單,選擇Create->Local Variable,移動鼠標把創(chuàng)建的局部變量放置到需要的位置。

2.全局變量Global Variable
全局變量作用范圍為本地計算機,可在多個VI、多個LabVIEW設計的應用程序之間共享數(shù)據(jù)。 在程序框圖里全局變量用一個帶地球的圖標表示,global variable。

創(chuàng)建/使用全局變量的方法:
1)程序框圖界面下從Structure分類里選擇Global Variable,放置到代碼框圖里,選擇需要關聯(lián)的控件。如果沒有可關聯(lián)控件,則雙擊全局變量打開全局變量前面板,在前面板上放好全局變量對應的控件(完成了全局變量的創(chuàng)建)。
2)對于已經(jīng)創(chuàng)建好的全局變量,選擇保存全局變量的VI即可選擇調用。
不同于局部變量,全局變量需要一個單獨的VI保存。多個全局變量可以保存在一個VI中。
這個VI只有前面板(沒有程序框圖),用于保存全局變量對應的控件。 我們設計兩個獨立運行的VI,一個給全局變量寫數(shù)據(jù),另一個可以把全局變量的數(shù)據(jù)讀取出來。這就通過全局變量實現(xiàn)了在兩個小程序之間進行數(shù)據(jù)傳遞。


3.移位寄存器Shift Register
移位寄存器用于循環(huán)結構多次循環(huán)之間傳遞數(shù)據(jù),將上一次循環(huán)更新的數(shù)據(jù)傳遞到下一次循環(huán),在程序框圖中以上下兩個箭頭表示。

移位寄存器的作用范圍為所在循環(huán)結構。 創(chuàng)建/使用移位寄存器的方法: 在循環(huán)結構的邊框上單擊鼠標右鍵,選擇Add Shift Register就創(chuàng)建了一對移位寄存器,循環(huán)結構的左右側各一個。
在左側移位寄存器放置一個數(shù)值常量/控件,為移位寄存器設定初始值,同時LabVIEW會根據(jù)輸入值的類型自動設定移位寄存器的數(shù)據(jù)類型。
例如下面這個代碼,通過移位寄存器實現(xiàn)N+(N-1)+(N-2)+...+2+1。

4.反饋節(jié)點Feedback Node
反饋節(jié)點保存上一次執(zhí)行更新的數(shù)據(jù),可以用于循環(huán)結構,也可以用于其它代碼。反饋節(jié)點作用范圍為當前VI。 在程序框圖中反饋節(jié)點用下面這個圖標表示,*那里的接線端用于給反饋節(jié)點設置初始值。與移位寄存器一樣,反饋節(jié)點通過初始值自動確定數(shù)據(jù)類型。

例如下面這個代碼,通過反饋節(jié)點實現(xiàn)N+(N-1)+(N-2)+...+2+1。

反饋節(jié)點和移位寄存器的功能和本質完全相同,但是反饋節(jié)點有以下幾個特點:
1、反饋節(jié)點有啟用輸入端,可以設置啟用條件。 2、反饋節(jié)點可以設置延時次數(shù),規(guī)定每多少次迭代反饋一次數(shù)據(jù)。 3、反饋節(jié)點相當于為所在VI創(chuàng)建了移位寄存器;而移位寄存器只是為所在循環(huán)結構創(chuàng)建。
5.使用注意事項
1)局部/全局變量必須有控件與之對應;全局變量的控件需要保存在單獨的VI文件中。
2)無論哪種形式的變量,使用前都必須初始化。
3)必須考慮競爭對局部/全局變量的影響。
對局部變量來說,要處理好VI內可能的并發(fā)訪問。
對全局變量來說,既要處理好VI內可能的并發(fā)訪問,也要處理好多線程可能的并發(fā)訪問。
處理的基本方法就是要么避免并發(fā)訪問,設法改為順序訪問;要么使用信號量等同步機制。
4)考慮內存使用量
每次對變量的讀取,LabVIEW都會創(chuàng)建內存緩沖區(qū)保存讀取的數(shù)據(jù)。多次、不同位置、大容量數(shù)據(jù)在使用變量保存時,應由其注意。
5)反饋節(jié)點初始化和未初始化差異 下面這個代碼,VI首次運行時會初始化反饋節(jié)點。所以無論這個VI自身執(zhí)行多少次,N等于5的時候結果都是15。


下面這個代碼,反饋節(jié)點沒有進行初始化。第一次執(zhí)行該VI,反饋節(jié)點使用數(shù)據(jù)類型默認初始值0作為初始值,VI執(zhí)行完之后反饋節(jié)點的值為10,加上N(5)后作為本次VI執(zhí)行后的輸出值15。第二次執(zhí)行該VI,反饋節(jié)點使用上一次VI執(zhí)行后的反饋節(jié)點值10作為初始值,循環(huán)執(zhí)行完之后反饋節(jié)點的值為20,加上N(5)后作為第二次VI執(zhí)行后的輸出值25。


6)多次調用含有反饋節(jié)點的VI 注意這里說的是“多次調用”,不是含有反饋節(jié)點的VI自身多次執(zhí)行(Ctrl+R)。

上面這個VI,執(zhí)行一次后反饋節(jié)點等于10。這個10就作為下次該VI被調用時反饋節(jié)點的初始值。所以這個VI被調用兩次后,輸出的值為25,三次后輸出的值為35。


相比之下,Shift Register因為針對的是所在循環(huán)結構,所以使用Shift Register就不存在這樣的問題。
7)嵌套循環(huán)中Shift Register和Feedback Node的不同
下面這個代碼,都是計算5+4+3+2+1,多次執(zhí)行后的終值卻是不一樣的。 使用ShiftRegister的,執(zhí)行三次后終值是15,和單次執(zhí)行一樣。因為Shift Register作用范圍為所在循環(huán)結構,內部For循環(huán)每次執(zhí)行前移位寄存器都被初始化為0,所以三次執(zhí)行后終值還是15。 使用Feedback Node的,執(zhí)行三次后終值是35(你是不是認為應該是15或者45?)。
因為Feedback Node作用范圍為整個VI,前面說過相當于為VI創(chuàng)建了移位寄存器。VI每次執(zhí)行時都使用上一次執(zhí)行后的反饋節(jié)點值作為初始值。所以執(zhí)行三次后,10+10+10+5 = 35。

8)如何改變6)和7)中反饋節(jié)點的“異常”表現(xiàn)
Feedback Node之所以會有上面講述的那些“異?!北憩F(xiàn),主要是因為它只在首次執(zhí)行VI時執(zhí)行初始化,之后多次調用都是使用同一塊內存區(qū)域保存數(shù)據(jù)。我們改變Feedback Node所在VI的可重入執(zhí)行設置,讓其變?yōu)镻reallocated clone reentrant execution,這樣每次調用這個VI都使用的是不同的內存,多次調用之間就不會再有影響(但是反饋節(jié)點在多次VI調用之間反饋數(shù)據(jù)的功能也丟失了)。

更改之后無論執(zhí)行多少次,結果都是15。

6.查看當前VI全局/局部變量使用情況
Tools->Profile->VI Metrics,勾選Globals/locals。LabVIEW會自動統(tǒng)計當前VI及其調用的子VI中全局/局部變量使用情況。

以上是一些關于局部變量、全局變量、Shift Register、Feedback Node的知識共享,希望能夠引起大家的思考。有些莫名其妙的Bug就是隱藏在對變量不透徹的理解和運用中。感興趣的朋友可以去試一試,一定能夠對以后的開發(fā)工作有所幫助。
審核編輯:劉清
-
LabVIEW
+關注
關注
2022文章
3688瀏覽量
348510 -
緩沖器
+關注
關注
6文章
2236瀏覽量
49050 -
移位寄存器
+關注
關注
4文章
352瀏覽量
23423 -
labview編程
+關注
關注
2文章
9瀏覽量
14465
原文標題:LabVIEW常見變量類型及使用注意事項
文章出處:【微信號:傳感測控物聯(lián)網(wǎng),微信公眾號:傳感測控物聯(lián)網(wǎng)】歡迎添加關注!文章轉載請注明出處。
發(fā)布評論請先 登錄
linux系統(tǒng)中常見注冊函數(shù)的使用方法
講解一下LabVIEW中常見的變量
評論