新聞中心

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

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

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


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


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


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


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

上一頁(yè) 1 2 下一頁(yè)

評(píng)論


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

關(guān)閉