Modbus TCP服务器仿真
](https://hub.docker.com/r/allexd2010/modbus-server-sim) ](https://github.com/Allexd1992/modbus-tcp-simulation)  ](https://nodejs.org/)  
Modbus TCP服务器·内存存储·Web UI·REST·Swagger·基于HTTP的MCP
*现代深色玻璃形态UI:寄存器矩阵、浮点/32位语序、自动刷新、Swagger&AI。*
______________________________________________________________________
A. Modbus TCP 模拟器与a 单内存存储:web UI, REST API, 昂首阔步,以及 MCP(模型上下文协议) 对于Cursor等客户端,通过HTTP。建于 火箭, 东京-Modbus,以及 rmcp.
✨ 特性
- Modbus TCP --保持/输入寄存器、线圈和离散输入。
- 表征状态转移 --与Modbus和MCP相同的数据。
- 网页用户界面 (
/ui/)--寄存器矩阵,UInt16/Int32/浮点/双格式,位掩码,可配置间隔的自动刷新,MCP提示mcp.json示例和下载。 英语 (默认)和 俄语 通过 EN / 俄 在标题栏中;选择存储在浏览器中。 - 主控程序 --可流式HTTP
/mcp工具,如modbus_read_holding_registers,modbus_write_holding_registers以及更多。 - 可安装PWA --在中打开UI 铬 或 边缘 在
http://127.0.0.1:9090/ui/(或你的主人);页面加载后,使用 安装 在地址栏中(与 油管 / 声破天 web:独立窗口,无标签)。用途manifest.json+最低限度的服务人员/ui/.
📋 需求
- 来源: 生锈的工具链。
- 集装箱: Docker(或仅从Docker Hub拉取)。
🚀 快速启动
Docker Hub镜像(推荐)
当前标签(示例): 2.1.1.
docker pull allexd2010/modbus-server-sim:2.1.1
docker run -d --name modbus-sim \
-p 9090:9090 \
-p 502:502 \
-p 18081:8081 \
allexd2010/modbus-server-sim:2.1.1| 主机 | 容器 | 用途 |
|---|---|---|
| 9090 | 9090 | HTTP:REST、Swagger、, /ui/ |
| 502 | 502 | Modbus TCP |
| 18081 | 8081 | MCP(http://:18081/mcp) |
为什么主机上有18081: MCP在进程内监听 MCP_SERVER_PORT (默认值 8081).映射 18081:8081 与Cursor的web UI提示匹配。对于主机上的MCP,如 8081,使用 -p 8081:8081.
在本地构建映像:
docker build -t allexd2010/modbus-server-sim:2.1.1 .Docker Compose
docker compose up -d端口和图像在中定义 docker-compose.yml.
没有Docker
cargo run --release默认值:web 9090Modbus 502,MCP 8081 (见下面的环境变量)。UI: http://127.0.0.1:9090/ui/.
作为应用程序安装(PWA)
- 启动服务器(
cargo run --release或带有端口的Docker 9090 出版)。 - 打开
http://127.0.0.1:9090/ui/在 铬 或 微软边缘 (安全上下文:localhost/127.0.0.1作品)。 - 当浏览器显示 安装 在地址栏(或菜单)中→ *将此网站安装为应用程序*),confirm--UI将在其 自己的窗口 没有正常的浏览器工具栏。
已安装的应用程序仍在与 同源 作为页面;保持后端运行。对于远程服务器,请在安装前在URL中使用该主机。
🌐 启动后的服务
| 服务 | URL/地址 |
|---|---|
| Web用户界面 | http://:9090/ui/ |
| 斯瓦格 | http://:9090/api/v1/swagger/ |
| REST | 基础前缀 /api/v1/ |
| Modbus TCP | :502 (或港口从 MB_SERVER_PORT 以及你的Docker -p 映射) |
| MCP | http://:/mcp |
🖥️ 网页用户界面
- 标签:保持/输入/线圈/离散输入。
- 偏移 和 计数 设置读取窗口。限制来自服务器(
MB_MAX_ADDRESS,MB_MAX_READ_COUNT;违约 65535 每个)。UI从以下位置加载它们GET /api/v1/ui-config因此输入保持同步。寄存器矩阵在网格区域内滚动。 - 自动 --定期读取;间隔(秒);当单元格聚焦时,自动刷新不会覆盖您的输入。
- 人工智能 --MCP帮助文本、光标的当前URL、,
mcp.json下载(主机如页面上所示,端口 18081 默认情况下,或?mcpPort=在页面URL中)。
📍 Modbus寻址
协议和API使用 零基偏移 (第一个持有寄存器是地址 0).Modicon风格文档:持有 40001 → 抵消 0, 40021 → 20.
🔌 REST API(简称)
所有路线都在 /api/v1/;举个例子:
GET /api/v1/ui-config--JSONmax_modbus_address,max_read_count(与下面的env变量相同的限制;由web UI使用)GET /api/v1/holding-registers/{addr}/{cnt}--阅读POST /api/v1/holding-register/{addr}/{data}--单个单词POST /api/v1/holding-registers/{addr}--JSON正文{"data":[…]}
超出配置限制的读/写请求将返回 400输入、线圈和离散的URL模式相同——请参见Swagger。
🤖 MCP(光标和其他)
- 运输: 可流式传输的HTTP,端点
/mcp. - 与REST相同的商店。
- 在工具中,
addr是 协议偏移,而不是40001款式号。
示例 mcp.json (全球 %USERPROFILE%\.cursor\mcp.json 或项目 .cursor/mcp.json):
{
"mcpServers": {
"modbus-tcp-sim": {
"url": "http://127.0.0.1:18081/mcp"
}
}
}与当地 cargo run 没有Docker,通常: http://127.0.0.1:8081/mcp在改变配置之后, 完全重启 光标。
禁用MCP: MCP_SERVER_PORT=0.
⚙️ 环境变量
| 变量 | 默认值 | 描述 |
|---|---|---|
WEB_SERVER_PORT | 9090 | HTTP(REST、Swagger、静态 /ui) |
MB_SERVER_PORT | 502 | Modbus TCP |
MCP_SERVER_PORT | 8081 | 流程内的MCP端口; 0 --不要启动MCP |
MB_MAX_ADDRESS | 65535 | 最大值 协议地址 (含)。窗口 addr … addr + cnt - 1 不得越过此界限。 |
MB_MAX_READ_COUNT | 65535 | 最大值 单词或比特 在一次HTTP读取中,最大 元素 在一批写入正文中。 |
RUST_LOG | (无) | 日志级别,例如。 info |
Modbus客户端: 使用从映射的主机端口 MB_SERVER_PORT (默认值 502).这 **MB_MAX_* 变量适用于 HTTP REST API** (以及web UI调用的内容),而不是内部的原始Modbus TCP帧限制 tokio-modbus.
🔧 故障排除
- 正在使用的端口 --检查
netstat/任务经理;改变-p映射或环境变量。 - MCP在游标中没有响应 --确保URL使用 主机和已发布端口 容器(通常 18081不是8081)。
- UI中的数据为空或错误 -API必须返回 JSON数组;来自代理的HTML不会填充表格。
📦 图像和注册表
- Docker Hub:
allexd2010/modbus-server-sim - 标签:例如。
2.1.1 - 持续集成 (
.github/workflows/ci.yml):在非PR推送上,图像被构建和推送 仅限Docker Hub (:test在树枝上;:latest和:在发布标签上--图像标签是 没有 领先的v例如。2.1.1即使git标签是v2.1.1). 平台: 分支/测试构建linux/amd64仅; 释放标签 添加linux/arm64(多拱形舱单)。设置秘密DOCKERHUB_USERNAME和DOCKERHUB_TOKEN().
🔩 Git:条 Made-with: Cursor 从承诺
该回购提供 commit-msg 钩下 .githooks/ 这会删除以下线条 Made-with: Cursor (因此它们不会存储在历史中)。每个克隆启用一次:
git config core.hooksPath .githooks要关闭挂钩,请执行以下操作: git config --unset core.hooksPath。要从中删除此类线路 过去 提交、使用 git rebase -i / filter-repo (此处未涉及)。
📄 许可证
麻省理工学院
______________________________________________________________________
Documentation · example image tag 2.1.1
