學術專區 關於NI NI活動訊息 NI Developer Zone 技術支援服務 使用者解決方案 產品與服務 連絡NI MyNI

6. 執行架構

執行架構包含「圖形化程式碼的控制方式」與「內部程式碼的執行時機」。最常見的執行架構即為 While Loop、For Loop、Case 架構。透過這些架構,即可多次執行程式碼的多個區段,或根據條件而執行程式碼的不同區段。接著將說明架構的功能,與 NI LabVIEW 軟體中的使用時機。

共有 4 段影片:


詳細說明

下載詳細說明 PDF 檔


While Loop

如  圖 1 所示,必須滿足特定條件之後,While Loop 才會執行其內的程式碼;即類似文字架構程式語言中的 Do Loop 或 Repeat-Until Loop。

圖 1.  LabVIEW 中的 While Loop;具備 While Loop 同樣功能的流程圖;還有 While Loop 功能 
的虛擬碼 (Pseudo code) 範例

While Loop 位於  Structures  面板上。從面板上選擇  While Loop  之後,針對所要重複的程式碼區塊,可用滑鼠拖曳出矩形並將之圈住。放開滑鼠之後,隨即會有 While Loop 圈住使用者所選的區塊。

只要在 While Loop 中拖曳程式圖物件,即可將之新增至 While Loop 中。

只要  Conditional Terminal (條件端點,屬於輸入端點) 接收特定 Boolean 值之後,While Loop 隨即執行程式碼。

亦可透過 While Loop 的條件端點而處理基本錯誤。若將錯誤叢集接至條件端點,則僅有 狀態 (Status) 參數的 True 或 False 值將傳送至端點。同樣的, Stop if True  與  Continue if True  功能表項目,將分別變更為  Stop if Error  與  Continue while Error          。


 Iteration  端點屬於輸出端點,其中包含已完成的循環次數。While Loop 的循環計數均從零開始。

注意: While Loop 均將執行至少 1 次。

無限迴圈 (Infinite Loop)

無限迴圈為常見的程式設計錯誤,即無法停止的迴圈。若 Conditional Terminal  為 Stop if True,而使用者又於 While Loop 外部放置 Boolean 控制元的端點。一旦迴圈開始,控制元即成為 FALSE,就會形成無限迴圈。

圖 2.  While Loop 之外的 Boolean 控制元

因為在迴圈開始之前,僅將讀取該值 1 次,所以改變控制元的值並無法停止無限迴圈。若要透過控制元停止 While Loop,則必須於迴圈中配置控制元端點。若要停止無限迴圈,則按下工具列上的  Abort Execution  按鈕,即可終止該 VI。

在 圖 3  中的 While Loop 將不斷執行,直到 Random Number 函式的輸出大於或等於 10.00,且 Enable 控制元為 TRUE 才會停止。而只有此 2 組輸出均為 TRUE 時,And 函式才會回傳 TRUE。否則 And 函式將回傳 FALSE。

在 圖 3
中,只要 Random 函式不產生 10.00 以上的值,就會成為無限迴圈。

圖 3.無限迴圈

回到頂端

架構通道 (Structure Tunnel)

通道 (Tunnel) 負責為架構來回傳送資料。While Loop 邊框上的實心區塊即為通道。此區塊的顏色與「通道所銜接資料形態」的顏色相同。在迴圈終止之後,隨即有資料送出迴圈。當通道傳送資料進入迴圈時,只要資料抵達通道之後,就隨即執行迴圈。

 圖 4 即以  Iteration Terminal  連至通道。直到 While Loop 執行完畢,通道中的數值才會傳送至 Iterations 指示元。 Iteration Terminal  於 Iterations 指示元中只會顯示最後的數值。

圖 4.  While Loop 的通道

For Loop

For Loop 可執行子程式圖達指定的次數。 圖 5  為 LabVIEW 中的 For Loop,其中的流程圖等於 For Loop 的功能,還有 For Loop 功能的虛擬碼 (Pseudo code) 範例


