Skip to content

Repository files navigation

楼宇 DDC 控制与能源管理仿真

CI Python License

求职作品集项目 · Windows 10 + Python 3.12 · 仅用免费开源库 numpy / flask / pymodbus, 前端 ECharts(CDN 引入)。

重要声明:本项目全部指标均为「仿真验证值」——受控对象由 RC 热网络模型与水箱 水量平衡模型模拟,无真实传感器与执行器;数值不代表真实工程实测数据。


1. 项目简介

本项目用纯软件方式复现了一套楼宇自控(BA)系统的完整技术栈:

  • 受控对象(plant):3 个房间(办公室/会议室/大堂)的一阶 RC 热网络模型 + 生活水箱液位对象。室温受室外温度日曲线、人员作息热负荷、设备负荷、日照得热、 空调盘管冷量共同影响;
  • DDC 控制器(ddc):按 1 分钟扫描周期运行——空调 PID 控温(±1℃ 死区)、 水箱液位位式控制(带回差)、风机启动联锁顺序(新风阀→延时→风机→水泵)、 防火阀联锁立即停机、工作时间/夜间 setback 时间表、7 类报警队列;
  • 点表与通信(points):按 BA 行业惯例定义 AI/AO/DI/DO 共 20 点中文点表, 经 Modbus/TCP 从站暴露为标准寄存器,可用任意 Modbus 主站工具访问;
  • 监控看板(dashboard):Flask + ECharts 实时大屏——温度趋势(SP 死区阴影带)、 设备状态灯、报警列表、能耗策略对比柱状图、24h 回放滑块、SP 在线修改按钮;
  • 全天测试(run_day.py):快进仿真 1440 分钟 × 2 种策略,自动生成 docs/运行日报.md(舒适满足率/最大偏差/报警/联锁/能耗与节能率)。

🖥️ 全天仿真运行曲线(run_day.py 真实产出,非示意图)

全天室温控制曲线

水箱液位位式控制

复现方式:python run_day.py 跑 1440min×2 策略(seed=2024,逐位可复现),曲线由其落盘的 docs/运行数据_节能开.json 历史数据绘制——三房间室温/SP 与 2326℃ 舒适带、10:00 传感器 故障与 15:00 防火阀联锁注入事件、水箱 1.01.8m 回差充放水循环(进水阀 51 次/天)。 全部指标为仿真验证值。

2. 快速开始

2.1 环境要求

Windows 10/11 + Python 3.12(3.10+ 亦可)。第三方依赖只有三个:

pip install -r requirements.txt
# 即: numpy flask pymodbus (pymodbus 锁定 3.x API)

2.2 一键体验(推荐顺序)

:: ① 全天快进仿真, 自动生成 docs/运行日报.md 与两份历史数据 JSON
python run_day.py

:: ② 启动 Web 监控看板(内置仿真引擎 + Modbus 从站)
python dashboard/app.py
::    浏览器打开 http://127.0.0.1:5000

:: ③ (可选)另开一个终端, 以"上位机"身份对看板内置从站做读写联调
python -m points.modbus_client_test

:: ④ (可选)独立从站演示模式(不启动看板)
python -m points.modbus_slave

2.3 各模块自检脚本

python -m plant.thermal        # RC 热模型自由漂移 48h 观察
python -m plant.water_tank     # 水箱充放水动态
python -m ddc.ddc_controller   # DDC 全链路自测(含点表打印)
python -m energy.analyzer      # 能耗折算数量级验证

3. 目录结构

文件 职责(一句话)
plant/thermal.py 房间 RC 热网络模型:室外日曲线+人员/设备/日照时间表+盘管冷量+测量噪声与故障注入
plant/water_tank.py 水箱液位对象:进水阀充水、出水负载扰动、高低液位硬限位
points/point_defs.py BA 点表定义:AI/AO/DI/DO 中文描述、房间名常量、工程值↔寄存器换算
points/point_bus.py 共享 I/O 映像区 PointBus(线程安全),plant/ddc/dashboard 的数据总线
points/modbus_slave.py Modbus/TCP 从站:把点表暴露为 IR/HR/DI/CO 四区,含独立演示从站入口
points/modbus_client_test.py Modbus 主站自测脚本:读 DI/DO/AI、在线写 SP、切模式、遥控线圈、连续轮询
ddc/pid.py PID 控制算法:位置式 + 抗积分饱和
ddc/alarms.py 报警记录与队列管理:产生(去重)、复位、导出、计数
ddc/interlock.py 风机链路联锁状态机:新风阀→风机→水泵启动顺序与防火阀安全联锁
ddc/ddc_controller.py DDC 主程序:时间表 setback、PID 控温(死区)、水箱位式控制(回差),组合上述模块
energy/analyzer.py 冷量/风机/水泵能耗积分(kWh)与节能开/关两策略对比、节能率计算
run_day.py 全天快进仿真(1440min×2 策略),自动生成 docs/运行日报.md 与 JSON 历史数据
dashboard/app.py Flask 后端:后台仿真线程+HTTP API+Modbus 从站托管
dashboard/templates/index.html ECharts 大屏前端:温度趋势/设备灯/报警列表/能耗对比/回放滑块/SP 按钮
docs/系统设计说明书.md mermaid 架构图、RC 模型原理、回差设计、联锁时序、setback 原理、点表依据
docs/运行日报.md run_day.py 自动生成的全天运行报告(指标=仿真验证值)
resume/项目总结.md 第一人称 600 字项目复盘
resume/简历项目描述.md 简历用项目描述(150 字以内,含量化指标)
docs/面试深挖10问.md 面试官最可能深挖的 10 个问题及回答要点

