Labview程序設(shè)計(jì)模式_第1頁
Labview程序設(shè)計(jì)模式_第2頁
Labview程序設(shè)計(jì)模式_第3頁
已閱讀5頁,還剩19頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

1、 例如我們在 LabVIEW 中構(gòu)建一個(gè)用戶界面型程序時(shí),往往首先在背面板中加入一個(gè)大的 while 循環(huán)以使程序持續(xù)運(yùn)行。如果需要響應(yīng)用戶界面事件則還需要加入一個(gè)Event 事件結(jié) 構(gòu)。那么我們是否曾經(jīng)考慮過以下的這些問題:(1) 應(yīng)用中是否存在并行響應(yīng)的情況?如在持續(xù)的數(shù)據(jù)采集過程中,是否需要同時(shí)響 (4) 同一個(gè)循環(huán)中采用哪種方式進(jìn)行數(shù)據(jù)交換?是局域變量、全局變量、共享變量還 (6) 如果程序運(yùn)行過程中,發(fā)生系統(tǒng)錯(cuò)誤或者硬件通訊錯(cuò)誤,是否會停止運(yùn)行?待錯(cuò) (7) 如何組織程序中的核心數(shù)據(jù)結(jié)構(gòu)?是否需要采用面向?qū)ο蟪绦蛟O(shè)計(jì)? (9) 如何處理程序運(yùn)行中的斷電情況?重新啟動時(shí)的繼續(xù)運(yùn)行?數(shù)據(jù)

2、的最低丟失? 但是,如果使用 LabVIEW 開發(fā)一個(gè)典型應(yīng)用的程序卻無法回避這些問題。因此,有必要對 針對這些共性研究哪種結(jié)構(gòu)更加適合于應(yīng)用。這些結(jié)論綜合起來就形成了程序設(shè)計(jì)的模式。 的特有的程序設(shè)計(jì)模式。 分的 LabVIEW 主程序。最基本的狀態(tài)機(jī)結(jié)構(gòu)如圖1 所示。狀態(tài)是狀態(tài)機(jī)運(yùn)行的經(jīng)脈,在開 始使用狀態(tài)機(jī)模式撰寫程序時(shí)需要將應(yīng)用分為若干個(gè)狀態(tài)。下面以圖中的應(yīng)用為例說明基本 前面板具有3 個(gè)按鈕(Control)和1 個(gè)波形顯示控件Chart(Indicator功能分別是: 4) Chart:用于顯示獲取的隨機(jī)數(shù)。這是一個(gè)非常簡單的應(yīng)用,但是具有一定的代表性。根據(jù)要求,該應(yīng)用至少包含以下

3、5 2) Idle:空閑狀態(tài),用于響應(yīng)各種用戶界面操作;3) acquire:采集狀態(tài),用于持續(xù)模擬采集數(shù)據(jù);4) about:用于彈出關(guān)于和幫助對話框;5) stop:停止?fàn)顟B(tài),退出循環(huán)并中止程序。 圖1 基本的狀態(tài)機(jī)結(jié)構(gòu)背面板 態(tài);如果dialog 被按下,則進(jìn)入about 狀態(tài);如果stop 被按下,則進(jìn)入stop 狀態(tài);否則如 果沒有任何按鈕被按下,則仍然進(jìn)入當(dāng)前的Idle 狀態(tài)繼續(xù)檢測。在acquire 狀態(tài)中,為了保證程序的重復(fù)采集使得下一個(gè)狀態(tài)仍然為acquire,但是這樣 stop 被按下,則不再進(jìn)入acquire 狀態(tài)而直接進(jìn)入stop 狀態(tài)。 態(tài)圖的方式顯示清晰明了)和擴(kuò)展

