3. UR机器人通信接口总览

UR机器人在工业集成中之所以灵活,很大程度上得益于它同时开放了多条通信通道。这些通道并非互相替代,而是各自面向不同的控制层级与实时性需求。理解它们的定位与边界,是后续做设备集成、上位机开发和节拍优化的前提。本节围绕四条主线展开:URScript 通信指令、Dashboard Server、RTDE,以及 Modbus TCP 的客户端/服务端角色。

一、四条通道的定位差异

可以把 UR 的通信能力理解为“从脚本内到脚本外、从低频到高频”的一个谱系。URScript 通信指令运行在机器人控制器内部,是机器人程序自己发起的通信;Dashboard Server 是外部程序向控制器发送文本命令的通道,偏管理与状态控制;RTDE 是面向实时数据交换的高速通道,用于周期性读写;Modbus TCP 则是与 PLC、传感器、远程 IO 等第三方设备对接的通用工业协议。四者的关系可以用下图概括。

UR 控制器通信接口全景 UR 控制器 URScript 运行时 实时数据交换引擎 URScript 通信指令 socket_open / send / recv modbus_* 指令族 Dashboard Server 端口 29999 play / stop / load 等文本命令 RTDE 端口 30004 500 Hz 周期读写 Modbus TCP 端口 502 客户端 / 服务端双角色 脚本内通信 · 外部管理 · 实时数据 · 现场总线对接

二、URScript 通信指令:机器人自己开口说话

URScript 是 UR 控制器内置的脚本语言,机器人程序本身就是一段 URScript。它提供了一组通信指令,让机器人程序在运行过程中主动与外部世界交换数据。常用的有 socket_open、socket_send_string、socket_read_ascii_float、socket_close,以及 Modbus 相关的 modbus_set_output_register、modbus_get_input_register 等。

一个典型用法是:机器人抓取完成后,通过 socket 向视觉系统发送“取件完成”字符串,再读取视觉返回的下一个坐标。示例脚本片段如下:

socket_open("192.168.1.50", 5000, "vision")
socket_send_string("PICK_DONE", "vision")
next_x = socket_read_ascii_float(1, "vision", 2.0)
socket_close("vision")

这里 socket_read_ascii_float 的第三个参数 2.0 是超时时间(秒),超时未收到数据会返回 0 并置位错误标志。实际工程中必须处理超时分支,否则机器人可能卡在读取上。URScript 通信指令的优势是“机器人自主”,适合机器人程序内部需要根据外部数据做分支判断的场景;缺点是它运行在脚本线程中,实时性受程序扫描周期影响,不适合高频数据交换。

三、Dashboard Server:外部程序的管理入口

Dashboard Server 监听 29999 端口,接收纯文本命令,用于加载程序、启动、暂停、停止、查询状态等。它不传输过程数据,而是做“管理控制”。例如上位机可以用一条 TCP 连接发送:

load /programs/pick_place.urp
play

控制器会返回 Loading program: ... 和 Starting program 之类的文本响应。常用命令还包括 stop、pause、quit、robotmode、programState。其中 robotmode 返回机器人当前模式(如 RUNNING、IDLE、POWER_OFF),programState 返回程序状态(PLAYING、STOPPED 等),是上位机做状态机判断的重要依据。

Dashboard 命令是“一问一答”的文本协议,每条命令以换行结束。上位机应逐条发送并读取响应,避免一次性堆叠多条命令导致响应错位。

四、RTDE:面向实时数据的高速通道

RTDE(Real-Time Data Exchange)监听 30004 端口,采用二进制协议,支持最高 500 Hz 的周期性数据交换。它分为两个方向:输入寄存器(Input)由外部写入控制器,输出寄存器(Output)由控制器周期上报。典型输出包括关节角度、TCP 位姿、数字输入状态、机器人模式、安全状态等;典型输入包括数字输出控制、速度缩放、脚本命令等。

RTDE 的使用流程是:先通过 connect 建立连接,再用 setup_output 和 setup_input 声明需要交换的字段,然后 start 启动同步。以 Python 的 rtde_receive 为例,声明 actual_q 和 actual_TCP_pose 后,即可在循环中按 500 Hz 读取。RTDE 适合做数据采集、外部轨迹修正、力控反馈等对时延敏感的任务。需要注意的是,RTDE 的输入写入会直接影响控制器,必须做好边界检查,避免写入非法值导致机器人异常动作。

五、Modbus TCP 的客户端与服务端角色

Modbus TCP 是 UR 与 PLC、远程 IO、传感器对接最常用的协议。关键在于 UR 控制器同时支持两种角色,理解“谁主动、谁被动”是配置的核心。

角色主动方典型场景UR 侧配置
UR 作为服务端外部设备(PLC)PLC 读写 UR 的寄存器控制程序启用 Modbus 服务端,端口 502
UR 作为客户端UR 控制器UR 主动读写 PLC 或 IO 模块在 URScript 中用 modbus_* 指令

当 UR 作为服务端时,外部 PLC 通过功能码 03/06/16 读写 UR 的保持寄存器,UR 程序里用 modbus_get_input_register 或 modbus_set_output_register 访问这些寄存器。当 UR 作为客户端时,机器人程序主动发起请求,例如 modbus_set_output_register("PLC", 100, 1) 把地址 100 的寄存器置 1,通知 PLC 可以放行。两种角色可以同时启用,但要注意寄存器地址规划,避免读写冲突。

Modbus 寄存器地址在不同设备手册中可能从 0 或 1 开始编号,UR 侧与 PLC 侧必须统一约定。建议在集成前用一张地址对照表明确每个寄存器的含义、方向和数据类型。

六、如何选择与组合

实际项目中,这四条通道往往是组合使用的。一个常见的集成架构是:上位机通过 Dashboard Server 加载并启动程序,通过 RTDE 以 100 Hz 采集机器人位姿做可视化监控,同时 PLC 通过 Modbus TCP 与 UR 交换启停信号和工位状态,而机器人程序内部用 URScript socket 指令与视觉系统做一次性的坐标交互。这样既保证了管理层的可控性,又满足了实时层的数据密度,还兼顾了现场总线的通用性。

选择时的判断依据可以归纳为三点:需要机器人程序内部自主决策,用 URScript 通信指令;需要外部程序管理机器人启停和程序状态,用 Dashboard Server;需要高频、低时延的过程数据,用 RTDE;需要与 PLC、IO、传感器做标准工业对接,用 Modbus TCP。把每条通道放在它最合适的位置,系统才会既稳定又高效。