求职作品集项目 · Windows 10 + Python 3.12 · 仅用免费开源库 numpy / flask / pymodbus, 前端 ECharts(CDN 引入)。
重要声明:本项目全部指标均为「仿真验证值」——受控对象由 RC 热网络模型与水箱 水量平衡模型模拟,无真实传感器与执行器;数值不代表真实工程实测数据。
本项目用纯软件方式复现了一套楼宇自控(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(舒适满足率/最大偏差/报警/联锁/能耗与节能率)。
复现方式:python run_day.py 跑 1440min×2 策略(seed=2024,逐位可复现),曲线由其落盘的
docs/运行数据_节能开.json 历史数据绘制——三房间室温/SP 与 2326℃ 舒适带、10:00 传感器
故障与 15:00 防火阀联锁注入事件、水箱 1.01.8m 回差充放水循环(进水阀 51 次/天)。
全部指标为仿真验证值。
Windows 10/11 + Python 3.12(3.10+ 亦可)。第三方依赖只有三个:
pip install -r requirements.txt
# 即: numpy flask pymodbus (pymodbus 锁定 3.x API):: ① 全天快进仿真, 自动生成 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_slavepython -m plant.thermal # RC 热模型自由漂移 48h 观察
python -m plant.water_tank # 水箱充放水动态
python -m ddc.ddc_controller # DDC 全链路自测(含点表打印)
python -m energy.analyzer # 能耗折算数量级验证| 文件 | 职责(一句话) |
|---|---|
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 个问题及回答要点 |
测试条件:步长 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 折算),不代表建筑总电耗的绝对值。
以下功能超出原始需求规格,是向真实 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 独立模块等工程化结构 | 控制逻辑与基础设施解耦,模块职责单一(详见系统设计说明书) |
本项目未实现 BACnet 协议,统一以 Modbus/TCP 替代,原因:
- BACnet 是楼宇自控行业标准协议(ASHRAE 135),但 Python 生态中 BACnet 协议栈 (BAC0/bacpypes)学习成本高、依赖复杂,不适合作品集项目的快速验证主线;
- Modbus/TCP 是工业界最通用的总线协议,pymodbus 成熟稳定,能完整演示 "点表—寄存器映射—主站读写"这条数据链路,教学价值等价;
- 本项目的架构关键点是"控制器内部逻辑与通信协议解耦":
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 三层代码无需任何修改 |
- 端口冲突:看板占用 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)。
以下为真实规划项(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),使"节能率"具备可辩护的计量口径 |
- 本项目为求职学习用途的教学仿真,全部物理对象、传感器、执行器均为数学模型, 所有指标均为仿真验证值,不可作为任何真实工程的设计、验收或节能承诺依据;
- 模型参数(热容、传热系数、负荷曲线、设备功率)取自公开资料的数量级估计, 与具体建筑无关;
- 真实楼宇消防联动、防冻保护等安全功能必须采用经过认证的专用设备与逻辑实现, 本项目的联锁代码仅用于演示控制原理;
- 使用者以此项目为基础投递求职时,请在面试中如实说明"仿真验证环境"属性—— 这本身即是本项目考察的重点能力之一。
本项目以 MIT License 发布,版权人 lian-automation(2026)。 请同时遵守第 8 节免责声明:全部指标为仿真验证值,不可作为真实工程的设计、 验收或节能承诺依据。

