3、CIP对象模型核心:对象、类、实例、属性、服务、行为,以及对象寻址(Class ID/Instance ID/Attribute ID)
CIP(Common Industrial Protocol)对象模型是EtherNet/IP乃至整个CIP协议族(包括DeviceNet、ControlNet、CompoNet)的基石。理解CIP对象模型,本质上就是理解工业设备在网络上“如何被描述、如何被访问、如何被控制”。与TCP/IP协议栈中纯粹的字节流传输不同,CIP在传输层之上建立了一套面向对象的、语义明确的“设备信息架构”。本章将深入拆解CIP对象模型的六大核心要素——对象、类、实例、属性、服务、行为,并重点讲解对象寻址的三级体系(Class ID / Instance ID / Attribute ID)。掌握这些内容,是后续进行EDS文件解析、显式报文构造、隐式连接配置以及设备故障诊断的前提。
3.1 核心原理:从“数据裸奔”到“对象化建模”
在传统串口或简单现场总线中,设备数据往往以寄存器地址或字节偏移量来定义。例如Modbus协议中,保持寄存器40001可能代表温度,40002代表压力。这种方式的弊端在于:地址含义完全依赖人工约定,不同厂商的设备即使功能相同,寄存器映射也可能完全不同,导致系统集成时大量依赖纸质文档和手工配置。
CIP对象模型彻底改变了这一局面。它将设备内部的所有可访问资源——无论是物理输入输出、配置参数、诊断信息还是通信状态——统一抽象为对象(Object)。每个对象都遵循标准化的定义方式,包含明确的属性(数据)、服务(方法)和行为(规则)。这种建模方式带来了三个关键优势:
- 语义标准化:CIP预定义了大量的标准对象类,如Identity Object(0x01)、Message Router(0x02)、Assembly Object(0x04)、Connection Manager(0x06)等。无论哪个厂商的设备,其Identity Object的属性1(Vendor ID)和属性2(Product Type)都遵循相同的语义定义。
- 扩展灵活性:厂商可以在标准对象之外定义私有对象类,用于暴露设备特有功能。只要遵循CIP对象模型框架,这些私有对象同样可以被标准CIP工具(如RSLogix、Studio 5000)发现和访问。
- 统一访问机制:无论访问的是数字量输入、模拟量输出还是设备固件版本,都通过相同的服务原语(如Get Attribute Single、Set Attribute Single)完成。这大大简化了主站(Scanner)的协议栈实现。
3.2 六大核心要素详解
3.2.1 对象(Object)与类(Class)
对象是CIP中最基本的概念单元,它封装了相关的数据和操作。一个设备内部通常包含多个对象,例如一个简单的变频器可能包含:Identity Object(标识自身)、Message Router Object(路由消息)、Assembly Object(提供I/O数据映射)、Parameter Object(暴露运行参数)、DeviceNet Object(网络配置)等。
类(Class)是对象的模板或蓝图。它定义了一组具有相同属性集合、服务集合和行为规则的对象。类本身并不包含具体数据,而是描述了“这一类对象长什么样”。例如,Assembly Object类定义了所有Assembly实例都必须具备属性3(数据)、属性4(数据大小)等,但每个Assembly实例的实际数据内容是不同的。
类与实例的关系可以类比为面向对象编程中的“类与对象”关系。在CIP中,一个类可以有多个实例,每个实例拥有独立的属性值存储空间。例如,一个具有16路数字量输入的设备,其Discrete Input Point对象类(0x08)下会有16个实例,每个实例对应一路输入通道。
3.2.2 实例(Instance)与属性(Attribute)
实例是类的具体实现。每个实例都有唯一的实例ID(Instance ID),用于在同类对象中区分彼此。实例ID通常从1开始编号(0通常保留给类本身)。例如,Assembly Object的实例100可能代表“输入数据映射”,实例101可能代表“输出数据映射”。
属性(Attribute)是实例或类中携带的数据字段。每个属性都有唯一的属性ID(Attribute ID),并定义了数据类型(如BOOL、SINT、INT、DINT、REAL、STRING等)、访问权限(只读、只写、读写)和是否可选。属性是外部访问设备数据的最终落脚点——无论是读取状态还是写入控制命令,最终都要落实到对某个实例的某个属性的读写操作上。
属性分为实例属性和类属性两种。实例属性存储每个实例特有的数据;类属性存储该类所有实例共享的数据。例如,Identity Object类的属性1(Revision)是类属性,表示该类定义的版本号;而实例属性1(Vendor ID)则是每个实例特有的。
3.2.3 服务(Service)与行为(Behavior)
服务是外部可以对对象执行的操作。CIP定义了丰富的标准服务码(Service Code),常用的包括:
| 服务码(十六进制) | 服务名称 | 说明 |
|---|---|---|
| 0x01 | Get Attribute All | 读取实例/类的所有属性值 |
| 0x02 | Set Attribute All | 写入实例/类的所有属性值 |
| 0x03 | Get Attribute Single | 读取单个指定属性值(最常用) |
| 0x04 | Set Attribute Single | 写入单个指定属性值(最常用) |
| 0x05 | Reset | 复位设备或对象 |
| 0x0E | Get Attribute List | 批量读取多个属性值 |
| 0x10 | Set Attribute List | 批量写入多个属性值 |
| 0x4B | Forward Open | 建立隐式I/O连接(Connection Manager对象) |
行为(Behavior)描述了对象在特定条件下如何响应服务请求以及内部状态如何变化。行为通常用状态机来定义。最典型的例子是Connection Manager对象的行为——它管理着连接的建立、运行、超时和关闭状态。当收到Forward Open请求时,它检查资源是否可用,然后分配连接ID、建立隐式连接;当连接超时(RPI超时)时,它触发超时动作(如输出进入故障安全状态)。
3.3 对象寻址:Class ID / Instance ID / Attribute ID 三级体系
CIP对象寻址采用三级路径结构,类似于文件系统中的“目录/文件/记录”定位方式。完整的寻址路径由三个标识符组成:
- Class ID(类标识):16位无符号整数,唯一标识一个对象类。CIP标准定义了0x00~0x63范围内的标准类ID,0x64~0x2FF为厂商自定义类ID范围,0x300~0xFFFF保留。
- Instance ID(实例标识):16位无符号整数,在同类对象中唯一标识一个实例。实例ID 0通常代表类本身(用于访问类属性)。
- Attribute ID(属性标识):16位无符号整数,在实例或类中唯一标识一个属性。属性ID 0通常代表对象本身(用于访问对象级信息)。
在构造显式报文时,寻址路径被编码为一系列“段(Segment)”。最常用的编码方式是:
// 寻址路径示例:读取Assembly对象(0x04)实例101的属性3(数据)
// 路径段编码(十六进制字节序列):
// 0x20 0x04 → Class ID段(0x20表示“Class ID”段类型,0x04为类ID值)
// 0x24 0x65 → Instance ID段(0x24表示“Instance ID”段类型,0x65 = 101十进制)
// 0x30 0x03 → Attribute ID段(0x30表示“Attribute ID”段类型,0x03为属性ID值)
// 完整路径:20 04 24 65 30 03
这种三级寻址体系带来的直接好处是:任何CIP设备的标准对象都可以用统一的方式访问。无论设备是罗克韦尔的PLC还是第三方阀岛,只要它实现了Identity Object(类ID 0x01),主站就可以通过“Class=0x01, Instance=1, Attribute=1”读取到厂商ID。
3.4 案例拆解:通过显式报文读取变频器状态字
下面通过一个完整的实战案例,演示如何利用CIP对象模型和三级寻址,从一台EtherNet/IP变频器中读取运行状态字。
背景与约束:某产线上有一台第三方变频器,支持EtherNet/IP适配器功能。PLC(罗克韦尔CompactLogix)需要实时读取变频器的状态字(16位,包含运行、故障、正转、反转等状态位)。变频器厂商在EDS文件中声明:状态字位于Assembly Object(类0x04)实例103的属性3中,数据类型为INT(16位有符号整数)。
初始现象:PLC程序中直接使用MSG指令读取该数据,但返回错误码0x1F(Vendor Specific Error)。初步判断是寻址路径配置错误。
分析判断过程:
- 查阅EDS文件,确认Assembly实例103的属性3确实是状态字,数据类型为INT。
- 检查MSG指令配置,发现寻址路径被错误地写成了“Class=0x04, Instance=1, Attribute=3”——实例ID错误地使用了1,而不是103。
- 进一步检查发现,EDS文件中还标注了该属性为“可读”,但未标注“可写”,因此Set操作会失败。
实际操作步骤:
// 在Studio 5000中正确配置MSG指令:
// 消息类型:CIP Generic
// 服务类型:Get Attribute Single (0x03)
// 目标路径(Class/Instance/Attribute):
// Class: 0x04 (Assembly)
// Instance: 103 (0x67)
// Attribute: 3
// 路径编码:20 04 24 67 30 03
// 数据大小:2字节(INT)
// 通信方式:Connected Explicit Messaging(推荐,效率更高)
结果对比:修正实例ID后,MSG指令读取成功,状态字数值与变频器面板显示一致。例如状态字=0x0007,表示“运行+正转+无故障”。
风险与代价:如果错误地使用实例1(通常为默认实例),读取到的可能是其他数据(如输出数据映射),导致PLC得到错误的控制状态,可能引发安全风险。因此,在配置任何CIP对象访问前,务必核对EDS文件中的实例ID和属性ID定义。
复盘经验:
- 实例ID是三级寻址中最容易出错的环节。很多工程师习惯性地使用实例1,但实际设备可能使用100以上的实例编号。
- EDS文件是对象寻址的“地图”,必须仔细阅读。特别注意属性数据类型与PLC标签数据类型的匹配。
- 对于频繁读取的数据(如状态字),建议使用隐式I/O连接(通过Assembly对象映射)而非显式报文,以降低网络负载和延迟。
3.5 常见误区与总结复盘
总结复盘:CIP对象模型的核心价值在于将异构设备的数据访问统一为“对象-类-实例-属性-服务-行为”的标准化框架。在实际工程中,掌握三级寻址(Class ID / Instance ID / Attribute ID)是进行任何EtherNet/IP通信调试的基础。建议工程师在项目初期就建立“对象地图”文档,列出所有需要访问的对象类、实例ID、属性ID、数据类型和访问权限,这不仅能减少调试时间,还能为后续维护提供清晰的参考。