2012年2月25日 星期六

While Loops

這篇我們將介紹如何在 LabVIEW 裏建立迴圈 (Loops)。

迴圈是一個可以讓一段程式重覆執行的結構。如果你學過其它程式語言,你可能已經熟悉一些迴圈結構,例如 For Loops, While Loops 或是 Do While。在 LabVIEW 裏,迴圈是一個圖形的結構 (Graphical Structure)。

我們來看底下這支程式 (來自 Data Flow Programming #1):

2012011722h21_01_thumb 2012-01-28 11h56_24
▲ 左圖是圖形介面,右圖是 Block Diagram,也就是這支程式的程式碼

這是一個很簡單的程式,它可以讓使用者利用 Button 來控制 LED 的開關,你可以按一下 Button,它就會變成按下的狀態,每當你按下 Run 按鈕 CH24_10_thumb 執行程式的時候,你就會看到 LED 跟著 Button 改變狀態。與其每次都要按 Run 鈕執行程式,現在我們要讓使用者可以不斷地看到 LED 的最新狀態,這就是為什麼我們需要建立迴圈的原因。

建立 While Loops

當你在 Block Diagram 上按滑鼠右鍵打開 Functions Palette,然後點選 Structures,你會看到前兩個選項就是常見的迴圈 For Loop 和 While Loop:

image 

如果你已經知道迴圈要執行的次數,那麼使用 For Loop 是最好的選擇,你只要設定 For Loop 要執行次數就可以了。另一個是可能比較普遍使用的 While Loop,如果你不曉得迴圈要重覆執行多少次,只知道迴圈要在某個條件成立時停止,那麼就用 While Loop。

現在我們要在這支程式裏用 While Loop。所以請選 While Loop,然後在 Block Diagram 上畫出一個 While Loop,並且把想要放在迴圈裏的程式整個包住。像底下這樣,我們已經建立了一個 While Loop:

image

這個迴圈會不斷地重覆執行,直到遇到一個符合 Stop Condition 的條件成立時才停止,而 Stop Condition 是由迴圈右下角稱作 Loop Condition 的紅色按鈕決定的,如下圖所示:

image

我們可以在 Loop Condition 上按右鍵,然後點選 Create Control:

image 

這樣使用者便可以透過一個 Stop 按鈕來決定停止迴圈:

image

這時如果切到 Front Panel,你會看到 LabVIEW 在 Front Panel 左上角自動建立了一個 Stop 按鈕:

image

你可以把它移到比較適當的位置並改變大小,以便讓使用容易看得見:

2012-01-28 13h16_49

現在這個迴圈會不斷的執行直到使用者按下 Stop 按鈕為止。所以當你按下 Run 鈕執行程式,你可以隨時按下按鈕, LED 也會即時同步更新狀態,直到你按下 Stop 按鈕結束程式為止。

image 
▲ 如果程式裏有迴圈,執行程式時 Run 鈕會變成 Running 按鈕

避免佔用太多 CPU 資源

有一件事要特別注意,在使用迴圈的時候,記得要在迴圈裏放個 Timing function 以節省 CPU 資源。

程式在執行的時候,迴圈執行的速度很快,會佔掉 CPU 大部份的運算資源,事實上我們並不需要讓迴圈跑那麼快,所以請切到 Block Diagram 視窗,打開 Functions Palette,點選 Timing > Wait (ms) :

image 

然後在 While Loop 裏放一個 Wait (ms) function:

image

接著在 Wait (ms) 上按右鍵選 Create > Constant:

2012-01-28 14h09_31

然後輸入 100:

image

現在再度執行程式的時候,程式一樣可以執行的很順利,LED 的狀態一樣會跟 Button 同步,不過現在迴圈每跑一次的時候都會讓出 100 ms 的時間讓 CPU 去做其它事情,例如跑其它程式之類的。

下面兩張圖是我使用 Wait (ms) 前後的觀察到的 CPU 使用率,可以看到使用 Wait (ms) 前後的差別,在使用 Wait (ms) 前 CPU 使用率飆到 52%,而在使用 Wait (ms) 後 CPU 使用率大幅下降,才用不到 5%:

2012-01-28 14h34_59 2012-01-28 14h33_57

動動腦

我們在 Data Flow Programming #3 一文中寫過一支華氏溫度轉攝氏溫度的程式,現在請利用在這篇學到的技巧修改華氏轉攝氏的程式,在程式裏加上一個 While Loop 讓程式可以重覆的執行:

2012-01-28 14h43_40

記得要在迴圈裏加個 Wait (ms) 的 Timing function 以避免迴圈佔用太多 CPU 資源。

參考資料

0 意見: