2024-05-18
自我提升
0

目录

绝对运动编程
相对运动编程
数组
函数
枚举
子程序参数传递
结构体
中断
优先级
屏蔽中断
多个中断应用
中断 单个条件
中断 复合条件
跳出中断
break
resume
用 KRL 进行运动编程
引用原有联机表单的点
使用点坐标
模拟输入端编程
模拟输出端编程

绝对运动编程

借助于绝对值运动至目标位置。在此轴 A3 定位于 45°

kuka
PTP {A3 45}

image.png

相对运动编程

  • 从目前的位置继续移动给定的值,运动至目标位置。在此轴 A3 继续转过45°
kuka
PTP_REL {A3 45}

image.png

PTP_REL

如轴2沿负方向移动30°,其他轴不变

kuka
PTP_REL(A2 -30)

机器人从当前位置沿 X 轴方向移动 100 mm,沿 Z 轴负方向移动 200mm。Y、A、B、C 和 S 保持不变

kuka
PTP_REL(X100,Z-200)

LIN_REL

TCP 从当前位置沿基坐标系中的 X 轴方向移动 100 mm,沿 Z 轴负方向移动 200 mm。Y、A、B、C 和 S 保持不变

kuka
LIN_REL(X100,Z-200)

TCP 从当前位置沿工具坐标系中的 X 轴负方向移动 100 mm。Y、Z、A、B、C 和 S 保持不变

kuka
LIN_REL(X -100)#TOOL #需要在后面加上工具坐标系

往基坐标系3的X正方向再走200mm,执行后坐标位置为400,100,100,0,0,0

kuka
slin_rel {x 200}with $base=base_data[3]

当前TCP在原地绕世界坐标系Z方向旋转180°

kuka
slin_rel {a 180}with $base=$nullframe

CLRC_REL

圆周运动的目标点通过 500° 的圆心角加以规定。目标点被轨迹逼近

kuka
CLRC_REL(X100,Y30,Z-20),(Y50),CA 500 C_VEL
kuka
$POS_ACT:当前的机器人位置 $AXIS_ACT:基于轴坐标的当前机器人位置 (额定值)

数组

  • 相同类型的变量,按顺序排列在一起

一维数组

kuka
DEF bool error[10] #通过调用索引单独对每个数组进行声明和初始化 error[1]=false error[2]=false error[3]=false error[4]=false error[5]=false error[6]=false error[7]=false error[8]=false error[9]=false error[10]=false END
kuka
DEF bool error[10] #以合适的循环 Decl int x for x = 1 to 10 error[x]=false endfor END

二维数组

kuka
DEF array_test2() Decl bool status[4,3] int i,j for i =1 to 4 for j =1 to 3 status [i,j]=false endfor endfor halt status [1,1]=true status [3,2]=true halt END

三维数组就用3个for循环

kuka
DECL INT parts_palette[5,4,3] DECL INT x, y, z FOR x = 1 TO 5 FOR y = 1 TO 4 FOR z = 1 TO 3 parts_palette[x, y, z]= 12 ENDFOR ENDFOR ENDFOR

函数

  • 一种向主程序返回数值的子程序

y=f(x) 只能作运算使用,不能作动作运动

kuka
DEF func() real x,y x=3 y=0 halt y=sub_function() #运行后y返回值4 halt END _____________________ deffct real sub_function() int a a=1+3 return a endfct
kuka
DEF func() x=0.5 y=abs(x) #绝对值 halt y=SQRT(x) #平方根 halt y=fin(x) #正弦 halt y=cos(x) #余弦 halt y=tan(x) #正切 halt y=acos(x) #反余弦 halt y=atan2(0.5.0.5) #反正切 halt END
kuka
DEF func() bool symbol int h a[ ] = "abcd" b[ ] = "efg" y=StrDeclLen(a[ ]) #字符串容量 y=StrLen(a[ ]) #字符串个数 symbol=StrClear(a[ ]) #清除字符串内容 a[ ] = "jk" h=StrAdd(a[ ] ,b[ ]) #扩展字符串 symbol= StrComp(a[ ] ,b[ ] ,#case-sens) #比较字符串 symbol=StrCopy(a[ ] ,b[ ]) #复制字符串 END

枚举

image.png

  • 一个被命名的整型常数的集合 (n选1)

在$config.dat中定义

kuka
如:描述PC电脑的颜色 enum pc_color red,white,black,silver,yellow #枚举变量和常量的定义 Decl pc_color mycolor #声明枚举变量 mycolor = #red #变量的初始化(必带有#号)

子程序参数传递

只进不出 又进又出

