Labview編程經(jīng)驗(yàn)_第1頁(yè)
Labview編程經(jīng)驗(yàn)_第2頁(yè)
Labview編程經(jīng)驗(yàn)_第3頁(yè)
Labview編程經(jīng)驗(yàn)_第4頁(yè)
Labview編程經(jīng)驗(yàn)_第5頁(yè)
已閱讀5頁(yè),還剩115頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、當(dāng)我開(kāi)始在鍵盤(pán)上敲打出這句話(huà)的時(shí)候,我已經(jīng)使用 LabVIEW 7 年了。7 年的時(shí)間,就算天賦平平也可以積攢下一籮筐可供參考的經(jīng)驗(yàn)了。所以我打算利用今后的閑暇時(shí)間寫(xiě)一些這方面的東西,既可以同大家交流,也是作為自己這七年工作的總結(jié)。還是在上大學(xué)的時(shí)候,有一次老師讓編寫(xiě)一段軟件,用來(lái)模擬一個(gè)控制系統(tǒng):給它一個(gè)激勵(lì)信號(hào),然后顯示出它的輸出信號(hào)。那時(shí)我就想過(guò),可以把每一個(gè)簡(jiǎn)單的傳遞函數(shù)都做成一個(gè)個(gè)小方塊,使用的時(shí)候可以選擇需要的函數(shù)模塊,用線(xiàn)把它們連起來(lái),這樣就可以方便地搭建出各種復(fù)雜系統(tǒng)。后來(lái),我第一次看到別人給我演示的LabVIEW編程,就是把一些小方塊用線(xiàn)連起來(lái),完成了一段程序。我當(dāng)時(shí)就感覺(jué)到

2、,這和我曾經(jīng)有過(guò)的想法多么相似啊。一種親切感油然而生,從此我對(duì)LabVIEW的喜愛(ài)就一直勝過(guò)其他的編程語(yǔ)言。LabVIEW 的第一個(gè)版本發(fā)布于1986年,是在 Macintosh 機(jī)上實(shí)現(xiàn)的,后來(lái)才移植到了PC機(jī)上,并且LabVIEW 從未放棄過(guò)對(duì)跨平臺(tái)的支持。這也給 LabVIEW 帶來(lái)了一些麻煩。最明顯的就是LabVIEW開(kāi)發(fā)環(huán)境的界面風(fēng)格。它總是與一般的 Windows 應(yīng)用程序有些格格不入:面板是深灰色的,按鍵鈕是看起來(lái)別別扭扭的 3D 模樣。還有一些可能不太容易發(fā)現(xiàn):比如對(duì)于整數(shù)的存儲(chǔ),LabVIEW即便是運(yùn)行在x86系統(tǒng)上,采用的也是高地址位存高位數(shù)據(jù)(big-ending)。這與

3、我們習(xí)慣了的x86 CPU使用的格式正相反,這往往給編寫(xiě)存取二進(jìn)制文件帶來(lái)了不多不少的麻煩。我接觸過(guò)的最早的LabVIEW版本是4.0版,發(fā)布包是一個(gè)裝有十幾張三寸軟盤(pán)的大盒子。安裝的時(shí)候要按順序把軟盤(pán)一個(gè)一個(gè)塞到計(jì)算機(jī)里。盡管當(dāng)時(shí)LabVIEW的界面不是很好看,但我還是非常喜歡它。真方便吶!比如說(shuō)要畫(huà)一個(gè)開(kāi)關(guān),用 LabVIEW 一拖就行了。如果要自己動(dòng)手用C 語(yǔ)言設(shè)計(jì)一個(gè)好看的開(kāi)關(guān),那得費(fèi)多少時(shí)間啊!我尤其喜歡它通過(guò)連線(xiàn)來(lái)編程的方式,盡管很多熟悉了文本編程語(yǔ)言的人剛開(kāi)始時(shí)會(huì)對(duì)這種圖形化編程方式非常不適應(yīng)。從 4.0 到現(xiàn)在的 8.2,LabVIEW 的一些技術(shù)革新給我留下了非常深的印象。比

4、如說(shuō) LabVIEW 5 中實(shí)現(xiàn)了多線(xiàn)程運(yùn)行; LabVIEW 6 里漂亮的 3D 控件,和對(duì)事件響應(yīng)的支持;LabVIEW 7 中的 Express VI 以及 LabVIEW 8 中的工程庫(kù)。這些新特性都已成為了現(xiàn)在 LabVIEW 版本中富有特色并不可缺少的一部分了。我對(duì)使用 LabVIEW 編程的認(rèn)識(shí)在這些年里經(jīng)歷了不少轉(zhuǎn)變。剛開(kāi)始接觸 LabVIEW 的時(shí)候,第一印象就是覺(jué)得這東西編程序比 C 語(yǔ)言簡(jiǎn)單多了,尤其在設(shè)計(jì)界面時(shí)確實(shí)方便簡(jiǎn)易。LabVIEW 是一種真正意義上的圖形化編程語(yǔ)言。與文本編程語(yǔ)言,如 C、Basic 等相比,它在編程過(guò)程中有更詳細(xì)的提示信息,如函數(shù)的功能、參數(shù)類(lèi)

5、型等等,程序員再不需要去記憶這些枯燥的信息了。編寫(xiě)風(fēng)格良好的圖形程序代碼要比文本代碼更加清晰直觀(guān),便于閱讀。剛開(kāi)始用 LabVIEW 編程時(shí),我連一本相關(guān)的書(shū)籍都沒(méi)讀過(guò),差不多完全靠自己摸索。當(dāng)時(shí),市面上幾乎沒(méi)有有關(guān) LabVIEW 的中文書(shū)籍,而閱讀英文資料又感覺(jué)得太累。但是,靠自己摸索的方法也有好處,最明顯的就是有成就感:自己琢磨著解決了一個(gè)問(wèn)題,比模仿別人的方法做更令人興奮。再者,他人的方案并不一定是最佳的,自己獨(dú)自思索就不至于被他人的方案局限住思路。當(dāng)然,我不會(huì)滿(mǎn)足于只用 LabVIEW 編寫(xiě)一些簡(jiǎn)單的程序。我還希望能夠用它來(lái)編寫(xiě)大型的軟件,并且提高自己的開(kāi)發(fā)效率。這時(shí),自己的編程水平

6、有一個(gè)質(zhì)的提高,不閱讀相關(guān)的書(shū)籍資料就不行了。有些問(wèn)題,不讀書(shū),自己可能永遠(yuǎn)都得不到最佳的答案。同樣,有些 LabVIEW 的功能,如果不閱讀原始資料,自己也許永遠(yuǎn)都掌握不了。于是,我把能得到的LabVIEW 的中高級(jí)教程都看了一遍。因?yàn)樽约河辛艘欢ǖ幕A(chǔ),我就可以在讀書(shū)的過(guò)程中反思自己以前的編程方法是否合理,高效。我覺(jué)得最好的 LabVIEW 教程還是NI自己編寫(xiě)的 LabVIEW 中高級(jí)教程。但書(shū)本中一般原理講得多,具體的編程技巧涉及得少,所以還必須大量閱讀別人的代碼,才能學(xué)習(xí)到更多更好的編程方法。隨著時(shí)間的流逝,我慢慢地產(chǎn)生了LabVIEW 應(yīng)當(dāng)進(jìn)一步改善的想法。作為一名忠實(shí)的 LabV

7、IEW 語(yǔ)言的使用者,我衷心地期望著 LabVIEW 在日后也可以成為一種被廣為使用的通用編程語(yǔ)言,能夠在更廣泛的領(lǐng)域與 C,Java等爭(zhēng)得一席之地。LabVIEW 雖然有它獨(dú)特的優(yōu)勢(shì),但其不足之處也很明顯。我在編程過(guò)程中就曾感覺(jué)到它很多的使用不方便之處。下一步,我追求的目標(biāo)就是能盡自己所能,對(duì) LabVIEW 作一些改進(jìn)和完善,使它更適應(yīng)于通用編程之用。如何學(xué)習(xí) LabVIEW根據(jù)我自己的觀(guān)察,學(xué)習(xí)LabVIEW一般有以下三種方式:系統(tǒng)型學(xué)習(xí)方法、探索型學(xué)習(xí)方法和目標(biāo)驅(qū)動(dòng)型學(xué)習(xí)方法。這三種方法之間并不矛盾,可以在不同的時(shí)段使用不同的方法。每個(gè)人可以根據(jù)自己的個(gè)性特點(diǎn)和所處環(huán)境選擇一個(gè)適合自己

