EtherNet/IP
EtherNet/IP 是 Rockwell Automation 对 CIP(通用工业协议,Common Industrial Protocol)在标准 Ethernet/TCP-IP 之上的实现。它被 Allen-Bradley/Rockwell PLC 以及其他通过符号标签名(而非固定内存地址)寻址数据的 CIP 设备所使用。
本页介绍 eip 驱动,它使用通用的 CIP 符号寻址。同一个 Java 标签类也支撑着由同一模块注册的 logix 驱动代码——参见 Logix 了解该协议的页面。
支持的操作
| 名称 | 值 | 描述 |
|---|---|---|
read | Go 和 Java。读取一个或多个标签,或数组标签的一个范围。 | |
write | Go 和 Java。写入一个或多个标签,或数组标签的一个范围。 | |
subscribe | 仅 Java,通过轮询模拟。EtherNet/IP 在此没有推送机制,因此订阅在底层是一次周期性读取,而不是设备发起的通知。 | |
discover | Go 和 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=5000eip
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 而不是值。 |
|---|
示例
| 地址 | 含义 |
|---|---|
myTag | myTag 的单个元素,解码为 DINT |
myTag:REAL | myTag 的单个元素,解码为 REAL |
myTag[0..3] | myTag 的四个元素,解码为 DINT |
myArray[3]:DINT | myArray 的第 3 个元素 |
myArray[0..3]:DINT | myArray 的第 0 至第 3 个元素,以列表形式返回 |
%myTag:REAL | myTag 的单个元素,解码为 REAL - % 前缀是可选的 |
表 1. 示例
评论
登录后参与评论
KnowForge