3. UR机器人通信接口总览
UR机器人在工业集成中之所以灵活,很大程度上得益于它同时开放了多条通信通道。这些通道并非互相替代,而是各自面向不同的控制层级与实时性需求。理解它们的定位与边界,是后续做设备集成、上位机开发和节拍优化的前提。本节围绕四条主线展开:URScript 通信指令、Dashboard Server、RTDE,以及 Modbus TCP 的客户端/服务端角色。
一、四条通道的定位差异
可以把 UR 的通信能力理解为“从脚本内到脚本外、从低频到高频”的一个谱系。URScript 通信指令运行在机器人控制器内部,是机器人程序自己发起的通信;Dashboard Server 是外部程序向控制器发送文本命令的通道,偏管理与状态控制;RTDE 是面向实时数据交换的高速通道,用于周期性读写;Modbus TCP 则是与 PLC、传感器、远程 IO 等第三方设备对接的通用工业协议。四者的关系可以用下图概括。
二、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 等),是上位机做状态机判断的重要依据。
四、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 可以放行。两种角色可以同时启用,但要注意寄存器地址规划,避免读写冲突。
六、如何选择与组合
实际项目中,这四条通道往往是组合使用的。一个常见的集成架构是:上位机通过 Dashboard Server 加载并启动程序,通过 RTDE 以 100 Hz 采集机器人位姿做可视化监控,同时 PLC 通过 Modbus TCP 与 UR 交换启停信号和工位状态,而机器人程序内部用 URScript socket 指令与视觉系统做一次性的坐标交互。这样既保证了管理层的可控性,又满足了实时层的数据密度,还兼顾了现场总线的通用性。
选择时的判断依据可以归纳为三点:需要机器人程序内部自主决策,用 URScript 通信指令;需要外部程序管理机器人启停和程序状态,用 Dashboard Server;需要高频、低时延的过程数据,用 RTDE;需要与 PLC、IO、传感器做标准工业对接,用 Modbus TCP。把每条通道放在它最合适的位置,系统才会既稳定又高效。