8.7.1 变量命名规则
RL 语言中的变量名称可由字母、下划线、数字组成,必须以字母或者下划线“_”开头,但变量名不能与系统关键字重名,RL 系统关键字详见预定义关键字。
除此之外,还存在以下注意事项:
-
在同一模块中,不允许出现重名的 GLOBAL、LOCAL 级别变量。
-
在不同的模块中,不允许出现重名的 GLOBAL 变量。
-
在不同的模块中,允许出现重名的 LOCAL 级别变量。
-
在同一模块中,不允许任何变量(GLOBAL、LOCAL 级别,不包括 ROUTINE 级别)与本模块内的函数发生命名冲突。
-
在不同的模块中,不允许任何 GLOBAL 级别的函数与变量发生命名冲突。
-
自 V4.0 起,支持系统变量、工程变量与局部变量;系统变量、工程变量、局部变量之间不允许重名。不同局部作用域中的变量可以重名,详见下文说明。
|
当变量名只包含两个字符时,需要注意第二个字符不要为“h”、“b”,否则该变量可能会被转换为十六进制或者二进制,更多信息请参考进制转换。 |
8.7.2 变量作用域
自 V4.0 起,作用域分为以下几种:
| 作用域 | 说明 |
|---|---|
系统变量 |
属于控制器全局变量,所有工程之间共享此类型变量。仅变量列表、点位列表、IO 信号列表支持添加系统变量。 |
工程变量 |
该工程内所有任务均可访问此类型变量。 |
局部变量 |
作用范围限定在当前任务内。按声明方式不同,可分为模块级局部变量与任务级局部变量(见下方示例)。仅变量列表、点位列表支持添加局部变量。 |
函数级别变量(ROUTINE) |
仅在当前函数内可见,只能在函数体内部声明,且声明该作用域变量时不允许指定作用域类型(GLOBAL 或者 LOCAL)。 |
以任务 task0 的 main.mod 为例:
若在声明区使用 LOCAL 声明变量,则该变量为模块级局部变量,仅能被任务 task0、main.mod 中的函数使用:
LOCAL int l_int0 = 10;
GLOBAL PROC main()
ENDPROC
若使用 GLOBAL 声明变量,则该变量为任务级局部变量,可被 task0 下的所有 .mod 访问:
GLOBAL int int1 = 10;
GLOBAL PROC main()
ENDPROC
不同 .mod 之间允许存在同名的模块级局部变量,彼此相互独立。例如,任务 task0 下有 test1.mod 与 test2.mod:在 test1.mod 中添加局部变量 l_int0(值为 1),在 test2.mod 中同样添加局部变量 l_int0(值为 10)。此时二者互不影响——test1.mod 访问的是值为 1 的 l_int0,test2.mod 访问的是值为 10 的 l_int0。
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:自 V4.0 起,不同作用域也不允许使用相同的变量名
VAR int counter = 1; // 局部变量
GLOBAL int counter = 555; // 全局变量(编译器将报错)
|
自 V4.0 起,不同作用域的变量也不允许重名。请根据编译器报错提示修改变量名,避免命名冲突。 |
使用限制:
-
不支持声明 PERS 存储类型的 ROUTINE 变量。
-
自 V4.0 起,当不同级别的变量或函数存在重名时,编译器在语法检查阶段将直接报错,不再按作用域优先级遮蔽;系统变量、工程变量、局部变量之间也不允许重名。请根据报错提示修改命名。
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 变量。系统变量默认设置为 pers 变量,且不可更改为非 pers 变量;工程变量、局部变量均可设置为 pers 变量。
保持变量的修改:
xCore 控制系统的保持(pers)变量采用初值 + 保持值的形式存储。
-
初值: 用户在变量列表输入的数据。
-
保持值: 保持变量在程序运行过程中被程序修改后,存储在非易失存储介质上的数据。
基础类型(int/bool/double)的保持值可以通过状态监控查看,结构体数据(比如点位、工具、工件)则可以通过 print 指令打印。
RL 程序运行过程中,可以通过运算符“=”对保持变量进行修改,修改后的数据将作为保持值存储在控制器内部。下一次运行程序时,会优先读取对应变量的保持值,当保持值不存在的时候,会读取变量的初始值。
如果通过点位更新按钮或者变量列表的编辑功能修改保持变量,则会同时修改变量的初值和保持值。
8.7.8 变量列表操作
变量列表提供了对机器人系统内几乎所有变量的新建、查看、修改及删除操作。支持创建系统变量、工程变量、局部变量。
8.7.8.1 变量查看
对于一些有专门定义步骤的变量类型,例如 speed/zone(使用辅助编程界面进行定义和修改),虽然也可在变量查看界面进行查看和修改,但是出于方便性和减少错误的考虑,仍然推荐使用专用界面进行修改,在变量管理界面只进行查看操作。变量列表支持按作用域筛选变量,并显示各变量所属的作用域,如下图所示。
|
工程变量、局部变量的显示范围与当前所加载的机器人程序相关,加载其他程序后,这两类变量的列表内容会发生变化。系统变量属于控制器全局变量,可在变量列表中新建、查看、修改及删除,且不受当前加载程序切换的影响。 |
8.7.8.2 变量编辑
如果需要新增变量或者对某个存在的变量进行修改,可通过点击“新建”或者“修改”按钮进入变量编辑页面进行操作。
| 属性 | 说明 |
|---|---|
类型 |
在新建变量时用于选择变量的类型,所有支持的类型都列在左侧边栏内。 |
名称 |
输入变量的名称。 |
作用域 |
选择变量的作用域,可选系统变量、工程变量、局部变量。选择局部变量时,还需指定所属任务与所属 mod。新建变量时,系统变量默认添加前缀 |
维数 |
用于创建或者修改数组,最大支持 3 维数组。 |
持续 |
定义为 pers 变量或者非 pers 变量。 |
值 |
显示变量值。 |
描述 |
变量描述信息。 |