State machine 是身為NI LabVIEW開發者很重要的一種開發程式架構,中文叫做狀態機。利用State machine的架構分析,可以幫助開發者將程式的應用拆成不同的模塊,而且每個模塊可以加入程式邏輯導向不同其他的模塊。使用State Machine 可以增加程式的彈性,適合用在中等以上複雜的程式中。這篇會介紹如何架構一個State Machine和其好處,另外也會操作如何使用Type Define。 今天的範例程式可以在這裡下載,如果覺得文章有幫助,請不要吝嗇按下側邊的廣告唷~ 謝謝~
使用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
範例練習:
假如以下有風扇的功能需求,風扇沒有開啟循環功能時,只使用左吹的功能;開啟循環功能後左吹完後吹右邊。流程圖如下:
首先創建Case Selector-->Enum
Programming-->Enum
Enum右鍵 Edit Items
在常用的State Machine中,最常會有初始化(Initialize)、離開(Exit)這兩種狀態,所以我們將Enum中加入這兩種狀態另外再加上額外的Case1(左吹)、Case2(右吹)
最重要的是要做Type Define,這個非常重要的習慣,可以減少coding的錯誤,後面會講解。將儲存的Type Deinge Control放在主程式的附近,因為未來開程式還是需要此Control;我習慣是另外用一個資料夾存放
建議另外開一個資料夾存放,和程式VI做區隔。
做完Type Define的Enum左上角會出現黑色的小三角才是有儲存成功唷。
接著建構人機面版:
建構程式碼:
複習一下需求,循環開啟後左吹後右吹,循環未開重複左吹
初始化,將循環功能default設為False
左吹的狀態加入循環功能是否開啟,若開啟就前往右吹Case,若沒有開啟繼續執行左吹的Case。
右吹的狀態結束後往左吹的狀態
結束程序,目前沒有邏輯也沒有循環的時候(後續就有)。
這樣我們就完成簡單的State Machine架構。
不過為了顯示State Machine的好處,再稍微修改了需求
如果是改成右吹先再左吹,這樣的流程上的修改,若在Flat Sequence Structure上就會很難修改了!
但是在State Machine上只要稍微修改一下Enum的順序可以就可以了!
在來說說為什麼要做Type Define,
若是已經做過Type Define的,我們在Enum稍微做一些改變,例如Insert一個新狀態:上吹
會發現程式中每個使用到的Enum都會新增這個選項,這可是需要做Type Define才會有的唷!
今天的範例程式可以在這裡下載,如果覺得文章有幫助,請不要吝嗇按下側邊的廣告唷~ 謝謝~
另外延續這State Machine 發展出來的Queue State Machine,比起State Machine更為彈性,可以參考:LabVIEW_Queue State Machine with User Event程式架構介紹
其他相關連結:
Using a State Machine (Event Driven) Architecture
Application Design Patterns: State Machines
如果覺得文章有幫助,請不要吝嗇按下側邊的廣告唷~ 謝謝~
學習相關LabVIEW文章:
程式分享相關LabVIEW文章:
考取LabVIEW證照相關:
留言列表