kuka
DEF main() INI a=5 b=3 PTP home #运行到这一步时 a=5 b=3 sub_program(a,b) PTP home #运行到这一步时 a=5 b=8 END DEF sub_program(x:in,y:out) #a传给x b传给y int x,y ......... ......... y=x+y END
  • 不同数据类型传递 #强制转换
  • 数组单个元素传递
kuka
sub(num[3]) ......... ......... END DEF sub(x:in) #num[3]传给x int x ......... ......... END
  • 数组整体传递
kuka
sub(num[ ]) ......... ......... END DEF sub(x[ ]:out) #a传给x b传给y int x[ ] ......... ......... END
  • 临时局部变量不允许传递
    int f

结构体

  • 一堆变量放在一起

image.png

在$config.dat中定义

kuka
struc car_type real price,int date,bool cut,char name[16] #构建结构体 Decl car_type my_car #声明结构体变量
kuka
DEF struc_car() INI my_car={price 11.8.date 17,aut true,name[]"k3"} #变量的初始化 my_car.price=12 #变量值的更改 my_car.date=17 my_car.aut=true my_car.name[]="k5" END

中断

  • 立即去做某个事情
  • 出现中断信号时,机器人暂时停止执行当前程序,转而执行编写的中断程序,执行完毕后,再返回原程序继续执行
  1. 不允许有联机表单类运动指令
  2. 不允许有INI
  3. 不允许有$advance
  4. 不允许有sptp

最多可开启16个中断

优先级
  • 1的优先级最高
  • 3留给急停使用
  • 19刹车测试
  • 40~80系统自用

用户能使用的是1,2,4 ~ 18,20 ~ 39,81~128

kuka
在$config.dat中定义 decl int a #停止 decl int b #启动
kuka
DEF T111() INI interrupt decl 1 when a==1 do error() interrupt on 1 #打开中断 PTP p1 ...... ...... PTP p2 interrupt off 1 #关闭中断 END DEF error() #中断子程序 ptp $pos_int halt #暂停机器人 将该行改为 wait for b==1 则b=1时启动 END DEF act() if $aut then wait sec 6 a=1 b=0 wait sec 6 a=0 b=1 else a=0 b=0 endif END

在机器人运动的同时进行逻辑处理

kuka
DEF MY_PROG( ) INI INTERRUPT DECL 25 WHEN $IN[99]==TRUE DO ERROR( ) INTERRUPT ON 25 PTP HOME Vel=100% DEFAULT PTP P1 Vel=100% PDAT1 PTP P2 Vel=100% PDAT2 PTP HOME Vel=100% DEFAULT INTERRUPT OFF 25 END _________________________________________________ DEF ERROR() $OUT[20]=FALSE $OUT[21]=TRUE END
屏蔽中断
kuka
DEF main() INI interrupt decl 6 when $in[9]==true do calc() interrupt on 6 #打开中断 ... interrupt disable 6 #屏蔽中断开启 ....... ....... interrupt enable 6 #屏蔽中断关闭 ... interrupt off 6 #关闭中断 ... ... END
多个中断应用
kuka
DEF main() INI interrupt decl 20 ... interrupt decl 21 ... interrupt decl 22 ... ... ... #21 执行21中断程序 ... END DEF interrupt21() INI ... ... #20 执行20中断程序 ... END DEF interrupt20() INI ... ...#22 执行22中断程序 ... END #执行完后 返回20中断程序 DEF interrupt22() INI ... ... ... END #执行完后 返回21中断程序
中断 单个条件
kuka
DEF main() INI interrupt decl 6 when $in[9]==true ... interrupt decl 7 when number==6 ... ... ... END
中断 复合条件
kuka
DEF main() INI $cycflag[1]=($in[9]==true) and ($out[1]==false) interrupt decl 9 when $cycflag[1]==true ... ... ... END

跳出中断

break
kuka
DEF main() #主程序 INI interrupt decl 6 when $IN[6]==true do motion #6 为优先级 $IN[6]==true 条件 motion 做什么 interrupt on 6 #中断打开 .......... .......... .......... interrupt off 6 #中断关闭 END DEF motion() #子程序 break #跳出中断 .......... .......... ptp $int_ret END

停下机器人后进行逻辑处理,然后继续机器人运动

kuka
DEF MY_PROG( ) INI INTERRUPT DECL 25 WHEN $IN[99]==TRUE DO ERROR( ) INTERRUPT ON 25 PTP HOME Vel=100% DEFAULT PTP P1 Vel=100% PDAT1 PTP P2 Vel=100% PDAT2 PTP HOME Vel=100% DEFAULT INTERRUPT OFF 25 END _________________________________________________ DEF ERROR() BRAKE $OUT[20]=FALSE $OUT[21]=TRUE END
resume
kuka
DEF main() #主程序 INI interrupt decl 7 when $IN[8]==true do motion sperch() #子程序 sptp xhome END DEF sperch() #子程序 interrupt on 7 #中断打开 .......... .......... .......... interrupt off 7 #中断关闭 Wait sec 0 END DEF motion() #子程序 break .......... .......... resume END

