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 建立连接。
四、组播与单播:连接类型如何影响网络负载
在 Forward Open 中,传输类型决定报文的目的地址形式。
- 组播(Multicast):生产者发送一份报文到组播地址,多个消费者同时接收。适合一个生产者对应多个消费者的场景,如一个输入模块被多个控制器监听。
- 单播(Unicast):生产者与每个消费者建立独立连接,分别发送。适合点对点、消费者数量少或需要独立 RPI 的场景。
选择不当会带来两类问题:该组播却用单播,生产者发送次数随消费者线性增长,交换机端口和 CPU 负载上升;该单播却用组播,所有节点被迫接收无关流量,消费者过滤成本增加,且难以针对单个消费者调整 RPI。
五、案例:一个远程 I/O 模块的连接建立过程
假设控制器要读取一个 16 点输入模块,并控制 8 点输出。典型流程如下:
- 控制器通过 TCP 44818 向模块发送
List Identity,确认设备在线。 - 读取模块的
Identity对象,获取厂商 ID、设备类型、产品代码。 - 读取
Assembly对象实例 101(输入)和 102(输出)的属性,确认数据长度。 - 通过
Forward Open请求建立 Class 1 连接,指定 RPI=10ms、输入 4 字节、输出 2 字节、传输类型为组播。 - 模块返回
Forward Open成功响应,携带连接 ID 和实际协商参数。 - 双方按 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 和通信栈的基础。设备开发中,通信模型一旦确定,对象实例、连接参数和网络配置都应围绕它保持一致。