4. 运行结果指标(均为仿真验证值)

测试条件:步长 1 分钟,快进 1440 分钟;随机种子 seed=2024; 事件注入:10:00 办公室传感器开路故障 8min、15:00 防火阀关闭 12min。 随机种子固定,复跑 python run_day.py 结果逐位一致(完全可复现)。

指标 节能模式开 节能模式关(基准) 说明
办公室舒适区间(23~26℃)满足率 90.7% 95.7% 工作时间 08:00-18:00 统计
会议室舒适区间满足率 94.5% 95.0% 同上
大堂舒适区间满足率 95.2% 95.3% 同上
最大温度偏差 2.67~3.33 K 2.34~2.77 K 偏差集中于注入故障/联锁时段
报警发生次数 2 次 2 次 仅注入事件触发,无误报
防火阀联锁动作次数 1 次 1 次 联锁后 1 个扫描周期完成停机
机组完整启动次数 2 次 2 次 含联锁复位后自动重启
冷量能耗 119.58 kWh 136.45 kWh 盘管冷量积分
输配能耗(风机+水泵) 104.42 kWh 217.73 kWh 风机 P∝f³ 相似定律
总能耗 224.00 kWh 354.18 kWh —
节能量 / 节能率 130.18 kWh / 36.8% — 对比基准工况
水箱液位波动范围 0.94~1.89 m 0.94~1.89 m 回差 1.0~1.8m,瞬时越界见日报
水箱进水阀动作次数 51 次/天 51 次/天 约 25 个充放周期(run_day 实测统计值)

能耗计量口径说明:冷量能耗为热学量 kWh(th)(盘管冷量积分),风机/水泵为 电学量 kWh(e),总能耗为两者同口径直接相加、仅用于两种策略的相对比较 (未做机组 COP 折算),不代表建筑总电耗的绝对值。

4.1 规格之外的自选增强(超出基础规格的追加设计)

以下功能超出原始需求规格,是向真实 BA 工程对齐过程中主动追加的设计, 逐项标注其工程动机:

自选增强 动机(工程价值)
早晨预冷:06:50 启动机组、预冷目标 SP−1℃ 消除上班后负荷爬坡快于调节造成的惯性超温(优化启动策略)
夜间高温保护制冷:PV>29.5℃ 自动投入、SP=28℃,带 1K 停止滞环与最小启/停时间(10/15min) 节能停机与设备/物品安全之间的分级保护;机组级防频繁启停(行业标配 min on/off timer)
报警体系扩至 7 类(新增溢流/低液位/风机故障;高温 5min 去抖+恢复回差) 真实 DDC 报警需要去抖防误报、回差防振荡、覆盖水箱与风机故障
声光报警器 DO5 联动 报警不仅进队列,还要有现场可感知输出
能耗计量加计风机(P∝f³ 相似定律)与水泵输配能耗 只算冷量会低估节能收益——输配能耗恰是 setback 节能大头
看板倍速调节/暂停、手/自动切换按钮 演示可控性:同一套逻辑可在不同时间尺度下观察
看板内置 Modbus 从站(:5020) 浏览器监控与外部主站访问同源数据,通信链路开箱即验
SimTime 值对象、AlarmManager/FanInterlock 独立模块等工程化结构 控制逻辑与基础设施解耦,模块职责单一(详见系统设计说明书)

5. 关于 BACnet 协议(重要说明)

本项目未实现 BACnet 协议,统一以 Modbus/TCP 替代,原因:

  1. BACnet 是楼宇自控行业标准协议(ASHRAE 135),但 Python 生态中 BACnet 协议栈 (BAC0/bacpypes)学习成本高、依赖复杂,不适合作品集项目的快速验证主线;
  2. Modbus/TCP 是工业界最通用的总线协议,pymodbus 成熟稳定,能完整演示 "点表—寄存器映射—主站读写"这条数据链路,教学价值等价;
  3. 本项目的架构关键点是"控制器内部逻辑与通信协议解耦": DDCController 只读写 PointBus(I/O 映像区),协议层只是映像区的对外视图。

