4. CIP对象模型
CIP(Common Industrial Protocol)是 EtherNet/IP 的应用层核心。它并不把设备看成“一堆寄存器”,而是把设备抽象成一组可访问、可描述、可扩展的对象。理解 CIP 对象模型,是读懂 EtherNet/IP 报文、EDS 文件、显式报文与隐式 I/O 连接的基础。本节围绕对象、类、实例、属性、服务以及对象编址与寻址方式展开,帮助你把“设备通信”转化为“对对象的访问”。
一、核心原理:从“寄存器思维”转向“对象思维”
在传统 Modbus 等协议中,数据通常以寄存器地址组织,工程师关心的是“40001 对应什么”。CIP 则采用面向对象的方式:每个可通信实体都是一个对象(Object),对象具有类(Class)、实例(Instance)、属性(Attribute)和服务(Service)四个基本要素。设备通过“对象 + 实例 + 属性 + 服务”的组合,对外提供标准化的访问接口。
可以这样理解四者的关系:类是模板或类型定义,描述某一类对象“应该长什么样”;实例是类的一次具体实现,一个设备可以有多个同类实例;属性是实例所携带的数据,如状态、配置、测量值;服务是对象支持的操作,如读取、写入、复位、启动。CIP 规定了许多标准对象,例如标识对象(Identity Object,0x01)、消息路由对象(Message Router,0x02)、TCP/IP 接口对象(0x05)、以太网链路对象(0xF6)等,同时也允许厂商定义私有对象。
关键结论:CIP 通信的本质不是“读写地址”,而是“对某个对象的某个实例的某个属性执行某个服务”。
二、对象模型的组成与寻址方式
CIP 的对象编址通常由四段信息构成:类 ID(Class ID)、实例 ID(Instance ID)、属性 ID(Attribute ID)以及服务代码(Service Code)。类 ID 和实例 ID 是定位对象实例的必要信息;属性 ID 用于进一步定位实例中的数据成员;服务代码则决定对该属性执行什么操作。对于类对象本身的操作,实例 ID 可以省略或使用 0。
在 EtherNet/IP 中,显式报文通常通过“连接管理器 + 消息路由对象”完成路径解析。报文中的路径(Path)由若干段(Segment)组成,常见的有逻辑段(Logical Segment)和端口段(Port Segment)。逻辑段用于指定类、实例、属性等,端口段用于指定通信端口或背板槽位。例如,访问某设备标识对象的实例 1 的属性 1,路径可表示为:类 0x01、实例 0x01、属性 0x01。若设备位于背板某个槽位,还需要在路径中加入端口段。
隐式 I/O 连接则不同:它不逐条发送对象访问请求,而是在连接建立后,由生产者按约定格式周期性发送数据。这些数据通常对应汇编对象(Assembly Object,0x04)的实例。输入汇编实例和输出汇编实例分别承载设备到控制器、控制器到设备的过程数据。因此,隐式通信虽然不显式出现“类/实例/属性”字段,但其数据布局仍由对象模型定义。
三、方法流程:一次显式对象访问如何完成
下面以“读取设备标识对象实例 1 的属性 1(厂商 ID)”为例,说明一次典型显式报文的对象访问流程。
- 建立会话:客户端通过 TCP 端口 44818 与设备建立显式连接,并注册会话(Register Session)。
- 封装请求:构造 CIP 服务请求,服务代码为 0x0E(Get_Attribute_Single),路径指向类 0x01、实例 0x01、属性 0x01。
- 发送报文:将 CIP 请求放入“未连接消息”或“已连接消息”中,通过 SendRRData 或 SendUnitData 发送。
- 设备解析:设备的消息路由对象解析路径,定位到 Identity 对象实例 1 的属性 1。
- 执行服务:对象返回属性值,并附带状态码。若成功,状态码为 0x00;若失败,返回如 0x05(路径目标不存在)等错误。
- 客户端处理:解析响应数据,得到厂商 ID,完成一次对象访问。
对于隐式 I/O,流程则变为:建立 I/O 连接 → 协商 RPI 与连接参数 → 生产者按周期发送汇编对象实例数据 → 消费者解析并映射到控制器标签。此时对象模型体现在汇编实例的成员定义上,而不是逐条服务请求。
四、案例与场景:EDS 文件中的对象描述
在工程实践中,EDS(Electronic Data Sheet)文件是设备对象模型的“说明书”。它描述了设备支持哪些对象、实例、属性,以及汇编实例的成员结构。例如,一个典型 EDS 片段可能包含:
[Identity Object]
Class = 0x01
Instance = 0x01
Attribute 1 = Vendor ID
Attribute 2 = Device Type
Attribute 3 = Product Code
Attribute 4 = Revision
Attribute 5 = Status
Attribute 6 = Serial Number
Attribute 7 = Product Name
[Assembly Object]
Class = 0x04
Input Instance = 0x64
Output Instance = 0x65
Input Size = 8 Bytes
Output Size = 4 Bytes
组态软件读取 EDS 后,就能知道如何访问设备标识、如何解析 I/O 数据。若 EDS 中的汇编实例定义与实际设备不一致,就会出现“连接建立成功但数据错位”的典型故障。因此,对象模型不仅是协议概念,更直接影响现场调试与数据映射。
五、常见误区与复盘
误区 1:把类 ID 当成实例 ID。类 ID 标识对象类型,实例 ID 标识具体对象。访问时两者必须同时正确,否则会返回路径错误。
误区 2:认为隐式 I/O 不涉及对象。隐式 I/O 的数据布局由汇编对象实例定义,仍然属于对象模型的一部分。
误区 3:忽略属性访问权限。并非所有属性都可读写。Get 与 Set 服务是否支持,取决于对象定义。错误使用服务会返回 0x0E 或 0x10 等错误码。
误区 4:路径段顺序随意。CIP 路径有严格的段顺序和格式,端口段、逻辑段的位置错误会导致路由失败。
六、对象模型关键要素速查
| 要素 | 含义 | 典型示例 | 寻址作用 |
|---|---|---|---|
| 类 Class | 对象类型模板 | Identity 0x01、Assembly 0x04 | Class ID 定位对象类型 |
| 实例 Instance | 类的具体实现 | 实例 1 表示设备本身 | Instance ID 定位具体对象 |
| 属性 Attribute | 实例的数据成员 | 厂商 ID、状态、序列号 | Attribute ID 定位数据项 |
| 服务 Service | 对象支持的操作 | Get_Attribute_Single 0x0E | Service Code 决定操作 |
| 汇编对象 | I/O 数据集合 | 输入实例 0x64、输出实例 0x65 | 隐式连接的数据布局 |
掌握 CIP 对象模型后,再去看 EtherNet/IP 的显式报文、隐式连接、EDS 文件和设备描述,就会发现它们都围绕同一套抽象展开:用类定义类型,用实例表示个体,用属性承载数据,用服务完成操作,用路径实现寻址。这套模型既保证了不同厂商设备之间的互操作性,也为设备自定义功能留下了扩展空间。