早教机器人程序错乱_ABB机器人的错误处理

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

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值