順序模式是我們最先接觸,也是最基本的一種程式設計模式, 程式按照固定的順序依次執行,結束(如圖1)
但在很多情況下,靜態的順序模式並不能滿足我們程式設計的要求,我們需要更有效地動態結構來實時改變程式的執行順序 (如圖2),在這種情況下,狀態機的引入就成了必然的結果。
- LabVIEW中的狀態機
如下圖所示,在LabVIEW中,任何一個狀態機都是由三個基本部分構成的,首先外層是一個while迴圈,同時在while迴圈中包含有一個條件結構, while迴圈用於維持狀態機的執行,條件結構用以對各個不同的狀態迚行判斷,第三個基本部分是移位暫存器,用以將下一個狀態傳遞到下一次迴圈狀態判斷中。另外在一個完整的狀態機中,我們一般還會提供初始狀態,每一個狀態的執行步驟以及下一個狀態切換程式碼等等。
除了前面提到的三個基本部分以外,狀態機的構建還有一個技巧,就是使用列舉型常量來作為狀態變數,相對於其它資料型別來說, 列舉常量表示了兩組成對的資料,一組是字串,一組是數值,兩者一一對應,在前面板上,能直觀地看到字串。
為什麼要使用列舉型資料來作為狀態變數呢,因為列舉型資料和條件結構配合使用時相當方便。第一,在條件結構的條件判斷框中,我們看到的將不是單純的數值,而是我們定義好的字串,這樣直觀的表現形式給不同狀態的管理帶來了方便,另外,我們在條件結構上通過右鍵單擊,選擇為每個值新增分支,就能夠自動地將條件結構根據列舉資料迚行展開,從而保證每個狀態的完整性。
下面是一個簡單的例子,在前面板上新增指示燈顯示現在所處狀態。從初始狀態Start開始每個1秒按順序切換到下一狀態,到達最終狀態End時結束迴圈:
- 狀態機中的狀態轉換
上面的那個例子太簡單,在實際的工程狀態機中, 很多時候會遇到一個狀態可能往多個狀態轉換的情況,在這個時候,我們能夠使用LabVIEW提供的附加的邏輯功能來實現下一個狀態的判斷。如下圖所示的例子,在狀態框圖中有一個子VI,利用該子VI(根據程式實際的需要自行編寫 )來對選擇哪一個分支為下一狀態進行判斷。條件結構的多個分支分別對應了不同的下一狀態值,根據邏輯判斷子 VI 輸出的結果,跳入不同的分支以選擇不同的狀態。
條件結構雖然解決了多個狀態選擇的問題,但從結構上來看不太直觀,管理不夠方便,我們可以把所有待選擇的狀態放入陣列中,通過邏輯判斷子 VI 輸出不同的索引值直接從陣列中索引出下一個狀態輸出到移位暫存器。