本節書摘來自華章計算機《arduino開發實戰指南:labview卷》一書中的第3章,第3.5節,作者:餘崇梓著, 更多章節内容可以通路雲栖社群“華章計算機”公衆号檢視。
labview的程式執行結構包含圖形化代碼及控制内部代碼運作的方式和時間。最常見的執行結構為while循環、for循環和條件結構,可以用來多次運作相同的代碼或基于某些條件執行不同的代碼。
3.5.1 while循環結構
與文本程式設計語言的do循環或repeat-until循環類似,while循環将執行其包含的代碼直到滿足某一條件為止。
while循環位于結構選闆。從選闆中選擇while循環,用滑鼠拖曳出一個矩形,将程式框圖中需要重複執行操作的部分框入該矩形。松開滑鼠時,while循環的邊框将包圍選中部分。隻需将對象拖放到while循環内部即可為其添加程式框圖對象。
while循環執行其中的代碼,直到條件接線端(輸入端)接收到某一特定的布爾值。
使用while循環的條件接線端也可以執行基本的錯誤處理。當将錯誤簇連接配接到條件接線端時,隻有錯誤簇status參數的true或false值被傳遞到該接線端。同時,為true時停止和為true時繼續快捷菜單項也相應地改變成為false時停止和為false時繼續。計數接線端是一個輸出接線端,表示已完成的循環次數。
1.無限循環
無限循環是指循環永不停止,是常見的程式設計錯誤。
如條件接線端是true時循環停止,可在while循環外放置一個布爾控件。将控件設為false時循環開始,這樣便建立了一個無限循環,如圖3-31所示。由于輸入控件的值隻在循環開始前被讀取一次,是以改變控件的值并不能停止無限循環。為了使用控件将while循環停止,應該将控件接線端放在循環内。要停止一個無限循環,必須單擊工具欄上的中止執行按鈕中止整個vi。
如圖3-32所示,while循環将一直執行,直至随機函數輸出大于等于8.0,該程式為無限循環,因為随機函數生成的值将永遠不超過8.0。
2.結構隧道
隧道用于接收和輸出結構中的資料。while循環邊框上的實心小方塊就是隧道。實心小方塊的顔色和與隧道相連的資料類型的顔色一緻。循環中止後,資料才能輸出。資料輸入循環時,隻有在資料到達隧道後循環才開始執行。
如圖3-33所示,計數接線端與隧道相連。直至while循環停止執行後,隧道中的值才被傳送至計數顯示控件。計數顯示控件隻顯示計數接線端最後的值。
3.5.2 for循環結構
for循環按設定的次數執行子程式框圖。for循環位于結構選闆。在程式框圖上放置while循環,然後右鍵單擊while循環的邊框,從快捷菜單中選擇替換為for循環,将while循環轉變為for循環。
總數接線端是一個輸入接線端,它的值表示重複執行該子程式框圖的次數。
計數接線端是一個輸出接線端,表示已完成的循環次數。
for循環疊代計數總是從零開始。for循環與while循環的不同之處在于:for循環隻執行指定的次數,而while循環會一直執行,直至條件接線端接收到某一特定的值時才停止執行。圖3-34中的for循環每秒産生一個随機數,共執行200s,并用數字顯示控件顯示産生的随機數。
當循環結構執行一次循環後,它會立刻開始執行下一次循環,除非滿足停止條件。通常都需要控制循環的頻率或定時。例如,如果要求每10s采集一次資料,就需要将各次循環間的時間間隔定時為10s。即使不需要以特定的頻率執行循環,處理器也需要定時完成其他任務,如響應使用者界面事件。
在循環結構内部放置一個“等待”函數,可以使vi在一段指定的時間内處于睡眠狀态。 在這段等待時間之内,處理器可以處理其他任務。“等待”函數使用作業系統的毫秒(ms)計數器。
“等待”函數保持等待狀态直至毫秒計數器的值等于預先輸入的指定值。該函數保證了循環的執行速率至少是預先輸入的指定值。
3.5.3 條件結構
條件結構如圖3-35所示。條件結構包括兩個或兩個以上子程式框圖(也稱“條件分支”)。每次隻能顯示一個子程式框圖,并且每次隻執行一個條件分支。輸入值将決定執行的子程式框圖。條件結構類似于文本程式設計語言中的switch語句或if...then...else語句。在條件結構頂部的case選擇器标簽中,含有對應于中間各個選框選擇器值的名稱,以及遞減和遞增箭頭。
單擊遞減或遞增箭頭可以滾動浏覽已有條件分支;也可以單擊條件分支名稱旁邊的向下箭頭,并在下拉菜單中選擇一個條件分支。将一個輸入值或選擇器連接配接至選擇器接線端,即可選擇要執行的條件分支。選擇器接線端支援的資料類型包括整型、布爾型、字元串型和枚舉型。可以将選擇器接線端定位到條件結構左邊框的任意位置。如果選擇器接線端的資料類型是布爾型,則該結構将包括true和false兩個條件分支。如果選擇器接線端的資料類型為整型、字元串型或枚舉型,該結構可以有任意個條件分支。
注:預設情況下,連接配接至選擇器接線端的字元串值是區分大小寫的。
右鍵單擊條件結構的邊框,可從快捷菜單中選擇啟用不區分大小寫比對。如未指定用于處理範圍外數值條件分支的預設條件結構,則必須列出所有可能的輸入值。例如,如果選擇器的資料類型是整型,并且指定了1、2、3選框,這時必須指定一個預設選框以便在輸入資料為4或任何其他未指定的整數值時執行。
注:如将一個布爾控件連接配接至選擇器,則不能指定預設分支。如右鍵單擊分支選擇器标簽,快捷菜單中不出現設定本分支為預設分支的選項。将布爾控件設定為true或false,确定執行的分支。
右鍵單擊條件結構的邊框可以添加、複制、删除分支或重新排列分支的順序,以及選擇預設條件分支。
(1)條件分支的選擇
如圖3-36和圖3-37所示,vi使用條件結構是根據輸入控件select的不同(true或false)而執行不同的代碼。圖3-36的程式框圖顯示了select為“true”的條件分支;
圖3-37的程式框圖顯示了select為“false”的條件分支。通過在分支選擇器辨別符中輸入相應值或者使用标簽工具編輯該值,可以實作對條件分支的選擇。
如輸入的選擇器值與連接配接到選擇器接線端的對象不是同一類型,則選擇器值為紅色,這表示隻有編輯或删除該值後vi才可運作。同樣,由于浮點算術運算可能存在因四舍五入而産生的誤差,是以,浮點數不能作為條件選擇器值。如果将一個浮點數連接配接到條件分支,labview将對其舍入到最近的整數值。如果在條件選擇器标簽中鍵入浮點值,數值将變成紅色,表示在執行結構前必須删除或編輯該值。
(2)輸入和輸出隧道
可以為條件結建構立多個輸入和輸出隧道。所有輸入都可供條件分支選用,而條件分支不一定要使用所有輸入。但是,必須為每個條件分支定義各自的輸出隧道。
3.5.4 順序結構
通常情況下,labview的程式在執行的時候,是按照資料流的方式根據資料在連線上的流動方向執行,整個過程就是一個從左向右的順序執行過程。
如果有兩個并行放置并且之間沒有任何連線的程式單元,那麼labview會把它們放到不同的線程中并行執行。
如果希望将沒有互相連線的程式部分按照一定先後順序執行的話,就可以使用順序結構(sequence structure)來實作。當程式運作的時候,會按照順序結構的幀架構一個接一個依次順序執行。
labview中有兩種順序結構:層疊式順序結構和平鋪式順序結構。平鋪式順序結構如圖3-38所示,層疊式順序結構如圖3-39所示。這兩種順序結構的功能是一樣的。不同點在于層疊式順序結構的每個幀是重疊的,在同一時刻隻能有一個幀在程式框圖上直接顯示出來,平鋪式順序結構是把所有的順序幀按照從左到右的順序展開在程式框圖上。
3.5.5 其他結構
labview還有其他更進階的執行結構,如事件結構(用來進行中斷驅動任務,如使用者界面互動)和序列結構(用于強制執行順序)。要了解這些結構的更多資訊,請參考相應的labview help主題。