4. UR Modbus TCP服务端配置

在UR(Universal Robots)机器人作为Modbus TCP服务端(Slave/Server)的集成场景中,机器人通常扮演“被读写方”的角色:上位机PLC、SCADA或边缘网关作为客户端(Master/Client),通过功能码03/04读取机器人状态,通过06/16写入控制字或参数。要让这套通信稳定、可维护、可扩展,核心工作并不只是“打开Modbus服务”,而是把机器人的物理IO、内部状态与一块连续的寄存器地址空间建立清晰、可追溯的映射关系,并在此基础上设计访问权限与安全边界。

一、先规划地址空间,再谈绑定

UR的Modbus TCP服务端在PolyScope中通过“安装 → 现场总线 → Modbus”启用,默认端口502。服务端本身不预设业务语义,它只暴露一段可读写的寄存器区间。因此第一步是规划地址表,而不是急着把信号塞进去。建议按“功能分区 + 数据类型 + 读写属性”三个维度切分地址段,例如:

地址段用途数据类型访问方向
0–99机器人状态字(模式、运行、报警、程序号)16位整型/位域客户端只读
100–199关节/位姿反馈(缩放后整型)32位浮点拆双寄存器客户端只读
200–299控制命令(启动、暂停、复位、使能)位域/整型客户端读写
300–399工艺参数(速度、力矩、偏移量)整型/浮点客户端读写
400–499IO镜像(数字输入/输出、工具IO)位域双向

地址规划要遵守两条硬约束:其一,Modbus寄存器以16位为单位,32位浮点必须占用两个连续寄存器,且需明确字序(UR通常采用高字在前,即Big-Endian字序,但不同客户端可能相反,必须在文档中固定并验证);其二,位域信号尽量集中在一个或少数几个寄存器内,避免把同一功能拆散到相距很远的地址,否则客户端轮询效率低、排错困难。

二、信号映射:从UR内部变量到寄存器

UR的Modbus服务端并不直接“看到”脚本变量,它读写的是安装配置中定义的寄存器。真正把机器人内部信号与寄存器连接起来的,是URScript中的modbus_set_output_register()、modbus_set_output_signal()、modbus_get_input_register()等函数,以及安装里的“Modbus IO”绑定。典型做法是:在URScript主循环中,把机器人状态写入输出寄存器,同时从输入寄存器读取客户端下发的命令。

# 示例:将机器人状态写入保持寄存器(地址0~3)
modbus_set_output_register("status_word", 0)
modbus_set_output_register("program_id", 1)
modbus_set_output_register("alarm_code", 2)
modbus_set_output_register("cycle_count", 3)

# 示例:读取客户端写入的控制字(地址200)
cmd = modbus_get_input_register(200)
if (cmd & 0x0001) == 1:
  # bit0 = 启动请求
  start_program()
end

这里有一个容易混淆的点:UR的“输出寄存器”是机器人写给客户端的,“输入寄存器”是客户端写给机器人的。命名方向以机器人自身为参照,而不是以客户端为参照。配置时必须先统一这个参照系,否则会出现“客户端读不到状态”或“机器人收不到命令”的典型故障。

三、IO与寄存器绑定:让物理点可远程观测

UR的数字IO、工具IO、模拟IO都可以通过安装中的“Modbus IO”映射到寄存器位。常见做法是把数字输入DI0~DI7打包到寄存器400的低8位,数字输出DO0~DO7打包到寄存器401的低8位,工具IO单独占用402。这样客户端只需读一个寄存器就能获得8个IO点的状态,写一个寄存器就能同时控制8个输出。

绑定过程中要注意三点:第一,位序必须与客户端解析一致,UR通常按bit0对应第一个IO;第二,模拟量需要先做缩放,例如0~10V对应0~10000,再写入寄存器,避免浮点直接映射带来的字序问题;第三,安全相关的IO(如急停、安全门)不应仅依赖Modbus传输,Modbus是普通通信,不具备安全等级,安全信号必须走硬线或安全总线。

UR Modbus TCP 服务端:地址分区与信号映射关系 UR 机器人内部 URScript 主循环 状态采集 / 命令解析 物理 IO DI / DO / 工具IO / AI 机器人状态 模式 / 报警 / 程序号 工艺参数 速度 / 力矩 / 偏移 安全信号 急停 / 安全门(硬线) Modbus 寄存器地址空间 0–99 状态字 只读 · 位域/整型 100–199 位姿反馈 只读 · 32位浮点双寄存器 200–299 控制命令 读写 · 位域 300–399 工艺参数 读写 · 整型/浮点 400–499 IO镜像 双向 · 位域 Modbus TCP 客户端 PLC / SCADA 功能码 03 / 04 读取 边缘网关 功能码 06 / 16 写入 HMI 触摸屏 轮询周期 100~500ms 访问控制 IP白名单 / 写保护 安全边界 Modbus 不承载安全信号 只读状态 读写控制 IO镜像 安全边界(不走Modbus)

四、安全访问策略:把“能通”变成“可控”

Modbus TCP本身没有认证和加密机制,任何能访问502端口的设备都可以读写寄存器。因此安全策略必须从网络层和应用层同时下手。网络层上,建议将机器人Modbus服务限制在独立VLAN或工业防火墙之后,只允许指定客户端IP访问502端口;UR安装中虽然不提供完整的IP白名单,但可以通过上层交换机ACL或防火墙实现。应用层上,则要在URScript中做“写保护”和“命令合法性校验”。

具体做法包括:对控制命令寄存器采用“命令字+校验字”双寄存器机制,客户端写入命令后,机器人校验校验字是否匹配,不匹配则忽略;对关键参数设置上下限,例如速度缩放限制在0~100%,超出范围直接拒绝并置位错误标志;对写操作增加“使能位”,只有使能位为1时参数写入才生效,防止误写。此外,所有写操作都应记录到日志寄存器或机器人日志中,便于事后追溯。

安全提醒:Modbus TCP是普通通信协议,不具备功能安全等级。急停、安全门、安全限速等信号必须通过硬线或安全总线(如PROFIsafe、CIP Safety)传输,不得仅依赖Modbus寄存器。Modbus只能用于非安全相关的状态监视和工艺控制。

五、配置检查与验证方法

配置完成后,建议按以下顺序验证:先用Modbus Poll或QModMaster等工具连接机器人IP的502端口,读取地址0~3,确认状态字随机器人模式变化;再写入地址200的bit0,观察机器人是否响应启动;最后读取地址400,确认DI状态与物理输入一致。若读取失败,优先检查端口是否被防火墙拦截、单元标识符(Unit ID)是否匹配、寄存器地址是否从0还是从1开始计数——这是最常见的两个坑。

地址规划表、信号映射表和访问策略应作为工程交付文档的一部分,与UR程序版本一同归档。当后续增加新信号时,先在地址表中分配空闲地址,再修改URScript和客户端配置,避免“随手插一个地址”导致映射混乱。只有把地址空间当作一份需要版本管理的接口契约来对待,UR Modbus TCP服务端集成才能长期稳定运行。