




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、Labview面向?qū)ο缶幊炭焖偃腴T一、類和對象的基本概念在面向?qū)ο缶幊讨?,類用來表示通用特性。例如,假設(shè)有一個描述汽車的類。類中定義了各種汽車的通用特性。對象是類的特定實例。汽車類的一個對象,可以是某一輛特定的汽車。類的定義決定該汽車(對象)的行為。類中定義了和對象相關(guān)的數(shù)據(jù)和方法。仍以汽車為例。世界上有許多類型的汽車。汽車可分為轎車、卡車、公共汽車等不同類別。汽車的車身上有車門,排擋上有齒輪。車門和齒輪的數(shù)量信息都是汽車的相關(guān)數(shù)據(jù)。汽車還可加速或剎車。加速或剎車都是汽車的行為(或稱為方法)。汽車相關(guān)的數(shù)據(jù)和方法,構(gòu)成了汽車類的定義。通過類的創(chuàng)建,可定義對象的數(shù)據(jù)和方法。下圖示范了汽車類在La
2、bVIEW中的表示。LabVIEW將汽車類的數(shù)據(jù)存儲在Vehicle.ctl中,將汽車的方法存儲在StartVehicleVI和StopVehicleVI兩個VI中。對象是類的特定實例。指定的某一輛汽車是汽車類的一個特定實現(xiàn),或稱為汽車類的一個對象。下列MainVI的程序框圖中,有一個汽車類的對象。對象包含哪些數(shù)據(jù)和方法,是通過類來定義的oLabVIEW將類的數(shù)據(jù)存儲在一個控件中,用戶創(chuàng)建的成員VI即是LabVIEW類的方法。為使LabVIEW面向?qū)ο缶幊痰母拍罡鼮榍逦赏ㄟ^如下方式區(qū)分LabVIEW類的不同用戶:LabVIEW類開發(fā)人員一開發(fā)LabVIEW類,以供其他開發(fā)人員及程序員使用。
3、LabVIEW類開發(fā)人員適合擁有面向?qū)ο缶幊探?jīng)驗的人員擔(dān)當(dāng)。LabVIEW類開發(fā)人員必須理解LabVIEW類及其機制。LabVIEW類用戶一使用LabVIEW類開發(fā)人員所創(chuàng)建的類。LabVIEW類用戶可以在應(yīng)用程序中利用面向?qū)ο缶幊痰膬?yōu)勢,但無需了解類的運行機制,LabVIEW類用戶不一定有面向?qū)ο缶幊痰慕?jīng)驗。LabVIEW類開發(fā)人員發(fā)布類之后,LabVIEW類用戶可能不具備訪問該類內(nèi)部操作的權(quán)限。LabVIEW類開發(fā)人員對LabVIEW類所作的修改,應(yīng)極少影響LabVIEW類用戶所開發(fā)的應(yīng)用程序。LabVIEW類用戶無需了解如何創(chuàng)建LabVIEW類,但必須了解應(yīng)用程序中通過類定義的數(shù)據(jù)類型應(yīng)
4、當(dāng)如何使用,涉及LabVIEW類的代碼有哪些可用于調(diào)試的信息,以及LabVIEW類的新版本將如何影響已經(jīng)生成的應(yīng)用程序。在只需使用現(xiàn)有的LabVIEW類而無需對LabVIEW類進行開發(fā)的情況下,可參考在應(yīng)用程序中使用LabVIEW類,學(xué)習(xí)如何使用其他開發(fā)人員所提供的LabVIEW類。二、在LabVIEW中創(chuàng)建類通過創(chuàng)建LabVIEW類,可在LabVIEW中創(chuàng)建用戶定義的數(shù)據(jù)類型。LabVIEW類定義了對象相關(guān)的數(shù)據(jù)和可對數(shù)據(jù)執(zhí)行的操作(即方法)。通過封裝和繼承可創(chuàng)建模塊化的代碼,使代碼更易修改而不影響應(yīng)用程序中的其它代碼。在LabVIEW中,類的數(shù)據(jù)是私有的,也就是說,只有類的成員VI才有權(quán)限
5、訪問該數(shù)據(jù)。類的數(shù)據(jù)可在私有數(shù)據(jù)控件中定義。創(chuàng)建和保存LabVIEW類時,LabVIEW將創(chuàng)建一個類庫文件(.lvclass),其中定義了新的數(shù)據(jù)類型。類庫文件記錄了私有數(shù)據(jù)控件和所有被創(chuàng)建的成員VI的信息,比如VI列表以及VI各自的不同屬性。類庫和項目庫(.lvlib)相似。不同的是,類庫定義了新的數(shù)據(jù)類型。私有數(shù)據(jù)控件對應(yīng)唯一的類庫文件,其中為新的數(shù)據(jù)類型定義了一簇數(shù)據(jù),該簇也是類連線上的數(shù)據(jù)。LabVIEW的私有數(shù)據(jù)控件并不保存在磁盤上,而是保存在類庫文件中。由于在類庫文件中保存私有數(shù)據(jù),不符合類定義的私有數(shù)據(jù)一定不會被使用。提示:如需保存類庫文件、類成員VI,以及類自定義默認探針,可在
6、磁盤上創(chuàng)建一個和LabVIEW類同名的目錄,將屬于該類庫的文件保存在該目錄中。如同一目錄中包含了多個屬于不同類庫的文件,那么在不同類庫中添加相同名稱的VI時將產(chǎn)生沖突。在開發(fā)過程中重寫動態(tài)成員VI將產(chǎn)生命名沖突。封裝每個LabVIEW類包括一個數(shù)據(jù)簇和用于讀寫該簇的方法。LabVIEW類的數(shù)據(jù)是私有的,對于不是該類成員的VI來說是隱藏的。如需訪問類的私有數(shù)據(jù),必須創(chuàng)建方法,即創(chuàng)建該類的成員VI,通過成員VI中的函數(shù)對私有數(shù)據(jù)執(zhí)行操作。封裝就是將數(shù)據(jù)和方法合并到一個類中,類中數(shù)據(jù)僅可由類的成員VI訪問。通過封裝可創(chuàng)建模塊化代碼,有利于方便地更新或修改代碼而不影響應(yīng)用程序中其它部分的代碼。類中的數(shù)
7、據(jù)是私有的,但成員VI卻可以按不同的程度公開。方法的設(shè)置訪問范圍選項可以有如下設(shè)置:公共一任何VI都可將該成員VI作為子VI調(diào)用。庫內(nèi)一只有同類中的VI、類的友元或類的友元庫中的VI可以調(diào)用庫內(nèi)成員VI。在項目瀏覽器窗口中,庫內(nèi)成員VI圖標(biāo)中有一個深藍色的鑰匙符號。保護一僅該成員VI所在的類及其子類中的VI可以調(diào)用該成員VI。在項目瀏覽器窗口中,受保護的成員VI圖標(biāo)中有一個暗黃色的鑰匙符號。私有一僅該成員VI所在類中的VI可以調(diào)用該成員VI。在項目瀏覽器窗口中,私有成員VI圖標(biāo)中有一個紅色的鑰匙符號。未指定僅當(dāng)選中一個文件夾時,顯示該選項。文件夾的訪問范圍未指定時,其訪問范圍默認為公共。默認情
8、況下,如未對類中的文件指定訪問范圍,則這些文件夾的訪問范圍為公共。注:如指定文件夾的訪問選項,則訪問設(shè)置適用于文件夾下的所有文件,并將覆蓋各個文件的原有設(shè)置。注意:如將動態(tài)分配VI設(shè)置為庫內(nèi),這些VI將無法運行。為友元創(chuàng)建一個靜態(tài)分配的包裝VI,調(diào)用該包裝VI并將其設(shè)置為庫內(nèi),以此向友元賦予訪問受保護動態(tài)分配VI的訪問權(quán)限。分配庫的友元將一個VI分配為庫的友元,即是給予該VI調(diào)用庫內(nèi)任何成員VI的權(quán)限。也可分配一個庫作為庫的友元。友元關(guān)系不具有傳遞性。例如,如第一個庫分配第二個庫為友元,第二個庫分配第三個庫為友元,第三個庫不能作為第一個庫的友元。除非第一個庫將第三個庫作為友元,第三個庫無法訪問
9、第一個庫的VI。如訪問權(quán)限在庫內(nèi)的庫指定某個類為友元,該類的成員VI可訪問庫的VI,但是友元關(guān)系不延展至類的子孫類??蓜?chuàng)建一個在LabVIEW類之外的VI,將公共成員VI作為子VI在程序框圖上使用。公共成員VI允許用戶操作類的私有數(shù)據(jù)。用戶可在成員VI的程序框圖上使用私有和受保護的成員VI操作LabVIEW用戶不可見的類私有數(shù)據(jù)。獨立于類的VI可作為類的友元,友元VI可調(diào)用庫內(nèi)的成員。對類的入口點進行限制,可減少對數(shù)據(jù)引入錯誤的機會,更便于調(diào)試代碼。定義私有數(shù)據(jù)控件創(chuàng)建LabVIEW類時,LabVIEW將自動創(chuàng)建類的私有數(shù)據(jù)控件。請注意在下列項目瀏覽器窗口中,LabVIEW類的圖標(biāo)是一個有色立
10、方體。該立方體用于代表一個LabVIEW類。私有數(shù)據(jù)控件的圖標(biāo)是一個帶有綠色圓柱體的有色立方體。圓柱體用于代表數(shù)據(jù)存儲。同時,私有數(shù)據(jù)控件的圖標(biāo)中有一個紅色鑰匙符號,表示該控件是私有的。斶項目瀏覽賽-LabVIETClasses,lvproj回商文件端輯查看迪項目迅)挨作工具)窗口Elit目同創(chuàng)IX需慈嚏|囲-項立件日嵐項目-ga廠Y:-L”百:LabVIEWClisseE.IwprojE的電腦Vehicle.1vc1s.eeVehicle,allStartVeh.itie.vi+”StopYahicle.vi依賴關(guān)系程序生成規(guī)范通過控件編輯器窗口可對類的私有數(shù)據(jù)控件進行自定義。在項目瀏覽器窗
11、口中雙擊類的私有數(shù)據(jù)控件,即可打開“控件編輯器”窗口??蓪㈩愃接袛?shù)據(jù)的簇中的輸入控件和顯示控件放置到LabVIEW類的定義私有數(shù)據(jù)控件中。為放置輸入控件和顯示控件中的輸入控件設(shè)置的默認值為類的默認值。注意:私有數(shù)據(jù)控件不能包含XControl或XControl引用句柄。以下范例中,汽車類的數(shù)據(jù)類型包含齒輪數(shù)量、車門數(shù)量和顏色三個數(shù)值,以及制造和型號兩個字符串。西|裘私有數(shù)曲頤色111112Pt應(yīng)用程序字體jgT|Vehicle,ctlVehicle,lvclass的魁有數(shù)據(jù)(LabVIEWClasses-回因文件電)編輯查看遡項目操作迪)工具窗口址)幫助空L命VIEW口出羽.1燈“丿我的電胞|
12、電類私有數(shù)據(jù)的堿制造型號車門數(shù)量齒槍數(shù)量注意:如類中不需要任何私有數(shù)據(jù),類私有數(shù)據(jù)的簇中可以不設(shè)定任何數(shù)據(jù)。用戶可創(chuàng)建在前面板或程序框圖上代表類的圖標(biāo)。單擊類屬性對話框常規(guī)設(shè)置頁的編輯按鈕,打開圖標(biāo)編輯器對話框。創(chuàng)建類圖標(biāo)后,LabVIEW將把類圖標(biāo)應(yīng)用于類的所有對象。修改類中各個對象的圖標(biāo)。2.3創(chuàng)建成員VI通過創(chuàng)建成員VI(或稱創(chuàng)建方法),可對類的私有數(shù)據(jù)執(zhí)行操作。成員VI是LabVIEW類的方法。在LabVIEW類中創(chuàng)建,并在項目瀏覽器窗口中該類的私有數(shù)據(jù)控件下出現(xiàn)的VI,是該類的成員VI。LabVIEW將類的數(shù)據(jù)定義為一個簇。所有成員VI都可對類數(shù)據(jù)的簇進行讀寫。LabVIEW為創(chuàng)建用
13、于訪問簇中各元素的VI提供了捷徑。這種訪問器VI是LabVIEW類的成員,可對類數(shù)據(jù)進行讀寫操作。如創(chuàng)建一個訪問器VI以讀取類數(shù)據(jù),LabVIEW將取消對類數(shù)據(jù)的綁定,如下圖所示。Vehicle.Lvclassmelicle.IvclassDut錯誤輸入(無諸誤)齒輪數(shù)量錯誤輸出如創(chuàng)建用于寫入類數(shù)據(jù)的訪問器VI,LabVIEW將把新值綁定至類數(shù)據(jù),如下圖所示。也可使用解除捆綁或按名稱解除捆綁函數(shù),在成員VI的程序框圖中對類的私有數(shù)據(jù)解除捆綁。使用捆綁或按名稱捆綁函數(shù)可在訪問和操作私有數(shù)據(jù)之后將數(shù)據(jù)重新捆綁成簇。由于類的數(shù)據(jù)是私有的,若試圖在非該類成員VI的程序框圖中通過“捆綁”和“解除捆綁”節(jié)
14、點訪問該類數(shù)據(jù),節(jié)點將自動斷開無法運行。注:建議盡量使用“按名稱捆綁”和“按名稱解除捆綁”函數(shù)替代“捆綁”和“解除捆綁”函數(shù),以免在私有數(shù)據(jù)的簇中插入新元素時VI斷開。如寫入成員VI的操作將取消捆綁某個值,修改該值然后將值捆綁至對象,可使用元素同址操作結(jié)構(gòu),在結(jié)構(gòu)兩邊放置解除捆綁和捆綁函數(shù),以實現(xiàn)更高的效率。該結(jié)構(gòu)可保證LabVIEW使用了某些內(nèi)存優(yōu)化技術(shù)。使用常規(guī)取消捆綁和捆綁節(jié)點時也可使用該內(nèi)存優(yōu)化的方法。但是,在復(fù)雜VI的情況下,LabVIEW編譯器可能會認為優(yōu)化不夠安全而拒絕使用優(yōu)化算法,導(dǎo)致運行速度變慢。元素同址操作結(jié)構(gòu)保證了這些優(yōu)化算法的安全性,確保VI按優(yōu)化算法運行??赏ㄟ^各種方
15、式創(chuàng)建成員VI。右鍵單擊類并在以下快捷菜單項中選擇:新建VI打開一個空的成員VI。新建屬性定義文件夾創(chuàng)建一個屬性定義文件夾,可在其中創(chuàng)建或添加現(xiàn)有成員VI。如LabVIEW類包含一個屬性定義文件夾,可將LabVIEW類連接至屬性節(jié)點訪問私有數(shù)據(jù)。新建基于動態(tài)分配模板的VILabVIEW將生成一個新成員VI,該VI帶有錯誤輸入簇、錯誤輸出簇、一個用于錯誤處理的條件結(jié)構(gòu),以及輸入LabVIEW類和輸出LabVIEW類。在VI連線板上,LabVIEW將輸入和輸出接線端都設(shè)置為動態(tài)。新建基于靜態(tài)分配模板的VILabVIEW將生成一個新成員VI,該VI帶有錯誤輸入簇、錯誤輸出簇、一個用于錯誤處理的條件結(jié)
16、構(gòu),以及輸入LabVIEW類和輸出LabVIEW類。與創(chuàng)建動態(tài)分配VI相反,LabVIEW不將動態(tài)分配VI的連線板上的輸入和輸出接線端設(shè)置為動態(tài)。新建用于數(shù)據(jù)成員訪問的VI打開創(chuàng)建訪問器對話框。通過該對話框快速創(chuàng)建用于訪問LabVIEW類數(shù)據(jù)的成員VI。注:使用該選項之前必須先保存新建的LabVIEW類。如未保存新類,LabVIEW將用于數(shù)據(jù)成員訪問的VI選項灰暗顯示。新建用于重寫的VI創(chuàng)建一個重寫祖先類成員VI的成員VI。LabVIEW使用父VI的圖標(biāo)對子類的圖標(biāo)進行覆蓋,創(chuàng)建新VI的圖標(biāo)。注:若不存在可重寫的有效成員VI,LabVIEW將禁用新建用于重寫的VI選項。更多關(guān)于“動態(tài)VI”和“
17、重寫”的信息見繼承一節(jié)。右鍵單擊前面板或程序框圖上的常量或控件,從快捷菜單中選擇顯示類庫,在項目瀏覽器窗口高亮顯示相關(guān)類。如當(dāng)前類不屬于某個LabVIEW項目,LabVIEW將打開一個類窗口顯示該類。類私有數(shù)據(jù)的簇11!短車廂?文件編輯迅)查看迪項目遼操作工具窗口粘助12pt対話框字懷四輪驅(qū)動?耒命名項目“我的電腦STruck,ctlTruck,lvclass的權(quán)有數(shù)據(jù)(未奇名項號1/我的電施)祖先類的數(shù)據(jù)是私有的,必須使用祖先類提供的函數(shù)(成員VI)才能修改這些數(shù)據(jù)。子孫類的成員VI可以調(diào)用祖先類任何“公共”型的成員VI,就像調(diào)用LabVIEW中的其它VI樣。子孫類的成員VI也可以調(diào)用祖先類
18、“保護”型的成員VI。若指定一個祖先類成員VI為“保護”型,則其任何子類的成員VI可以調(diào)用其方法,但該類繼承層次結(jié)構(gòu)以外的任何其它VI都不能調(diào)用其方法。如需訪問卡車類從汽車類繼承而來的齒輪數(shù)量,可在汽車類中創(chuàng)建一個“公共”型或“保護”型的成員VI,比如GetGears.vi。在GetGears.vi的程序框圖中可對汽車類解除捆綁,從而得到齒輪數(shù)量。然后將齒輪數(shù)量分配到連線板的一個輸出接線端,用這種方法,汽車類的子孫類(例如,卡車類)就可訪問汽車類的某個私有數(shù)據(jù)(例如,齒輪數(shù)量)了。在汽車類中創(chuàng)建訪問數(shù)據(jù)成員的成員VI,即可訪問齒輪數(shù)量。創(chuàng)建成員VI時,勾選創(chuàng)建訪問器對話框的通過屬性節(jié)點實現(xiàn)復(fù)選
19、框。然后,將卡車類連接至屬性節(jié)點,右鍵單擊屬性接線端并選擇選擇屬性齒輪數(shù)量。注:LabVIEW類不可調(diào)用另一個LabVIEW類的“私有”型成員VI,即使是父類,也無法調(diào)用其子類的私有成員VI。類的“私有”成員VI只能由這個類的其它成員VI在程序框圖中調(diào)用。LabVIEW對象短語LabVIEW對象是一個特定的類的名稱。LabVIEW面向?qū)ο缶幊讨?,LabVIEW對象是繼承樹的根類。默認狀態(tài)下,所有LabVIEW類都是從“LabVIEW對象”繼承而來的。通過“LabVIEW對象”創(chuàng)建的VI,能對多個LabVIEW類執(zhí)行通用的操作。例如,可創(chuàng)建一個由若干LabVIEW類構(gòu)成的數(shù)組,該數(shù)組的類型是某個
20、基類,數(shù)組中的數(shù)據(jù)可以是這個基類或它的任何子孫類類型的元素,因此數(shù)組中的數(shù)據(jù)是異構(gòu)的。如果一個數(shù)組的類型為“LabVIEW對象”,則該數(shù)組可包含汽車類、卡車類和保齡球類。保齡球類并不是從汽車類或卡車類繼承而來的,因此LabVIEW將創(chuàng)建一個通用于這些類的最近的祖先基類,此處便以“LabVIEW對象”為基類。下圖顯示了汽車類數(shù)組,一個包含汽車類和卡車類的數(shù)組。由于卡車類是從汽車類繼承而來的,汽車類就是通用于這兩個類的最近的祖先基類。該圖還顯示了包含“LabVIEW對象”類、汽車類、卡車類和保齡球類的LabVIEW對象數(shù)組。保齡球類不是從汽車類或卡車類繼承而來的,但所有的這三個類都是從“LabVI
21、EW對象”這個根類繼承而來,因此LabVIEW對象數(shù)組的類型是“LabVIEW對象”。Ho-terocenouEArray,vl甬面板*|口/;HeteiogenousArray=程序框圉*0S主件迪翳w萱看也)項目操件工具:囲j文件編輯奩看邊項目操作迪工具(1|令|蠻|冋|12鞏應(yīng)用程序那應(yīng)Vekiclclvclhee汽車數(shù)蛆Vehicle.IvcI&eeTruck,lrdassIrnck.lycl:iE5vLe沁c_e類是汽車數(shù)淚的共體,所付掃出笛蛆的斟據(jù)類型是壯hide設(shè)置繼承默認狀態(tài)下,所有LabVIEW類都是從“LabVIEW對象”繼承而來的。如果要更改一個類的繼承關(guān)系,必須在創(chuàng)建該
22、類之后更改繼承。通過類屬性對話框,可設(shè)置類的繼承關(guān)系和其它選項。在LabVIEW類層次結(jié)構(gòu)窗口中,可查看LabVIEW類的層次結(jié)構(gòu)。類繼承的層次結(jié)構(gòu)可包括下列類型的類。父類一供其它LabVIEW類繼承數(shù)據(jù)、“公共”型成員VI和“保護”型成員VI的LabVIEW類。子類一繼承父類的公共和受保護成員VI的LabVIEW類。除非父類提供訪問VI,否則子類不繼承父類的私有數(shù)據(jù)。兄弟類一和一個LabVIEW類繼承同一個父類的另一個LabVIEW類。祖先類個LabVIEW類的上一層(父類)、上二層(父類的父類)、上三層等等?!癓abVIEW對象”是所有LabVIEW類的始祖。子孫類一一個LabVIEW類的
23、下一層(子類)、下二層(子類的子類)、下二冃竺竺連線外觀類定義了新的數(shù)據(jù)類型。在程序框圖中,通過類定義的數(shù)據(jù)類型采用默認的LabVIEW類連線外觀,或者繼承父類的連線外觀。通過類屬性對話框可對LabVIEW類更改連線外觀。適當(dāng)?shù)馗牟煌琇abVIEW類的連線外觀,可提高程序框圖的可讀性。而使用過多的連線色彩和連線模式將破壞程序框圖的可讀性。下圖左側(cè)顯示了LabVIEW內(nèi)置的連線外觀,右側(cè)顯示了自定義連線外觀的樣例。LabVI珊對象跌認連線:外觀認仏用戶可為創(chuàng)逹的類自定義連線外觀區(qū)線樣本1.1vcl陌eLabVIIEW對象2-Q-Q-Q-Q-Q-Q4連線樣本E.IvcXse獻認連線外觀-lwla
24、次ELabVI珊對愿的內(nèi)置連線與用P創(chuàng)連類的默認連線祥式之出敦瘞線樣走l.lvclass2連線樣走Z-lvclass2E連蛭祥本3.1vclass2連線樣本S.lvclass關(guān)于在LabVIEW中避免過多連線和色彩的技巧,見LabVIEWStyleChecklist。2.8動態(tài)和靜態(tài)分配成員VI方法是在對象上執(zhí)行的操作。在LabVIEW面向?qū)ο缶幊讨?,方法是用戶?chuàng)建的成員VI。成員VI在LabVIEW類的數(shù)據(jù)上進行運算。某些方法可用單個VI定義。這些方法稱為靜態(tài)分配方法,因為LabVIEW每次調(diào)用的是同一個VI。有時也可在類層次結(jié)構(gòu)的多個VI中定義同名的方法。這些方法稱為動態(tài)分配方法,因為直到
25、運行才可確定LabVIEW調(diào)用的是哪一個VI。動態(tài)分配方法和多態(tài)VI類似:多態(tài)VI根據(jù)連入數(shù)據(jù)的類型來確定調(diào)用哪一個VI;動態(tài)分配方法在運行時根據(jù)輸入接線端到達的數(shù)據(jù)確定調(diào)用類層次結(jié)構(gòu)中的哪一個VI。通過設(shè)置成員VI的連線板,成員VI既可指派為靜態(tài),也可指派為動態(tài)。若連線板上包含一個動態(tài)分配的輸入接線端,則該成員VI是動態(tài)分配方法的一部分。如連線板上沒有動態(tài)分配輸入接線端,則該成員VI定義了一個靜態(tài)分配方法。一個LabVIEW類繼承另一個LabVIEW類時,子類將繼承父類中定義的所有“公共”和“保護”型的方法。通過在子類中創(chuàng)建和父類成員VI相同名稱的成員VI,可定義該方法的子類實現(xiàn)。由于Lab
26、VIEW通過單個VI定義靜態(tài)分配方法,子類成員VI的名稱不可與祖先類的靜態(tài)分配成員VI的名稱相同。例如,當(dāng)父類“汽車”中包含了“開門”VI這一靜態(tài)分配成員VI,則子類“卡車”便無法將名為“開門”的VI作為其成員VI。由于“卡車”從“汽車“繼承了其成員VI,故“開門”VI這一方法已在“卡車”上定義。如在程序框圖中將靜態(tài)分配方法作為子VI調(diào)用,則調(diào)用這些靜態(tài)分配方法和調(diào)用普通子VI沒有任何區(qū)別。對一個方法可定義多個動態(tài)VI,可在繼承層次結(jié)構(gòu)中的每一層對該方法定義一個動態(tài)分配VI。如動態(tài)分配成員VI在父類中定義,且也在子類中定義,則子類的執(zhí)行將覆蓋或擴展父類的執(zhí)行。在以下范例中,“汽車”類和“卡車”
27、類都定義了動態(tài)分配方法SetMakeVI。若在程序框圖中將一個動態(tài)分配VI作為子VI調(diào)用,在編輯狀態(tài)下,該節(jié)點和一般子VI調(diào)用沒有區(qū)別。然而如果運行VI,則流入動態(tài)分配輸入接線端的數(shù)據(jù)將決定LabVIEW會調(diào)用類層次結(jié)構(gòu)中的哪一個動態(tài)成員VI。LabVIEW類連線可傳遞本身及任意子類所允許的數(shù)據(jù)類型,不同的數(shù)據(jù)類型被定義了不同的成員VI,該節(jié)點將根據(jù)連線上的數(shù)據(jù)類型執(zhí)行相應(yīng)的動態(tài)分配VI。閱讀下列范例。只有SetMakeVI的“汽車”類在主VI的程序框圖上。第一次循環(huán)時,由于“汽車”類的數(shù)據(jù)在類連線上,故LabVIEW執(zhí)行SetMakeVI的“汽車”類。第二次循環(huán)時,由于“卡車”類的數(shù)據(jù)在類連
28、線上,故LabVIEW執(zhí)行SetMakeVI的“卡車”類。如父類定義了一個動態(tài)分配VI但是不提供該VI的執(zhí)行,每個子類必須覆蓋其父VI。在許多情況下,用戶需提供父類VI的有意義的動作。例如,如有一個Shape類,定義AreaVI。AreaVI返回Shape對象的面積。沒有一個公式可計算任意形狀的面積。所以,每個繼承類必須用相應(yīng)的面積計算公式覆蓋AreaVI。如創(chuàng)建了一個子類Circle,子類Circle就必須提供一個AreaVI,計算pi*radius*radius。如不定義父類VI的執(zhí)行,父VI就僅僅是所有覆蓋VI必須匹配的連線板和VI屬性。每個子類必須提供一個類似的覆蓋VI。要確保LabV
29、IEW強制執(zhí)行該要求,可在父類中標(biāo)示VI為子類必須覆蓋的VI。一些子類可能無法覆蓋成員VI的功能。例如,如Shape類有子類Quadrilateral,無法提供四邊形面積計算公式,除非知道四邊形為特定類型的四邊形。用戶可使Quadrilateral類遷移覆蓋要求至其子類,以避免在Quadrilateral類中創(chuàng)建AreaVI的空執(zhí)行。右鍵單擊子類,從快捷菜單中選擇屬性,打開對象屬性對話框。在繼承頁上,勾選將全部重寫要求傳遞至子孫類復(fù)選框。LabVIEW將要求Quadrilateral的所有子類(例如,梯形和矩形)覆蓋AreaVI。要求子孫類覆蓋父類成員VI對成員VI的運行沒有影響。注:LLB無
30、法包含同名文件。因此,若類層次結(jié)構(gòu)中存在同名的動態(tài)成員VI,這些VI不可放置在同一個LLB中。注:如子類的VI覆蓋了父類的VI,子類的VI必須和父類的VI在以下方面吻合:重入設(shè)置、首選執(zhí)行設(shè)置、優(yōu)先級設(shè)置、連線板接線端、連線板模式,以及訪問范圍。雙擊程序框圖上的一個動態(tài)分配子VI以顯示選擇實現(xiàn)對話框。通過該對話框可查看當(dāng)前內(nèi)存中動態(tài)分配子VI的所有實現(xiàn),然后將該子VI的一個或多個實現(xiàn)打開。如選擇新建重寫VI而創(chuàng)建一個VI以覆蓋一個動態(tài)分配成員VI的父實現(xiàn),則將創(chuàng)建另一個動態(tài)分配成員VI,因為重寫父類成員VI的VI與其父類VI同名且具有動態(tài)分配接線端。LabVIEW會自動將調(diào)用父類方法節(jié)點和正確
31、的動態(tài)分配輸入和輸出類接線端及其它匹配祖先類VI所需的接線端放在程序框圖上。若不存在可重寫的祖先類成員VI,則LabVIEW將禁用重寫VI選項。2.9動態(tài)分配輸出右鍵單擊連線板上的輸出接線端并選擇動態(tài)分配輸出(推薦),可將LabVIEW類的輸出接線端標(biāo)記為動態(tài)。將一個含有動態(tài)分配輸出端的VI作為子VI調(diào)用時,動態(tài)分配輸出端的數(shù)據(jù)將轉(zhuǎn)換為與動態(tài)分配輸入端相同的類型。例如,將汽車類連接到一個動態(tài)分配輸入接線端,則該成員VI的輸出數(shù)據(jù)類型將和輸入數(shù)據(jù)類型相同,即為汽車類類型。動態(tài)分配輸入端和動態(tài)分配輸出端之間的數(shù)據(jù)是可修改的。然而,為了確保LabVIEW類運行時的安全,動態(tài)分配輸入端的數(shù)據(jù)必須流入所
32、有動態(tài)分配輸出端。同時,為了確保LabVIEW僅從動態(tài)分配輸入端讀取一次,僅向動態(tài)分配輸出端寫入一次,不可將動態(tài)的程序框圖接線端放置在結(jié)構(gòu)之中。注:調(diào)試動態(tài)分配成員VI時,可檢查動態(tài)分配輸入端和動態(tài)分配輸出端之間的連線是否出錯。若一條連線從動態(tài)輸入出發(fā),且未通過任何能改變運行時數(shù)據(jù)類型的函數(shù),則該連線的背景顏色將是灰色而不是通常的白色。若該連線通過一個能改變其數(shù)據(jù)類型的函數(shù),則連線的背景顏色將變成紅色。為使動態(tài)輸出正常運作,不可改變LabVIEW類的數(shù)據(jù)類型。若已知成員VI的程序框圖中LabVIEW類的輸出數(shù)據(jù)類型不同于輸入數(shù)據(jù)類型,則須確保連線板上的LabVIEW類動態(tài)輸出接線端設(shè)置為推薦而
33、不是動態(tài)分配輸出(推薦)。例如,若LabVIEW類的輸入是汽車類而輸出是卡車類,則必須改變連線板上LabVIEW類的默認接線端。此外,也可從空VI創(chuàng)建成員VI,此時可手動設(shè)定連線板接線端。注:如在一個有動態(tài)分配輸入和動態(tài)分配輸出的成員VI中使用條件結(jié)構(gòu)或事件結(jié)構(gòu),不能在輸出隧道上選擇未連線時使用默認選項。若在輸出隧道上使用未連線時使用默認,LabVIEW將斷開該VI。必須連接結(jié)構(gòu)中的所有分支。考慮將隧道配置為自動連接輸入和輸出隧道。2.10動態(tài)分配的內(nèi)存拷貝優(yōu)化如上所述,創(chuàng)建動態(tài)分配的方法時,每個子類都會繼承父類上定義的所有公共方法和受保護的方法。子類可覆蓋或擴展這些成員VIVI調(diào)用動態(tài)分配的
34、方法時,LabVIEW只有當(dāng)運行時才知道將調(diào)用哪個方法。LabVIEW將優(yōu)化調(diào)用方VI的內(nèi)存分配,并認為子類含有的任何成員VI的設(shè)置與父類中成員VI的設(shè)置相同。如父類VI的輸入為常量,調(diào)用方將認為在所有子類VI中輸入也是常量。如父類成員VI的輸入返回為輸出,調(diào)用方VI認為所有子類成員VI也會有相同的操作。如上述假設(shè)有誤,則優(yōu)化失敗。例如,如創(chuàng)建了一個成員VI,其中包含未改變的輸入。這將使調(diào)用方VI認為所有輸入都不改變,即使每次覆蓋都會改變部分或所有輸入?;蛘?,如未將任何輸入連接至父類成員VI的輸出,調(diào)用方VI將認為沒有任何輸出與輸入共享內(nèi)存,即使在相鄰的VI之間,上一個VI的輸出可能是下一個V
35、I的輸入oLabVIEW必須創(chuàng)建代碼來處理子類中導(dǎo)致優(yōu)化失敗的非預(yù)期行為。更好的優(yōu)化是指寫入父類VI時,在子類VI中發(fā)生盡可能一致的操作。創(chuàng)建一個動態(tài)分配方法,可使用元素同址操作結(jié)構(gòu)明確表示各個接線端的作用。將元素同址操作結(jié)構(gòu)放在父類的動態(tài)分配的VI中,然后將元素同址操作結(jié)構(gòu)節(jié)點對置于元素同址操作結(jié)構(gòu)中。這些節(jié)點對用于通知LabVIEW哪些輸入應(yīng)連接至哪些輸出,哪些輸入應(yīng)視為常量,哪些輸入應(yīng)視為修改過的量。然后,LabVIEW開始優(yōu)化調(diào)用方VI。三、開發(fā)LabVIEW類從概念上來說,LabVIEW面向?qū)ο缶幊毯推渌嫦驅(qū)ο缶幊陶Z言相似。但由于LabVIEW是數(shù)據(jù)流圖形化編程環(huán)境,LabVIEW
36、對類數(shù)據(jù)的操作和交互,以及LabVIEW類代碼的調(diào)試方法和其它語言有所不同。LabVIEW中的對象由值來傳遞,而不是由引用來傳遞。LabVIEW按照簇和數(shù)組的操作規(guī)則創(chuàng)建對象的副本。構(gòu)造函數(shù)和析構(gòu)函數(shù)構(gòu)造函數(shù)和析構(gòu)函數(shù)在LabVIEW面向?qū)ο缶幊讨惺请[含的。不需要調(diào)用構(gòu)造函數(shù)來對LabVIEW類數(shù)據(jù)進行初始化。每當(dāng)需要對一個類進行初始化時,LabVIEW會調(diào)用一個默認的構(gòu)造函數(shù)。通常情況下,類在前面板的相應(yīng)控件或程序框圖的相應(yīng)常量中初始化。LabVIEW用私有數(shù)據(jù)控件中設(shè)定的默認值來對類的值進行初始化。當(dāng)LabVIEW不再需要LabVIEW類中的信息時,LabVIEW將以處理簇和數(shù)組同樣的方法
37、進行內(nèi)存釋放。如需將類數(shù)據(jù)設(shè)定為其它值,必須創(chuàng)建一個成員VI以對類數(shù)據(jù)設(shè)定新值。例如,若在創(chuàng)建汽車類時,將其中齒輪數(shù)量的默認值設(shè)定為3,而又希望對卡車類從汽車類繼承而來的齒輪數(shù)量指派一個不同的值,這時就必須創(chuàng)建一個成員VI以改變汽車類的值。設(shè)置新值的另一種方法是:創(chuàng)建一個沒有輸入,以類為輸出的成員VI,將需要指派給齒輪數(shù)量的值設(shè)定在輸出類中,從而可創(chuàng)建一個以該輸出類為數(shù)據(jù)類型的程序框圖常量。平化和還原數(shù)據(jù)LabVIEW以平化數(shù)據(jù)的形式存儲數(shù)據(jù)。平化至字符串及從字符串還原函數(shù)可以處理所有的類數(shù)據(jù)類型。LabVIEW自動平化和還原數(shù)據(jù)。所有類型描述符保留了LabVIEW中已平化數(shù)據(jù)的類型,而Lab
38、VIEW類的平化數(shù)據(jù)本身不但保留了類型信息,而且保留了類的版本信息。由于LabVIEW類保留了用于還原LabVIEW類的相關(guān)信息,如果LabVIEW類因被移動或刪除而無法找到,LabVIEW將無法還原數(shù)據(jù)并將顯示錯誤信息。類似于LabVIEW丟失子VI時的情形,打開成員VI時,若某控件的LabVIEW類數(shù)據(jù)已丟失,該控件將變灰。斷開控件所對應(yīng)的LabVIEW類被加載之后,數(shù)據(jù)將被還原而控件將不再被斷開。注:也可使用平化至XML和從XML還原函數(shù)處理類數(shù)據(jù)。實施數(shù)據(jù)變異若試圖向LabVIEW類控件中寫入數(shù)據(jù)的LabVIEW類比內(nèi)存中的LabVIEW類版本更新,則被寫入的控件將發(fā)出警告。當(dāng)LabV
39、IEW類私有數(shù)據(jù)控件的數(shù)據(jù)類型或類的繼承關(guān)系發(fā)生改變時,該類的版本號將被增大。通過類屬性對話框,可查看LabVIEW類的版本號。出現(xiàn)以下情況時,LabVIEW將自動增大類的版本號:LabVIEW類的繼承關(guān)系發(fā)生改變。LabVIEW類的私有數(shù)據(jù)控件發(fā)生改變。私有數(shù)據(jù)控件的改變包括:添加、替換、重新排序或刪除控件;改變控件的表示法;更新已修改的自定義類型。在新版本的LabVIEW中加載舊版本的LabVIEW類。通過類屬性對話框可手動增大類的版本號。遞增的版本號表示類版本的更新。若對一個類進行重命名,則LabVIEW將把該類當(dāng)作一個新類,刪除該類的變異歷史,并將版本號重新設(shè)定為。執(zhí)行以下任意一種操作
40、時,LabVIEW類將被重命名:通過下拉菜單的文件另存為,對類進行重命名。將類移入所屬庫。將類移出所屬庫。重命名磁盤上的.lvclass文件。注:如不作任何改動,將類改回原來的類名,則改回原名的類和原類仍有所不同,因為原類的變異歷史已經(jīng)丟失。例如,假設(shè)將汽車類重命名為“汽車#1類”,然后將類名從“汽車#1”改回“汽車”,則新的汽車類和原來的汽車類不再是同一個類。對使用LabVIEW類開發(fā)應(yīng)用程序的LabVIEW類用戶來說,LabVIEW跟蹤LabVIEW類的版本號是很有用的。例如,假設(shè)應(yīng)用程序中有一個LabVIEW類,該類的私有數(shù)據(jù)控件使用了無符號32位整型。然而,LabVIEW類開發(fā)人員發(fā)送
41、的某個版本的LabVIEW類中,私有數(shù)據(jù)控件中的數(shù)值控件變成了雙精度浮點型。由于LabVIEW跟蹤了版本的變化,并能對所有LabVIEW類的數(shù)據(jù)進行平化和還原,用戶可以直接用新版本替換舊版本,不必作任何修改即可運行程序。注:如將數(shù)據(jù)從某個LabVIEW類的未來版本還原,LabVIEW將返回錯誤。例如,當(dāng)內(nèi)存中某個LabVIEW類的版本號為,而數(shù)據(jù)的版本號為時,將可能出現(xiàn)該錯誤。LabVIEW采取如下方式處理LabVIEW類不同版本數(shù)據(jù)的變異:如從LabVIEW類層次結(jié)構(gòu)中移除一些類,則LabVIEW將從原來的類層次結(jié)構(gòu)中刪除這些類的平化數(shù)據(jù)。例如,假設(shè)類C繼承了類B,而類B繼承了類A。如將類C
42、更改為直接繼承類A,則LabVIEW將刪除類C中來源于類B的平化數(shù)據(jù)。如在LabVIEW類層次結(jié)構(gòu)中添加新層,則LabVIEW將把被添加類的默認數(shù)據(jù)插入到原來的類層次結(jié)構(gòu)中。例如,假設(shè)類C和類B都繼承了類A。如將類C更改為繼承類B,則LabVIEW將對類C插入類B的默認數(shù)據(jù)。如在類私有數(shù)據(jù)簇的末尾(按tab鍵順序)添加一個元素,則LabVIEW將還原舊的數(shù)據(jù)并添加類的默認數(shù)據(jù)。如在類私有數(shù)據(jù)簇中刪除一個元素并且不添加任何新元素,則LabVIEW將還原舊的數(shù)據(jù)并刪除該元素相關(guān)的信息。如改變類私有數(shù)據(jù)簇的tab鍵順序,則LabVIEW將對還原后的相應(yīng)數(shù)據(jù)進行重新排序。如在同一次修改中添加、刪除、替
43、換或重新排序類的私有數(shù)據(jù)簇,LabVIEW將創(chuàng)建并執(zhí)行一個過程,通過合并以上步驟對數(shù)據(jù)實施相應(yīng)的變異操作。LabVIEW類不同版本的變異總是按順序(例如從版本到)實施的。注:當(dāng)類的版本號增大以后,將無法對LabVIEW類進行恢復(fù)。由于沒有足夠的信息,LabVIEW無法撤消LabVIEW類的輸入和顯示控件中數(shù)據(jù)的更改。如需恢復(fù)當(dāng)前的更改,請不要保存任何更改。卸載該類及所有引用該類的VI,然后從磁盤重新加載該類。關(guān)于編輯LabVIEW類時,LabVIEW進行數(shù)據(jù)變異的詳細信息,見的技術(shù)支持文檔。3.4強制轉(zhuǎn)換LabVIEW類通過轉(zhuǎn)換為通用的類函數(shù)可將LabVIEW類向上轉(zhuǎn)換;通過轉(zhuǎn)換為特定的類函數(shù)
44、可將LabVIEW類向下轉(zhuǎn)換。這些函數(shù)還可用于對包含繼承層次結(jié)構(gòu)的引用數(shù)據(jù)類型(例如VI服務(wù)器控件引用)進行操作,功能是一樣的。使用“轉(zhuǎn)換為通用的類”函數(shù)并不改變數(shù)據(jù),但傳遞數(shù)據(jù)的連線類型將被改變。但是,該函數(shù)在VI運行時不起作用。對那些按照嚴(yán)格代碼規(guī)范需要避免數(shù)據(jù)轉(zhuǎn)換的程序員而言,“轉(zhuǎn)換為通用的類”函數(shù)提供了一種消除強制轉(zhuǎn)換點的方法?!稗D(zhuǎn)換為特定的類”函數(shù)不改變數(shù)據(jù),除非出現(xiàn)錯誤。如運行時連線上的數(shù)據(jù)不是更為特定的類,則該函數(shù)將返回一個錯誤并且輸出數(shù)據(jù)將是連線類型的默認值。“轉(zhuǎn)換為特定的類”函數(shù)的主要用途是對父類的值作類型檢查。通常程序員將同一個父類連接到多個“轉(zhuǎn)換為特定的類”函數(shù),每一個連
45、線導(dǎo)向一個更為特定的類,哪一個“轉(zhuǎn)換為特定的類”函數(shù)不報錯,便執(zhí)行該函數(shù)之后的代碼,從而實現(xiàn)根據(jù)類型檢查結(jié)果運行不同的代碼。這種方法相當(dāng)?shù)托АH缧栌眠@種方法作類型檢查,并擁有修改父類的權(quán)限,可在父類添加一個動態(tài)成員VI,并讓每一個子類根據(jù)功能需要重寫這個動態(tài)成員VI。如LabVIEW在運行時檢測到用戶將子類對象連接至接受父類對象的子VI,LabVIEW將自動把子VI輸出向下轉(zhuǎn)換為子類對象。自動向下轉(zhuǎn)換不必使用“轉(zhuǎn)換為特定的類”函數(shù)。但是,只有LabVIEW確保連接至子VI的類對象與子VI接受的輸入兼容時,自動向下轉(zhuǎn)換才發(fā)生。例如,如將類對象保存在變體中,然后將變體數(shù)據(jù)連接至子VI,LabVIE
46、W不能確保子VI包含的數(shù)據(jù)與變體原本存儲的數(shù)據(jù)為同一種類型。使用保留運行類函數(shù)幫助LabVIEW檢查連接至子VI的類對象與子VI接受的類對象為兼容對象。如兩個對象不兼容,函數(shù)將返回錯誤,并將類的輸出數(shù)據(jù)設(shè)置為子VI接受的父對象。也可將該函數(shù)與數(shù)據(jù)值引用配合使用。數(shù)據(jù)值引用讀取/寫入元素邊框節(jié)點必須預(yù)留運行類型??墒褂谩氨A暨\行類”函數(shù)檢查連接至“數(shù)據(jù)值引用寫入”節(jié)點的類對象是否與連接至“數(shù)據(jù)值引用讀取”邊框節(jié)點的類對象相互兼容。注:LabVIEW無法自動向下轉(zhuǎn)換遞歸子VI。如在動態(tài)分配VI的程序框圖上或在元素同址結(jié)構(gòu)中調(diào)用遞歸子VI傳遞數(shù)據(jù)值引用時,自動向下轉(zhuǎn)換會引起調(diào)用VI的斷開。在遞歸子VI的程序框圖上使用“保留運行類”函數(shù),驗證連接至子VI的類與子VI接受的類是兼容的。如兩個類兼容,在遞歸鏈之外調(diào)用VI不會使VI斷開。3.5鎖定和解除鎖定LabVIEW類通過鎖定LabVIEW類可阻止LabVIEW類用戶查看那些作為應(yīng)用程序內(nèi)部實現(xiàn)的成員VI。鎖定LabVIEW類可防止對私有成員VI的訪問,從而預(yù)防引入應(yīng)用程序的
溫馨提示
- 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025三層別墅租賃合同
- 2024年第3季度醫(yī)用注射器運輸微粒污染控制標(biāo)準(zhǔn)
- 2025設(shè)備租賃合同范本模板
- 班級特色活動的創(chuàng)新方案計劃
- 2025年氣象、水文儀器及裝置項目發(fā)展計劃
- 教師職業(yè)道德與責(zé)任感提升計劃
- 2025年圖像存儲與通訊系統(tǒng)(PACS)項目發(fā)展計劃
- 節(jié)約成本與安全保障的平衡計劃
- 學(xué)校教學(xué)工作總體計劃
- 社團工作計劃運營
- SH/T 3046-2024 石油化工立式圓筒形鋼制焊接儲罐設(shè)計規(guī)范(正式版)
- 湖南省張家界市慈利縣2023-2024學(xué)年八年級下學(xué)期期中考試物理試題
- 金屬非金屬地下礦山監(jiān)測監(jiān)控系統(tǒng)建設(shè)規(guī)范
- 2024年蘇州市軌道交通集團有限公司招聘筆試參考題庫附帶答案詳解
- 新概念英語第2冊課文(完整版)
- 水培吊蘭的養(yǎng)殖方法要領(lǐng)
- 動物的遷徙行為與地球生態(tài)系統(tǒng)
- 【小學(xué)心理健康教育分析國內(nèi)外文獻綜述4100字】
- 校園金話筒大賽(臨沂賽區(qū))策劃書
- 正確使用文丘里面罩
- 破碎錘施工方案
評論
0/150
提交評論