4. EtherNet/IP对象模型与CIP通信机制

EtherNet/IP 的通信能力并不是“以太网 + TCP/IP”这么简单,它真正定义设备行为的部分是上层封装在 TCP/UDP 之上的 CIP(Common Industrial Protocol,通用工业协议)。理解 CIP 的对象模型,是理解 ControlLogix 与变频器、远程 I/O、编码器、阀岛等设备之间“为什么能这样通信”的关键。CIP 把每一台设备抽象成一组对象,对象再被实例化,实例携带属性,属性通过服务被读写或触发动作。显式消息和隐式 I/O 连接,本质上都是围绕这套对象模型展开的两种访问方式。

一、CIP 对象模型:类、实例、属性、服务

CIP 的对象模型采用面向对象式的四层结构,但它不是编程语言里的类,而是设备对外暴露的标准化数据与行为描述:

  • 对象类(Object Class):定义某一类对象的共同特征,例如 Identity 对象类(0x01)、Message Router(0x02)、Assembly(0x04)、Connection Manager(0x06)、TCP/IP Interface(0xF5)、Ethernet Link(0xF6)。类本身有类属性,如修订版本、最大实例数。
  • 实例(Instance):类的一次具体实现。例如一台 PowerFlex 变频器可能同时拥有多个 Assembly 实例,输入 Assembly 实例号 0x64、输出 Assembly 实例号 0x65,分别承载状态字和命令字。
  • 属性(Attribute):实例上的数据字段,有明确的 ID、数据类型和访问权限。例如 Identity 实例 1 的属性 1 是 Vendor ID(UINT),属性 7 是 Product Name(STRING)。
  • 服务(Service):对对象执行的动作,常用服务码包括 0x0E Get_Attribute_Single、0x10 Set_Attribute_Single、0x05 Reset、0x4B/0x4C 用于连接管理。服务码决定了“读、写、复位、建立连接”等行为。

因此,一条 CIP 请求的完整寻址路径可以写成:类 ID + 实例 ID + 属性 ID + 服务码。例如读取 Identity 实例 1 的 Vendor ID,就是 Class 0x01、Instance 0x01、Attribute 0x01、Service 0x0E。这个四元组是后面所有显式消息和隐式连接的基础。

CIP 对象模型与两种通信路径 对象模型层级 对象类 Class 如 Identity 0x01 / Assembly 0x04 实例 Instance 如输入 Assembly 实例 0x64 属性 Attribute 如 Vendor ID / 状态字 / 命令字 服务 Service 0x0E 读 / 0x10 写 / 0x05 复位 寻址四元组:类 + 实例 + 属性 + 服务 Message Router 对象类 0x02 解析路径并分发服务 显式消息(TCP 0xAF12) 按需请求 / 响应,非周期 用于配置、诊断、参数读写 典型服务:Get/Set_Attribute_Single 报文可长,允许分片 示例:读取 Vendor ID、写加速时间 结果:返回属性值或错误码 隐式 I/O 连接(UDP 0x08AE) 周期生产 / 消费,实时性高 基于 Assembly 实例交换数据 RPI 决定刷新周期 连接由 Forward Open 建立 示例:状态字 / 命令字周期交换 结果:连接超时或数据刷新 统一对象寻址

二、显式消息:按需访问对象属性

显式消息是“请求—响应”式的通信。ControlLogix 通过 MSG 指令或 Studio 5000 的在线浏览发起显式请求,报文经 TCP 端口 0xAF12(44818)承载,由目标设备的 Message Router 解析后转发到对应对象实例。它的特点是:非周期、可长可短、可携带完整路径、适合配置和诊断。

例如,要读取一台 EtherNet/IP 变频器的 Identity 对象实例 1 的 Vendor ID,路径可写为:

Class: 0x01  Instance: 0x01  Attribute: 0x01
Service: 0x0E (Get_Attribute_Single)
请求路径: 01 01 01 00 0E
预期返回: Vendor ID = 0x0001 (Rockwell Automation)