8、的學(xué)習(xí)方案。系統(tǒng)型學(xué)習(xí)方案是傳統(tǒng)的學(xué)習(xí)方法,學(xué)生學(xué)習(xí)多是按此方法。它是指按照別人制定好的學(xué)習(xí)方案一步一步學(xué)習(xí)掌握一門(mén)知識(shí)。學(xué)習(xí)效果如何,主要取決于教師和教材的水平。若選此方案學(xué)習(xí)LabVIEW,最高效的方法莫過(guò)于參加NI公司的LabVIEW培訓(xùn)課程。基本上,完全沒(méi)接觸過(guò)LabVIEW的學(xué)員可以在一星期的時(shí)間內(nèi)達(dá)到編寫(xiě)簡(jiǎn)單程序的程度。此外,現(xiàn)在很多大學(xué)都開(kāi)有LabVIEW課程,方便了在校生學(xué)習(xí)。自學(xué)也可以采用此方案。找一本教程類(lèi)的書(shū)籍,按照書(shū)中指導(dǎo)一步一步學(xué)習(xí)。教程類(lèi)的書(shū)籍應(yīng)當(dāng)側(cè)重于解釋LabVIEW的編程思想以及原理;有些書(shū)僅偏重于羅列LabVIEW中每個(gè)函數(shù)或VI的功能,則不適合用于此種學(xué)習(xí)

9、方案。探索型學(xué)習(xí)方法適合喜好自己鉆研的人。同樣一個(gè)技巧,如果是自己發(fā)現(xiàn)的,比從他人那里的來(lái)會(huì)更有成就感。任何一個(gè)教程都不可能覆蓋到LabVIEW的全部功能,有心得學(xué)員不妨自己打開(kāi)書(shū)中未曾介紹到的那些菜單或者函數(shù)選板,嘗試一下它們都是做什么用的。在真正動(dòng)手?jǐn)[弄每個(gè)新東西之前,打開(kāi)LabVIEW的即時(shí)幫助窗口,閱讀一下相關(guān)說(shuō)明可以大大加快學(xué)習(xí)過(guò)程。比如,打開(kāi)“應(yīng)用程序控制”函數(shù)選板,發(fā)現(xiàn)這里有一項(xiàng)“選板編輯”。好像沒(méi)有任何一本書(shū)里介紹過(guò)這個(gè)功能嘛,這是干啥用的呢?如果沒(méi)任何提示,也是無(wú)從下手去嘗試的。打開(kāi)LabVIEW的及時(shí)幫助,可以看到它對(duì)這個(gè)功能的簡(jiǎn)單介紹。進(jìn)入“詳細(xì)幫助信息”,會(huì)得到更全面的

10、說(shuō)明。再自己動(dòng)手實(shí)踐一下,就基本可以掌握此功能了。閱讀他人代碼也是一個(gè)很好的學(xué)習(xí)方法。自己的探索總是有思維局限性的,他人解決問(wèn)題的方法可以大大拓寬自己思路。我介紹過(guò)的編程經(jīng)驗(yàn)中,很大一部分都不是我自己憑空想出來(lái)的,而是借鑒與別人的LabVIEW代碼。目標(biāo)驅(qū)動(dòng)型學(xué)習(xí)方法是公司員工中最常見(jiàn)的學(xué)習(xí)方式了。工作后,如果不是個(gè)人有興趣,多數(shù)人不會(huì)浪費(fèi)時(shí)間去學(xué)習(xí)工作中用不到的知識(shí)。等老板布置了具體項(xiàng)目或者工作任務(wù)后再學(xué)習(xí)相關(guān)知識(shí),效率更高。學(xué)也只要夠解決眼前問(wèn)題就行了。針對(duì)這種情況,請(qǐng)教身邊牛人或者公司前輩是最好的學(xué)習(xí)方法。如果周?chē)娜瞬荒芙鉀Q問(wèn)題,到論壇上發(fā)貼,尋求更廣泛的幫助。推薦一個(gè)論壇。首先是NI

11、的官方論壇,這里會(huì)有NI的技術(shù)支持和研發(fā)工程師來(lái)回答問(wèn)題。如果英文夠好,最好是到它的英文版面去提問(wèn),英文討論區(qū)人氣更旺,容易找到答案。LAVA 是官方之外最大的LabVIEW社區(qū),也是尋求幫助的好地方。如果平時(shí)用Windows Live Messenger,可以加入,這是個(gè)msn討論LabVIEW 的群。在它上面討論問(wèn)題最大的好處是可以及時(shí)得到回應(yīng)。我見(jiàn)過(guò)幾個(gè)工程師在項(xiàng)目中遇到了難題,于是來(lái)報(bào)名參加LabVIEW的培訓(xùn)課程,以為上完課可以解決自己的問(wèn)題。但實(shí)際上完全誤解了培訓(xùn)課程的意義,培訓(xùn)課程是為了幫助那些想要系統(tǒng)學(xué)習(xí)LabVIEW知識(shí)的人,而不專(zhuān)注于任何一個(gè)具體問(wèn)題。LabVIEW 工程資

12、源管理器從 8.0 開(kāi)始,LabVIEW 增加了一個(gè)工程資源管理器功能。LabVIEW 工程資源管理器就是一個(gè)可以方便查看、調(diào)整程序系統(tǒng)結(jié)構(gòu)的工作區(qū)。與 VC, VB 等語(yǔ)言中的 project, workspace 相類(lèi)似。Project 的出現(xiàn)使得 LabVIEW 對(duì)于大項(xiàng)目的管理更加方便。 圖1:LabVIEW 工程資源管理器要想充分利用 LabVIEW 工程資源管理器帶來(lái)的好處,那就需要我們改變一些以往的LabVIEW編程習(xí)慣。譬如說(shuō),在開(kāi)始一個(gè)新的項(xiàng)目的時(shí)候,在 LabVIEW 8 以前的版本中,我們最先創(chuàng)建的是程序的主 VI;而現(xiàn)在,我們首先創(chuàng)建的應(yīng)該是一個(gè)空的工程(Project

13、),再在這個(gè)工程中添加相應(yīng)的 VI和各種組件。工程管理器還有如下優(yōu)點(diǎn):工程的樹(shù)形結(jié)構(gòu)表示了程序中 VI 的調(diào)用層次關(guān)系,利用VI的快捷菜單可以查看到調(diào)用該VI的程序,以及該VI的子程序,而不必再使用 VI Hierarchy 來(lái)查看。在工程資源管理器的File頁(yè)就可以直接調(diào)整文件存放的磁盤(pán)位置,而不必再另外打開(kāi)操作系統(tǒng)提供的文件瀏覽器。在工程資源管理器中集成源代碼管理功能,不需要再使用源代碼管理工具提供的界面了。(源代碼管理工具是用來(lái)進(jìn)行軟件源代碼版本控制的。大型軟件開(kāi)發(fā)通常需要這樣的工具,用來(lái)記錄每一次代碼的修改、同時(shí)開(kāi)發(fā)同一軟件的不同版本、方便多人同時(shí)對(duì)同一段代碼進(jìn)行修改等。)一、工程的結(jié)

14、構(gòu)圖1是一個(gè)工程資源管理器的截圖。它用一個(gè)樹(shù)形的結(jié)構(gòu)來(lái)表示工程中所有的 VI、各種組件和文件設(shè)置等。樹(shù)形結(jié)構(gòu)的最頂層是工程的名稱(chēng)。第二層是工程運(yùn)行的目標(biāo)機(jī)器。假如我的機(jī)器上只裝了普通臺(tái)式機(jī)版本的 LabVIEW,大家只能看到一個(gè)目標(biāo):“My Computer”。假如我的計(jì)算機(jī)上還裝了 LabVIEW RT, FPGA 等用于其它硬件環(huán)境的 LabVIEW,那么在這一層還會(huì)出現(xiàn)其它那些目標(biāo)設(shè)備。第三層以下就是工程中所有使用到的文件了。用戶(hù)可以添加虛擬文件夾,按自己的喜好組織文件結(jié)構(gòu)。LabVIEW 從 8.0 起,文件及其它組件種類(lèi)一下子豐富了許多。以前基本就只有 VI 和控件兩種文件,現(xiàn)在又多

