ABB机器人的错误处理

来源:互联网 发布:脱发不光头知乎 编辑:程序博客网 时间:2024/05/05 00:30

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 0
原创粉丝点击