3. EtherNet/IP通信模型

EtherNet/IP 的通信模型建立在 CIP(Common Industrial Protocol)之上,但真正决定设备行为的是它如何组织数据交换:谁生产数据、谁消费数据、用哪种消息类型、连接如何建立、报文发往一个还是多个节点。理解这五个问题,才能正确设计对象模型与设备通信栈。

一、生产者/消费者模型:从“点对点问答”到“数据发布”

传统请求/响应通信中,主站逐个轮询从站,数据源被动应答。EtherNet/IP 采用生产者/消费者模型:数据源节点作为生产者,按约定周期或触发条件把数据发布到网络;需要该数据的节点作为消费者,通过连接标识符接收。生产者不需要知道有多少消费者,消费者也不需要向生产者发请求。

这一模型带来三个直接结果:

  • 同一份数据可被多个节点同时消费,天然支持一对多。
  • 通信负载与消费者数量解耦,增加监听者不增加生产者发送次数。
  • 数据新鲜度由生产周期决定,消费者按自身超时判断连接健康。

在对象建模中,生产者通常对应 Assembly 对象中的输出实例,消费者对应输入实例;连接对象 Connection Manager 负责协商双方的生产/消费参数。

二、隐式消息与显式消息:两条并行的通信通道

EtherNet/IP 把报文分为两类,它们在封装、时序和用途上完全不同。

对比项 隐式消息(Implicit) 显式消息(Explicit)
承载协议 UDP/IP,端口 2222 TCP/IP,端口 44818
数据内容 仅连接 ID + 实时 I/O 数据 完整 CIP 报文:服务码、路径、数据
时序特征 周期性、低延迟、可容忍丢包 请求/响应、可靠、可重传
典型用途 I/O 连接、标签实时刷新 参数配置、诊断、对象读写
连接建立 需先经显式消息协商 直接发起
关键点:隐式消息不是“没有连接”,而是连接在建立后以极简头部传输;显式消息也不是“慢”,而是为可靠性和语义完整性付出额外开销。

三、I/O 连接与标签通信:两种消费实时数据的方式

I/O 连接是 EtherNet/IP 最典型的隐式通信形式。发起方通过 Forward Open 服务向目标设备请求连接,协商参数包括:

Connection Parameters:
  RPI (Requested Packet Interval) = 10 ms
  Connection Size (O→T) = 32 bytes
  Connection Size (T→O) = 48 bytes
  Transport Type = Class 1 (multicast)
  Connection Priority = High
  Timeout Multiplier = 4

协商成功后,双方按 RPI 周期交换数据。发起方把输出数据写入目标设备的 Assembly 输出实例,同时从输入实例读取数据。整个过程不再有 CIP 服务码,只有连接 ID 和净荷。

标签通信则更灵活。控制器之间或控制器与 HMI 之间可以直接建立基于标签的隐式连接,消费者订阅某个标签或标签组,生产者按变化或周期发布。与 I/O 连接相比,标签通信的路径由符号名解析,适合非固定 I/O 映射的场景,但同样依赖 Connection Manager 建立连接。

设备开发时,若数据是固定 I/O 映射,优先用 Assembly + I/O 连接;若数据是变量、配方或状态字,优先用标签通信,减少 Assembly 实例的硬编码。

四、组播与单播:连接类型如何影响网络负载

在 Forward Open 中,传输类型决定报文的目的地址形式。

  • 组播(Multicast):生产者发送一份报文到组播地址,多个消费者同时接收。适合一个生产者对应多个消费者的场景,如一个输入模块被多个控制器监听。
  • 单播(Unicast):生产者与每个消费者建立独立连接,分别发送。适合点对点、消费者数量少或需要独立 RPI 的场景。

选择不当会带来两类问题:该组播却用单播,生产者发送次数随消费者线性增长,交换机端口和 CPU 负载上升;该单播却用组播,所有节点被迫接收无关流量,消费者过滤成本增加,且难以针对单个消费者调整 RPI。

EtherNet/IP 通信模型:消息类型与连接方式 生产者 Assembly 输出 标签发布 显式消息 TCP:44818 配置 / 诊断 / Forward Open 隐式消息 UDP:2222 I/O 数据 / 标签实时值 配置工具 显式读写对象 消费者 A 组播接收 消费者 B 组播接收 消费者 C 单播独立连接 组播一份报文 单播独立发送 显式消息 隐式消息 组播消费者 单播消费者

五、案例:一个远程 I/O 模块的连接建立过程

假设控制器要读取一个 16 点输入模块,并控制 8 点输出。典型流程如下:

  1. 控制器通过 TCP 44818 向模块发送 List Identity,确认设备在线。
  2. 读取模块的 Identity 对象,获取厂商 ID、设备类型、产品代码。
  3. 读取 Assembly 对象实例 101(输入)和 102(输出)的属性,确认数据长度。
  4. 通过 Forward Open 请求建立 Class 1 连接,指定 RPI=10ms、输入 4 字节、输出 2 字节、传输类型为组播。
  5. 模块返回 Forward Open 成功响应,携带连接 ID 和实际协商参数。
  6. 双方按 RPI 周期在 UDP 2222 上交换隐式报文,控制器从输入连接 ID 读取数据,向输出连接 ID 写入数据。
常见误区:把 Forward Open 当成数据报文。它只是显式消息中的一次服务调用,真正的高频数据在 UDP 2222 上以隐式消息传输。若抓包只看 TCP 44818,会误判设备没有通信。

六、复盘:设计通信模型时的检查清单

  • 数据是固定 I/O 还是变量?固定 I/O 用 Assembly + I/O 连接,变量用标签通信。
  • 一个生产者对应几个消费者?多消费者优先组播,单消费者或需独立 RPI 用单播。
  • RPI 是否与设备扫描能力匹配?过快会导致丢包和 CPU 过载,过慢会影响控制精度。
  • 连接超时倍数是否合理?通常为 RPI 的 4 倍,过小会误判断线,过大则故障发现延迟。
  • 显式消息是否与隐式消息共用同一物理端口?需确认交换机 QoS 和 IGMP Snooping 配置。
  • 对象模型中 Assembly 实例长度是否与连接参数一致?不一致会导致 Forward Open 失败。

掌握生产者/消费者模型、隐式与显式消息的分工、I/O 连接与标签通信的适用边界,以及组播与单播的选择逻辑,是后续设计 Assembly 对象、Connection Manager 和通信栈的基础。设备开发中,通信模型一旦确定,对象实例、连接参数和网络配置都应围绕它保持一致。