15、了 Library, Class, XControl,XNode,共享變量等等。安裝了其他功能模塊,組件的種類(lèi)還會(huì)更多。右擊樹(shù)狀結(jié)構(gòu)中的每個(gè)條目,還可看到針對(duì)他們的更多設(shè)置。在 LabVIEW 8 之前,若要把 VI 源文件構(gòu)建成可執(zhí)行文件,必須使用Tools 菜單下的 APP Builder 工具?,F(xiàn)在這個(gè)工具也被集成到了工程管理器中。在目標(biāo)機(jī)器的最后一個(gè)條目“Build Specification”中包含了把源代碼配置成為EXE, DLL 等的信息。在舊版本 LabVIEW 中,保存VI時(shí)的一些高級(jí)選項(xiàng),比如添加密碼、移除 VI前面板,程序框圖等選項(xiàng);以及其它一些與運(yùn)行有關(guān)的選項(xiàng),例如禁止

16、調(diào)試,自動(dòng)彈出錯(cuò)誤框等選項(xiàng),也都被合并到此處了。在 Build Source Distribution 中可以找到相應(yīng)的設(shè)置。在舊版本 LabVIEW 中,是絕對(duì)不允許把兩個(gè)文件名相同,但內(nèi)容不同的 VI 同時(shí)裝入內(nèi)存的。這也可以理解,VI 就好比是 C 語(yǔ)言中的函數(shù),如果兩個(gè)函數(shù)名相同,那到時(shí)究竟應(yīng)該使用哪一個(gè)呢?但這畢竟不方便,比如我們需要同時(shí)運(yùn)行兩個(gè)程序,他們當(dāng)中都有排序的功能。為了方便,VI的名字都起名為“Sort.vi”,但是他們的代碼其實(shí)并不相同。為了讓兩個(gè)程序同時(shí)正常工作,我們應(yīng)該允許在這兩個(gè)程序內(nèi)分別使用兩個(gè)文件名相同,但內(nèi)容不同的 VI。在版本 8 中,LabVIEW 對(duì)此作

17、了兩點(diǎn)改進(jìn),一是引進(jìn)了庫(kù)的概念,類(lèi)似給 VI 增加了名字空間。在不同的庫(kù)中的 VI,即時(shí)文件名相同,它們的 VI 名字實(shí)際上也是不同的,因?yàn)?VI 名還包括庫(kù)名作為前綴。(可以參考:二是增加了運(yùn)行環(huán)境的概念。LabVIEW 中,每一個(gè)工程都是一個(gè)獨(dú)立的運(yùn)行環(huán)境。為每一個(gè)的程序建立一個(gè)單獨(dú)的工程,它們就有了一個(gè)獨(dú)立的運(yùn)行環(huán)境。一個(gè)運(yùn)行環(huán)境中的 VI 不會(huì)影響到其它運(yùn)行環(huán)境中的程序。這樣,同時(shí)運(yùn)行分屬不同工程的兩個(gè)程序,它們之間即便用到了同名的 VI,也不會(huì)相互影響。但在單個(gè)工程中,還是不允許出現(xiàn)同名又不在庫(kù)中的 VI。二、按照文件的物理結(jié)構(gòu)來(lái)查工程在需要?jiǎng)?chuàng)建一個(gè)新的類(lèi)似工程,或版本備份時(shí),程序經(jīng)

18、常被來(lái)回復(fù)制。在這個(gè)過(guò)程中,很可能會(huì)引起子VI的錯(cuò)誤鏈接。比如,本來(lái)工程里應(yīng)該使用的的是 Project One 文件夾下的一個(gè)子VI,但實(shí)際上卻鏈接到了 Project Two 文件夾下的一個(gè)同名VI。我們可以把文件的真實(shí)路徑同時(shí)顯示在工程資源管理器的Item,以及File 頁(yè)上,選取菜單 Project -> Show Item Paths,如圖2所示。我們可以在這里檢查每個(gè)文件的路徑是否正確。但是,文件比較多的時(shí)候,一條一條看下來(lái),是比較麻煩的。這時(shí)可以按照文件的物理結(jié)構(gòu)來(lái)查看工程中的文件。在工程資源管理器中選擇“Files”標(biāo)簽頁(yè),看到的就是文件在物理硬盤(pán)上的真實(shí)結(jié)構(gòu)。我們只要在

19、這里檢查一下,有沒(méi)有不需要的文件夾出現(xiàn),就可以判定是否出現(xiàn)了錯(cuò)誤鏈接。如果發(fā)現(xiàn)某些文件所存放的路徑不恰當(dāng),需要調(diào)整,我們可以直接在工程資源管理器中來(lái)調(diào)整,而不需要打開(kāi)文件瀏覽器去修改。圖2:按照文件的物理結(jié)構(gòu)查看工程三、VI 交叉連接前文提到程序可能會(huì)錯(cuò)誤的鏈接子 VI,這在 LabVIEW 中被稱(chēng)為 VI 的交叉鏈接。除了前面提到的可能引起交叉鏈接的情況外,試圖調(diào)用重名的VI,或把它加到工程里來(lái)等操作,都會(huì)引起 VI 的交叉鏈接。VI 的交叉鏈接會(huì)引起很多問(wèn)題,比如你在修改 VI 的時(shí)候,改動(dòng)了不應(yīng)該改動(dòng)的那份;引起程序不可預(yù)知的行為等等。LabVIEW 的工程資源管理器可以幫助檢查、修復(fù)

20、VI 的交叉鏈接。當(dāng)工程資源管理器發(fā)現(xiàn)程序中試圖使用兩個(gè)同名 VI 時(shí),就會(huì)在這樣的 VI 上打出一個(gè)驚嘆號(hào)。如圖2中所示的 Sub VI.vi。工程中試圖用到了兩個(gè)同名的VI,分別在路徑 Project One 和 Project Two 下。你可以到引用這些 VI 的地方去把他們一一修正,也可以讓工程資源管理器來(lái)修正它們?;氐健癐tem”頁(yè)面,在有驚嘆號(hào)VI上點(diǎn)擊鼠標(biāo)右鍵,選擇 Resolve Conflicts。這時(shí)候,就會(huì)出現(xiàn)修正沖突的對(duì)話(huà)框。在這個(gè)對(duì)話(huà)框中選擇應(yīng)該被選用的正確子VI,工程資源管理器就會(huì)自動(dòng)更新程序,使它們鏈接到正確的VI上去。 如何創(chuàng)建和使用 LabVIEW 中的 L

21、LB 文件最近接連有人問(wèn)我,怎樣在 LabVIEW 中創(chuàng)建一個(gè) LLB 文件。于是我就把它寫(xiě)了下來(lái)。通常,需要新建一個(gè)文件時(shí),我們很自然就會(huì)想到去選中菜單“File->New”??墒?,在 LabVIEW 8 中, 在“新建”菜單中是看不到 LLB 這種文件類(lèi)型的; 要?jiǎng)?chuàng)建或者管理一個(gè) LLB 文件,首先要選擇“Tool->LLB Manager.”。在打開(kāi) LLB Manager 之后,再在菜單中選擇“File -> New LLB”。這樣才能創(chuàng)建一個(gè)新的 LLB 文件出來(lái)。我個(gè)人認(rèn)為,在LabVIEW8及以后的版本中,LLB 文件現(xiàn)在已經(jīng)沒(méi)有存在的必要了,使用它,弊大于利。

