<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

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

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

          作者: 時(shí)間:2017-01-09 來源:網(wǎng)絡(luò) 收藏
          針對(duì)基本狀態(tài)機(jī)模式的第(1~3)個(gè)問題,需要對(duì)模式進(jìn)行改進(jìn)。本節(jié)將一一分析這些問題對(duì)應(yīng)的解決方案,并最終形成一種新的狀態(tài)機(jī)模式——消息隊(duì)列型狀態(tài)機(jī)模式。
          1. 狀態(tài)的分類不清晰。
          這是一個(gè)涉及各個(gè)狀態(tài)分類管理的問題,是一個(gè)組織問題。我們可以做一個(gè)類比,在一個(gè)書桌上有許多種類的書籍(通信、計(jì)算機(jī)、機(jī)械、法律等),這些書都擺放在書桌上很整齊。但是我們?cè)趯ふ乙槐緯鴷r(shí)并不會(huì)覺得很迅速和隨意,因?yàn)闀臄[放是無序的,每次尋找書籍我們不得不從第一本開始瀏覽直至找到我們想要的書籍?;蛟S可以做一些改變,我們?cè)O(shè)置一些書立,將不同種類的書使用書立分開。并且在書立上標(biāo)明這些書籍表示的種類。這樣我們?cè)趯ふ夷骋环N書籍時(shí)就不需要從第一本書開始尋找了,只需要找到對(duì)應(yīng)的書立,在這些書立中尋找即可。
          讓我們回到程序,并給程序的狀態(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í)候。
          1. 缺乏數(shù)據(jù)共享和錯(cuò)誤處理機(jī)制。
          在層疊式的順序結(jié)構(gòu)中,數(shù)據(jù)在幀之間的傳遞是靠“順序局域變量”實(shí)現(xiàn)的。那么如果在case結(jié)構(gòu)中如何傳遞不同分支的數(shù)據(jù)呢?這個(gè)問題似乎很容易解決,使用局域變量,全局變量或共享變量都能夠解決,但是這些并不是最優(yōu)的解決方案。因?yàn)樯鲜龅姆绞綍?huì)明顯系統(tǒng)運(yùn)行的內(nèi)存空間和時(shí)間。由于狀態(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ù)封裝在一個(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ù)引用。
          1. 每一個(gè)狀態(tài)分支只能夠決定后面的一個(gè)狀態(tài),而無法決定一個(gè)狀態(tài)序列(多個(gè)狀態(tài))。
          在基本狀態(tài)機(jī)中之所以存在這個(gè)問題是因?yàn)闋顟B(tài)的傳遞使用的是Scalar(標(biāo)量)形式,如果需要傳遞一個(gè)狀態(tài)序列,很明顯可以使用隊(duì)列或數(shù)組進(jìn)行狀態(tài)的傳遞。在LabVIEW程序設(shè)計(jì)模式中將這種具備處理狀態(tài)序列的狀態(tài)機(jī)稱為“消息隊(duì)列型狀態(tài)機(jī)”,它是在基本狀態(tài)機(jī)基礎(chǔ)上的改進(jìn)。
          顧名思義,這種模式就像銀行辦理業(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ī)的工作過程。它的一次正常交易過程為:投幣→選擇需要購買的商品→找?guī)牛?dāng)幣值不足或商品已經(jīng)銷售完畢時(shí)則無法購買。
          程序的前面板如圖 7所示。在販賣機(jī)的左上側(cè)有4個(gè)按鈕。
          1. 1USD:單擊時(shí)表示投入1美元的貨幣,2USD和5USD類同;
          2. Change Back:表示找零,也就是將目前剩余的貨幣退還給用戶。
          程序的右側(cè)是5個(gè)按鈕,表示5種不同類別的可樂(這里均使用了可口可樂的圖標(biāo)),每種可樂的價(jià)格均是1美元。可樂的下面數(shù)字表示販賣機(jī)中剩余的該商品的數(shù)量,初始為每種20瓶。Current money顯示販賣機(jī)中剩余的貨幣數(shù),你可以繼續(xù)購買可樂或者選擇退回。單擊Stop按鈕將退出應(yīng)用程序。
          本例將使用本節(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大類。

          上一頁 1 2 下一頁

          評(píng)論


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

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();