版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、Labview面向對象編程快速入門一、類和對象的基本概念在面向對象編程中,類用來表示通用特性。例如,假設有一個描述汽車的類。類中定義了各種汽車的通用特性。對象是類的特定實例。汽車類的一個對象,可以是某一輛特定的汽車。類的定義決定該汽車(對象)的行為。類中定義了和對象相關的數據和方法。仍以汽車為例。世界上有許多類型的汽車。汽車可分為轎車、卡車、公共汽車等不同類別。汽車的車身上有車門,排擋上有齒輪。車門和齒輪的數量信息都是汽車的相關數據。汽車還可加速或剎車。加速或剎車都是汽車的行為(或稱為方法)。汽車相關的數據和方法,構成了汽車類的定義。通過類的創(chuàng)建,可定義對象的數據和方法。下圖示范了汽車類在La
2、bVIEW中的表示。LabVIEW將汽車類的數據存儲在Vehicle.ctl中,將汽車的方法存儲在StartVehicleVI和StopVehicleVI兩個VI中。對象是類的特定實例。指定的某一輛汽車是汽車類的一個特定實現,或稱為汽車類的一個對象。下列MainVI的程序框圖中,有一個汽車類的對象。對象包含哪些數據和方法,是通過類來定義的oLabVIEW將類的數據存儲在一個控件中,用戶創(chuàng)建的成員VI即是LabVIEW類的方法。為使LabVIEW面向對象編程的概念更為清晰,可通過如下方式區(qū)分LabVIEW類的不同用戶:LabVIEW類開發(fā)人員一開發(fā)LabVIEW類,以供其他開發(fā)人員及程序員使用。
3、LabVIEW類開發(fā)人員適合擁有面向對象編程經驗的人員擔當。LabVIEW類開發(fā)人員必須理解LabVIEW類及其機制。LabVIEW類用戶一使用LabVIEW類開發(fā)人員所創(chuàng)建的類。LabVIEW類用戶可以在應用程序中利用面向對象編程的優(yōu)勢,但無需了解類的運行機制,LabVIEW類用戶不一定有面向對象編程的經驗。LabVIEW類開發(fā)人員發(fā)布類之后,LabVIEW類用戶可能不具備訪問該類內部操作的權限。LabVIEW類開發(fā)人員對LabVIEW類所作的修改,應極少影響LabVIEW類用戶所開發(fā)的應用程序。LabVIEW類用戶無需了解如何創(chuàng)建LabVIEW類,但必須了解應用程序中通過類定義的數據類型應
4、當如何使用,涉及LabVIEW類的代碼有哪些可用于調試的信息,以及LabVIEW類的新版本將如何影響已經生成的應用程序。在只需使用現有的LabVIEW類而無需對LabVIEW類進行開發(fā)的情況下,可參考在應用程序中使用LabVIEW類,學習如何使用其他開發(fā)人員所提供的LabVIEW類。二、在LabVIEW中創(chuàng)建類通過創(chuàng)建LabVIEW類,可在LabVIEW中創(chuàng)建用戶定義的數據類型。LabVIEW類定義了對象相關的數據和可對數據執(zhí)行的操作(即方法)。通過封裝和繼承可創(chuàng)建模塊化的代碼,使代碼更易修改而不影響應用程序中的其它代碼。在LabVIEW中,類的數據是私有的,也就是說,只有類的成員VI才有權限
5、訪問該數據。類的數據可在私有數據控件中定義。創(chuàng)建和保存LabVIEW類時,LabVIEW將創(chuàng)建一個類庫文件(.lvclass),其中定義了新的數據類型。類庫文件記錄了私有數據控件和所有被創(chuàng)建的成員VI的信息,比如VI列表以及VI各自的不同屬性。類庫和項目庫(.lvlib)相似。不同的是,類庫定義了新的數據類型。私有數據控件對應唯一的類庫文件,其中為新的數據類型定義了一簇數據,該簇也是類連線上的數據。LabVIEW的私有數據控件并不保存在磁盤上,而是保存在類庫文件中。由于在類庫文件中保存私有數據,不符合類定義的私有數據一定不會被使用。提示:如需保存類庫文件、類成員VI,以及類自定義默認探針,可在
6、磁盤上創(chuàng)建一個和LabVIEW類同名的目錄,將屬于該類庫的文件保存在該目錄中。如同一目錄中包含了多個屬于不同類庫的文件,那么在不同類庫中添加相同名稱的VI時將產生沖突。在開發(fā)過程中重寫動態(tài)成員VI將產生命名沖突。封裝每個LabVIEW類包括一個數據簇和用于讀寫該簇的方法。LabVIEW類的數據是私有的,對于不是該類成員的VI來說是隱藏的。如需訪問類的私有數據,必須創(chuàng)建方法,即創(chuàng)建該類的成員VI,通過成員VI中的函數對私有數據執(zhí)行操作。封裝就是將數據和方法合并到一個類中,類中數據僅可由類的成員VI訪問。通過封裝可創(chuàng)建模塊化代碼,有利于方便地更新或修改代碼而不影響應用程序中其它部分的代碼。類中的數
7、據是私有的,但成員VI卻可以按不同的程度公開。方法的設置訪問范圍選項可以有如下設置:公共一任何VI都可將該成員VI作為子VI調用。庫內一只有同類中的VI、類的友元或類的友元庫中的VI可以調用庫內成員VI。在項目瀏覽器窗口中,庫內成員VI圖標中有一個深藍色的鑰匙符號。保護一僅該成員VI所在的類及其子類中的VI可以調用該成員VI。在項目瀏覽器窗口中,受保護的成員VI圖標中有一個暗黃色的鑰匙符號。私有一僅該成員VI所在類中的VI可以調用該成員VI。在項目瀏覽器窗口中,私有成員VI圖標中有一個紅色的鑰匙符號。未指定僅當選中一個文件夾時,顯示該選項。文件夾的訪問范圍未指定時,其訪問范圍默認為公共。默認情
8、況下,如未對類中的文件指定訪問范圍,則這些文件夾的訪問范圍為公共。注:如指定文件夾的訪問選項,則訪問設置適用于文件夾下的所有文件,并將覆蓋各個文件的原有設置。注意:如將動態(tài)分配VI設置為庫內,這些VI將無法運行。為友元創(chuàng)建一個靜態(tài)分配的包裝VI,調用該包裝VI并將其設置為庫內,以此向友元賦予訪問受保護動態(tài)分配VI的訪問權限。分配庫的友元將一個VI分配為庫的友元,即是給予該VI調用庫內任何成員VI的權限。也可分配一個庫作為庫的友元。友元關系不具有傳遞性。例如,如第一個庫分配第二個庫為友元,第二個庫分配第三個庫為友元,第三個庫不能作為第一個庫的友元。除非第一個庫將第三個庫作為友元,第三個庫無法訪問
9、第一個庫的VI。如訪問權限在庫內的庫指定某個類為友元,該類的成員VI可訪問庫的VI,但是友元關系不延展至類的子孫類。可創(chuàng)建一個在LabVIEW類之外的VI,將公共成員VI作為子VI在程序框圖上使用。公共成員VI允許用戶操作類的私有數據。用戶可在成員VI的程序框圖上使用私有和受保護的成員VI操作LabVIEW用戶不可見的類私有數據。獨立于類的VI可作為類的友元,友元VI可調用庫內的成員。對類的入口點進行限制,可減少對數據引入錯誤的機會,更便于調試代碼。定義私有數據控件創(chuàng)建LabVIEW類時,LabVIEW將自動創(chuàng)建類的私有數據控件。請注意在下列項目瀏覽器窗口中,LabVIEW類的圖標是一個有色立
10、方體。該立方體用于代表一個LabVIEW類。私有數據控件的圖標是一個帶有綠色圓柱體的有色立方體。圓柱體用于代表數據存儲。同時,私有數據控件的圖標中有一個紅色鑰匙符號,表示該控件是私有的。斶項目瀏覽賽-LabVIETClasses,lvproj回商文件端輯查看迪項目迅)挨作工具)窗口Elit目同創(chuàng)IX需慈嚏|囲-項立件日嵐項目-ga廠Y:-L”百:LabVIEWClisseE.IwprojE的電腦Vehicle.1vc1s.eeVehicle,allStartVeh.itie.vi+”StopYahicle.vi依賴關系程序生成規(guī)范通過控件編輯器窗口可對類的私有數據控件進行自定義。在項目瀏覽器窗
11、口中雙擊類的私有數據控件,即可打開“控件編輯器”窗口??蓪㈩愃接袛祿拇刂械妮斎肟丶惋@示控件放置到LabVIEW類的定義私有數據控件中。為放置輸入控件和顯示控件中的輸入控件設置的默認值為類的默認值。注意:私有數據控件不能包含XControl或XControl引用句柄。以下范例中,汽車類的數據類型包含齒輪數量、車門數量和顏色三個數值,以及制造和型號兩個字符串。西|裘私有數曲頤色111112Pt應用程序字體jgT|Vehicle,ctlVehicle,lvclass的魁有數據(LabVIEWClasses-回因文件電)編輯查看遡項目操作迪)工具窗口址)幫助空L命VIEW口出羽.1燈“丿我的電胞|
12、電類私有數據的堿制造型號車門數量齒槍數量注意:如類中不需要任何私有數據,類私有數據的簇中可以不設定任何數據。用戶可創(chuàng)建在前面板或程序框圖上代表類的圖標。單擊類屬性對話框常規(guī)設置頁的編輯按鈕,打開圖標編輯器對話框。創(chuàng)建類圖標后,LabVIEW將把類圖標應用于類的所有對象。修改類中各個對象的圖標。2.3創(chuàng)建成員VI通過創(chuàng)建成員VI(或稱創(chuàng)建方法),可對類的私有數據執(zhí)行操作。成員VI是LabVIEW類的方法。在LabVIEW類中創(chuàng)建,并在項目瀏覽器窗口中該類的私有數據控件下出現的VI,是該類的成員VI。LabVIEW將類的數據定義為一個簇。所有成員VI都可對類數據的簇進行讀寫。LabVIEW為創(chuàng)建用
13、于訪問簇中各元素的VI提供了捷徑。這種訪問器VI是LabVIEW類的成員,可對類數據進行讀寫操作。如創(chuàng)建一個訪問器VI以讀取類數據,LabVIEW將取消對類數據的綁定,如下圖所示。Vehicle.Lvclassmelicle.IvclassDut錯誤輸入(無諸誤)齒輪數量錯誤輸出如創(chuàng)建用于寫入類數據的訪問器VI,LabVIEW將把新值綁定至類數據,如下圖所示。也可使用解除捆綁或按名稱解除捆綁函數,在成員VI的程序框圖中對類的私有數據解除捆綁。使用捆綁或按名稱捆綁函數可在訪問和操作私有數據之后將數據重新捆綁成簇。由于類的數據是私有的,若試圖在非該類成員VI的程序框圖中通過“捆綁”和“解除捆綁”節(jié)
14、點訪問該類數據,節(jié)點將自動斷開無法運行。注:建議盡量使用“按名稱捆綁”和“按名稱解除捆綁”函數替代“捆綁”和“解除捆綁”函數,以免在私有數據的簇中插入新元素時VI斷開。如寫入成員VI的操作將取消捆綁某個值,修改該值然后將值捆綁至對象,可使用元素同址操作結構,在結構兩邊放置解除捆綁和捆綁函數,以實現更高的效率。該結構可保證LabVIEW使用了某些內存優(yōu)化技術。使用常規(guī)取消捆綁和捆綁節(jié)點時也可使用該內存優(yōu)化的方法。但是,在復雜VI的情況下,LabVIEW編譯器可能會認為優(yōu)化不夠安全而拒絕使用優(yōu)化算法,導致運行速度變慢。元素同址操作結構保證了這些優(yōu)化算法的安全性,確保VI按優(yōu)化算法運行??赏ㄟ^各種方
15、式創(chuàng)建成員VI。右鍵單擊類并在以下快捷菜單項中選擇:新建VI打開一個空的成員VI。新建屬性定義文件夾創(chuàng)建一個屬性定義文件夾,可在其中創(chuàng)建或添加現有成員VI。如LabVIEW類包含一個屬性定義文件夾,可將LabVIEW類連接至屬性節(jié)點訪問私有數據。新建基于動態(tài)分配模板的VILabVIEW將生成一個新成員VI,該VI帶有錯誤輸入簇、錯誤輸出簇、一個用于錯誤處理的條件結構,以及輸入LabVIEW類和輸出LabVIEW類。在VI連線板上,LabVIEW將輸入和輸出接線端都設置為動態(tài)。新建基于靜態(tài)分配模板的VILabVIEW將生成一個新成員VI,該VI帶有錯誤輸入簇、錯誤輸出簇、一個用于錯誤處理的條件結
16、構,以及輸入LabVIEW類和輸出LabVIEW類。與創(chuàng)建動態(tài)分配VI相反,LabVIEW不將動態(tài)分配VI的連線板上的輸入和輸出接線端設置為動態(tài)。新建用于數據成員訪問的VI打開創(chuàng)建訪問器對話框。通過該對話框快速創(chuàng)建用于訪問LabVIEW類數據的成員VI。注:使用該選項之前必須先保存新建的LabVIEW類。如未保存新類,LabVIEW將用于數據成員訪問的VI選項灰暗顯示。新建用于重寫的VI創(chuàng)建一個重寫祖先類成員VI的成員VI。LabVIEW使用父VI的圖標對子類的圖標進行覆蓋,創(chuàng)建新VI的圖標。注:若不存在可重寫的有效成員VI,LabVIEW將禁用新建用于重寫的VI選項。更多關于“動態(tài)VI”和“
17、重寫”的信息見繼承一節(jié)。右鍵單擊前面板或程序框圖上的常量或控件,從快捷菜單中選擇顯示類庫,在項目瀏覽器窗口高亮顯示相關類。如當前類不屬于某個LabVIEW項目,LabVIEW將打開一個類窗口顯示該類。類私有數據的簇11!短車廂?文件編輯迅)查看迪項目遼操作工具窗口粘助12pt対話框字懷四輪驅動?耒命名項目“我的電腦STruck,ctlTruck,lvclass的權有數據(未奇名項號1/我的電施)祖先類的數據是私有的,必須使用祖先類提供的函數(成員VI)才能修改這些數據。子孫類的成員VI可以調用祖先類任何“公共”型的成員VI,就像調用LabVIEW中的其它VI樣。子孫類的成員VI也可以調用祖先類
18、“保護”型的成員VI。若指定一個祖先類成員VI為“保護”型,則其任何子類的成員VI可以調用其方法,但該類繼承層次結構以外的任何其它VI都不能調用其方法。如需訪問卡車類從汽車類繼承而來的齒輪數量,可在汽車類中創(chuàng)建一個“公共”型或“保護”型的成員VI,比如GetGears.vi。在GetGears.vi的程序框圖中可對汽車類解除捆綁,從而得到齒輪數量。然后將齒輪數量分配到連線板的一個輸出接線端,用這種方法,汽車類的子孫類(例如,卡車類)就可訪問汽車類的某個私有數據(例如,齒輪數量)了。在汽車類中創(chuàng)建訪問數據成員的成員VI,即可訪問齒輪數量。創(chuàng)建成員VI時,勾選創(chuàng)建訪問器對話框的通過屬性節(jié)點實現復選
19、框。然后,將卡車類連接至屬性節(jié)點,右鍵單擊屬性接線端并選擇選擇屬性齒輪數量。注:LabVIEW類不可調用另一個LabVIEW類的“私有”型成員VI,即使是父類,也無法調用其子類的私有成員VI。類的“私有”成員VI只能由這個類的其它成員VI在程序框圖中調用。LabVIEW對象短語LabVIEW對象是一個特定的類的名稱。LabVIEW面向對象編程中,LabVIEW對象是繼承樹的根類。默認狀態(tài)下,所有LabVIEW類都是從“LabVIEW對象”繼承而來的。通過“LabVIEW對象”創(chuàng)建的VI,能對多個LabVIEW類執(zhí)行通用的操作。例如,可創(chuàng)建一個由若干LabVIEW類構成的數組,該數組的類型是某個
20、基類,數組中的數據可以是這個基類或它的任何子孫類類型的元素,因此數組中的數據是異構的。如果一個數組的類型為“LabVIEW對象”,則該數組可包含汽車類、卡車類和保齡球類。保齡球類并不是從汽車類或卡車類繼承而來的,因此LabVIEW將創(chuàng)建一個通用于這些類的最近的祖先基類,此處便以“LabVIEW對象”為基類。下圖顯示了汽車類數組,一個包含汽車類和卡車類的數組。由于卡車類是從汽車類繼承而來的,汽車類就是通用于這兩個類的最近的祖先基類。該圖還顯示了包含“LabVIEW對象”類、汽車類、卡車類和保齡球類的LabVIEW對象數組。保齡球類不是從汽車類或卡車類繼承而來的,但所有的這三個類都是從“LabVI
21、EW對象”這個根類繼承而來,因此LabVIEW對象數組的類型是“LabVIEW對象”。Ho-terocenouEArray,vl甬面板*|口/;HeteiogenousArray=程序框圉*0S主件迪翳w萱看也)項目操件工具:囲j文件編輯奩看邊項目操作迪工具(1|令|蠻|冋|12鞏應用程序那應Vekiclclvclhee汽車數蛆Vehicle.IvcI&eeTruck,lrdassIrnck.lycl:iE5vLe沁c_e類是汽車數淚的共體,所付掃出笛蛆的斟據類型是壯hide設置繼承默認狀態(tài)下,所有LabVIEW類都是從“LabVIEW對象”繼承而來的。如果要更改一個類的繼承關系,必須在創(chuàng)建該
22、類之后更改繼承。通過類屬性對話框,可設置類的繼承關系和其它選項。在LabVIEW類層次結構窗口中,可查看LabVIEW類的層次結構。類繼承的層次結構可包括下列類型的類。父類一供其它LabVIEW類繼承數據、“公共”型成員VI和“保護”型成員VI的LabVIEW類。子類一繼承父類的公共和受保護成員VI的LabVIEW類。除非父類提供訪問VI,否則子類不繼承父類的私有數據。兄弟類一和一個LabVIEW類繼承同一個父類的另一個LabVIEW類。祖先類個LabVIEW類的上一層(父類)、上二層(父類的父類)、上三層等等?!癓abVIEW對象”是所有LabVIEW類的始祖。子孫類一一個LabVIEW類的
23、下一層(子類)、下二層(子類的子類)、下二冃竺竺連線外觀類定義了新的數據類型。在程序框圖中,通過類定義的數據類型采用默認的LabVIEW類連線外觀,或者繼承父類的連線外觀。通過類屬性對話框可對LabVIEW類更改連線外觀。適當地更改不同LabVIEW類的連線外觀,可提高程序框圖的可讀性。而使用過多的連線色彩和連線模式將破壞程序框圖的可讀性。下圖左側顯示了LabVIEW內置的連線外觀,右側顯示了自定義連線外觀的樣例。LabVI珊對象跌認連線:外觀認仏用戶可為創(chuàng)逹的類自定義連線外觀區(qū)線樣本1.1vcl陌eLabVIIEW對象2-Q-Q-Q-Q-Q-Q4連線樣本E.IvcXse獻認連線外觀-lwla
24、次ELabVI珊對愿的內置連線與用P創(chuàng)連類的默認連線祥式之出敦瘞線樣走l.lvclass2連線樣走Z-lvclass2E連蛭祥本3.1vclass2連線樣本S.lvclass關于在LabVIEW中避免過多連線和色彩的技巧,見LabVIEWStyleChecklist。2.8動態(tài)和靜態(tài)分配成員VI方法是在對象上執(zhí)行的操作。在LabVIEW面向對象編程中,方法是用戶創(chuàng)建的成員VI。成員VI在LabVIEW類的數據上進行運算。某些方法可用單個VI定義。這些方法稱為靜態(tài)分配方法,因為LabVIEW每次調用的是同一個VI。有時也可在類層次結構的多個VI中定義同名的方法。這些方法稱為動態(tài)分配方法,因為直到
25、運行才可確定LabVIEW調用的是哪一個VI。動態(tài)分配方法和多態(tài)VI類似:多態(tài)VI根據連入數據的類型來確定調用哪一個VI;動態(tài)分配方法在運行時根據輸入接線端到達的數據確定調用類層次結構中的哪一個VI。通過設置成員VI的連線板,成員VI既可指派為靜態(tài),也可指派為動態(tài)。若連線板上包含一個動態(tài)分配的輸入接線端,則該成員VI是動態(tài)分配方法的一部分。如連線板上沒有動態(tài)分配輸入接線端,則該成員VI定義了一個靜態(tài)分配方法。一個LabVIEW類繼承另一個LabVIEW類時,子類將繼承父類中定義的所有“公共”和“保護”型的方法。通過在子類中創(chuàng)建和父類成員VI相同名稱的成員VI,可定義該方法的子類實現。由于Lab
26、VIEW通過單個VI定義靜態(tài)分配方法,子類成員VI的名稱不可與祖先類的靜態(tài)分配成員VI的名稱相同。例如,當父類“汽車”中包含了“開門”VI這一靜態(tài)分配成員VI,則子類“卡車”便無法將名為“開門”的VI作為其成員VI。由于“卡車”從“汽車“繼承了其成員VI,故“開門”VI這一方法已在“卡車”上定義。如在程序框圖中將靜態(tài)分配方法作為子VI調用,則調用這些靜態(tài)分配方法和調用普通子VI沒有任何區(qū)別。對一個方法可定義多個動態(tài)VI,可在繼承層次結構中的每一層對該方法定義一個動態(tài)分配VI。如動態(tài)分配成員VI在父類中定義,且也在子類中定義,則子類的執(zhí)行將覆蓋或擴展父類的執(zhí)行。在以下范例中,“汽車”類和“卡車”
27、類都定義了動態(tài)分配方法SetMakeVI。若在程序框圖中將一個動態(tài)分配VI作為子VI調用,在編輯狀態(tài)下,該節(jié)點和一般子VI調用沒有區(qū)別。然而如果運行VI,則流入動態(tài)分配輸入接線端的數據將決定LabVIEW會調用類層次結構中的哪一個動態(tài)成員VI。LabVIEW類連線可傳遞本身及任意子類所允許的數據類型,不同的數據類型被定義了不同的成員VI,該節(jié)點將根據連線上的數據類型執(zhí)行相應的動態(tài)分配VI。閱讀下列范例。只有SetMakeVI的“汽車”類在主VI的程序框圖上。第一次循環(huán)時,由于“汽車”類的數據在類連線上,故LabVIEW執(zhí)行SetMakeVI的“汽車”類。第二次循環(huán)時,由于“卡車”類的數據在類連
28、線上,故LabVIEW執(zhí)行SetMakeVI的“卡車”類。如父類定義了一個動態(tài)分配VI但是不提供該VI的執(zhí)行,每個子類必須覆蓋其父VI。在許多情況下,用戶需提供父類VI的有意義的動作。例如,如有一個Shape類,定義AreaVI。AreaVI返回Shape對象的面積。沒有一個公式可計算任意形狀的面積。所以,每個繼承類必須用相應的面積計算公式覆蓋AreaVI。如創(chuàng)建了一個子類Circle,子類Circle就必須提供一個AreaVI,計算pi*radius*radius。如不定義父類VI的執(zhí)行,父VI就僅僅是所有覆蓋VI必須匹配的連線板和VI屬性。每個子類必須提供一個類似的覆蓋VI。要確保LabV
29、IEW強制執(zhí)行該要求,可在父類中標示VI為子類必須覆蓋的VI。一些子類可能無法覆蓋成員VI的功能。例如,如Shape類有子類Quadrilateral,無法提供四邊形面積計算公式,除非知道四邊形為特定類型的四邊形。用戶可使Quadrilateral類遷移覆蓋要求至其子類,以避免在Quadrilateral類中創(chuàng)建AreaVI的空執(zhí)行。右鍵單擊子類,從快捷菜單中選擇屬性,打開對象屬性對話框。在繼承頁上,勾選將全部重寫要求傳遞至子孫類復選框。LabVIEW將要求Quadrilateral的所有子類(例如,梯形和矩形)覆蓋AreaVI。要求子孫類覆蓋父類成員VI對成員VI的運行沒有影響。注:LLB無
30、法包含同名文件。因此,若類層次結構中存在同名的動態(tài)成員VI,這些VI不可放置在同一個LLB中。注:如子類的VI覆蓋了父類的VI,子類的VI必須和父類的VI在以下方面吻合:重入設置、首選執(zhí)行設置、優(yōu)先級設置、連線板接線端、連線板模式,以及訪問范圍。雙擊程序框圖上的一個動態(tài)分配子VI以顯示選擇實現對話框。通過該對話框可查看當前內存中動態(tài)分配子VI的所有實現,然后將該子VI的一個或多個實現打開。如選擇新建重寫VI而創(chuàng)建一個VI以覆蓋一個動態(tài)分配成員VI的父實現,則將創(chuàng)建另一個動態(tài)分配成員VI,因為重寫父類成員VI的VI與其父類VI同名且具有動態(tài)分配接線端。LabVIEW會自動將調用父類方法節(jié)點和正確
31、的動態(tài)分配輸入和輸出類接線端及其它匹配祖先類VI所需的接線端放在程序框圖上。若不存在可重寫的祖先類成員VI,則LabVIEW將禁用重寫VI選項。2.9動態(tài)分配輸出右鍵單擊連線板上的輸出接線端并選擇動態(tài)分配輸出(推薦),可將LabVIEW類的輸出接線端標記為動態(tài)。將一個含有動態(tài)分配輸出端的VI作為子VI調用時,動態(tài)分配輸出端的數據將轉換為與動態(tài)分配輸入端相同的類型。例如,將汽車類連接到一個動態(tài)分配輸入接線端,則該成員VI的輸出數據類型將和輸入數據類型相同,即為汽車類類型。動態(tài)分配輸入端和動態(tài)分配輸出端之間的數據是可修改的。然而,為了確保LabVIEW類運行時的安全,動態(tài)分配輸入端的數據必須流入所
32、有動態(tài)分配輸出端。同時,為了確保LabVIEW僅從動態(tài)分配輸入端讀取一次,僅向動態(tài)分配輸出端寫入一次,不可將動態(tài)的程序框圖接線端放置在結構之中。注:調試動態(tài)分配成員VI時,可檢查動態(tài)分配輸入端和動態(tài)分配輸出端之間的連線是否出錯。若一條連線從動態(tài)輸入出發(fā),且未通過任何能改變運行時數據類型的函數,則該連線的背景顏色將是灰色而不是通常的白色。若該連線通過一個能改變其數據類型的函數,則連線的背景顏色將變成紅色。為使動態(tài)輸出正常運作,不可改變LabVIEW類的數據類型。若已知成員VI的程序框圖中LabVIEW類的輸出數據類型不同于輸入數據類型,則須確保連線板上的LabVIEW類動態(tài)輸出接線端設置為推薦而
33、不是動態(tài)分配輸出(推薦)。例如,若LabVIEW類的輸入是汽車類而輸出是卡車類,則必須改變連線板上LabVIEW類的默認接線端。此外,也可從空VI創(chuàng)建成員VI,此時可手動設定連線板接線端。注:如在一個有動態(tài)分配輸入和動態(tài)分配輸出的成員VI中使用條件結構或事件結構,不能在輸出隧道上選擇未連線時使用默認選項。若在輸出隧道上使用未連線時使用默認,LabVIEW將斷開該VI。必須連接結構中的所有分支??紤]將隧道配置為自動連接輸入和輸出隧道。2.10動態(tài)分配的內存拷貝優(yōu)化如上所述,創(chuàng)建動態(tài)分配的方法時,每個子類都會繼承父類上定義的所有公共方法和受保護的方法。子類可覆蓋或擴展這些成員VIVI調用動態(tài)分配的
34、方法時,LabVIEW只有當運行時才知道將調用哪個方法。LabVIEW將優(yōu)化調用方VI的內存分配,并認為子類含有的任何成員VI的設置與父類中成員VI的設置相同。如父類VI的輸入為常量,調用方將認為在所有子類VI中輸入也是常量。如父類成員VI的輸入返回為輸出,調用方VI認為所有子類成員VI也會有相同的操作。如上述假設有誤,則優(yōu)化失敗。例如,如創(chuàng)建了一個成員VI,其中包含未改變的輸入。這將使調用方VI認為所有輸入都不改變,即使每次覆蓋都會改變部分或所有輸入。或者,如未將任何輸入連接至父類成員VI的輸出,調用方VI將認為沒有任何輸出與輸入共享內存,即使在相鄰的VI之間,上一個VI的輸出可能是下一個V
35、I的輸入oLabVIEW必須創(chuàng)建代碼來處理子類中導致優(yōu)化失敗的非預期行為。更好的優(yōu)化是指寫入父類VI時,在子類VI中發(fā)生盡可能一致的操作。創(chuàng)建一個動態(tài)分配方法,可使用元素同址操作結構明確表示各個接線端的作用。將元素同址操作結構放在父類的動態(tài)分配的VI中,然后將元素同址操作結構節(jié)點對置于元素同址操作結構中。這些節(jié)點對用于通知LabVIEW哪些輸入應連接至哪些輸出,哪些輸入應視為常量,哪些輸入應視為修改過的量。然后,LabVIEW開始優(yōu)化調用方VI。三、開發(fā)LabVIEW類從概念上來說,LabVIEW面向對象編程和其它面向對象編程語言相似。但由于LabVIEW是數據流圖形化編程環(huán)境,LabVIEW
36、對類數據的操作和交互,以及LabVIEW類代碼的調試方法和其它語言有所不同。LabVIEW中的對象由值來傳遞,而不是由引用來傳遞。LabVIEW按照簇和數組的操作規(guī)則創(chuàng)建對象的副本。構造函數和析構函數構造函數和析構函數在LabVIEW面向對象編程中是隱含的。不需要調用構造函數來對LabVIEW類數據進行初始化。每當需要對一個類進行初始化時,LabVIEW會調用一個默認的構造函數。通常情況下,類在前面板的相應控件或程序框圖的相應常量中初始化。LabVIEW用私有數據控件中設定的默認值來對類的值進行初始化。當LabVIEW不再需要LabVIEW類中的信息時,LabVIEW將以處理簇和數組同樣的方法
37、進行內存釋放。如需將類數據設定為其它值,必須創(chuàng)建一個成員VI以對類數據設定新值。例如,若在創(chuàng)建汽車類時,將其中齒輪數量的默認值設定為3,而又希望對卡車類從汽車類繼承而來的齒輪數量指派一個不同的值,這時就必須創(chuàng)建一個成員VI以改變汽車類的值。設置新值的另一種方法是:創(chuàng)建一個沒有輸入,以類為輸出的成員VI,將需要指派給齒輪數量的值設定在輸出類中,從而可創(chuàng)建一個以該輸出類為數據類型的程序框圖常量。平化和還原數據LabVIEW以平化數據的形式存儲數據。平化至字符串及從字符串還原函數可以處理所有的類數據類型。LabVIEW自動平化和還原數據。所有類型描述符保留了LabVIEW中已平化數據的類型,而Lab
38、VIEW類的平化數據本身不但保留了類型信息,而且保留了類的版本信息。由于LabVIEW類保留了用于還原LabVIEW類的相關信息,如果LabVIEW類因被移動或刪除而無法找到,LabVIEW將無法還原數據并將顯示錯誤信息。類似于LabVIEW丟失子VI時的情形,打開成員VI時,若某控件的LabVIEW類數據已丟失,該控件將變灰。斷開控件所對應的LabVIEW類被加載之后,數據將被還原而控件將不再被斷開。注:也可使用平化至XML和從XML還原函數處理類數據。實施數據變異若試圖向LabVIEW類控件中寫入數據的LabVIEW類比內存中的LabVIEW類版本更新,則被寫入的控件將發(fā)出警告。當LabV
39、IEW類私有數據控件的數據類型或類的繼承關系發(fā)生改變時,該類的版本號將被增大。通過類屬性對話框,可查看LabVIEW類的版本號。出現以下情況時,LabVIEW將自動增大類的版本號:LabVIEW類的繼承關系發(fā)生改變。LabVIEW類的私有數據控件發(fā)生改變。私有數據控件的改變包括:添加、替換、重新排序或刪除控件;改變控件的表示法;更新已修改的自定義類型。在新版本的LabVIEW中加載舊版本的LabVIEW類。通過類屬性對話框可手動增大類的版本號。遞增的版本號表示類版本的更新。若對一個類進行重命名,則LabVIEW將把該類當作一個新類,刪除該類的變異歷史,并將版本號重新設定為。執(zhí)行以下任意一種操作
40、時,LabVIEW類將被重命名:通過下拉菜單的文件另存為,對類進行重命名。將類移入所屬庫。將類移出所屬庫。重命名磁盤上的.lvclass文件。注:如不作任何改動,將類改回原來的類名,則改回原名的類和原類仍有所不同,因為原類的變異歷史已經丟失。例如,假設將汽車類重命名為“汽車#1類”,然后將類名從“汽車#1”改回“汽車”,則新的汽車類和原來的汽車類不再是同一個類。對使用LabVIEW類開發(fā)應用程序的LabVIEW類用戶來說,LabVIEW跟蹤LabVIEW類的版本號是很有用的。例如,假設應用程序中有一個LabVIEW類,該類的私有數據控件使用了無符號32位整型。然而,LabVIEW類開發(fā)人員發(fā)送
41、的某個版本的LabVIEW類中,私有數據控件中的數值控件變成了雙精度浮點型。由于LabVIEW跟蹤了版本的變化,并能對所有LabVIEW類的數據進行平化和還原,用戶可以直接用新版本替換舊版本,不必作任何修改即可運行程序。注:如將數據從某個LabVIEW類的未來版本還原,LabVIEW將返回錯誤。例如,當內存中某個LabVIEW類的版本號為,而數據的版本號為時,將可能出現該錯誤。LabVIEW采取如下方式處理LabVIEW類不同版本數據的變異:如從LabVIEW類層次結構中移除一些類,則LabVIEW將從原來的類層次結構中刪除這些類的平化數據。例如,假設類C繼承了類B,而類B繼承了類A。如將類C
42、更改為直接繼承類A,則LabVIEW將刪除類C中來源于類B的平化數據。如在LabVIEW類層次結構中添加新層,則LabVIEW將把被添加類的默認數據插入到原來的類層次結構中。例如,假設類C和類B都繼承了類A。如將類C更改為繼承類B,則LabVIEW將對類C插入類B的默認數據。如在類私有數據簇的末尾(按tab鍵順序)添加一個元素,則LabVIEW將還原舊的數據并添加類的默認數據。如在類私有數據簇中刪除一個元素并且不添加任何新元素,則LabVIEW將還原舊的數據并刪除該元素相關的信息。如改變類私有數據簇的tab鍵順序,則LabVIEW將對還原后的相應數據進行重新排序。如在同一次修改中添加、刪除、替
43、換或重新排序類的私有數據簇,LabVIEW將創(chuàng)建并執(zhí)行一個過程,通過合并以上步驟對數據實施相應的變異操作。LabVIEW類不同版本的變異總是按順序(例如從版本到)實施的。注:當類的版本號增大以后,將無法對LabVIEW類進行恢復。由于沒有足夠的信息,LabVIEW無法撤消LabVIEW類的輸入和顯示控件中數據的更改。如需恢復當前的更改,請不要保存任何更改。卸載該類及所有引用該類的VI,然后從磁盤重新加載該類。關于編輯LabVIEW類時,LabVIEW進行數據變異的詳細信息,見的技術支持文檔。3.4強制轉換LabVIEW類通過轉換為通用的類函數可將LabVIEW類向上轉換;通過轉換為特定的類函數
44、可將LabVIEW類向下轉換。這些函數還可用于對包含繼承層次結構的引用數據類型(例如VI服務器控件引用)進行操作,功能是一樣的。使用“轉換為通用的類”函數并不改變數據,但傳遞數據的連線類型將被改變。但是,該函數在VI運行時不起作用。對那些按照嚴格代碼規(guī)范需要避免數據轉換的程序員而言,“轉換為通用的類”函數提供了一種消除強制轉換點的方法。“轉換為特定的類”函數不改變數據,除非出現錯誤。如運行時連線上的數據不是更為特定的類,則該函數將返回一個錯誤并且輸出數據將是連線類型的默認值?!稗D換為特定的類”函數的主要用途是對父類的值作類型檢查。通常程序員將同一個父類連接到多個“轉換為特定的類”函數,每一個連
45、線導向一個更為特定的類,哪一個“轉換為特定的類”函數不報錯,便執(zhí)行該函數之后的代碼,從而實現根據類型檢查結果運行不同的代碼。這種方法相當低效。如需用這種方法作類型檢查,并擁有修改父類的權限,可在父類添加一個動態(tài)成員VI,并讓每一個子類根據功能需要重寫這個動態(tài)成員VI。如LabVIEW在運行時檢測到用戶將子類對象連接至接受父類對象的子VI,LabVIEW將自動把子VI輸出向下轉換為子類對象。自動向下轉換不必使用“轉換為特定的類”函數。但是,只有LabVIEW確保連接至子VI的類對象與子VI接受的輸入兼容時,自動向下轉換才發(fā)生。例如,如將類對象保存在變體中,然后將變體數據連接至子VI,LabVIE
46、W不能確保子VI包含的數據與變體原本存儲的數據為同一種類型。使用保留運行類函數幫助LabVIEW檢查連接至子VI的類對象與子VI接受的類對象為兼容對象。如兩個對象不兼容,函數將返回錯誤,并將類的輸出數據設置為子VI接受的父對象。也可將該函數與數據值引用配合使用。數據值引用讀取/寫入元素邊框節(jié)點必須預留運行類型??墒褂谩氨A暨\行類”函數檢查連接至“數據值引用寫入”節(jié)點的類對象是否與連接至“數據值引用讀取”邊框節(jié)點的類對象相互兼容。注:LabVIEW無法自動向下轉換遞歸子VI。如在動態(tài)分配VI的程序框圖上或在元素同址結構中調用遞歸子VI傳遞數據值引用時,自動向下轉換會引起調用VI的斷開。在遞歸子VI的程序框圖上使用“保留運行類”函數,驗證連接至子VI的類與子VI接受的類是兼容的。如兩個類兼容,在遞歸鏈之外調用VI不會使VI斷開。3.5鎖定和解除鎖定LabVIEW類通過鎖定LabVIEW類可阻止LabVIEW類用戶查看那些作為應用程序內部實現的成員VI。鎖定LabVIEW類可防止對私有成員VI的訪問,從而預防引入應用程序的
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- Pyridyl-disulfide-Dexamethasone-生命科學試劑-MCE-7118
- 2025年度生姜種植與鄉(xiāng)村旅游融合發(fā)展合作協(xié)議
- 二零二五年度解除勞動合同經濟補償標準與法律依據合同
- 二零二五年度小微企業(yè)貸款服務合同
- 2025年度門頭制作施工與綠色建筑認證服務合同
- 2025年度幼兒園品牌授權與技術轉讓合作協(xié)議
- 二零二五年度質押式回購證券化合同模板
- 二零二五年度勞動合同終止證明及競業(yè)禁止合同
- 老年人長期護理保險中對于慢病包括慢腎病的分層次管理體系探索與實踐
- 中小企業(yè)勞動合同標準格式參考
- 2025年湖南高速鐵路職業(yè)技術學院高職單招高職單招英語2016-2024歷年頻考點試題含答案解析
- 醫(yī)保政策與健康管理培訓計劃
- 策略與博弈杜塔中文版
- 無人化農場項目可行性研究報告
- 2024屆上海市金山區(qū)高三下學期二模英語試題(原卷版)
- 學生春節(jié)安全教育
- GA/T 1280-2024銀行自助設備安全性規(guī)范
- 2024-2025年校長在教研組長和備課組長會議上講話
- 2025屆江蘇省常州市高級中學高三第二次模擬考試語文試卷含解析
- 高三日語一輪復習助詞「で」的用法課件
- 保險業(yè)消費者權益保護工作計劃
評論
0/150
提交評論