22、LLB 文件的功能就是把一組相關(guān)的 VI 以及其他文件打包存儲(chǔ)在一起。其優(yōu)點(diǎn)是節(jié)省磁盤(pán)空間,LLB 文件是壓縮了的。但是,近年來(lái)計(jì)算機(jī)存儲(chǔ)介質(zhì)的容量迅速膨脹。LabVIEW 程序的存儲(chǔ)空間再也不是一個(gè)需要考慮的問(wèn)題了。所以這方面已經(jīng)不再有誘惑力了。LLB 文件有很多弊病。1. 內(nèi)部文件沒(méi)有層次關(guān)系,所有文件都是平級(jí)存放的。這樣一來(lái),文件多了,就不能直接看出他們的調(diào)用關(guān)系。此外,LLB也允許有同名文件存在。2. 內(nèi)部文件名長(zhǎng)度有限制,大概限制幾十個(gè)字符吧,文件名太長(zhǎng)會(huì)被自動(dòng)截?cái)唷?. 不利于版本管理。LLB 中的一個(gè)文件被修改,整個(gè) LLB 也就被修改了。這樣,一是沒(méi)辦法作增量存儲(chǔ),二是不容易定

23、位到具體被改動(dòng)了的文件上。綜上所訴,如果新建一個(gè)工程,最好不要考慮使用 LLB 文件了。同時(shí)為了方便管理工程中的文件,應(yīng)當(dāng)盡量利用 LabVIEW 8 的新功能 :Project 和 Library。 在 VI Properties -> Execution 中可以選擇 VI 的Reentrant Execution屬性(中文譯為:可重入執(zhí)行)。 我們?cè)贚abVIEW 程序的內(nèi)存優(yōu)化一文中討論過(guò),盡量不要把 VI 設(shè)置為重入屬性,因?yàn)檫@樣就多占用了內(nèi)存,降低了運(yùn)行效率。此外,如果不加注意的話(huà),還可能引發(fā)多線(xiàn)程不安全的問(wèn)題。 盡管可重入 VI 在 LabVIEW 中不是必須的,但是在某些情

24、況下使用可重入 VI 可以簡(jiǎn)化我們的程序。那么在什么情況下可以使用 Reentrant VI 呢?首先看一下圖 1 所示的程序,程序中調(diào)用的兩個(gè)子 VI 是同一個(gè) VI,并且不是可重入的 VI。LabVIEW 是自動(dòng)多線(xiàn)程的語(yǔ)言,那么圖中的兩個(gè)子VI會(huì)不會(huì)同時(shí)執(zhí)行呢。一定不會(huì)的。如果程序中調(diào)用的是兩個(gè)不同的子 VI,LabVIEW 有可能會(huì)同時(shí)在不同的線(xiàn)程執(zhí)行它們,但對(duì)于兩次調(diào)用相同的子 VI,LabVIEW 一定要等一個(gè)執(zhí)行完,再執(zhí)行另一個(gè)。圖1:并行的兩個(gè)相同子 VI其原因是,LabVIEW 會(huì)為每個(gè) VI 都開(kāi)辟一塊內(nèi)存用于數(shù)據(jù)存儲(chǔ)。作為子 VI,每次被調(diào)用,它的局部變量的數(shù)據(jù)都是被存在

25、同一地址的。與 C 語(yǔ)言相對(duì)照,在默認(rèn)情況下,VI 是不可重入的,VI 中所有的局部變量都是靜態(tài)變量。如果 LabVIEW 在不同的線(xiàn)程下執(zhí)行同一 VI,那么兩個(gè)線(xiàn)程就會(huì)同時(shí)對(duì)這一塊數(shù)據(jù)地址進(jìn)行讀寫(xiě),就會(huì)導(dǎo)致這一塊地址內(nèi)數(shù)據(jù)的混亂。為避免此類(lèi)不安全情況的出現(xiàn),LabVIEW 必須等待一個(gè)子 VI 執(zhí)行結(jié)束,再執(zhí)行另一個(gè)子 VI。如果需要圖1 中的兩個(gè)子 VI 同時(shí)運(yùn)行,比如子 VI 所做的工作是讀取文件這樣一類(lèi)耗時(shí)多、但CPU占用不大的操作,則并行執(zhí)行可以大大提高效率。這時(shí),就需要把子 VI 設(shè)置為可重入了。LabVIEW 在不同的地方調(diào)用一個(gè)可重入 VI 時(shí),會(huì)給它另外分配一個(gè)獨(dú)立的數(shù)據(jù)地址

26、空間。這樣就做到了線(xiàn)程安全。在兩個(gè)線(xiàn)程執(zhí)行的子 VI 使用兩份在不同的地址存儲(chǔ)的數(shù)據(jù),也就不會(huì)造成混亂。但是千萬(wàn)要注意, 這個(gè)“在不同的地方”調(diào)用:不可重入的 VI 的局部變量與 C 語(yǔ)言中非靜態(tài)變量的含義是不同的。在后面提到的計(jì)數(shù)器的例子可以驗(yàn)證這一點(diǎn)。我覺(jué)得我說(shuō)得挺清楚了,出道題目給大家測(cè)試一下:圖2:延時(shí)子 VI圖3:計(jì)算延時(shí)的主 VI圖2 是一個(gè)子 VI 的代碼,功能是延時(shí) 1000 毫秒。圖3 是主 VI 的代碼,并行調(diào)用同一子 VI 兩次,并計(jì)算程序的執(zhí)行時(shí)間。運(yùn)行主 VI,total time 的值是多少?答案在文章最后。這是可重入 VI 的一種用途,即希望在不同的線(xiàn)程里同時(shí)執(zhí)行

27、同一個(gè)子 VI。另外還有一種情況下,也可以用到可重入 VI:即需要使用到子 VI 中局部變量保存的數(shù)據(jù),而在不同的調(diào)用處,這些數(shù)據(jù)是獨(dú)立不同的。這句話(huà)可能解釋得不那么清楚,看下面例子就會(huì)比較容易理解些。圖4:計(jì)數(shù)子 VI圖5:測(cè)試計(jì)數(shù)的主 VI圖 4 是一個(gè)可重入子 VI 的代碼,功能是計(jì)算這個(gè)VI被運(yùn)行的次數(shù),每運(yùn)行一次,輸出的 count 值就增加1。圖5 是調(diào)用它的主VI,用于演示這個(gè)計(jì)數(shù)器。執(zhí)行主VI一次,output 1 和 output 2 的值分別是 10 和 20,表示這個(gè)子 VI 在兩處分別被調(diào)用了 10 次和 20 次。如果把圖 4 中的 VI 改為不可重入,則 outpu

28、t 1 和 output 2 的輸出值是不確定的。大家可以自己試一試,再想一下原因。當(dāng)使用遞歸結(jié)構(gòu)時(shí),參與了遞歸調(diào)用的 VI 是需要被同時(shí)調(diào)用多次的。因此這些 VI 中的變量必須是局部的,也就是說(shuō)參與了遞歸調(diào)用的 VI 必須都被設(shè)置為可重入。參考:在 LabVIEW 中實(shí)現(xiàn) VI 的遞歸調(diào)用測(cè)試題目答案:如果圖2的子 VI 沒(méi)有設(shè)置為可重入,則 total time = 2000;如果設(shè)置為可重入則 total time = 1000。 為了解釋清楚,先定義一下要用到的概念。我們把以 .ctl 文件名定義的控件叫做用戶(hù)自定義控件,把通過(guò)拖拽或打開(kāi)這個(gè) .ctl 文件在 VI 上生成的控件叫做實(shí)

29、例。LabVIEW 的用戶(hù)自定義控件包括了三種定義形式:打開(kāi)一個(gè) .ctl 文件,在它上方的“control”下拉條中有三個(gè)選擇,分別是無(wú)關(guān)聯(lián)控件(Control)、類(lèi)型定義(Type Def.)或者嚴(yán)格類(lèi)型定義(Strict Type Def.)。無(wú)關(guān)聯(lián)控件是指這個(gè)控件與它的實(shí)例之間沒(méi)有任何關(guān)聯(lián)。例如,你制作了一個(gè)漂亮的按鈕控件保存在 .ctl 文件中。需要用到它時(shí),通過(guò)拖拽或打開(kāi)這個(gè) .ctl 文件就可以在 VI 中生成這個(gè)用戶(hù)自定義控件的一個(gè)實(shí)例。這個(gè)實(shí)例一旦生成,就和原用戶(hù)自定義控件無(wú)任何關(guān)聯(lián)了。無(wú)論是你修改這個(gè)實(shí)例,還是修改原用戶(hù)自定義控件,都不會(huì)對(duì)另一方產(chǎn)生任何影響。類(lèi)型定義控件是