如果要把加速时间写入参数对象,则使用 0x10 Set_Attribute_Single,路径指向对应参数实例的属性。显式消息的优点是灵活、可读性强,缺点是延迟不确定,不适合直接承担高速 I/O 刷新。因此它通常用于:上电初始化、参数下发、故障诊断、读取设备铭牌信息、修改 RPI 之前的准备动作。

三、隐式 I/O 连接:周期性的生产与消费

隐式 I/O 连接是 EtherNet/IP 实现实时控制的核心。它不采用“请求—响应”,而是由 Connection Manager(对象类 0x06)通过 Forward Open 服务建立一条连接,双方约定:

  • 生产者(Producer):周期性地把 Assembly 实例中的数据打包发出。
  • 消费者(Consumer):按相同周期接收并解析这些数据。
  • RPI(Requested Packet Interval):请求的刷新周期,例如 10 ms、20 ms。
  • 连接 ID:由 Forward Open 分配,用于在 UDP 报文中标识这条连接。

以 ControlLogix 与一台远程 I/O 站通信为例:控制器作为 Originator,远程 I/O 作为 Target。Forward Open 请求中会携带输入 Assembly 实例号、输出 Assembly 实例号、RPI、连接超时倍数等参数。连接建立后,远程 I/O 每个 RPI 周期把输入 Assembly 的数据通过 UDP 端口 0x08AE(2222)发往控制器;控制器则把输出 Assembly 的数据发往远程 I/O。整个过程不再需要逐条请求,因此延迟低且稳定。

这里有一个关键点:隐式连接交换的并不是“任意属性”,而是预先定义好的 Assembly 实例。Assembly 把多个属性打包成一块连续数据,例如输入 Assembly 0x64 可能包含状态字、实际速度、电流、故障码;输出 Assembly 0x65 可能包含命令字、速度给定、转矩限幅。控制器侧通过别名标签或 Produced/Consumed 标签映射到这些数据。

四、两种机制如何配合

实际工程中,显式消息和隐式连接不是二选一,而是分工协作。典型流程是:

  1. 设备上电后,控制器先通过显式消息读取 Identity 对象,确认 Vendor ID、Device Type、Product Code、修订版本,判断设备类型是否匹配。
  2. 通过显式消息写入必要参数,例如把变频器的控制源切换到 EtherNet/IP、设置加速时间、配置故障复位方式。
  3. 通过 Forward Open 建立隐式 I/O 连接,约定 RPI 和 Assembly 实例号,开始周期性交换状态字与命令字。
  4. 运行过程中,若需要修改某个参数,仍可插入显式消息;但实时控制数据始终走隐式连接。
  5. 若隐式连接超时,控制器会报连接故障,此时可用显式消息读取诊断对象,定位是网络问题、设备掉电还是 RPI 设置过小。
显式消息走 TCP,可靠但延迟不确定;隐式 I/O 走 UDP,周期稳定但不保证重传。两者共同依赖 CIP 对象模型,区别只在于访问方式和实时性目标不同。

五、工程判断要点

在 ControlLogix 项目中,判断该用显式还是隐式,可以看三个问题:数据是否需要每个扫描周期刷新?是否需要确定性延迟?是否属于配置或诊断类信息?如果答案是“是、是、否”,优先隐式 I/O;如果答案是“否、否、是”,优先显式消息。对于既需要周期刷新又需要偶尔修改参数的设备,通常两者并用:隐式连接负责实时数据,显式消息负责参数维护。

另外,Assembly 实例号和 RPI 必须与设备 EDS 文件或手册一致。若 Forward Open 返回错误码 0x01(连接资源不足)或 0x0111(连接超时),应先检查 RPI 是否过小、连接数是否超限、Assembly 实例号是否写错。显式消息返回 0x05(路径目标不支持)时,则要检查类、实例、属性三元组是否与设备对象字典匹配。掌握这套对象寻址和两种通信路径,才能在 ControlLogix 集成中快速定位“读不到、写不进、连不上”的问题。