真实项目中如何替换为 BACnet(思路已预留):

步骤 做法
① 协议栈替换 pip install BAC0,把 ModbusSlaveServer 替换为 BAC0 的 add_point 注册
② 点类型映射 AI→Analog Input 对象、AO→Analog Output、DI→Binary Input、DO→Binary Output;SP 寄存器→Analog Value 对象(可写)
③ 点表升级 BACnet 支持对象名/单位/描述元数据,把本项目中文字段填入 description 属性即得标准化点表
④ 上位机对接 BAS 平台通过 BACnet/IP (udp/47808) 发现设备(Device Object)并订阅 COV 变化
⑤ 逻辑零改动 PointBus 接口不变,plant/ddc/dashboard 三层代码无需任何修改

6. 常见问题

  • 端口冲突:看板占用 TCP 5000(HTTP)与 5020(Modbus),若被占用请先释放, 或在 dashboard/app.py 与 points/modbus_slave.py 中搜索改端口;
  • 控制台乱码:所有入口脚本已做 UTF-8 输出保护;若仍乱码,执行 chcp 65001 后重试;
  • 看板能耗图为空:先运行一次 python run_day.py 生成 docs/运行数据_节能开.json / 关.json 再启动看板;
  • 机组为什么不再频繁启停?:夜间高温保护为机组级启停滞环——PV>29.5℃ 投入、 <28.5℃ 才停止(1K 滞环),叠加最小运行/停机时间 10/15min;热夜 A/B 对照实测:加滞环后完整启动 18→3 次、高温报警 0 条;
  • 传感器故障时阀门怎么动作?:输出优先级为 安全联锁 > 故障保持 > 调节—— 传感器开路(nan)时阀门保持故障前开度(实测 AO1 保持 61.6%),不误动作; 防火阀关闭联锁窗口则强制 AO1=0 并同拍停机,联锁复位后自动重启;
  • 风机运行中跳闸怎么处理?:运行中检测到 DI3=0 同拍转 STOPPED、DO2/DO3 清零、 报警"紧急停机",恢复后按新风阀→延时→风机→水泵顺序自动重启(实测 startup 1→2)。 该保护目前仅代码级可达(DI3 尚无演示注入入口,见 Roadmap)。

7. Roadmap(真实规划项,均为尚未实现)

以下为真实规划项(DI2 模式反馈同步、断言式冒烟测试 tests/test_smoke.py 已完成,不再列入):

# 规划项 说明
1 DI3/stuck/offset 注入入口 run_day 增加"运行中风机跳闸"演练事件(写总线 DI3),stuck/offset 加 CLI/看板开关,使"运行中跳闸紧急停机"从代码可达变为可演示
2 风机故障限次重启/锁定 FAN_STARTING 失败计数 ≥3 次后锁定并报"需手动复位",对齐真实 DDC 保护惯例(当前为无限重试)
3 断言式冒烟测试 ✅ 已完成 已固化为 tests/test_smoke.py(4 项 pytest,CI 同步执行):断言总能耗 224.00/354.18 kWh、进水阀 51 次、报警 2、联锁 1、完整启动 2、联锁窗口 AO=0,让"逐位可复现"成为可执行保证
4 清理 7 条缓办 P3 优先 P3-8(/api/energy 每秒读盘的看板性能点)与 P3-10(幻影到岗影响夜间负荷真实性)
6 热夜适用范围入档 标注夜间三层保护参数在 t_base≤32℃ 工况验证(夜间 PV 峰值 29.68℃,距 30℃ 报警限裕量 0.32K)
7 能耗口径进阶 引入 COP≈4.5 折算机组电耗或日报分列 kWh(th)/kWh(e),使"节能率"具备可辩护的计量口径

8. 免责声明

  1. 本项目为求职学习用途的教学仿真,全部物理对象、传感器、执行器均为数学模型, 所有指标均为仿真验证值,不可作为任何真实工程的设计、验收或节能承诺依据;
  2. 模型参数(热容、传热系数、负荷曲线、设备功率)取自公开资料的数量级估计, 与具体建筑无关;
  3. 真实楼宇消防联动、防冻保护等安全功能必须采用经过认证的专用设备与逻辑实现, 本项目的联锁代码仅用于演示控制原理;
  4. 使用者以此项目为基础投递求职时,请在面试中如实说明"仿真验证环境"属性—— 这本身即是本项目考察的重点能力之一。

9. 许可证

本项目以 MIT License 发布,版权人 lian-automation(2026)。 请同时遵守第 8 节免责声明:全部指标为仿真验证值,不可作为真实工程的设计、 验收或节能承诺依据。

About

楼宇DDC控制与能源管理仿真:RC热模型+PID/联锁/时间表+Modbus点表,节能率36.8%对照实验

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages