新聞中心

EEPW首頁 > 測試測量 > 設(shè)計應(yīng)用 > LabVIEW程序設(shè)計模式(三)—消息隊列型狀態(tài)機(jī)模式

LabVIEW程序設(shè)計模式(三)—消息隊列型狀態(tài)機(jī)模式

作者: 時間:2017-01-09 來源:網(wǎng)絡(luò) 收藏
針對基本狀態(tài)機(jī)模式的第(1~3)個問題,需要對模式進(jìn)行改進(jìn)。本節(jié)將一一分析這些問題對應(yīng)的解決方案,并最終形成一種新的狀態(tài)機(jī)模式——消息隊列型狀態(tài)機(jī)模式。
  1. 狀態(tài)的分類不清晰。
這是一個涉及各個狀態(tài)分類管理的問題,是一個組織問題。我們可以做一個類比,在一個書桌上有許多種類的書籍(通信、計算機(jī)、機(jī)械、法律等),這些書都擺放在書桌上很整齊。但是我們在尋找一本書時并不會覺得很迅速和隨意,因為書籍的擺放是無序的,每次尋找書籍我們不得不從第一本開始瀏覽直至找到我們想要的書籍?;蛟S可以做一些改變,我們設(shè)置一些書立,將不同種類的書使用書立分開。并且在書立上標(biāo)明這些書籍表示的種類。這樣我們在尋找某一種書籍時就不需要從第一本書開始尋找了,只需要找到對應(yīng)的書立,在這些書立中尋找即可。
讓我們回到程序,并給程序的狀態(tài)設(shè)置一些“書立”。如圖 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類并設(shè)置了4個“書立”(Initial、Acquire、Analyse、System)分隔這些狀態(tài)。在實際的狀態(tài)控制中,需要確保程序只會進(jìn)入實際的狀態(tài)中運行而不會進(jìn)入到“書立”分支中,因此對每個“書立”加入了“-------”以示區(qū)別。


圖 4 狀態(tài)分類
盡管我們只是進(jìn)行了少量的修改,但是這的確有利于程序狀態(tài)的組織和閱讀,尤其是當(dāng)程序具有很多個狀態(tài)的時候。
  1. 缺乏數(shù)據(jù)共享和錯誤處理機(jī)制。
在層疊式的順序結(jié)構(gòu)中,數(shù)據(jù)在幀之間的傳遞是靠“順序局域變量”實現(xiàn)的。那么如果在case結(jié)構(gòu)中如何傳遞不同分支的數(shù)據(jù)呢?這個問題似乎很容易解決,使用局域變量,全局變量或共享變量都能夠解決,但是這些并不是最優(yōu)的解決方案。因為上述的方式會明顯系統(tǒng)運行的內(nèi)存空間和時間。由于狀態(tài)機(jī)的基本組成元素除了case結(jié)構(gòu)之外還有循環(huán),因此可以使用移位寄存器來傳遞數(shù)據(jù)。如圖 5所示。


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


圖 6 消息隊列型狀態(tài)機(jī)模式
本節(jié)解決了基本狀態(tài)機(jī)模式中的(1)~(3)個問題,為了更好地比較和使用這些特點,特使用一個實例說明消息隊列型狀態(tài)機(jī)的使用過程。
【應(yīng)用2】
本例要模擬一個自動販賣機(jī)的工作過程。它的一次正常交易過程為:投幣→選擇需要購買的商品→找?guī)?,?dāng)幣值不足或商品已經(jīng)銷售完畢時則無法購買。
程序的前面板如圖 7所示。在販賣機(jī)的左上側(cè)有4個按鈕。
  1. 1USD:單擊時表示投入1美元的貨幣,2USD和5USD類同;
  2. Change Back:表示找零,也就是將目前剩余的貨幣退還給用戶。
程序的右側(cè)是5個按鈕,表示5種不同類別的可樂(這里均使用了可口可樂的圖標(biāo)),每種可樂的價格均是1美元??蓸返南旅鏀?shù)字表示販賣機(jī)中剩余的該商品的數(shù)量,初始為每種20瓶。Current money顯示販賣機(jī)中剩余的貨幣數(shù),你可以繼續(xù)購買可樂或者選擇退回。單擊Stop按鈕將退出應(yīng)用程序。
本例將使用本節(jié)介紹的消息隊列狀態(tài)機(jī)模式解決這個應(yīng)用(也可以使用其它的設(shè)計模式)。系統(tǒng)的功能并不復(fù)雜,關(guān)鍵是要判斷販賣機(jī)中的剩余錢數(shù)和剩余的貨物數(shù)以決定交易是否成功。


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

上一頁 1 2 下一頁

評論


技術(shù)專區(qū)

關(guān)閉