协议

PLC4X(代理)

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

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

plc4x 协议是 PLC4X 自有的代理协议:一个 PLC4X 实例(通常是 PLC4X Server)接受来自 plc4x 客户端的连接,并通过其他任意 PLC4X 驱动(s7、modbus、ads、opcua、simulated……)将读写操作转发给真实的 PLC。当只有运行服务器的机器才能访问到 PLC 时——例如 PLC 位于防火墙之后或处于隔离的 OT 网络中,而客户端位于别处——该协议非常有用。身份验证是必需的,默认传输方式为 TLS。

支持的操作

操作在此协议中的作用
read通过代理从远程 PLC 读取标签。
write通过代理向远程 PLC 写入标签。

不支持订阅与浏览:该驱动只重写了读取和写入操作。

连接字符串

plc4x 协议的连接具有以下格式:

plc4x:{transport}://{host}:{port}?remote-connection-string={url-encoded-connection-string}&username={user}&password={pass}

{transport} 为 tls(默认值,未指定传输方式时使用)或 tcp(明文方式,需显式启用,适用于受信任的网络或测试场景)。remote-connection-string 是代理应连接实际 PLC 所使用的 URL 编码连接字符串。username 和 password 为必填项。

示例连接字符串,TLS(默认)与明文 TCP:

plc4x:tls://host:59837?remote-connection-string=s7&username=op&password=hunter2&tls.verify=false
plc4x://host?remote-connection-string=s7%3A%2F%2Foperator%3Ahunter2%40plc%3A102

连接字符串选项

名称

类型

默认值

是否必需

描述

名称

PLC4X (Proxy-Protocol)

代码

plc4x

Maven 依赖

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

默认传输

tls

支持的传输协议

  • tls
  • tcp

配置选项:

remote-connection-string

STRING

用于在代理端连接给定 PLC 的 URL 编码连接字符串。

request-timeout-ms

INT

5000

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

username

STRING

用于通过 PLC4X 代理服务器进行身份验证的用户名。身份验证为必填项。

password

STRING

用于向 PLC4X 代理服务器进行身份验证的密码。身份验证为必填项。

传输配置选项:

tls

tls.verify

BOOLEAN

true

tls.ignore-common-name

BOOLEAN

false

接受为与所连接主机不同的其他主机颁发的服务器证书。

tls.trust-store

STRING

要信任的证书密钥库,用以取代 JVM 的公共权威证书库

tls.trust-store-password

STRING

由 tls.trust-store 指定的信任库(trust store)的密码

tls.trust-store-type

STRING

PKCS12

由 tls.trust-store 指定的信任库(trust store)的类型

tls.version

STRING

TLS 协议版本(例如 'TLSv1.2'、'TLSv1.3')。若未设置,则使用 TLS 1.3,并在不支持时回退到 TLS 1.2。

tls.keystore

STRING

用于双向 TLS 的客户端证书与私钥所在的密钥库(PKCS12/JKS)路径。

tls.keystore-password

STRING

客户端密钥库的密码。

tls.keystore-type

STRING

密钥库类型(例如 'PKCS12'、'JKS')。默认为 PKCS12。

tls.log-session-keys

BOOLEAN

false

以 SSLKEYLOGFILE 格式将 TLS 会话密钥记录到审计日志中,供 Wireshark 进行解密。

tls.connect-timeout-ms

INT

5000

以毫秒为单位的连接超时时间。

tls.read-timeout-ms

INT

0

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

tls.write-timeout-ms

INT

0

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

tls.no-delay

BOOLEAN

true

启用 TCP_NODELAY(禁用 Nagle 算法)。

tls.keep-alive

布尔值

false

启用 SO_KEEPALIVE。

tls.send-buffer-size

INT

81920

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

tls.receive-buffer-size

INT

81920

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

tls.local-address

STRING

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

tls.local-port

整型

0

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

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 表示使用临时端口。

标签地址

标签地址的实现在 C 和 Java 中都有提供。各实现支持的具体能力参见协议支持矩阵]。

通用格式

一个 plc4x 标签地址指向的是远程连接上的标签,也就是代理所打开的那个连接,而不是代理连接自身的标签。驱动程序不会解析或校验该地址;它只会截去末尾的 :{type} 后缀,并将其余部分原样透传给远程连接,因此该地址必须遵循 remote-connection-string 所指向的驱动程序的标签语法:

{remote-tag-address}:{data-type}

例如,在远程连接到 simulated PLC 时,标签地址由 simulated 驱动地址加上 PLC4X 值类型组成:

RANDOM/foo:BOOL
STDOUT/foo:INT

数据类型

末尾的 :{data-type} 后缀是 PLC4X 标准值类型之一,例如 BOOL、BYTE、WORD、DWORD、USINT、UINT、UDINT、ULINT、SINT、INT、DINT、LINT、REAL、LREAL、CHAR 或 WCHAR。

示例

从远程 simulated 连接读取数据以及向其写入数据:

RANDOM/foo:BOOL
RANDOM/foo:DWORD
RANDOM/foo:LREAL
STDOUT/foo:BOOL
STDOUT/foo:UDINT
STDOUT/foo:WCHAR

评论

登录后参与评论

正在加载评论…