30、指實(shí)例控件與用戶(hù)自定義控件的空間類(lèi)型是相關(guān)聯(lián)的。比如,你的用戶(hù)自定義控件是一個(gè)數(shù)值型控件,那么它的所有實(shí)例控件也都是數(shù)值型的。如果我們?cè)?.ctl 文件中把用戶(hù)自定義控件的類(lèi)型改為字符串,那么它已有的所有實(shí)例都將自動(dòng)變成字符串類(lèi)型。有時(shí)候,只是類(lèi)型相關(guān)聯(lián)還不夠。比如對(duì)于 Ring(Enum,Combo Box)這類(lèi)的控件來(lái)說(shuō),如果在用戶(hù)自定義控件中添加了一項(xiàng)內(nèi)容(item),一般總是希望它所有的實(shí)例也同時(shí)添加這一選項(xiàng)。如果使用類(lèi)型定義控件,因?yàn)榭丶?lèi)型沒(méi)變,還是 Ring,實(shí)例們是不會(huì)自動(dòng)跟隨更新的。這時(shí)就需要使用嚴(yán)格類(lèi)型定義控件。選擇嚴(yán)格類(lèi)型定義后,不但實(shí)例與用戶(hù)自定義控件的類(lèi)型是相關(guān)聯(lián)的,

31、其他一些控件屬性,比如顏色等等,也是相關(guān)聯(lián)的。使用嚴(yán)格類(lèi)型定義時(shí)有一點(diǎn)容易被誤解:嚴(yán)格類(lèi)型定義只是與實(shí)例控件相關(guān)聯(lián),由它生成的實(shí)例常量的屬性是不與之關(guān)聯(lián)的。實(shí)例常量是指通過(guò)拖拽或生成常量等方法,在程序框圖上生成的一個(gè)與 .ctl 文件相關(guān)聯(lián)的常量。比如在 Ring 型用戶(hù)自定義控件中添加了一項(xiàng)內(nèi)容,相關(guān)的實(shí)例常量是不會(huì)發(fā)生任何改變的。很多人按常理想,認(rèn)為常量也應(yīng)當(dāng)自動(dòng)更新,但事實(shí)上不行。這也是我不采用它做常量定義的原因之一。(參見(jiàn):在 LabVIEW 中使用常量定義) LabVIEW 在 8.0 版對(duì)控件和函數(shù)面板作了一次較大調(diào)整。LabVIEW 功能越來(lái)越強(qiáng)大,控件和函數(shù)面板上的東西越來(lái)越多

32、。如果增加面板的嵌套深度,用戶(hù)每次選取面板上的一個(gè)控件和函數(shù)都要多點(diǎn)幾下鼠標(biāo),而且對(duì)不熟悉位置的東西找起來(lái)也相當(dāng)費(fèi)勁;如果擴(kuò)充每一個(gè)面板上的容量,一個(gè)面板上圖標(biāo)太多,用戶(hù)會(huì)眼花,也不利于查找。所以 LabVIEW 8 調(diào)整了面板的顯示方式:最頂層面板所有欄目都以文字的方式顯示,縱向排成一列。其中第一個(gè)欄目是默認(rèn)就展開(kāi)的,可以直接看到次級(jí)面板的內(nèi)容;其它欄目都收起,鼠標(biāo)挪上去,才看得到它里面的內(nèi)容。 我現(xiàn)在用的是 LabVIEW 8.2 版,它的函數(shù)面板看上去是這樣的:(在程序框圖的空白處點(diǎn)擊鼠標(biāo)右鍵)圖1:用鼠標(biāo)右鍵彈出函數(shù)面板 函數(shù)和子 VI 被分為幾大類(lèi),每個(gè)類(lèi)的名字被列在彈出的菜單上,其

33、中最前面一個(gè)類(lèi)是展開(kāi)的。因?yàn)榈谝粋€(gè)分類(lèi)中的函數(shù)最常用。 但是,有些人可能最常用的函數(shù)是在其它分類(lèi)中的。這樣可以調(diào)整一下,比如最常用的是 Express VI,就可以把它最常用挪到最前面來(lái)。 用鼠標(biāo)點(diǎn)彈出菜單左上角的圖釘,就可以吧彈出菜單固定住。固定后的菜單每一項(xiàng)左端有兩個(gè)豎線(xiàn),和一個(gè)三角。點(diǎn)擊三角可以展開(kāi)和收縮這個(gè)類(lèi)里的圖標(biāo),鼠標(biāo)放到兩個(gè)豎線(xiàn)上,鼠標(biāo)就會(huì)變成帶箭頭的十字花。這是就可以按下鼠標(biāo)拖動(dòng)這個(gè)條目了。點(diǎn)在 Express 項(xiàng)目的豎線(xiàn)上,然后把它托到最上面。如圖2、圖3所示: 圖2, 3:鼠標(biāo)點(diǎn)在連個(gè)豎線(xiàn)上可以拖動(dòng)這個(gè)項(xiàng)目 從此以后,Express 就在最上面了??磮D4,再在程序框圖上點(diǎn)鼠

34、標(biāo)右鍵,彈出的函數(shù)面板,最上面一欄展開(kāi)的就已經(jīng)變成 Express 了。圖4:新的函數(shù)面板 你可能會(huì)發(fā)現(xiàn),自己的 LabVIEW 在鼠標(biāo)右擊程序框圖后,只顯示出幾個(gè)分類(lèi),其他的類(lèi)別統(tǒng)統(tǒng)都縮了起來(lái)。用戶(hù)是可以自己制定顯示或隱藏哪些分類(lèi)的。在函數(shù)或控件面板釘住的狀態(tài)下(如圖2這種狀態(tài)),點(diǎn)擊面板最上方的“View”按鈕,就會(huì)出現(xiàn)讓你更改顯示或隱藏分類(lèi)的菜單。 如果你覺(jué)得 LabVIEW 的面板布局不是很合理,你要用的東西分散在不同的類(lèi)別里,用哪個(gè)坐首選項(xiàng)都不太方便。那也沒(méi)有關(guān)系,在 LabVIEW 8.5 中又多了一個(gè)類(lèi)別,叫 Favorite (我的最?lèi)?ài))。在函數(shù)或控件面板釘住的狀態(tài)下,右鍵點(diǎn)擊

35、其它類(lèi)別的函數(shù),或子面板標(biāo)題,彈出菜單上有一項(xiàng)就是加入到 Favorite 中。把你最常用的函數(shù)都放到 Favorite 里去,再把 Favorite 移到面板的最上端作為首選項(xiàng),就可以了。 在 Windows Explore 中,鼠標(biāo)右鍵點(diǎn)擊某一文件夾的空白處,彈出的菜單中有“新建”一項(xiàng)。通過(guò)修改 Windows 的注冊(cè)表,可以給這個(gè)新建列表添加一項(xiàng),從而直接在文件夾下創(chuàng)建一個(gè)新的 VI。如圖1所示。圖1:在“新建”菜單中添加一項(xiàng)-創(chuàng)建VI下載 Create New VI.zip 文件,然后解壓縮。運(yùn)行里面的 Create Empty VI.reg,把它里面的內(nèi)容導(dǎo)入到注冊(cè)表。然后就會(huì)發(fā)現(xiàn)多

36、出圖1所示的新建 VI 的項(xiàng)目了。讓 Windows 多一個(gè)新建項(xiàng)目,只要在注冊(cè)表里添加上相關(guān)內(nèi)容就行了。Create Empty VI.reg 文件中的 Data 數(shù)據(jù)其實(shí)就是新建出來(lái)的文件的內(nèi)容。在這個(gè)例子中,他是一個(gè)空白的 LabVIEW 8.0 的 VI。我們可以改變 reg 文件中的數(shù)據(jù),使得產(chǎn)生出來(lái)的 VI 有所不同。比如,你希望自己的新 VI 總是使用藍(lán)色背景的,有一個(gè)特殊的圖標(biāo)等等,只要改變 reg 文件中的數(shù)據(jù)就可以了。ZIP 包中還有一個(gè) Create New Reg Data.vi,這個(gè) VI 可以讀入一個(gè)文件,把它轉(zhuǎn)換成注冊(cè)表中實(shí)用的 Data 數(shù)據(jù)。使用者可以自己先造

37、一個(gè)自己喜歡的 VI 作為模板,然后利用Create New Reg Data.vi 為它創(chuàng)建出一個(gè)注冊(cè)表數(shù)據(jù),導(dǎo)入注冊(cè)表。這樣每次在文件夾下用鼠標(biāo)右鍵創(chuàng)建出的 VI 就是模板 VI 的樣子了。圖標(biāo)是 LabVIEW 語(yǔ)言很有特色的一個(gè)東西,其它語(yǔ)言大概都不需要給它的函數(shù)設(shè)置一個(gè)圖形標(biāo)識(shí)。認(rèn)真給每一個(gè) VI 加上一個(gè)有意義的圖標(biāo)是非常必要的,它可以幫助程序人員快速理解一段程序的含義。一個(gè)風(fēng)格良好的 VI,只要掃一眼它的程序框圖,就可以了解他的功能了,而不必要像文本語(yǔ)言那樣一行行把程序讀下來(lái)。LabVIEW 程序比文本語(yǔ)言的程序可讀性要高得多,當(dāng)然這是指在編程風(fēng)格良好的情況下進(jìn)行比較。有意義的圖

38、標(biāo)是良好程序風(fēng)格中非常重要的一項(xiàng)。編輯圖標(biāo)應(yīng)該是一個(gè)很常見(jiàn)的工作,雙擊一個(gè) VI 的圖標(biāo)就會(huì)出現(xiàn)圖標(biāo)編輯器,如下圖所示。上圖這個(gè)這個(gè)圖標(biāo)編輯器界面左上方是繪制圖標(biāo)的工具欄,里面工具被我編了號(hào)。不知道大家有沒(méi)有試過(guò)鼠標(biāo)雙擊這幾個(gè)工具,我是經(jīng)常雙擊他們的。編輯一個(gè) VI 的圖標(biāo),第一件事就是把他的默認(rèn)圖標(biāo)刪除,留一個(gè)空白框在上面就可以了。做這件工作不需要選中圖標(biāo)中的內(nèi)容再刪除,只要雙擊一次C2這個(gè)工具就可以了。如果不需要清楚圖標(biāo)中的內(nèi)容,只想給他添個(gè)邊框,那就雙擊C1這個(gè)工具。如果想選中整個(gè)圖標(biāo),以備拷貝,按 Ctrl+A 是沒(méi)用的,可以雙擊D1工具。雙擊D2,會(huì)出現(xiàn)一個(gè)字體設(shè)置對(duì)話(huà)框,在這里改變

39、寫(xiě)到圖標(biāo)上的字體。如果要在圖標(biāo)上寫(xiě)英文,最適合的字體是“Small Fonts”,字號(hào)8。一. 程序執(zhí)行順序 LabVIEW 是數(shù)據(jù)流驅(qū)動(dòng)的編程語(yǔ)言。程序在執(zhí)行時(shí)按照數(shù)據(jù)在連線(xiàn)上的流動(dòng)方向執(zhí)行。同時(shí),LabVIEW 是自動(dòng)多線(xiàn)程的編程語(yǔ)言。如果在程序中有兩個(gè)并行放置、它們之間沒(méi)有任何連線(xiàn)的模塊,則LabVIEW會(huì)把它們放置到不同的線(xiàn)程中,并行執(zhí)行。 圖1、2:順序執(zhí)行 和 并行執(zhí)行 的例子 順序執(zhí)行(圖1):數(shù)據(jù)會(huì)從控制控件流向顯示型控件,因此數(shù)據(jù)流經(jīng)的順序?yàn)椤癳rror in”控件,“SubVI A”,“SubVI B”,“error out”控件,這也是這個(gè)VI的執(zhí)行順序。 并行執(zhí)行(圖2

40、):“SubVI A”,“SubVI B”沒(méi)有數(shù)據(jù)線(xiàn)相互連接,它們會(huì)自動(dòng)被并行執(zhí)行。所以這個(gè)VI的執(zhí)行順序是“SubVI A”,“SubVI B”同時(shí)執(zhí)行,當(dāng)它們都執(zhí)行完成以后,再執(zhí)行“Merge Errors.vi”。二. 順序結(jié)構(gòu) 如果需要讓幾個(gè)沒(méi)有互相連線(xiàn)的VI,按照一定的順序執(zhí)行,可以使用順序結(jié)構(gòu)來(lái)完成(Sequence Structure)。 圖3:Menu Palette 當(dāng)程序運(yùn)行到順序結(jié)構(gòu)時(shí),會(huì)按照一個(gè)框架接著一個(gè)框架的順序依次執(zhí)行。每個(gè)框架中的代碼全部執(zhí)行結(jié)束,才會(huì)再開(kāi)始執(zhí)行下一個(gè)框架。把代碼放置在不同的框架中就可以保證它們的執(zhí)行順序。 LabVIEW 有兩種順序結(jié)構(gòu),分別是

41、層疊式順序結(jié)構(gòu)(Stacked Sequence Structure)、平鋪式順序結(jié)構(gòu)(Flat Sequence Structure)。這兩種順序結(jié)構(gòu)功能完全相同。平鋪式順序結(jié)構(gòu)把所有的框架按照從左到右的順序展開(kāi)在 VI 的框圖上;而層疊式順序結(jié)構(gòu)的每個(gè)框架是重疊的,只有一個(gè)框架可以直接在 VI 的框圖上顯示出來(lái)。在層疊式順序的不同的框架之間如需要傳遞數(shù)據(jù),需要使用順序結(jié)構(gòu)局部變量(Sequence Local)方可。圖4:層疊式順序結(jié)構(gòu)三. 順序結(jié)構(gòu)的使用 好的編程風(fēng)格應(yīng)盡可能少使用層疊式順序結(jié)構(gòu)。層疊式順序結(jié)構(gòu)的優(yōu)點(diǎn)是及部分代碼重迭在一起,可以減少代碼占用的屏幕空間。但它的缺點(diǎn)也是顯而易

42、見(jiàn)的:因?yàn)槊看沃荒芸吹匠绦虻牟糠执a,尤其是當(dāng)使用sequence local傳遞數(shù)據(jù)時(shí),要搞清楚數(shù)據(jù)是從哪里傳來(lái)的或傳到哪里去就比較麻煩。圖5:轉(zhuǎn)換順序結(jié)構(gòu) 使用平鋪式順序結(jié)構(gòu)可以大大提高程序的可讀性,但一個(gè)編寫(xiě)得好的 VI 是可以不使用任何順序結(jié)構(gòu)的。由于 LabVIEW 是數(shù)據(jù)流驅(qū)動(dòng)的編程語(yǔ)言,那么完全可以使用VI間連線(xiàn)來(lái)保證程序的運(yùn)行順序。對(duì)于原本沒(méi)有可連線(xiàn)的 LabVIEW 自帶函數(shù),比如延時(shí)函數(shù),也可以為其包裝一個(gè) VI,并使用 error in, error out,這樣就可以為使用它的VI提供連線(xiàn),以保證運(yùn)行順序。 圖6:改進(jìn)的延時(shí) VI 選擇結(jié)構(gòu) 選擇結(jié)構(gòu)相當(dāng)于文本語(yǔ)言中的條

43、件語(yǔ)句。LabVIEW 8 中新增加的 Diagram Disable Structure,Conditional Disabled Structure 類(lèi)似 C 語(yǔ)言中的條件宏定義語(yǔ)句。一. 程序框圖禁用結(jié)構(gòu)(Diagram Disable Structure) 在調(diào)試程序時(shí)常常會(huì)用到程序框圖禁用結(jié)構(gòu)。程序框圖禁用結(jié)構(gòu)中只有 Enabled 的一頁(yè)會(huì)在運(yùn)行時(shí)執(zhí)行,而 Disabled 頁(yè)是被禁用、即不會(huì)執(zhí)行的;并且在運(yùn)行時(shí),Disable 頁(yè)面里的 SubVI 不會(huì)被調(diào)入內(nèi)存。所以,被禁用的頁(yè)面如果有語(yǔ)法錯(cuò)誤也不會(huì)影響整個(gè)程序的運(yùn)行。這是一般選擇結(jié)構(gòu)(Case Structure)無(wú)法做到的

44、。圖1、2:使用程序框圖禁用結(jié)構(gòu) 例如圖 1、2 中的示例,如果我們?cè)谶\(yùn)行程序的時(shí)候暫時(shí)不希望將 test 寫(xiě)入到文件里,但又覺(jué)得有可能以后會(huì)用到。此時(shí),就可以使用程序框圖禁用結(jié)構(gòu)把不需要得程序禁用掉。需要注意的是程序框圖禁用結(jié)構(gòu)可以有多個(gè)被禁用的框架,但必須有且只能有一個(gè)被使用的框架。在被使用的框架中,一定要實(shí)現(xiàn)正確的邏輯,比如上圖的例子中,在被使用的框架中一定要有連線(xiàn)把前后的文件句柄和錯(cuò)誤處理聯(lián)接好。二. 條件禁用結(jié)構(gòu)(Conditional Disabled Structure) 條件禁用結(jié)構(gòu)則根據(jù)用戶(hù)設(shè)定的符號(hào)(symbol)的值來(lái)決定執(zhí)行哪一頁(yè)面上的程序。其他方面與程序框圖禁用結(jié)構(gòu)相

45、同。程序中所使用的符號(hào),可以在項(xiàng)目或是運(yùn)行目標(biāo)機(jī)器(例如“My Computer”)的屬性里設(shè)置。圖3:條件禁用結(jié)構(gòu) 值得注意的是:程序框圖禁用結(jié)構(gòu)與條件禁用結(jié)構(gòu)都是靜態(tài)的,如果需要在運(yùn)行時(shí)決定執(zhí)行哪一部分的程序可以使用選擇結(jié)構(gòu)。 程序框圖禁用結(jié)構(gòu)和條件禁用結(jié)構(gòu)的一種實(shí)用案例可以參考:其它常用調(diào)試工具和方法三. 選擇結(jié)構(gòu)(Case Structure) 在一般情況下,選擇結(jié)構(gòu)類(lèi)似于 C 語(yǔ)言的 switch 語(yǔ)句。當(dāng)輸入為 bool 數(shù)據(jù)類(lèi)型或 error 數(shù)據(jù)類(lèi)型時(shí),選擇結(jié)構(gòu)類(lèi)似于 C 語(yǔ)言中的 if 語(yǔ)句。圖4:枚舉類(lèi)型的 Case Selector 有輸出時(shí),則每一個(gè)框架中都必須連一個(gè)數(shù)

46、據(jù),當(dāng)然也可以選擇“Use Default If Unwired”。選擇“Use Default If Unwired”會(huì)有一定的風(fēng)險(xiǎn),因?yàn)槟憧赡軙?huì)忘記了連線(xiàn),這時(shí)候 LabVIEW 并不會(huì)提醒你,程序就可能得到不可預(yù)料的結(jié)果。 如圖5所示,鼠標(biāo)右擊數(shù)據(jù)輸出隧道,可以選擇是否使用“Use Default If Unwired”圖5:選擇 Use Default If Unwired 事件結(jié)構(gòu)阮奇楨 Event Structure 也是一種選擇結(jié)構(gòu),程序根據(jù)發(fā)生的事件決定執(zhí)行哪一個(gè)頁(yè)面的程序。此時(shí),LabVIEW 的界面編寫(xiě)與 Visual Basic 的界面程序有些類(lèi)似。一. 按照產(chǎn)出源來(lái)區(qū)分

47、事件的種類(lèi) 按照事件的產(chǎn)生源來(lái)區(qū)分,LabVIEW有以下幾種事件:圖1:配置事件 1 應(yīng)用程序事件(<Application>),這類(lèi)事件主要反映整個(gè)應(yīng)用程序狀態(tài)的變化,例如:程序是否關(guān)閉,是否超時(shí)等。 2 VI事件(<This VI>),這類(lèi)事件反映當(dāng)前VI狀態(tài)的改變。例如:當(dāng)前VI是否被關(guān)閉,是否選擇了菜單中的某一項(xiàng)等等。 3 動(dòng)態(tài)事件(Dynamic),用于處理用戶(hù)自己定義的或在程序中臨時(shí)生成的事件。 4 區(qū)域事件(Pane)和分割線(xiàn)事件(Splitter)是LabVIEW 8中新添加的特性。LabVIEW 8中,用戶(hù)可以把一個(gè)VI的前面板分割成幾份,這兩類(lèi)事件用

48、來(lái)處理用戶(hù)對(duì)某個(gè)區(qū)域或區(qū)域分割線(xiàn)的狀態(tài)的改變。圖2:面板上劃分區(qū)域 5 控件事件(Control)是最常用的一種事件,用于處理某個(gè)控件狀態(tài)的改變。例如,控件值的改變,或者鼠標(biāo)鍵盤(pán)的操作。打開(kāi)上述的“edit events”框,只要選定了某一個(gè)事件產(chǎn)生源,其相應(yīng)的所有事件均排列在右側(cè)events框中。有時(shí)候,多個(gè)事件產(chǎn)生源會(huì)對(duì)同一個(gè)用戶(hù)操作分別產(chǎn)生相應(yīng)事件。比如在某一控件上按下鼠標(biāo),區(qū)域事件和控件事件都會(huì)發(fā)出鼠標(biāo)按下(Mouse Down)事件。LabVIEW 按以下規(guī)則順序產(chǎn)生不同的事件:l 鍵盤(pán)相關(guān)的事件(Key Down, Key Up, etc.)只在當(dāng)前選中(Key Focused)的

49、控件上產(chǎn)生;l 鼠標(biāo)相關(guān)的事件(Mouse Down, etc.)按照從外向里的順序發(fā)出。例如,區(qū)域的鼠標(biāo)按下事件先于控件的鼠標(biāo)按下事件發(fā)出;結(jié)構(gòu)的鼠標(biāo)按下事件先于先于結(jié)構(gòu)內(nèi)控件的鼠標(biāo)按下事件發(fā)出。l 值改變事件按照從內(nèi)向外的順序發(fā)出。結(jié)構(gòu)(Cluser)內(nèi)控件的值改變事件先于結(jié)構(gòu)的值改變事件發(fā)出。二. 按照發(fā)出時(shí)間區(qū)分事件的種類(lèi) 按照事件的發(fā)出時(shí)間來(lái)區(qū)分,LabVIEW的事件可分為通知型事件(Notify Event)和過(guò)濾型事件(Filter Event)。 通知型事件是在LabVIEW處理完用戶(hù)操作之后發(fā)出的,比如用戶(hù)利用鍵盤(pán)操作改變了一個(gè)字符串,LabVIEW 在改變了該控件的值之后,

50、發(fā)出一個(gè)值改變(Value Changed)通知型事件,告訴事件結(jié)構(gòu),控件的值被改變了。如果事件結(jié)構(gòu)內(nèi)有處理該事件的框架,則程序轉(zhuǎn)去執(zhí)行該框架。 過(guò)濾型事件是在 LabVIEW 處理用戶(hù)操作之前發(fā)出的,并等待相對(duì)應(yīng)的事件框架執(zhí)行完成之后,LabVIEW 再處理該用戶(hù)操作。這類(lèi)事件的名稱(chēng)之后都有一個(gè)問(wèn)號(hào)。例如鍵盤(pán)按下?事件(Key Down? Event),當(dāng)用戶(hù)處理該事件時(shí),控件的值還沒(méi)有被改變,因此,用戶(hù)可以在該事件對(duì)應(yīng)的事件框架內(nèi)決定是否讓 LabVIEW先處理該事件,或改變鍵盤(pán)按下的值之后再讓LabVIEW繼續(xù)處理該事件。 可以明顯地看出,過(guò)濾型事件比相應(yīng)的通知型事件要先發(fā)出。 當(dāng)同一V

