年后帮某园区做微电网运行优化园区里摆着一台2MW内燃机CHP、一台500kW电锅炉、两台燃气热水锅炉还配了1MWh储能。这套系统最初是各管各的CHP由动力车间按固定排班启停电锅炉只在夜间谷电时段手动投运调度员凭经验看天气决定开几台锅炉。我们做的最重要一件事不是加设备而是把电锅炉和CHP的调度逻辑统一写进一个优化程序里用代码替代人工经验让热负荷跟着电价走让发电跟着热需求走。结果很直接一个取暖季下来购电成本下降了三成多天然气综合单耗也明显降低。这篇文章就把这套省钱密码完整拆开讲。1. 为什么电锅炉和CHP必须放在同一个优化模型里1.1 热电联产的两张皮问题先说说很多微电网项目的通病。CHP热电联产这个东西本质上是一石二鸟的设备烧天然气发电同时把缸套水和烟气余热回收下来供热。听起来很美好但在实际运行里它的热电比是强耦合的。以我们用的内燃机为例发电效率42%热效率47%也就是说每发1度电必然同时产出约1.12度电当量的热。这个热不是你想不要就能不要的发动机冷却水温度到了就得排出去不然设备超温报警只能通过散热器白白放掉。电锅炉恰恰相反它是纯耗电设备效率又很高热效率能做到98%左右相当于把电能几乎一比一变成热能。它的灵活性在于完全跟随电价走。电价便宜的时候多开电价贵的时候少开甚至不开。但问题是电锅炉本身不发电多用电就意味着要从电网多买电。这两类设备单独看都有自己的最优运行点但放在微电网里就产生了冲突如果让CHP满发去满足电负荷热可能过剩如果让电锅炉满发去满足热负荷电又可能不够。传统做法是各自优化最后靠人拍脑袋协调结果往往是CHP在谷时段还在发电因为排班表没改电锅炉在峰时段被迫启动因为热不够了两边的账本单独看都合理放到园区总账上看全是浪费。1.2 各自优化的账本为什么是错的我举一个实际观察到的案例。园区里CHP的启停逻辑是早上七点开机晚上十点关机理由是白天电负荷高发电自用能省电费。这个逻辑单独看没什么问题因为白天工业电价确实贵。但问题出在热侧晚上十点关机之后热负荷还在园区值班宿舍、办公区保温都需要热水余热没了只能靠燃气锅炉补热等于把CHP夜里本来可以免费带出的热全部浪费掉了。更极端的情况是冬季午间。白天热负荷并不低CHP满发产热2.2MW热负荷可能只有1.5MW多余的热全从散热器排掉了。而同一时刻电锅炉因为峰电价太贵这个理由被严禁开启燃气锅炉却在拼命烧气供热。我当时的反应是这不是设备问题是认知问题——大家只盯着各自的电费单和气费单没有一个人把电和热放在一张资产负债表里看。所以第一件事就是要建立一个热电联合的优化思路把CHP的发电、产热、燃料消耗电锅炉的耗电、产热以及电网购电、燃气锅炉补热全都放进同一个模型。目标只有一个让整个微电网的综合运行成本最低而不是让任何一个设备的单项指标最优。2. 核心调度逻辑先算清边际成本再谈代码2.1 目标函数微电网运行成本怎么定义优化模型的目标函数其实不复杂就是把一个调度周期内所有设备的运行成本加总总成本 电网购电费用 - 上网售电收益如果有 CHP燃料费用 燃气锅炉燃料费用 电锅炉购电费用已经包含在购电里 设备启停惩罚其中最关键的是CHP燃料费用计算。天然气热值按9.7kWh/Nm³算假设天然气价格2.8元/Nm³CHP发电效率42%那么CHP每发1度电消耗的燃料成本是燃料成本 2.8 / (9.7 × 0.42) ≈ 0.69元/kWh这个0.69元/kWh就是CHP的纯发电燃料成本。但注意CHP发这1度电的同时还产出了约1.12kWh的热。如果这部分热被利用了它的价值就不能忽略。所以在目标函数里不能简单把CHP当成一个发电成本0.69元的电源而要把它看成发电供热的联合体用热收益去对冲发电成本。电锅炉的成本更直接每产生1kWh热需要消耗约1/0.98 ≈ 1.02kWh的电。所以电锅炉的单位热成本 当时的电价 × 1.02。这就非常依赖电价曲线。2.2 临界价格判据什么时候开CHP、什么时候用电锅炉蓄热有了这两个成本概念调度逻辑就变得异常清晰。我做了一张简单的对照表把各种供热方式在典型电价下的单位热成本拉出来比较供热方式单位热成本元/kWh备注CHP产热峰时发电约-0.24发电收益大于燃料成本时热是负成本CHP产热平时发电约0.33发电收益略小于燃料成本热基本白送燃气锅炉约0.32气价2.8元/Nm³热效率90%电锅炉谷电0.30元约0.31谷时电价下持平燃气锅炉电锅炉平电0.60元约0.61明显贵于燃气锅炉电锅炉峰电0.95元约0.97最贵应尽量避免这张表说明了一个反直觉的结论峰时段电锅炉应该完全停机热负荷尽量由CHP承担因为CHP发出来的电自用抵消了峰时购电热相当于白送甚至倒贴。谷时段则相反CHP停机电锅炉全力蓄热因为谷电制热比烧天然气还便宜一点点更比峰时便宜一大截。所以要判断要不要开CHP有一个很实用的临界公式。假设CHP发1kWh电、同时产1.12kWh热燃料成本0.69元。替代的东西是1kWh电网购电电价P 1.12kWh燃气锅炉供热单位成本0.32元合计0.36元。那么开CHP的净收益 P 0.36 - 0.69 P - 0.33。只要电价P大于0.33元/kWh开CHP就是赚的哪怕热侧暂时用不完要散热只要电侧节省的电费超过燃料成本依然值得。这就是整个微电网调度的省钱密码电价等于0.33元是一个分水岭。高于它让CHP尽量多发电、顺带供热低于它让CHP停机改由电锅炉谷电蓄热或燃气锅炉供热。2.3 设备约束比数学公式更卡脖子的因素有了成本判据只是第一步真正让优化代码落地的是一大堆工程约束。这些约束不写进模型算出来的调度方案就是废纸。首先要处理的是设备运行范围。CHP不是你想发500kW就发500kW内燃机在低负荷区间效率暴跌通常有最低稳定出力比如30%额定功率600kW。低于这个值要么停机要么并网空转。电锅炉也有最小出力限制尤其是电极式锅炉频繁启停对电极寿命有明显影响所以宜加入最小连续运行时间约束。其次是爬坡约束。内燃机升负荷可以做到每分钟几十千瓦但热力系统跟不上。电锅炉的热水温度变化也存在延迟不可能像开关灯一样瞬间切换。更隐蔽的是热网和水蓄能管网本身有热容量空调系统、采暖末端都有响应延迟如果模型不考虑这些动态特性会出现模型说该停了实际热还在送的尴尬情况。然后还有电网侧约束。园区变压器容量是有限的CHP发电、电锅炉用电、储能充放电和常规负荷加在一起不能超过变压器额定容量。这个约束往往在冬季最紧张白天电负荷本来就不低如果此时电锅炉还启动可能直接触发需量电费惩罚。需量电费这个事很多优化模型都会漏掉结果省了电量电费赔了需量电费得不偿失。3. 代码实现从数学模型到滚动调度3.1 整体架构三个文件跑通一套调度我们实际落地的调度系统没有用很重的平台就是一套Python脚本加一个开源求解器核心逻辑大致分成三层config.py # 参数配置设备参数、价格数据、负荷预测 optimizer.py # 优化模型目标函数 约束条件 求解 controller.py # 控制下发把优化结果变成设备指令运行节奏是滚动优化每小时跑一次未来24小时的调度计划每15分钟根据实测数据刷新一次短时修正把模型预测误差和设备实际响应偏差找补回来。这套节奏对园区微电网完全够用。3.2 优化器核心代码解读优化器内部用的是混合整数线性规划MILP因为CHP启停是0/1变量属于整数问题。我简化了代码把核心片段贴出来import pulp # 时段集合 T [0, 1, ..., 23] # 决策变量 # P_chp[t] CHP电出力kW # P_boiler[t] 电锅炉耗电功率kW # P_grid[t] 电网购电功率kW # u_chp[t] CHP启停状态0/1 model pulp.LpProblem(Microgrid_Dispatch, pulp.LpMinimize) # 目标函数24小时总购电成本 CHP燃料成本 total_cost 0 for t in range(24): total_cost price_buy[t] * P_grid[t] * dt[t] # 购电成本 fuel_consumption P_chp[t] / (eta_e * LHV) * price_gas # 燃气成本 total_cost fuel_consumption * dt[t] # 启停惩罚避免频繁开停机 total_cost startup_penalty * (u_chp[t] - u_chp[t-1]).clip(lower0) model total_cost # 约束1电平衡 for t in range(24): model P_grid[t] P_chp[t] E_load[t] P_boiler[t] # 约束2热平衡 for t in range(24): model eta_h / eta_e * P_chp[t] eta_b * P_boiler[t] \ H_load[t] - q_tank[t] # q_tank是蓄热罐放热量 # 约束3CHP出力范围 for t in range(24): model P_chp_min * u_chp[t] P_chp[t] P_chp_max * u_chp[t] # 约束4电锅炉出力范围与爬坡 for t in range(1, 24): model P_boiler[t] - P_boiler[t-1] boiler_ramp_up model P_boiler[t-1] - P_boiler[t] boiler_ramp_down这段代码看起来简单但真正调试时踩了不少坑。比如热平衡约束里蓄热罐的放热量q_tank必须建模否则模型会让电锅炉和燃气锅炉在半夜拼命制热、白天全部停掉——现实中蓄热罐容量有限要加上罐容量的约束# 蓄热罐 SOC 动态 for t in range(24): soc[t] soc[t-1] (q_charge[t] - q_discharge[t]) * dt[t] model soc_min soc[t] soc_max3.3 数据准备与参数标定很多团队会忽略数据准备其实这一块往往决定了整个优化的成败。首先是电价曲线。不能简单用峰平谷三段价因为很多地区的电价不是固定三段而是分时浮动甚至每天更新。我们开发了一个小脚本每天从当地电力交易中心抓取次日96点电价归一化之后作为优化输入。然后是负荷预测。热负荷预测比电负荷预测难因为它受室外温度影响很大而且还有建筑热惯性。我们采用了基准温度法统计过去30天的室外温度和日平均热负荷拟合一条线性曲线再结合天气预报的次日温度估算出次日逐时热负荷。虽然精度不算高但用于调度决策足够了误差控制在10%左右。最后是设备参数标定这一块最容易被低估。我建议所有效率参数不要用厂家铭牌值要用实际运行数据反算。比如CHP在不同出力下的发电效率不是一个常数负荷率50%和100%的差距可能达到5个百分点。我们在模型里把出力区间分成三段每段用不同的效率系数比单一效率参数更准确。4. 算一笔账一台电锅炉和一座CHP联合运行一年省多少4.1 场景参数与基准方案纸上谈兵没意思我把我们这个园区的典型参数和对账结果列出来供参考。典型日参数CHP2MW内燃机发电效率42%热效率47%电锅炉500kW热效率98%燃气锅炉2台单台1.4MW热效率90%天然气2.8元/Nm³低热值9.7kWh/Nm³电价峰0.95元/kWh8小时、平0.60元/kWh8小时、谷0.30元/kWh8小时日间电负荷均值1800kW热负荷均值2000kW夜间电负荷均值400kW热负荷均值600kW基准方案取园区改造前的运行方式白天CHP固定开机、燃气锅炉全开保障热负荷夜间CHP停机、燃气锅炉继续供热。优化方案则完全按照上一节说的临界价格判据来调度白天CHP优先带热并发电峰时段超发谷时段CHP停机、电锅炉蓄热。4.2 日间收益拆解先看白天一个小时的对比。基准方案下白天一小时需要满足电负荷1800kW、热负荷2000kW。按CHP发电1800kW、产热2016kW略超热需求计算购电CHP发的1800kW自用电网购电约0kW购电成本0元燃气消耗CHP燃料消耗1800 / 0.42 / 9.7 ≈ 442Nm³费用442×2.8 ≈ 1238元燃气锅炉补热热缺口为2000 - 2016 0实际不需要补热但原方案中燃气锅炉为了保证供水温度仍低负荷运行按额定10%算烧气约30Nm³费用84元基准方案成本1238 84 1322元/小时优化方案在白天峰时段的做法是让CHP满发2MW多出的214kW电自用减少购电热侧多出的240kW通过散热器排出电锅炉保持停机燃气锅炉停机。计算如下CHP燃料消耗2000 / 0.42 / 9.7 ≈ 491Nm³费用491×2.8 ≈ 1375元购电虽然CHP发了2MW但电负荷只有1800kW多出的200kW可以卖给电网或者抵消变压器基本电费。按抵消购电计算购电为0甚至产生少量售电收益此处按0计优化方案成本1375元/小时表面看优化方案反而贵了53元/小时。但别忘了基准方案里燃气锅炉还在开着优化方案把燃气锅炉完全停掉了而且CHP满发多发的200多kW电如果按峰时电价0.95元算在自用场景下避免了约190元的购电支出。把这一项扣掉实际优化方案比基准方案每小时省约137元。一天按8小时峰时算省约1100元。平峰时段的逻辑不太一样。平时电价0.60元CHP满发多出来的电只值0.60元/kWh略低于其边际燃料成本所以最优解是让CHP贴着热负荷走既不超发也不欠发。这样算下来平峰时段比基准方案省不了太多但能保证燃气锅炉完全停运节约天然气。一天8小时平段大约还能省300到400元。4.3 夜间蓄热收益与全年汇总夜间是电锅炉的主场。谷时电价0.30元/度电锅炉产1kWh热的成本约0.31元燃气锅炉产1kWh热约0.32元相差很小。但加上一个条件就完全不同了夜间电锅炉除了直接带热负荷还可以把多余的热存在蓄热罐里供白天峰时段放热。这样白天峰时段原本需要燃气锅炉补的那部分热就可以由谷时段蓄的热来替代。夜间谷时段8小时电锅炉总耗电约 600kW × 8 / 0.98 ≈ 4900kWh电费约1470元产热约4800kWh。其中夜间热负荷直接消耗约600kW×84800kWh刚好持平没什么蓄热空间。这提醒我们一个现实如果只装电锅炉不装蓄热罐谷电蓄热的收益就非常有限。我们在这个园区后来加装了一个200m³的蓄热水箱蓄热能力约5000kWh这才是电锅炉真正发挥价值的地方。冬天夜间电锅炉开满8小时把水箱从70度加热到95度白天峰时段放热供给暖气就能替代一部分燃气锅炉。加蓄热之后全年收益更可观。按取暖季120天计算峰时段CHP超发带来的购电节省约1100元/天 × 120天 ≈ 13.2万元燃气锅炉停运带来的天然气节省约4000元/天 × 120天 ≈ 48万元谷电蓄热替代白天燃气补热约2000元/天 × 120天 ≈ 24万元减去电锅炉新增耗电费用约1500元/天 × 120天 ≈ 18万元合计一个取暖季净省约67万元。如果算上非取暖季CHP跟随电负荷优化、减少启停带来的维护成本降低全年的综合收益在70到100万元之间。对于一套总投资不算高的微电网改造项目来说这个回报已经很说明问题了。5. 现场常踩的坑与排查实录5.1 热电比漂移导致模型失真优化模型里CHP的热电比η_h/η_e是最关键的参数但很多项目把它当成常数这是大坑。内燃机的热电比会随着负荷率、室外温度、冷却水温度变化。同样是这台2MW机组满发时热电比约1.12但负荷率降到60%时发电效率下降更快热电比可能变成1.2甚至更高。如果不做修正模型会认为发1度电只带1.12度热实际却是带1.2度热结果热负荷估算偏高调度方案偏保守白白浪费了供热能力。解决办法是做一个热电比修正表按负荷率分段标定每季度重新校核一次。我见过最夸张的情况是某冬季气温骤降冷却水温度过低导致热效率上升热电比从1.12漂到1.35模型算出来的夜间蓄热方案和实际相差15%。从那以后我们就把热电比修正做进了控制系统定期用实测数据回归更新。5.2 电价预测不准优化变成盲人摸象分时电价还好说市场化电价就难了。有一次我们按预测的次日电价做计划安排CHP夜间接最大负荷发电结果第二天实际电价大幅下跌比天然气发电成本还低。系统完全没有反应过来一整天都按错误的计划运行白白多烧了几千块天然气。教训是滚动优化的频率必须足够高。如果一天只跑一次优化预测误差带来的损失是全天性的。我们后来改成每小时滚动一次每次只锁定未来两小时的调度指令后面的时段作为参考但不执行。这样即使电价预测突然变差最多损失两小时不会全天跑偏。5.3 CHP频繁启停约束没加全的代价第一次上线优化模型的时候我们只约束了CHP的最小运行时间2小时结果发现内燃机一天启停七八次。虽然每小时的调度成本确实是最低的但每次启动都有额外的燃料消耗和机械磨损发动机厂家在质保条款里明确规定小时数内启停次数上限。这个问题的本质是目标函数里缺了启停惩罚项。我们把单次启动成本设为500元并且把最小连续运行时间加到4小时效果立竿见影启停次数从一天8次降到了2次以内每天多出来的成本不到200元但设备的寿命损耗和运维工作量大幅下降。5.4 求解器选型与计算时间卡脖子MILP模型在规模不大时开源的CBC求解器完全够用24小时×96个时段的模型一般几秒就能解出来。但如果你把蓄热罐的动态约束、多设备启停、爬坡约束全部堆进去变量和约束数量会急剧膨胀CBC可能要跑几分钟甚至卡死。我们的经验是模型要够用就好不要追求把所有物理细节都塞进去。比如电锅炉的电极损耗、CHP的进气温度补偿等这些在小时级调度里影响很小反而会拖慢求解速度。如果确实遇到大规模模型建议先把时段从96点降到24点做整体规划再用15分钟粒度做近两小时的局部修正。这种粗调度细修正的两级结构在现场运行中远比一个超大规模模型可靠。还有一点要特别提醒商业求解器虽然快但许可证成本和部署复杂度不一定适合中小园区。我们最终选择了开源求解器加自定义启发式规则混合的方案在性能足够的前提下把软件授权这块的费用完全省掉了。6. 最后再聊点真话调度优化这个事做久了你会有一个感觉真正值钱的不是那几百行代码而是对设备特性的理解和边界条件的敬畏。我在这个项目里最大的体会是所谓省钱密码其实就是一个非常朴素的数学问题把每一种能源流量的边际成本算清楚然后在每个时刻选择成本最低的组合。CHP的热电耦合让这个组合变得有趣电锅炉的谷电蓄热让这个组合有了跨时间的套利空间而代码只是把这两件事自动化的工具。如果你现在正准备给自己的园区做类似的优化我的建议是从一张手算表开始把一天的负荷曲线画出来把设备的效率参数列出来先用Excel把临界电价算明白再考虑写代码。很多人一上来就想上机器学习、深度强化学习结果数据质量一塌糊涂模型再花哨也跑不出效果。先把线性规划跑通把设备参数标定准确收益就已经超过市面上大多数智能微电网系统了。最后再分享一个小技巧优化系统的输出一定要留一个人工确认的交互入口。调度员在屏幕上能看到系统建议的开停机时间和原因有疑虑时可以一键否决。我们就是因为保留了这样一个操作性很强的入口现场运维人员才愿意真正用这套系统而不是把它当成一个纸面优化的摆设。毕竟设备是人在管系统再聪明也得让人信得过才算落地。