工具
PLC4X 服务器
登录后可跨设备保存划线和私人笔记登录
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.port | PLC4X_SERVER_PORT | 59837 |
| 用户名 | plc4x.server.username | PLC4X_SERVER_USERNAME | toddy |
| 密码 | plc4x.server.password | PLC4X_SERVER_PASSWORD | (自动生成) |
| 明文模式 | plc4x.server.plaintext | PLC4X_SERVER_PLAINTEXT | false(启用 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 failed | TLS 证书未被客户端信任。添加 tls.verify=false,或信任/固定服务器证书。 |
连接失败并出现 ACCESS_DENIED / 认证错误 | 缺少或错误的 username / password。 |
tcp 客户端连接 tls 服务器时挂起或立即失败 | 传输方式不匹配——客户端和服务器必须就 TLS 与明文达成一致。 |
连接时出现 INVALID_ADDRESS | 服务器无法打开 remote-connection-string(URL 错误,PLC 不可达)。 |
评论
登录后参与评论
正在加载评论…
KnowForge