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–499 | IO镜像(数字输入/输出、工具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是普通通信,不具备安全等级,安全信号必须走硬线或安全总线。
四、安全访问策略:把“能通”变成“可控”
Modbus TCP本身没有认证和加密机制,任何能访问502端口的设备都可以读写寄存器。因此安全策略必须从网络层和应用层同时下手。网络层上,建议将机器人Modbus服务限制在独立VLAN或工业防火墙之后,只允许指定客户端IP访问502端口;UR安装中虽然不提供完整的IP白名单,但可以通过上层交换机ACL或防火墙实现。应用层上,则要在URScript中做“写保护”和“命令合法性校验”。
具体做法包括:对控制命令寄存器采用“命令字+校验字”双寄存器机制,客户端写入命令后,机器人校验校验字是否匹配,不匹配则忽略;对关键参数设置上下限,例如速度缩放限制在0~100%,超出范围直接拒绝并置位错误标志;对写操作增加“使能位”,只有使能位为1时参数写入才生效,防止误写。此外,所有写操作都应记录到日志寄存器或机器人日志中,便于事后追溯。
五、配置检查与验证方法
配置完成后,建议按以下顺序验证:先用Modbus Poll或QModMaster等工具连接机器人IP的502端口,读取地址0~3,确认状态字随机器人模式变化;再写入地址200的bit0,观察机器人是否响应启动;最后读取地址400,确认DI状态与物理输入一致。若读取失败,优先检查端口是否被防火墙拦截、单元标识符(Unit ID)是否匹配、寄存器地址是否从0还是从1开始计数——这是最常见的两个坑。
地址规划表、信号映射表和访问策略应作为工程交付文档的一部分,与UR程序版本一同归档。当后续增加新信号时,先在地址表中分配空闲地址,再修改URScript和客户端配置,避免“随手插一个地址”导致映射混乱。只有把地址空间当作一份需要版本管理的接口契约来对待,UR Modbus TCP服务端集成才能长期稳定运行。