跳到主要内容

8.16 关于 RL 程序

8.16.1 RL 程序格式及语法

8.16.1.1 概述

RL 语言程序文件后缀名为 .mod,mod 是 module(模块)的缩写。例如:MoveObj.mod 或 PickSomething.mod,每一个程序文件构成一个程序模块。 RL 语言的指令不区分大小写,例如对于 MoveAbsJ、moveabsj、MOVEABSJ 三种写法均可识别,但是为保持统一的语言风格,建议采用单词首字母大写的格式。

8.16.1.2 程序结构

下面为一个简单的 RL 程序:

8.16.1.2

整个程序分为声明区和实现区两大部分:

  • 声明区: 在每个 Mod 文件中第一个函数之前的区域。例如 main.mod 中 GLOBAL PROC main 之前的部分。声明区中可以定义变量或常量。该区域定义的变量将在每次执行程序时被重置为初始值。

  • 实现区: 函数体部分,包含具体的程序逻辑。

VARCONST 关键字表示存储类型,VAR 表示可变量,CONST 声明为常量;若不显示声明变量的存储类型,默认变量为可变量。

声明区变量与变量列表中的变量的区别:

  • 声明区变量:某个任务运行结束重置时,会重置任务内声明区定义的变量。

  • 变量列表的变量:属于整个工程,是公用变量。变量列表的非保持变量只在执行 pptomain 时重置,保持变量只能通过变量列表编辑功能或者 RL 程序修改。

8.16.2 RL 程序调试

8.16.2.1 程序指针

程序指针指向程序已解析并运行的行号。在 HMI 界面上,程序指针使用绿色小箭头表示(又称绿指针)。

8.16.2.1

8.16.2.2 运动指针

运动指针指向机器人正在执行的运动指令行。 在HMI 界面上,运动指针使用红色箭头表示。

8.16.2.2

8.16.2.3 移动程序指针

如果需要从程序中间的某一行开始执行之后的程序,那么可以使用该功能将程序指针移动到光标所在行,之后程序即可从新的位置开始执行。

步骤 图示 说明

1.点击右侧操作面板中的“停止”按钮,使 RL 程序暂停。

8.16.2.3 1

2.点击期望指针移动到的行,使其为选中状态。

8.16.2.3 2

选中状态下背景颜色为浅蓝色。

3.击程序调试快速定位按钮旁的下拉箭头,从列表中选择“光标”。

8.16.2.3 3

选择后该按钮显示“光标”字样。

4.点击程序调试快速定位按钮,即可移动指针到选中行。

8.16.2.3 4

使用限制:

  • 使用该功能时,以下指令会被忽略,编译器的编译位置会直接移动到目标行,除此之外,其他所有指令都不执行:所有的运动指令;SetDO、SetGO、Return、Wait、Print 以及所有的 Socket 指令;函数调用行。

  • 移动程序指针时,忽略流程控制指令的判断条件。

  • 不能跨函数移动程序指针,需要先使用“程序指针到函数”功能将程序指针移动到某个函数的开头,再使用移动程序指针功能。

  • 移动程序指针只能移动到运动指令行。

8.16.2.4 单步调试

单步运行状态又称为单步模式,与之对应的是连续模式,绝大多数情况下,机器人可以在单步模式和连续模式之间进行切换。

单步运行主要用来做程序调试,机器人每次单步运行将尽可能执行完一行指令,并在指令完成后暂停程序,便于确认每一个行的示教点是否符合要求。当调试对象是多任务工程时,单步调试只会执行当前HMI 调试界面显示的任务,其余任务将不会被调用。 如果单步调试执行的是读取数据指令(Read Double,ReadString 等)、时间相关指令(Wait、 WaitUntil 等)、逻辑指令(IF、GOTO 等),由于指令特性限制,将需要两到三次点击下一 步,才能完成该行指令。

步骤 图示 说明

1.移动指针到某行。

8.16.2.4 1

2.点击右侧操作面板中的“下一步”按钮。

8.16.2.4 2

3.再次点击下一步按钮,可看到机器人正在执行该行。执行完成后再次点击下一步按钮,开始执行下一步.

8.16.2.4 3

若遇到函数,将跳转到该函数内部,可通过程序指针(绿色箭头)定位正在执行的行。

使用限制:

  • 连续模式程序自动执行,需要处理转弯区,可以有运动前瞻。

  • 单步模式直接执行指令,不处理转弯区,无运动前瞻。

  • 连续模式下,前瞻点够了才运动,到位后才可以继续解析指令。

  • 单步模式下,所有下一步信号由界面触发,不处理转弯区,不前瞻。

  • 单步模式下,运动过程中点击下一步,不响应。

  • 连续模式下,运动过程中的回调,按照前瞻逻辑响应。

  • 下一步可到任意行,执行字面意义。对于 RL 程序而言,只有“程序指令”,不区分运动指令和逻辑指令。

  • 连续运行,暂停在转弯区上,下一步均先回到当前转弯区所对应的目标点。

