在例子8.1的机器人运动期间,接近开关发现到两个目标并且记录了它们的位置,所 以随后机器人可以再移动到该位置。
即使机器人已经知道了两个目标,机器人也会沿着全部的搜索轨迹移动。为节约时间,
一旦发现了零件的多数时应立即结束移动。
RESUME KRC...中机器人运动的取消是可能的,使用语句:
RESUME
RESUME可以取消当前中断被声明的级别和以下级别的所有运行的中断程序和子程 序。
同 BRAKE 语句,RESUME 仅允许在中断程序中使用。
当激活 RESUME 语句时,提前运行指针千万不要在中断被声明的级别,至少应低一个 级别。
因为RESUME会取消搜索轨迹,所以在子程序中一定要编程搜索轨迹。在下面的例子中,
使用MOVEP()完成该操作;调用的中断子程序是IR_PROG()。
在子程序的最后一行前使用RESUME语句停止提前运行是重要的。只有这样才可能确保 当RESUME语句被激活时,提前运行指针不在中断被声明的级别。在MOVEP()中,使 用$ADVANCE=0分配提前运行指针。
在中断程序中,一旦输入1的传感器发现4个零件,使用BRAKE语句停止搜索轨迹,然 后通过RESUME语句取消搜索(因为MOVEP()也和IR_PROG()一起被结束)。不使用 BRAKE语句,在提前运行中仍然执行搜索运动。
RESUME语句后,主程序在子程序调用的指令后重新开始。也就是说$ADVANCE=3(复位 提前运行)。
长沙工控帮教育科技有限公司
8 中断处理(续)
DEF SEARCH()
;---声明部分---
EXT BAS(BAS_COMMAND:IN,REAL:IN)
DECL AXIS HOME
;---初始化---
INTERRUPT DECL 3 WHEN $STOPMESS==TRUE DO IR_STOPM()
INTERRUPT ON3 ;标准缺省服务函数 BAS(#INITMOV,0) ;初始化速度;
;加速度,$BASE,$TOOL,等 HOME={AXIS:A1 0,A2 -90,A3 90,A4 0,A5 30,A6 0}
INTERRUPT DECL 11 WHEN $IN[1] DO IR_PROG()
I[1]=0 ;设置预定的计数器为0;
---主程序部分--- PTP HOME ;BCO运行
INTERRUPT ON1 1
MOVEP() ;沿着搜索轨迹运动
$ADVANCE=3 ;复位提前运行 INTERRUPT OFF 11
GRIP()
PTP HOME END;
---子程序---
DEF MOVEP() ;搜索轨迹运动的子程序 PTP{X 1232,Y -263,Z 1000,A 0,B 67,C -90}
LIN{X 1232,Y 608,Z 1000,A 0,B 67,C -90}
$ADVANCE=0 ;停止提前运行 END;
;---中断程序---
DEF IR_PROG() ;存储零件的位置
;INTERRUPT OFF 11 I[1]=I[1]+1
POSITION[I[1]]=$POS_INT;位置被存储 IFI [1]==4 THEN ;4个零件被认出
BRAKE ;运动被停止
RESUME ;IR_PROG&MOVE被取消 ENDIF
;INTERRUPT ON 11 END;
---子程序---
DEF GRIP() ;捉住被发现的零件 INTPOS_NO ;计数器变量
FOR POS_NR=I[1] TO 1 STEP-1 POSITION[POS_NR].Z=POSITION[POS_NR].Z+200
长沙工控帮教育科技有限公司
专家编程
如果由于传感器的原因(“触电跳动”),会产生一个中断被不正确地触发两次的 危险,您可以通过在中断程序的第一行关闭中断的方法避免发生该危险。但是这样 做,在中断执行期间发生的真正的中断现在也不能被识别了。如果要保持中断有效,
必须在返回主程序前重新开启中断。
如果使用RESUME语句取消了一个运动,就像上面的例子一样,那么后面的运动不要是 CIRC运动,因为起点每次都会不同(产生不同的圆)。
在例8.2编程的搜索动作中,插补循环速率(当前为12ms)输入被削了顶,最大误差 约为轨迹速度的12ms倍数。
“快速测量” 如果要消除该误差,您千万不要在用户输入上连接接近开关;而是应该使用外 围设备插头X11中的4个专门的输入。这些输入可以通过系统变量
$MEAS_PULSE[1]...MEAS_PULSE[4]来寻址(响应时间为125Us).
当中断被打开时,千万不要使用测量脉冲,否则会产生相应的错误信息。
长沙工控帮教育科技有限公司
8 中断处理(续)
8.5 循环标记的使用
在中断声明指令中不允许使用逻辑操作。
因此,要定义复杂的事件,您必须使用循环标记,因为只有这样做才可能更新常数。
使用程序如下;
. .
$CYCFLAG[3]=$IN[1] AND([$IN[2] OR $IN[3]]INTERRUPT DECL 10 WHEN $CYCFLAG[3 DO IR_PROG()
INTERRUPT ON 10 .
. .
您可以同时监视和逻辑组合3个输入。
更多信息见[变量和声明]一章的[系统变量和系统文件]一节。
长沙工控帮教育科技有限公司
9 触发轨迹相关的转换动作 (续)
TRIGGER 如果需要一个与运动轨迹起点或终点相关的开关动作,在相关的运动指令(PTP,LIN 或CIRC)前,以下列语法编程一个TRIGGER语句:
更详细的自变量的说明见下表。
自变量 数据类型 含义 Switching
point
INT 对于单独的程序段,DISTANCE=0指明为下一个运动 的起点,属性DISTANCE=1则为终点。
对于逼近程序段,DISTANCE=1表示后续逼近定位圆
Priority INT 使用子程序调用的每个TRIGGER语句必须定义一个 优先级。允许值为1...39和81...128。
优先级的使用与中断中的一样。(见章8)。
值40...80为机器人自动优先级分配保留。如果要 使用,编程PRIO=-1。
长沙工控帮教育科技有限公司
专家编程
使用指令顺序 .
. .
LIN POINT2 .
. .
TRIGGER WHEN DISTANCE=0 DELAY=20 DO $OUT[4]=TRUE TRIGGER WHEN DISTANCE=1 DELAY=-25 DO UP1()PRIO=-1 LIN POINT3
. . .
LIN POINT4 .
. .
开始直线运动到POINT3后20毫秒,输出4被设置,且在到达终点前25毫秒时调用子程 序UP1()。优先级由系统自动分配。
属性DISTANCE在单独程序段和逼近程序段中的不同结果的解释见图41-图44。
长沙工控帮教育科技有限公司
9 触发轨迹相关的转换动作 (续)
图42 起点是精确定位点而终点是逼近定位点时开关范围和可能的延迟值
图43起点和终点都是逼近定位点时开关范围和可能的延迟值
长沙工控帮教育科技有限公司
专家编程
图44 起点是逼近定位点而终点是精确定位点时开关范围和可能的延迟值
长沙工控帮教育科技有限公司
9 触发轨迹相关的转换动作 (续)
9.2 在轨迹的任何点开关动作
TRIGGER 如果您正在使用轨迹相关的TRIGGER语句,则可以通过指定一个距离在沿轨迹的任何 位置触发开关动作,与在起点和终点的开关动作一样,也可以被延迟或提前。
轨迹相关的开关动作仅允许在连续轨迹运动(PTP,LIN或CIRC)中使用。这儿的触发 语句指的是下一个编程运动,语法如下:
更详细的自变量的说明见下表。
表28 TRIGGER语句中的自变量 自变量 数据类型 含义
Priority INT 使用子程序调用的每个TRIGGER语句必须定义一个 优先级。允许值为1...39和81...128。
优先级的使用与中断中的一样。(见章8)。
值40...80为机器人自动优先级分配保留。如果要 使用,编程PRIO=-1。
长沙工控帮教育科技有限公司
专家编程
指令顺序:
. .
LIN POINT2 C_DIS
TRIGGER WHEN PATH=Y DELA Y=X DO $OUT[2]=TRUE LIN POINT3 C_DIS
LIN POINT4 C_DIS LIN POINT5
. .
开关点可从它被编程的运动点前,越过所有后续的逼近定位点,移动到下一个精确定 位点,因此开关点可以从逼近定位起点POINT2移动到POINT5。如果POINT2在该指令顺 序中不被逼近,开关点仅可以移动到精确定位点POINT2。
长沙工控帮教育科技有限公司
9 触发轨迹相关的转换动作 (续) PATH属性的TRIGGER语句并且使用这些命令执行程序段选择,将在终点被执行。
●不可能逼近
TRIGGER WHEN PATH=-120 DELAY=0 DO UP1()PRIO=-1 TRIGGER WHEN PATH=-70 DELAY=0 DO $OUT[2]=TRUE LIN P2 C_DIS up1( )并在距离P1点30mm处设置输出2。
●取消一个运动
如果用程序段选择和复位取消了一个没有完成的运动,则还未执行的开关动作将被删 除,DISTANCE属性不再执行。
●PTP运动中轨迹相关的TRIGGER语句
如果使用轨迹触发语句编程一个PTP运动,当执行该运动时,编译器将拒绝执行。
专家编程
在下面的例子中,编程DISTANCE属性和PATH属性定义的开关动作。图46中图解说明各 个开关点和运动轨迹。
DEF TRIG()
;---声明部分---
EXT BAS(BAS_COMMAND:IN,REAL:IN)
DECL AXIS HOME INT I
SIGNAL GLUE $OUT[3]
;---初始化---
INTERRUPT DECL3 WHEN $STOPMESS==TRUE DO IR_STOPM()
INTERRUPT ON 3
BAS(#INITMOV,0) ;初始化速度
;加速度,$BASE,$TOOL,等
$APO.CDIS=35 ;定义逼近范围
HOME={AXIS:A1 0,A2 -90,A3 90,A4 0,A5 30,A6 0}
POS0={POS:X 1564,Y -114,Z 713,A 128,B 85,C 22,S 6,T 50}
POS1={X 1383,Y -14,Z 713,A 128,B 85,C 22}
POS2={X 1383,Y 200,Z 713,A 128,B 85,C 22}
POS3={X 1527,Y 200,Z 713,A 128,B 85,C 22}
POS4={X 1527,Y 352,Z 713,A 128,B 85,C 22}
FOR I=1 TO 16 $OUT[I]=FALSE ENDFOR
;---主程序部分--- PTP HOME;BCO运行
PTP POS0
TRIGGER WHEN DISTANCE=0 DELAY=40 DO $OUT[1]=TRUE TRIGGER WHEN PATH=-30 DELAY=0 DO UP1(2)PRIO=-1 LIN POS1
TRIGGER WHEN DISTANCE=1 DELAY=-50 DO GLUE=TRUE
TRIGGER WHEN PATH=180 DELAY=55 DO PULSE($OUT[4],TRUE,0.9)
TRIGGER WHEN PATH=0 DELAY=40 DO $OUT[6]=TRUE LIN POS2 C_DIS
TRIGGER WHEN DISTANCE=0 DELAY=40 DO PULSE($OUT[5],TRUE,1.4)
TRIGGER WHEN PATH=-20 DELAY=-15 DO $OUT[8]
LIN POS3 C_DIS
TRIGGER WHEN DISTANCE=1 DELAY=-15 DO UP1(7)PRIO=-1 LIN POS4
PTP HOME END
DEF UP1(NR:IN)
长沙工控帮教育科技有限公司
9 触发轨迹相关的转换动作 (续)
图46 以上例子中的开关点和运动轨迹
长沙工控帮教育科技有限公司
专家编程
9.3 技巧
9.3.1 触发语句重叠
运行图示程序,由于触发语句的相同的优先级可能会产生问题。
;FOLD PTP P1
TRIGGER WHEN DISTANCE=0 DELAY=0 DO SUB1() PRIO=15 PTP P1
...
;ENDFOLD ...
;FOLD PTPP2
TRIGGER WHEN DISTANCE=0 DELAY=-75 DO SUB1()PRIO=15 ...
;ENDFOLD
如果在第二个触发语句激活前第一个触发语句还没有结束,将会产生一个实时错误消 息。例如两个点同时关闭时可能发生该情况。
解决该问题有两种方法:
手动给两个触发语句分配各自的优先级;
分配两个触发语句的优先级都为“--1”,然后由系统自动分配正确的优先级。
长沙工控帮教育科技有限公司
10 数据表 (续)
10 数据表 10.1 局部数据表
数据表用于特殊编程准备和更高级别声明。包含点的消息,例如坐标:
●一个数据表可能为每个SRC文件草拟。数据表与SRC文件具有相同的文件名并以
“.DAT”作为扩展名。
●数据表仅可能由声明和初始化组成。
● 一行由声明和初始化组成。
●不接受系统变量。
DEFDAT 数据表的声明类似于SRC文件的声明:声明以关键字DEFDAT和文件名开始,以关 键字ENDDAT结束。
通过直接在声明行中给变量分配一个值来初始化变量。
图47 数据表中声明的值的初始化和分配
数据表中的声明和初始化不必要在主程序中再声明和初始化。如果在主程序中给变量 OTTO分配一个新值,则同时也被输入数据表中并永久存储在数据表中。(见图47).
关闭控制再开后,“新”值仍可以使用。这对于在线修改和其它程序修改是必要的。
如果一个主程序总是以系统值开始,则主程序中相关的变量必须预设置为期望的值。
在数据表中允许使用下列声明:
● SRC文件中使用子程序和函数的外部声明。
● 导入变量的导入声明。
● SRC文件中使用变量的声明和初始化。
● SRC文件中使用信号和通道名的声明。
● 数据表或SRC文件中使用数据的声明和列举类型(Struc,Enum)。
长沙工控帮教育科技有限公司
专家编程
10.2 全局数据表
数据表中定义的变量可被“别的”主程序接受。
PUBLIC 这样,数据表必须在开头行以关键字PUBLIC定义为“公共可接受” 。变量的声明有 两种方法:
●在数据表中定义变量,例如INT OTTO=0,要被接受,必须使用命令Import命令导 入到“别的”主程序中。
一个被导入主程序的变量可以给定一个不同于被导入数据表中的名称。
如果要使用变量OTTO,从以上数据表PROG_1中导入到PROG_2(),可以在PROG_2()
中编程下列导入声明,与数据表中的关键字PUBLIC一样:
IMPORT INT OTTO_2 IS /R1/PROG_1..OTTO
目录/R1下的数据表PROG_1.DAT中的变量OTTO现在是程序PROG_2()中的OTTO_2(见 图48)。
图48从“别的”数据表中使用导入命令时导入变量
长沙工控帮教育科技有限公司
10 数据表 (续)
GLOBALG ●变量被声明为“全局变量”,例如DECL GLOBAL INTOTTO=0,可不使用导入
GLOBALG ●变量被声明为“全局变量”,例如DECL GLOBAL INTOTTO=0,可不使用导入