2. EtherNet/IP协议核心机制

EtherNet/IP 并不是把 CIP(Common Industrial Protocol,通用工业协议)简单“搬到网线上”,而是把 CIP 的对象模型、消息类型和连接语义完整地承载在标准以太网与 TCP/IP 之上。理解这一层承载关系,是后续配置 Anybus 设备、判断连接状态、排查通信故障的基础。本节围绕四个相互咬合的核心机制展开:CIP 对象模型决定“数据以什么形式存在”,显式消息与隐式 I/O 连接决定“数据以什么方式交换”,生产者/消费者模型决定“数据由谁发出、谁接收”,封装协议与 TCP/UDP 端口决定“这些内容如何被装进以太网帧”。

CIP 对象模型:设备内部的数据组织方式

CIP 用“对象”描述设备中一切可被访问的资源。每个对象由类(Class)、实例(Instance)和属性(Attribute)三级构成:类定义一类对象的共同行为,实例是类的一次具体实现,属性则是实例上可读写的具体数据项。例如一台 Anybus 通信模块中,Identity 对象(类 0x01)的实例 1 保存厂商 ID、设备类型、产品代码、修订版本和序列号;TCP/IP Interface 对象(类 0xF5)的实例 1 保存 IP 地址、子网掩码、网关和配置方式;Ethernet Link 对象(类 0xF6)的实例 1 保存 MAC 地址、链路速率和双工状态。

对工程实践而言,最需要记住的是三类对象的分工:标识类对象(Identity、TCP/IP Interface、Ethernet Link)用于设备识别与网络参数;连接类对象(Connection Manager、Message Router)负责建立和管理通信关系;应用类对象(如 Assembly、Parameter、Vendor Specific)承载真正的过程数据与参数。Anybus 模块通常把过程数据映射到 Assembly 对象的实例中,输入 Assembly 与输出 Assembly 各占一个实例号,PLC 侧通过实例号读写,而不是直接访问底层寄存器。

对象寻址采用“类 ID + 实例 ID + 属性 ID”三元组。例如读取 Identity 对象实例 1 的属性 7(产品名称),路径可表示为 0x01/0x01/0x07。EDS 文件中大量字段本质上就是对这些路径的声明。

显式消息与隐式 I/O 连接

CIP 定义了两类截然不同的通信方式。显式消息(Explicit Messaging)是“请求—应答”式的,客户端发出一个明确的服务请求(如 Get_Attribute_Single、Set_Attribute_Single),服务端返回结果。它适合配置参数、读取诊断、上传 EDS 信息等非周期性、对时延不敏感但对可靠性要求高的场景。显式消息通常走 TCP,端口 44818。

隐式 I/O 连接(Implicit / I/O Connection)则是“周期性、单向、无应答”的。发送方按固定 RPI(Requested Packet Interval,请求包间隔)持续推送数据,接收方只负责消费,不逐包确认。它适合实时性要求高的过程数据,如 I/O 状态、速度给定、位置反馈。隐式连接通常走 UDP,端口 2222。两者的关键区别在于:显式消息关心“这次请求有没有成功”,隐式连接关心“数据是否按时到达、是否新鲜”。

生产者/消费者模型

EtherNet/IP 的 I/O 数据交换采用生产者/消费者模型,而不是传统的主从轮询。生产者(Producer)按 RPI 把数据打包成组播或单播报文发到网络上,消费者(Consumer)根据连接建立时协商好的参数接收。一个生产者可以有多个消费者,一个消费者也可以同时消费多个生产者的数据。这意味着数据源只发送一次,网络上的多个接收者各自取用,带宽利用率高于“每个主站分别轮询每个从站”的模式。

连接建立时,双方通过 Forward Open 服务协商一组参数:连接 ID、RPI、网络连接参数(T→O 与 O→T 两个方向)、传输类型(单播/组播)、超时倍率等。其中 RPI 决定生产周期,超时倍率(通常为 RPI 的 4 倍或 8 倍)决定消费者判定“连接丢失”的阈值。若消费者在超时时间内未收到新数据,就会把连接标记为超时,PLC 侧通常表现为 I/O 故障或模块离线。

