雖然NI labview/zhs/">LabVIEW軟件長(zhǎng)期以來一直幫助工程師和科學(xué)家們快速開發(fā)功能測(cè)量和控制應(yīng)用,,但不是所有的新用戶都會(huì)遵循LabVIEW編程的最佳方法,。LabVIEW圖形化編程比較獨(dú)特,因?yàn)橹恍杩匆谎塾脩舻膽?yīng)用程序,,就馬上可以發(fā)現(xiàn)用戶是否遵循編碼的最佳方法,。有些用戶會(huì)犯這些錯(cuò)誤是因?yàn)樗麄儧]有真正理解LabVIEW框圖數(shù)據(jù)流背后的原理,而有些用戶則是不知道哪些特性可提高LabVIEW編程質(zhì)量,。
本文介紹了經(jīng)驗(yàn)欠缺的LabVIEW程序員最經(jīng)常犯的一些編程錯(cuò)誤,,同時(shí)也提供了采用正確LabVIEW編程方法的建議。
圖1. LabVIEW新手典型“杰作”
過度使用平鋪式順序結(jié)構(gòu)
許多LabVIEW新手并不完全了解“數(shù)據(jù)流”執(zhí)行背后的概念,,而這些概念卻是LabVIEW編程的基礎(chǔ),。其中一個(gè)現(xiàn)象是用戶往往在程序框圖中過度使用平鋪式順序結(jié)構(gòu)。用戶經(jīng)常依賴平鋪式順序結(jié)構(gòu)來實(shí)現(xiàn)程序框圖的代碼串行執(zhí)行,,而不是使用數(shù)據(jù)流和節(jié)點(diǎn)之間的連線,。
圖2. 用戶往往過度依賴平鋪式順序結(jié)構(gòu),而沒有充分理解數(shù)據(jù)流編程概念,。
數(shù)據(jù)流編程是指只有在所需的數(shù)據(jù)輸入全部到達(dá)時(shí),,框圖上的節(jié)點(diǎn)(子VI、本原,、結(jié)構(gòu)等)才開始執(zhí)行,。 這對(duì)于使用LabVIEW的程序員來說非常有用,,因?yàn)楠?dú)立的進(jìn)程本身就可以實(shí)現(xiàn)并行運(yùn)行,而命令式語言卻需要額外的設(shè)置才能實(shí)行并行執(zhí)行,。隨著計(jì)算機(jī)CPU的不斷增多,,LabVIEW可自動(dòng)分解并行流程,提高代碼性能,,而無需用戶編寫任何額外代碼,。而強(qiáng)行使用平鋪式順序結(jié)構(gòu)來執(zhí)行程序框圖不僅會(huì)限制并行運(yùn)行,還會(huì)喪失這一優(yōu)勢(shì),。限制程序框圖中不必要的結(jié)構(gòu)有助于提高整體可讀性和保持更簡(jiǎn)潔的框圖,。
錯(cuò)誤連線可以有效地實(shí)現(xiàn)程序框圖上的數(shù)據(jù)流,而不需要依靠平鋪式順序結(jié)構(gòu),,此外錯(cuò)誤連線還有助于實(shí)現(xiàn)錯(cuò)誤處理策略,。
何時(shí)應(yīng)該使用平鋪式順序結(jié)構(gòu)?
通過平鋪式順序結(jié)構(gòu)來執(zhí)行程序框圖有助于代碼性能的基準(zhǔn)測(cè)試,。通過使用框架內(nèi)具有時(shí)間計(jì)數(shù)器的順序結(jié)構(gòu),,您可以決定兩個(gè)時(shí)間計(jì)數(shù)器之間代碼執(zhí)行所花費(fèi)的時(shí)間。這是一般數(shù)據(jù)流執(zhí)行所無法實(shí)現(xiàn)的,。
圖3. 平鋪式順序結(jié)構(gòu)和時(shí)間計(jì)數(shù)器VI有助于代碼的基準(zhǔn)測(cè)試。
關(guān)于數(shù)據(jù)流編程的更多信息,,請(qǐng)?jiān)L問在線自學(xué)培訓(xùn)(ni.com/self-paced-training)LabVIEW核心課程1的“數(shù)據(jù)流”,。購買LabVIEW或具有標(biāo)準(zhǔn)服務(wù)項(xiàng)目(ni.com/ SSP)會(huì)員資格的用戶可以免費(fèi)參加在線自學(xué)培訓(xùn)。
錯(cuò)誤使用局部變量
LabVIEW編程中另一個(gè)常見的錯(cuò)誤是過度使用局部變量,。局部變量是共享內(nèi)存中的一個(gè)區(qū)域,,用于在計(jì)算機(jī)程序不同部分之間傳遞數(shù)據(jù)。局域變量通常用于文本編程語言,,具有非常強(qiáng)大的功能,,但如果出現(xiàn)競(jìng)爭(zhēng)條件,就會(huì)產(chǎn)生問題,。
對(duì)于其他編程語言來說,,通過變量傳遞數(shù)據(jù)是必需的,而LabVIEW則提供了一種數(shù)據(jù)流方法,,可將數(shù)據(jù)從程序的一個(gè)部分移動(dòng)到另一個(gè)部分,。LabVIEW固有的并行性機(jī)制決定著用戶不能過度使用變量,因?yàn)橥粫r(shí)間內(nèi)通常會(huì)有多個(gè)不同的位置的程序訪問共享內(nèi)存,。如果過度使用變量,,則會(huì)出現(xiàn)某個(gè)讀/寫操作贏了“競(jìng)爭(zhēng)”,而其他操作則輸了“競(jìng)爭(zhēng)”,,丟失數(shù)據(jù)的操作會(huì)被忽視,,因此在LabVIEW中過度使用變量可能會(huì)最終導(dǎo)致數(shù)據(jù)丟失,。
您可以通過多種方法安全地將數(shù)據(jù)從LabVIEW程序的一個(gè)部分傳遞到另一個(gè)部分,包括連線,、隊(duì)列,、事件、通知,、功能全局變量等等,。每個(gè)機(jī)制都是針對(duì)特定情況設(shè)計(jì)的,但都具有消除競(jìng)爭(zhēng)條件的功能,。
關(guān)于在LabVIEW程序內(nèi)正確移動(dòng)數(shù)據(jù)的更多信息,,請(qǐng)?jiān)L問在線自學(xué)培訓(xùn)(ni.com/self-paced-training)LabVIEW核心課程1的“局域變量”和LabVIEW核心課程2的“通知、隊(duì)列和事件”,。
忽略代碼模塊化
通常情況下,,新LabVIEW用戶創(chuàng)建的是“即寫即忘”應(yīng)用程序去完成簡(jiǎn)單的任務(wù),而沒有考慮到以后是否會(huì)用到這些代碼,。隨著編程工作越來越多,,他們會(huì)發(fā)現(xiàn)自己一遍又一遍地重寫同一段代碼。而如果在編程同時(shí)創(chuàng)建一個(gè)可復(fù)用于其他應(yīng)用的模塊化子VI,,就可以節(jié)省大量的開發(fā)時(shí)間,。
如果您知道代碼的特定部分將會(huì)重用于同一應(yīng)用程序,或感覺該部分代碼可能會(huì)用于未來的應(yīng)用程序,,那么您應(yīng)該花一點(diǎn)時(shí)間將該部分代碼變成一個(gè)子VI,。如果要使某部分代碼成為一個(gè)子VI,您需要做的主要是添加一個(gè)文檔,、使用“接線端”,、禁用某些VI屬性。創(chuàng)建子VI的最簡(jiǎn)單方法之一是高亮標(biāo)記程序框圖中的某部分代碼,,然后從菜單欄中選擇“編輯>>創(chuàng)建子VI”,。這樣這部分代碼就會(huì)放到一個(gè)單獨(dú)的VI,然后使用“接線端”,。您仍然需要為圖標(biāo)添加說明,,并將文檔記述添加到程序框圖和VI屬性中,然后取消某些VI設(shè)置,,但“編輯>>創(chuàng)建子VI”可幫助您很好地了解代碼的模塊化功能,。
圖4. 采用正確的LabVIEW代碼模塊化操作可以幫助您節(jié)省大量開發(fā)時(shí)間。
代碼模塊化時(shí)必須取消的一項(xiàng)設(shè)置是“允許調(diào)試”,。 您可在“VI屬性(文件>>VI屬性)”下的“執(zhí)行”目錄中找到此選項(xiàng),。代碼完全正常運(yùn)行無需再使用高亮執(zhí)行等調(diào)試功能時(shí),在執(zhí)行設(shè)置中取消“允許調(diào)試”,,然后再次運(yùn)行VI,。這樣做的好處是由于在編譯過程中進(jìn)行了優(yōu)化,,應(yīng)用程序的運(yùn)行速度可能加快,而且由于啟動(dòng)調(diào)試的代碼被關(guān)閉,,VI所占的磁盤物理空間也相應(yīng)減少了,。
關(guān)于代碼模塊化的更多信息,請(qǐng)?jiān)L問在線自學(xué)培訓(xùn)LabVIEW核心課程1的“理解模塊化”,。
創(chuàng)建龐大繁瑣的程序框圖
許多新LabVIEW用戶都會(huì)把程序框圖編寫得非常繁瑣龐大,。對(duì)于一些復(fù)雜的應(yīng)用程序,我們難免需要編寫較大的程序框圖,,但龐大的程序框圖從一定程度上也可以表明該程序缺乏編程架構(gòu),。如果沒有一個(gè)基本的架構(gòu),要長(zhǎng)期維護(hù)該程序是非常困難的,,而且如果以后要添加新功能也會(huì)非常困難,。正如只有一個(gè)好的框架才能建造一棟結(jié)構(gòu)合理的房子,一個(gè)好的編程架構(gòu)可以為您構(gòu)建應(yīng)用程序提供了一個(gè)安全可靠的框架,。
幾乎所有的程序員都會(huì)發(fā)現(xiàn)常見的框架中,,軟件架構(gòu)是非常有用的。實(shí)際上LabVIEW中的許多架構(gòu),,如生產(chǎn)者/消費(fèi)者和狀態(tài)機(jī),,與其他編程語言非常相似。
了解LabVIEW的架構(gòu)可以縮短開發(fā)時(shí)間和提高應(yīng)用程序的可擴(kuò)展性,。LabVIEW 2012包含了模板和項(xiàng)目范例,,使理解架構(gòu)變得更加容易。模板解釋了不同的架構(gòu)及應(yīng)用,。項(xiàng)目范例則是基于模板的更大型應(yīng)用程序,,演示了如何使用模板來應(yīng)對(duì)實(shí)際的挑戰(zhàn),。您可以將硬件加入到范例項(xiàng)目中,,或者需要時(shí)可將項(xiàng)目范例作為一個(gè)整體應(yīng)用程序,同時(shí)項(xiàng)目范例具有開放性且文檔記述也很完整,,所以您可針對(duì)具體應(yīng)用進(jìn)行自定義,。
圖5. LabVIEW 2012中的模板和項(xiàng)目范例使得理解軟件架構(gòu)變得非常輕松。
關(guān)于LabVIEW架構(gòu)的更多信息,,請(qǐng)?jiān)L問在線自學(xué)培訓(xùn)(ni.com/self-paced-training) for LabVIEW核心課程2的“設(shè)計(jì)模式”,。
不重視文檔記錄
優(yōu)秀的代碼文檔可以有效地幫助他人理解自己寫的程序。遺憾的是,,許多程序員通常在開發(fā)周期末期功能開發(fā)結(jié)束之后才開始進(jìn)行文檔撰寫,。這使得用于對(duì)代碼進(jìn)行文檔記錄的時(shí)間變得非常少。正確的做法應(yīng)該是在開發(fā)過程中就需抽出時(shí)間來開始進(jìn)行文檔記錄,。文檔對(duì)于編程人員自身也非常有用,,尤其是當(dāng)他們過段時(shí)間回來看代碼卻不記得當(dāng)初他們?yōu)槭裁催x擇某些代碼時(shí),。程序員經(jīng)常會(huì)一邊喝著咖啡,一邊熬夜編程,,這往往會(huì)出現(xiàn)“短暫失憶”,。而文檔則可以幫助程序員進(jìn)行回憶。
一般情況下,,相對(duì)于基于文本的程序,,LabVIEW的圖形化特性使得程序閱讀更為容易,但是有效的文檔記錄可以減少“解碼”程序所需的時(shí)間,。添加文檔注釋到程序框圖的最簡(jiǎn)單方式是使用自由標(biāo)簽,。您可以在框圖的空白位置雙擊左鍵,并輸入文字,,添加注釋,。然后,使用箭頭標(biāo)記來指向自由標(biāo)簽引用的特定代碼,。如果需要添加圖片,,則可將它們復(fù)制到剪貼板,然后粘貼到程序框圖中,。物理系統(tǒng)圖片和數(shù)學(xué)公式均有助于清晰說明程序框圖內(nèi)的代碼上下文,。
圖6.架構(gòu)正確且文檔記錄充分的代碼不僅可幫助其他人理解您的代碼,也可幫助您更好地理解自己的代碼,。
對(duì)代碼進(jìn)行文檔記錄不僅只是針對(duì)復(fù)用程序庫,,而應(yīng)該是針對(duì)每一個(gè)程序。當(dāng)一個(gè)人需要為其他人講解時(shí),,他對(duì)該主題將會(huì)有更深刻的理解,。文檔記錄從本質(zhì)上看就是在迫使程序員進(jìn)行講解,以幫助他們更好地了解自己的代碼,。
關(guān)于文檔記述的更多信息,,請(qǐng)?jiān)L問在線自學(xué)培訓(xùn)LabVIEW核心課程1的“對(duì)代碼進(jìn)行文檔記錄”。
LabVIEW旨在幫助工程師和科學(xué)家更成功地應(yīng)對(duì)全球最嚴(yán)峻的挑戰(zhàn),。LabVIEW社區(qū)擁有龐大的工程師和科學(xué)家會(huì)員,,為其提供了一個(gè)有效的平臺(tái)來與他人分享知識(shí)。如果您愿意分享自己所犯過的新手錯(cuò)誤,,請(qǐng)發(fā)布到bit.ly/lvrookiemistakes,。