前言:任何計(jì)算機(jī)語言都離不開程序結(jié)構(gòu),LabVIEW 作為一種圖形化的高級(jí)程序幵發(fā)語言也不例外。LabVIEW 中的程序結(jié)構(gòu)包括if-else循環(huán),while循環(huán)結(jié)構(gòu),使能結(jié)構(gòu),公式節(jié)點(diǎn)和數(shù)學(xué)腳本節(jié)點(diǎn)等, 因此通過LabVIEW可以非常方便快速地實(shí)現(xiàn)任何復(fù)雜的程序結(jié)構(gòu)。在LabVIEW 中,無論是循環(huán)結(jié)構(gòu)、Case 結(jié)構(gòu)還是條件式節(jié)點(diǎn),它們都表現(xiàn)為一個(gè)方框包圍起來的圖形代碼。這個(gè)方框就類似于C語言中的兩個(gè)花括號(hào) 。 一、while循環(huán)如果我們需要讓循環(huán)在滿足某種條件時(shí)退出或繼續(xù)運(yùn)行,這時(shí)候就需要借助于 While 循環(huán)。它是 LabVIEW 中最經(jīng)常使用的一種程序結(jié)構(gòu)。 下面我們利用 while 循環(huán)寫一段最簡單的代碼:用戶輸入一個(gè)整數(shù),while循環(huán)計(jì)算出 1 到 該數(shù)值的累加和,該段代碼如下所示: 在上述代碼中使用了反饋節(jié)點(diǎn),因?yàn)槭褂?反饋節(jié)點(diǎn)可以讓程序更簡潔, 就是直接將輸出與輸入連接起來,這時(shí)就會(huì)自動(dòng)出現(xiàn)一個(gè)反饋節(jié)點(diǎn)的符號(hào)。 其中 如果以索引方式輸入數(shù)組的話,While循環(huán)的次數(shù)并不會(huì)由數(shù)組大小控制,它仍由布爾值控制。當(dāng)循環(huán)次數(shù)超過數(shù)組大小時(shí),將以數(shù)組最后一個(gè)元素作為輸入。我們編寫代碼如下所示: 運(yùn)行程序后,前面板顯示: LabVIEW 在執(zhí)行While循環(huán)時(shí),如果用戶沒有給它設(shè)定循環(huán)時(shí)間間隔,那么它將以CPU的極限速度運(yùn)行。按下Ctrl+Alt+Delete 快捷鍵打幵任務(wù)管理器,可以看到它幾乎將CPU全部利用, 正常情況這樣做比較危險(xiǎn),因?yàn)檫@樣可能會(huì)導(dǎo)致整個(gè) LabVIEW 程序看上去跟“死 掉” 一樣。 因此,在寫 While 程序時(shí)千萬別忘了加上一個(gè)定時(shí)器,即: 二、For 循環(huán)For 循環(huán)用于將某段程序循環(huán)執(zhí)行指定的次數(shù)。可以通過兩種方法指定循環(huán)次數(shù),一種是直接給定,一種是通過輸入數(shù)組的大小給定。它在 函數(shù)面板中的位置如下圖所示: 如果輸入 For 循環(huán)體的數(shù)據(jù)為數(shù)組的話,有兩種情況:一種是將整個(gè)數(shù)組一次性輸入循環(huán)體, 另一種是讓數(shù)組元素逐個(gè)地輸入,并以數(shù)組大小確定循環(huán)次數(shù)。同理,輸出也一樣,可以一次性將整個(gè)數(shù)組輸出;也可以將元素逐個(gè)輸出,最后再將所有輸出元素組合為同一個(gè)數(shù)組輸出。 一般來說,如果直接將數(shù)組與內(nèi)部數(shù)據(jù)連接,它默認(rèn)就是自動(dòng)索引,即數(shù)組元素一個(gè)個(gè)地輸入,輸出也是一樣的。一般情況下,用戶不再需要指定運(yùn)行的次數(shù),它會(huì)自動(dòng)根據(jù)數(shù)組大小執(zhí)行。 當(dāng)然如果用戶硬要指定,那么它按照最小的執(zhí)行次數(shù)執(zhí)行。即如果數(shù)組有5個(gè)元素,而用戶指定循環(huán)次數(shù)為10,則實(shí)際循環(huán)次數(shù)為5。索引方式下輸入和輸出一維數(shù)組如下圖所示: 程序框圖: 前面板: 顯然,雖然沒有指定 for 循環(huán)中 N值 的大小,該循環(huán)執(zhí)行了5次就終止了。因此,它會(huì)自動(dòng)根據(jù)數(shù)組大小決定執(zhí)行次數(shù)。 如何利用 for 循環(huán)來產(chǎn)生二維數(shù)組或多維數(shù)組,方法很簡單,如下圖所示: 對(duì)應(yīng)的前面板如下所示: 改變循環(huán)次數(shù): 三、事件結(jié)構(gòu)Labview 提供了事件結(jié)構(gòu),即僅當(dāng) “事件” 發(fā)生時(shí),程序才作相應(yīng)的響應(yīng)。 通過事件結(jié)構(gòu),程序可以變得很簡單,并降低CPU利用率。當(dāng)多個(gè)事件發(fā)生時(shí)會(huì)形成事件隊(duì)列, 直到每個(gè)事件對(duì)應(yīng)的代碼都被執(zhí)行為止,因此不會(huì)有事件被漏掉的情況。 注意:事件結(jié)構(gòu)必須放在 While 循環(huán)中,否則沒有意義,因?yàn)楫?dāng)一個(gè)事件完成后,程序 需要去等下一個(gè)事件的發(fā)生。我們來看一段代碼: 接下來我們?cè)谶x擇器標(biāo)簽處右鍵鼠標(biāo),添加事件分支: 添加 “取消按鈕” 對(duì)應(yīng)的事件: 添加 “確定按鈕” 對(duì)應(yīng)的事件: 添加 “ 旋鈕” 對(duì)應(yīng)的事件: 然后我們可以運(yùn)行代碼,在前面板看到結(jié)果如下: 旋轉(zhuǎn) 旋鈕:
四、條件結(jié)構(gòu)這一節(jié)我們通過一個(gè)例子來學(xué)習(xí)條件結(jié)構(gòu):利用條件結(jié)構(gòu)和循環(huán)結(jié)構(gòu)寫一個(gè)跑馬燈,即要求 5 個(gè)燈從左到右不停的輪流點(diǎn)亮,閃爍間隔由滑動(dòng)條調(diào)節(jié),我們新建一個(gè)空白 VI ,然后編寫代碼: 在while循環(huán)中放一個(gè)時(shí)延函數(shù),延時(shí)時(shí)間由滑動(dòng)條控制,這個(gè)延時(shí)時(shí)間就是跑馬燈的閃爍間隔。然后從循環(huán)次數(shù) i 引出,除以 5 取余數(shù)加1 作為條件使能結(jié)構(gòu)的輸入。最后依次設(shè)置每個(gè)分支: 當(dāng)輸入為3時(shí)的分支執(zhí)行的代碼: 輸入為4時(shí)對(duì)應(yīng)的分支: 輸入為5時(shí)對(duì)應(yīng)的分支: 我們看看對(duì)應(yīng)的前面板: 接下來,我們運(yùn)行程序: 注意: 當(dāng)條件使能結(jié)構(gòu)有多個(gè)分支時(shí),必須設(shè)置默認(rèn)分支,否則程序無法執(zhí)行,如下: 五、公式節(jié)點(diǎn)公式節(jié)點(diǎn)是一種程序結(jié)構(gòu),通過公式節(jié)點(diǎn),用戶不僅可以實(shí)現(xiàn)復(fù)雜的數(shù)學(xué)公式,還能通過文本編程寫一些基本的邏輯語句,如if...else...、case, while循環(huán)之類的語句。可以這么說,公式節(jié)點(diǎn)基木上彌補(bǔ)了圖形化幵發(fā)語言相對(duì)于文木語言的缺陷。公式節(jié)點(diǎn)的語法與C語言基本相同。 接下來我們來利用公式節(jié)點(diǎn)進(jìn)行編程: 我們添加公式節(jié)點(diǎn)函數(shù),在方框的邊框上右鍵鼠標(biāo),添加2個(gè)輸入和3個(gè)輸出,然后編程算法代碼: 顯然,公式節(jié)點(diǎn)不僅能實(shí)現(xiàn)一個(gè)公式,還能同時(shí)實(shí)現(xiàn)多個(gè)公式,只需要增加輸入輸出端子就可以了。而且,語法規(guī)則完全遵循C語言。 運(yùn)行程序可以看到: 更改 a 和 b 的值: 六、實(shí)踐——溫度監(jiān)測(cè)系統(tǒng)最后,我們來做一個(gè)溫度監(jiān)測(cè)系統(tǒng),該系統(tǒng)底層數(shù)據(jù)是由隨機(jī)數(shù)發(fā)生器產(chǎn)生的20?40 之間的隨機(jī)數(shù),其代碼如下所示: 設(shè)置華氏和攝氏兩種顯示模式,選擇華式溫度時(shí): 選擇攝氏溫度時(shí): 然后設(shè)定溫度上限,當(dāng)溫度超限時(shí),Alarm Counter加1,這里采用了移位寄存器。LabVIEW 提供了移位寄存器,把上一次循環(huán)產(chǎn)生的結(jié)果 “移動(dòng)” 到下一次循環(huán)的輸入。添加移位寄存器的方法如下圖所示: 右擊 For 循環(huán)的邊框,選擇 添加移位寄存器 選 項(xiàng),在右擊點(diǎn)和另外一側(cè)就會(huì)出現(xiàn)一個(gè)小黑框,把它與需要連接的數(shù)據(jù)連接即可。 由于存儲(chǔ)在移位寄存器中的數(shù)據(jù)值直到關(guān)閉VI時(shí)才從內(nèi)存中消除。如果沒有初始化移位寄存器,就會(huì)導(dǎo)致在關(guān)閉VI之前前后 兩次運(yùn)行該 VI 的結(jié)果截然不同。由于這種情況難于預(yù)測(cè),因而可能會(huì)使VI的運(yùn)行結(jié)果難以捉摸, 因此,任何情況下都別忘了初始化移位寄存器。 接下來分析整個(gè)程序,最外層用 While 循環(huán)來控制整個(gè)系統(tǒng)的運(yùn)行: 當(dāng)用戶單擊 “幵始采集” 按鈕后,系統(tǒng)幵始采集數(shù)據(jù),執(zhí)行 case循環(huán)中的 true分支對(duì)應(yīng)的程序,在該分支中,用層疊順序結(jié)構(gòu)來實(shí)現(xiàn)“初始化”,“運(yùn)行”,“結(jié)束”這3個(gè)順序執(zhí)行狀態(tài): 我們執(zhí)行程序,可以看到前面板如下: |
|