KUKA SPS后台程序实战:扫描周期、信号映射与避坑指南
简介这份文档面向KUKA机器人调试与自动化集成工程师系统讲解后台控制程序SPSSequential Program System的定位与用法。SPS基于PLC原理负责机器人后台逻辑控制与自动化任务执行是理解KUKA系统运行机制的关键一环。文档梳理了RC运动控制、I/O刷新、用户可编辑SPS逻辑、示教器界面刷新四部分的优先级关系以及12ms固定周期的执行约束并给出SPS程序的编辑流程与使用限制如禁止运动指令、不可修改预进指针、避免等待时间等还以暂停、再启动、程序停止为例说明信号监听逻辑。资源包为1个docx文件约1.19MB内容以图文步骤与程序框架说明为主便于对照示教器操作。目前已有2373人学习适合希望掌握KUKA后台逻辑编程、排查SPS运行问题的技术人员参考。1. 别再把 SPS 当黑匣子KUKA 后台控制程序到底在跑什么很多人第一次接触 KUKA 机器人后台控制程序SPS是在产线突然停机、示教器上跳出一串跟当前任务毫无关系的报警时。操作工说“我就按了启动”电气工程师说“PLC 信号没问题”最后查来查去发现是一个每 12ms 跑一次的后台逻辑把使能条件给掐了。SPS 全称 Submit Program中文一般叫提交程序或后台程序它跟机器人解释器里跑的主程序是两条并行的时间线。主程序管运动、管轨迹、管逻辑顺序SPS 管的是那些“不管机器人当前在不在动都必须持续盯着”的事安全门状态、外部使能、模式切换、信号滤波、状态字刷新。它不占运动规划周期但它的扫描周期直接决定你对现场信号的响应速度。适合谁看如果你正在做 KUKA 与 PLC 的接口联调、写安全逻辑、或者被“信号闪一下就丢”的问题折磨过这篇就是给你写的。下面按“先搞懂它怎么跑、再动手写、最后避坑”的顺序推。2. SPS 与主程序并行先搞清扫描周期和信号边界2.1 SPS 不是中断它和机器人解释器抢的是同一个控制器KUKA 控制器内部跑的是多任务环境。机器人解释器Robot Interpreter负责解析和执行用户主程序SPS 是另一个独立任务由系统在后台以固定周期调用。常见做法是把它配置成 12ms 或 4ms 的循环具体取决于控制器型号和选项配置。这里有个容易翻车的认知SPS 不是硬件中断它不会“立刻”响应输入。输入信号先被映射到控制器过程映像区SPS 在下一个扫描周期读到的是那一刻的快照。如果信号只持续了 5ms而 SPS 周期是 12ms你大概率丢信号。所以凡是窄脉冲信号要么在 PLC 侧做展宽要么在 SPS 里用边沿加定时器锁存不能指望 SPS 自己抓住。另一个边界是 SPS 里不能写运动指令。你可以在 SPS 里改全局变量、置位输出、触发主程序里的分支但不能直接PTP或LIN。常见做法是 SPS 只做条件判断和状态管理把动作请求写成全局标志位主程序在合适的位置轮询这个标志再执行运动。这样职责清晰也避免 SPS 周期被运动规划拖长。2.2 一个最小可跑的 SPS 结构声明、初始化、循环体KUKA 的 SPS 通常写在SPS.SUB文件里用 KRL 语言。下面是一个最小骨架我一般拿它当模板改DEF SPS( ) ; 声明区所有在 SPS 中使用的变量必须在此声明 DECL BOOL bDoorOK DECL BOOL bEnable DECL INT nCycleCnt DECL STATE_T sState ; 初始化区只在 SPS 首次启动时执行一次 IF $MODE_OP #INITIALIZE THEN bDoorOK FALSE bEnable FALSE nCycleCnt 0 $OUT[10] FALSE ; 复位一个示例输出 ENDIF ; 主循环系统会周期性反复调用这一段 LOOP ; 读安全门输入假设接在 $IN[1] bDoorOK $IN[1] ; 读外部使能假设接在 $IN[2] bEnable $IN[2] ; 只有门关且使能有效才允许输出“系统就绪” IF (bDoorOK TRUE) AND (bEnable TRUE) THEN $OUT[10] TRUE ELSE $OUT[10] FALSE ENDIF ; 周期计数用于诊断 SPS 是否在跑 nCycleCnt nCycleCnt 1 IF nCycleCnt 10000 THEN nCycleCnt 0 ENDIF ; 让出时间片避免独占控制器 WAIT SEC 0 ENDLOOP END逻辑说明DEF SPS( )是固定入口不要改名字。$MODE_OP #INITIALIZE判断只在控制器初始化阶段成立用来做一次性复位避免每次循环都重置变量。LOOP ... ENDLOOP是 SPS 的常驻循环系统会在每个扫描周期进入这里。WAIT SEC 0是必须的它让当前任务主动让出时间片否则可能拖死其他任务。参数方面$IN[1]、$IN[2]、$OUT[10]是示例编号实际项目里要按你的 IO 映射表改。nCycleCnt是诊断用的如果它不涨说明 SPS 根本没跑起来。2.3 信号映射与过程映像为什么你读到的值和万用表量到的不一样KUKA 的输入输出分物理通道和过程映像。SPS 里读$IN[x]读的是过程映像不是直接读硬件端子。过程映像由总线系统周期性刷新通常和 SPS 周期同源或更快。如果你在 SPS 里读一个信号同时用万用表量端子两者可能差一个周期。这不是 bug是架构决定的。常见做法是对时间敏感的信号在 PLC 侧做滤波和展宽保证到达 KUKA 过程映像时已经稳定对状态类信号在 SPS 里做软件消抖比如连续读三次相同才认。下面是一个软件消抖的写法DECL BOOL bRaw, bStable DECL INT nSameCnt ; 在 LOOP 内 bRaw $IN[3] IF bRaw bStable THEN nSameCnt 0 ELSE nSameCnt nSameCnt 1 IF nSameCnt 3 THEN bStable bRaw nSameCnt 0 ENDIF ENDIF这里nSameCnt 3表示连续三个周期读到相反值才翻转按 12ms 周期算就是 36ms 消抖。参数怎么定机械触点一般 3 到 5 个周期够固态信号可以降到 2。注意bStable要声明成全局或在初始化里赋初值否则第一次比较是未定义行为。3. 把 SPS 接到 PLC 和上位机接口信号怎么定、怎么测3.1 接口信号表先定语义再定地址最后定周期SPS 最常见的用途就是做 KUKA 与 PLC 的接口层。我一般先拉一张表把每个信号的名称、方向、语义、地址、刷新周期写清楚再动手写代码。表里至少要有这几类控制字PLC 给 KUKA 的启动、停止、模式选择、状态字KUKA 给 PLC 的就绪、运行、报警、位置到达、安全信号门、使能、急停链、握手信号请求/应答。下面是一个简化示例信号名方向语义示例地址刷新周期PLC_StartReqPLC→KUKA请求启动$IN[10]12msPLC_ModeAutoPLC→KUKA自动模式$IN[11]12msKUKA_ReadyKUKA→PLC系统就绪$OUT[20]12msKUKA_RunningKUKA→PLC程序运行中$OUT[21]12msKUKA_AlarmKUKA→PLC报警汇总$OUT[22]12msHandshake_ReqPLC→KUKA握手请求$IN[12]12msHandshake_AckKUKA→PLC握手应答$OUT[23]12ms这张表定下来之后SPS 的代码结构基本就定了读输入、算状态、写输出、处理握手。注意刷新周期这一列如果 PLC 侧扫描周期比 KUKA 慢很多握手信号要用脉冲或双边沿不能用电平一直等。3.2 握手逻辑的 SPS 实现别用延时用状态机新手容易在 SPS 里写WAIT SEC 0.5来做握手延时这是大忌。SPS 是周期任务你WAIT的时候整个后台逻辑都停了安全信号也停了。正确做法是用状态机加周期计数。下面是一个握手应答的片段DECL INT nHandshakeState DECL INT nHandshakeTimer ; 状态定义0空闲1收到请求2应答中3完成 ; 在 LOOP 内 SWITCH nHandshakeState CASE 0 IF $IN[12] TRUE THEN nHandshakeState 1 nHandshakeTimer 0 ENDIF CASE 1 ; 等待 2 个周期再应答避免竞争 nHandshakeTimer nHandshakeTimer 1 IF nHandshakeTimer 2 THEN $OUT[23] TRUE nHandshakeState 2 ENDIF CASE 2 IF $IN[12] FALSE THEN $OUT[23] FALSE nHandshakeState 0 ENDIF DEFAULT nHandshakeState 0 $OUT[23] FALSE ENDSWITCH逻辑说明SWITCH比一堆IF更适合状态机可读性好。nHandshakeTimer 2是等两个 SPS 周期按 12ms 算就是 24ms足够让 PLC 侧读到。DEFAULT分支做异常恢复防止状态变量被意外改坏后卡死。参数方面nHandshakeTimer的阈值要根据 PLC 扫描周期调PLC 慢就加大但别超过 10 个周期否则响应太肉。3.3 用示教器或 WorkVisual 在线看 SPS 变量写完代码怎么验证最直接的是在示教器上打开变量显示把nCycleCnt、bDoorOK、$OUT[20]这些加进去看它们是不是按预期变。如果nCycleCnt不动说明 SPS 没被调用去检查SPS.SUB是否在R1或系统配置里被正确挂载。另一个工具是 WorkVisual可以在线监控和强制变量但强制输入要小心可能绕过安全逻辑。我一般先用示教器看周期计数确认 SPS 在跑再看具体信号。如果信号不对先查 IO 映射表再查 PLC 侧输出最后才怀疑 SPS 代码。这个顺序能省很多时间。4. SPS 避坑与排查那些让你半夜被叫回产线的细节4.1 坑一SPS 里用了未初始化变量第一次扫描读到随机值现象系统刚上电SPS 输出的就绪信号闪一下又灭或者直接误触发一个动作。原因KRL 里DECL只声明不初始化局部变量在首次进入时可能是任意值。解决所有在 SPS 里用的变量要么在#INITIALIZE分支里赋初值要么在声明时直接给初值比如DECL BOOL bDoorOK FALSE。我习惯在初始化区把所有输出先复位一遍再进循环。4.2 坑二SPS 周期被长循环拖长安全信号响应变慢现象安全门打开后机器人要过好几百毫秒才停比预期慢很多。原因SPS 的LOOP里写了耗时操作比如大数组遍历、字符串处理、或者嵌套很多层的FOR循环。SPS 是单任务循环你占的时间就是安全逻辑被推迟的时间。解决把耗时计算挪到主程序或 PLC 侧SPS 里只做轻量判断。如果必须做拆成多个周期分步执行用状态机推进别在一个周期里干完。4.3 坑三输入信号抖动导致状态字频繁翻转现象PLC 侧看到 KUKA 的就绪信号一直在跳或者报警汇总信号闪个不停。原因机械触点抖动或电气干扰SPS 每个周期都读读到什么就输出什么。解决在 SPS 里加软件消抖或者更彻底地在 PLC 侧做硬件滤波。消抖周期数按信号特性定一般 3 到 5 个 SPS 周期。注意消抖会引入延迟安全信号不能消抖太狠否则响应变慢。4.4 坑四SPS 和主程序同时写同一个输出结果互相覆盖现象主程序里置位的输出过一会自己灭了或者 SPS 里置位的输出被主程序改掉。原因KRL 里$OUT[x]是全局的两个任务都能写谁后写谁生效。解决约定好每个输出的归属要么 SPS 管要么主程序管不要交叉。如果必须交叉用中间变量传递只在 SPS 里做最终输出。我一般把安全相关和状态相关的输出全放 SPS运动相关的输出放主程序边界清晰。4.5 坑五SPS 没挂载或挂载错任务代码根本不跑现象代码写得好好的下载进去没反应示教器上变量不动。原因SPS.SUB没有被系统配置引用或者被挂到了错误的解释器。解决检查R1目录下的系统配置确认 SPS 在启动任务列表里。不同控制器版本配置位置不一样常见做法是看$MODE_OP在初始化时能不能进#INITIALIZE能进说明挂上了。如果进不去先解决挂载问题别改代码。5. 进阶把 SPS 当轻量状态机用以及一个诊断技巧SPS 最被低估的用法是把它当成一个不占运动资源的轻量状态机管理整条产线的节拍和互锁。我做过一个模拟项目用 SPS 管了十几个工位的请求/应答、模式切换和报警汇总主程序只负责按 SPS 给出的标志位执行运动。这样主程序很干净SPS 也不重扫描周期稳定在 12ms 以内。关键是把状态定义清楚每个状态只做一件事状态迁移条件用输入信号和定时器组合别用WAIT。另一个实用技巧是加一个“SPS 心跳”输出。在 SPS 循环里让一个输出按固定周期翻转比如每 500 个周期翻转一次PLC 侧监控这个信号如果超过预期时间没翻转就判断 KUKA 后台任务挂了。这个信号不参与安全逻辑只做诊断但能让你在产线停之前就发现异常。参数上翻转周期别太短否则 PLC 侧不好抓也别太长否则发现太晚。我一般用 500 个 SPS 周期按 12ms 算就是 6 秒够用。验证 SPS 改动是否安全我的习惯是先在离线环境跑一遍逻辑仿真确认状态迁移没问题再下载到真机而且第一次下载后不急着上自动先手动模式看变量。血泪经验是SPS 里任何一行改动都可能影响安全链别因为“就加个计数”就跳过验证。希望帮到你。本文还有配套的精品资源点击获取