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程序结构与指令关系图 程序声明 DEF / DEFFCT 初始化段 INI / 变量声明 程序主体 运动 + 逻辑 + 调用 程序结束 END / ENDFCT 运动指令 PTP 关节空间快速定位 LIN 直线运动 CIRC 圆弧运动 逻辑指令 WAIT FOR / WAIT SEC IF...THEN...ELSE...ENDIF FOR / WHILE / LOOP 子程序与函数 DEF 子程序(执行动作) DEFFCT 函数(返回值) 参数传递与调用 指令协同关系 运动指令决定“怎么走” 逻辑指令决定“何时走” 子程序/函数决定“复用” 三者组合构成完整KRL程序,离线编程时需同时验证路径、信号与调用关系

五、离线编程中的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。离线阶段应建立信号映射表,避免调试时反复修改。
  • 子程序拆分:建议将抓取、放置、检测、计算等动作拆分为独立子程序,主程序只负责调用顺序。这样在虚拟调试中可单独测试每个子程序,缩短排错时间。
KRL对大小写不敏感,但变量名和指令名建议统一风格。离线生成的代码中若出现未声明的变量或未定义的子程序,KRC控制器会在编译阶段报错,虚拟调试时也会在仿真器中提示。务必在导入前检查 DECL 和 DEF 的完整性。