眾籌首發(fā)|龍哥手把手教你從零入門LabVIEW機(jī)器視覺(jué)!
labview怎么調(diào)試是我們?cè)谑褂肗I LabVIEW軟件時(shí)候經(jīng)常會(huì)碰到的問(wèn)題,當(dāng)軟件不能按照預(yù)期的情況運(yùn)行時(shí),我們可能會(huì)需要有一個(gè)自己的調(diào)試技巧和技術(shù)工具箱。 這些技巧和技術(shù)有些是常用的,而剩下的可能是您自己摸索出來(lái)的一些技巧。
圖1.巧妙的調(diào)試方法能夠清除漏洞。
我們與JKI的LabVIEW程序架構(gòu)師 ( Certified LabVIEW Architects, CLA ) 以及LabVIEW社區(qū)的朋友進(jìn)行了交流,向他們學(xué)習(xí)一些快速識(shí)別、隔離和修復(fù)漏洞的“絕密”技巧。我們了解到以下幾個(gè)巧妙的調(diào)試技巧。
利用探針
探針是LabVIEW調(diào)試的第一個(gè)也是最簡(jiǎn)單的工具,但它們卻是非常強(qiáng)大的工具。您可極其輕松地將探針置于線路上,在查找問(wèn)題過(guò)程中不斷獲取信息。 以下是探針的幾個(gè)功能:
保存連線值功能
LabVIEW開(kāi)發(fā)環(huán)境中的保存連線值功能經(jīng)常會(huì)被忽略。 當(dāng)您啟用某個(gè)VI的連線值保存功能時(shí),LabVIEW將自動(dòng)存儲(chǔ)該VI框圖上每根連線的最后一個(gè)值。 然后,將光標(biāo)懸停在任一連線上,即使該VI未運(yùn)行,探針工具也將出現(xiàn)提示信,顯示該連線最后一個(gè)值。
圖2.保存連線值按鈕就在“燈泡”圖標(biāo)旁邊。
自定義探針,無(wú)需編寫(xiě)任何代碼
運(yùn)用LabVIEW自定義探針,您無(wú)需編寫(xiě)任何代碼就可創(chuàng)建強(qiáng)大、復(fù)雜的調(diào)試工具。 例如,您可在“自定義探針”》》“控件”》》 “波形圖”中創(chuàng)建顯示任意數(shù)字連線的先前值的“歷史探針”。 這可幫助您發(fā)現(xiàn)您正在探究的數(shù)據(jù)的模式或趨勢(shì),而無(wú)需編寫(xiě)特殊的探針代碼。
圖3. 使用波形圖探針顯示簡(jiǎn)單數(shù)字連線的歷史值。
從LabVIEW工具網(wǎng)絡(luò)獲取自定義探針
借用他人創(chuàng)建的探針來(lái)擴(kuò)展您的工具箱。 SAPHIR在LabVIEW工具網(wǎng)絡(luò)上提供了一系列免費(fèi)的自定義LabVIEW探針。 您只需下載安裝VI軟件包管理器 (VIPM)社區(qū)版(也是免費(fèi)的)、搜索ViBox,再通過(guò)幾次單擊就可安裝探針。
如果您正在使用LabVIEW 2011,您還可通過(guò)單擊LabVIEW入門指南窗口的“查找LabVIEW附加工具。。。”從LabVIEW工具網(wǎng)絡(luò)上獲取ViBox。
圖4.使用VIPM安裝SAPHIR自定義探針。
調(diào)用時(shí)掛起
許多LabVIEW程序架構(gòu)師甚至不知道LabVIEW具備該項(xiàng)功能?!罢{(diào)用時(shí)掛起”功能可將執(zhí)行掛起,使您可以進(jìn)行以下任一或所有操作:
1. 在VI運(yùn)行之前隨意更改VI的控件值。
2. VI返回調(diào)用程序時(shí)隨意更改顯示件的值。
3. 重復(fù)運(yùn)行VI,而無(wú)需將執(zhí)行返回至調(diào)用程序。
4. 完全跳過(guò)VI執(zhí)行,返回至調(diào)用VI。
圖 5. 在子VI節(jié)點(diǎn)設(shè)置窗口中,選擇“調(diào)用時(shí)掛起”功能。
對(duì)于調(diào)用時(shí)掛起功能,NI做了簡(jiǎn)要說(shuō)明,見(jiàn)此處。 然而,熟悉該功能的最佳方法還是親自動(dòng)手實(shí)踐。
未連線的前面板控件和顯示件
為FIRST(崇尚發(fā)揚(yáng)科學(xué)技術(shù))機(jī)器人競(jìng)賽團(tuán)隊(duì)推薦了一項(xiàng)技術(shù),這項(xiàng)技術(shù)對(duì)于專業(yè)的LabVIEW開(kāi)發(fā)人員也非常有用
Ben建議在VI中添加前面板控件或顯示控件,但并不與連線板連接。 這些控件和顯示件與“調(diào)試”輸入或輸出工作方式類似,您可在測(cè)試時(shí)對(duì)其進(jìn)行手動(dòng)控制。 這可使您更容易在應(yīng)用中生成偶然或極端事件,而無(wú)需繁多的支持或仿真代碼的寫(xiě)入。
您還可以在已建應(yīng)用程序中使用這些調(diào)試控件和顯示件,前提是LabVIEW應(yīng)用程序生成器包含了VI前面板。
參閱LVMastery.com上的介紹,進(jìn)一步了解Ben建議的調(diào)試子VI。
執(zhí)行跟蹤
如果其他方法都失敗的情況下,有時(shí)您所能做的只有逐步跟蹤代碼。 遇到此類問(wèn)題時(shí),您可通過(guò)幾種方法在LabVIEW內(nèi)進(jìn)行執(zhí)行跟蹤。
最明顯的方法是使用LabVIEW中內(nèi)置的“高亮顯示執(zhí)行”功能,也稱為“燈泡”。 如果說(shuō)探針是LabVIEW調(diào)試的首要工具,燈泡則位列第二。 但是,如果碰到復(fù)雜或是時(shí)間相關(guān)的漏洞,您則可選擇其他更有效的工具。
圖6. 執(zhí)行跟蹤功能比燈泡功能更多。
跟蹤磁盤(pán)或內(nèi)存
啟動(dòng)執(zhí)行跟蹤的一個(gè)簡(jiǎn)單方法是在其中一個(gè)子VI中記錄一個(gè)連線值。 您可編寫(xiě)一個(gè)簡(jiǎn)單的VI,將該值記錄到文件中,或甚至可創(chuàng)建一個(gè)自定義探針來(lái)顯示連線的歷史值。 通常通過(guò)這樣一個(gè)簡(jiǎn)單的跟蹤您就可收集足夠的信息來(lái)幫助您找到漏洞的原因。
NI LabVIEW桌面執(zhí)行跟蹤工具包
如果要調(diào)試一個(gè)大型的高度并行應(yīng)用程序,則包含NI開(kāi)發(fā)者套件 2011的LabVIEW桌面執(zhí)行跟蹤工具包就是您進(jìn)行LabVIEW代碼分析的“利器”。 它可提供關(guān)于正在運(yùn)行的應(yīng)用程序的各種信息,包括詳細(xì)的內(nèi)存分配和再分配、事件生成、由代碼定義的自定義信息。 Austin LabVIEW程序架構(gòu)師論壇的創(chuàng)建人之一Fabiola De la Cueva指出該工具包可用于調(diào)試已崩潰的應(yīng)用程序,因?yàn)樗仟?dú)立于LabVIEW之外運(yùn)行的。
圖7. 手動(dòng)執(zhí)行追蹤具有風(fēng)險(xiǎn)(圖片采自O(shè)liver Widder)
專業(yè)的LabVIEW開(kāi)發(fā)人員很慶幸,因?yàn)長(zhǎng)abVIEW桌面執(zhí)行跟蹤工具包已包含在NI開(kāi)發(fā)者套件2011之中,不會(huì)產(chǎn)生額外的費(fèi)用。
單元測(cè)試
測(cè)試驅(qū)動(dòng)開(kāi)發(fā)(TDD) 是一種軟件工程技術(shù),可幫助您從頭創(chuàng)建更好的代碼,同時(shí)它也是幫助您調(diào)試現(xiàn)有代碼的一個(gè)有效工具。
在TDD中,當(dāng)您發(fā)現(xiàn)應(yīng)用程序存在漏洞時(shí),調(diào)試流程的第一個(gè)步驟就是創(chuàng)建一個(gè)可重現(xiàn)漏洞并導(dǎo)致測(cè)試失敗的單元測(cè)試。只有到那時(shí)候,您才確實(shí)可以開(kāi)始嘗試修復(fù)問(wèn)題。 如果單元測(cè)試通過(guò),則表明您已清除了該漏洞。
圖8. 你在哪里測(cè)試代碼?
這種漏洞修復(fù)方法需要費(fèi)點(diǎn)時(shí)間,但是相比其他較不精確的方法,它具有以下幾個(gè)優(yōu)點(diǎn):
1. 單元測(cè)試具有可追溯性,可完整顯示漏洞的發(fā)生過(guò)程以及您如何將漏洞隔離
2. 您或其他開(kāi)發(fā)者可隨時(shí)輕松驗(yàn)證或重新驗(yàn)證您的修復(fù),而無(wú)需記住激活漏洞的詳細(xì)信息。
3. 單元測(cè)試可在您的項(xiàng)目中與其他測(cè)試一起自動(dòng)執(zhí)行,因此漏洞如果再次出現(xiàn),您可以立即知曉。
針對(duì)單元測(cè)試有兩個(gè)主要的LabVIEW附加工具,TDD方法可以與另一個(gè)一同使用。 查看JKI的免費(fèi)VI測(cè)試儀LabVIEW附加工具或參閱Eli Kerry的LabVIEW軟件工程指南,進(jìn)一步解LabVIEW單元測(cè)試框架工具包,它已包含在NI開(kāi)發(fā)者套件之內(nèi)。
?
基于labview的USB調(diào)試小助手
這里給大家分享一個(gè)為了查看收發(fā)數(shù)據(jù)而編寫(xiě)的基于labview的USB調(diào)試小助手,極其簡(jiǎn)單的程序案例。
一、前期準(zhǔn)備
首先介紹一下USB設(shè)備(STM32 USB),設(shè)備通過(guò)一個(gè)接口2個(gè)端點(diǎn)與主機(jī)通信,兩個(gè)端點(diǎn)分別為端點(diǎn)1輸入和端點(diǎn)1輸出。兩個(gè)端點(diǎn)均為中斷端點(diǎn)。
好,下面來(lái)正式介紹一下基于labview的USB調(diào)試小助手。
USB口的HID類能輕易的被windows系統(tǒng)識(shí)別,因?yàn)樗鼉?nèi)置了USB HID驅(qū)動(dòng)。但是這個(gè)驅(qū)動(dòng)是不被labview承認(rèn)的。要想被labview承認(rèn),需要安裝VISA生成的USB驅(qū)動(dòng)。(個(gè)人感覺(jué)這個(gè)是labview比較不好的地方)具體的操作方法是:
打開(kāi)NI-VISA driver wizard
選擇USB,點(diǎn)NEXT
因?yàn)槲业腢SB設(shè)備一直在電腦上插著,所以VISA安裝向?qū)ёR(shí)別了它,我們直接選中這個(gè)設(shè)備。這個(gè)時(shí)候你會(huì)發(fā)現(xiàn),都自動(dòng)填裝好了,不用我們自己再填寫(xiě)。 包括Vendor ID、Product ID、Descriptor Information(可以查看各種描述符),Model Name(設(shè)備管理器要顯示的名字)我們點(diǎn)擊NEXT,進(jìn)行下一步(點(diǎn)完后可能會(huì)跳出小窗口,我們一路點(diǎn)Yes,通過(guò))
下一步是Output Files Generation,我們可以不做任何修改直接next
最后一步是Installation Option,我們選第一項(xiàng)安裝,然后點(diǎn)Finish。
然后系統(tǒng)就開(kāi)始安裝驅(qū)動(dòng)啦。我遇到的情況是安裝完成,它彈出一個(gè)小窗口說(shuō)安裝不成功,我們不用管它直接close就好。然后這個(gè)時(shí)候我們?cè)偃ピO(shè)備管理器中看,已經(jīng)產(chǎn)生可以被labview識(shí)別的驅(qū)動(dòng)了。
那么如何查看我們的USB能被labview識(shí)別了呢。我們打開(kāi)NI-MAX,在設(shè)備和接口處如果能看到我們的USB設(shè)備,說(shuō)明已經(jīng)被識(shí)別了。(我一般是看0x0413::0x5724來(lái)識(shí)別我的USB口,因?yàn)檫@兩個(gè)參數(shù)是我自己設(shè)的。。)
我們選打開(kāi)VISA測(cè)試面板,可以看到一些USB狀態(tài),這也證明USB設(shè)備的一些信息,繼續(xù)往下走。
上面我們已經(jīng)驗(yàn)證了NI可以識(shí)別USB口,我們開(kāi)始編寫(xiě)小助手程序吧。
二、程序編寫(xiě)
新建VI文件。
因?yàn)槭褂肰ISA通信,所以我們想到的肯定是去VISA里找驅(qū)動(dòng)。先把幾個(gè)常用的拖出來(lái)。(它們的都在儀器I/O—》VISA里,具體哪個(gè)在什么位置我就不說(shuō)了)VISA打開(kāi)、VISA寫(xiě)入、VISA讀取、VISA關(guān)閉。于是我們連接了這樣的結(jié)構(gòu)
結(jié)果,我打開(kāi)VISA資源口發(fā)現(xiàn)是COM4,懵逼了呀,上面才說(shuō)的USB口識(shí)別了呀。
研究一番(實(shí)際上是忘記了從哪里查的了)問(wèn)題出在VISA資源名稱,這個(gè)控件上,我們需要設(shè)備它識(shí)別的VISA類為USB。具體設(shè)置方式是在控件上右鍵—》選擇VISA—》I/O session--》USB Raw
Ok設(shè)置完成我們就能找到USB設(shè)備啦!我們運(yùn)行一下看看效果,結(jié)果出來(lái)這個(gè)鬼東西。
電子發(fā)燒友網(wǎng)上有大神已經(jīng)針對(duì)這個(gè)問(wèn)題給出了解決辦法:大家可以參考借鑒
http://bbs.elecfans.com/jishu_515959_1_1.html
我大概說(shuō)一下大概就是,就是HID類只支持僅支持控制傳輸和中斷傳輸。需要主機(jī)發(fā)送命令后,USB設(shè)備返回信息,這樣才能完成讀取。所以我們需要使用中斷方式進(jìn)行數(shù)據(jù)讀取。按照上面給出的解決辦法(非常詳細(xì))我們做出修改。于是程序又變成了這個(gè)樣子。
然后再運(yùn)行程序,完成啦。配合上一博文寫(xiě)的USBHID通訊的歷程,我們通過(guò)上位機(jī)把字符5通過(guò)主機(jī)發(fā)給設(shè)備,然后設(shè)備,把收到的字符發(fā)給主機(jī),我們也確實(shí)讀到了字符5?。。〉酱撕?jiǎn)單的USB通訊已經(jīng)可以了但是,我們是要做通訊小助手的人呀,不能就此止步呀。
我們繼續(xù)往下修改,上面的網(wǎng)址中文章提到過(guò)”要注意必須在visa寫(xiě)入之后才可以讀取usb中斷返回的數(shù)據(jù)。不寫(xiě)入或是寫(xiě)入的數(shù)據(jù)錯(cuò)誤導(dǎo)致無(wú)返回值,就會(huì)產(chǎn)生超時(shí)錯(cuò)誤 VISA: (Hex 0xBFFF0015) 完成操作前超時(shí)已過(guò)期?!?/p>
經(jīng)過(guò)實(shí)測(cè),確實(shí)是這樣樣子。于是我們通過(guò)一個(gè)條件結(jié)構(gòu)來(lái)解決,當(dāng)需要發(fā)送數(shù)據(jù)時(shí),點(diǎn)發(fā)送按鍵,條件為真,labview將發(fā)送寫(xiě)入緩沖區(qū)的數(shù)據(jù),當(dāng)不需要發(fā)送時(shí),條件為假,系統(tǒng)送0字節(jié)
說(shuō)系統(tǒng)完成操作前超時(shí),問(wèn)題出在VISA等待事件,這是為什么呢?原來(lái)我們?cè)O(shè)置啟用中斷傳輸時(shí)間,結(jié)果這個(gè)中斷傳輸一直沒(méi)發(fā)生,沒(méi)有數(shù)據(jù)通過(guò)中斷傳輸讀取過(guò)來(lái)。所以系統(tǒng)報(bào)錯(cuò)了。但是仔細(xì)想想,USB設(shè)備想發(fā)數(shù)據(jù)就發(fā)數(shù)據(jù),沒(méi)有要發(fā)送的數(shù)據(jù),你偏要它發(fā)點(diǎn)有效數(shù)據(jù),也是無(wú)理的要求呀(USB設(shè)備內(nèi)心:你自己報(bào)錯(cuò),怪我咯)怎么辦呢?既然我們理解了超時(shí)的原因,他對(duì)于我們USB通信也無(wú)大礙,那我們就忽略它好了!具體的操作方式是:
獲取錯(cuò)報(bào)代碼(0xbfff0015)然后當(dāng)發(fā)現(xiàn)是超時(shí)報(bào)錯(cuò)時(shí)我們不處理它,不用彈出報(bào)錯(cuò)窗口
這個(gè)時(shí)候程序已經(jīng)可以正常運(yùn)行了,主體部分完成,下面再介紹幾個(gè)細(xì)枝末節(jié)的部分
1、 使用移位寄存器實(shí)現(xiàn)讀取緩沖區(qū)的的不覆蓋顯示。
2、 使用條件結(jié)構(gòu)控制USB口的打開(kāi)與關(guān)閉
3、 調(diào)用發(fā)送緩沖區(qū)與接收緩沖區(qū)的顯示樣式的屬性節(jié)點(diǎn)控制屬性
最后的最后程序是這樣的
前面板是這樣的
至此USB通信小助手完成!
LabVIEW程序的調(diào)試方式
在實(shí)際的應(yīng)用中,程序員通常將上述多種調(diào)試工具綜合起來(lái)使用。根據(jù)多種提示和輔助信息可以快速地定位錯(cuò)誤源,并觀察部分代碼執(zhí)行的詳細(xì)過(guò)程,最終排除錯(cuò)誤,達(dá)到調(diào)試程序的目的。下面給大家再分享一下LabVIEW程序的調(diào)試方式。
調(diào)試工具是任何一種程序開(kāi)發(fā)環(huán)境都必須提供的功能,它們可以顯著地提高程序員的開(kāi)發(fā)效率。LabVIEW作為一種圖形化程序設(shè)計(jì)語(yǔ)言的IDE工具(同時(shí)也是一門獨(dú)特的語(yǔ)言),自然需要考慮為工程師提供適合于圖形化語(yǔ)言調(diào)試的工具。
事實(shí)上,LabVIEW并沒(méi)有規(guī)定哪些工具被劃分為調(diào)試工具,哪些工具被劃分為其它的工具。這種界限和定義是比較模糊的,在實(shí)際使用中,我們可以把輔助程序員更準(zhǔn)確、快捷地定位代碼執(zhí)行和Bug的工具統(tǒng)稱為“調(diào)試工具”。
LabVIEW主要的調(diào)試工具位于工具欄,如圖 1所示。從左至右依次是:
Run:運(yùn)行,單擊它會(huì)直接運(yùn)行當(dāng)前的VI,快捷鍵Ctrl + R。
Run Continuously:連續(xù)運(yùn)行。
Abort Execution:中止運(yùn)行,單擊它會(huì)停止當(dāng)前運(yùn)行的VI。
Pause:暫停運(yùn)行。
Highlight Execution:高亮執(zhí)行工具,單擊它程序會(huì)變慢,反映整個(gè)數(shù)據(jù)流運(yùn)行的過(guò)程。
Retain Wire Values:?jiǎn)螕羲鼤?huì)保留當(dāng)前連接線上的值(這一點(diǎn)在后面描述)。
Start Single Stepping:?jiǎn)尾綀?zhí)行,此時(shí)程序往前運(yùn)行一個(gè)節(jié)點(diǎn)。
Step Over:跳過(guò)當(dāng)前的節(jié)點(diǎn)。
Step Out:跳出單步執(zhí)行。
Step Into:進(jìn)入到某一個(gè)子VI中執(zhí)行。
其中(1)~(4)是常用的工具,用來(lái)控制VI的運(yùn)行、暫停和停止;而(7)~(10)是其它的程序設(shè)計(jì)語(yǔ)言的IDE環(huán)境均具備的,用法也沒(méi)有其它的區(qū)別。因此,本文將著重介紹LabVIEW中特有的程序調(diào)試工具或者方法。
圖 1 LabVIEW的工具欄
1.1錯(cuò)誤列表(Error List)
LabVIEW作為一種圖形化的編譯型語(yǔ)言,其編譯的過(guò)程是在后臺(tái)自動(dòng)完成的(無(wú)需程序員手動(dòng)編譯),編譯后的目標(biāo)代碼也存儲(chǔ)在vi文件中。因此LabVIEW會(huì)“實(shí)時(shí)地”判斷代碼是否能夠正常運(yùn)行。當(dāng)無(wú)法正常運(yùn)行時(shí),將彈出Error List對(duì)話框,列出當(dāng)前VI繼承中所有的錯(cuò)誤,如圖 2所示。
對(duì)話框分為3個(gè)部分,分別表示發(fā)生錯(cuò)誤的VIs、發(fā)生錯(cuò)誤的節(jié)點(diǎn)和錯(cuò)誤簡(jiǎn)單表述、錯(cuò)誤的詳細(xì)描述。雙擊某一個(gè)VI可以直接打開(kāi)該VI,雙擊某個(gè)錯(cuò)誤節(jié)點(diǎn)可以直接定位到該節(jié)點(diǎn)節(jié)點(diǎn)。
圖 2 Error List對(duì)話框
通常使用該方式可以快速地定位發(fā)生錯(cuò)誤的VI或節(jié)點(diǎn),并根據(jù)錯(cuò)誤描述進(jìn)行修改。有時(shí)候會(huì)出現(xiàn)LabVIEW的“運(yùn)行”箭頭是斷開(kāi),而Error List對(duì)話框中卻沒(méi)有顯示任何錯(cuò)誤的情況。這是由于LabVIEW在內(nèi)存中的已編譯代碼無(wú)法執(zhí)行,只需要把當(dāng)前的VI重新強(qiáng)制編譯即可,方法是在單擊“運(yùn)行”箭頭的同時(shí)按住Ctrl鍵(LabVIEW 8.6.1之前的版本可能是Ctrl + Shift鍵)。
1.2VI繼承和調(diào)用(VI Hierarchy)
LabVIEW允許并且鼓勵(lì)子VI的調(diào)用,因此VI之間存在著調(diào)用與被調(diào)用關(guān)系,LabVIEW將這種關(guān)系以圖形的方式表示出來(lái),稱之為“VI繼承”(動(dòng)態(tài)調(diào)用的VI將不會(huì)顯示其調(diào)用與被調(diào)用的關(guān)系)。選擇View》》VI Hierarchy菜單項(xiàng),彈出VI之間的關(guān)系圖,如圖 3所示。
圖 3 VI Hierarchy
從該圖中可以迅速地看出當(dāng)前VI的子VI以及被調(diào)用的VI之間的關(guān)系,雙擊某個(gè)VI的圖標(biāo)可以快速地打開(kāi)該VI前面板。
【小技巧】
雙擊某個(gè)VI圖標(biāo)的同時(shí)按住Ctrl鍵能夠直接打開(kāi)VI的后面板。
當(dāng)LabVIEW暫停在某個(gè)VI中時(shí),會(huì)在背面板工具欄中顯示當(dāng)前VI被調(diào)用的VIs列表,如圖 4所示。從圖中可以看出,當(dāng)前的VI正被1.vi調(diào)用,單擊該選項(xiàng),可以看出整個(gè)被調(diào)用關(guān)系的列表VIs。當(dāng)從列表中選擇某一個(gè)VI時(shí),LabVIEW會(huì)自動(dòng)定位到該VI。
圖 4 VI Caller Chain
1.3斷點(diǎn)工具(Breakpoint)
LabVIEW運(yùn)行對(duì)背面板中的任何一個(gè)節(jié)點(diǎn)和連線都可以設(shè)置斷點(diǎn),程序運(yùn)行到斷點(diǎn)位置時(shí)會(huì)暫停運(yùn)行。
在需要放置斷點(diǎn)的位置上右擊,選擇彈出菜單中的Breakpoint菜單項(xiàng),使用Set Breakpoint指令可以在當(dāng)前位置放置一個(gè)斷點(diǎn),如圖 5所示。
圖 5 Breakpoint快捷菜單
當(dāng)在已經(jīng)存在斷點(diǎn)的位置上右擊鼠標(biāo)時(shí),會(huì)彈出圖 6所示的快捷菜單。使用Clear Breakpoint菜單項(xiàng)可以清除當(dāng)前的斷點(diǎn),而Disable Breakpoint可以禁止當(dāng)前的斷點(diǎn),此時(shí)斷點(diǎn)將不再暫停程序的執(zhí)行。
圖 6 Breakpoint快捷菜單
在大型的程序調(diào)試中,斷點(diǎn)往往是使用的最為頻繁的工具,它使得程序員能夠迅速地專注于所關(guān)心的VI,而對(duì)于其它的VI執(zhí)行過(guò)程則正常運(yùn)行。通常,程序員為了找到某個(gè)Bug出現(xiàn)的原因,會(huì)在背面板中設(shè)置若干個(gè)斷點(diǎn),而一旦清除掉Bug后又需要將這些斷點(diǎn)一一地清除,這難免會(huì)重復(fù)和繁瑣。LabVIEW 8.6提供了一個(gè)斷點(diǎn)管理的工具,可以選擇圖 5或圖 6中的Breakpoint Manager菜單項(xiàng),啟動(dòng)如所示的斷點(diǎn)管理對(duì)話框(或者直接使用View》》Breakpoint Manager菜單項(xiàng))。該對(duì)話框中列出了當(dāng)前內(nèi)存中所有VI中包含的斷點(diǎn),程序員可以選擇任意地?cái)帱c(diǎn)批量地將它們清除或者禁設(shè)置為禁止?fàn)顟B(tài)。
鍵字: LabVIEW程序 調(diào)試方式
圖 7 Breakpoint Manager對(duì)話框
1.4高亮工具(Highlight)
高亮工具是LabVIEW相對(duì)于傳統(tǒng)的文本式語(yǔ)言的IDE環(huán)境所獨(dú)有的調(diào)試工具,也是數(shù)據(jù)流程序設(shè)計(jì)思想的一種體現(xiàn)。打開(kāi)工具欄中的Highlight工具(如圖 8所示)并單擊“Run”按鈕,程序開(kāi)始在Highlight模式下運(yùn)行。此時(shí)根據(jù)數(shù)據(jù)流的運(yùn)行順序,LabVIEW將在各個(gè)節(jié)點(diǎn)的輸入和輸出的端子上顯示當(dāng)前端子上的數(shù)據(jù),并且以小圓點(diǎn)的方式顯示數(shù)據(jù)流的執(zhí)行方式。程序員可以比較清楚地觀察到數(shù)據(jù)流的走向以及源代碼的執(zhí)行情況,這極大地方便了LabVIEW開(kāi)發(fā)者對(duì)某部分代碼的詳細(xì)調(diào)試。
圖 8 Highlight工具
對(duì)初學(xué)者而言,這種調(diào)試方式無(wú)疑是直觀和清楚的。但是同時(shí)對(duì)一些VI也會(huì)帶來(lái)一些影響,如某些對(duì)時(shí)間有著嚴(yán)格控制的VI。由于在Highlight模式中,LabVIEW會(huì)減慢程序執(zhí)行的速度,因此有些與時(shí)間有關(guān)的事件或者Bug會(huì)被掩蓋和忽略。這也是為什么有時(shí)候程序在Highlight模式下運(yùn)行正常,而回到普通模式時(shí)卻無(wú)法返回正確的結(jié)果。此時(shí),就需要使用Breakpoint和Probe工具(下一小節(jié)介紹)聯(lián)合調(diào)試,找到程序出現(xiàn)問(wèn)題的原因。
1.5探針工具(Probe)
探針并不是LabVIEW所特有的調(diào)試工具,在很多的文本式語(yǔ)言的IDE中都存在著Watch窗口用來(lái)實(shí)時(shí)監(jiān)視某些變量的值,LabVIEW中的探針與此類似,也是用來(lái)實(shí)時(shí)監(jiān)測(cè)程序背面板中任一連接線(不是任一節(jié)點(diǎn))上的值。
右擊源代碼中任一連線處,選擇Probe菜單項(xiàng)將彈出當(dāng)前位置的探針,如圖 9所示。LabVIEW會(huì)自動(dòng)判斷當(dāng)前位置的數(shù)據(jù)類型從而調(diào)用不同的探針以顯示當(dāng)前位置的數(shù)據(jù)。當(dāng)VI的背面板關(guān)閉時(shí),那么該VI中所有的探針窗口也會(huì)自動(dòng)關(guān)閉。運(yùn)行VI,當(dāng)運(yùn)行到探針的位置時(shí)將在探針窗口中立即顯示當(dāng)前的值。
圖 9 Probe工具
為了定位到錯(cuò)誤源或者找到某一時(shí)刻的運(yùn)行結(jié)果,往往程序員需要配合斷點(diǎn)和探針工具,在適當(dāng)?shù)奈恢迷黾訑帱c(diǎn),而適當(dāng)?shù)奈恢眉尤胩结槨;蛘咧苯釉O(shè)置探針工具,讓探針捕獲到某一特定的條件是程序暫停運(yùn)行。如在圖 9中,選擇Custom Probe》》Conditional String Probe菜單項(xiàng)將彈出圖 10所示的探針窗口。在Condition頁(yè)中,可以設(shè)置程序暫停的條件。當(dāng)滿足該條件時(shí),程序?qū)⒘⒓丛诋?dāng)前探針位置暫停。
圖 10 Conditional String Probe
從圖 9和圖 10可以看出,探針的主要功能就是將當(dāng)前連線上的數(shù)據(jù)以控件(Indicator)的形式表示出來(lái)。由于在LabVIEW中,數(shù)據(jù)的顯示方式是可以自定義的,如使用Type Def.控件修改某些控件的外觀或者將String控件以****的密碼方式顯示,因此LabVIEW提供了自定義探針技術(shù)允許程序員根據(jù)實(shí)際情況使用任意預(yù)定義的探針。
在圖 9的快捷菜單中選擇Custom Probe》》New…菜單項(xiàng),將彈出圖 11所示的自定義探針向?qū)?。程序員可以選擇從現(xiàn)有的探針文件(從后面可以看出,事實(shí)上也是一個(gè)vi文件)新建探針或者直接新建一個(gè)空的探針。選擇“Create a new probe”項(xiàng)。
圖 11 Create New Probe_1
單擊Next按鈕進(jìn)入圖 12所示的界面。Filename表示探針文件的名字;Window title and shortcut menu name表示探針VI的標(biāo)題欄名字同時(shí)也是使用探針時(shí)出現(xiàn)在快捷菜單中的名字;Directory to save the probe表示探針的存儲(chǔ)位置。
圖 12 Create New Probe_2
單擊Save按鈕,LabVIEW會(huì)自動(dòng)生成圖 13所示的探針VI。不要?jiǎng)h除界面上的任何控件:
String型控件表示探針位置當(dāng)前的數(shù)值;
Boolean型控件表示條件斷點(diǎn),當(dāng)該值被設(shè)置為TRUE時(shí),程序?qū)⒃诋?dāng)前的斷點(diǎn)處暫停。
實(shí)際上,程序員可以任意修改這兩個(gè)控件的外觀,如設(shè)置為自定義類型、修改控件的Label或Caption,甚至可以在當(dāng)前VI中加入新的控件。但是最好不要修改控件的類型和Connection(輸入輸出連接端子)定義方式,因?yàn)長(zhǎng)abVIEW會(huì)根據(jù)控件的類型選擇在不同的位置調(diào)用不同的探針VI。
圖 13 String Probe_Custom.vi
本例將修改String Probe_Custom.vi(下載)使得程序以不同的方式顯示String的值,并且設(shè)置為當(dāng)值為“Hello”時(shí)暫停程序運(yùn)行。如圖 14所示,加入適當(dāng)?shù)拇a,并調(diào)整Probe的前面板窗口大小(這也是最終探針的顯示大?。?。
圖 14 修改后的String Probe_Custom.vi
新建一個(gè)VI,并加入一個(gè)String控件,此時(shí)在右鍵快捷菜單中選擇Custom Probe》》 My First String Probe菜單項(xiàng),如圖 15所示。
圖 15 調(diào)用String Probe_Custom探針
此時(shí),LabVIEW會(huì)自動(dòng)調(diào)用String Probe_Custom.vi,并以探針窗口的樣式顯示,如圖 16所示。在運(yùn)行VI前修改Display Style中的值并運(yùn)行VI,那么String顯示框?qū)⒆詣?dòng)以相應(yīng)的方式顯示數(shù)值。
圖 16 String Probe_Custom探針窗口
從上面的調(diào)用過(guò)程可以看出,LabVIEW中的探針實(shí)際上是對(duì)VI的調(diào)用。因此,在編輯探針VI時(shí)需要遵循以下的原則:
不要在探針VI中加入任何等待或長(zhǎng)時(shí)間執(zhí)行的代碼,如循環(huán)、事件、隊(duì)列等,否則LabVIEW在運(yùn)行時(shí)會(huì)自動(dòng)掛起。
不要修改探針VI的默認(rèn)屬性,如設(shè)置為Modal等。但是可以修改它的標(biāo)題欄和大小。
只有當(dāng)程序運(yùn)行到探針位置時(shí),探針窗口才顯示當(dāng)前運(yùn)行值,并且這些值在連線中不會(huì)保存。也就是說(shuō)如果需要探測(cè)某個(gè)位置的值必須要在運(yùn)行之前在該位置加入探針,否則如果是在程序運(yùn)行之后再次加入探針,那么這些新加入的探針將無(wú)法顯示程序之前的運(yùn)行值。
LabVIEW提供了一種工具允許程序中的連接線保留上一次的運(yùn)行值。單擊圖 17中的“Retain Wire Values”按鈕打開(kāi)該工具,此時(shí)LabVIEW將保留當(dāng)前VI上一次的運(yùn)行值。當(dāng)VI運(yùn)行完成后,再次添加探針,則探針會(huì)自動(dòng)立即顯示該位置上一次的運(yùn)行值。當(dāng)然,這也會(huì)影響程序運(yùn)行的效率,因此當(dāng)VI退出內(nèi)存時(shí),LabVIEW會(huì)自動(dòng)關(guān)閉該工具。
圖 17 Retain Wire Values工具
1.6VI窗口管理(VI Windows)
在調(diào)試過(guò)程中,為了追蹤子VI的運(yùn)行狀態(tài),經(jīng)常需要打開(kāi)很多的VI窗口。往往在關(guān)閉這些窗口時(shí)反復(fù)地按下“Ctrl + W”鍵,LabVIEW提供了同時(shí)關(guān)閉這些VI的方法。單擊Windows》》All Windows…(快捷點(diǎn)是Ctrl + Shift + W)菜單項(xiàng),將彈出圖 18所示的VI窗口管理對(duì)話框。選擇需要關(guān)閉的窗口(可以使用Ctrl鍵或Shift鍵多選),單擊“Close Windows”按鈕就可以關(guān)閉選擇的窗口。
圖 18 VI窗口管理
【小技巧】
在LabVIEW中,按下Ctrl + Tab鍵能夠在不同的LabVIEW窗口之間切換(Windows的Alt + Tab鍵是在所有的窗口之間切換)。
評(píng)論
查看更多