4、性(日后只需要擴(kuò)展?fàn)顟B(tài)即可擴(kuò)展相應(yīng)的功能)。 如圖2 所示,但是它們實(shí)質(zhì)上是不同的。主要體現(xiàn)為以下7 點(diǎn):針對基本狀態(tài)機(jī)模式的第(13)個(gè)問題,需要對模式進(jìn)行改進(jìn)。本節(jié)將一一分析這些 問題對應(yīng)的解決方案,并最終形成一種新的狀態(tài)機(jī)模式消息隊(duì)列型狀態(tài)機(jī)模式。 個(gè)書桌上有許多種類的書籍(通信、計(jì)算機(jī)、機(jī)械、法律等),這些書都擺放在書桌上很整 些書立中尋找即可。 如果把這些狀態(tài)混在一起,我們需要找到某一個(gè)狀態(tài)時(shí)會比較困惑和麻煩。如同上面所述, 態(tài)。在實(shí)際的狀態(tài)控制中,需要確保程序只會進(jìn)入實(shí)際的狀態(tài)中運(yùn)行而不會進(jìn)入到“書立”分支中,因此對每個(gè)“書立”加入了“-”以示區(qū)別。 程序具有很多個(gè)狀態(tài)的時(shí)候。(2

5、) 缺乏數(shù)據(jù)共享和錯(cuò)誤處理機(jī)制。 在case 結(jié)構(gòu)中如何傳遞不同分支的數(shù)據(jù)呢?這個(gè)問題似乎很容易解決,使用局域變量,全 統(tǒng)運(yùn)行的內(nèi)存空間和時(shí)間。由于狀態(tài)機(jī)的基本組成元素除了case 結(jié)構(gòu)之外還有循環(huán),因此 可以使用移位寄存器來傳遞數(shù)據(jù)。如圖5 所示。 圖5 使用移位寄存器進(jìn)行數(shù)據(jù)共享和傳遞,將所有的數(shù)據(jù)封裝在一個(gè)簇中并對每個(gè)數(shù)據(jù) 數(shù)據(jù)的時(shí)候并不會影響現(xiàn)有的數(shù)據(jù)引用。(3) 每一個(gè)狀態(tài)分支只能夠決定后面的一個(gè)狀態(tài),而無法決定一個(gè)狀態(tài)序列(多個(gè)狀 如果需要傳遞一個(gè)狀態(tài)序列,很明顯可以使用隊(duì)列或數(shù)組進(jìn)行狀態(tài)的傳遞。在LabVIEW 程 態(tài)機(jī)基礎(chǔ)上的改進(jìn)。 首先到叫號機(jī)處領(lǐng)取號碼進(jìn)行排隊(duì)(進(jìn)入隊(duì)列)并

6、等待。然后,當(dāng)前面的儲戶辦理完業(yè)務(wù)后 就可以到相應(yīng)的窗口辦理業(yè)務(wù)(退出隊(duì)列)。事實(shí)上,這種方式在現(xiàn)代生活中隨處可見。在 LabVIEW 中至少有兩種實(shí)現(xiàn)消息隊(duì)列的方法。如圖6 所示。前者使用數(shù)組函數(shù)實(shí)現(xiàn) 列的有序操作和狀態(tài)的序列變化。 特使用一個(gè)實(shí)例說明消息隊(duì)列型狀態(tài)機(jī)的使用過程。 買的商品找?guī)?,?dāng)幣值不足或商品已經(jīng)銷售完畢時(shí)則無法購買。程序的前面板如圖7 所示。在販賣機(jī)的左上側(cè)有4 個(gè)按鈕。 (2) Change Back:表示找零,也就是將目前剩余的貨幣退還給用戶。 ), 單擊Stop 按鈕將退出應(yīng)用程序。本例將使用本節(jié)介紹的消息隊(duì)列狀態(tài)機(jī)模式解決這個(gè)應(yīng)用(也可以使用其它的設(shè)計(jì)模 式)。系

