3 个版本 (1 个稳定版)

1.0.0 2022年1月2日
0.1.1 2021年12月31日
0.1.0 2021年12月30日

#8 in #modbus-tcp

GPL-3.0-or-later

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>参数)。

致谢

开发负责人

贡献者

暂无。为什么不成为第一个呢?

依赖项

~9–23MB
~262K SLoC