聊聊KUKA机器人高级编程:中断

机器人

532人已加入

描述

  INTERRUPT … DECL … WHEN … DO … :声明中断

  对于定义的事件,例如输入,控制中断当前程序并处理定义的子程序。事件和子程序用INTERRUPT…DECL,WHEN SDO定义。子程序完成后,中断的程序将在中断点继续。异常:RESUME。由中断调用的子程序称为中断程序。

  运行动作不中断运行和准备好的机器人运动通常不会被中断打断。与中断程序并行,机器人继续执行主程序中已经准备好的所有动作。

  如果在此期间中断程序被完全处理,则主程序在没有移动停止的情况下继续,即在没有延长处理时间的情况下。

  最大数量/BRAKE最多可以同时声明64个中断。中断的声明可以随时被新的声明覆盖。可以选择使用BRAKE声明中断。BRAKE语句在检测到声明的中断时立即执行。这意味着当进入中断程序时,制动过程已经开始。

 
语法 INTERRUPT > DECL Prio WHEN Er-eignis DO Unterprogramm

GLOBAL 可选 无 GLOBAL > 只在程序和下级程序中已知 有 GLOBAL > 在上级程序中同样已知
PRIO 中断的优先级和“编号” 1 = 最高优先级,128 = 最低优先级 通过系统和附加的工艺程序包,已使用相应的中断。 已声明的中断可通过变量显示 ($RINT_LIST[]) 确定。
条件 布尔变量的边沿变化 (FALSE > TRUE, TRUE > FALSE) 布尔运算的边沿变化 比较的边沿变化 ("$COUNT_I[31]>=5")
中断程序 全局或局部子程序(中断例程)。 示例:INTERRUPT DECL 23 WHEN NOT $IN[703] DOSAFE_Start_SPALT()

示例1
  如果$IN[12]为true,则声明优先级为23的中断调用子程序UP1。参数20和VALUE被传递给子程序。
  INTERRUPT DECL 23 WHEN $IN[12]==TRUE DO UP1(20,VALUE)
  示例2
  在编程的路径上有两个物体,其位置由连接到输入端6和7的两个传感器检测。之后,应接近确定的两个位置。
  为此,将两个检测到的位置存储为点P_1和P_2。在主程序的第二部分中,将探讨这些要点。
  当机器人控制器检测到用INTERRUPT、DECL、When…DO定义的事件时,它总是将当前机器人位置保存在系统变量$AXIS_INT(特定于轴)和$POS_INT(笛卡尔)中。
  主要方案:
  DEF PROG()
  ...  INTERRUPT DECL 10 WHEN $IN[6]==TRUE DO UP1() 
  INTERRUPT DECL 20 WHEN $IN[7]==TRUE DO UP2() 
  ... 
  INTERRUPT ON
  LIN START 
  LIN END 
  INTERRUPT OFF 
  LIN P_1
  LIN P_2 
  ...  END
  本地中断程序1:
  DEF UP1()
  P_1=$POS_INT 
  END
  本地中断程序2:
  DEF UP2()
  P_2=$POS_INT 
  END
   INTERRUPT ON/OFF: 启用或禁用中断
  此语句启用或禁用中断。
  在声明之后,中断最初处于非活动状态。中断必须被激活,这样它才能对定义的事件做出响应。
  INTERRUPT Aktion
 

Aktion •ON:激活中断。   •OFF:禁用中断。
Nummer 类型:INT   要引用操作的中断的编号(=优先级)。   数字可以省略。在这种情况下,ON或OFF指的是所有声明的中断。

