工厂冷却水余热回收经济效益评估系统 —— 基于OOP的工业数据实战
"工厂的冷却水带着 60℃ 的热量排入河道,那不是水,是白白流走的钞票——也是白白排放的 CO₂。"
—— 哈尔滨工程大学《工业过程控制》课程核心思想
一、实际应用场景描述
在石油化工、钢铁、制药、食品饮料等行业,大量工艺过程产生中低温冷却水(40~80℃),传统做法直接排放或经冷却塔降温后循环。但通过板式换热器/热管/ORC 发电等方式,可以将这部分热量回收用于:
- 预热锅炉给水(节煤)
- 厂区供暖/生活热水
- 驱动吸收式制冷机
- 低温发电(ORC 有机朗肯循环)
典型的冷却水余热回收系统:
┌──────────────────────────────────┐
│ DCS / SCADA 系统 │
│ · 流量计 FT-101 (0~300 t/h) │
│ · 进水温度 TI-101 │
│ · 出水温度 TI-102 │
│ · 热网回水温度 TI-103 │
│ · 每1分钟采样一次 │
└──────────────┬───────────────────┘
│
┌──────────────┴───────────────────┐
↓ ↓
┌────────────┐ ┌────────────┐
│ 冷却水入口 │──→ 板式换热器 ──→│ 冷却水出口 │
│ 60℃ │ │ 40℃ │
└────────────┘ └────────────┘
│
↓ 热量传递给热网
┌────────────┐
│ 热网回水 │
│ 45℃ → 65℃ │
└────────────┘
哈尔滨工程大学《工业过程控制》课程(彭秀艳教授主讲,国家级一流本科课程)在第二章"物料与能量衡算"中系统讲解了焓变计算方法,在第六章"控制系统经济指标评估"中介绍了投资回收期、NPV、IRR 等经济评价指标。课程明确指出:
"能量守恒是过程工业的铁律。每一公斤冷却水从 60℃ 降到 40℃,放出的热量是可以精确计算的——问题不在于'有没有热',而在于'回收了多少、值多少钱'。"
二、引入痛点
2.1 现场的真实困境
场景 现场发生了什么 根因
投资审批 "装换热器要 120 万,多久回本?" 没有逐时热量数据支撑测算
节能审计 "这个月回收了多少热?" 只有流量和温度,没人算焓变
碳排放核算 "碳交易要报数据,余热折算多少?" 缺乏标准化折算方法
换热器维护 "效率好像越来越差了" 没有效率趋势追踪
能源报表 "这季度省了多少标煤?" 数据散落在不同系统
2.2 核心矛盾
流量计和温度计每 1 分钟就在采样,但"这 30 天回收了多少热量、值多少钱、减了多少碳"从来没人系统算过。
- 管理层问"余热回收项目赚没赚钱"——没人能拿出按月/按日的精确数字
- 换热器结垢是渐进的——效率从 85% 慢慢降到 60%,半年没人发现
- 碳排放核算季到了——临时翻数据、手工算,容易出错
2.3 我们要解决什么
用一段 Python 程序,读取冷却水系统的历史 CSV 数据,自动完成:
1. 焓变计算 —— Q = m·Cp·ΔT,逐点计算回收热量
2. 效率评估 —— 实际温升 vs 设计温升,量化热交换效率
3. 经济效益 —— 热量收入 − 运行成本 = 净收益,投资回收期
4. 环境效益 —— 等效标煤节省、CO₂ 减排量
5. 趋势分析 —— 小时/日级聚合,定位低效时段
6. 综合仪表盘 —— 效率仪表 + 成本分解 + 5年现金流 + 结论
7. 输出 Excel + CSV + 5 张图表
三、核心逻辑讲解
3.1 理论依据:从能量守恒到经济评价
本工具算法基于哈工程《工业过程控制》第二章"能量衡算" + 第六章"经济指标评估":
① 焓变计算(核心公式)
Q = m \cdot C_p \cdot \Delta T
符号 含义 单位 典型值
Q 回收热量 kJ —
m 质量流量 kg/s 200t/h = 55.6 kg/s
C_p 比热容(水) kJ/(kg·K) 4.18
ΔT 出水−进水 K 20℃
1 GJ = 10⁶ kJ。工业上习惯用 GJ 计量热量。
② 回收效率
\eta = \frac{\Delta T_{actual}}{\Delta T_{design}} \times 100\%
η 评级 含义
≥ 85% A(优秀) 换热器清洁,传热良好
≥ 60% B(良好) 轻微结垢,可接受
≥ 40% C(一般) 明显结垢,建议清洗
< 40% D(较差) 严重结垢或设计缺陷
③ 投资回收期
\text{年净收益} = \text{年热量收入} - \text{年运行成本}
\text{回收期(年)} = \frac{\text{投资成本}}{\text{年净收益}}
课程§6.1强调:回收期不是唯一指标,还要看 NPV 和 IRR。本项目三个都算。
3.2 分析流程图
原始数据 (30天 × 1440点 = 43200条)
timestamp, flow_tph, inlet_temp_c, outlet_temp_c
│
▼
┌──────────────────┐
│ ① 数据加载 + 质量评估 │
│ 编码探测/缺失率/等间隔 │
└────────┬─────────┘
▼
┌──────────────────┐
│ ② 焓变计算 ★ │
│ Q = m·Cp·ΔT │
│ 逐点 → 累加 → GJ │
└────────┬─────────┘
▼
┌────┬────┬────────┐
▼ ▼ ▼ ▼
效率 时段 经济 环境
评估 聚合 效益 折算
│ │ │ │
▼ ▼ ▼ ▼
η等级 小时 收入 CO₂
日 成本 标煤
汇总 NPV/IRR
│ │ │ │
└────┴────┴────────┘
▼
┌──────────────────┐
│ ④ 综合仪表盘 │
│ 效率+成本+现金流 │
│ + 结论 │
└────────┬─────────┘
▼
Excel + CSV + 5张图表
3.3 为什么逐点算而不是总量算?
总量算法 (错误):
总流量 = 200 t/h × 7200 h = 1,440,000 吨/年
平均温升 = 20℃
Q = 1,440,000,000 kg × 4.18 × 20 / 10⁶ = 120,384 GJ
→ 看起来很美, 但忽略了:
· 夜间流量只有白天 30%
· 周末减产 50%
· 每月 2 天检修停机 (流量=0)
· 换热器结垢后温升从 20℃ 降到 14℃
逐点算法 (正确):
每一分钟: Q_i = flow_i × Cp × ΔT_i × dt
→ 自动处理所有变工况
→ 停机时段 Q=0 (自然排除)
→ 结垢时段 Q 自动减少 (趋势可见)
这就是"数据驱动"和"拍脑袋"的区别——逐点算、再聚合,所有变工况自动处理。
四、代码模块化讲解(面向对象设计)
4.1 类结构总览
本项目严格采用面向对象编程(OOP),共设计 6 个核心类 + 3 个不可变数据类:
类名 职责 设计模式
"AppConfig"(聚合根) 聚合 6 个子配置 聚合根模式
"PlantConfig" /
"EnergyConfig" /
"EconomicConfig" 工厂/能量/经济参数 值对象
"AnalysisConfig" /
"DataConfig" /
"OutputConfig" /
"LoggingConfig" 各域参数 值对象
"WasteHeatDataLoader" CSV 加载、编码探测、质量评估 封装
"WasteHeatAnalyzer" ★ 核心分析引擎 模板方法
"ReportGenerator" 多格式报表输出 模板方法
"HeatRecoveryMetrics" /
"EconomicAssessment" /
"EfficiencyAnalysis" 不可变结果对象 值对象模式
4.2 配置层:dataclass + 聚合根
# config_loader.py 核心片段
@dataclass
class EnergyConfig:
"""能量折算参数 —— 值对象 + 内聚计算逻辑"""
reference_fuel: str = "标煤"
reference_fuel_co2_kg_per_kg: float = 2.493
reference_fuel_kj_per_kg: float = 29307.6
def heat_to_co2(self, heat_gj: float) -> float:
"""将回收热量折算为等效 CO₂ 减排量"""
if heat_gj <= 0:
return 0.0
kg_coal = heat_gj * 1e6 / self.reference_fuel_kj_per_kg
return round(kg_coal * self.reference_fuel_co2_kg_per_kg, 2)
def heat_to_coal(self, heat_gj: float) -> float:
"""将回收热量折算为等效标煤节省量 (吨)"""
if heat_gj <= 0:
return 0.0
kg_coal = heat_gj * 1e6 / self.reference_fuel_kj_per_kg
return round(kg_coal / 1000.0, 2)
@dataclass
class EconomicConfig:
"""经济效益参数 —— 值对象 + 内聚判定"""
heat_price_yuan_per_gj: float = 45.0
electricity_price_yuan_per_kwh: float = 0.75
pump_power_kw: float = 22.0
annual_hours: int = 6000
investment_yuan: float = 1200000.0
discount_rate: float = 0.07
def evaluate_payback(self, payback_years: float) -> str:
"""投资回收期评级 —— 逻辑内聚在此"""
if payback_years <= 2.0:
return "A(优秀)"
elif payback_years <= 3.5:
return "B(良好)"
elif payback_years <= 5.0:
return "C(一般)"
else:
return "D(较差)"
@dataclass
class AppConfig:
"""聚合根 —— 持有所有子配置"""
plant: PlantConfig = field(default_factory=PlantConfig)
energy: EnergyConfig = field(default_factory=EnergyConfig)
economic: EconomicConfig = field(default_factory=EconomicConfig)
# ... 其他子配置
@classmethod
def from_yaml(cls, path) -> "AppConfig":
"""工厂方法: YAML → AppConfig"""
if not os.path.exists(path):
print(f" ⚠ 配置文件 {path} 不存在, 使用默认配置")
return cls()
with open(path, "r", encoding="utf-8") as f:
raw = yaml.safe_load(f) or {}
return cls(
plant=PlantConfig(**raw.get("plant", {})),
energy=EnergyConfig(**raw.get("energy", {})),
# ... 其他子配置
)
亮点:
-
"EnergyConfig.heat_to_co2()" 把"热量→碳排放"的折算逻辑内聚在配置对象内部——换能源基准(如从标煤换天然气)只改 YAML 一行
-
"EconomicConfig.evaluate_payback()" 把评级逻辑内聚在此——换行业标准只改一处
-
"AppConfig" 作为聚合根,外部只需持有一个对象
4.3 数据加载层:编码自动探测
# data_loader.py 核心片段
class WasteHeatDataLoader:
"""数据加载器 (封装)"""
@staticmethod
def detect_encoding(filepath: str) -> str:
"""依次尝试常见编码 —— 工业现场刚需"""
candidates = ["utf-8-sig", "utf-8", "gbk", "gb2312", "latin1"]
for enc in candidates:
try:
with open(filepath, "r", encoding=enc) as f:
f.read(2048)
return enc
except (UnicodeDecodeError, OSError):
continue
return "utf-8-sig" # 兜底
4.4 核心算法①:焓变计算(★ 核心公式)
# core_analyzer.py 核心片段
def _compute_heat_recovery(self, df: pd.DataFrame) -> pd.DataFrame:
"""
计算每行的余热回收量
对应课程 §2.2: 能量衡算
公式:
Q(kJ) = flow(kg/s) × Cp(kJ/kg·K) × ΔT(K) × dt(s)
1 GJ = 10⁶ kJ
逐点计算 → 自动处理变工况/停机/结垢
"""
out = df.copy()
# 流量 t/h → kg/s
flow_kg_s = out["flow_tph"] / 3.6
# 采样间隔 (秒)
if "timestamp" in out.columns:
diffs = out["timestamp"].diff().dt.total_seconds()
dt = diffs.fillna(diffs.median()).clip(lower=1.0)
else:
dt = pd.Series([60.0] * len(out), index=out.index)
# 温升 (负值截断为0: 无热交换)
delta_t = (out["outlet_temp_c"] - out["inlet_temp_c"]).clip(lower=0)
# ★ 核心公式
cp = self.cfg.plant.specific_heat_kj_kgk
q_kj = flow_kg_s * cp * delta_t * dt
# 转 GJ
out["heat_kj"] = q_kj
out["heat_gj"] = q_kj * 1e-6
# 理论最大热量 (设计温升)
design_delta = (self.cfg.plant.design_outlet_temp_c
- self.cfg.plant.design_inlet_temp_c)
q_max_kj = flow_kg_s * cp * design_delta * dt
out["heat_max_gj"] = q_max_kj * 1e-6
# 回收效率
out["efficiency"] = np.where(
out["heat_max_gj"] > 0,
out["heat_gj"] / out["heat_max_gj"],
0.0
)
return out
亮点:
- 这是整个项目的灵魂函数——6 行核心代码实现焓变计算
-
"clip(lower=0)" 自动排除"出水 < 进水"的异常时段
- 理论最大值同步计算,为效率评估提供基准
4.5 核心算法②:效率评估
def _analyze_efficiency(self, df: pd.DataFrame) -> EfficiencyAnalysis:
"""
回收效率统计
对应课程 §6.1: 控制性能评估
"""
# 排除停机时段 (流量<5t/h 时效率无意义)
eff = df["efficiency"].replace([np.inf, -np.inf], np.nan)
if "flow_tph" in df.columns:
valid = df["flow_tph"].fillna(0) > 5
eff = eff[valid].dropna()
else:
eff = eff.dropna()
temp_rise = (df["outlet_temp_c"] - df["inlet_temp_c"])
if "flow_tph" in df.columns:
temp_rise = temp_rise[valid].dropna()
avg_eff = eff.mean() if len(eff) > 0 else 0.0
# 效率等级 (课程 §6.1 评价标准)
if avg_eff >= self.cfg.analysis.efficiency_excellent:
grade = "A(优秀)" # ≥85%
elif avg_eff >= self.cfg.analysis.efficiency_warning:
grade = "B(良好)" # ≥60%
elif avg_eff >= 0.4:
grade = "C(一般)"
else:
grade = "D(较差)"
# 低温升事件 (<2℃ → 几乎无热交换)
low_temp = (temp_rise < self.cfg.analysis.temp_drop_threshold_c).sum()
return EfficiencyAnalysis(
overall_efficiency=round(float(avg_eff), 4),
avg_temp_rise_c=round(float(temp_rise.mean()), 4),
max_temp_rise_c=round(float(temp_rise.max()), 4),
min_temp_rise_c=round(float(temp_rise.min()), 4),
efficiency_grade=grade,
low_efficiency_count=int((eff < 0.6).sum()),
temp_drop_events=int(low_temp),
)
4.6 核心算法③:经济效益综合评估
def _compute_economics(self) -> EconomicAssessment:
"""
经济效益计算 (课程 §6.1: 经济指标评估)
年净收益 = 年热量收入 - 年运行成本
回收期 = 投资成本 / 年净收益
NPV(5年) = Σ(年净收益/(1+r)^t) - 投资
"""
ecfg = self.cfg.economic
ncfg = self.cfg.energy
# 汇总 (小时级 metrics)
total_heat = sum(m.total_heat_gj for m in self._metrics)
total_revenue = sum(m.revenue_yuan for m in self._metrics)
total_op_cost = sum(m.operating_cost_yuan for m in self._metrics)
# 折算年运行
n_periods = len(self._metrics) # 小时数
hours_total = max(1, n_periods)
scale = ecfg.annual_hours / hours_total
annual_heat = total_heat * scale
annual_rev = total_revenue * scale
annual_op = total_op_cost * scale
annual_net = annual_rev - annual_op
# 投资回收期
if annual_net > 0:
payback = ecfg.investment_yuan / annual_net
else:
payback = float('inf')
payback_grade = ecfg.evaluate_payback(
payback if payback != float('inf') else 999
)
# 5年 NPV
npv = 0.0
for year in range(1, 6):
npv += annual_net / ((1 + ecfg.discount_rate) ** year)
npv -= ecfg.investment_yuan
# IRR 简化估算
irr_est = (annual_net / ecfg.investment_yuan) * 100 if ecfg.investment_yuan > 0 else 0
return EconomicAssessment(
daily_heat_gj=round(total_heat / max(1, n_periods/24), 2),
annual_heat_gj=round(annual_heat, 2),
daily_revenue_yuan=round(total_revenue / max(1, n_periods/24), 2),
annual_revenue_yuan=round(annual_rev, 2),
annual_operating_cost_yuan=round(annual_op, 2),
annual_net_benefit_yuan=round(annual_net, 2),
investment_yuan=ecfg.investment_yuan,
payback_period_years=round(payback, 2),
payback_grade=payback_grade,
npv_5year_yuan=round(npv, 2),
irr_estimate_pct=round(irr_est, 2),
)
4.7 实际运行输出
$ python main.py --gen-data
============================================================
工厂冷却水余热回收经济效益评估系统 v1.0.0
基于哈尔滨工程大学《工业过程控制》课程理论
(能量衡算 → 余热回收量 → 经济效益评估)
============================================================
📋 配置摘要:
工厂: 某精细化工车间
工艺: 冷却水余热回收
冷却水流量: 200.0 t/h
进水温度: 45.0℃
出水温度: 65.0℃
热价: 45.0 元/GJ
年运行时间: 6000 h
投资成本: 120 万元
能源基准: 标煤 (2.493 kgCO₂/kg)
📊 数据质量评估:
· total_records: 43200
· flow_tph_missing_pct: 0.0000
· median_dt_sec: 60.0000 is_regular: True
· negative_flow_count: 0
· reverse_temp_count: 0
🔍 开始余热回收分析...
📋 分析摘要
─────────────────────────────────────
【回收效率】
平均效率: 68.4% → B(良好)
平均温升: 13.68℃ (范围: 0.0~21.0℃)
低温升事件: 561 次 (<2.0℃)
【热量回收】
日均回收热量: 87.58 GJ
年均可回收热量: 21896.0 GJ
【经济效益】
日均收入: 3941 元
年运行成本: 99000 元
年净收益: 886321 元
投资回收期: 1.35 年 → A(优秀)
5年NPV: 2434092 元
预估IRR: 73.86%
【环境效益】
日均CO₂减排: 7450.2 kg
日均标煤节省: 2.96 吨
年CO₂减排(折算): 2719.3 吨
💡 关键发现:
1. 平均效率68.4% → B级, 有改进空间
2. 低温升事件561次 → 换热器可能结垢
3. 年净收益88.6万元, 回收期1.35年 → 投资回报优秀
4. 年CO₂减排约2719吨 → 碳交易潜在收益
💡 工程建议:
1. 安排换热器清洗 (效率从68%→85%可增收约25%)
2. 回收期<2年, 建议推进二期扩容
3. 关注低温升时段, 排查结垢/流量不足原因
✅ 分析完成! 总耗时: 4.0s
关键成果:
- 效率 68.4% → B(良好) —— 有 25% 提升空间(清洗换热器后可增收)
- 投资回收期 1.35 年 → A(优秀) —— 项目经济性明确
- 5年 NPV 243 万元 —— 远超 120 万投资
- 年 CO₂ 减排 2719 吨 —— 碳交易潜在收益约 16 万元/年
- 561 次低温升事件 —— 自动定位换热器结垢时段
五、README 与使用说明
5.1 项目结构
waste_heat_recovery/
├── config.yaml # 配置文件(改它,不改代码)
├── config_loader.py # 配置加载(dataclass 聚合根)
├── generate_sample_data.py # 模拟数据生成(30天×1440点)
├── data_loader.py # CSV 加载 + 编码探测 + 质量评估
├── core_analyzer.py # ★ 核心分析引擎(模板方法)
├── report_generator.py # 报表生成(Excel/CSV/图表)
├── main.py # 主入口(流程编排)
├── run_test.py # 一键完整性测试
├── requirements.txt # numpy/pandas/matplotlib/pyyaml/openpyxl
├── README.md # 本说明
├── data/ # 输入 CSV(自动创建)
└── output/ # 输出报表(自动创建)
├── waste_heat_report.xlsx # 4 个 Sheet
├── heat_recovery_summary.csv
├── hourly_heat_recovery.csv
└── charts/
├── 01_heat_flow_trend.png
├── 02_efficiency_trend.png
├── 03_daily_heat.png
├── 04_payback_breakdown.png
└── 05_dashboard.png
5.2 三步上手
# 第1步:安装依赖
pip install -r requirements.txt
# 第2步:生成模拟数据(30天,含昼夜周期+周末减产+检修停机+结垢衰减)
python generate_sample_data.py
# 第3步:一键分析
python main.py
5.3 使用你自己的数据
将 SCADA/DCS 导出的数据整理为 CSV:
timestamp,flow_tph,inlet_temp_c,outlet_temp_c
2025-06-01 08:00:00,198.5,48.2,67.8
2025-06-01 08:01:00,201.3,48.5,68.1
放入
"data/cooling_water_log.csv",运行
"python main.py --data data/cooling_water_log.csv" 即可。
支持中文列名——在
"config.yaml" 的
"data.column_mapping" 中修改映射。
5.4 配置文件说明(config.yaml)
plant:
name: "某精细化工车间"
design_flow_tph: 200.0
design_inlet_temp_c: 45.0
design_outlet_temp_c: 65.0
specific_heat_kj_kgk: 4.18
economic:
heat_price_yuan_per_gj: 45.0 # 中压蒸汽市场价
electricity_price_yuan_per_kwh: 0.75
pump_power_kw: 22.0
annual_hours: 6000
investment_yuan: 1200000.0
discount_rate: 0.07
payback_threshold_years: 5.0
5.5 命令行参数
python main.py --config my.yaml # 自定义配置
python main.py --data path.csv # 指定数据文件
python main.py --gen-data # 重新生成模拟数据
python main.py --no-charts # 跳过图表(仅表格)
python main.py -v # 详细调试日志
5.6 输出文件说明
文件 内容
"output/waste_heat_report.xlsx" 4 个 Sheet:总览/小时统计/日统计/配置参数
"output/heat_recovery_summary.csv" 经济效益汇总(日均/年均可回收量、NPV、IRR)
"output/hourly_heat_recovery.csv" 每小时回收热量明细
"output/charts/01_heat_flow_trend.png" ★ 流量+温度+热量综合趋势图
"output/charts/02_efficiency_trend.png" 回收效率趋势(含优秀/预警线)
"output/charts/03_daily_heat.png" 逐日回收热量柱状图
"output/charts/04_payback_breakdown.png" 投资回收分解(成本-收益柱图 + 5年现金流曲线)
"output/charts/05_dashboard.png" 综合仪表盘(效率仪表+温升+回收期+收入结构+结论)
六、核心知识点卡片
📌 卡片1:焓变计算(课程§2.2)
Q = m \cdot C_p \cdot \Delta T
要素 工业常识
水的 Cp ≈ 4.18 kJ/(kg·K) 记住这个数就够了
1 GJ = 10⁶ kJ 工业计量单位
200 t/h × 20℃ → 167 GJ/天 量级估算
📖 参考:《工业过程控制》§2.2 "能量衡算基础"
💡 核心洞察:不用记住公式——记住"每吨水降 1℃ 放出 4.18 MJ"就够了。
📌 卡片2:回收效率的物理含义
\eta = \frac{\Delta T_{actual}}{\Delta T_{design}}
η 物理含义 行动
85%~100% 换热器清洁,传热接近设计 维持
60%~85% 轻微结垢,传热下降 计划清洗
40%~60% 明显结垢 尽快清洗
< 40% 严重结垢/旁通泄漏 立即停机检修
📖 参考:《工业过程控制》§6.1 "控制性能评估指标"
💡 本项目自动追踪效率趋势——从 85% 慢慢降到 68% 的过程,就是结垢的"犯罪证据"。
📌 卡片3:投资回收三指标
指标 公式 本项目结果
回收期 投资 ÷ 年净收益 1.35 年
NPV(5年) Σ净收益折现 − 投资 243 万元
IRR 使 NPV=0 的折现率 73.86%
📖 参考:《工业过程控制》§6.1 "经济评价指标"
💡 三指标要一起看:回收期短但 NPV 负 = 陷阱;IRR 高但绝对值小 = 鸡肋项目。
📌 卡片4:碳排放折算
m_{coal} = \frac{Q_{GJ} \times 10^6}{29307.6} \text{ kg}
m_{CO_2} = m_{coal} \times 2.493 \text{ kg}
本项目结果 数值
日均标煤节省 2.96 吨
年 CO₂ 减排 2719 吨
碳交易潜在收益(60元/吨) 约 16 万元/年
💡 碳交易价格各省不同(40~80 元/吨),这部分收益可以显著缩短回收期。
📌 卡片5:模拟数据的"小心机"
# 周末减产 50%
weekend_factor = np.where(day_of_week >= 5, 0.5, 1.0)
# 每月 2 天检修停机
maintenance = np.where((day_idx%30==10)|(day_idx%30==25), 0.0, 1.0)
# 换热器缓慢结垢 (效率每周降 2%)
fouling = 1.0 - 0.02 * (day_frac / 7.0)
💡 好的模拟数据要"像真的"——有昼夜周期、有周末效应、有渐进衰减。这样才能验证分析程序在真实场景下的表现。
📌 卡片6:OOP设计模式速查
模式 本项目应用 解决的问题
聚合根
"AppConfig" 包含 6 个子配置 外部只需持有一个对象
模板方法
"analyze()" 定义 5 步流程 主流程固定,步骤可替换
值对象
"HeatRecoveryMetrics" 不可变 安全传递、可序列化
策略模式
"EnergyConfig.heat_to_co2()" 换能源基准只改 YAML
工厂方法
"AppConfig.from_yaml()" 封装创建逻辑
封装
"ReportGenerator._draw_*()" 私有 绘图细节对外不可见
七、总结
7.1 本工具做了什么
步骤 内容 对应课程章节
① 配置加载 YAML → dataclass 聚合根 —
② 数据加载 编码自动探测 + 质量评估 §3.1 测量误差
③ 焓变计算 Q = m·Cp·ΔT 逐点计算 §2.2 能量衡算
④ 效率评估 实际温升 / 设计温升 §6.1 性能评估
⑤ 时段聚合 小时/日级统计 —
⑥ 经济效益 收入 − 成本 = 净收益 §6.1 经济指标
⑦ 投资评估 回收期 + NPV + IRR §6.1 投资决策
⑧ 碳排放折算 热量 → 标煤 → CO₂ —
⑨ 综合仪表盘 效率+成本+现金流+结论 —
⑩ 报表输出 Excel(4Sheet)+CSV×2+图表×5 —
7.2 OOP 设计回顾
设计决策 好处 体现的原则
"AppConfig" 聚合根 外部只需持有一个对象 聚合根模式
"EnergyConfig.heat_to_co2()" 内聚折算 换能源基准只改 YAML 单一职责
"HeatRecoveryMetrics" 不可变 安全传递、可序列化 值对象模式
"analyze()" 模板方法 5 步流程固定,步骤可替换 模板方法模式
"ReportGenerator" 多格式输出 新增格式不改流程 开闭原则(OCP)
编码自动探测 不同 SCADA 导出即插即用 鲁棒性设计
逐点焓变再聚合 自动处理变工况/停机 数据驱动思维
7.3 适用与不适用
✅ 适用 ❌ 不适用
冷却水/工艺水余热回收评估 非热交换类节能项目
投资回报测算(IRR/NPV/回收期) 纯理论研究(无真实数据)
换热器结垢趋势监控 非稳态过程(频繁启停)
碳排放核算(标煤/CO₂ 折算) 实时在线优化(需 MPC)
月度/季度能效报告 非水介质(需改 Cp)
7.4 下一步可以做什么
- 接实时数据:用
"opcua" 直读 SCADA,变成在线余热监控看板
- 结垢预测:效率的缓慢下降 → 预测清洗时间窗口
- 多热源整合:多台换热器 → 全厂余热地图
- 碳交易对接:自动生成碳排放核算报告(ISO 14064 格式)
- ORC 发电评估:余热 → 发电量 → 上网电价收益
- 数字孪生:用机理模型生成"理想回收"基准,与实际对比
- 多方案比选:板式换热器 vs 热管 vs ORC,NPV 对比
免责声明:本工具仅用于历史数据的离线分析与趋势预测,不可替代在线能源管理系统的实时决策功能。热量单价、投资成本、折现率、碳价等参数应依据实际情况调整,默认参数仅供参考。模拟数据仅供演示算法流程,实际应用需使用真实 SCADA/DCS 历史数据。
利用AI解决实际问题,如果你觉得这个工具好用,欢迎关注长安牧笛!