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