同时,最多可以有32个中断处于活动状态。应特别注意: KUKA机器人 •如果INTERRUPT ON省略了该数字,则所有声明的中断都将变为活动中断。但是,不得超过允许的32个数字。
  •当触发器调用子程序时,只要子程序尚未映射,它就算作活动中断。
  如果中断声明是一个包含布尔变量的事件,例如。B.定义的输入:
  •在这种情况下,中断是通过更改状态来触发的,例如$In[x]==通过从FALSE更改为TRUE来触发。在INTERRUPT ON的情况下,状态必须不存在,因为这样中断就不会被触发。
  •此外,在这种情况下必须注意:状态变化必须最早根据INTERRUPT ON执行插值时钟。
  (这可以通过在INTERRUPT ON后编程WAIT SEC 0.012来实现。如果不需要提前停止,也可以在WAIT SEC前编程CONTINUE。)
  原因是INTERRUPT ON需要一个插值时钟(=12ms),直到中断被实际激活。如果状态事先发生变化,则中断无法检测到变化。
  KUKA机器人 示例1
  优先级为2的中断被激活。(中断必须已声明。)
  INTERRUPT ON 2
  示例2
  就硬件而言,在使用粘合剂的过程中会执行非卷筒纸忠实的紧急停止。通过程序停止施胶,并且在释放(通过输入10)之后将胶枪重新定位在幅材上。
  DEF PROG()
  ...  INTERRUPT DECL 1 WHEN $STOPMESS DO STOP_PROG()
  LIN P_1
  INTERRUPT ON
  LIN P_2
  INTERRUPT OFF
  ... END
  DEF STOP_PROG()
  BRAKE F
  GLUE=FALSE
  WAIT FOR $IN[10]
  LIN $POS_RET
  GLUE=TRUE
  END
    INTERRUPT DISABLE/ENABLE:锁定或释放中断
  此语句锁定或释放活动中断。
  行为:
  当定义的事件d发生时,锁定的中断不响应。h.它不调用已定义的子程序。然而,机器人控制器会记住事件已经发生。当中断再次被释放时,它随后会对事件做出响应。
  示例1
  图中所示过程的先决条件是中断已声明并处于活动状态:
  INTERRUPT DECL 1 WHEN $IN[7]==TRUE DO UP1()
  ... INTERRUPT ON 1
  KUKA机器人 1 中断被锁定。
  2 定义的事件发生:输入7变为TRUE。
     中断没有响应,因为它被锁定了。
  3 再次释放中断。
     它响应并调用定义的子例程。
  4  输入7再次变为FALSE。
  示例2
  图中所示过程的先决条件是中断已声明并处于活动状态:
  INTERRUPT DECL 1 WHEN $IN[7]==TRUE DO UP1()
  ... INTERRUPT ON 1
  KUKA机器人 1中断被锁定。
  2定义的事件发生:输入7变为TRUE。
  中断没有响应,因为它被锁定了。
  3输入7再次变为FALSE。
  4再次释放中断。
  它响应并调用定义的子例程。这就是$IN[7]是否不再为真。决定性因素是定义的事件在中断被锁定时(至少)发生过一次
  BRAKE: 从中断程序中停止机器人
  制动器停止机器人。
  BRAKE只能在中断程序或中断声明中使用。
  在中断声明中使用BRAKE提供了这样的优点,即在检测到中断时立即启动制动响应。制动反应不仅在进入中断程序并用制动器处理线路后才开始。这意味着制动响应独立于解释器。
  在机器人停止之前,中断程序不会继续。一旦中断程序完成,机器人继续移动。
  BRAKE 
  语法:
  • BRAKE; STOP 2
  • BRAKE F; STOP 1
  语法:
  RESUME
  RESUME 只允许用于中断程序中。
  RESUME 通常与BRAKE 一起编程。
  KUKA机器人   实例
  机器人应该在轨道上搜索零件。该部件由输入端15处的传感器检测。在找到零件后,机器人不应继续到轨道的终点,而是返回到中断位置并拾取零件。然后,主要方案应该继续下去。
  主程序PROG():
  DEF PROG()
  INI
  ...  INTERRUPT DECL 21 WHEN $IN[15] DO FOUND()
  PTP HOME 
  ...  SEARCH() ... 
  END
  使用制动和恢复停止移动,
  基本上在一个子程序中。因此,搜索路径不是直接在主程序中编程的,而是在子程序search()中编程的。
  带有搜索路径的子程序SEARCH():
  DEF SEARCH()
  INTERRUPT ON 21
  SPLINE
    SPL START_SEARCH 
    SPL IN_BETWEEN
    SPL END_SEARCH 
  ENDSPLINE
  WAIT FOR TRUE
  ... END
  前导指针不得位于RESUME语句时声明当前中断的级别。为了防止这种情况发生,WAIT FOR TRUE(等待为真)触发提前停止。
  中断程序FOUND():
  DEF FOUND() 
  INTERRUPT OFF 21
  BRAKE 
  LIN $POS_INT 
  ... ; RESUME
  END
  制动过程使机器人稍微远离触发中断的地方。LIN$POS_INT使机器人返回到触发中断的位置。
  这里使用了运动类型LIN,因为中断程序不能包含样条曲线运动。
  LIN$POS_INT之后,机器人抓取零件。(示例中此处未编程。)
  RESUME使主程序在夹持零件后继续。如果没有RESUME,子程序SEARCH()将在END之后继续。
  大众版本下
    global interrupt decl 23 when $in[611]==true do zs1()
  global interrupt decl 25 when $in[611]==true do zs2()
  case 204
  see=$nullframe
  see1=$nullframe
  see2=$nullframe
  see2.z=80
  if par10 then
  $out[611]=true
  wait sec 1
  interrupt on 23

  wait sec 0
  see1=$pos_act
  lin see1

    interrupt on 25
    endif
  def zs2()
  $out[611]=false
  $out[580]=false
  interrupt off 25
  brake
  see=$pos_act
  lin $pos_int
  lin_rel {x -15}
  lin_rel {z -68}
  wait sec 0.2
  $out[579]=true
  lin_rel {z 70}
  see1=$pos_int
  lin see
  end
      审核编辑:黄飞

 

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分