7、統(tǒng)的功能并不復(fù)雜,關(guān)鍵是要判斷販賣機(jī)中的剩余錢數(shù)和剩余的貨物數(shù)以決定交易 程序背面板如圖8 所示。系統(tǒng)分為5 個(gè)狀態(tài),并分為2 大類。 a) Idle(Default空閑狀態(tài)。b) CheckMoney:販賣機(jī)中的剩余錢數(shù)和剩余的貨物數(shù)以決定交易是否成功。 統(tǒng)采用數(shù)組函數(shù)處理消息隊(duì)列。 在UI Initial 中,系統(tǒng)給標(biāo)題欄和說明欄賦值,并將前面板的商品設(shè)置為不可購買狀態(tài), 因?yàn)樵诔跏蓟瘯r(shí)還沒有完成投幣動作。如圖9 所示。 存器傳遞以便于在各個(gè)case 分支中共享和使用,如圖10 所示。 CheckMoney 分支主要是為了防止不合法的交易(如投入的幣值不足或商品數(shù)量不足 當(dāng)程序運(yùn)行到Exi

8、t 分支時(shí),將停止循環(huán)并退出程序,如圖12 所示。 Idle 分支用來監(jiān)控前面板各個(gè)按鈕控件的變化并執(zhí)行相應(yīng)的狀態(tài)。該分支比較復(fù)雜,當(dāng) 檢測到第0 個(gè)按鈕被按下時(shí)(即1USD 按鈕販賣機(jī)中的貨幣值應(yīng)該加一,同時(shí)需要判斷 這里不再重復(fù)解釋。 應(yīng)用程序時(shí)也更加地健壯,代碼也易于維護(hù)和查看。針對基本狀態(tài)機(jī)模式的第(45)個(gè)問題,需要對模式進(jìn)行改進(jìn)。本節(jié)將一一分析這些 問題對應(yīng)的解決方案,并最終形成一種新的狀態(tài)機(jī)模式用戶界面事件模式。 (2) 無法響應(yīng)更多的前面板事件。 中提供的事件結(jié)構(gòu)(Event Structure)能夠讓我們非常便捷地處理這兩類問題。在 LabVIEW 中事件結(jié)構(gòu)的使用并不是一件

9、難事,根據(jù)事件的發(fā)出源,事件可以抽象地 事件結(jié)構(gòu)的使用方法。圖14 所示的結(jié)構(gòu)稱為用戶界面事件模式,它能夠很便捷地響應(yīng)各種事件并且不占用CPU 的資源,這是由LabVIEW 中事件結(jié)構(gòu)本身的特性決定的。 和橢圓(oval一次完成的繪畫過程是:在畫布上單擊鼠標(biāo)開始繪制按住鼠標(biāo)的同時(shí)在 畫布上拖動鼠標(biāo)在畫布上放開鼠標(biāo)結(jié)束繪制。程序的前面板如圖15 所示,由上下兩大部分組成。上面用于選擇需要畫圖的樣式,下面是畫布,右上方的X 表示程序的結(jié)束。 決的,只能通過事件結(jié)構(gòu)。因此本例將使用用戶界面事件模式實(shí)現(xiàn)上述的畫圖板功能。程序的背面板如圖16 所示。共有4 個(gè)事件。(1) Panel Close?:響應(yīng)

10、前面板的X 動作,這是一個(gè)過濾性事件,當(dāng)事件發(fā)生時(shí)并不真 正關(guān)閉前面板而只是停止程序的運(yùn)行。 (4) Picture :表示繪畫的結(jié)束,此時(shí)一定要加入Mouse 從這個(gè)步驟開始。事件分支左側(cè)的 Button 參數(shù)表示單擊鼠標(biāo)的鍵位,只有在單擊鼠標(biāo)左鍵 函數(shù)可以在當(dāng)前的位置上畫一個(gè)點(diǎn)并且將畫筆移動到當(dāng)前位置。從圖中可以看出系統(tǒng)定義了4 個(gè)移位寄存器變量以實(shí)現(xiàn)不同事件分支的共享,它們的含 (1) 表示當(dāng)前畫布中的圖像,事實(shí)上就是前面板picture 中的內(nèi)容。因?yàn)槊看萎媹D時(shí)都 是在當(dāng)前畫布上圖像進(jìn)行疊加,所以需要使用移位寄存器以避免過多地局域變量。(2) 表示開始繪制時(shí)的鼠標(biāo)位置,也就是Mouse

11、 Down 在畫布上的相對位置,繪制的 (3) 表示是否開始了繪制。前面提過每次的繪制過程都是從Mouse Down 開始的,如 果沒有這個(gè)動作,那么在鼠標(biāo)在畫布上的移動是無效的。(4) 表示開始繪制時(shí)的圖像,這個(gè)變量與(1)是不一樣的。它表示在Mouse Down 時(shí)畫 布上的圖像,而不是畫布中的實(shí)時(shí)圖像。 Picture 事件如圖18 所示,該事件是繪圖的過程中,因此移位寄存器(3) 的值必須是true??梢愿鶕?jù)不同的畫圖類型使用相應(yīng)的函數(shù)進(jìn)行繪圖,如畫Line 時(shí),只需 要把當(dāng)前鼠標(biāo)的位置作為Line 的終點(diǎn)。 Picture 事件如圖19 所示,該事件表示繪制的結(jié)束,因此只 需要把移位

12、寄存器(3)的值設(shè)置為false 即可。 多時(shí)往往需要使用大量的移位寄存器,因?yàn)榻ㄗh使用cluster 的形式將各個(gè)變量有序地組織 列型狀態(tài)機(jī)模式和用戶界面事件型模式的優(yōu)點(diǎn)呢?這樣可以同時(shí)避免基本狀態(tài)機(jī)的第(15) 狀態(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) 在第一種方式中,每次循環(huán)的運(yùn)行需要經(jīng)過一個(gè)事件結(jié)構(gòu)才能夠?qū)崿F(xiàn)case 中各個(gè)分支 些函數(shù)可以在 case 結(jié)構(gòu)中共用顯示這是無法滿足要求的,它從本質(zhì)上而言仍然是一種 事件結(jié)構(gòu)。我們可以回憶狀態(tài)機(jī)

