LabVIEW程序設計模式(三)—消息隊列型狀態(tài)機模式
- 狀態(tài)的分類不清晰。
讓我們回到程序,并給程序的狀態(tài)設置一些“書立”。如圖 4所示,系統(tǒng)共有9個有效狀態(tài)(UI Initial、Data Initial、Instr Initial、Temperature、Power、FFT、JTFA、Data Clean、Exit)。如果把這些狀態(tài)混在一起,我們需要找到某一個狀態(tài)時會比較困惑和麻煩。如同上面所述,將這些狀態(tài)分為4類并設置了4個“書立”(Initial、Acquire、Analyse、System)分隔這些狀態(tài)。在實際的狀態(tài)控制中,需要確保程序只會進入實際的狀態(tài)中運行而不會進入到“書立”分支中,因此對每個“書立”加入了“-------”以示區(qū)別。
圖 4 狀態(tài)分類
盡管我們只是進行了少量的修改,但是這的確有利于程序狀態(tài)的組織和閱讀,尤其是當程序具有很多個狀態(tài)的時候。
- 缺乏數(shù)據(jù)共享和錯誤處理機制。
圖 5 狀態(tài)機中的數(shù)據(jù)傳遞
圖 5使用移位寄存器進行數(shù)據(jù)共享和傳遞,將所有的數(shù)據(jù)封裝在一個簇中并對每個數(shù)據(jù)命名,這樣在使用數(shù)據(jù)時就可以使用“Unbundle by name”或“bundle by name”。需要說明的是,即使使用一個數(shù)據(jù)需要共享,仍然希望采用簇的封裝形式,這樣當后續(xù)需要增加擴展數(shù)據(jù)的時候并不會影響現(xiàn)有的數(shù)據(jù)引用。
- 每一個狀態(tài)分支只能夠決定后面的一個狀態(tài),而無法決定一個狀態(tài)序列(多個狀態(tài))。
顧名思義,這種模式就像銀行辦理業(yè)務時排隊一樣采用隊列的方式。當儲戶進入銀行時,首先到叫號機處領取號碼進行排隊(進入隊列)并等待。然后,當前面的儲戶辦理完業(yè)務后就可以到相應的窗口辦理業(yè)務(退出隊列)。事實上,這種方式在現(xiàn)代生活中隨處可見。
在LabVIEW中至少有兩種實現(xiàn)消息隊列的方法。如圖 6所示。前者使用數(shù)組函數(shù)實現(xiàn)隊列元素的入列和出列;后者使用隊列函數(shù)實現(xiàn)隊列元素的入列和出列。二者都能夠?qū)崿F(xiàn)隊列的有序操作和狀態(tài)的序列變化。
圖 6 消息隊列型狀態(tài)機模式
本節(jié)解決了基本狀態(tài)機模式中的(1)~(3)個問題,為了更好地比較和使用這些特點,特使用一個實例說明消息隊列型狀態(tài)機的使用過程。
【應用2】
本例要模擬一個自動販賣機的工作過程。它的一次正常交易過程為:投幣→選擇需要購買的商品→找?guī)牛攷胖挡蛔慊蛏唐芬呀?jīng)銷售完畢時則無法購買。
程序的前面板如圖 7所示。在販賣機的左上側(cè)有4個按鈕。- 1USD:單擊時表示投入1美元的貨幣,2USD和5USD類同;
- Change Back:表示找零,也就是將目前剩余的貨幣退還給用戶。
本例將使用本節(jié)介紹的消息隊列狀態(tài)機模式解決這個應用(也可以使用其它的設計模式)。系統(tǒng)的功能并不復雜,關鍵是要判斷販賣機中的剩余錢數(shù)和剩余的貨物數(shù)以決定交易是否成功。
圖 7 自動販賣機前面板
程序背面板如圖 8所示。系統(tǒng)分為5個狀態(tài),并分為2大類。
評論