3. URScript基础语法与程序结构
URScript 是 Universal Robots 控制器内部执行的脚本语言,PolyScope 图形界面上的每一个程序节点,最终都会被翻译成 URScript 指令交给控制器解释执行。理解 URScript 的语法与程序结构,是从“会拖拽节点”走向“能写出可复用、可维护程序”的关键一步。本节围绕变量与数据类型、运算符、流程控制、函数定义与调用、注释规范五个方面展开,并给出可直接在 PolyScope 的“程序 → 高级 → 脚本”中运行的示例。
变量与数据类型
URScript 是弱类型语言,变量无需声明类型,赋值即创建。变量名由字母、数字、下划线组成,不能以数字开头,区分大小写。常用数据类型包括:
- bool:
True/False,用于条件判断。 - int / float:整数与浮点数,如
n = 5、v = 0.25。URScript 内部数值统一按双精度处理。 - string:字符串,用双引号,如
"pick_pose"。 - list:列表,用方括号,如
[0, 0, 0, 0, 0, 0],常用于表示位姿。 - pose:位姿,由
p[x, y, z, rx, ry, rz]构造,表示 TCP 在基坐标系下的位置与旋转矢量(旋转矢量方向为旋转轴,模长为旋转角,单位 rad)。
位姿的参照约定必须明确:p[...] 默认相对机器人基坐标系;若写成 pose_trans(基准位姿, 相对位姿),则第二个参数是相对第一个位姿坐标系的偏移。全文与图示均遵循这一约定。示例:
home = p[0.30, 0.00, 0.40, 0, 3.14159, 0]
offset = p[0.00, 0.00, -0.10, 0, 0, 0]
above = pose_trans(home, offset) # 在 home 坐标系下沿 z 下移 0.1 m
n = 3
speed = 0.25
运算符
URScript 运算符分为算术、比较、逻辑与位运算四类。算术运算符有 + - * / 以及取模 %;比较运算符有 == != < > <= >=;逻辑运算符为 and or not(不是 &&、||、!);位运算有 & | ~ ^。需要注意两点:一是整数除法会截断,5/2 得 2,要得到 2.5 需写成 5/2.0;二是位姿不能直接用 + 相加,必须用 pose_trans() 或 pose_add() 完成坐标变换。
流程控制语句
URScript 支持 if / elif / else、while、for、break、continue 以及 switch。缩进不是语法要求,但为可读性建议统一缩进。典型结构如下:
i = 0
while i < 3:
if digital_in[0] == True:
movej(home, a=1.2, v=speed)
break
else:
i = i + 1
end
end
for j in range(0, 4):
movel(pose_trans(home, p[0, 0.05*j, 0, 0, 0, 0]), a=0.8, v=0.15)
end
其中 range(0, 4) 产生 0、1、2、3 四个值,循环体执行 4 次。判断条件中 digital_in[0] 读取控制柜数字输入 0 的状态,返回 bool。
函数定义与调用
用 def 定义函数,end 结束,可带参数并返回值。函数是封装重复逻辑、提高程序可维护性的主要手段。例如把“移动到目标上方并抓取”封装为函数:
def pick_at(target, lift=0.10):
above = pose_trans(target, p[0, 0, lift, 0, 0, 0])
movel(above, a=0.8, v=0.20)
movel(target, a=0.5, v=0.10)
set_digital_out(0, True)
sleep(0.3)
movel(above, a=0.8, v=0.20)
return True
end
ok = pick_at(p[0.40, -0.10, 0.15, 0, 3.14159, 0])
调用时按位置或关键字传参均可。函数内可使用全局变量,但更推荐通过参数传入,避免隐式依赖。URScript 还提供大量内置函数,如 movej、movel、set_digital_out、get_actual_tcp_pose、sleep、textmsg,可直接调用。
程序注释规范
注释以 # 开头,可单独成行或写在语句末尾。规范建议:文件头写明程序名、功能、作者、日期与版本;每个函数上方用一行说明其作用、参数含义与返回值;关键运动或 IO 操作旁注明目的与安全条件。注释应说明“为什么”,而不是复述“做了什么”。
textmsg("i=", i) 把变量值输出到日志,配合示教器“日志”页面观察循环次数与分支走向,这是验证流程控制是否按预期执行的最直接手段。把上述要素组合起来,一个结构清晰的 URScript 程序通常按“常量与位姿定义 → 工具函数 → 主流程”组织。主流程中先用变量保存关键位姿与参数,再通过流程控制决定分支,最后调用函数完成动作。这样写出的程序在更换工件或调整节拍时,只需修改少量参数,而不必逐行改动运动指令,这也是 URScript 相比纯图形化编程在工程可维护性上的直接收益。