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 程序:
整个程序分为声明区和实现区两大部分:
-
声明区: 在每个 Mod 文件中第一个函数之前的区域。例如 main.mod 中
GLOBAL PROC main之前的部分。声明区中可以定义变量或常量。该区域定义的变量将在每次执行程序时被重置为初始值。 -
实现区: 函数体部分,包含具体的程序逻辑。
VAR 或 CONST 关键字表示存储类型,VAR 表示可变量,CONST 声明为常量;若不显示声明变量的存储类型,默认变量为可变量。
声明区变量与变量列表中的变量的区别:
-
声明区变量:某个任务运行结束重置时,会重置任务内声明区定义的变量。
-
变量列表的变量:属于整个工程,是公用变量。变量列表的非保持变量只在执行 pptomain 时重置,保持变量只能通过变量列表编辑功能或者 RL 程序修改。
8.16.2 RL 程序调试
8.16.2.3 移动程序指针
如果需要从程序中间的某一行开始执行之后的程序,那么可以使用该功能将程序指针移动到光标所在行,之后程序即可从新的位置开始执行。
| 步骤 | 图示 | 说明 |
|---|---|---|
1.点击右侧操作面板中的“停止”按钮,使 RL 程序暂停。 |
||
2.点击期望指针移动到的行,使其为选中状态。 |
选中状态下背景颜色为浅蓝色。 |
|
3.击程序调试快速定位按钮旁的下拉箭头,从列表中选择“光标”。 |
选择后该按钮显示“光标”字样。 |
|
4.点击程序调试快速定位按钮,即可移动指针到选中行。 |
使用限制:
|
8.16.2.4 单步调试
单步运行状态又称为单步模式,与之对应的是连续模式,绝大多数情况下,机器人可以在单步模式和连续模式之间进行切换。
单步运行主要用来做程序调试,机器人每次单步运行将尽可能执行完一行指令,并在指令完成后暂停程序,便于确认每一个行的示教点是否符合要求。当调试对象是多任务工程时,单步调试只会执行当前HMI 调试界面显示的任务,其余任务将不会被调用。 如果单步调试执行的是读取数据指令(Read Double,ReadString 等)、时间相关指令(Wait、 WaitUntil 等)、逻辑指令(IF、GOTO 等),由于指令特性限制,将需要两到三次点击下一 步,才能完成该行指令。
| 步骤 | 图示 | 说明 |
|---|---|---|
1.移动指针到某行。 |
||
2.点击右侧操作面板中的“下一步”按钮。 |
||
3.再次点击下一步按钮,可看到机器人正在执行该行。执行完成后再次点击下一步按钮,开始执行下一步. |
若遇到函数,将跳转到该函数内部,可通过程序指针(绿色箭头)定位正在执行的行。 |
使用限制:
|
8.16.2.5 步退调试
步退调试又称为上一步调试,主要功能是在调试过程中发现路径错误时,可以直接回退到最后一个正确的点位,而不用通过多次 JOG 才能让机器人退出错误轨迹,提高调试效率。
-
非运动指令在步退过程中一般不生效,会被直接跳过。
-
力控指令、运动设置指令、逻辑指令会停止步退。
8.16.2.6 步退使用方式
xCore 支持暂停后直接切换步退和ppto光标后步退 ppto 光标后第一次步退运动时,由于没有任何轨迹信息,笛卡尔点将强转为MoveJ 运动。
| 步骤 | 图示 | 说明 |
|---|---|---|
1.运行过程中暂停。 |
前瞻到第十行,但是机器人在从 J1 前往 P1 的轨迹上。 |
|
2.点击右侧操作面板中的“上一步”按钮。 |
|
前瞻指针会跳转到运动指针上面,表示进入步退模式。 |
3.再次点击“上一步”按钮,机器人开始步退运动。 |
机器人会按暂停时的运动方式(本例中是 MoveL)回退到前瞻指针指向的 J1。 |
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 循环模式
点击“循环模式”按钮可切换至循环模式 或单次模式
。
循环模式: 所有任务在执行到指定函数(默认为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.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 转弯区执行指令
转弯区指令在上一条运动指令进入转弯区或者结束时执行。用于在运动的过程中向外部设备发送信号,说明机器人已经运动到哪条运动指令。
转弯区执行指令: WriteRegByName、SetDO、SetGO、SetAO、PulseDO、PulseReg、InZone、SetVarValue、SpeedRefresh、MotionSup、MotionSupPlus。
示例:
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;外部设备只要读取这个寄存器,就可以知道机器人的运动过程。
|
转弯区指令的触发时机受机器人本体性能、转弯区大小、转弯区是否生成、实际运行速度等多方面影响,适用于只关注机器人正准备运动到哪些位置的场景,如果要求精确在轨迹某个位置触发信号,需要使用 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 中断功能
中断功能可由 DI 信号或寄存器触发,打断当前程序运行而去执行中断函数。
中断功能特性和注意事项:
|
8.16.2.12 指针热更新功能
在 xCore 3.1 及之前版本中,程序调试时若对 RL 程序进行任何修改(即使只增加一个空格),也会导致程序指针(包括前瞻指针、运动指针)丢失,必须从头重新运行程序,给调试带来很大不便。
自 3.2 版本起,新增了指针热更新功能。该功能允许在程序暂停调试期间编辑 RL 程序,并保持当前的程序指针与调用关系,编辑后可继续执行,无需重新开始运行。具体包括以下两点:
-
机器人暂停时,可修改 RL 程序,并保持程序指针(前瞻指针、运动指针)不丢失。
-
编辑完成后,机器人能基于更新后的程序继续执行。
该功能显著提升了调试的易用性与效率,避免因小幅修改而重新运行整个程序。
使用示例:
假设原有 RL 程序如下:
GLOBAL PROC main()
int a = 30;
print("1 - 变量a的值: ", a);
wait(10);
print("hello world");
print("2 - 变量a的值: ", a);
ENDPROC
-
点击运行,程序执行至第5行时点击暂停。
-
将程序修改为:
GLOBAL PROC main()
int a = 30;
print("1 - 变量a的值: ", a);
wait(10);
print("hello rokae");
a = 40;
print("2 - 变量a的值: ", a);
ENDPROC
3.点击运行,程序将继续执行,输出结果如下:
4.可见,修改后程序原有指针位置继续执行,运行结果正确,无需从头运行。
|
8.16.3 调试示例
| 步骤 | 图示 | 说明 |
|---|---|---|
1.RL 程序编辑完成后,使用pptomain,将指针移动至main 函数,同时检查程序有无语法错误。 |
为了方便单步调试,可在程序中插入pause指令。 |
|
2.切换模式至“手动模式”,机器人上电,调节程序速度到较小值,使机器人低速运行。 |
点击“PPToMain”按钮,将程序指针复位到main函数开始处。 |
|
3.点击右侧操作面板中的运行按钮。 |
||
4.程序运行到pause 将暂停运行,直至点击“下一步”按钮或“运行”按钮。 |
“下一步”按钮将使程序单步执行 |
|
5.点击下一步按钮,开始单步调试。 |
程序运行到Set DO 行,打开状态监控,查看该DO 是否为“关”状态 |
|
6.继续单步执行,查看机器人是否到达期望的点位。 |
||
7.也可移动光标至某一行,点击“下一步”按钮,查看指令是否运行成功。 |
程序运行到Set DO 行,打开状态监控,查看该DO 是否为“开”状态。 |
|
8.确认程序没有问题后,再次pptomain,保持“程序速度”较小,完整运行一次之后,可增加程序速度,切换到 “自动模式”执行程序。 |
程序运行到Set DO 行,打开状态监控,查看该DO 是否为“开”状态。 |