查看: 1843|回復: 27
打印 上一主題 下一主題

中大型LABVIEW軟件三層設計架構

  [復制鏈接]

7

主題

14

帖子

45

積分

新手上路

Rank: 1

積分
45
跳轉到指定樓層
樓主
發表于 2020-5-5 19:20:30 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
一、總覽

通常一個VI若包含三、四十個以上的subVI(不包含LabVIEW本身在Functions中提供的VI)時,就可算是一個中大型的軟件計劃(software project)了。雖然比起軟件工程中的一些作業環境軟件(如Windows系列)或大型應用軟件(如Word、Excel)等仍算是小工程,但其復雜性亦在一定程度之上,若沒有事先想好在撰寫程序時的一些規劃與方法,想要完成這類中大型的軟件絕對不是一件簡單的事。尤其這類軟件通常不是由一個人,而是由一個團隊所共同完成的,因此整個軟件的結構,就要能讓團隊中的每一成員都能清楚的了解,而且要夠簡單,才算是好的軟件結構。以下將參考由Rick Bitter等人所著”LabVIEW Advanced rogramming Techniques”,中之第4章的部分內容,介紹所謂軟件計劃中的三層式結構(the Three-Tiered Structure)的概念及其優點。

需要軟件結構的主要原因,是當軟件人員發展軟件到某一階段時,若沒有計劃或無意的創造了許多subVI,但各subVI之間有許多部分其實是重復撰寫的;或各VI相互間呼叫時沒有一定的紀律,使得在VI Hierarchy中所看到的各VI間的聯機是錯綜復雜,像個盤絲洞一般,這將可能會使多人發展的軟件計劃增加所耗費的時間和可能出錯的機會、減低程序的效率,以及增加debugging時的困難。為了改善上述的情形,所以要提倡三層式結構的概念。

三層式結構由上而下依次為:Main Level、Test Level和Driver Level,這種結構是由經驗中得來的,在多人發展的軟件計劃中顯得簡單明了,當大家都能遵照這個結構來寫程序時,這種結構就可以充分顯現出它的優點。那這三個階層到底如何區別呢?以通俗的比喻來說,假設我們如果要組織一個籃球隊參加全國比賽,每個球員要練習基本動作及體能,如何跑、如何跳、手腳該如何放置才是正確位置等,這就相當于系統中Driver Level所做的事情;接下來,將各球員組合練習某一套防守或進攻的戰術,如二三區域聯防、人盯人防守,每個人該在什么位置才能正確接應等,則像是Test Level中一項項的test了;而最后比賽時,場上的戰略運用,包括何時要用什么戰術組合、如何更換球員、何時喊暫停、終場前是不是要故意犯規或采拖延戰術等等,對照過來,就像是在Main Level中,如何將Test Level中各test做最有效能的整合與排列組合等的工作。

簡單來說,Driver Level包含了程序與所有儀器、組件、馬達或其它應用軟件的溝通、控制等較低階的事情,使其可完成某一項基本的動作,例如初始化、馬達走到home位置、雷射以設定的能量及頻率發射光束等??勺⒁獾轿覀冊谶@邊所說的driver,并不像一般在別處所稱驅動程序的那種driver那么低階,真正最低階的工作還是要有現成的VI來幫忙才行;在Test Level中,則是如何連接各個Driver VI的基本動作,使可做完出一套連續、有意義的流程,來執行某項測試,例如讓手臂由A點走到B點,下降夾取一個螺絲,再走至C點裝到某面板上,然后回到A點等待,類似這樣控制一個流程的進行,便是Test VI的工作內容;Main Level則包含了使用者接口(User Interface)或稱人機接口(Man-Machine Interface) ,目的是整合各項測試和例外處理(Exception Handling)等,將它們以適當的順序及流程組合,很容易地讓使用者操作。