圖 5.  LabVIEW 中的 For Loop;具備 While Loop 同功能的流程圖;還有 For Loop 功能 
的虛擬碼 (Pseudo code) 範例

For Loop 位於  Structures  面板上。另可於程式圖上放置 While Loop,對 While Loop 的邊框按下滑鼠右鍵,再點選功能表上的  Replace with For Loop ,即可將 While Loop 變更為 For Loop。

 Loop Count  端點屬於輸入端點,其數值顯示子程式圖所應重複的次數。

 Iteration Terminal  則為輸出端點,顯示「已完成循環」的次數。 For Loop 的循環計數均從零開始起算。

與 While Loop 不同的是,For Loop 可執行指定的次數。而 While Loop 必須執行達  Conditional Terminal  的特定數值,才會停止。

 圖 6  中的 For Loop 將於每秒產生 1 組隨機數字,共達 100 秒,並於數字指示元中顯示這些隨機數字。

圖 6.For Loop 範例

回到頂端

將時序新增至迴圈

當迴圈完成目前循環之後,隨即開始執行下一次的循環,直到滿足停止條件為止。而使用者往往必須控制循環的頻率或時序。以資料擷取為例,若要每 10 秒擷取資料 1 次,則必須為迴圈迭代設定時序,使其能每 10 秒發生 1 次。即使不以特定頻率執行迴圈,仍須為處理器提供時序,才能完成其他作業 (如對使用者介面產生反應)。

Wait 函式

可於迴圈內放置 Wait 函式,讓 VI 可休眠特定時間。而處理器亦可於等待時間中進行其他作業。Wait 函式將使用作業系統的毫秒 (Millisecond) 時脈。

Wait (ms) 函式將等待,直到毫秒計數器達到使用者所指定的輸入。此函式將確保迴圈的執行速率,等於使用者所指定的輸入總數。

回到頂端

Case 架構


Case 框架具備超過 2 組的子程式圖或條件。若 1 次僅能看到 1 組子程式圖,則此架構將單次僅執行 1 組條件。而輸入值將決定應執行何項子程式圖。Case 架構近似於文字架構程式語言的開關 (切換),或「if...then...else」陳述式。

在 Case 架構頂端的 Case Selector  標籤,將包含該選擇元 (Selector) 數值的名稱。此名稱將對應至中央的條件,還有 2 邊的增量/減量箭頭。 點選  Decrement  與  Increment  箭頭,以捲動可用的條件。另可點選條件名稱旁邊的向下箭頭,再從下拉式功能表中選擇條件。

將輸入值或選擇元接至  Selector Terminal ,即可決定所要執行的條件。 Selector Terminal 必須連接整數、字串、列舉 (Enum),或 Boolean 資料形態的值。另可將  Selector Terminal  置於 Case 架構的左側邊框任何一處。若選擇元端點為 Boolean 資料形態,則架構將具備 TRUE 與 FALSE 條件。若  Selector Terminal  為整數、字串,或列舉形態的數值,則架構可能為任何條件。

注意: 依預設值,連至選擇元端點的字串值,屬於高敏感度的條件。若僅需低敏感度的條件,可將字串值連至選擇元端點,再對 Case 架構的邊框按下滑鼠右鍵,並點選功能表中的 Case Insensitive Match。

若並未針對 Case 架構指派預設條件,以處理範圍以外的數值,則必須仔細列出所有可能的輸入值。以整數的選擇元為例,且使用者指定 1、2、3 的條件,若輸入值為 4 或其他未指定的整數值,則使用者必須指定預設的執行條件。

注意: 若選擇元連接 Boolean 控制元,則將無法指定預設條件。若對條件選擇元標籤按下滑鼠右鍵,則功能表將不會顯示 Make This The Default Case。Boolean 控制元可為 TRUE 或 FALSE,直接決定是否執行條件。

對 Case 架構的邊框按下滑鼠右鍵,即可  新增 (Add)、 複製 (Duplicate)、 移除 (Remove)、 重新排列 (Rearrange) 條件,亦可選擇  預設條件 (Default case)

