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的分配建議

  1. 常常被呼叫到的功能分成一個Case-->模組概念,需要此功能時,使用enum"輪轉"使用。
  2. 參照功能需求分配將功能拆成不同的case組裝
  3. 每個流程圖上的分歧點,都有自己的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

Tutorial: State Machines

Application Design Patterns: State Machines

LabVIEW Pro討論

 

如果覺得文章有幫助,請不要吝嗇按下側邊的廣告唷~ 謝謝~

 

學習相關LabVIEW文章:

進階程式學習

基礎程式學習

專題學習_LVOOP

專題學習_動態載入

程式分享相關LabVIEW文章:

基礎程式分享

進階程式分享

股票程式分享

考取LabVIEW證照相關:

CLAD

CLD

CLA準備CLA考題分析

arrow
arrow

    安伯伯 發表在 痞客邦 留言(1) 人氣()