停止当前的机器人运动,返回定位,废弃当前的轨迹规划,运行一条新的轨迹

kuka
DEF MY_PROG( ) INI INTERRUPT DECL 25 WHEN $IN[99]==TRUE DO ERROR( ) SEARCH() END _________________________________________________ DEF SEARCH() INTERRUPT ON 25 PTP HOME Vel=100% DEFAULT PTP P1 Vel=100% PDAT1 PTP P2 Vel=100% PDAT2 PTP HOME Vel=100% DEFAULT WAIT SEC 0 ; 止住预进指针 INTERRUPT OFF 25 END _________________________________________________ DEF ERROR() BRAKE PTP $POS_INT RESUME END

用 KRL 进行运动编程

运动参数的系统变量

kuka
$TOOL = tool_data[x] ; x = 1...16 #激活所测量的 TCP $LOAD = load_data[x] ; x = 1...16 #激活所属的负载数据 $BASE = base_data[x] ; x = 1...16 #激活所测量的基坐标 机器人TCP: $IPO_MODE = #BASE #机器人引导型工具 $IPO_MODE = #TCP #外部TCP 速度: $VEL_AXIS[x] ; x=1...6 # 针对每根轴 $VEL.CP = 2.0 ; # [m/s] 轨迹速度 $VEL.ORI1 = 150 ; # [°/s] 回转速度 加速: $ACC_AXIS[x] ; x=1...6 # 针对每个轴 $ACC.CP = 2.0 ; # [m/s] 轨迹加速度 $ACC.ORI1 = 150 ; # [°/s] 回转加速度 $ACC.ORI2 = 200 ; # [°/s] 转动加速度 圆滑过渡距离: 仅限进行 PTP 运动时:C_PTP PTP XP3 C_PTP $APO_CPTP = 50 ; C_PTP 的轨迹逼近大小,单位 [%] 进行轨迹运动 LIN、CIRC 和 PTP 时:C_DIS - 与目标点的距离必须低于 $APO.CDIS 的值 PTP XP3 C_DIS LIN XP4 C_DIS $APO.CDIS = 250.0 ; [mm] 距离 进行轨迹运动 LIN、CIRC 时:C_ORI - 主导姿态角必须低于 $APO.CORI 的值 LIN XP4 C_ORI $APO.CORI = 50.0 ; [°] 角度 进行轨迹运动 LIN、CIRC 时:C_VEL - 在驶向目标点的减速阶段中速度必须低于 $APO.CVEL 的值 LIN XP4 C_VEL $APO.CVEL = 75.0 ; [%] 百分数 姿态引导: 进行 LIN 和 CIRC 时:$ORI_TPYE $ORI_TYPE = #CONSTANT 稳定的方向导引 $ORI_TYPE = #VAR 标准或手动 PTP $ORI_TYPE = #JOINT $CIRC_TYPE = #PATH 恒定姿态 $CIRC_TYPE = #BASE

SPTP

kuka
sptp xp1 with $tool=tool_data[3],$base=base_data[2],$load=load_data[3], $ipo_mode=#base或者#tcp,$vel_axis[1~6]=0~100,$acc_axis[1~6]=0~100, $gear_jerk[1-6]=0-100,$apo.cdis=0~1000 c_spl

SLIN

kuka
slin xp2 with $tool=tool_data[3],$base=base_data[2],$load=load_data[2],$ipo_mode=#base或者#tcp, $vel.cp=0~2.0,$acc.cp= ,$jerk.cp= $ori_type=#var或#constant或#joint, $apo.cdis=0~300 c_spl

SCIRC

kuka
scirc xp3,xp4,ca180 with $tool=tool_data[3],$base=base_data[2],$load=load_data[2],$ipo_mode=#base或者#tcp, $vel.cp=0~2.0,$acc.cp= ,$jerk.cp= $ori_type=#var或#constant或#joint, $circ_type=#base或#path $circ_mode.aux_pt.ori=#consider或#ignore或#interpolate, $circ_mode.target_pt.ori=#interpolate或#extrapolate, $apo.cdis=0~300 c_spl

点的数据类型

  • struc axis real a1,a2,a3,a4,a5,a6
  • struc e6axis real a1,a2,a3,a4,a5,a6,e1,e2,e3,e4,e5,e6
  • struc frame real x,y,z,a,b,c
  • struc pos real x,y,z,a,b,c, int s,t
  • struc e6pos real x,y,z,a,b,c,e1,e2,e3,e4,e5,e6, int s,t

相关信息

