3. KUKA机器人编程语言与指令体系
KRL(KUKA Robot Language)是KUKA机器人控制系统的专用编程语言,运行在KRC控制器上。它既不是通用高级语言,也不是简单的示教记录格式,而是一套围绕“运动+逻辑+信号”构建的工业机器人编程体系。理解KRL的关键,不是背指令表,而是建立“程序由哪些结构组成、运动如何被描述、逻辑如何控制流程、子程序如何复用”的整体认知。
一、KRL程序的基本骨架
一个完整的KRL程序通常由三部分组成:程序声明、初始化段和运动/逻辑主体。程序声明以 DEF 或 DEFFCT 开头,前者定义子程序,后者定义函数。初始化段一般包含 INI 指令,用于将机器人恢复到程序起始状态,例如关闭外部自动、复位信号、设置默认速度等。主体部分则由运动指令、逻辑指令和流程控制语句构成。
KRL中变量分为局部变量和全局变量。局部变量在程序内部用 DECL 声明,例如 DECL INT i、DECL REAL speed。全局变量通常在 $CONFIG.DAT 中定义,所有程序均可访问。数据类型包括 INT、REAL、BOOL、CHAR、FRAME、POS、E6POS 等。其中 E6POS 是KRL中最常用的点位类型,包含X、Y、Z、A、B、C六个笛卡尔坐标以及S、T两个状态参数,用于描述机器人末端在空间中的完整位姿。
二、运动指令:从PTP到LIN、CIRC
KRL的运动指令决定了机器人如何从当前点移动到目标点。最常用的三条指令是 PTP、LIN 和 CIRC。
PTP(Point-to-Point)是关节空间运动,机器人各轴以最快方式到达目标点,路径不一定是直线。它适合大范围快速定位,例如从等待位到抓取位上方。典型写法为:
PTP P1 Vel=100% PDAT1 Tool[1] Base[0]
其中 P1 是目标点,Vel=100% 表示以最大速度的百分比运行,PDAT1 是运动参数数据集,Tool[1] 和 Base[0] 分别指定工具坐标系和基坐标系。
LIN 是直线运动,机器人末端沿直线从当前点移动到目标点,适合需要精确路径的场合,例如涂胶、焊接或插入动作。写法为:
LIN P2 Vel=0.2 m/s CPDAT1 Tool[1] Base[0]
这里速度单位变为 m/s,表示末端沿直线的线速度。CIRC 是圆弧运动,需要三个点:起点、辅助点和终点。起点是机器人当前位姿,辅助点决定圆弧的弯曲方向,终点是圆弧结束位置。写法为:
CIRC P3, P4 Vel=0.1 m/s CPDAT2 Tool[1] Base[0]
其中 P3 是辅助点,P4 是终点。圆弧运动常用于倒角、圆弧焊缝或避障路径。
Tool 和 Base 必须与示教时使用的坐标系一致,否则机器人会以错误姿态到达目标点。这是离线编程与虚拟调试中最常见的错误来源之一。三、逻辑指令与流程控制
KRL的逻辑指令用于控制程序流程和外部信号。最基本的逻辑指令包括 WAIT FOR、WAIT SEC、IF...THEN...ELSE...ENDIF、FOR...ENDFOR、WHILE...ENDWHILE、LOOP...ENDLOOP 和 SWITCH...CASE...ENDSWITCH。
WAIT FOR 用于等待某个条件成立,例如等待夹具夹紧信号:
WAIT FOR $IN[1]==TRUE
WAIT SEC 用于固定延时,例如等待气缸动作完成:
WAIT SEC 0.5
条件判断使用 IF 结构:
IF $IN[2]==TRUE THEN
PTP P5 Vel=50% PDAT3 Tool[1] Base[0]
ELSE
PTP P6 Vel=50% PDAT4 Tool[1] Base[0]
ENDIF
循环结构用于重复执行同一段逻辑,例如码垛时逐层放置:
FOR i=1 TO 5
PTP P_pick Vel=80% PDAT5 Tool[1] Base[0]
PTP P_place Vel=80% PDAT6 Tool[1] Base[0]
ENDFOR
这些逻辑指令与运动指令组合,构成了KRL程序的实际控制能力。离线编程时,逻辑指令的正确性往往比运动路径更影响节拍和安全性。
四、子程序与函数调用
KRL通过子程序和函数实现代码复用。子程序用 DEF 定义,可以带参数,也可以不带参数。调用时直接写子程序名即可。例如定义一个抓取子程序:
DEF pick()
PTP P_pick_above Vel=100% PDAT7 Tool[1] Base[0]
LIN P_pick Vel=0.1 m/s CPDAT3 Tool[1] Base[0]
WAIT FOR $IN[1]==TRUE
LIN P_pick_above Vel=0.1 m/s CPDAT4 Tool[1] Base[0]
END
在主程序中调用:
pick()
函数用 DEFFCT 定义,必须返回一个值。例如计算两个点之间的距离:
DEFFCT REAL distance(P1:IN, P2:IN)
DECL E6POS P1, P2
DECL REAL d
d = SQRT((P2.X-P1.X)**2 + (P2.Y-P1.Y)**2 + (P2.Z-P1.Z)**2)
RETURN d
ENDFCT
函数调用时可以出现在表达式中,例如 IF distance(P1,P2) < 100 THEN ...。子程序和函数的最大区别在于:子程序执行动作,函数返回值。离线编程中,合理拆分抓取、放置、检测、计算等模块,可以显著提高程序可读性和调试效率。
五、离线编程中的KRL实践要点
在KUKA离线编程与虚拟调试中,KRL代码通常由仿真软件(如KUKA.Sim、RoboDK、Process Simulate)自动生成,但工程师必须理解生成逻辑,才能修改和排错。以下几点值得注意:
- 点位命名与坐标系:离线生成的
E6POS点必须与虚拟环境中定义的Tool和Base一致。若虚拟调试时工具坐标系偏移了10mm,实际机器人会以相同偏移到达目标点。 - 速度参数:
PTP的Vel=100%是相对于各轴最大速度的百分比,而LIN的Vel=0.2 m/s是末端线速度。两者不能混用,离线生成时需根据工艺要求选择。 - 逻辑信号映射:虚拟调试中
$IN[1]可能映射到仿真PLC的某个输出,实际运行时映射到真实PLC。离线阶段应建立信号映射表,避免调试时反复修改。 - 子程序拆分:建议将抓取、放置、检测、计算等动作拆分为独立子程序,主程序只负责调用顺序。这样在虚拟调试中可单独测试每个子程序,缩短排错时间。
DECL 和 DEF 的完整性。