3 个版本 (1 个稳定版)
1.0.0 | 2022年1月2日 |
---|---|
0.1.1 | 2021年12月31日 |
0.1.0 | 2021年12月30日 |
#8 in #modbus-tcp
15KB
229 行
Modbus TCP 代理
许多 Modbus 设备只支持一个或非常少数量的客户端。此代理充当客户端和 Modbus 设备之间的桥梁。它可以被视为第 7 层反向代理。这允许多个客户端与同一 Modbus 设备进行通信。
当多个客户端连接时,通过按先到先得的方式序列化通信,避免了交叉消息。
此项目是基于 Python 的 modbus-proxy 项目,采用 Rust 编程语言和基于异步的 tokio 库的 Rust 版本。
我这样做是因为它符合我使用 Rust 编程语言及其基于异步的 tokio 库进行练习的个人目标。
目标是生成一个健壮、高并发且内存占用低的服务器。
安装
$ cargo install modbus-proxy-rs
运行服务器
首先,您需要编写一个配置文件,其中指定要控制的每个 Modbus 设备
- modbus 连接(Modbus 设备 URL)
- 监听接口(客户端应连接到的 URL)
配置文件可以写成 YAML(.yml 或 .yaml)或 TOML(.toml)格式。
假设您有一个监听在 plc1.acme.org:502 的 PLC Modbus 设备,并希望您的客户端连接到您的机器的 9000 端口。一个 YAML 配置可能如下所示
devices:
- modbus:
url: plc1.acme.org:502 # device url (mandatory)
listen:
bind: 0:9000 # listening address (mandatory)
假设您将此文件保存为 modbus-config.yml
,则可以使用以下命令启动服务器
$ modbus-proxy-rs -c ./modbus-config.yml
现在,您不需要将客户端(s)连接到 plc1.acme.org:502
,只需告诉它们连接到 *machine*:9000
(其中 machine 是运行 modbus-proxy 的主机)。
请注意,服务器可以处理多个 Modbus 设备。以下是两个设备的配置示例
devices:
- modbus:
url: plc1.acme.org:502
listen:
bind: 0:9000
- modbus:
url: plc2.acme.org:502
listen:
bind: 0:9001
日志记录
可以通过设置环境变量 RUST_LOG
来调整日志级别(默认为 warn
)
$ RUST_LOG=debug modbus-proxy-rs -c ./modbus-config.yml
Docker
此项目包含一个 Dockerfile,您可以使用它作为基础来在 Docker 容器中启动 modbus-proxy。
首先,使用以下命令构建 Docker 镜像
$ docker build -t modbus-proxy .
假设您在当前目录中已准备了一个 config.yml
devices:
- modbus:
url: plc1.acme.org:502
listen:
bind: 0:502
默认情况下,提供的Docker镜像运行以下命令:/modbus-proxy-rs -c /etc/modbus-proxy.yml
。因此,启动容器就像这样简单。
docker run --init --rm -p 5020:502 -v $PWD/config.yml:/etc/modbus-proxy.yml modbus-proxy
您可以为不同的配置路径提供配置(例如:/config.yml
)
docker run --init --rm -p 5020:502 -v $PWD/config.yml:/config.yml modbus-proxy -c /config.yml
现在您应该可以通过连接您的客户端到<your-hostname/ip>:5020
来通过modbus-proxy访问您的modbus设备。
请注意,对于配置文件中添加的每个modbus设备,您需要在主机上发布相应的绑定端口(使用-p <host port>:<container port>
参数)。
致谢
开发负责人
- 蒂亚戈·库蒂尼奥 [email protected]
贡献者
暂无。为什么不成为第一个呢?
依赖项
~9–23MB
~262K SLoC