State machine 是身為NI LabVIEW開發者很重要的一種開發程式架構,中文叫做狀態機。利用State machine的架構分析,可以幫助開發者將程式的應用拆成不同的模塊,而且每個模塊可以加入程式邏輯導向不同其他的模塊。使用State Machine 可以增加程式的彈性,適合用在中等以上複雜的程式中。這篇會介紹如何架構一個State Machine和其好處,另外也會操作如何使用Type Define。 今天的範例程式可以在這裡下載,如果覺得文章有幫助,請不要吝嗇按下側邊的廣告唷~ 謝謝~![](//s.pixfs.net/f.pixnet.net/images/emotions/thumbs_up.gif)
![](https://pic.pimg.tw/a01832851/1522465858-1577923343_n.png)
使用State machine的優點:
- 搭配Shift register使用可將資料在不同case間傳遞使用
- 每一個Case(程序)都能決定程式的停止條件
- 可以輕易的增價或減少不同的狀態(case)
綜合以上優點不難看出State machine的優點在於彈性,推薦適合在中等以上複雜的程式來使用。
State machine使用上有一個要點,就是Case的分配,這裡給幾個Case的分配建議,
- 常常被呼叫到的功能分成一個Case-->模組概念,需要此功能時,使用enum"輪轉"使用。
- 參照功能需求分配,將功能拆成不同的case組裝。
- 每個流程圖上的分歧點,都有自己的case做邏輯判斷
對初學者來說,分接拆成不同case會是使用上很困難的部分,建議事先將需求用流程圖畫出,能夠幫助理解需求和程式的對應關係。
另外一個State machine 使用上的要點就是要使用"Type Define"的Enum,
有讀過我其他文章的人都知道,我不斷的提醒初學LabVIEW的人需要養成些好習慣( LabVIEW_初學者學習建議 、學習心得分享 )
其中一個很重要的好習慣就是使用Type Define來定義清楚變數,
使用Type Define最大的優點就是它會自動的自我更新最新的狀態,只需更新一個,其他全部程式呼叫到的,也都會有所更新。
State machine最大的元素就是:
- While Loop
- Shift Register
- Case Statement
- Case Selector -->建議使用Enum,而且是必須用Type Define的Enum
![](https://pic.pimg.tw/a01832851/1522466689-148637939_n.png)
範例練習:
假如以下有風扇的功能需求,風扇沒有開啟循環功能時,只使用左吹的功能;開啟循環功能後左吹完後吹右邊。流程圖如下:
![](https://pic.pimg.tw/a01832851/1522468443-3938712365.png)
首先創建Case Selector-->Enum
Programming-->Enum
![](https://pic.pimg.tw/a01832851/1522466786-3001877887.png)
Enum右鍵 Edit Items
![](https://pic.pimg.tw/a01832851/1522466858-1621756942.png)
在常用的State Machine中,最常會有初始化(Initialize)、離開(Exit)這兩種狀態,所以我們將Enum中加入這兩種狀態另外再加上額外的Case1(左吹)、Case2(右吹)
![](https://pic.pimg.tw/a01832851/1522468521-2467948532.png)
最重要的是要做Type Define,這個非常重要的習慣,可以減少coding的錯誤,後面會講解。將儲存的Type Deinge Control放在主程式的附近,因為未來開程式還是需要此Control;我習慣是另外用一個資料夾存放
![](https://pic.pimg.tw/a01832851/1522467314-2159263099.png)
建議另外開一個資料夾存放,和程式VI做區隔。
![](https://pic.pimg.tw/a01832851/1522467518-1902753888.png)
做完Type Define的Enum左上角會出現黑色的小三角才是有儲存成功唷。
![](https://pic.pimg.tw/a01832851/1522473726-1820693744.png)
接著建構人機面版:
![](https://pic.pimg.tw/a01832851/1522468606-25833072.png)
建構程式碼:
複習一下需求,循環開啟後左吹後右吹,循環未開重複左吹
![](https://pic.pimg.tw/a01832851/1522468443-3938712365.png)
初始化,將循環功能default設為False
![](https://pic.pimg.tw/a01832851/1522468763-3282388190.png)
左吹的狀態加入循環功能是否開啟,若開啟就前往右吹Case,若沒有開啟繼續執行左吹的Case。
![](https://pic.pimg.tw/a01832851/1522468818-2268289863.png)
右吹的狀態結束後往左吹的狀態
![](https://pic.pimg.tw/a01832851/1522468938-3655408123.png)
結束程序,目前沒有邏輯也沒有循環的時候(後續就有)。
![](https://pic.pimg.tw/a01832851/1522468986-1964725176.png)
這樣我們就完成簡單的State Machine架構。
不過為了顯示State Machine的好處,再稍微修改了需求
如果是改成右吹先再左吹,這樣的流程上的修改,若在Flat Sequence Structure上就會很難修改了!
但是在State Machine上只要稍微修改一下Enum的順序可以就可以了!
![](https://pic.pimg.tw/a01832851/1522472944-458594967_n.png)
![](https://pic.pimg.tw/a01832851/1522472960-2072493514.png)
在來說說為什麼要做Type Define,
若是已經做過Type Define的,我們在Enum稍微做一些改變,例如Insert一個新狀態:上吹
![](https://pic.pimg.tw/a01832851/1522473097-942605163.png)
會發現程式中每個使用到的Enum都會新增這個選項,這可是需要做Type Define才會有的唷!
![](https://pic.pimg.tw/a01832851/1522473180-2839555994.png)
今天的範例程式可以在這裡下載,如果覺得文章有幫助,請不要吝嗇按下側邊的廣告唷~ 謝謝~![](//s.pixfs.net/f.pixnet.net/images/emotions/thumbs_up.gif)
另外延續這State Machine 發展出來的Queue State Machine,比起State Machine更為彈性,可以參考:LabVIEW_Queue State Machine with User Event程式架構介紹
其他相關連結:
Using a State Machine (Event Driven) Architecture
Tutorial: State Machines
Application Design Patterns: State Machines
LabVIEW Pro討論
如果覺得文章有幫助,請不要吝嗇按下側邊的廣告唷~ 謝謝~
學習相關LabVIEW文章:
進階程式學習
基礎程式學習
專題學習_LVOOP
專題學習_動態載入
程式分享相關LabVIEW文章:
基礎程式分享
進階程式分享
股票程式分享
考取LabVIEW證照相關:
CLAD
CLD
CLA準備、CLA考題分析