4. RAPID程序中的数据变量与联动接口
在RobotStudio数字孪生场景中,虚拟控制器里的RAPID程序并不是孤立运行的。它既要驱动虚拟机器人运动,又要与外部系统交换信号和数据。理解RAPID的数据类型、变量作用域以及PERS与VAR的区别,是编写可被外部触发、可稳定联动的程序模块的基础。本节围绕“数据怎么定义、变量活多久、I/O怎么读写、模块怎么被外部触发”四个问题展开。
一、常用数据类型:先分清“装什么”
RAPID是强类型语言,变量声明时必须指定类型。数字孪生联动中最常用的类型如下:
- num:数值,如速度、位置偏移量、计数器。示例:
num nCount := 0; - bool:布尔量,只有TRUE/FALSE,常用于使能、到位、报警标志。
- string:字符串,用于显示信息或与外部系统交换文本。
- robtarget:机器人目标点,包含位置、姿态、轴配置和外轴数据,是运动指令的核心参数。
- jointtarget:各关节角度目标,常用于关节运动或回原点。
- speeddata、zonedata、tooldata、wobjdata:分别描述速度、转弯区、工具和工件坐标系,通常以常量或持久变量形式存在。
- signaldo、signaldi、signalgo:数字量输出、数字量输入、组输出信号,是RAPID与I/O系统之间的“接口变量”。
需要特别说明的是,signaldo这类信号变量本身不存储值,它是指向控制器I/O配置中某个信号的引用。对signaldo赋值,实际是改变对应物理或虚拟输出点的状态;读取signaldi,实际是读取输入点的当前电平。这一点在数字孪生中尤其重要:虚拟I/O板卡上的信号状态会直接反映到RAPID变量上。
二、变量作用域:变量“活”在哪里
RAPID中变量的作用域决定了它能否被其他模块访问、生命周期有多长。常见的作用域关键字有VAR、PERS、CONST和LOCAL。
- VAR:局部变量,只在声明它的模块内可见,程序停止或模块重新加载后值不保留(通常复位为初始值)。
- PERS:持久变量,全局可见(除非加LOCAL),值在程序停止、控制器重启后仍然保留,适合保存计数、状态、标定结果等。
- CONST:常量,声明时必须赋初值,运行中不可修改,适合工具坐标、固定速度等。
- LOCAL:访问修饰符,可加在VAR/PERS/CONST前,限制其只在当前模块内可见。
三、PERS与VAR的区别:一张图看清
PERS与VAR最核心的差异在于生命周期和可见范围。VAR在模块执行结束后通常被复位,而PERS会一直保留到下一次被显式修改。下面这张图对比了两者在程序运行、停止、重启三个阶段的取值变化。
从图中可以直观看到:PERS变量在程序停止和控制器重启后仍保持原值,而VAR变量在程序停止后即复位。因此在编写需要“记住上次位置”“累计产量”“保存标定偏移”的联动程序时,必须使用PERS。反之,如果只是循环内的临时计算,用VAR更安全,避免旧值干扰下一次运行。
四、通过RAPID读写I/O与外部数据
RAPID读写I/O的基本指令是SetDO、ResetDO、WaitDI、SetGO等。它们操作的对象是I/O配置中已定义的信号名。在数字孪生中,这些信号通常映射到虚拟PLC或仿真信号板。
MODULE MainModule
PERS num nPartCount := 0;
VAR bool bReady;
PROC main()
bReady := FALSE;
SetDO doStartLamp, 1; ! 点亮启动指示灯
WaitDI diPartReady, 1; ! 等待外部“工件就位”信号
bReady := TRUE;
nPartCount := nPartCount + 1; ! 持久计数
SetGO goPartCount, nPartCount; ! 将计数写入组输出
SetDO doCycleDone, 1; ! 通知外部本周期完成
WaitTime 0.5;
ResetDO doCycleDone;
ENDPROC
ENDMODULE
这段示例中,diPartReady是外部输入信号,doStartLamp、doCycleDone是输出信号,goPartCount是组输出。程序通过WaitDI等待外部条件,通过SetDO/SetGO把内部状态反馈给外部。数字孪生运行时,可以在RobotStudio的I/O仿真面板中手动置位diPartReady,观察机器人是否继续执行,从而验证联动逻辑。
WaitDI默认会一直等待,若外部信号始终不来,程序会停在该行。实际调试中建议使用带超时的WaitDI diPartReady, 1 \Time:=5,超时后走异常处理,避免仿真卡死。五、编写可被外部触发的程序模块
“可被外部触发”意味着程序不能只靠main顺序执行,而应提供可由外部信号或事件调用的入口。常见做法有三种:
- 用中断触发:通过
CONNECT把某个中断号与陷阱例行程序绑定,当对应输入信号变化时自动执行。例如外部急停信号触发trpEStop。 - 用信号等待触发:在循环中
WaitDI diTrigger, 1,收到信号后执行对应动作。适合节拍较慢、逻辑简单的场景。 - 用模块化例行程序暴露入口:把动作封装成
PROC,由外部通过Start或RAPID的CallByVar调用。数字孪生中常配合Smart组件或信号触发。
下面是一个中断触发的示例,外部信号diTrigger上升沿时执行trgWork:
VAR intnum intWork;
PROC Init()
CONNECT intWork WITH trgWork;
ISignalDI diTrigger, 1, intWork; ! 上升沿触发
ENDPROC
TRAP trgWork()
SetDO doBusy, 1;
! 执行联动动作
MoveJ pPick, v500, fine, tool0;
SetDO doBusy, 0;
ENDTRAP
在RobotStudio中验证时,可以打开“仿真”菜单下的“I/O仿真”,将diTrigger置为1,观察机器人是否立即执行trgWork中的动作,同时doBusy是否按预期置位和复位。若没有动作,优先检查ISignalDI的中断号是否与CONNECT一致、信号是否已在I/O配置中正确映射。
六、联动接口设计要点
综合来看,一个稳定的数字孪生联动接口应满足:数据类型与外部信号匹配(bool对数字量、num对组输出)、需要跨周期保留的状态用PERS、临时量用VAR、外部触发入口明确且可测试。建议在模块头部集中声明所有PERS和信号变量,并加注释说明用途,便于在虚拟调试时快速定位。例如:
PERS num nPartCount := 0; ! 累计产量,跨周期保留
PERS bool bSystemReady := FALSE; ! 系统就绪标志
VAR bool bTempFlag; ! 临时标志,仅本模块使用
当这些变量与I/O信号在虚拟控制器中正确映射后,RobotStudio的仿真信号面板、Smart组件和外部PLC仿真就能与RAPID程序形成闭环:外部置位输入→RAPID读取并执行→RAPID写输出→外部观察到状态变化。这正是数字孪生数据联动的核心链路。