8.16.2.5 步退调试

步退调试又称为上一步调试,主要功能是在调试过程中发现路径错误时,可以直接回退到最后一个正确的点位,而不用通过多次 JOG 才能让机器人退出错误轨迹,提高调试效率。

  • 非运动指令在步退过程中一般不生效,会被直接跳过。

  • 力控指令、运动设置指令、逻辑指令会停止步退。

8.16.2.6 步退使用方式

xCore 支持暂停后直接切换步退和ppto光标后步退 ppto 光标后第一次步退运动时,由于没有任何轨迹信息,笛卡尔点将强转为MoveJ 运动。

步骤 图示 说明

1.运行过程中暂停。

8.16.2.6 1

前瞻到第十行,但是机器人在从 J1 前往 P1 的轨迹上。

2.点击右侧操作面板中的“上一步”按钮。

8.16.2.6 2 8.16.2.6 3

前瞻指针会跳转到运动指针上面,表示进入步退模式。

3.再次点击“上一步”按钮,机器人开始步退运动。

8.16.2.6 3

机器人会按暂停时的运动方式(本例中是 MoveL)回退到前瞻指针指向的 J1。

8.16.2.7 步退使用限制

步退功能主要用于点位的调试,所以大部分非运动指令在步退模式中是无效的或者被限制使用的,也有少部分运动指令原理上无法步退,也限制使用,如果尝试步退执行受限制的指令,控制器会报错。

8.16.2.7

步退调试功能支持的指令情况:

类型 具体指令

支持步退的运动指令

MoveAbsJ, MoveJ, MoveL, MoveC, Home

特殊运动指令

SearchL, SearchC, TrigL, TrigJ, TrigC (注:探寻、Trig 等功能在步退时不生效,只产生运动效果)

不支持的运动指令

MoveSP, MoveT, MoveCF

终止步退的非运动指令

传送带指令,力控指令,逻辑指令,函数调用,高级指令 (注:GetRobotState、BreakLookAhead、GetRobotMaxLoad 指令会被跳过,其它处于该分类的指令都会终止步退)

被跳过的非运动指令

剩余的所有指令

注1: 探寻、Trig 等功能在步退时不生效,只产生运动效果。 注2:GetRobotState,Break LookAhead,GetRobotMaxLoad 指令会被跳过,其它处于该分类的指令都会终止步退。

8.16.2.8 重回路径

在某些特定情况下,机器人的位置会偏离其编程的路径,例如:

  • 在程序运行中被停止的期间(程序复位造成的程序停止不在此列),机器人被 Jog 到其他位置。

  • 程序运行期间触发紧急停止,机器人执行 STOP0 后。

当程序再次从停止位置启动时,如果系统检测到机器人已经偏离编程路径,那么机器人会首先执行重回路径(RegainPath)运动以返回到原来的编程路径上。为保证安全,重回路径时机器人的运动速度比较慢,并且可随时按示教器上的“停止”按钮来停止机器人的运动。

使用限制:

  • 重回路径时机器人执行的是关节轨迹,因此末端路径无法预测,请注意观察是否会与周边环境发生碰撞。

  • 只有当机器人从程序中间停止的地方继续执行时,控制系统才会检测是否偏离路径,如果偏离则会执行重回路径操作。

  • 如果程序被复位,那么系统将不会检测是否偏离路径,而是直接从第一行开始执行,请注意防范可能发生的碰撞。

8.16.2.9 循环模式

