工具

PLC4X 服务器

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

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

PLC4X Server 是一个小型中继服务器,它使用 PLC4X 代理协议进行通信。

使用 plc4x 驱动的客户端连接到该服务器,服务器随后代表客户端与 PLC 建立真实连接,并转发读写操作。

当只有运行服务器的机器才能访问 PLC(例如位于防火墙之后或隔离的 OT 网络中),而客户端位于其他地方时,这种模式非常有用。

服务器打包了全部 PLC4X 驱动,因此中继的连接字符串可以指向任意受支持的协议(s7、modbus、ads、opcua、simulated……)。

安全模型

  • 必须进行身份验证。 每个客户端连接在被接受执行任何操作之前,都必须完成用户名/密码握手。没有免认证模式。
  • TLS 是默认传输方式。 凭据和负载在传输过程中均经过加密。明文 TCP 仅作为显式选择,供受信任网络或测试环境使用。

构建

在模块目录下执行:

mvn package

这将在 target/plc4j-plc4x-server-<version>.jar 处生成一个可运行的 fat-jar。

运行服务器

java -jar target/plc4j-plc4x-server-<version>.jar [port]

监听端口可以作为第一个参数给出,也可以通过 plc4x.server.port 系统属性或 PLC4X_SERVER_PORT 环境变量指定。若省略,默认为 59837。

首次启动且无配置

如果在未配置凭据的情况下启动服务器,它会生成一个默认身份,并在控制台仅打印一次:

============================================================
 No PLC4X server credentials configured - generated defaults:
   username: toddy
   password: 3Qm0v2yq... (randomly generated)
 Provide plc4x.server.username/password to set your own.
============================================================

由于同样没有配置密钥库,它还会生成一个临时的自签名 TLS 证书,并将其指纹记录到日志中,以便客户端可以信任/固定该指纹:

No keystore configured - generated an ephemeral self-signed certificate.
Server certificate SHA-256 fingerprint: B1:A5:51:F8:...:35:CE
配置的凭据绝不会被记录到日志中——只会打印生成的凭据。

配置

所有设置均从系统属性(-D…)或环境变量中读取。

设置系统属性环境变量默认值
监听端口plc4x.server.portPLC4X_SERVER_PORT59837
用户名plc4x.server.usernamePLC4X_SERVER_USERNAMEtoddy
密码plc4x.server.passwordPLC4X_SERVER_PASSWORD(自动生成)
明文模式plc4x.server.plaintextPLC4X_SERVER_PLAINTEXTfalse(启用 TLS)
TLS 密钥库plc4x.server.keystore—(自签名)
密钥库密码plc4x.server.keystore-password——

示例:显式凭据 + 您自己的 TLS 证书

java \
  -Dplc4x.server.port=59837 \
  -Dplc4x.server.username=operator \
  -Dplc4x.server.password='s3cr3t!' \
  -Dplc4x.server.keystore=/etc/plc4x/server.p12 \
  -Dplc4x.server.keystore-password='keystorepass' \
  -jar target/plc4j-plc4x-server-<version>.jar

密钥库必须是包含服务器私钥和证书的 PKCS12(或 JKS)文件。

示例:明文(仅适用于受信任网络 / 本地测试)

java -Dplc4x.server.plaintext=true \
     -Dplc4x.server.username=operator \
     -Dplc4x.server.password='s3cr3t!' \
     -jar target/plc4j-plc4x-server-<version>.jar

连接客户端

客户端使用 plc4x 驱动。连接字符串指向服务器,remote-connection-string 参数(经 URL 编码)用于告知服务器需要打开哪个 PLC。

连接字符串格式

plc4x:<transport>://<server-host>:<server-port>?remote-connection-string=<url-encoded-plc-url>&username=<user>&password=<pass>[&tls.verify=false]
  • <transport> 为 tls(默认值)或 tcp(明文)。不带前缀的 plc4x://… 使用默认值 TLS。
  • remote-connection-string 是服务器应当用来连接实际 PLC 的经 URL 编码的连接字符串。
  • username / password 为必填项。
  • tls.verify=false 会禁用证书校验——当服务器使用自动生成的自签名证书时需要开启。若使用的是受信任的(CA 签发的)证书,请保持其默认值(true)。

示例(Java)

目标 PLC 的 URL s7://10.10.1.5 → 经 URL 编码后为 s7%3A%2F%2F10.10.1.5。

String url = "plc4x:tls://server.example.com:59837"
    + "?remote-connection-string=s7%3A%2F%2F10.10.1.5"
    + "&username=operator"
    + "&password=s3cr3t!"
    + "&tls.verify=false"; // self-signed server cert

try (PlcConnection connection = new DefaultPlcDriverManager().getConnection(url)) {
    PlcReadRequest request = connection.readRequestBuilder()
        .addTagAddress("value", "%DB1.DBW0:INT")
        .build();
    PlcReadResponse response = request.execute().get();
    System.out.println(response.getInteger("value"));
}

明文客户端

String url = "plc4x:tcp://server.example.com:59837"
    + "?remote-connection-string=s7%3A%2F%2F10.10.1.5"
    + "&username=operator&password=s3cr3t!";

故障排除

症状原因 / 解决方法
Server certificate not trusted … PKIX path building failedTLS 证书未被客户端信任。添加 tls.verify=false,或信任/固定服务器证书。
连接失败并出现 ACCESS_DENIED / 认证错误缺少或错误的 username / password。
tcp 客户端连接 tls 服务器时挂起或立即失败传输方式不匹配——客户端和服务器必须就 TLS 与明文达成一致。
连接时出现 INVALID_ADDRESS服务器无法打开 remote-connection-string(URL 错误,PLC 不可达)。

评论

登录后参与评论

正在加载评论…