LabVIEW程序設(shè)計(jì)模式(三)—消息隊(duì)列型狀態(tài)機(jī)模式
- 狀態(tài)的分類不清晰。
讓我們回到程序,并給程序的狀態(tài)設(shè)置一些“書立”。如圖 4所示,系統(tǒng)共有9個(gè)有效狀態(tài)(UI Initial、Data Initial、Instr Initial、Temperature、Power、FFT、JTFA、Data Clean、Exit)。如果把這些狀態(tài)混在一起,我們需要找到某一個(gè)狀態(tài)時(shí)會(huì)比較困惑和麻煩。如同上面所述,將這些狀態(tài)分為4類并設(shè)置了4個(gè)“書立”(Initial、Acquire、Analyse、System)分隔這些狀態(tài)。在實(shí)際的狀態(tài)控制中,需要確保程序只會(huì)進(jìn)入實(shí)際的狀態(tài)中運(yùn)行而不會(huì)進(jìn)入到“書立”分支中,因此對(duì)每個(gè)“書立”加入了“-------”以示區(qū)別。

圖 4 狀態(tài)分類
盡管我們只是進(jìn)行了少量的修改,但是這的確有利于程序狀態(tài)的組織和閱讀,尤其是當(dāng)程序具有很多個(gè)狀態(tài)的時(shí)候。
- 缺乏數(shù)據(jù)共享和錯(cuò)誤處理機(jī)制。

圖 5 狀態(tài)機(jī)中的數(shù)據(jù)傳遞
圖 5使用移位寄存器進(jìn)行數(shù)據(jù)共享和傳遞,將所有的數(shù)據(jù)封裝在一個(gè)簇中并對(duì)每個(gè)數(shù)據(jù)命名,這樣在使用數(shù)據(jù)時(shí)就可以使用“Unbundle by name”或“bundle by name”。需要說明的是,即使使用一個(gè)數(shù)據(jù)需要共享,仍然希望采用簇的封裝形式,這樣當(dāng)后續(xù)需要增加擴(kuò)展數(shù)據(jù)的時(shí)候并不會(huì)影響現(xiàn)有的數(shù)據(jù)引用。
- 每一個(gè)狀態(tài)分支只能夠決定后面的一個(gè)狀態(tài),而無(wú)法決定一個(gè)狀態(tài)序列(多個(gè)狀態(tài))。
顧名思義,這種模式就像銀行辦理業(yè)務(wù)時(shí)排隊(duì)一樣采用隊(duì)列的方式。當(dāng)儲(chǔ)戶進(jìn)入銀行時(shí),首先到叫號(hào)機(jī)處領(lǐng)取號(hào)碼進(jìn)行排隊(duì)(進(jìn)入隊(duì)列)并等待。然后,當(dāng)前面的儲(chǔ)戶辦理完業(yè)務(wù)后就可以到相應(yīng)的窗口辦理業(yè)務(wù)(退出隊(duì)列)。事實(shí)上,這種方式在現(xiàn)代生活中隨處可見。
在LabVIEW中至少有兩種實(shí)現(xiàn)消息隊(duì)列的方法。如圖 6所示。前者使用數(shù)組函數(shù)實(shí)現(xiàn)隊(duì)列元素的入列和出列;后者使用隊(duì)列函數(shù)實(shí)現(xiàn)隊(duì)列元素的入列和出列。二者都能夠?qū)崿F(xiàn)隊(duì)列的有序操作和狀態(tài)的序列變化。

圖 6 消息隊(duì)列型狀態(tài)機(jī)模式
本節(jié)解決了基本狀態(tài)機(jī)模式中的(1)~(3)個(gè)問題,為了更好地比較和使用這些特點(diǎn),特使用一個(gè)實(shí)例說明消息隊(duì)列型狀態(tài)機(jī)的使用過程。
【應(yīng)用2】
本例要模擬一個(gè)自動(dòng)販賣機(jī)的工作過程。它的一次正常交易過程為:投幣→選擇需要購(gòu)買的商品→找?guī)?,?dāng)幣值不足或商品已經(jīng)銷售完畢時(shí)則無(wú)法購(gòu)買。
程序的前面板如圖 7所示。在販賣機(jī)的左上側(cè)有4個(gè)按鈕。- 1USD:?jiǎn)螕魰r(shí)表示投入1美元的貨幣,2USD和5USD類同;
- Change Back:表示找零,也就是將目前剩余的貨幣退還給用戶。
本例將使用本節(jié)介紹的消息隊(duì)列狀態(tài)機(jī)模式解決這個(gè)應(yīng)用(也可以使用其它的設(shè)計(jì)模式)。系統(tǒng)的功能并不復(fù)雜,關(guān)鍵是要判斷販賣機(jī)中的剩余錢數(shù)和剩余的貨物數(shù)以決定交易是否成功。

圖 7 自動(dòng)販賣機(jī)前面板
程序背面板如圖 8所示。系統(tǒng)分為5個(gè)狀態(tài),并分為2大類。
評(píng)論