TCP 位置 (X, Y, Z) 和姿态 (A, B, C) 的数值不足于明确规定机器人的位置,因为虽然 TCP 相同,但轴的位置仍可能有多个。状态和转角方向用于从多个可能的轴位中确定一个唯一的位置,状态 (S) 和转角方向 (T) 是数据类型 POS 和 E6POS 的组成部分

引用原有联机表单的点

kuka
SPTP P1 CONT Vel=100% PDAT1 TOOL[1] Base[2] sptp xp1 with $tool=tool_data[1],$load=load_data[1],$base=base_data[2],apo.cdis=500 c_spl SLIN P2 CONT VeL=0.4m/s CPDAT1 TOOL[1] Base[2] slin xp2 with $vel.cp=0.4,$apo.cdis=300 c_spl SCIRC P3 P4 Vel=0.4m/s CPDAT2 ANGLE=360° TOOL[1] Base[2] scirc xp3,xp4,ca 360
kuka
DEF motion_example1() decl pos point2 INI point2={x 100,y 200,z 150,a 0,b 0,c 0} SPTP HOME vel=100% DEFAULT TOOL [1] Base[0] SPTP P1 vel=100% PDAT1 TOOL [1] Base[0] SPTP P2 vel=100% PDAT1 TOOL [1] Base[0] SPTP P3 vel=100% PDAT1 TOOL [1] Base[0] sptp xp1 slin point2 SPTP HOME vel=100% DEFAULT TOOL [1] Base[0] END
kuka
DEF motion_example2() decl axis point1 decl pos point2 INI point1={a1 0,a2 -90,a3 90,a4 0,a5 0,a6 0} point2={x 100,y 200,z 150,a 0,b 0,c 0} SPTP HOME vel=100% DEFAULT TOOL [1] Base[0] SPTP P1 vel=100% PDAT1 TOOL [1] Base[0] sptp point1 SPTP P2 vel=100% PDAT1 TOOL [1] Base[0] SPTP P3 vel=100% PDAT1 TOOL [1] Base[0] sptp xp1 slin point2 with SPTP HOME vel=100% DEFAULT TOOL [1] Base[0] END
kuka
DEF motion_example3() decl axis point1 decl pos point2 decl pos point3 int a INI point1={a1 0,a2 -90} point2={x 100,y 200,z 150,a 0,b 0,c 0} point3.x=a SPTP HOME vel=100% DEFAULT TOOL [1] Base[0] SPTP P1 vel=100% PDAT1 TOOL [1] Base[0] sptp point1 sptp point3 SPTP P2 vel=100% PDAT1 TOOL [1] Base[0] SPTP P3 vel=100% PDAT1 TOOL [1] Base[0] sptp xp1 slin point2 with SPTP HOME vel=100% DEFAULT TOOL [1] Base[0] END

使用点坐标

  • sptp{a1 0,a2 -90,a3 90,a4 0,a5 0,a6 0}#仅限sptp或ptp
  • sptp{x 100,y 200,z 300,a 90,b 0,c 0}
  • slin{x 200,y 100,z 100,a 0,b 0,c 0}
  • scirc{x 200,y 100,z 100,a 0,b 0,c 0},{x 150,y 50,z 100,a 0,b 0,c 0},ca 180

模拟输入端编程

image.png

  • KR C4 具有 32 个模拟输入端
  • 为这些模拟信号需要配备可作为选项提供的总线系统,并须通过 WorkVisual 进行设计
  • 模拟输入端通过系统变量 ANIN[1]...ANIN[1] ... ANIN[32] 读出
  • (每隔 12 ms 一次)循环读取一个模拟输入端
  • $ANIN[ ] 的值在 1.0 和 -1.0 之间变化,表示 +10V 至 -10V 的输入电压
kuka
... REAL value value = $ANIN[2] DEFDAT myprog DECL REAL value = 0 DECL REAL corr = 0.25 DECL REAL offset = 0.45 ENDDAT

模拟输出端编程

  • KR C4 具有 32 个模拟输出端
  • 为这些模拟信号需要配备可作为选项提供的总线系统,并须通过WorkVisual 进行设计
  • 模拟输出端通过系统变量ANOUT[1]...ANOUT[1]...ANOUT[32] 读出
  • (每隔 12 ms 一次)循环写入一个模拟输出端。
  • $ANOUT[ ] 的值在 1.0 和 -1.0 之间变化,表示 +10V 至 -10V 的输出电压
kuka
ANOUT[2] = 0.7 ; 在模拟输出端 2 上加上 7V 电压 REAL value value = -0.8 ANOUT[4] = value ; 在模拟输出端 4 上加上 -8V 电压

image.png

  1. 模拟输出端编号
  2. 电压系数 0 … 1 (最小刻度: 0.01)