简介:面向库卡机器人开发者的程序案例PDF文档,聚焦机器人编程中的初始化、移动、抓件、中断处理等典型操作。内容基于库卡专有语言展开,完整展示了DEF、FOLD、WHEN、DO等指令的用法,以及TOOL、BASE、FRAME等关键设置,适合初学者理解程序结构并参考编写自己的控制逻辑。整个压缩包仅含1个PDF文件,大小132KB,轻量便于查阅。文档还涉及BASISTECH INI、PDAT/FDAT、以及吸盘抓件和信号等待等工程细节,可作为实际项目中编写与调试库卡程序的实用参考。目前已有1579人学习,适合需要快速上手或系统梳理库卡机器人程序案例的开发者。
1. 库卡机器人程序要先把中断当成主线来读
拿到这份《库卡机器人程序案例.pdf》,最容易犯的错是从第一行运动指令开始逐条翻译。实际上,这段送料工位吸盘抓件程序的价值,在于它把“信号何时生效”和“轨迹怎么走”拆成了两条可以独立排查的线。主程序main_R2()从初始化、信号复位、中断登记开始,然后根据$IN[1]工位允许信号决定是否进入Pick(),抓完件再等待真空反馈和放件请求,最后走Place()。适合正在学库卡机器人编程和库卡机器人仿真的人,也适合需要快速定位生产现场掉件、误吹气和点位漂移问题的调试工程师。先读中断声明,再读运动块,这个顺序比逐行看 PTP 和 LIN 更能看清程序骨架。
2. KRL程序结构、初始化段与中断登记拆解
2.1 DEF/END 与 FOLD 折叠块的分层逻辑
KRL 程序从DEF开始到END结束,main_R2是程序名,R2一般代表工位或机器人编号。程序体内大量使用FOLD ... ENDFOLD,这是 KRL 的代码折叠结构,WorkVisual 编辑器会自动识别并允许整体收展。折叠块内第一行经常出现;%{PE}或%{E}这类注释标记,它们是 KRL 源码在 WorkVisual 中同步时写入的辅助信息,实际执行时会被忽略,不影响运行逻辑。
DEF main_R2() FOLD INI ; FOUND BASISTECH INI GLOBAL INTERRUPT DECL 3 WHEN $STOPMESS == TRUE DO IR_STOPM() BAS(#INITMOV, 0) ENDFOLD FOLD USER INI $OUT[3] = FALSE $OUT[4] = FALSE $OUT[5] = FALSE $OUT[15] = FALSE $OUT[16] = FALSE DECL 20 WHEN $IN[16] == FALSE DO Sucker_Error() ENDFOLD ENDGLOBAL INTERRUPT DECL 3 WHGN $STOPMESS == TRUE DO IR_STOPM()声明了一个全局中断,编号 3,触发条件是系统停止消息$STOPMESS为 TRUE,触发后跳转到IR_STOPM()子程序,防止机器人在急停状态下还继续执行运动。使用GLOBAL前缀意味着该中断在程序切换、子程序调用过程中始终保持有效,不会因为离开当前程序段而丢失。BAS(#INITMOV, 0)调用 BASISTECH 软件包中的初始化运动指令,把轴角度、速度覆盖值等参数恢复为系统默认状态,避免上一次运行的轨迹参数残留影响本次程序。
USER INI 段里的 5 行$OUT[3] ... $OUT[16] = FALSE全部是输出信号复位。它们的作用不是“关掉”什么,而是让程序启动瞬间输出处于一个确定已知的电平,防止机器人上电瞬间吸盘输出残留为 TRUE 导致误吸附。真实工位上,如果 PLC 没有在开机时统一复位输出,这一步就是最后一道保险。注意,中断声明只是登记,并没有真正启用,INTERRUPT ON 20和INTERRUPT OFF 20才会打开和关闭指定编号的中断,这个机制在后续抓件流程中决定了$IN[16]反馈信号监控的范围。
2.2 工具与基坐标在程序头部指定
$TOOL = TOOL_DATA[1] ; 吸盘工具,TCP 定义在吸盘中心 $BASE = $NULLFRAME ; 基坐标选用机器人默认原点的空坐标系$TOOL指定当前运动使用的工具坐标系。程序里所有点位都相对这个工具计算,TOOL_DATA[1]是在示教器上通过三点法或 ABC 世界坐标法标定过的吸盘工具,TCP 位于吸盘中心。$BASE决定工件坐标系的参考原点,$NULLFRAME表示基座原点直接使用机器人安装法兰的默认坐标系。对单个固定工位而言,这样写足够;若后续增加旋转台或导轨,就需要把这些外轴原点定义成独立 BASE,否则点位会随工装位置变化一起漂移。
这部分容易犯的错是把工具坐标和基坐标混在多个 FDAT 里。KRL 的每个运动点都有对应的 FDAT 数据组,FDAT 里存了该点使用的工具号、基坐标号和几何属性。上面的$TOOL = TOOL_DATA[1]只是设了“当前工具”,具体某个运动点到底用哪个工具,由该点绑定的 FDAT 决定。调试阶段如果改了$TOOL但没同步更新 FDAT,程序可能看起来在走原路径,实际 TCP 却偏了几毫米。
2.3 初始化段信号与中断登记对应关系
| 初始化行 | 作用 | 现场意义 |
|---|---|---|
$OUT[3] = FALSE | 清除抓件完成脉冲输出 | 防止上电时误发完成信号给上位机 |
$OUT[4] = FALSE | 清除放件请求应答输出 | 避免下游误认为已可送料 |
$OUT[15] = FALSE | 清除工装吹气输出 | 防止意外吹走工件 |
$OUT[16] = FALSE | 清除故障指示输出 | 避免故障灯残留 |
DECL 20 WHEN $IN[16] == FALSE DO Sucker_Error() | 登记真空丢失中断 | 掉件时能够立即中断当前运动 |
中断登记之所以放在初始化段而不是抓件子程序里,是为了让中断声明只执行一次。KRL 中如果反复执行DECL语句,部分系统版本会报重复定义或覆盖告警。把声明放在USER INI,打开和关闭动作交给INTERRUPT ON/OFF,符合库卡机器人外部控制模版的常见编程习惯,也方便后续维护时一眼看出系统注册了哪些保护。
3. 主流程调度与吸盘抓件的信号联锁设计
3.1 条件判断和等待指令的分工
主程序在初始化完成后先走 HOME 点,然后通过IF $IN[1] == TRUE THEN判断是否进入抓件流程。这个判断是“工位允许级”粗联锁,$IN[1]一般来自送料机构的光电开关或上位机启动信号,表示工件已经到达指定位置,机器人才允许开始取件循环。
IF $IN[1] == TRUE THEN Pick() ; 抓件,内部完成吸盘开、拾取、抬起 WAIT FOR ($IN[16] AND $IN[2]) Place() ; 放件,内部完成放下和吹气 ENDIFWAIT FOR ($IN[16] AND $IN[2])是第二级联锁,等待两个条件同时满足:$IN[16]表示真空吸盘已经建立有效负压,工件被吸住;$IN[2]表示下游放料位已经给出允许放置的信号。这两级联锁的意义在于:IF 只负责决定“能不能开始”,不负责在抓取中途反复确认;真正需要实时确认的条件放到了 WAIT FOR 中,只在运动间隙检查,减少不必要的中断干扰。
实际产线中,很多人都习惯把所有条件堆到一个 IF 里,结果某个传感器瞬间抖动会让整个流程退回到待机状态,重新等待所有信号复位,效率和稳定性都受影响。把粗条件放 IF、把高实时性条件放 WAIT FOR,是这个案例中非常值得沿用的结构。
3.2 Pick 子程序的完整信号链
Pick 子程序是整个文档的核心素材,从程序注释可以清楚看到它的工艺顺序:HOME → 外侧等待点 → 吸着等待点 → 吸着点 → 吸盘开 → 中断开 → 吸着等待点 → 外侧等待点 → 等待真空确认 → 发完成脉冲 → 等待点。这个过程拆成 KRL 就是:
DEF Pick() PTP XHOME PTP XOutside C_DIS ; 先到工件外侧安全点 LIN XPick_wait C_DIS C_DIS ; 接近到吸着等待点 LIN XPick ; 沿法线方向下沉吸合 sucker_on() ; 子程序:打开真空发生器 INTERRUPT ON 20 ; 打开真空丢失监控中断 LIN XPick_wait C_DIS C_DIS ; 确认吸住后抬升 WAIT FOR ($IN[16]) ; 等待真空有效反馈 PULSE($OUT[3], TRUE, 1) ; 发送抓件完成脉冲给上位机 ENDINTERRUPT ON 20放在sucker_on()后面,而不是在LIN XPick之前,这是一个容易被忽略的细节。吸盘输出刚打开时,真空建立需要 200ms 到 500ms,此时$IN[16]肯定还是 FALSE,如果打开中断过早,程序会立刻触发Sucker_Error()误报警。放在这里,相当于只监控“已经吸合后”的反馈丢失。
WAIT FOR ($IN[16])和中断 20 同时存在,看起来有些冗余,实际是针对两种不同场景:WAIT FOR 检查真空是否建立成功,中断监控真空建立后是否在运动中丢失。前者是工艺确认,后者是实时安全保护,去掉任何一个都不完整。
3.3 完成信号使用 PULSE 而不是直接赋值
PULSE($OUT[3], TRUE, 1)PULSE($OUT[3], TRUE, 1)将输出 3 置为 TRUE 并保持 1 秒后自动复位,参数依次为输出编号、输出电平、脉冲宽度秒。使用脉冲而不是直接$OUT[3]=TRUE的好处是上位机 PLC 只需捕捉一次上升沿即可记录“抓件完成”,不需要再开发一套互锁复位握手协议,简化了机器人侧与 PLC 侧的通讯逻辑。脉冲宽度在库卡机器人示教器使用中可以按 PLC 的扫描周期调整,一般不小于 PLC 两个扫描周期,我习惯设成 1 秒,避免现场因 PLC 扫描慢丢信号。
| 信号 | 方向 | 语义 | 在流程中的位置 |
|---|---|---|---|
$IN[1] | 输入 | 允许取件 | 主流程 IF 条件 |
$IN[16] | 输入 | 真空反馈有效 | WAIT FOR 与中断 20 共用 |
$IN[2] | 输入 | 放件请求 | 主流程 WAIT FOR 条件 |
$OUT[3] | 输出 | 抓件完成脉冲 | Pick 末尾 |
$OUT[16] | 输出 | 故障指示 | Sucker_Error 中使用 |
4. PTP与LIN运动指令的轨迹参数与抓件工艺
4.1 C_DIS 连续路径对吸着动作的影响
程序里几乎所有运动指令都携带多个C_DIS后缀,例如PTP XOutside C_DIS、LIN XPick_wait C_DIS C_DIS。第一个C_DIS表示前一个点与当前点之间采用连续路径过渡,机器人不必完全停稳就可以转入下一段运动。第二个C_DIS的出现,通常表示该指令对应的运动数据组里还配置了末端姿态的连续过渡,让法兰盘在接近工件的过程中,吸盘中心轴的方向变化也保持连续。
PDAT_ACT = PPDAT13 FDAT_ACT = FOutside BAS(#PTP_PARAMS, 100) PTP XOutside C_DIS上面四行配套出现,前三行负责为当前运动加载数据组:PDAT_ACT设置 PTP 运动参数,FDAT_ACT设置该点位对应的基坐标和工具组合,BAS(#PTP_PARAMS, 100)将 PTP 速度倍率设为 100%。在吸着动作这种低速高精度场景中,100% 速度通常只用于空行程,真正执行LIN XPick之前,应把抓取动作行的速度降到 0.5m/s 到 1m/s,否则吸盘接触工件的瞬间容易把工件推偏。
4.2 LDAT 参数与 m/s 速度单位的注意点
LIN XPick_wait C_DIS C_DIS Vel = 2 m/s CPDAT6 LIN XPick Vel = 2 m/s CPDAT1 LIN XPick_wait C_DIS C_DIS Vel = 2 m/s CPDAT9三行直线运动都写了Vel = 2 m/s,KRL 中 CP 运动(LIN/CIRC)的速度单位是 m/s,而不是示教器上某些状态区显示的 mm/s。2m/s 对抓取节拍来说相当快,这行代码的价值更多在于示例:它告诉你吸着路径是由 Pick_wait、Pick、Pick_wait 三段组成,而不是直接从 Home 冲到工件上。真实生产中,如果工件是易碎件或表面不平整,抓取接近段速度我会改到 0.2m/s 以下。
CPDAT6、CPDAT1、CPDAT9是直线运动的数据组编号,每个数据组内保存了该运动的速度倍率、加速度倍率、姿态导向值、逼近距离 APO 等。其中 APO(Approximation)决定了机器人提前多远开始转入下一条轨迹。吸着点XPick对应的 CPDAT1 里,APO 值应尽量小,确保吸盘接触工件时机器人真正到达目标点,而不是在目标点前就开始抬升。
4.3 吸盘打开与返回运动的先后顺序
从程序注释行可以确认,sucker_on()是在LIN XPick执行完成之后才被调用,随后打开中断 20,再执行返回运动。这个顺序对应一个工艺原则:先建立真空,再移动工件。如果反过来,吸盘还没有压实就启动抬升,工件可能在吸合面没有形成密封的情况下就被拉动,导致位置偏移,最终在后续放料时放不准。
返回阶段仍然使用 C_DIS 连续路径,目的是把“吸着确认、抬升、等待点停留”三个阶段连成一个平滑循环,减少每个动作衔接处的停顿。这里有一个可以优化的小细节:返回时的LIN XPick_wait仍然使用 2m/s,如果真空反馈确认稍慢,会存在极短的“已开吸但未收到反馈”窗口,现场可以通过把INTERRUPT ON 20提前到LIN XPick之前并配合延时来实现更严格保护,具体做法在下一章说明。
4.4 运动数据组用途速查
| 数据组 | 关联指令 | 保存内容 | 调试建议 |
|---|---|---|---|
| PDAT | PTP | 关节运动速度、加速度、过渡参数 | 空行程可以保持 100%,接近工件后降速 |
| LDAT | LIN/CIRC | 笛卡尔速度、加速度、逼近值 | 检查单位是否为 m/s |
| FDAT | 所有点位 | 工具号、基坐标号、点位几何 | 工具标定后要重新关联 |
| CPDAT | LIN | 直线运动速度/姿态过渡 | 吸合点必须把 APO 调小 |
这些数据组的命名和绑定关系,是新手从“能跑起来”到“能调稳”的分水岭。很多人拿到库卡机器人程序案例,只改点位坐标不改数据组,运行后发现轨迹虽然走到新位置,但速度变化突兀、抓取震动剧烈,原因多半就在这里。
5. 中断20的开关时机与吸盘掉件的现场排错
5.1 故障排查先看中断时序,不看点位
现场如果出现机器人停在半空报 Sucker_Error,第一反应不应该是检查抓取点坐标,而是确认中断 20 的打开和关闭时机。中断 20 声明在 USER INI,真正生效是在sucker_on()调用完成后。如果中途发生掉件,$IN[16]变为 FALSE,扫描到该下降沿后立即跳转Sucker_Error(),机器人会停止当前运动并等待操作员处理。这时从示教器上的“程序执行”页面看中断响应历史,能确认是从哪一个运动段跳出来的,比逐步观察点位更直接。
注意:全局中断编号 3 的优先级高于普通中断 20,
$STOPMESS触发时会先执行急停保护。现场如果同时出现急停和真空丢失,先处理系统停止消息,再排查吸盘原因,不要被示教器上的报警顺序误导。
5.2 工具标定偏移在点位上的表现
$TOOL = TOOL_DATA[1]中的 TOOL_DATA[1] 如果标定误差在 1-2mm,程序运行时不易察觉,但会在两个地方暴露出来:一是 LIN XPick 到达工件面时,吸盘圆周边沿与工件表面出现单侧缝隙;二是从 Pick_wait 接近 Pick 的方向与工件法线存在微小夹角。验证方法是在示教器“实际位置”页面,将坐标系切到工具坐标系,观察 TCP 点在法线方向的分量是否为零。如果明显不为零,优先重新标定工具,而不是盲目改点位坐标去补偿。
5.3 真空建压抖动的最小干扰处理
吸盘输出刚打开瞬间,气路压力尚未稳定,$IN[16]可能在几百毫秒内出现多次由 FALSE 到 TRUE 的抖动。如果中断 20 恰好在这段时间打开,就可能触发无效的 Sucker_Error。稳妥的最小改法是调整打开顺序,让真空建立完成后再开启监控:
sucker_on() ; 内部:置位真空输出,等待 500ms INTERRUPT ON 20 ; 真空稳定后再打开掉件监控把中断打开放到 sucker_on 返回之后,相当于人为避开了建压抖动区。对节拍要求较高的场景,可以在 sucker_on 内部把延时从固定延时改为轮询$IN[16]加超时退出,例如等待 2 秒仍无反馈则直接跳错误程序。这样既不牺牲稳定性,又能保留实时掉件保护。
处理完这一层,下次再拿到类似的库卡机器人程序案例 PDF,可以按同样的顺序拆:中断声明、信号输出、工具坐标、轨迹数据组、C_DIS 节奏,把每一步的开关时机和参数边界理清,机器人的动作行为就完全可预期。
本文还有配套的精品资源,点击获取