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 侧通过实例号读写,而不是直接访问底层寄存器。
显式消息与隐式 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 故障或模块离线。
封装协议与 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 对象模型提供数据语义,显式/隐式区分提供通信语义,生产者/消费者提供数据分发语义,封装协议与端口提供网络承载语义。
工程检查要点
| 检查项 | 关注对象/参数 | 判断依据 |
|---|---|---|
| 设备发现 | 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 或防火墙拦截 |