年后帮某园区做微电网运行优化,园区里摆着一台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(lower=0) 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是蓄热罐放热量 # 约束3:CHP出力范围 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 场景参数与基准方案
纸上谈兵没意思,我把我们这个园区的典型参数和对账结果列出来,供参考。
典型日参数:
- CHP:2MW内燃机,发电效率42%,热效率47%
- 电锅炉:500kW,热效率98%
- 燃气锅炉:2台,单台1.4MW,热效率90%
- 天然气:2.8元/Nm³,低热值9.7kWh/Nm³
- 电价:峰0.95元/kWh(8小时)、平0.60元/kWh(8小时)、谷0.30元/kWh(8小时)
- 日间电负荷均值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×8=4800kWh,刚好持平,没什么蓄热空间。
这提醒我们一个现实:如果只装电锅炉不装蓄热罐,谷电蓄热的收益就非常有限。我们在这个园区后来加装了一个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把临界电价算明白,再考虑写代码。很多人一上来就想上机器学习、深度强化学习,结果数据质量一塌糊涂,模型再花哨也跑不出效果。先把线性规划跑通,把设备参数标定准确,收益就已经超过市面上大多数"智能微电网系统"了。
最后再分享一个小技巧:优化系统的输出,一定要留一个"人工确认"的交互入口。调度员在屏幕上能看到系统建议的开停机时间和原因,有疑虑时可以一键否决。我们就是因为保留了这样一个操作性很强的入口,现场运维人员才愿意真正用这套系统,而不是把它当成一个纸面优化的摆设。毕竟,设备是人在管,系统再聪明,也得让人信得过才算落地。