Hi 大家好,大家都知道kuka机器人的程序是顺序执行的,那么如何能实现某个信号的连续监控呢。或者说某个信号触发后,机器人就立即停止当前的任务去执行另外一个任务。
这就是我们这一期要说的INTERRUPT指令。
废话不说
首先是中断声明;
<GLOBAL> INTERRUPT DECL Prio WHEN Ereignis DO Interruptprogramm
<GLOBAL>:表示全局中断
注意是中断声明,INTERRUPT DECL
Prio:中断编号,同时也是优先级,优先级 1、2、4 - 39 和 81 - 128 可供选择。优先级 3 和 40 - 80 是预留给系统应用的
WHEN Ereignis :中断触发条件
DO Interruptprogramm:满足条件后调用的程序
举例:
INTERRUPT DECL 10 WHEN $IN[10] DO STOP_PROG( )
要注意的是GLOBAL的概念:
下图是官方资料中的配图,这图很好的说明了GLOBAL的用法。
就是说在一个子程序上声明中断,加上GLOBAL则上一层程序也有效。
接下来是启用中断
INTERRUPT ON/OFF/DISABLE/ENABLE < 编号>
ON:启用中断
OFF:停止启用
DISABLE:禁止/暂停
ENABLE:开通一个原本禁止的中断
ON/OFF这两个不说了,DISABLE/ENABLE这两个是用于已经启用的中断中进行暂停。
并且在DISABLE后仍然检查触发条件,但运行到ENABLE后才会执行中断程序。
DISABLE/ENABLE这种一般应用如下图,
程序运行启动中断ON当机器人进入机床前DISABLE,机器人从机床出来ENABLE,这样无论任何时候发生中断触发,机器人都不会停止在机床内部,确保了设备的安全。
中断程序
中断可以触发一个程序来执行中断后的运行
例如STOP_PROG( )这样的名字
在中断程序中有些语法是和普通程序模块不同的
不可以使用的:
不可以使用联机表单,
不可以使用带s的运动如sptp,slin
不可以使用Advance
不可以使用INI
允许使用的:
Brake(F)
Resume
举例:
GLOBAL INTERRUPT DECL 100 WHEN e_stop==FALSE DO robot_stop( )
INI
PTP HOME Vel= 100 % DEFAULT
INTERRUPT ON 100 ;数字在后,如不写则说明所有Interrupt都置ON
LOOP
…
…
ENDLOOP
INTERRUPT OFF 100 ;数字在后,如不写则说明所有Interrupt都置OFF
PTP HOME Vel= 100 % DEFAULT
END
;-------------------------------------
def robot_stop()
INTERRUPT OFF 100
BRAKE
WAIT FOR (E_stop)
CONTINUE
INTERRUPT ON 100
End
例2:
DEF CELL ( )
INIT
BASISTECH INI
$out[appl_run]=false
CHECK HOME
PTP HOME Vel= 100 % DEFAULT
AUTOEXT INI
LOOP
INTERRUPT DECL 100 WHEN $out[236]==TRUE do Backhome() ;声明中断100
...
INTERRUPT ON 100 ;打开中断100
P00 (#EXT_PGNO,#PGNO_GET,DMY[],0 )
SWITCH PGNO ; Select with Programnumber
CASE 9
P00 (#EXT_PGNO,#PGNO_ACKN,DMY[],0 ) ; Reset Progr.No.-Request
purge ( ) ; Call purge
DEFAULT
P00 (#EXT_PGNO,#PGNO_FAULT,DMY[],0 )
ENDSWITCH
INTERRUPT OFF 100 ;关闭中断100
ENDLOOP
END
;==========================================================
DEF Backhome() ;中断子程序
INTERRUPT OFF 100 ;中断生效后立即关闭中断防多次触发
$TIMER_STOP[2]=TRUE
$TIMER[2]=0
BRAKE ;终止当前动作
PTP XHOME ;返回Home点(中断中不能轨迹逼近)
...
RESUME ;返回声明程序层面的触发位置
END