51、I的程序框圖上有多于一個(gè)的事件結(jié)構(gòu)時(shí),通知型事件是同時(shí)被發(fā)往所有的事件結(jié)構(gòu)的,而過(guò)濾型事件則是按順序、依次發(fā)往每一個(gè)事件結(jié)構(gòu)的。但是,在同一VI上放置多個(gè)事件結(jié)構(gòu)是沒(méi)有必要,而且極易引起錯(cuò)誤的。所以應(yīng)該避免在同一VI上使用多個(gè)事件結(jié)構(gòu)。 下面舉例說(shuō)明如何使用通知型事件。我們經(jīng)常需要使用到這樣的字符串控件:控件用于輸入電話(huà)號(hào)碼,因此只接收數(shù)字和橫線(xiàn),對(duì)其他按鍵不起反應(yīng)。LabVIEW沒(méi)有直接提供此種控件,但是它們可以利用通知型事件被方便地實(shí)現(xiàn)出來(lái)。圖3:利用 Key Down? 事件實(shí)現(xiàn)電話(huà)號(hào)碼控件 這個(gè)例子可以在這里下載:Phone Number Control.vi三. 動(dòng)態(tài)事件 在初始狀態(tài)

52、下,打開(kāi)事件配置(Edit Events)對(duì)話(huà)框,動(dòng)態(tài)事件下的一欄是空的。因?yàn)閯?dòng)態(tài)事件只有注冊(cè)過(guò)之后才能使用。與事件相關(guān)的操作在函數(shù)選欄的 Programming -> Dialog & User Interface -> Events 下面。 用于注冊(cè)事件的節(jié)點(diǎn)是事件注冊(cè)節(jié)點(diǎn)(Register For Events)。需要注冊(cè)某一事件時(shí),先為它的產(chǎn)生者生成一個(gè)引用節(jié)點(diǎn),然后將引用節(jié)點(diǎn)與事件注冊(cè)節(jié)點(diǎn)的下方區(qū)域相連,再選取所需的事件。如下例:圖4:注冊(cè)動(dòng)態(tài)事件 對(duì)于當(dāng)前VI上的控件或區(qū)域等類(lèi)型的事件,一般來(lái)說(shuō)可以在事件結(jié)構(gòu)中靜態(tài)地被選擇,所以不需要再動(dòng)態(tài)注冊(cè)一遍。但有時(shí),當(dāng)前

53、VI的程序框圖已經(jīng)過(guò)于復(fù)雜,我們希望在子 VI 里去處理某些控件的事件。這時(shí)就可以把控件的引用傳入子 VI,在子 VI 中動(dòng)態(tài)注冊(cè)所需事件。在子 VI 的事件結(jié)構(gòu)中處理相應(yīng)的事件。四. 用戶(hù)自定義的事件 用戶(hù)自定義的事件是動(dòng)態(tài)事件的一種。用戶(hù)自定義的事件不基于任何一個(gè)LabVIEW對(duì)象,它是使用創(chuàng)建用戶(hù)事件節(jié)點(diǎn)(Create User Event)生成出來(lái)的。并且,用戶(hù)可以選擇不同的事件數(shù)據(jù)類(lèi)型。五. ActiveX控件的事件 ActiveX 控件的事件不能直接被LabVIEW的事件結(jié)構(gòu)所截獲。ActiveX 事件需要用注冊(cè)事件回調(diào) VI 節(jié)點(diǎn)(Register Event Callback)

54、來(lái)為某一事件指定一個(gè)VI。當(dāng)事件發(fā)生時(shí),執(zhí)行被注冊(cè)的 VI。我們也可以利用注冊(cè)事件回調(diào) VI 節(jié)點(diǎn)為某一 LabVIEW 自身的事件注冊(cè)一個(gè)回調(diào) VI,但是出于運(yùn)行效率,和程序可讀性等方面的考慮,最好不要這樣使用。 循環(huán)結(jié)構(gòu) LabVIEW中的循環(huán)結(jié)構(gòu)有 for 循環(huán)和 while 循環(huán)。其功能與文本語(yǔ)言的循環(huán)結(jié)構(gòu)的功能類(lèi)似類(lèi)似,可以控制循環(huán)體內(nèi)的代碼執(zhí)行多次。一、for 循環(huán) 但是 LabVIEW 中的 for 循環(huán)的限制更多一些。 1 For 循環(huán)的迭代器只能從 0 開(kāi)始,并且每次只能增加 1。 2 For 循環(huán)不能中途中斷退出。C 語(yǔ)言里有 break 語(yǔ)句,但在 LabVIEW 中不要

55、試圖中間停止 for 循環(huán)。 外部數(shù)據(jù)進(jìn)入循環(huán)體是通過(guò)隧道進(jìn)入的,有幾種方式:圖1:For 循環(huán)結(jié)構(gòu)上的隧道 圖 1 所示的 For 循環(huán)結(jié)構(gòu)演示了三種隧道結(jié)構(gòu),就是在 For 循環(huán)結(jié)構(gòu)左右邊框上用于數(shù)據(jù)輸入輸出的節(jié)點(diǎn)。這三種隧道從上至下分別是:索引隧道、移位寄存器(shift register)、一般隧道。 一般隧道,就是把數(shù)據(jù)傳入傳出循環(huán)結(jié)構(gòu)。數(shù)據(jù)的類(lèi)型和值在傳入傳出循環(huán)結(jié)構(gòu)前后不發(fā)生變化。 索引隧道是 LabVIEW 的一種獨(dú)特功能。一個(gè)循環(huán)外的數(shù)組通過(guò)索引隧道連接到循環(huán)結(jié)構(gòu)上,隧道在循環(huán)內(nèi)一側(cè)會(huì)自動(dòng)取出數(shù)組的元素,依順序每次循環(huán)取出一個(gè)元素。用索引隧道傳出數(shù)據(jù),可以自動(dòng)把循環(huán)內(nèi)的數(shù)據(jù)組

56、織成數(shù)組。 通過(guò)移位寄存器傳入傳出數(shù)據(jù),也是數(shù)據(jù)的類(lèi)型和值都不會(huì)發(fā)生變化。移位寄存器的特殊之處在于在循環(huán)結(jié)構(gòu)兩端的接線(xiàn)端是強(qiáng)制使用同一內(nèi)存的。因此,上一次迭代執(zhí)行產(chǎn)生的某一值,傳給移位寄存器右側(cè)的接線(xiàn)端,如果下一次迭代運(yùn)行需要用到這個(gè)數(shù)據(jù),從移位寄存器左側(cè)的接線(xiàn)端引出就可以了。 C 語(yǔ)言程序員初學(xué) LabVIEW,在使用循環(huán)結(jié)構(gòu)時(shí),常常為創(chuàng)建一個(gè)中間變量煩惱。為循環(huán)中的變量創(chuàng)建一個(gè) Local Variable 不是好的方法。我們應(yīng)當(dāng)時(shí)刻記得 LabVIEW 與一般文本語(yǔ)言不同,LabVIEW 的數(shù)據(jù)不是保存在顯示的變量里,而是在連線(xiàn)上流動(dòng)的。LabVIEW 是通過(guò)移位寄存器把數(shù)據(jù)從一次循環(huán)傳遞到下一次的。圖2:反饋節(jié)點(diǎn) 如果單純是為了讓下一次迭代使用上次迭代的數(shù)據(jù),也可以使用反饋節(jié)點(diǎn),如圖2所示。 移位寄存器左側(cè)的接線(xiàn)端可以不只有一個(gè),用鼠標(biāo)可以把左側(cè)的接線(xiàn)端拉出多個(gè)來(lái),如圖3所示。下面的接線(xiàn)端可以記錄上兩次、三次的數(shù)據(jù)。圖3:多接線(xiàn)端移位寄存器 使用數(shù)組的隧道有一些需要注意的事項(xiàng),參考:LabVIEW 代碼中常見(jiàn)的錯(cuò)誤。 從 LabVIEW 8.5 開(kāi)始,for 循環(huán)增加了結(jié)束判斷條件。for 循環(huán)也可以像 while 循

溫馨提示

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

最新文檔

評(píng)論

0/150

提交評(píng)論