7 错误恢复
7.4 异步引起的错误
关于异步错误
如果一个移动指令以角区结束,那么在第一个移动指令完成其路径之前,必须执行下 一个移动指令。否则,机械臂不知道如何在角区移动。如果每一个移动指令以较大角 区,仅移动一段短距离,那么必须预先执行若干移动指令。
如果在机械臂移动期间有哪里错了,那么可能发生错误。然而,如果继续执行程序,
那么,在出错时移动机械臂的是哪个移动指令这点上,并不明显。将通过处理异步错 误来解决这项问题。
基本理念在于,异步错误与一个移动指令关联起来,将由调用该移动指令的程序中的 错误处理器处理异步错误。
两类异步错误
有两种方式造成异步错误,引起的行为稍稍不同
• ProcerrRecovery \SyncOrgMoveInst造成的异步错误与产生当前机械臂 路径的移动指令相关联。
• ProcerrRecovery \SyncLastMoveInst造成的异步错误与当前被执行的移 动指令相关联。如果当前没有执行任何移动指令,则此错误与将要执行的下一 移动指令相关联。
如果在第一条路径期间出现错误,但程序在计算第二条路径(参见下图),那么,行 为取决于ProcerrRecovery的参数。如果以\SyncOrgMoveInst造成错误,那么该 错误与第一个移动指令(产生第一条路径的指令)相关联。如果以
\SyncLastMoveInst造成错误,那么,该错误与第二个移动指令(产生第二条路径 的指令)相关联。
p0 p1
p2
xx1300000276
在调用移动指令的程序中,尝试处理错误
如果生成一个能处理错误的程序来处理机械臂移动期间可能出现的过程错误,那么,
你想要在此程序中处理此类过程错误。如果当程序指针处于一个子程序中时发出错误,
那么你不想要该子程序的错误处理器来处理错误。
下一页继续
104 技术参考手册 - RAPID语言内核
7.4 异步引起的错误
异步错误与机械臂当前执行的路径相关联。可由出错时其移动指令产生机械臂执行路 径的那个程序中的错误处理器来处理异步错误。
在下述示例中,在机械臂到达p1前发生过程错误,但程序指针已经继续到子程序 write_log。
程序示例
PROC main() ...
PROC my_process() ...
MoveL p1, v300, z10, tool1;
write_log;
MoveL p2, v300, z10, tool1;
...
ERROR ...
ENDPROC
PROC write_log() ...
以ProcerrRecovery \SyncOrgMoveInst产生的异步错误将由my_process.中的 错误处理器来即刻进行处理。以ProcerrRecovery \SyncLastMoveInst产生的 异步错误将等待程序指针到达my_process中的第二个移动指令,之后才在
my_process的错误处理器中处理该错误。
注意
如果子程序(本例中,系指write_log)将具备移动指令,并且使用
\SyncLastMoveInst,那么可能由该子程序中的错误处理器来处理该错误。
如果my_process中的错误处理器以EXIT结尾,那么将停止所有程序执行。
如果my_process中的错误处理器以RAISE结尾,那么,将由main中的错误处理器处 理该错误。程序调用my_process并放弃write_log。如果主程序中的错误处理器 以RETRY结尾,那么将重新开始执行my_process。
StartMove来让引起错误的指令重新开始移动。即便错误处理器以RETRY结尾,第一
PROC main() ...
PROC my_process() ...
MoveL p1, v300, z10, tool1;
MoveL p2, v300, z10, tool1;
...
• 如果以ProcerrRecovery \SyncOrgMoveInst发出错误,那么,将在调用 链中步进一步来处理该错误。将由对被弃程序调用进行调用的程序的错误处理 器来处理此错误。在上述示例中,如果my_process程序调用被放弃,那么将 由主程序的错误处理器来处理此错误。
• 如果以ProcerrRecovery \SyncLastMoveInst发出错误,那么将由下一移 动指令所在的错误处理器(即,my_process的第二个程序调用)来处理该错
示例
MODULE user_module
VAR intnum proc_sup_int;
VAR iodev logfile;
PROC main() ...
PROC my_process() my_proc_on;
MoveL p1, v300, z10, tool1;
write_log;
MoveL p2, v300, z10, tool1;
my_proc_off;
ERROR
IF ERRNO = ERR_PATH_STOP THEN my_proc_on;
StartMove;
RETRY;
ENDIF ENDPROC
PROC write_log()
Open "HOME:" \File:= "log.txt", logfile \Append;
Write logfile "my_process executing";
Close logfile;
ERROR
IF ERRNO = ERR_FILEOPEN THEN TRYNEXT;
ENDIF UNDO
Close logfile;
ENDPROC
TRAP iprocfail my_proc_off;
ProcerrRecovery \SyncLastMoveInst;
RETURN;
PROC my_proc_on() SetDO do_myproc, 1;
CONNECT proc_sup_int WITH iprocfail;
ISignalDI di_proc_sup, 1, proc_sup_int;
ENDPROC
PROC my_proc_off() SetDO do_myproc, 0;
IDelete proc_sup_int;
ENDPROC
Nostepin移动指令和异步错误
如果应向用户发出一个错误,那么请使用RaiseToUser \Continue。在错误解决 后,那么,可从错误发生处继续执行。
PROC main() ...
PROC my_process()
MoveL p1, v300, z10, tool1;
write_log;
MoveL p2, v300, z10, tool1;
ERROR ...
ENDPROC
PROC write_log() Open .. logile ..;
Write logfile;
Close logfile;
ERROR ...
UNDO
Close logfile;
ENDPROC