當一個軟件計劃嚴格的遵照上述的三層結構來撰寫時,最大的優點是可使程序代碼的再使用(code reuse)達到最大化,在不同的Test VI中,可重復使用相同的Driver VI;而在不同程序的Main Level中,又可重復使用相同的Test VI,這將使得程序維護或修改的時間與精力大幅減少;同時當我們已有一個程序的樣板(template)后,可增加軟件版本更新的速度。另一個很重要的好處是,當我們在撰寫某一個level中的程序時,并不需要關心在另一個level中有什么其它的程序是如何執行的,而只要專注在自己的這個level的程序上就可以了,這使得由團隊來共同完成一個大型計劃的工作變得容易許多。

二、詳解

以下將依Driver Level、Test Level、Main Level的順序,來介紹在各level寫程序時的原則與心得﹔

(1) Driver Level﹔

通常在Driver Level所寫的程序是比較低階的,其功能是把一些最基本的I/O動作按某一順序連接起來,形成基本動作,大致分為三大類﹔

a.組態(configuration):開啟或關閉與儀器的連結、將儀器初始化及設定組態等。

b.量測(measurement):由儀器讀出測量值或特定的資料。

c.動作/狀態(action/status):一個流程的啟始或結束動作、檢查錯誤等。

簡單來講,Driver Level的內容是藉由一些接口(卡),經digital I/O或analog I/O由儀器取得上一些sensor的電壓值,或傳出一些電壓值來控制機器、儀器或馬達等的組態與動作,使得儀器或機器能夠正確設定及做出一些基本的動作。另外程序與儀器間的資料傳遞或在自身計算機的存取動作,規定檔案的格式以及存取等等,也都屬于Driver Level中應該完成的事項。但是真正最低階的工作還是需要NI提供的VI來進行,我們所寫的Driver VI仍是屬于較高階的。

以下舉一個利用7344卡來控制馬達動作,而使BM7移動的Driver VI實例﹔

首先要確定馬達所有的動作有哪些,我們可簡單分類如下﹔初始設定、找尋Home點、移到指定位置、以及回報現在位置等。當然我們必須先在MAX上做細部的設定,接下來再回到LabVIEW中來撰寫Driver VI。

看起來我們必須寫四個Driver VI來控制馬達,但這樣往往造成subVI過多的情形,因此我的建議是將關于同一個儀器或裝置的Driver VI合并為一個。合并的方法為利用一個enumerated type的control加上case結構即可。完成后如下圖﹔

利用名為Action的enum control來控制此Driver VI要進行何項動作。記得在編輯icon時,要將此enum control加到input terminal即可。

在Test Level中呼叫時的方法就可如下圖所示了﹔

如此一來,我們便可以利用一個subVI來完成數個動作了,減少了一些管理subVI的辛苦。但請注意,這樣的Driver VI要看情形而在其File> VI roperties…> Execution中設定為reentrant,因它很有可能同時被數個Test VI呼叫。

在大型程序計劃發展時,一個觀念很重要:Driver Level中的VI是整個軟件計劃中最重要的部分,它們的好壞直接決定了這個軟件計劃的成功與否和完成后的品質,就像要蓋高樓大廈,打地基、灌水泥以及基本用料的好壞才是決定建筑物好壞最重要的地方,若基礎的部分不好,無論大樓外觀有多雄偉或多漂亮,假使地震一來,都有可能會倒塌。Driver VI若不先規劃,往往會造成程序效率減低,以及重復的程序代碼過多等現象。雖然在最后主程序執行時并看不到Driver VI,但它們可是最重要的無名英雄,所以在設計Driver VI時需要多費點心思喔!

(2) Test Level:

在Test Level中的VI此處暫稱為Test VI,它可以呼叫Driver Level的VI,但只能被Main Level中的VI呼叫。有一個不成文的規定:Test VI間不可以互相呼叫;否則會使三層結構又被破壞了??墒窃趯懗绦驎r,有時又覺得難以避免,或為了圖方便想說就暫時先呼叫一下吧,若有這情形發生,那就要請重新檢視一下Driver Level中的VI,是否要重寫某些部分或在寫一些新的Driver VI,以避免上述的情形發生。

