ABB機器人的錯誤處理
??? errnum 數據類型
????? errnum用于描述在執行過程中,發生的所有可恢復的錯誤。例如程序執行時,被零除。??? 如果機器人程序執行過程中檢測到一個錯誤,錯誤非致命,可以被錯誤處理程序處理。??? 這類錯誤的典型例子是過大的值或者被零除。?????errnum類型的系統變量 errno,根據不同的錯誤性質,分配不同的值。錯誤處理程序可以通過讀取這個變量來糾正錯誤,然后執行程序可以正確的方式繼續運行。
???? 錯誤也可以通過使用RAISE指令在程序中創建。錯誤處理程序通過指定一個能檢測到該特定類型的錯誤號(范圍1-90內或通過BookErrNo指令預訂)作為RAISE的參數。
示例:
?? ? ? reg1 := reg2 / reg3;
? ?? ? ...
? ? ? ERROR
? ? ? IF ?? ERRNO = ERR_DIVZERO? ? THEN
? ? ? reg3 := 1;
? ? ? RETRY;
?? ?? ENDIF
??? 如果REG3= 0,機器人除法時檢測到發生的錯誤。這個錯誤可以被檢測并通過分配REG3的值為1予以糾正。因此除法可再次被執行,程序可以繼續執行。
?? ?? CONST errnum machine_error := 1;
? ? ? ...
? ? ? IF di1=0 RAISE machine_error;
? ? ? ...
????? ERROR
??? IF ERRNO=machine_error RAISE;?
????? 機器人通過信號DI1檢測出現的錯誤。跳轉到錯誤處理程序。調用的錯誤處理程序調,糾正這個錯誤。machine_error作為一個常數,用來讓錯誤處理程序確切知道發生的是哪種錯誤的類型。
????? 預定義的錯誤類型
?????系統變量? ERRNO 可以用于讀取最后一次發生的錯誤。 許多預定義常量可以用來確定發生的錯誤類型。 (ABB編程手冊 1179 page)
???? 關于raise
????? RAISE用于在程序中產生一個錯誤,并調用程序的錯誤處理函數。 RAISE 同樣可以在錯誤處理函數中使用,將當前錯誤傳送給調用程序的錯誤處理函數。
這個指令可以用于跳回高一層的程序結構,例如,底層的錯誤返給主程序的錯誤處理函數。
?????? 參數:
?????? RAISE [ Error no. ]
?????? Error no的數據類型為 errnum。Error number: 錯誤處理程序可以通過ERRNO系統變量查找1和90之間任意數字的錯誤。
????? 舉例:
MODULE MainModule
??????? VAR errnum ERR_MY_ERR := -1;
??????? PROC main()
??????? BookErrNo ERR_MY_ERR;
??????????? IF di1 = 0 THEN
?????? ? ? ? ?? RAISE ERR_MY_ERR;
????? ? ? ? ENDIF
??????? ERROR
??????? IF ERRNO = ERR_MY_ERR THEN
?????? ? ?? TPWrite "di1 equals 0";
??????? ENDIF
??????? ENDPROC
ENDMODULE
?????? 如果 di1 等于 0 產生一個錯誤. RAISE 會將程序推動到錯誤處理程序處執行。在這個程序中,用戶創建了自己的錯誤號處理指定的錯誤。. 通過BookErrNo注冊錯誤號并使用。
?MODULE MainModule
????? VAR num value1 := 10;
????? VAR num value2 := 0;
????? PROC main()
???? ? ?? routine1;
???? ? ?? ERROR
???? ? ?? IF ERRNO = ERR_DIVZERO THEN
??? ? ? ? ? ? value2 := 1;
????????????? RETRY;???? ! RETRY 指令用于當一個錯誤發生時,重新運行引起錯誤的指令。
??? ? ? ? ENDIF
????? ENDPROC
????? PROC routine1()
????????? value1 := 5/value2;?? !當value2為0的時候,這將導致一個錯誤。
?? ? ?? ? ERROR
???? ? ?? RAISE;
??? ? ENDPROC
ENDMODULE
??
?????? 關于錯誤處理
?????? TRYNEXT - 跳過產生錯誤的指令,繼續運行。 TRYNEXT 指令用于在產生一個錯誤后,程序運行產生錯誤的下一條語句。
?????? 示例
??? ? ?? reg2 := reg3/reg4;
??? ? ? ? ...
??????ERROR
????????? IF ERRNO = ERR_DIVZERO THEN
???? ? ?? reg2:=0;
???????? TRYNEXT;
??????ENDIF
????? RETRY 指令用于從引起錯誤的地方恢復程序繼續運行。
????? 示例:
???? ? ? reg2 := reg3/reg4;
???? ? ? ...
????? ERROR
??????? IF ERRNO = ERR_DIVZERO THEN
??? ? ? ?? reg4 :=1;
???? ? ? ? RETRY;
??? ? ? ENDIF
?????? reg3除以reg4,如果reg4等于0(零),那么跳轉到錯誤處理程序,重新為reg4賦值。 然后RETRY從錯誤處理程序跳出,回到產生錯誤的除法指令,執行除法指令。
?????? 錯誤處理程序與機器人運動示例(在機器人運動過程中產生某種錯誤時,如何在自動模式下恢復錯誤)
PROC
??????? CONST robtarget service_pos := [...];
??????? VAR robtarget stop_pos;
??????? ...
???? ERROR
????? ? IF ERRNO = AW_WELD_ERR THEN
????? ? ? ? ? ? ! Current movement on motion base path level is already stopped.
?????? ? ? ?? ? ! New motion path level for new movements in the ERROR handler
??????? StorePath;
?????? ? ? ? ?? ! Store current position from motion base path level
??????? stop_pos := CRobT(\Tool:=tool1, \WObj:=wobj1);
?????? ? ? ? ?? ! Do the work to fix the problem
??????? MoveJ service_pos, v50, fine, tool1, \WObj:=wobj1;
??????? ...
?????? ? ? ? ?? ! Move back to the position on the motion base path level
??????? MoveJ stop_pos, v50, fine, tool1, \WObj:=wobj1;
?????? ? ? ? ?? ! Go back to motion base path level
??????? RestoPath;
?????? ? ? ? ?? ! Restart the stopped movements on motion base path level,
????? ? ? ? ? ? ! restart the process and retry program execution
??????? StartMoveRetry;
??????? ENDIF
ENDPROC