選擇條件

圖 7  中的 VI 使用了 Case 架構,可根據使用者所選 °C 或 °F 的溫度單位,執行不同的程式碼。程式圖上方為前置的 TRUE 條件。程式圖中央則選了 FALSE 條件。若要選擇條件,則可於  Case Selector  中輸入數值,或透過 Labeling 工具編輯數值。在選擇任何條件之後,此條件將顯示於程式圖上,即如圖 7 下方的程式圖。

圖 7.  變更 Case 架構的條件檢視

若「使用者輸入的選擇元數值」與「接至選擇元端點的物件」之間為不同的資料形態,則數值將顯示為紅色。此代表無法執行該 VI,直到使用者刪除或編輯該數值。同樣的,由於浮點運算可能發生四捨五入的錯誤,因此浮點數值亦無法作為條件選擇元的數值。若將浮點數值接至條件,則 LabVIEW 會將數值捨進為最接近的整數。若於條件選擇元中鍵入浮點數值,則數值將顯示紅色,直到刪除或編輯該數值才能執行該框架。

輸入與輸出通道 (Tunnel)

Case 架構可擁有數個輸入/出通道。輸入可用於所有條件,但並非所有輸入均需要條件。但各項條件均需定義 1 組輸出通道。

看看下例範例:程式圖上的 Case 架構具備 1 個輸出通道,且至少有 1 個條件並無任何輸出值接至通道。若執行此條件,則 LabVIEW 將不知道應回傳何項數值至輸出。LabVIEW 會將通道中央顯示為白色代表錯誤。此未接線的條件,可能不會顯示於程式圖上。

若要修正此錯誤,則應顯示「包含未接線輸出通道」的條件,並將輸出接至通道。亦可對輸出通道按下滑鼠右鍵,並點選功能表的  Use Default If Unwired,即可讓所有未接線通道使用預設的通道資料形態。當輸出接至所有條件後,輸出通道即顯示為實體顏色。

應避免使用  Use Default If Unwired  選項。此選項將無法詳實呈現程式圖,並可能影響使用相同程式碼的其他工程師。 Use Default If Unwired 亦可能影響程式碼除錯。若使用此選項,應注意該預設值即為銜接通道所用的資料類型。舉例來說,若通道屬於 Boolean 資料類型,則預設值為 FALSE。

表 1.  資料形態預設值

回到頂端

其他架構

LabVIEW 具備更高階的執行架構,如 Event 架構 (可處理 UI 互動的中斷驅動作業) 與 Sequence 架構 (可強制執行次序),提供更多功能。若要進一步了解這些架構,可參閱 LabVIEW Help 相關主題。

回到頂端

於 LabVIEW 的迴圈循環之間傳輸資料

當於 LabVIEW 中設計迴圈時,往往必須從迴圈的前次週期存取資料。舉例來說,若必須從迴圈的各次週期擷取 1 筆資料,且每 5 筆資料又要平均 1 次,則必須從迴圈的前次週期取得資料。

移位暫存區 (Shift Register)


當要將數值從前次週期傳至下次週期時,即可使用移位暫存區。移位暫存區均為成對的端點,並置於迴圈邊框垂直的 2 邊相互對應。

迴圈右邊的端點具備向上箭頭,可於週期完成時儲存資料。LabVIEW 接著將資料傳送至暫存區右邊的週期中。在迴圈執行過後,迴圈右邊的端點隨即傳回最新數值,並將之儲存於暫存區中。

對迴圈左或右側邊框按下滑鼠右鍵,再點選  Add Shift Register  即可建立移位暫存區。

暫存區可傳送任何資料類型,且只要是連接暫存區的第一組物件,均可自動變更其資料類型。連接各暫存區端點的資料,均必須為相同類型。

單一迴圈可新增超過 1 組移位暫存區。若有多個作業均將使用迴圈的前次週期數值,則可透過多個暫存區儲存框架中的不同資料,如圖 8 所示。

