8.7.1 变量命名规则
RL 语言中的变量名称可由字母、下划线、数字组成,必须以字母或者下划线“_”开头,但变量名不能与系统关键字重名,RL 系统关键字详见预定义关键字。
除此之外,还存在以下注意事项:
-
在同一模块中,不允许出现重名的 GLOBAL、LOCAL 级别变量。
-
在不同的模块中,不允许出现重名的 GLOBAL 变量。
-
在不同的模块中,允许出现重名的 LOCAL 级别变量。
-
在同一模块中,不允许任何变量(GLOBAL、LOCAL 级别,不包括 ROUTINE 级别)与本模块内的函数发生命名冲突。
-
在不同的模块中,不允许任何 GLOBAL 级别的函数与变量发生命名冲突。
|
当变量名只包含两个字符时,需要注意第二个字符不要为“h”、“b”,否则该变量可能会被转换为十六进制或者二进制,更多信息请参考进制转换。 |
8.7.2 变量作用域
RL 语言系统定义了三种作用域:
| 作用域 | 说明 |
|---|---|
全局(GLOBAL) |
对当前任务的任意程序模块可见,可在模块声明区内声明;如果需要跨任务访问变量,需要用 GLOBAL PERS 关键字进行声明。注意:变量列表、点位列表中的变量均为全局,所有任务可读可写。 |
局部(LOCAL) |
仅对当前程序模块可见,可在模块声明区内声明。 |
函数(ROUTINE) |
仅在当前函数内可见,只能在函数体内部声明,且声明该作用域变量时不允许指定作用域类型(GLOBAL 或者 LOCAL)。 |
|
作用域仅适用于变量,不适用于自定义函数。 |
8.7.3 存储类型
每个变量根据其是否可以在程序执行过程中被修改,分为三种:可变量(VAR)、持续性变量(PERS)、常量(CONST)。
| 类型 | 说明 |
|---|---|
VAR (Variable) |
可变量,可以在程序运行过程中进行重新赋值的变量。 |
CONST (Const Variable) |
常量变量,不能在程序运行过程中重新赋值的变量,此类型变量的值必须在其初始化时指定。 |
PERS (Persistent Variable) |
持续性变量,在程序执行过程中如果此类型变量的值发生了变化,将会自动将该变量的初始值修改为当前值,由此达到“持续”存储的效果。注意:即使某个 PERS 类型变量的值在程序运行过程中被更改,其在程序编辑器声明区内显示的初始值也不会立即刷新,只有当程序重新加载或程序停止时在程序编辑器声明区显示的初始值才会更新到最新值;不论程序运行与否,在“变量管理”界面只能查看 PERS 变量的初始值,可以通过状态监控或者 print 指令查看当前值。 |
8.7.4 预定义关键字
以下为 RL 语言预定义的保留关键字(不区分大小写):
Module |
EndModule |
Proc |
EndProc |
Func |
EndFunc |
SetDO |
DOALL |
SetGO |
SetAO |
WaitDI |
Wait |
WaitUntil |
WaitWObj |
WBID |
Q |
P |
J |
V |
W |
T |
S |
L |
CA |
DURA |
IGNORELEFT |
EJ |
IJ |
FCBV |
FCCV |
FCOL |
FCXYZ |
FCCART |
PE |
PER |
TCP |
ORI |
EXJ |
CFG |
PDIS |
JDIS |
MoveAbsJ |
MoveJ |
MoveL |
MoveC |
MoveT |
LOCAL |
TASK |
GLOBAL |
VAR |
CONST |
PERS |
INV |
DOT |
CROSS |
sin |
cos |
tan |
asin |
cot |
acos |
atan |
atan2 |
sinh |
cosh |
tanh |
ln |
log10 |
pow |
exp |
sqrt |
ceil |
floor |
abs |
rand |
GetCurPos |
PrintToFile |
ClkRead |
TestAndSet |
|
IF |
Else |
Endif |
WHILE |
ENDWHILE |
for |
from |
to |
endfor |
Break |
Continue |
Del |
Int |
Double |
Bool |
String |
BYTE |
Robtarget |
Speed |
Zone |
Tool |
Wobj |
Jointarget |
TriggData |
Load |
FCBoxVol |
FCSphereVol |
FCCylinderVol |
FCXyzNum |
FCCartNum |
Pose |
CLOCK |
INTNUM |
SYNCIDENT |
TASKS |
Call |
Return |
EXIT |
Pause |
StopMove |
StartMove |
StorePath |
RestoPath |
True |
False |
Interrupt |
When |
Offs |
CalcJointT |
CalcRobT |
CRobT |
RelTool |
SocketCreate |
SocketClose |
SocketSendByte |
SocketSendInt |
SocketSendString |
SocketReadString |
SocketReadBit |
SocketReadInt |
SocketReadDouble |
AccSet |
MotionSup |
TriggIO |
TriggJ |
TriggL |
TriggC |
On |
Off |
clock |
intnum |
userframe |
pinf |
ninf |
FCFRAME_WORLD |
FCFRAME_TOOL |
FCFRAME_WOBJ |
FCFRAME_PATH |
FCPLANE_XY |
FCPLANE_XZ |
FCPLANE_YZ |
FC_LINE_X |
FC_LINE_Y |
FC_LINE_Z |
FC_ROT_X |
FC_ROT_Y |
FC_ROT_Z |
Offs |
CalcJoint |
CalcRobT |
CRobT |
RelTool |
Start |
Time |
ClkReset |
ClkStart |
ClkStop |
CONNECT |
WITH |
IDisable |
IEnable |
ISignalDI |
Single |
SingleSafe |
WaitWobj |
DropWobj |
WobjIdentifier |
WobjAngle |
ActUnit |
DeactUnit |
INTNO |
Exp |
DoubleToStr |
WaitSyncTask |
FCAct |
FCDeact |
FCLoadID |
FCCalib |
FCSupvForce |
FCSupvTorque |
FCSupvPosBox |
FCSupvPosSphere |
FCSupvPosCylinder |
FCSupvOrient |
FCSupvOrient |
FCSupvReoriSpeed |
FCSupvTCPSpeed |
FCCondForce |
FCCondTorque |
FCCondOrient |
FCCondReoriSpeed |
FCCondPosBox |
FCCondPosCylinder |
FCCondPosSphere |
FCCondTCPSpeed |
FCCondWaitWhile |
FCRefLine |
FCRefRot |
FCRefSpiral |
FCRefCircle |
FCRefForce |
FCRefTorque |
FCRefStart |
FCRefStop |
FCSetSDPara |
8.7.5 进制转换
RL 语言支持在数字或者字母后面增加进制标识符的方式来直接输入十六进制、二进制字符或者科学计数法的数值。
例1: 在 0 ~ 9、a ~ f 以及 A~F 后面增加“h”后缀,RL 编译器会将相应的数字或者字母当做十六进制来处理,并在编译器内部转换成十进制处理:
-
8h,代表十六进制的 8,十进制的 8 -
bh,代表十六进制的 b,十进制中的 11 -
25h,代表十六进制的 25,十进制的 37
例2: 在 0 ~ 9、a ~ f 以及 A~F 后面增加“b”后缀,RL 编译器会将相应的数字或者字母当做二进制来处理:
-
1b,代表二进制的 1,十进制的 1 -
10b,代表二进制的 10,十进制的 2 -
1010b,代表二进制的 1010,十进制的 10
例3: 在数字后面增加“e±x”,表示该数字乘以 10 的 x 次方,例如:
-
5e+20,代表 5 × 10^20 -
26e-15,代表 26 × 10^(-15) -
112e-10,代表 112 × 10^(-10)
8.7.6 变量声明
在使用一个变量之前必须要先进行声明,变量声明语句格式为:
SCOPE STORAGE TYPE varname [= value]
其中:
-
SCOPE 为变量作用域,详见变量作用域。
-
STORAGE 为变量存储类型,详见存储类型。
-
TYPE 为变量类型,可以是基本类型,也可以是专用类型。详见变量类型。
-
varname 为变量名,详见变量命名规则。中括号 [ ] 内为可选内容,可以在声明变量的时候进行初始化,也可以不初始化。对于在声明时没有进行显式初始化的变量,系统会自动根据变量的类型赋予不同的初值。默认的初值可能会在某些情况下造成程序执行问题,因此建议对每一个手动新增的变量进行初始化。
示例:
以下是几个变量声明示例:
// 例1
VAR int counter = 8; // 声明整型变量 counter,并赋初值为 8
VAR double time = 2.5; // 声明浮点型变量 time,并赋初值为 2.5
VAR bool ifOpen = true; // 声明 bool 型变量 ifOpen,并赋初值为 true
// 例2:一般情况下,变量不允许重名
VAR int counter = 8;
VAR double counter = 2.5; // 此时编译器将报错,提示“添加变量失败”
// 例3:全局变量和局部变量可以使用相同的变量名
VAR int counter = 1; // 局部变量
GLOBAL int counter = 555; // 全局变量
|
虽然不同作用域的变量允许重名,但是为了避免引起混淆和误用,除非使用重名的变量在工艺上有特别的好处,否则不建议使用重名变量。 |
|
不可在 while 等循环语句块内部声明变量,否则在该部分代码重复执行时会造成重复声明,导致出现“添加变量失败”错误。请在循环体外部声明需要使用的变量。 |
使用限制:
-
不支持声明 PERS 存储类型的 ROUTINE 变量。
-
当不同级别的变量或函数存在重名情况时,编译器会根据作用域的优先级来决定选择使用哪个变量,具有最高优先级顺序的变量将优先被选中,而低优先级顺序的将被遮蔽隐藏,各作用域的优先顺序如下:
-
当出现变量重名时,作用域的优先顺序为:ROUTINE > LOCAL > GLOBAL
-
当出现函数重名时,作用域的优先顺序为:LOCAL > GLOBAL
-
8.7.7 用户变量保持
在 RL 的同一个工程中创建一个带保持的用户变量 a,该用户变量被标记成 pers 变量,那么该变量的值在 RL 停止、机器人重启、机器人关机、机器人断电时保持在非易失存储介质上,当机器人重新上电或者 RL 重新运行时,该变量 a 的值就会恢复成保持值。只有变量第一次创建或者变量重新编辑,变量才会被赋初始值。
|
只有在变量列表中添加的 pers 变量,才具有保持属性,变量声明区定义的 pers 类型变量,不具备保持属性。 |
用户变量目前支持保持的数据类型:Int、byte、double、bool、string、pose、speed、zone、fcboxvol、fcspherevol、fccylindervol、fcxynum、fccartnum、torqueinfo。
用户变量保持配置在 RL 工程界面,可以创建保持变量的入口如下红框所示:
点击变量、点位、工具、工件任一按钮,进入创建该类型的用户变量。所有可以创建保持属性的变量都有一个“持续”属性项,“是”表示该变量是保持变量,即标记为 pers 变量。
保持变量的修改:
xCore 控制系统的保持(pers)变量采用初值 + 保持值的形式存储。
-
初值: 用户在变量列表输入的数据。
-
保持值: 保持变量在程序运行过程中被程序修改后,存储在非易失存储介质上的数据。
基础类型(int/bool/double)的保持值可以通过状态监控查看,结构体数据(比如点位、工具、工件)则可以通过 print 指令打印。
RL 程序运行过程中,可以通过运算符“=”对保持变量进行修改,修改后的数据将作为保持值存储在控制器内部。下一次运行程序时,会优先读取对应变量的保持值,当保持值不存在的时候,会读取变量的初始值。
如果通过点位更新按钮或者变量列表的编辑功能修改保持变量,则会同时修改变量的初值和保持值。
8.7.8 变量列表操作
变量列表提供了对机器人系统内几乎所有变量的新建、查看、修改及删除操作,目前支持的变量类型包括:
| 序号 | 变量类型 | 描述 |
|---|---|---|
1 |
系统预定义变量 |
指用户不可修改的变量,用于存储某些系统参数,例如 tool0/wobj0 等 |
2 |
用户预定义变量 |
用户可以进行修改,并且可以在多个程序中进行使用的变量,例如用户标定的工具、工件等 |
3 |
程序变量 |
用户在程序中进行定义的变量,一般仅在当前程序及其子程序中使用,包含了绝大部分系统支持的变量类型 |