EtherNet/IP 核心机制关系图 CIP 对象模型 标识类:Identity / TCP-IP / EthLink 连接类:Conn Mgr / Msg Router 应用类:Assembly / Parameter 类 ID / 实例 ID / 属性 ID 三级寻址 消息与连接类型 显式消息 请求-应答 · TCP 44818 · 配置/诊断 隐式 I/O 连接 周期推送 · UDP 2222 · 实时过程数据 RPI 决定周期,超时倍率决定断线判定 生产者 / 消费者模型 生产者 按 RPI 发送 消费者 A 单播/组播 消费者 B 同一数据源 一次发送,多方消费,节省带宽 封装协议(Encapsulation)与端口承载 CIP 数据 服务码 + 路径 + 数据 封装头 命令 + 长度 + 会话句柄 TCP / UDP 44818 / 2222 IP / Ethernet 标准以太网帧 典型数据流:Anybus 模块 ↔ PLC Anybus 模块 交换机 / 网络 PLC 扫描器 HMI / 上位机 显式消息用于配置与诊断;隐式 I/O 连接承载周期性过程数据

封装协议与 TCP/UDP 端口

CIP 报文本身不直接暴露给以太网,而是先经过一层封装协议(Encapsulation Protocol)。封装头包含命令码、长度、会话句柄、状态码、发送方上下文等字段,用于在 TCP 或 UDP 之上建立会话、区分请求与响应、匹配上下文。封装层之上才是 CIP 消息,CIP 消息内部再包含服务码、对象路径和数据。

端口分配是排查连接问题时最直接的线索:TCP 44818 承载显式消息和封装会话管理,包括 ListIdentity、RegisterSession、Forward Open 等命令;UDP 44818 用于 ListIdentity 广播发现,PLC 或工程工具通过它扫描网段内有哪些 EtherNet/IP 设备;UDP 2222 承载隐式 I/O 连接的实际过程数据。若 PLC 能 ping 通设备但无法建立 I/O 连接,通常要检查 2222 端口是否被防火墙或交换机 ACL 拦截;若连设备都发现不了,则优先检查 44818 的 UDP 广播是否可达。

四者如何协同工作

把四个机制串起来看:设备上电后,PLC 先通过 UDP 44818 广播 ListIdentity 发现设备;随后通过 TCP 44818 建立封装会话,用显式消息读取 Identity 对象确认设备身份,读取 TCP/IP Interface 对象确认网络参数;接着用 Forward Open 协商隐式 I/O 连接,确定 Assembly 实例号、RPI、连接 ID 和超时倍率;连接建立后,双方按生产者/消费者模型在 UDP 2222 上周期交换 I/O 数据。整个过程里,CIP 对象模型提供数据语义,显式/隐式区分提供通信语义,生产者/消费者提供数据分发语义,封装协议与端口提供网络承载语义。

常见误区:把显式消息当作实时数据通道。显式消息有请求-应答往返,周期抖动大,不适合做高速 I/O 控制;反过来,隐式连接不保证每包必达,不能用它传输必须确认的关键参数。参数配置走显式,过程数据走隐式,这是 EtherNet/IP 的基本分工。

工程检查要点

检查项 关注对象/参数 判断依据
设备发现 UDP 44818 ListIdentity 工程工具能扫描到设备,说明广播可达
身份确认 Identity 对象 0x01/0x01 厂商 ID、产品代码、修订版本与 EDS 一致
网络参数 TCP/IP Interface 对象 0xF5/0x01 IP、掩码、网关与规划一致,配置方式正确
I/O 连接 Forward Open 参数:RPI、超时倍率 RPI 与 PLC 扫描周期匹配,超时倍率合理
数据映射 Assembly 实例号与长度 输入/输出 Assembly 实例号、字节长度与 EDS 一致
端口连通 TCP 44818 / UDP 2222 显式可通、隐式可通,无 ACL 或防火墙拦截