有一個重要的原則,一個Test VI內只要安排一套完整的測試即可,不要在同一個Test VI中去完成兩個(以上)的測試,否則未來若整個計劃要作修改時,Test VI可能就又要修改了。一個完整的Test VI當然要包含對儀器設備的初始化,組態設定等,它是一個可以單獨執行的VI,也就是說,即使此Test VI不放到Main Level之下,它也一樣可以單獨執行來完成一項測試。另一個重要觀念是,各個Test VI間是不要有什么關聯的,因為當在Main Level中的某個Test VI執行時,它并不確定前一個Test VI結束時的機器狀態是否合于要求,因此要重新設定,或是要重新檢查一下,以避免不能執行或有預料外的狀況發生。

流程圖對于我們來撰寫Test Level中的VI是特別有用,因流程圖的概念也正好就是LabVIEW中所謂data flow的概念,因此當一項測試的流程圖清楚的畫出來并能解釋其流程時,即使我們還沒有開始寫程序,我們幾乎可以說這個Test VI的程序設計已完成60%以上了,這一點也不夸張,因剩下的部分只是將流程圖中各方塊的連接,換成LabVIEW中各function VI或Driver VI的連接而已。

(3) Main Level:

Main Level又稱人機接口(Man-Machine Interface, MMI),設計Main Level程序的中心觀念是不僅要能完成測試外,而且操作上要越能user-friendly越好,因為當使用者在操作儀器設備時,他其實并不見得很關心細節的部分是如何運作的,他或許只希望能很輕松愉快的盡快完成工作,然后輕松愉快的下班回家。例如,使用者希望手臂能夠走到某特定位置去夾取一個螺絲,最好是按下某個屏幕上的按鈕就好了,只要看著屏幕上一切正常的訊息,說不定他還可以有時間悠閑地喝杯咖啡呢!

通常Main Level VI的設計往往利用while循環不斷的polling,大部分的時候也不只一個while循環。其內容要包含幾個重點:

a) 可讓操作者設定或更改操作參數:

例如可選擇何項測試及執行順序、接口的地址、檔案的路徑等等,但也請注意,需設定的選項并非越多越好,太多的選項容易使人分散注意力而容易出錯。

l 有些配置是只有效在開始之前。

l 有些配置可以隨時更改,如果在SubVI中用到,則需要用到數據傳輸(屬性節點,全局變量,消息等)。

l 臨時對話框。

l 非模態對話框數據(事件數據)。

b) 在特定的情況下使用適當的Control:

有時Control需加些心思來點變化,以表示其不同的重要性,最簡單的當然是以大小、顏色來區別,當然在執行時也可利用property node中閃爍的效果來強調,不過一般而言,常用的重要Control通常用按鈕放在Front Panel上顯眼的地方;而較不常用的Control,通常利用放在cluster或tab control中,利用invisible的功能或換至其它頁面使其平常不出現在Front Panel上。較不常用的按鈕,也較不用按鈕的形式,而可在Controls> Classic Controls> Boolean中選擇Radio Button或Checkbox來使用。請記得一個原則,在Front Panel上可看見的Control越少越好,因出現越多的Control,設定的參數就越有可能因不小心而改變,進而造成錯誤發生,要避免這種情形,可將Control連上另一Indicator后,在將Indicator放到Front Panel顯示其值即可。

c) 要將眾多的Control及Indicator依使用功能分類,并適當地利用頁面切換來顯示。

d) 在執行程序時可以選擇cancel或abort:

這對操作者而言是十分重要的,但卻容易被程序設計者所忽視,因程序設計者會不經意的假設操作者是非常了解他所寫的程序,又非常熟練,而且一定照正確步驟不會按錯按鍵。但實際上操作者可能并不熟練或很粗心等等,有時若一旦按下某個按鈕就不能后悔的話,很容易造成萬劫不復的悲劇。請注意,程序設計者一定要在程序中加入在執行中跳出程序的方法,而盡量避免由操作者去按下toolbar上的abort(紅色圓形按鈕)來跳出程序。

e) 在Front Panel上多使用圖形,避免過多的文字或數據。

f) 在Main Level中統一處理所有的exception massage:

這部分在程序設計中又稱exception handling,在軟件工程上也是需要專門課程來討論的,同時,這部分對于產品的商品化是非常重要的,在此只先簡單敘述,之后會有專門的專題來討論。

