4. 对象建模核心概念
在 EtherNet/IP 中,设备不是“一堆寄存器的集合”,而是“一组可被网络访问的对象”。CIP 对象模型把设备的通信能力、数据、状态和操作统一抽象为对象,使不同厂商的设备能够以一致方式被扫描、配置、读写和诊断。理解对象、类、实例、属性、服务、行为、接口这些概念,是开发 EtherNet/IP 设备的第一步。
一、核心原理:从“寄存器”到“对象”
CIP 对象模型的基本单位是对象(Object)。一个对象代表设备中某一类可被访问的功能实体,例如标识对象、TCP/IP 对象、连接管理器、汇编对象等。对象不是变量,而是“数据 + 行为 + 接口”的封装体。
- 类(Class):对象的类型定义,描述该类对象具有哪些属性、服务和行为。类本身也可以有属性,称为类属性。
- 实例(Instance):类的一个具体存在。例如“标识对象”是一个类,而某台设备上那个具体的标识对象就是它的一个实例。
- 属性(Attribute):对象对外暴露的数据项,如厂商 ID、设备类型、序列号、输入数据、输出数据等。属性有明确的 ID、数据类型和访问规则。
- 服务(Service):对象支持的操作,如 Get_Attribute_Single、Set_Attribute_Single、Forward_Open、Reset 等。服务通过 CIP 报文调用。
- 行为(Behavior):对象在收到服务或内部状态变化时如何响应,例如状态机迁移、数据更新、错误返回等。
- 接口(Interface):对象对外呈现的访问入口,包括支持的类、实例、属性、服务以及连接方式。
一句话理解:类是“图纸”,实例是“实物”,属性是“可读写的参数”,服务是“可调用的动作”,行为是“动作后的反应”,接口是“对外可访问的边界”。
二、对象模型在 CIP 中的角色
CIP 是 EtherNet/IP 的应用层协议,它不直接定义“寄存器地址”,而是定义“对象寻址”。一次典型的 CIP 访问由三要素确定:类 ID、实例 ID、属性 ID。例如读取标识对象的厂商 ID,就是访问 Class 0x01、Instance 1、Attribute 1。
对象模型在 CIP 中承担四个关键角色:
- 统一寻址:用类/实例/属性替代厂商私有地址,实现互操作。
- 统一服务:所有对象都通过标准服务访问,如 0x0E 读取单个属性、0x10 写入单个属性。
- 统一连接:连接管理器对象负责建立和管理显式消息与 I/O 连接。
- 统一描述:通过 EDS 文件描述设备支持的对象、实例和连接参数,供组态工具识别。
下面的 SVG 展示了 CIP 对象模型的核心结构:类、实例、属性、服务与接口之间的关系,以及对象模型在设备与网络之间的位置。
三、方法流程:如何用对象模型描述一个设备
开发 EtherNet/IP 设备时,通常按以下流程建立对象模型:
- 确定必须实现的标准对象:标识对象 0x01、连接管理器 0x06、TCP/IP 对象 0xF5、以太网链路对象 0xF6 等。
- 定义应用对象:根据设备功能定义汇编对象 0x04、参数对象 0x0F 或自定义对象。
- 分配实例与属性:为每个对象确定实例数量、属性 ID、数据类型和访问权限。
- 声明支持的服务:列出每个类/实例支持的服务代码,如 0x0E、0x10、0x05。
- 描述行为:定义状态机、复位行为、连接超时处理、错误码返回规则。
- 生成 EDS 文件:把对象、实例、连接参数写入 EDS,供上位机组态识别。
例如,一个远程 I/O 模块的对象模型可以简化为:
Class 0x01 Identity Instance 1
Attr 1 Vendor ID UINT 只读
Attr 2 Device Type UINT 只读
Attr 3 Product Code UINT 只读
Attr 4 Revision UINT 只读
Attr 5 Status WORD 只读
Attr 6 Serial Number UDINT 只读
Attr 7 Product Name STRING 只读
Class 0x04 Assembly Instance 100 (输入)
Attr 3 Data ARRAY 只读
Class 0x04 Assembly Instance 101 (输出)
Attr 3 Data ARRAY 读写
Class 0x06 Connection Manager
Service 0x05 Forward_Open
Service 0x0E Get_Attribute_Single
四、案例/场景:一个光电传感器的对象建模
假设开发一款 EtherNet/IP 光电传感器,它需要上报“检测到物体”和“信号强度”,并支持远程复位。对象模型可以这样设计:
| 对象 | 类 ID | 实例 | 关键属性 | 支持服务 |
|---|---|---|---|---|
| 标识对象 | 0x01 | 1 | 厂商 ID、设备类型、序列号 | 0x0E |
| 汇编对象 | 0x04 | 100 / 101 | 输入数据、输出数据 | 0x0E、0x10 |
| 连接管理器 | 0x06 | 1 | 连接数、连接状态 | 0x05、0x0E |
| 参数对象 | 0x0F | 1~N | 阈值、滤波时间、复位模式 | 0x0E、0x10 |
| 自定义诊断对象 | 0x64 | 1 | 信号强度、温度、错误码 | 0x0E |
在这个案例中,“检测到物体”不是直接写寄存器,而是映射到汇编对象实例 100 的属性 3;“远程复位”则通过参数对象或自定义对象的服务调用实现。上位机只需按类/实例/属性寻址,就能读写这些数据。
五、误区与复盘
常见误区一:把类当成实例。类 ID 和实例 ID 是两个维度。Class 0x01 是标识对象类,Instance 1 才是具体设备上的那个标识对象。只写类 ID 不写实例 ID,访问会失败。
常见误区二:属性 ID 可以随意定义。标准对象的属性 ID 由 CIP 规范固定,不能随意更改;自定义对象才允许在规范允许范围内自行分配。属性 ID 冲突会导致组态工具解析错误。
常见误区三:服务就是函数调用,不需要行为描述。服务只定义“能做什么”,行为定义“做完之后对象处于什么状态”。例如 Forward_Open 成功后连接进入 Established 状态,超时后进入 Timed Out 状态,这些必须建模清楚。
复盘建议:完成对象建模后,用“三问”检查:每个对象是否有明确的类 ID?每个实例是否有唯一实例 ID?每个属性是否有明确的数据类型、访问权限和服务支持?三问都通过,EDS 文件和固件实现才能保持一致。
对象、类、实例、属性、服务、行为、接口共同构成了 CIP 对象模型的完整语义。对象模型在 CIP 中的角色,是把设备功能翻译成网络可理解、可寻址、可互操作的标准语言。掌握这套抽象方法,后续实现标识对象、连接管理器、汇编对象和自定义对象时,才能做到结构清晰、行为可控、互操作可靠。