圖 8. 使用多個移位暫存區

初始化移位暫存區

當 VI 執行時,初始化暫存區將重新設定「傳送至迴圈首次週期的數值」。如 圖 9 所示,將控制元或常數接至迴圈左邊的暫存區端點,即可初始化移位暫存區。

圖 9.初始化移位暫存區

在 圖 9 中,For Loop 將執行 5 次,且逐次提高暫存區所儲存的數值。在 For Loop 循環 5 次之後,暫存區隨即傳送最終值「5」至指示元,且 VI 隨即退出。每次只要執行 VI,暫存區均以「0」開始。若不要初始化暫存區,則迴圈將使用「最近 1 次執行時寫入至暫存區的值」;又若尚未執行過迴圈,則將使用該資料類型的預設值。針對 VI 後續的執行作業,未初始化暫存區則可保留其間的狀態資訊。

圖 10.  未初始化的移位暫存區

在 圖 10 中,For Loop 將執行 5 次,且逐次提高暫存區所儲存的數值。當首次執行 VI 時,暫存區即從「0」開始,亦為 32 位元整數的預設值。在 For Loop 循環 5 次之後,暫存區隨即傳送最終值「5」至指示元,且 VI 隨即退出。當下次執行 VI 時,暫存區即從「5」開始,亦為前次執行的最後數值。在 For Loop 循環 5 次之後,暫存區隨即傳送最終值「10」至指示元。若再次執行 VI,暫存區即以「10」開始,依此類推。未初始化的暫存區將保留前次循環的數值,直到使用者關閉 VI 為止。

堆疊式移位暫存區

堆疊式暫存區 (Stacked shift register) 可存取迴圈前次循環的資料。堆疊式暫存區可記憶數組前週期的數值,並將這些數值帶入往後的週期。若要建立堆疊式移位暫存區,則可對左邊端點按下滑鼠右鍵,並點選 Add Element 。

由於右邊端點僅能轉換「目前週期到下次週期」所產生的資料,因此僅能從迴圈左邊設定堆疊式暫存區。

圖 11.  使用堆疊式移位暫存區

若將其他元素新增至前述程式圖的左邊端點時,則因為最新數值已儲存於頂端的暫存區,所以最後 2 次週期的數值將帶入下次週期。底部端點將儲存前次週期的資料並傳送之。

回到頂端

 

Module Quiz:執行架構

完成簡易測驗,看看自己是否了解「LabVIEW 執行架構」影片中的概念。

  1. 若要連續執行程式碼的區塊之一,直到滿足特定條件,就必須使用___________
    While Loop
    Case 架構
    For Loop

     
  2. 若要連續執行程式碼的區塊之一,直到滿足特定條件,就必須使用___________
    While Loop
    Case 架構
    For Loop

     
  3. 若要先滿足特定條件,再執行程式碼的區塊之一,就必須使用___________
    While Loop
    Case 架構
    For Loop

     
  4. For Loop 預設具備自動索引 (Auto-indexing) 通道,當退出迴圈時可自動回傳___________;While Loop 則不具備自動索引通道,當退出迴圈時將回傳__________
    最後值,數值陣列
    數值陣列,最後值
    數值陣列,數值陣列
    最後值,最後值

     
  5. ___________可傳送迴圈上次循環的數值。
    區域變數
    移位暫存區 (Shift Register)
    屬性節點 (Property Node)
    While Loop

     

 

Cumulative Test:
LabVIEW Basics

接受 LabVIEW Basics Test,測出自己對 LabVIEW 基本了解程度。建議先完成 LabVIEW Basic Concepts 中的 7 大區塊之後,再接受此測驗。本測驗共有 20 題多重選擇題。

開始

Cumulative Exercise:
LabVIEW Basics

完成 LabVIEW Basics Exercise,以了解自己對 LabVIEW 環境的熟悉程度。建議先完成 LabVIEW Basic Concepts 中的 7 大區塊之後,再接受此測驗。此習題將透過 LabVIEW 而建構計算機。

開始