LabVIEW程序設計模式(四)—狀態(tài)機和事件結構的結合
狀態(tài)機模式的基本構成元素是while循環(huán)和case結構,而事件結構模式的基本構成元素是while循環(huán)和event結構,因此新的模式應該由while循環(huán)、case結構和event結構組成。而while循環(huán)的目的是為了保證程序的持續(xù)運行,因此必須在最外層,這樣就只剩下了圖 20所示的兩種組合方式。
在第一種方式中,每次循環(huán)的運行需要經(jīng)過一個事件結構才能夠?qū)崿F(xiàn)case中各個分支的運行,那么到底需要多少個分支呢?一般而言不同的事件都會有不同的事件處理函數(shù)(這些函數(shù)可以在case結構中共用),顯示這是無法滿足要求的,它從本質(zhì)上而言仍然是一種事件結構。
在第二種方式中,程序的主體是一個狀態(tài)機結構,不同的是在某一個狀態(tài)分子中有一個事件結構。我們可以回憶狀態(tài)機模式中的“空閑Idle”狀態(tài),這正是長時間占用CPU資源的源頭,如果在Idle中加入一個事件結構后就有效地規(guī)避了這個問題。

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

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

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

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