点击“循环模式”按钮可切换至循环模式8.16.2.9(1 或单次模式8.16.2.9(28.16.2.9

循环模式: 所有任务在执行到指定函数(默认为main 函数)的endproc 时,会在0 .5 秒之后重置,重置 之后从最后一次指定的函数的第一行重新开始执行。 PPToMain 操作将main 函数作为指定函数; PPToFunc 将跳转的目标函数作为指定函数; PPToLine 不会影响下次循环的函数执行目标。 单次模式: 所有任务(半静态任务除外)将在执行到指定函数(默认Main 函数)的endproc 后永久停止, 直到下一次开始运行,重新加载工程。

8.16.2.10 前瞻机制

8.16.2.10.1 基本概念

前瞻机制无法关闭,系统在运行程序时会自动进行前瞻,可以使用程序指针(Program Pointer)来查看前瞻的位置。 从前瞻的角度看,RL 指令分为4 类:运动指令、不停前瞻指令、转弯区执行指令、停止前瞻指令。

8.16.2.10.2 运动指令

控制机器人产生实际运动效果的指令,详情见RL 编程指令,其中所有“运动指令”、“Trigger指令”、“拖动回放指令”以及“Home”指令属于运动指令分类。

8.16.2.10.3 不停前瞻指令

指令在前瞻指针解析后立即执行,随后前瞻指针继续向下运行解析下一条指令,不会影响前后两条运动指令之间的转弯区。 不停前瞻指令:Print 指令,逻辑判断指令,变量赋值操作,用户自定义函数,碰撞检测动态 阈值指令,动态修改运动参数指令;

示例:

MoveL(p1);
IF (condition_1)
    Print("满足条件1");
    MoveL(p2);
ENDIF
MoveL(p3);

运行上面程序,在条件 1 满足的情况下,机器人会规划 p1 → p2 → p3 的连续轨迹运动,并在前瞻到 print 指令时打印字符串“满足条件1”。在条件 1 不满足的情况下,机器人会规划 p1 → p3 的连续轨迹运动。

8.16.2.10.4 转弯区执行指令

转弯区指令在上一条运动指令进入转弯区或者结束时执行。用于在运动的过程中向外部设备发送信号,说明机器人已经运动到哪条运动指令。

转弯区执行指令: WriteRegByNameSetDOSetGOSetAOPulseDOPulseRegInZoneSetVarValueSpeedRefreshMotionSupMotionSupPlus

示例:

MoveL(p19);
MoveL(p20);
WriteRegByName(reg_position, 20);
MoveL(p21);
WriteRegByName(reg_position, 21);
MoveL(p22);

运行上述运动指令,机器人将规划一条 p19 → p20 → p21 → p22 的连续运动轨迹,当机器人即将完成 p20 运动,在 p20 往 p21 转弯区上时,会立即将数 20 写到寄存器 reg_position;当机器人即将完成 p21 运动,在 p21 往 p22 转弯区上时,会立即将数 21 写到寄存器 reg_position。;当 机器人即将完成P21 运动,在P21 往P22 转弯区上时,会立即将数21 写到寄存器reg_position;外部设备只要读取这个寄存器,就可以知道机器人的运动过程。

8.16.2.10.4

转弯区指令的触发时机受机器人本体性能、转弯区大小、转弯区是否生成、实际运行速度等多方面影响,适用于只关注机器人正准备运动到哪些位置的场景,如果要求精确在轨迹某个位置触发信号,需要使用 trigger 系列指令。

如果没有转弯区或者无法生成转弯区,会在对应运动指令完成后触发相关指令。

8.16.2.10.5 停前瞻指令

除了上述三种指令,其他指令都是停前瞻指令,控制器会在机器人完成该指令前的所有运动之后,再执行指令。

示例:

MoveL(p1);
MoveL(p2);
Wait(10);
MoveL(p3);

Wait 指令属于停前瞻指令,机器人会运动到 p2 并且减速停止完成后,再开始等待十秒,并在等待完成后,再启动前往 p3。

当运动指令使用转弯区为 Fine 时,RL 程序的前瞻指针会在该行运动指令停止,等待运动结束后,再继续前瞻。

示例:

MoveAbsJ(j1, v1000, z50, tool0);
MoveL(p1, v1000, z50, tool0);
MoveL(p2, v1000, Fine, tool0); // 后续所有指令都会等 MoveL p2 结束才运行
MoveL(p3, v1000, z50, tool0);

8.16.2.11 中断功能

8.16.2.11

中断功能可由 DI 信号或寄存器触发,打断当前程序运行而去执行中断函数。

中断功能特性和注意事项:

  • 中断功能可中断运动指令,可中断持续性指令(网络/通信读指令、接收连接指令、SocketCreate、opendev、SocketClose、CloseDev、SendString、SendByte),可中断普通指令(类型转换、字符串操作等立即完成的指令)。

  • 运动指令执行时发生中断,会停止当前运动,转而执行中断函数,中断函数内部指令完成后重回路径到中断前的路径上继续执行。中断函数完成后的重回路径不属于中断。重回路径走轴空间运动。中断函数建议配合记录路径指令以保证机器人可以正确回到安全位置。

  • 除了 waituntil 外,其他持续性指令并不是发生真的中断,而是将持续性指令转入后台运行,该指令的错误处理和唤醒任务执行都将延后到中断结束。中断时执行 wait 指令,中断结束后已超过 wait 等待时间就继续运行。

  • 中断中寄存器读指令、外部信号控制指令效果与连续运动相同,响应寄存器写、外部信号监控指令。暂停、急停、碰撞可停止中断运行,中断中可单步运行。

  • 中断相关指令只能在运动任务使用,仅运动任务可执行中断。

  • 进入力控模式不可使用中断,注册中断后不能 FcInit 进入力控模式。

  • 选择单次触发的中断,在被 Disable 后收到中断信号,仍视为单次触发结束。

  • 在 IRegister 中断之后,中断可以触发,当任务结束重置时注册的中断会被取消,直到再次运行到 IRegister。

  • 中断执行中,此时触发的中断不会被响应。

  • 任务正在执行中断、由于点击开始运行/中断退出切换正常运行导致调度信息重置时,不响应中断、不停止任务。

  • 中断函数中不能调用除 GetTrapData 外的中断指令、料盘码垛的设置指令;激光焊接功能开启不能中断;传送带启动指令执行后,不能中断;末端运动指令执行不能被中断控制,使用时需要注意。

  • 拖动回放时发生中断,中断后不会继续执行拖动回放。

8.16.2.12 指针热更新功能

在 xCore 3.1 及之前版本中,程序调试时若对 RL 程序进行任何修改(即使只增加一个空格),也会导致程序指针(包括前瞻指针、运动指针)丢失,必须从头重新运行程序,给调试带来很大不便。

自 3.2 版本起,新增了指针热更新功能。该功能允许在程序暂停调试期间编辑 RL 程序,并保持当前的程序指针与调用关系,编辑后可继续执行,无需重新开始运行。具体包括以下两点:

  1. 机器人暂停时,可修改 RL 程序,并保持程序指针(前瞻指针、运动指针)不丢失。

  2. 编辑完成后,机器人能基于更新后的程序继续执行。

该功能显著提升了调试的易用性与效率,避免因小幅修改而重新运行整个程序。

使用示例:

假设原有 RL 程序如下:

GLOBAL PROC main()
    int a = 30;
    print("1 - 变量a的值: ", a);
    wait(10);
    print("hello world");
    print("2 - 变量a的值: ", a);
ENDPROC
  1. 点击运行,程序执行至第5行时点击暂停。

  2. 将程序修改为:

GLOBAL PROC main()
    int a = 30;
    print("1 - 变量a的值: ", a);
    wait(10);
    print("hello rokae");
    a = 40;
    print("2 - 变量a的值: ", a);
ENDPROC

3.点击运行,程序将继续执行,输出结果如下:

8.16.2.12 3

4.可见,修改后程序原有指针位置继续执行,运行结果正确,无需从头运行。

  • 程序合法性:暂停后修改程序,必须保证语法正确。若程序不合法,点击运行时示教器将报错,请根据提示修正后重新运行。

  • 代码生效范围:只有被前瞻指针扫描过的代码行在本次运行中生效。若在暂停后修改指针之前的代码(如示例中第 5 行之前的行),则该修改将在下次运行时生效。

  • 指针所在行修改:若修改指针当前所在行的代码,示教器会提示“执行此操作将导致指针丢失,是否要继续?”。选择继续,指针丢失,无法使用热更新功能;选择取消,则撤销本次修改。8.16.2.12 4

  • 特殊情况:部分情况下可能无法实现指针热更新,示教器将提示错误。此时需手动点击 pptomain 重新运行。8.16.2.12 5

8.16.3 调试示例

步骤 图示 说明

1.RL 程序编辑完成后,使用pptomain,将指针移动至main 函数,同时检查程序有无语法错误。

8.16.3 1

为了方便单步调试,可在程序中插入pause指令。

2.切换模式至“手动模式”,机器人上电,调节程序速度到较小值,使机器人低速运行。

8.16.3 2

点击“PPToMain”按钮,将程序指针复位到main函数开始处。

3.点击右侧操作面板中的运行按钮。

8.16.3 3

4.程序运行到pause 将暂停运行,直至点击“下一步”按钮或“运行”按钮。

8.16.3 4

“下一步”按钮将使程序单步执行

5.点击下一步按钮,开始单步调试。

8.16.3 5

程序运行到Set DO 行,打开状态监控,查看该DO 是否为“关”状态

6.继续单步执行,查看机器人是否到达期望的点位。

8.16.3 6

7.也可移动光标至某一行,点击“下一步”按钮,查看指令是否运行成功。

8.16.3 7

程序运行到Set DO 行,打开状态监控,查看该DO 是否为“开”状态。

8.确认程序没有问题后,再次pptomain,保持“程序速度”较小,完整运行一次之后,可增加程序速度,切换到 “自动模式”执行程序。

8.16.3 8

程序运行到Set DO 行,打开状态监控,查看该DO 是否为“开”状态。