# modbusrust **Repository Path**: zhongjack/modbusrust ## Basic Information - **Project Name**: modbusrust - **Description**: No description available - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2025-09-07 - **Last Updated**: 2025-09-07 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # Modbus数据采集与写入处理系统 这是一个基于Rust实现的工业物联网Modbus数据采集系统,支持TCP和RTU协议,提供RESTful API和WebSocket实时数据推送。 ## 功能特性 - **配置化采集**: 通过Excel配置文件定义设备连接和采集点位 - **多协议支持**: 支持Modbus TCP和RTU协议 - **实时数据**: WebSocket实时数据推送 - **历史存储**: 可选的持久化历史数据存储 - **写入控制**: 安全的Modbus写入操作,支持权限控制 - **热加载**: 配置文件修改后自动重新加载 - **RESTful API**: 完整的HTTP API接口 ## 系统架构 ``` +-----------------------+ | 上层应用系统 | (SCADA, MES, IoT Platform) | (通过API获取数据/下发指令) | +-----------|-----------+ | (RESTful API / WebSocket / MQTT) +-----------|-----------+ | 数据采集与服务层 | | - RESTful API | | - 数据发布服务(WebSocket) | | - 数据处理与缓存 | +-----------|-----------+ | +-----------|-----------+ | 任务调度层 | | - 采集任务管理器 | | - 指令下发队列 | +-----------|-----------+ | +-----------|-----------+ | 数据采集层 | | - Modbus TCP 采集器 | | - Modbus RTU 采集器 | | - 协议转换引擎 | +-----------|-----------+ | +-----------|-----------+ | 配置中心层 | | - Excel配置解析器 | | - 配置管理与热加载 | +-----------|-----------+ | +------------------------+ | 设备层 | | - PLC、传感器、电表等 | | (Modbus TCP/RTU设备) | +------------------------+ ``` ## 快速开始 ### 1. 准备配置文件 系统需要一个名为 `config.xlsx` 的Excel配置文件,包含以下三个工作表: #### Device(设备连接表) | device_id | device_name | protocol | connection | slave_id | timeout | interval | enable | |-----------|-------------|----------|------------|----------|---------|----------|--------| | PLC_001 | 一号产线PLC | MODBUS_TCP | 192.168.1.100:502 | 1 | 3000 | 5000 | TRUE | | RTU_001 | 传感器模块 | MODBUS_RTU | COM1:9600,8,N,1 | 2 | 3000 | 2000 | TRUE | #### Point(采集点位表) | point_id | device_id | name | address | type | operation | byte_order | is_historical | is_monitored | |----------|-----------|------|---------|------|-----------|------------|---------------|--------------| | TEMP_101 | PLC_001 | 反应釜温度 | 40001 | INT16 | *0.1 | ABCD | TRUE | TRUE | | PRESSURE_102 | PLC_001 | 系统压力 | 40002 | UINT16 | /10 | ABCD | TRUE | TRUE | | FLOW_103 | RTU_001 | 流量计读数 | 30001 | FLOAT32 | | ABCD | TRUE | FALSE | #### Write(写入点位表,可选) | point_id | write_function | access_level | min_value | max_value | |----------|----------------|--------------|-----------|-----------| | VALVE_201 | 06 | admin | 0 | 100 | | SETPOINT_202 | 06 | operator | -50 | 200 | ### 2. 编译运行 ```bash # 编译项目 cargo build --release # 运行系统 cargo run ``` ### 3. 访问API 系统启动后,可以通过以下接口访问: - **健康检查**: GET http://localhost:8080/health - **设备列表**: GET http://localhost:8080/api/devices - **实时数据**: GET http://localhost:8080/api/points - **WebSocket**: ws://localhost:8080/ws ## API文档 ### 设备管理 - `GET /api/devices` - 获取所有设备列表 - `GET /api/devices/{device_id}` - 获取特定设备信息 - `GET /api/devices/{device_id}/data` - 获取设备的最新数据 ### 数据点管理 - `GET /api/points` - 获取所有数据点(支持分页和过滤) - `GET /api/points/{point_id}` - 获取特定数据点 - `GET /api/points/{point_id}/history` - 获取历史数据 ### 写入操作 - `POST /api/write` - 写入数据点值 请求体示例: ```json { "point_id": "VALVE_201", "value": 75.5, "auth_token": "your_auth_token" } ``` ### 系统状态 - `GET /api/system/status` - 获取系统运行状态 ### WebSocket实时数据 连接到 `ws://localhost:8080/ws` 可以接收实时数据更新: ```json { "type": "data_update", "data": { "point_id": "TEMP_101", "device_id": "PLC_001", "name": "反应釜温度", "value": 25.3, "timestamp": "2023-12-07T10:30:00Z", "quality": "Good" } } ``` ## 配置说明 ### 设备配置(Device表) - **device_id**: 设备唯一标识符 - **device_name**: 设备描述名称 - **protocol**: 协议类型(MODBUS_TCP 或 MODBUS_RTU) - **connection**: 连接字符串 - TCP格式: `IP:Port` (如: 192.168.1.100:502) - RTU格式: `COM端口:波特率,数据位,校验位,停止位` (如: COM1:9600,8,N,1) - **slave_id**: Modbus从站地址 - **timeout**: 通信超时时间(毫秒) - **interval**: 采集周期(毫秒) - **enable**: 是否启用该设备 ### 点位配置(Point表) - **point_id**: 点位全局唯一标识 - **device_id**: 关联的设备ID - **name**: 点位名称 - **address**: Modbus地址 - 线圈: 1-65536 - 离散输入: 100001-165536 - 输入寄存器: 300001-365536 - 保持寄存器: 400001-465536 - **type**: 数据类型(INT16, UINT16, INT32, UINT32, FLOAT32, FLOAT64, BOOL) - **operation**: 数值转换操作(如: *0.1, /10, x*2+10) - **byte_order**: 字节序(ABCD, DCBA, BADC, CDAB) - **is_historical**: 是否存储历史数据 - **is_monitored**: 是否实时推送 ### 写入配置(Write表) - **point_id**: 对应的点位ID - **write_function**: 写入功能码(05, 06, 0F, 10) - **access_level**: 访问权限级别 - **min_value**: 最小允许值 - **max_value**: 最大允许值 ## 数据类型和操作 ### 支持的数据类型 - **BOOL**: 布尔值(1位) - **INT16**: 有符号16位整数 - **UINT16**: 无符号16位整数 - **INT32**: 有符号32位整数(2个寄存器) - **UINT32**: 无符号32位整数(2个寄存器) - **FLOAT32**: 32位浮点数(2个寄存器) - **FLOAT64**: 64位浮点数(4个寄存器) ### 数值操作表达式 - 简单操作: `*0.1`, `/10`, `+273.15`, `-32` - 复杂表达式: `x*0.1+273.15`, `x/10-5` ### 字节序说明 对于多寄存器数据类型(32位和64位): - **ABCD**: 大端字节序(高字节在前) - **DCBA**: 小端字节序(低字节在前) - **BADC**: 字节交换 - **CDAB**: 字节对交换 ## 部署和监控 ### 日志配置 系统使用 `tracing` 库进行日志记录,默认级别为INFO。可以通过环境变量调整: ```bash RUST_LOG=debug cargo run # 启用调试日志 ``` ### 数据存储 - **内存缓存**: 存储最新数据,支持快速查询 - **持久化存储**: 可选的历史数据存储(基于Sled嵌入式数据库) 数据文件默认存储在 `data/` 目录下。 ### 性能调优 - 调整采集间隔以平衡实时性和系统负载 - 使用合适的超时设置避免阻塞 - 启用持久化存储时注意磁盘空间管理 ## 故障排除 ### 常见问题 1. **连接失败** - 检查网络连接和设备地址 - 验证Modbus从站地址 - 确认超时设置合理 2. **数据解析错误** - 检查数据类型配置 - 验证字节序设置 - 确认寄存器地址正确 3. **写入失败** - 检查写入权限配置 - 验证数值范围 - 确认设备支持写入操作 ### 日志分析 关键日志信息: - 设备连接状态 - 数据采集统计 - 写入操作结果 - 配置重载事件 ## 扩展开发 系统采用模块化设计,支持以下扩展: - 新的通信协议支持 - 自定义数据处理算法 - 第三方系统集成 - 高级权限管理 ## 许可证 MIT License - 详见 LICENSE 文件 ## 技术支持 如有问题,请创建GitHub Issue或联系开发团队。