13、模式中的“空閑Idle”狀態(tài),這正是長時(shí)間占用CPU 資源的源頭,如果在Idle 中加入一個(gè)事件結(jié)構(gòu)后就有效地規(guī)避了這個(gè)問題。圖 20 三種結(jié)構(gòu)的組合方式 原來的貨幣值與新加入的幣值相加得到新的值)。這樣,需要有一種途徑把 1USD、2USD 和5USD代表的幣值作為參數(shù)傳遞給函數(shù)。圖21所示為帶參數(shù)的狀態(tài)機(jī)結(jié)構(gòu),在消息隊(duì)列的狀態(tài)機(jī)模式中,加入了一個(gè)變體型的 果發(fā)生錯(cuò)誤將直接轉(zhuǎn)到錯(cuò)誤處理狀態(tài)。當(dāng)然,也可以在圖21 的基礎(chǔ)上做一些改進(jìn)和變形, 圖 21 帶參數(shù)的狀態(tài)機(jī)結(jié)構(gòu)【應(yīng)用4】 圖 22 2D數(shù)組排序_前面板系統(tǒng)使用狀態(tài)機(jī)和事件結(jié)構(gòu)相結(jié)合的模式,如圖23所示。程序分為8 個(gè)狀態(tài),共有4 圖圖

14、 23 2D數(shù)組排序_背面板 圖 24 狀態(tài)機(jī)中的事件結(jié)構(gòu)(1) Index:當(dāng)前排序的列號,表示Listbox 以哪一列為依據(jù)進(jìn)行排序。 量賦值即可,并且當(dāng)該單擊是有效單擊時(shí)進(jìn)入“DSort”狀態(tài)進(jìn)行排序操作。 在圖27所示的DSort 狀態(tài)中,根據(jù)內(nèi)部變量的值對Listbox 賦值并更新列頭的顯示。 提供2D 數(shù)組的排序方式,只提供了1D 數(shù)組的排序函數(shù)。本例充分利用了LabVIEW 提供的排序函數(shù)功能,當(dāng)然并不是唯一的,也可以使用LabVIEW 實(shí)現(xiàn)常用的排序算法。 LabVIEW 提供了多種動態(tài)調(diào)用的方式,從底層而言是通過VI Server 技術(shù)實(shí)現(xiàn)的。圖31 所示為LabVIEW 中

