這篇延續上一篇的State machine程式架構介紹(LabVIEW_State Machine(狀態機)程式架構介紹),State machine眾所皆知是LabVIEW初學中很重要的程式架構之一,但是他卻有些限制,最主要的就是他每次都只能輪轉一個case。在中小型複雜的程式需求中,會慢慢發現state machine在此彈性上的不足,使用Queue+State machine的搭配,可以一次增加或減少數個case到Queue的buffer中,這樣序列的程序堆疊,可以讓程式活用度更高。
這篇的進階為LabVIEW_Queued Enum Handler + Variant 架構介紹範例分享,介紹並分享一個Queue搭配Variant的用法,讓架構更為彈性,若這篇已經學習會了就可以以學習搭配Variant使用。
如果覺得文章有幫助,請不要吝嗇按下側邊的廣告唷~ 謝謝~
和State Machine一樣,Queue State Machine 的重要元素有: While loop、Shift Register、Case Satement、Case Selector
另外加上:
- Queue
- Concumer loop
比起原本經典的State machine架構,Queue State Machine,更強調人機的互動性,強調人機觸發事件。而事件產生Queue堆疊功能。
這裡找到一個由 Wes P 在NI的官方論壇中發表的一篇文章Queued State Machine with User Input,有一個Queue State Machine的程式給大家參考程式如何撰寫,建議直接下載這個範例,實際跑一次比較懂接下來解釋的項目。
程式碼:
上面的Producer Loop主要負責Event的事件觸發,觸發後將Queue傳到下方的Consumer Loop,而下面的Consumer LOOP則是依照先進先出(FIFO)的原則,解析Queue的動作項目。
Queue的FIFO先進先出原則,如下圖,Enqueue時程序從左邊進入佇列,Dequeue時,從右邊解析佇列。所以先進入的"1"佇列會先被Dequeue出來。
在這範例中,有幾個要注意的地方提醒一下:
為了讓程式能及時停下,這裡作者使用Flush讓程式強制清掉Queue中的buffer;但是在較為複雜的程式中,Enqueue的地方更多,要先確保Queue中沒有Buffer才能增加shutdown的Queue,確保除了Shutdown的其他case都已經被清除掉了。
其他參考資料:
- https://forums.ni.com/t5/Example-Program-Drafts/Queued-State-Machine-with-User-Input/ta-p/3497450
- https://forums.ni.com/t5/LabVIEW/Queued-State-Machine/td-p/1104479
- Using a State Machine (Event Driven) Architecture
- Tutorial: State Machines
- Application Design Patterns: State Machines
- LabVIEW Pro討論
如果覺得文章有幫助,請不要吝嗇按下側邊的廣告唷~ 謝謝~
學習相關LabVIEW文章:
程式分享相關LabVIEW文章:
考取LabVIEW證照相關:
留言列表