# 基于C++Qt多回路电力仪表监控系统 **Repository Path**: suyu1314/QModbusPowerCloud ## Basic Information - **Project Name**: 基于C++Qt多回路电力仪表监控系统 - **Description**: 智慧配电云 - 多回路电力仪表监控系统。基于Qt/C++开发,支持120块施耐德PM2220仪表的实时监控、历史查询、报警推送和断点续传功能。采用Modbus RTU通信 + SQLite存储 + 巴法云TCP推送架构。 - **Primary Language**: Unknown - **License**: MIT - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 2 - **Forks**: 0 - **Created**: 2025-10-16 - **Last Updated**: 2026-04-20 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 智慧配电云监控系统 (QModbusPowerCloud) [![Qt](https://img.shields.io/badge/Qt-6.x%20%7C%205.15-green.svg)](https://www.qt.io/) [![CMake](https://img.shields.io/badge/CMake-3.16+-blue.svg)](https://cmake.org/) [![License](https://img.shields.io/badge/License-MIT-yellow.svg)](LICENSE) ## 📋 项目简介 智慧配电云监控系统是一个基于 Qt 的多回路电力仪表监控系统,用于监控 3 个配电室共 120 块施耐德 PM2220 电表。系统实现了实时监控、历史查询、报警推送和断点续传等功能。 ### 主要特性 - ⚡ **实时监控**:500ms 轮询周期,实时显示电压、电流等参数 - 📊 **数据可视化**:Qt Quick 现代化界面,实时曲线显示 - 💾 **历史存储**:SQLite 数据库,支持 1 年历史数据查询 - 🔔 **智能报警**:电压跌落、过流等异常自动报警 - ☁️ **云端推送**:巴法云 TCP 协议,支持远程监控 - 🔄 **断点续传**:网络中断后自动补全缺失数据 - 🔍 **自动识别**:自动扫描并识别在线设备 ## 🏗️ 系统架构 ``` ┌───────────────────────────────────────────────────────────┐ │ UI 层 │ Qt Quick 2 仪表盘、实时曲线、报警弹窗 │ ├───────────────────────────────────────────────────────────┤ │ 业务层 │ DeviceManager / MeterModel / AlarmEngine │ ├───────────────────────────────────────────────────────────┤ │ 链路层 │ ModbusRtuMaster(QSerialBus) + 总线调度线程 │ ├───────────────────────────────────────────────────────────┤ │ 持久层 │ SQLite + QtSql + 缓存队列(掉电续传) │ └───────────────────────────────────────────────────────────┘ ``` ## 📁 项目结构 ``` QModbusPowerCloud/ ├─ app/ # 应用程序 │ ├─ main.cpp # 程序入口 │ ├─ CMakeLists.txt # App CMake 配置 │ └─ qml/ # QML 界面文件 │ ├─ main.qml # 主界面 │ ├─ resources.qrc # 资源文件 │ ├─ components/ # 可复用组件 │ │ ├─ AlarmDialog.qml # 报警弹窗 │ │ ├─ MeterCard.qml # 仪表卡片 │ │ ├─ MeterChart.qml # 仪表图表 │ │ └─ BusConfigCard.qml # 总线配置卡片 │ └─ pages/ # 页面 │ ├─ DashboardPage.qml # 仪表盘页面 │ ├─ MeterListPage.qml # 仪表列表页面 │ ├─ MeterDetailPage.qml # 仪表详情页面 │ ├─ HistoryPage.qml # 历史数据页面 │ ├─ AlarmRecordPage.qml # 报警记录页面 │ ├─ SettingsPage.qml # 系统设置页面 │ └─ AboutPage.qml # 关于页面 ├─ src/ # 源代码 │ ├─ CMakeLists.txt # 源代码 CMake 配置 │ ├─ core/ # 核心业务逻辑 │ │ ├─ meter.h/cpp # 仪表类 │ │ ├─ devicemanager.h/cpp # 设备管理器 │ │ └─ alarmengine.h/cpp # 报警引擎 │ ├─ io/ # 输入输出 │ │ ├─ modbusmaster.h/cpp # Modbus 主站 │ │ ├─ serialportmanager.h/cpp # 串口管理 │ │ ├─ pollscheduler.h/cpp # 轮询调度器 │ │ └─ bemfaclient.h/cpp # 巴法云客户端 │ ├─ model/ # 数据模型 │ │ ├─ metermodel.h/cpp # 仪表数据模型 │ │ ├─ alarmmodel.h/cpp # 报警模型 │ │ └─ historydatabridge.h/cpp # 历史数据桥接 │ ├─ database/ # 数据库 │ │ ├─ dbmanager.h/cpp # 数据库管理 │ │ ├─ dataqueue.h/cpp # 缓存队列 │ │ └─ datamaintenance.h/cpp # 数据维护(清理与归档) │ └─ utils/ # 工具类 │ ├─ logger.h/cpp # 日志工具 │ ├─ config.h/cpp # 配置管理 │ └─ settingsmanager.h/cpp # 设置管理器 ├─ tests/ # 单元测试与演示程序 │ ├─ CMakeLists.txt # 测试 CMake 配置 │ ├─ test_modbus.cpp # Modbus 单元测试 │ ├─ test_database.cpp # 数据库单元测试 │ ├─ test_bemfaclient_protocol.cpp # 巴法云协议测试 │ ├─ demo_modbus_usage.cpp # Modbus 演示程序 │ ├─ demo_devicemanager_usage.cpp # 设备管理器演示 │ ├─ demo_alarmengine_usage.cpp # 报警引擎演示 │ ├─ demo_bemfaclient_usage.cpp # 巴法云客户端演示 │ └─ modbus_slave_simulator.cpp # Modbus 从站模拟器 ├─ config/ # 配置文件 │ └─ settings.ini # 系统配置 ├─ data/ # 数据目录 │ ├─ powercloud.db # SQLite 数据库(运行时生成) │ └─ powercloud_test.db # 测试数据库 ├─ logs/ # 日志目录 │ └─ powercloud.log # 应用日志(运行时生成) ├─ doc/ # 文档 │ ├─ 项目文档-智慧配电云.md │ ├─ 系统交互流程详解.md │ ├─ 巴法云TCP协议通信文档.md │ ├─ Modbus_RTU通信层实现文档.md │ ├─ BemfaClient优化总结.md │ ├─ 系统设置界面设计文档.md │ ├─ 系统设置后端实现总结.md │ └─ 项目开发周期计划.md ├─ build/ # 构建目录(运行时生成) ├─ CMakeLists.txt # 根 CMake 配置 ├─ LICENSE # MIT 许可证 └─ README.md # 本文件 ``` ## 🚀 快速开始 ### 环境要求 - **Qt**: 5.15+ 或 6.x - **CMake**: 3.16+ - **编译器**: - Windows: MSVC 2019+ 或 MinGW - Linux: GCC 7+ 或 Clang 5+ - macOS: Xcode 10+ ### 依赖模块 - Qt Core - 核心功能 - Qt Gui - GUI 基础 - Qt Quick - QML 界面引擎 - Qt Sql - SQLite 数据库支持 - Qt SerialBus - Modbus RTU 通信 - Qt SerialPort - 串口通信 - Qt Network - TCP 网络通信(巴法云) - Qt Charts - 实时曲线图表 ### 编译步骤 #### Windows (Visual Studio) ```bash # 1. 克隆项目 git clone https://github.com/yourusername/QModbusPowerCloud.git cd QModbusPowerCloud # 2. 创建构建目录 mkdir build cd build # 3. 配置 CMake(指定 Qt 路径) cmake .. -DCMAKE_PREFIX_PATH="C:/Qt/6.5.0/msvc2019_64" # 4. 编译 cmake --build . --config Release # 5. 运行 cd bin ./QModbusPowerCloud.exe ``` #### Linux ```bash # 1. 安装依赖 sudo apt-get install qt6-base-dev qt6-serialbus-dev qt6-serialport-dev # 2. 克隆项目 git clone https://github.com/yourusername/QModbusPowerCloud.git cd QModbusPowerCloud # 3. 编译 mkdir build && cd build cmake .. make -j4 # 4. 运行 ./bin/QModbusPowerCloud ``` #### Qt Creator 1. 打开 Qt Creator 2. 选择 `文件` -> `打开文件或项目` 3. 选择 `CMakeLists.txt` 4. 配置 Kit(选择合适的 Qt 版本) 5. 点击 `构建` -> `构建项目` 6. 点击 `运行` ## ⚙️ 配置说明 编辑 `config/settings.ini` 文件进行系统配置: ### 串口配置 ```ini [Serial] # 3个配电室对应的串口号(主站连接端口) Port1=COM1 # 配电室 A Port2=COM3 # 配电室 B Port3=COM5 # 配电室 C # 串口通信参数 BaudRate=115200 DataBits=8 Parity=None StopBits=1 ``` ### Modbus 配置 ```ini [Modbus] Timeout=1000 # 超时时间(毫秒) Retries=3 # 重试次数 PollInterval=500 # 轮询间隔(毫秒) StartAddress=1 # 起始站号 EndAddress=120 # 结束站号 ``` ### 巴法云配置 ```ini [Bemfa] # 是否启用巴法云推送 Enabled=true # 巴法云服务器地址 Host=bemfa.com Port=8344 # 用户私钥(从巴法云控制台获取) Uid=your_uid_here # 主题配置(按配电室分配) Topic1=powercloud001 # 配电室 A Topic2=powercloud002 # 配电室 B Topic3=powercloud003 # 配电室 C # 推送间隔配置 HeartbeatInterval=60 # 心跳间隔(秒) DataPushInterval=60 # 汇总数据推送间隔(秒) FullDataUploadInterval=300 # 全量数据上传间隔(秒) ``` ### 报警配置 ```ini [Alarm] Enabled=true VoltageMin=200.0 # 最低电压(V) VoltageMax=240.0 # 最高电压(V) CurrentMax=30.0 # 最大电流(A) ``` ## 📊 硬件连接 ### 设备清单 - **电表**: 施耐德 PM2220 × 120 - **转换器**: USB-RS485 × 3 - **供电**: DC 24V(已具备) ### 连接拓扑 ``` 配电室 A: COM1 ─┬─ 站号 1 ├─ 站号 2 ├─ ... └─ 站号 40 配电室 B: COM3 ─┬─ 站号 41 ├─ 站号 42 ├─ ... └─ 站号 80 配电室 C: COM5 ─┬─ 站号 81 ├─ 站号 82 ├─ ... └─ 站号 120 ``` ### 通信参数 - **协议**: Modbus RTU - **波特率**: 115200 - **数据位**: 8 - **校验位**: None - **停止位**: 1 ## 📈 功能模块 ### 1. 实时监控 - 每 500ms 轮询一次 - 3 条总线并行工作 - 实时显示电压(Ua、Ub、Uc)和电流(Ia、Ib、Ic) ### 2. 历史查询 - 每 5 分钟自动保存数据 - 支持时间范围查询 - 支持数据导出(CSV、Excel) ### 3. 报警系统 - 电压跌落检测 - 过流检测 - 本地弹窗 + 云端推送 - 报警记录可追溯 ### 4. 断点续传 - 自动检测数据缺口 - 网络恢复后自动补采 - 确保数据完整性 ## 🧪 测试 项目提供了完整的单元测试和演示程序,帮助验证各模块功能。 ### 单元测试 ```bash # 运行所有测试 cd build ctest # 运行特定测试 ./bin/test_modbus # Modbus RTU 通信测试 ./bin/test_database # 数据库操作测试 ./bin/test_bemfaclient_protocol # 巴法云协议测试 ``` ### 演示程序 ```bash # Modbus 通信演示(支持扫描设备) ./bin/demo_modbus # 设备管理器演示(自动识别在线设备) ./bin/demo_devicemanager # 报警引擎演示(测试报警规则) ./bin/demo_alarmengine # 巴法云客户端演示(TCP 连接与推送) ./bin/demo_bemfaclient # Modbus 从站模拟器(模拟 PM2220 电表) ./bin/modbus_slave_simulator ``` ### 测试说明 - **test_modbus.cpp**: 测试 Modbus RTU 读写、CRC 校验、超时重试等功能 - **test_database.cpp**: 测试数据库 CRUD 操作、历史数据查询、缓存队列等 - **test_bemfaclient_protocol.cpp**: 测试巴法云 TCP 协议的心跳、订阅、推送等 - **demo_modbus_usage.cpp**: 演示如何使用 ModbusMaster 类进行设备扫描和数据读取 - **demo_devicemanager_usage.cpp**: 演示设备管理器的自动识别和轮询功能 - **demo_alarmengine_usage.cpp**: 演示报警引擎的规则配置和触发机制 - **demo_bemfaclient_usage.cpp**: 演示巴法云客户端的连接、订阅和数据推送 - **modbus_slave_simulator.cpp**: 模拟 PM2220 电表响应,用于无硬件测试 ## 📝 开发计划 详见 [项目开发周期计划.md](doc/项目开发周期计划.md) - [x] 第 1 周:项目搭建与基础框架 - [ ] 第 2 周:Modbus RTU 通信层 - [ ] 第 3 周:数据模型与设备管理 - [ ] 第 4 周:数据库与持久化 - [ ] 第 5 周:报警引擎 - [ ] 第 6 周:巴法云 TCP 推送 - [ ] 第 7-8 周:UI 界面开发 - [ ] 第 9 周:集成测试与优化 - [ ] 第 10 周:部署与验收 ## 📖 文档 - [项目文档](doc/项目文档-智慧配电云.md) - [系统交互流程详解](doc/系统交互流程详解.md) - [巴法云TCP协议通信文档](doc/巴法云TCP协议通信文档.md) ## 🎯 验收标准 1. **实时性**: 实时刷新延迟 < 1 秒 2. **查询性能**: 历史 1 年数据查询 < 3 秒 3. **断点续传**: 拔掉 RS485 线 10 分钟,插回后 30 秒内自动补全缺口数据 ## 🔧 故障排查 ### 串口无法打开 - 检查串口是否被其他程序占用 - 确认 USB-RS485 驱动已安装 - 检查 `config/settings.ini` 中的串口配置 ### 无法连接电表 - 检查 RS485 线路连接 - 确认电表站号配置正确 - 使用 Modbus 调试工具测试连接 ### 数据库错误 - 确保 `data/` 目录存在且有写权限 - 检查磁盘空间是否充足 - 查看日志文件获取详细错误信息 ## 🤝 贡献 欢迎提交 Issue 和 Pull Request! ## 📄 许可证 本项目采用 MIT 许可证,详见 [LICENSE](LICENSE) 文件。 ## 👥 作者 - **开发者**: C/C++练习生 - **邮箱**: 1643689728@qq.com ## 🙏 致谢 - [Qt](https://www.qt.io/) - 跨平台应用开发框架 - [施耐德电气](https://www.schneider-electric.com/) - PM2220 电表 - [巴法云](https://bemfa.com/) - 物联网云平台 --- **注意**: 本项目仅供学习和研究使用,商业使用请联系作者获取授权。