INTERRUPT … DECL … WHEN … DO … :声明中断
对于定义的事件,例如输入,控制中断当前程序并处理定义的子程序。事件和子程序用INTERRUPT…DECL,WHEN SDO定义。子程序完成后,中断的程序将在中断点继续。异常:RESUME。由中断调用的子程序称为中断程序。
运行动作不中断运行和准备好的机器人运动通常不会被中断打断。与中断程序并行,机器人继续执行主程序中已经准备好的所有动作。
如果在此期间中断程序被完全处理,则主程序在没有移动停止的情况下继续,即在没有延长处理时间的情况下。
最大数量/BRAKE最多可以同时声明64个中断。中断的声明可以随时被新的声明覆盖。可以选择使用BRAKE声明中断。BRAKE语句在检测到声明的中断时立即执行。这意味着当进入中断程序时,制动过程已经开始。
语法
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个中断处于活动状态。应特别注意: •如果INTERRUPT ON省略了该数字,则所有声明的中断都将变为活动中断。但是,不得超过允许的32个数字。
•当触发器调用子程序时,只要子程序尚未映射,它就算作活动中断。
如果中断声明是一个包含布尔变量的事件,例如。B.定义的输入:
•在这种情况下,中断是通过更改状态来触发的,例如$In[x]==通过从FALSE更改为TRUE来触发。在INTERRUPT ON的情况下,状态必须不存在,因为这样中断就不会被触发。
•此外,在这种情况下必须注意:状态变化必须最早根据INTERRUPT ON执行插值时钟。
(这可以通过在INTERRUPT ON后编程WAIT SEC 0.012来实现。如果不需要提前停止,也可以在WAIT SEC前编程CONTINUE。)
原因是INTERRUPT ON需要一个插值时钟(=12ms),直到中断被实际激活。如果状态事先发生变化,则中断无法检测到变化。
示例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
1 中断被锁定。
2 定义的事件发生:输入7变为TRUE。
中断没有响应,因为它被锁定了。
3 再次释放中断。
它响应并调用定义的子例程。
4 输入7再次变为FALSE。
示例2
图中所示过程的先决条件是中断已声明并处于活动状态:
INTERRUPT DECL 1 WHEN $IN[7]==TRUE DO UP1()
... INTERRUPT ON 1
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 一起编程。
实例
机器人应该在轨道上搜索零件。该部件由输入端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
审核编辑:黄飞
评论
查看更多