协议

EtherNet/IP

qianmoQqianmoQ· 更新于 2026-10-01· 阅读 14 分钟· 0 次阅读

登录后可跨设备保存划线和私人笔记登录

EtherNet/IP 是 Rockwell Automation 对 CIP(通用工业协议,Common Industrial Protocol)在标准 Ethernet/TCP-IP 之上的实现。它被 Allen-Bradley/Rockwell PLC 以及其他通过符号标签名(而非固定内存地址)寻址数据的 CIP 设备所使用。

本页介绍 eip 驱动,它使用通用的 CIP 符号寻址。同一个 Java 标签类也支撑着由同一模块注册的 logix 驱动代码——参见 Logix 了解该协议的页面。

支持的操作

名称值描述
readGo 和 Java。读取一个或多个标签,或数组标签的一个范围。
writeGo 和 Java。写入一个或多个标签,或数组标签的一个范围。
subscribe仅 Java,通过轮询模拟。EtherNet/IP 在此没有推送机制,因此订阅在底层是一次周期性读取,而不是设备发起的通知。
discoverGo 和 Java。发现网络上的设备。这是发现 API,而非 browse:该驱动不支持标签浏览。

连接字符串

EtherNet/IP 连接字符串的格式如下:

eip://{ip-address}:{port}?{options}

tcp 是唯一受支持的传输方式,也是默认方式,因此在连接字符串中可以省略。端口默认为 44818,通常无需指定:

eip://192.168.24.32

连接字符串选项

名称

类型

默认值

是否必需

说明

名称

EthernetIP

代码

{host}:{port}?{key}={value}
名称 类型 默认值 是否必需 说明
host 字符串 无 是 要连接的远程主机地址。
port 整数 44818 否 要连接的远程端口,EtherNet/IP 的默认端口为 44818。
timeout 整数 10000 否 建立连接及响应的超时时间(毫秒)。
retry 整数 0 否 连接失败时的重试次数。
rack 整数 0 否 目标设备所在的机架编号。
slot 整数 0 否 目标设备所在的插槽编号。
cache 布尔值 true 否 是否缓存已读取的对象模型,以减少通信往返次数。

示例:

192.168.1.100:44818?cache=false&timeout=5000

eip

Maven 依赖

<dependency>
  <groupId>org.apache.plc4x</groupId>
  <artifactId>plc4j-driver-eip</artifactId>
  <version>1.0.0</version>
</dependency>

默认传输

tcp

支持的传输协议

  • tcp

配置选项:

big-endian

BOOLEAN

true

配置该连接是否应设置为以大端(Big-Endian)格式传输数据。

connection-serial-number

INT

0

用于 Forward_Open 的连接序列号。CIP 要求每个连接使用唯一的序列号,因此默认值 0 表示"为每个连接随机选取一个"。只有当交换过程需要可复现时(例如在录制的测试中)才需要显式设置它。
自 1.0.0 起

force-unconnected-operation

BOOLEAN

false

强制驱动程序使用非连接请求。
自 0.13.0 起

request-timeout-ms

INT

10000

所有类型请求的默认超时时间。

communication-path

STRING

通信路径允许跨多个背板进行连接路由。它使用了 Logix 控制器中常见的一种通用格式。
该路径由成对的值组成,每对值以 1(背板)或 2(以太网)开头,如果是背板地址,后面跟的是插槽号;如果是使用以太网,则后面跟的是 IP 地址。例如 [1,4,2,192.168.0.1,1,1] —— 路由到第一个机架的第 4 个插槽,该插槽是一个以太网模块,随后连接到地址 192.168.0.1,再在插槽 1 中找到该模块。

传输配置选项:

tcp

tcp.connect-timeout-ms

INT

5000

连接超时时间,单位毫秒。

tcp.read-timeout-ms

INT

0

以毫秒为单位的套接字读取超时时间。0 表示不超时。

tcp.write-timeout-ms

INT

0

套接字写入超时时间(毫秒)。0 表示不超时。

tcp.no-delay

BOOLEAN

true

启用 TCP_NODELAY(禁用 Nagle 算法)。

tcp.keep-alive

BOOLEAN

false

启用 SO_KEEPALIVE。

tcp.send-buffer-size

INT

81920

发送缓冲区大小(字节)。0 表示使用系统默认值。

tcp.receive-buffer-size

INT

81920

以字节为单位的接收缓冲区大小。0 表示使用系统默认值。

tcp.local-address

STRING

要绑定的本地地址(可选)。若未设置,则使用默认值。

tcp.local-port

INT

0

要绑定的本地端口(可选)。0 表示使用临时端口。

标签地址

标签地址的实现包含 Go 和 Java 两种版本。各实现的具体功能请参见协议支持矩阵]。

通用格式

为了读写 PLC4X 设备的数据,EtherNet/IP 驱动使用符号段。它用于通过符号名称来引用对象。这使得读取数据变得更加简单,因为读取时无需指定数据类型。

{tagname}
{tagname}:{DataType}
{tagname}[{selection}]
{tagname}[{selection}]:{DataType}
名称说明
标签名(Tagname)数据的符号名称。可选择在前面加上 % 前缀。
选择(Selection,可选)要读取数组中的哪些元素——单个索引或一个闭区间。它位于标签名之后、数据类型之前。参见数组寻址。
数据类型(DataType,可选)值的数据类型。省略时默认为 DINT,因此对于任何非 32 位整数的数据都应显式给出——读取时同样如此。
选择位于数据类型之前,区间表示读取的元素个数。从索引 0 开始读取四个 DINT 写作 myArray[0..3]:DINT。
CIP 数组索引随 MemberID 一起传输,其 instance 字段为 uint 8,因此选择不能从索引 255 之后开始。区间本身可以超出该范围——请求携带起始位置与数量——但不能从该位置开始。
Java 驱动的标签名不要求以 % 开头——rate:DINT 可以在 Java 中解析。Go 驱动的地址模式要求标签名以 % 开头,因此同样的地址在那里会被拒绝。本页记录的是 Java 语法;关于它接受哪些写法,请参阅 Go 驱动自身的源码。

数据类型

以下是驱动能够编码和解码的数据类型:

用途使用的数据类型
位BOOL
8 位位串BYTE
16 位位串WORD
32 位位串DWORD
64 位位串LWORD
8 位整数SINT
16 位整数INT
32 位整数DINT
64 位整数LINT
8 位无符号整数USINT
16 位无符号整数UINT
32 位无符号整数UDINT
64 位无符号整数ULINT
32 位浮点数REAL
64 位浮点数LREAL
字符串STRING
无符号类型和位串类型覆盖其完整取值范围,因此 UDINT 或 DWORD 会以 0 到 4294967295 的范围返回,ULINT 或 LWORD 则以 0 到 18446744073709551615 的范围返回。它们的有符号对应类型保持不变:值为 0xFFFFFFFF 的 DINT 读取结果仍为 -1。
其他 CIP 数据类型可被地址解析器接受,但驱动不会对其进行编码或解码;读取此类标签会返回响应码 INTERNAL_ERROR 而不是值。

示例

地址含义
myTagmyTag 的单个元素,解码为 DINT
myTag:REALmyTag 的单个元素,解码为 REAL
myTag[0..3]myTag 的四个元素,解码为 DINT
myArray[3]:DINTmyArray 的第 3 个元素
myArray[0..3]:DINTmyArray 的第 0 至第 3 个元素,以列表形式返回
%myTag:REALmyTag 的单个元素,解码为 REAL - % 前缀是可选的

表 1. 示例

评论

登录后参与评论

正在加载评论…