我們可以在LabVIEW的Modern>>Array, Matrix & Cluster控件面板找到表示錯誤簇數據類型的錯誤輸入(Error In)以及錯誤輸出(Error Out)兩個錯誤簇控件。其實在很多LabVIEW的內置函數以及VI中,都包括了錯誤輸入以及錯誤輸出這兩個錯誤簇類型的輸入與輸出參數。錯誤簇是LabVIEW中的一個特殊的數據類型,該簇是由一個表示狀態的布爾變量(status)、一個表示錯誤代碼的32位整型變量(code)以及一個說明錯誤原因的字符串變量(source)組成的,錯誤簇用於傳遞LabVIEW代碼運行期間的出錯信息。
程序中出現錯誤並對錯誤進行處理是很自然的現象,我們沒有必要害怕程序出錯,更重要的是我們要學會發現錯誤發生的原因、獲取錯誤的信息以及處理錯誤的方法。在LabVIEW中,什么叫做錯誤呢?簡單的說,一個函數或子VI不能夠完成其所設定的功能就可以稱為出錯了。出錯的原因可能是無法訪問必要的資源或者是函數接受的參數是無效的等等。在LabVIEW這個數據流的編程語言中,是是使用錯誤簇這種數據類型來傳遞錯誤信息的。 錯誤簇(Error Cluster)數據類型
如下圖所示,LabVIEW中的錯誤簇是由以下三部分組成的:
1. status 狀態布爾量,當有錯誤發生時該值為TRUE,沒有錯誤發生時該值為FALSE;
2.
code 標識錯誤代碼的32位整型變量,當該值為負時表示有程序警告,為零表示沒出錯,為正表示有錯誤發
生; 3.
source 錯誤原因字符串,給出了出錯原因的描述性信息。
錯誤信息傳遞:錯誤數據流
LabVIEW本身就是一個基於數據流的編程語言,對於錯誤信息的傳遞也是使用數據流的形式在LabVIEW的程序框圖中實現的。如下圖中的紅點標識處所示,錯誤簇數據在框圖中是按順序、連續的在程序中傳遞的。
很多LabVIEW函數以及子VI都有錯誤輸入(Error In)以及錯誤輸出(Error Out)端點,一般這兩個端點分別位於函數節點圖標的左下側以及右下側。 在子VI中如何對錯誤做出反應
函數以及子VI對於錯誤的一般反應都是按照如下兩點實現的: 1.
如果錯誤輸入(Error In)參數輸入了一個錯誤,不要進行除了清理操作之外的任何其他操作,而清理操作包括
了:關閉文件、關閉設備或通訊端口、將系統切換回空閑或安全狀態(例如關閉電機等等); 2.
如果在函數或子VI內部出錯,就需要通過函數或子VI的錯誤輸出(Error Out)端點將該錯誤信息傳遞出去。
如果從函數或子VI的錯誤輸入端點早就傳入了一個錯誤信息,那就原封不動的將該錯誤信息從錯誤輸出端點輸出。 以錯誤簇為條件的Case結構
通過使用如下圖所示的錯誤簇Case結構,我們可以輕易的實現上面中的第2條的常規錯誤處理動作。實現錯誤簇Case結構只需要將一個錯誤簇數據連接到Case結構的選擇端上。
var script = document.createElement('script'); script.src = 'http://static.pay.baidu.com/resource/baichuan/ns.js'; document.body.appendChild(script);
當錯誤簇數據連接到Case結構的選擇端子后,Case結構的兩個默認幀的名稱就自動變為“No Error”和“Error”了。在程序運行時,如果輸入的錯誤簇中沒有出錯信息,就會執行Case結構中的No Error幀中的代碼,反之則執行Error幀中的代碼。實現上面提到的第2條功能只需要將Error幀中錯誤簇直接連接到VI的錯誤輸出端,將沒錯誤的情況下的執行代碼放到No Error幀中。 錯誤數據融合
在程序中如果上游的函數就已經出錯了,這時要做清理工作該怎么辦呢?這時就不便使用錯誤Case結構了,最好就是使用融合錯誤(Merge Error)函數將所有的上游錯誤融合在一起,如下圖所示:
這個函數可以在Programming>>Dialog & User Interface面板中找到。在使用這個函數的時候要注意,錯誤簇只能包含一個錯誤信息,而這個融合錯誤的函數將多個錯誤融合為一個錯誤,最終得到的錯誤是按照該函數的輸入端至上而下的優先級得到的,也就是說優先級最高的輸入端上如果有錯誤數據,最終的輸出就是該錯誤數據。在實際的編程中,就需要按照程序中實際需要連接這個函數的錯誤輸入數據。如果所有的輸入端都沒有錯誤發生,最后該函數的輸出也是無錯誤的(no error)。