15、的Application Control 選板,動態(tài)調(diào)用所使用的節(jié)點(diǎn)都位于這 作;最后再關(guān)閉該VI 的句柄避免內(nèi)存泄漏,這就完成了一次對VI 的調(diào)用。 出接口,也就是說這種動態(tài)調(diào)用的前提是必須知道被調(diào)用VI 的輸入輸出接口,否則無法進(jìn) Open VI Reference 的路徑輸入是一個(gè)多態(tài)的輸入口,也可以使用String 輸入,如圖33所示。此時(shí)被調(diào)用的VI 必須在內(nèi)存中,且輸入的是被調(diào)用VI 的文件名。值得一提的是這種“文件名”調(diào)用方式在可執(zhí)行程序中是無法被調(diào)用的,因此建議最好采用路徑的調(diào)用方式。 顯然這是一個(gè)比較熟悉的遞歸調(diào)用,但是在LabVIEW 中似乎很難實(shí)現(xiàn)。由于LabVIEW 不

16、允許同名的VI 同時(shí)在內(nèi)存中,因此一個(gè)VI 是無法VI 調(diào)用本身的。但是,通過VI 的可重 入技術(shù)和動態(tài)調(diào)用技術(shù)卻可以實(shí)現(xiàn)VI 的遞歸調(diào)用。 同理我們也可以使用這種遞歸的方式實(shí)現(xiàn) f(n)=n! 的算法,從數(shù)學(xué)上可以寫作 f(n)=n*f(n-1),其中 n=1,f(0)=1。具體的實(shí)例將不再詳述。此外,遞歸算法的效率比較低, 在實(shí)際應(yīng)用中應(yīng)謹(jǐn)慎使用。 調(diào)用的VI 運(yùn)行完畢,主程序才會繼續(xù)執(zhí)行。這似乎無法解決在本節(jié)開頭提到的問題,那么 是否存在一種動態(tài)調(diào)用方式使被調(diào)用的VI 與主VI 之間分別獨(dú)立運(yùn)行呢?答案是肯定的。 行、停止和賦值,各個(gè)屬性節(jié)點(diǎn)和方法的具體含義見LabVIEW 的幫助文檔。

17、使用這種方式動態(tài)調(diào)用VI 時(shí),并不需要知道VI 的輸入輸出接口。 圖 36 是該使用“屬性節(jié)點(diǎn)和方法”實(shí)現(xiàn)動態(tài)調(diào)用的一個(gè)實(shí)例。在大多數(shù)應(yīng)用程序啟動 ), 主程序,將Wait Until Done 設(shè)置為false,這樣就可以保證被調(diào)用VI 的獨(dú)立運(yùn)行;最后,關(guān) 世界上不會存在一勞永逸的事情,因此也不要認(rèn)為任何一種程序設(shè)計(jì)模式能夠“通殺” 所有的程序結(jié)構(gòu)。本文對LabVIEW 程序設(shè)計(jì)模式的討論主要是為了更好地理解LabVIEW 程 序的設(shè)計(jì)方法,更進(jìn)一步地設(shè)計(jì)出健壯、可擴(kuò)展性強(qiáng)的程序。 在LabVIEW 中選擇“FileNew”菜單,會彈出圖45 所示的對話框。當(dāng)然,也可以將自己 在使用LabVIEW 時(shí),程序員會更習(xí)慣于使用函數(shù)面板(Function Palette包括調(diào)用一 個(gè)子VI(SubVI)或者選擇一個(gè)內(nèi)置的函數(shù)。那么能否把一個(gè)自定義的VI 放在函數(shù)面板中, 當(dāng)選擇該VI 時(shí)并不是調(diào)用其作為一個(gè)子VI,而是調(diào)用該VI 的背面板代碼?

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論