新聞中心

EEPW首頁 > 測試測量 > 設(shè)計應(yīng)用 > LabVIEW程序設(shè)計模式(四)—狀態(tài)機和事件結(jié)構(gòu)的結(jié)合

LabVIEW程序設(shè)計模式(四)—狀態(tài)機和事件結(jié)構(gòu)的結(jié)合

作者: 時間:2017-01-09 來源:網(wǎng)絡(luò) 收藏
上兩節(jié)分別解決了基本狀態(tài)機的第(1~5)個問題,但是是否具備一種模式能夠綜合隊列型狀態(tài)機模式和用戶界面事件型模式的優(yōu)點呢?這樣可以同時避免基本狀態(tài)機的第(1~5)個問題。答案是肯定的,本節(jié)將介紹如何將狀態(tài)機與事件結(jié)構(gòu)結(jié)合起來形成一種新的、穩(wěn)定的模式。
狀態(tài)機模式的基本構(gòu)成元素是while循環(huán)和case結(jié)構(gòu),而事件結(jié)構(gòu)模式的基本構(gòu)成元素是while循環(huán)和event結(jié)構(gòu),因此新的模式應(yīng)該由while循環(huán)、case結(jié)構(gòu)和event結(jié)構(gòu)組成。而while循環(huán)的目的是為了保證程序的持續(xù)運行,因此必須在最外層,這樣就只剩下了圖 20所示的兩種組合方式。
在第一種方式中,每次循環(huán)的運行需要經(jīng)過一個事件結(jié)構(gòu)才能夠?qū)崿F(xiàn)case中各個分支的運行,那么到底需要多少個分支呢?一般而言不同的事件都會有不同的事件處理函數(shù)(這些函數(shù)可以在case結(jié)構(gòu)中共用),顯示這是無法滿足要求的,它從本質(zhì)上而言仍然是一種事件結(jié)構(gòu)。
在第二種方式中,程序的主體是一個狀態(tài)機結(jié)構(gòu),不同的是在某一個狀態(tài)分子中有一個事件結(jié)構(gòu)。我們可以回憶狀態(tài)機模式中的“空閑Idle”狀態(tài),這正是長時間占用CPU資源的源頭,如果在Idle中加入一個事件結(jié)構(gòu)后就有效地規(guī)避了這個問題。


圖 20 三種結(jié)構(gòu)的組合方式
因此圖 20中的第二種結(jié)構(gòu)綜合了狀態(tài)機和事件結(jié)構(gòu)的優(yōu)點,有效地克服了基本狀態(tài)機的第(1~5)個問題。此外,在【應(yīng)用2_自動販賣機】例程中,按鈕1USD、2USD和5USD的作用是相同的,唯一不同的是它們的代表的幣值不同。如果我們希望系統(tǒng)共用“幣值相加”這個功能,即當(dāng)這三個按鈕任何一個被按下后都調(diào)用同一個函數(shù)(該函數(shù)的功能是將系統(tǒng)中原來的貨幣值與新加入的幣值相加得到新的值)。這樣,需要有一種途徑把1USD、2USD和5USD代表的幣值作為參數(shù)傳遞給函數(shù)。
圖 21所示為帶參數(shù)的狀態(tài)機結(jié)構(gòu),在消息隊列的狀態(tài)機模式中,加入了一個變體型的變量作為狀態(tài)傳遞的參數(shù)。實際上,可以把紅色的部分做成子vi,不僅節(jié)省了背面板空間而且能夠進行錯誤處理。程序中應(yīng)該設(shè)置一個專門的錯誤處理狀態(tài),當(dāng)任何一個狀態(tài)運行后如果發(fā)生錯誤將直接轉(zhuǎn)到錯誤處理狀態(tài)。當(dāng)然,也可以在圖 21的基礎(chǔ)上做一些改進和變形,假定參數(shù)的數(shù)據(jù)類型為string型,這樣就把Data參數(shù)和State合并起來,中間使用特殊符號(如@)隔開。


圖 21 帶參數(shù)的狀態(tài)機結(jié)構(gòu)
【應(yīng)用4】
本節(jié)的例程將使用Multicolumn Listbox控件處理2維數(shù)組排序問題,前面板如圖 22所示。該Listbox用于顯示系統(tǒng)中的各種采集數(shù)據(jù)值,分為5列。程序的功能是當(dāng)單擊Listbox的列頭時,對數(shù)據(jù)以該列的升序/降序進行排序。單擊Stop按鈕或×按鈕則停止程序運行。


圖 22 2D數(shù)組排序_前面板
系統(tǒng)使用狀態(tài)機和事件結(jié)構(gòu)相結(jié)合的模式,如圖 23所示。程序分為8個狀態(tài),共有4類。各個狀態(tài)的功能與消息隊列型的狀態(tài)機模式類似,程序加入了錯誤處理部分。在背面板的循環(huán)中共享同一個“錯誤簇”結(jié)構(gòu)的移位寄存器,當(dāng)存在錯誤時程序?qū)簳r停止運行其它的狀態(tài)而優(yōu)先進入錯誤狀態(tài)(這里是Error分支)。


圖 23 2D數(shù)組排序_背面板
在Idle狀態(tài)中,事件結(jié)構(gòu)可以防止CPU資源的長時間占用,也可以響應(yīng)各種前面板事件,如圖 24所示。

上一頁 1 2 下一頁

評論


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

關(guān)閉