先談建立exception handling機制的好處:它可告知操作者哪里有出錯,或需要注意,使不是十分熟練的新手操作者,減低發生狀況的機會;也方便制造廠商與程序設計者容易做除錯及故障排除的動作,使得整個系統的開發及維護能較有效且所短時間。

我們希望exception handling可達到下列幾個功能:當測試過程有錯誤狀況發生時,程序可以自動修復錯誤,并繼續完成測試或重新測試一次;或當測試過程有錯誤狀況發生,且此錯誤不能修復時,程序能自動跳過有問題的部分,并繼續完成測試;或測試過程有錯誤狀況發生時,程序會將整個系統暫?;蚪K結,并告知操作者錯誤發生處。上面敘述起來似乎很簡單,但實際上它需要程序設計者看到實際操作后的結果,再一項一項加到整個程序中,然后再故意發生錯誤來測試,也因為如此,它可算是整個軟件計劃發展過程中非常耗時耗力的一部分。

若藉用前述所提過的State Machine的寫法,會使得exception handling的程序設計較為簡單,因State Machine中原本就有安排一個error state,可讓程序設計者在那里統一撰寫處理各種exception/error message,然后在error state中判斷,是回到原來的測試中,或是走到close state去結束此項測試。因此是強烈推薦采用State Machine的寫法。

更多教程,請關注 labview工作室 ,學習labview或需要源碼的朋友,歡迎關注留言咨詢。需要labview培訓請留言!

本帖子中包含更多資源

您需要 登錄 才可以下載或查看,沒有帳號?立即注冊

x
回復

使用道具 舉報

2

主題

9

帖子

30

積分

新手上路

Rank: 1

積分
30
沙發
發表于 2020-5-5 19:21:24 | 只看該作者
轉發了
回復

使用道具 舉報

6

主題

14

帖子

44

積分

新手上路

Rank: 1

積分
44
板凳
發表于 2020-5-5 19:21:54 | 只看該作者
轉發了
回復

使用道具 舉報

2

主題

9

帖子

30

積分

新手上路

Rank: 1

積分
30
地板
發表于 2020-5-5 19:22:21 | 只看該作者
轉發了
回復

使用道具 舉報

363

主題

8243

帖子

1萬

積分

管理員

Rank: 9Rank: 9Rank: 9

積分
17075
5#
發表于 2020-5-5 19:22:47 | 只看該作者
mark
回復

使用道具 舉報

363

主題

8243

帖子

1萬

積分

管理員

Rank: 9Rank: 9Rank: 9

積分
17075
6#
發表于 2020-5-5 19:23:24 | 只看該作者
轉發了
回復

使用道具 舉報

2

主題

4438

帖子

8878

積分

論壇元老

Rank: 8Rank: 8

積分
8878
7#
發表于 2020-5-5 21:38:00 | 只看該作者
互聯網真的是時代的趨勢啊
回復

使用道具 舉報

7

主題

4481

帖子

8969

積分

論壇元老

Rank: 8Rank: 8

積分
8969
8#
發表于 2020-5-6 03:44:36 | 只看該作者
互聯網真的是時代的趨勢啊
回復

使用道具 舉報

5

主題

4526

帖子

9057

積分

論壇元老

Rank: 8Rank: 8

積分
9057
9#
發表于 2020-5-6 07:03:10 | 只看該作者
互聯網真的是時代的趨勢啊
回復

使用道具 舉報

10

主題

4478

帖子

8966

積分

論壇元老

Rank: 8Rank: 8

積分
8966
10#
發表于 2020-5-8 16:30:28 | 只看該作者
互聯網真的是時代的趨勢啊
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

快速回復 返回頂部 返回列表
优酷路由宝为什么可以赚钱吗 亦乐贵州捉鸡麻将下载遵义 福建11选5综合走势 五分彩软件是不是真的 75秒极速赛车是谁开的 双相码波形图 终于知道四方河南麻将一直赢 股票调出融资融券 多多棋牌游戏? 中原福彩22选5走势图 贵阳微乐捉鸡麻将手