簡(jiǎn)介:errnum用于描述在執(zhí)行過(guò)程中,發(fā)生的所有可恢復(fù)的錯(cuò)誤。例如程序執(zhí)行時(shí),被零除。如果機(jī)器人程序執(zhí)行過(guò)程中檢測(cè)到一個(gè)錯(cuò)誤,錯(cuò)誤非致命,可以被錯(cuò)誤處理程序處理。這類錯(cuò)誤的典型例子是過(guò)大的值或者被零除。errnum類型的系統(tǒng)變errno,根據(jù)不同的錯(cuò)誤性質(zhì),分……
errnum用于描述在執(zhí)行過(guò)程中,發(fā)生的所有可恢復(fù)的錯(cuò)誤。例如程序執(zhí)行時(shí),被零除。如果機(jī)器人程序執(zhí)行過(guò)程中檢測(cè)到一個(gè)錯(cuò)誤,錯(cuò)誤非致命,可以被錯(cuò)誤處理程序處理。這類錯(cuò)誤的典型例子是過(guò)大的值或者被零除。errnum類型的系統(tǒng)變errno,根據(jù)不同的錯(cuò)誤性質(zhì),分配不同的值。錯(cuò)誤處理程序可以通過(guò)讀取這個(gè)變量來(lái)糾正錯(cuò)誤,然后執(zhí)行程序可以正確的方式繼續(xù)運(yùn)行。
錯(cuò)誤也可以通過(guò)使用RAISE指令在程序中創(chuàng)建。錯(cuò)誤處理程序通過(guò)指定一個(gè)能檢測(cè)到該特定類型的錯(cuò)誤號(hào)(范圍1-90內(nèi)或通過(guò)BookErrNo指令預(yù)訂)作為RAISE的參數(shù)。
示例:
reg1:=reg2/reg3;
ERROR
IFERRNO=ERR_DIVZEROTHEN
reg3:=1;
RETRY;
ENDIF
如果REG3=0,機(jī)器人除法時(shí)檢測(cè)到發(fā)生的錯(cuò)誤。這個(gè)錯(cuò)誤可以被檢測(cè)并通過(guò)分配REG3的值為1予以糾正。因此除法可再次被執(zhí)行,程序可以繼續(xù)執(zhí)行。
CONST
errnummachine_error:=1;
IF di1=0RAISEmachine_error;
ERROR
IFERRNO=machine_errorRAISE;
機(jī)器人通過(guò)信號(hào)DI1檢測(cè)出現(xiàn)的錯(cuò)誤。跳轉(zhuǎn)到錯(cuò)誤處理程序。調(diào)用的錯(cuò)誤處理程序調(diào),糾正這個(gè)錯(cuò)誤。machine_error作為一個(gè)常數(shù),用來(lái)讓錯(cuò)誤處理程序確切知道發(fā)生的是哪種錯(cuò)誤的類型。
系統(tǒng)變量ERRNO可以用于讀取最后一次發(fā)生的錯(cuò)誤。許多預(yù)定義常量可以用來(lái)確定發(fā)生的錯(cuò)誤類型。關(guān)于raise,RAISE用于在程序中產(chǎn)生一個(gè)錯(cuò)誤,并調(diào)用程序的錯(cuò)誤處理函數(shù)。RAISE同樣可以在錯(cuò)誤處理函數(shù)中使用,將當(dāng)前錯(cuò)誤傳送給調(diào)用程序的錯(cuò)誤處理函數(shù)。這個(gè)指令可以用于跳回高一層的程序結(jié)構(gòu),例如,底層的錯(cuò)誤返給主程序的錯(cuò)誤處理函數(shù)。
參數(shù):
RAISE [Error no]
Error no的數(shù)據(jù)類型為errnum。Errornumber:錯(cuò)誤處理程序可以通過(guò)ERRNO系統(tǒng)變量查找1和90之間任意數(shù)字的錯(cuò)誤。
舉例:
MODULEMainModule
VAR errnumERR_MY_ERR:=-1;
PROC main( )
BookErrNoERR_MY_ERR;
IF=0THEN
RAISEERR_MY_ERR;
ENDIF
ERROR
IF ERRNO=ERR_MY_ERR
THENTPWrite"di1equals 0";
ENDIF
ENDPROC
ENDMODULE
如果di1等于0產(chǎn)生一個(gè)錯(cuò)誤。RAISE會(huì)將程序推動(dòng)到錯(cuò)誤處理程序處執(zhí)行。在這個(gè)程序中,用戶創(chuàng)建了自己的錯(cuò)誤號(hào)處理指定的錯(cuò)誤。通過(guò)BookErrNo注冊(cè)錯(cuò)誤號(hào)并使用。
MODULEMainModule
VAR numvalue1:=10;
VAR numvalue2:=0;
PROC main()
routine1;
ERROR
IFERRNO=ERR_DIVZEROTHEN
value2:=1;
RETRY;RETRY指令用于當(dāng)一個(gè)錯(cuò)誤發(fā)生時(shí),重新運(yùn)行引起錯(cuò)誤的指令。
ENDIF
ENDPROC
PROCroutine1( )
value1:=5/value2;當(dāng)value2為0的時(shí)候,這將導(dǎo)致一個(gè)錯(cuò)誤。
ERROR
RAISE;
ENDPROC
ENDMODULE
關(guān)于錯(cuò)誤處理,TRYNEXT-跳過(guò)產(chǎn)生錯(cuò)誤的指令,繼續(xù)運(yùn)行。TRYNEXT指令用于在產(chǎn)生一個(gè)錯(cuò)誤后,程序運(yùn)行產(chǎn)生錯(cuò)誤的下一條語(yǔ)句。
示例:
reg2:=reg3/reg4;
ERROR
IF ERRNO=ERR_DIVZEROTHEN
reg2:=0;
TRYNEXT;
ENDIF
RETRY指令用于從引起錯(cuò)誤的地方恢復(fù)程序繼續(xù)運(yùn)行。
示例:
reg2:=reg3/reg4;
ERROR
IF ERRNO =ERR_DIVZERO THEN
reg4:=1;
RETRY;
ENDIF
reg3除以reg4,如果reg4等于0(零),那么跳轉(zhuǎn)到錯(cuò)誤處理程序,重新為reg4賦值。然后RETRY從錯(cuò)誤處理程序跳出,回到產(chǎn)生錯(cuò)誤的除法指令,執(zhí)行除法指令。錯(cuò)誤處理程序與機(jī)器人運(yùn)動(dòng)示例(在機(jī)器人運(yùn)動(dòng)過(guò)程中產(chǎn)生某種錯(cuò)誤時(shí),如何在自動(dòng)模式下恢復(fù)錯(cuò)誤)
PROC
CONSTrobtarget service_pos:=[...];
VARrobtargetstop_pos;
ERROR
IFERRNO=AW_WELD_ERRTHEN
Currentmovement on motion base pathlevel is already stopped.
New motionpath level for newmovements in the ERROR handler
StorePath;
Storecurrent position from motionbase path level
stop_pos:=CRobT(\Tool:=tool1,\WObj:=wobj1);
!Do the workto fix the problem
MoveJservice_pos,v50,fine,tool1,\WObj:=wobj1;
Move backto the position on themotion base path level
MoveJstop_pos,v50,fine,tool1,\WObj:=wobj1;
Go back tomotion base path leveRestoPath;
Restart thestopped movements onmotion base path level,
restart theprocess and retryprogram execution
StartMoveRetry;
ENDIF
ENDPROC
文章來(lái)源,
工業(yè)機(jī)器人維修官網(wǎng):etongyue.com