简介这是一份面向ABB机器人工程师与自动化集成人员的高级编程学习资料系统讲解RAPID语言中事件程序(Event Routine)、多任务(MultiTasking)与错误处理(ErrorHandle)三个核心主题。文档采用任务实施式编排从控制面板配置到程序编辑器编写逐步演示POWER_ON事件关联、多任务Type设置与SEMISTATIC后台运行、任务间共享数据通信以及EXIT、RAISE、RETRY、TRYNEXT等错误处理指令的定制逻辑此外还补充了PathAccLim轨迹加减速限制和WorldZone区域监控功能适合需要提升机器人复杂控制能力的开发者对照实操。资源为单份PDF电子书压缩后大小约2.36MB便于在电脑或移动设备上阅读。目前已有202人学习该内容。通过学习读者可以系统掌握ABB机器人高级编程的完整思路能够独立配置事件响应、搭建多任务协同逻辑并建立稳健的错误处理机制为自动化项目中的设备协同、安全监控与异常恢复提供直接参考。1. 事件程序、多任务与错误处理ABB RAPID编程先立住的三根柱子很多人把ABB机器人的程序编辑器当成PLC来写一个主循环一堆IF靠延时躲避时序竞争。现场跑上几天问题就来了操作员误触导致程序指针乱跳外设信号闪断让机器人卡在WaitDI里不动进入压铸机合模区时没有任何保护后台通讯中断也完全感知不到。RAPID高级编程真正拉开差距的不是背了多少指令而是事件程序、多任务、错误处理这三件事能不能并到一套工程里。这里围绕ABB机器人高级编程材料中的任务目标展开用Event Routine做上电自检、用MultiTasking跑后台逻辑、用ErrorHandle把超时变成可恢复分支再配合PathAccLim、WorldZone和单轴限位把运动边界收紧。适合已经调通搬运和弧焊、却对系统级控制缺乏概念的机器人工程师与电气工程师。2. 事件程序Event Routine把开机瞬间变成可控自检逻辑2.1 事件程序的工作边界为什么不能出现MoveLEvent Routine本质是系统事件回调。RAPID程序平时由调度器按任务执行而事件程序会在特定系统事件发生时被自动激活比如控制器上电、程序启动、错误恢复。常见做法是把它当成“开机自检入口”在机器人真正开始自动运行前先把需要初始化的IO、区域监控、标志位全部准备好。注意事件程序里不能有移动指令也不能有太复杂的逻辑判断。原因是事件程序运行期可能发生在控制器状态尚未完全恢复、安全停止信号仍然有效的阶段。如果插入MoveL运动系统会尝试插补但此时运动权限不可控如果写死循环或大量条件分支则会让控制器在系统事件处理中被长期占用严重时连看门狗都喂不上导致控制器复位。所以事件程序正确写法是“短、直、快”读IO、写屏、设置区域监控、退出。2.2 绑定POWER_ON事件从控制面板到例行程序先在程序编辑器里新建例行程序rEvent内容如下PROC rEvent() TPWrite Start OK; END PROC代码说明这只是一个验证代码。TPWrite是RAPID的写屏指令接受字符串常量或字符串变量能把文本显示到示教器操作员画面。事件程序里用TPWrite做状态反馈最直观方便确认POWER_ON事件确实触发了rEvent。然后进入控制面板-配置主题选择Controller。双击Event Routine点击添加。Event选择POWER_ONRoutine选择rEventTask选择默认任务T_ROB1点击确定后重启。参数说明POWER_ON事件发生在控制器二次上电阶段此时运动系统尚未完全就绪这恰好解释了2.1为什么要禁止移动指令。Task参数决定事件例行程序在哪个任务中执行多任务系统下如果选错任务事件程序可能读到的不是目标任务的数据。配置字段含义本示例取值Event触发事件的名称POWER_ONRoutine被调用的例行程序rEventTask例程所在任务上下文T_ROB12.3 一个更实用的上电自检写法纯写屏只做验证。现场我一般会在rEvent里读几个关键输入信号把状态写到屏幕或者输出上PROC rEvent() IF diSafeGate 1 THEN TPWrite 安全门关闭; ELSE TPWrite 警告: 安全门未关闭; ENDIF END PROC代码说明IF条件里只做IO状态判断不调用运动指令也不等待信号变化。diSafeGate是预先定义好的数字输入信号这里直接按信号名读取。事件程序运行时控制器的IO系统已经完成初始化所以读IO是安全的。但不要在这里加WaitDI等信号事件处理线程如果被等待占用其他系统事件会被阻塞现场表现就是重启后界面迟迟不刷新。验证时不需要立刻重启。可以先手动运行方式执行一次rEvent确认逻辑无误再重启控制器看POWER_ON触发效果。如果没显示优先检查事件程序是否处于禁用状态以及Task是否与例行程序所在任务一致。3. 多任务MultiTasking前台跑运动后台跑PLC式逻辑3.1 多任务模型与623-1选项多任务的典型部署是T_ROB1在前台负责运动指令和主逻辑另一个任务在后台负责通讯、信号采集或简单逻辑。后台任务的最大价值是“不受机器人控制状态影响”——即使机器人处于手动模式或程序未启动后台任务也能从开机开始连续运行。系统需要623-1 MultiTasking选项并且最多只能配置20个不带机器人运动指令的后台任务。如果把这个模型类比成PLC前台任务是主扫描周期负责工艺后台任务相当于自由运行的中断程序负责心跳、通讯和监视。运动指令不能放进后台任务否则系统直接报错后台程序里最好也不要出现与运动插补相关的指令调用避免抢占运动任务的总线时间。3.2 建立后台任务T_Back并把主入口改成mainback操作步骤如下进入控制面板-配置Controller主题双击Task。点击添加Task值填T_Back。Type选NONMALMain entry改为mainback。重启使设置生效。点击示教器右下角快捷菜单里的多任务按钮把T_ROB1前台任务取消掉。在程序编辑器中为T_Back添加程序模块和mainback主例行程序。电机上电运行程序观察后台任务控制的IO变化。在mainback里可以写一个最简单的后台任务代码PROC mainback() WHILE TRUE DO SetDO doStatus, 1; WaitTime 0.5; SetDO doStatus, 0; WaitTime 0.5; ENDWHILE END PROC代码说明WHILE TRUE构成死循环这是后台任务的标准写法。如果不写死循环后台任务执行完最后一条指令就结束之后不会再参与逻辑。WaitTime 0.5让循环每半秒翻转一次doStatus这个输出信号接到示教器IO视图或PLC后就能直观判断后台任务是否在独立运行。字段作用说明Task任务名称T_Back可自由命名Type任务运行方式NONMAL手动启动SEMISTATIC开机后自动运行Main entry主入口例程名改成mainback避免与T_ROB1的主程序混淆3.3 任务间数据通信同名可变数据的同步机制多任务之间不是靠全局变量随意访问而是靠同名数据同步。在两个任务中分别建立存储类型为可变量、名字相同的num数据abb1一个任务修改这个数据另一个任务中名字相同的数据会随之更新。! T_ROB1 前台任务 VAR num abb1; PROC frontmain() abb1 : 100; END PROC! T_Back 后台任务 VAR num abb1; PROC mainback() WHILE TRUE DO IF abb1 100 THEN SetDO doReady, 1; ENDIF WaitTime 0.2; ENDWHILE END PROC代码说明两边各声明一个同名VAR num abb1控制器会自动建立同步关联。前台把abb1改成100后后台循环读到100就把doReady置1。注意同步的前提是名字、类型、存储类型三者都一致如果一边是VAR另一边是PERS或者类型改成string控制器不会自动同步。这组机制比用IO硬接线交换数据更可靠也节省PLC的组输入通道。3.4 什么时候用SEMISTATICType选NONMAL时后台任务需要手动启动选SEMISTATIC后后台程序从系统启动开始连续运行即使前台程序没有执行后台任务也在跑。适合的场景是机器人与PC之间不间断的通讯心跳、IO信号监视、生产计数。设置SEMISTATIC的步骤是在Task编辑画面把Type改为SEMISTATIC重启后生效。提示SEMISTATIC并非“每个扫描周期重新加载”而是在系统启动时装载并在后台持续运行所以不要在后台任务里做长时间阻塞事件程序的操作。4. 错误处理与运动边界从WAITDI超时到WorldZone区域拦截4.1 RAPID错误处理模型ErrorHandle不是传统编程语言的try-catch而是通过例程内的ERROR标签捕获错误。程序执行出错时控制器会把错误编号写入系统变量ERRNO并跳转到当前例程的ERROR标签处。用IF判断ERRNO可以识别具体错误再决定重试、跳过或退出。指令功能EXIT出现无法处理的错误时停止程序执行RAISE激活当前错误处理重新触发错误RETRY再次执行激活错误处理的那条指令TRYNEXT跳过出错指令执行下一条RETURN返回调用前的子程序ResetRetryCount复位错误处理的重试次数4.1.1 用WaitDI的ERR_WAIT_MAXTIME验证超时恢复操作步骤新建例行程序rErrorHandle勾选“错误处理程序”。添加WaitDI指令选择MaxTime可选变量值设置为3。添加TPWrite写屏指令。在ERROR标签下面输入错误处理代码PROC rErrorHandle() WaitDI di1, 1\MaxTime:3; TPWrite 等待完成; ERROR IF ERRNO ERR_WAIT_MAXTIME THEN TPWrite di1超时, 继续执行下一句; TRYNEXT; ELSE RAISE; ENDIF END PROC代码说明WaitDI di1,1\MaxTime:3的含义是等待di1变为1最多3秒。超时后系统自动跳到ERROR段ERRNO变为本次触发的错误标示符。这里把ERRNO与ERR_WAIT_MAXTIME比较确认等待超时后用TRYNEXT跳过WaitDI直接执行下一条TPWrite。需要注意RETRY会重新执行WaitDI如果信号长期不满足会出现无限重试所以我一般只在“信号抖动、过一会儿就好”的场景下用RETRY固定故障用TRYNEXT或RAISE。错误处理中最好不要放运动指令也不要做耗时逻辑。这是因为错误往往发生在急停、安全停止或运动异常时此时再触发运动指令会带来新的危险。4.2 PathAccLim给TCP加减速度加上限有些工艺场景不需要改变速度但需要约束加速度比如机器人端着高温液体浇注急加速会把液体晃出来。PathAccLim指令就是专为这种场景准备的PathAccLim TRUE\AccMax:4, TRUE\DecelMax:4; MoveL p1, v1000, fine, tool0; MoveL p2, v1000, z30, tool0; PathAccLim FALSE, FALSE;代码说明第一行把TCP的加速度和减速度都限制在4m/s²中间两条MoveL按照这个限制执行最后一行恢复默认最大值。限制值最小只能设为0.5m/s²再小会导致轨迹精度下降或速度曲线抖动。这里的FALSE对应“取消限制”PathAccLim FALSE,FALSE表示两条限制都取消。需要说明的是PathAccLim只约束TCP路径方向上的加速度不改变轴内部加速度如果还想限制每个轴的加速度需要配合AccSet使用。参数含义有效范围AccMaxTCP最大加速度0.5 m/s²以上DecelMaxTCP最大减速度0.5 m/s²以上FALSE不限制对应项无4.3 WorldZone区域监控空间拦截与信号输出WorldZone不是软件限位它是基于TCP坐标的空间监控。用空间的AB两个对角点定义矩形、圆柱或关节位置型区域机器人TCP进入指定区域后要么输出一个信号要么直接停止。它的坐标基准是当前工件坐标wobj和工具坐标tooldata所以换工具或换工件坐标后区域会跟着偏这也是许多现场“区域监控失效”的根源。使用前确认系统装了608-1 WorldZone选项。在ABB菜单-系统信息-系统属性-控制模块-选项中查看。然后在手动操纵界面选定要监控的工具。编制Event Routine对应的程序VAR shapedata shPos; CONST robtarget Pos1 : [ [0,0,0], [1,0,0,0], [0,0,0,0], [9E9,9E9,9E9,9E9,9E9,9E9] ]; CONST robtarget Pos2 : [ [500,500,500], [1,0,0,0], [0,0,0,0], [9E9,9E9,9E9,9E9,9E9,9E9] ]; WZBoxDef\Inside, shPos, Pos1, Pos2; WZDOSet\Stat, wzPos\Inside, shPos, do1, 1;代码说明Pos1和Pos2是矩形的两个对角点实际值应该在示教器上手动取点不要人工硬填。WZBoxDef\Inside表示“区域内有效”shPos保存定义好的区域形状数据。WZDOSet把区域与输出信号do1关联参数\Stat表示区域监控始终激活\Inside表示机器人进入区域时do1置1。如果需要机器人进入区域后停下来可以用WZLimSup替换WZDOSet它激活监控空间并限定为不可进入。4.4 单轴限位弧度单位的上下界设定工作环境限制或保护夹具时经常要给单个轴设上限和下限。进入控制面板-配置Motion主题双击Arm选择要限定的轴修改Upper Joint Bound和Lower Joint Bound。单位是弧度1弧度约等于57.3度默认值是±180度也就是±3.14159。参数默认值说明Lower Joint Bound-3.14159轴负方向软件下限Upper Joint Bound3.14159轴正方向软件上限设定值应该与实际机械限位之间留出余量。比如第6轴机械限位是±5度软件限位设到±4.5度比较稳妥换算成弧度约为±0.0785。设置完成后进入手动操纵模式当轴运动超出范围时系统会报错这个报错信息比机械撞击好处理得多。4.5 组合使用上电时把WorldZone挂到Event Routine实际项目中我通常会把WorldZone的初始化代码写进rEvent让POWER_ON事件在上电瞬间自动把区域监控激活PROC rEvent() VAR shapedata shPos; CONST robtarget Pos1 : [ [0,0,0], [1,0,0,0], [0,0,0,0], [9E9,9E9,9E9,9E9,9E9,9E9] ]; CONST robtarget Pos2 : [ [500,500,500], [1,0,0,0], [0,0,0,0], [9E9,9E9,9E9,9E9,9E9,9E9] ]; WZBoxDef\Inside, shPos, Pos1, Pos2; WZDOSet\Stat, wzPos\Inside, shPos, do1, 1; TPWrite WorldZone enabled; END PROC代码说明这里Pos1和Pos2只是示例坐标必须替换成实际可达区域。事件程序里不能有移动指令但WZBoxDef/WZDOSet是数据定义与IO关联不触发运动可以放在这里。关联POWER_ON后每次上电都会自动执行这段初始化。如果Event Routine关联失败WorldZone不会启动且不报错所以验收时一定要用手动点动让机器人进入区域观察do1是否按预期变化。5. IO信号调用例行程序与RAPID指令速查5.1 用CallByVar把组输入变成例程名操作员从HMI选择产品型号后PLC把编号写入机器人的组输入gi1RAPID用CallByVar动态调用proc1或proc2。要保证子程序命名规则是固定前缀加数字PROC rSelectProg() CallByVar proc, gi1; END PROC代码说明CallByVar第一个参数是例程名前缀第二个参数是编号变量。gi1的值为1时调用proc1为2时调用proc2。这里的“proc”是固定值运行时控制器自动拼接成完整例程名。gi1是组输入信号宽度按PLC字节数定义如果定义成2位二进制最多可以选4个程序。调试时在手动操纵界面模拟gi1的值运行rSelectProg后观察程序指针是否跳到对应例程。相比写一长串TEST判断CallByVar让新增产品变得很容易只要新增proc3、proc4不需要改选择程序。5.2 常用RAPID指令速查表程序执行控制类指令功能ProcCall调用例行程序CallByVar使用带变量的例程名调用Compact IF / IF / FOR / WHILE / TEST逻辑分支与循环Stop / EXIT / Break停止或退出程序等待与信号类指令功能WaitTime / WaitUntil延时/等待条件WaitDI / WaitDO等待输入/输出信号状态SetDO / SetDO置位/复位数字输出运动设定类指令功能VelSet / AccSet速度与加速度设定PathAccLimTCP路径加减速限制ConfJ / ConfL关节/线性运动的轴配置控制WZBoxDef / WZLimSup / WZDOSet区域监控定义与激活偏置与坐标类指令功能PDispOn / PDispOff位置偏置开关EOffsOn / EOffsOff外轴偏置开关DefFrame通过位置数据定义坐标系5.3 验收时一定要做的组合测试事件程序、多任务、错误处理和区域监控是四个独立功能但产线上它们必须协同工作。我一般会做一轮“断电重启区域误入信号超时”的组合测试重启后确认rEvent把WorldZone拉起来、T_Back后台任务把心跳信号跑起来手动点动进入设置好的矩形区域确认do1输出变化再让一个WaitDI进入超时观察错误处理是否TRYNEXT。另一个容易被忽略的动作是把proc1、proc2样板放在同一个模块中新增型号时复制proc模板只改内部逻辑rSelectProg一行都不用动。这样HMI编号和例程命名保持一致现场每次扩展型号都不需要打开机器人的程序编辑器。本文还有配套的精品资源点击获取