
做电力调度久了有个后遗症看什么都像“可调的电源”。储能电池是电动汽车是连那片铺满镜子的槽式光热电站我也没忍住把它塞进了虚拟电厂的模型里。这项模拟探索处理的就是这么个事在一座50MW光热电站的基础上让它和风电、光伏、储能电池一起组成一个虚拟电厂以运行成本最低为目标做日内优化调度。结果发现光热电站跟其它新能源完全不一样它不仅能发绿电还能把熔盐罐里的热当成“库存”替整个虚拟电厂打时间差。这篇文章就来拆一拆这次项目里的建模思路、求解过程以及那些真正跑起来才会遇到的坑。1. 项目全景虚拟电厂为什么盯上光热电站1.1 虚拟电厂的本质把分散资源“捏”成一个电厂虚拟电厂最核心的概念不是新建一座电厂而是通过一套控制中心和能源管理系统把地理位置分散、设备特性各异的小型电源、储能、可调负荷聚合起来统一对外表现为一个“电厂”。它对外承担发电责任对内协调各成员出力。类比地说相当于把散落在各处的外卖骑手包装成一个餐饮配送平台商家看到的是统一的服务入口消费者感受到的是完整的配送能力。搞清楚这一点很重要因为很多时候调度侧对虚拟电厂有误解认为它一定得“拥有”发电设备。实际上虚拟电厂重点是“可控”不是“所有”。某西部项目里光热电站本身产权独立但通过签署调度协议它的储热罐、汽轮机和电加热器有一部分调节权开放给虚拟电厂控制中心在满足电站自身技术约束的前提下按系统指令调整出力。还有周边几个小型风电场、屋顶光伏和用户侧储能同样以“资源聚合”方式纳入形成一个等效容量接近100MW的虚拟电厂。虚拟电厂之所以在新能源比例高的区域越来越受重视是因为电网调度的对象从“低头看一台机”变成了“抬头看一张网”。单个小资源单独调度调度中心忙不过来市场参与能力也很弱。把所有资源聚合成一个可调单元调度侧只需要对虚拟电厂下发一个总功率指令内部再分解到各个资源这就把复杂问题层级化了。1.2 光热电站在传统电网里的特殊位置传统印象里光热电站和光伏、风电一样属于新能源但其实它在电网眼里完全是另一类角色。光伏和风电的输出功率完全取决于天气属于典型的不确定电源也就是“靠天吃饭”的电源。光热电站不一样它有聚光集热、储热、发电三大子系统其中储热系统就像一个热量蓄水池把中午太阳能最足时的热量存到熔盐罐里傍晚再放出来发电。这个结构决定了光热电站具备三重能力第一时间平移能力。储热罐可以让发电时段和集热时段解耦比如太阳辐射最强的12点不发电或少发电留到晚上19点负荷高峰再放热发电。第二调节能力。光热电站的汽轮发电机组和常规火电类似可以在一定范围内调整出力甚至作为旋转备用参与频率调节这一点光伏和风电很难做到。第三转动惯量。汽轮机有旋转质量可以为系统提供一定的转动惯量支撑这在新能源占比高的局部电网里非常稀缺。用一个简单对比表来看光热和其它资源在虚拟电厂里的差异。资源类型出力可控性时间平移能力快速响应能力启动耗时光伏低无有秒级风电低无一般分钟级储能电池高有极快毫秒级光热电站较高有小时级一般分钟到小时级常规火电高无一般小时级真正让光热电站在虚拟电厂里显得特殊的是它既是新能源又能承担类似火电的调节任务相当于“披着新能源外衣的常规机组”。这个属性在只有风光储的普通虚拟电厂里是不存在的。1.3 为什么“光热虚拟电厂”是天生一对这个问题我在项目里反复想过。光热电站单独运行时虽然自身具备调节能力但究竟怎么调节取决于电价信号和电网需求。普通光热电站的收益模型相对简单白天集热晚上满发运行策略偏保守。可一旦纳入虚拟电厂它的储热系统就不再只是“给自己用”而是可以服务于整个聚合体的优化目标。虚拟电厂需要什么需要可调资源来平抑成员里的风光波动需要储能在价格低谷时吸收电能、高峰时放出也需要一个能提供基础出力的“大块头”来撑起虚拟电厂的申报出力置信度。光热电站恰好满足这些需求。光热电站需要什么需要更大的市场议价能力以及更多元的收益渠道。单座50MW光热电站在电力现货市场里报价话语权很弱但聚合进虚拟电厂之后整体容量增大、调控能力增强可以参与调峰、备用甚至辅助服务市场。用项目里的一句口头禅来说“光热电站是面团虚拟电厂是手面团能不能揉成什么样很大程度上取决于手怎么发力。”这也是这次探索的原点。2. 调度建模的关键细节把光热电站“翻译”成数学模型2.1 四大子系统建模从太阳光到电力的完整链条光热电站进入调度模型不能只写一个“发电功率”变量。否则它和风电、光伏就没区别了储热和集热这些核心特性会被完全丢掉。正确的做法是把光热电站拆成光场、储热、发电、电加热四个模块分别建模再通过能量流把它们串起来。光场模块的输入是太阳直接法向辐照度也就是DNI。某个时段的光场集热功率大致可以写成Q_solar(t) DNI(t) × A × η_field(t)这里的A是镜场采光面积η_field是光场效率。光场效率不是常数它受太阳高度角、余弦效应、镜面清洁度、遮挡损失等因素影响工程上会用一个随时间变化的曲线来近似。需要注意光场本身有热惯性镜场调整角度后集热功率不会瞬间变化项目里一般用一阶惯性环节来模拟这个动态过程。储热模块是整个模型里最有意思的部分。双罐熔盐储热系统相当于一个带损耗的能量仓库它的状态方程是S(t1) S(t) Δt × (Q_charge(t) × η_ch - Q_discharge(t) / η_dis - Q_loss(t))其中S(t)是当前储热罐的剩余热量Q_charge是充热功率η_ch是充热效率Q_discharge是放热功率η_dis是放热效率Q_loss是罐体散热损耗。约束上储热容量有上下限充放热功率各自有上限而且出于设备安全考虑不能同时充热和放热这个约束需要用一个0-1变量或者互补约束来描述。发电模块描述汽轮机组它的电出力P_elec与进入汽轮机的热量Q_steam近似线性相关P_elec(t) η_turb × Q_steam(t)同时要满足最小技术出力、最大出力和爬坡速率约束。汽轮机启动过程复杂温度、压力都要逐步提升所以启停状态用0-1变量描述启动成本单独计入目标函数。电加热模块是很多调度模型容易漏掉的部分。它本质上是一个大功率电锅炉把虚拟电厂里多余的电力转换成热能存进熔盐罐相当于在“电”和“热”之间建立了一条反向通路。这样一来中午光伏大发、现货电价很低甚至为负的时候虚拟电厂可以把廉价电转成热存起来晚上再放热发电一举两得。2.2 虚拟电厂聚合模型多能源成员放在一个天平上把光热电站模型建好之后需要把虚拟电厂所有成员写进同一个优化模型里。简单来说每个成员有各自的运行约束成员之间通过功率平衡耦合。虚拟电厂的功率平衡约束可以写成P_csp(t) P_wind(t) P_pv(t) P_bat,dis(t) P_import(t) P_load(t) P_bat,ch(t) P_eheat(t) P_export(t)P_csp是光热发电功率P_wind和P_pv是风力和光伏出力P_bat是储能充放电P_import和P_export是与外部电网的交换功率P_load是聚合体内部的负荷P_eheat是电加热器的消耗功率。这个约束在不同时段连接了所有成员也是整个优化问题里最重要的耦合约束。虚拟电厂内部的风光出力存在不确定性所以聚合模型里一般会引入随机变量或者把它们转换成确定性等价的约束形式。储能电池的SOC也和储热罐的S(t)类似有充放电功率约束和电池容量约束。整个模型最终会形成一个以成本最小为目标包含大量不等式约束的混合整数线性规划也就是常说的MILP问题。2.3 目标函数从成本最小到低碳价值这次项目用的目标函数是运行成本最小化但这几个成本项要解释清楚。目标函数长这样C_total Σ_t [ C_import(t) - R_export(t) C_start(t) C_om(t) C_penalty(t) ]C_import是购电成本R_export是售电收益C_start是机组启停成本C_om是运行维护成本C_penalty是弃风弃光和供需不平衡的惩罚项。引入弃风弃光惩罚这个做法很关键因为如果只看经济成本系统有可能会选择切掉部分新能源来避免调用高成本灵活性资源这在“双碳”背景下不可接受所以要给弃电一个足够高的惩罚系数强迫优化过程尽量避免浪费绿电。碳成本我没有直接写进目标函数而是用碳价折进C_om里统一考虑。具体做法是根据当前区域电网的碳排放因子把单位电量对应的碳排放成本折算进运行维护成本中。这样既保留了单目标优化的求解效率又让结果隐含了低碳价值。2.4 时间尺度的选择日前与日内滚动另外一个容易忽略的细节是时间尺度。光热电站热惯性很大调度计划放得太短会失真放得太长又跟不上市场变化。项目里采用了两级调度框架日前计划间隔1小时日内滚动优化间隔15分钟。日前计划解决的是“储热罐什么时候蓄、什么时候放”的粗粒度问题日内滚动优化解决的是“未来15分钟各资源具体出力怎么调”的细粒度问题。两级调度的好处是光热电站的汽轮机状态和储热温度这类慢变量用小时级模型处理储能电池和可调负荷这类快变量用15分钟级模型处理。两者嵌套求解让光热电站既不显得“迟钝”也不被过细的时间步长拖垮计算速度。3. 优化调度求解从混合整数规划到分散协调3.1 整数变量是难点分支定界与求解器加速光热电站的汽轮机启停、充放热切换都是离散决策必须用0-1变量描述。这些整数变量让问题变成了MILP求解难度比线性规划大很多。项目里最开始的模型规模不大变量数量大概几千个商业求解器用分支定界法可以在几十秒内完成日前优化。但随着虚拟电厂成员增多尤其是把多个光热电站、多台储能、大量可调负荷放进同一个模型后整数变量数量暴涨求解时间会从秒级拖到分钟级甚至更久。针对这个问题我给模型做了一些剪枝和降维处理。比如储能电池的充放电切换用一个逻辑变量和几个不等式来强迫其不能同时充放比增加两个0-1变量更高效。再比如把储热罐的SOC在日前计划里离散成较少档位先求粗略解再在日内滚动优化里细化。这是非常实用的技巧因为调度模型追求的是“算得快、算得稳”而不是数学上的完美。3.2 光资源不确定性场景法与鲁棒优化的取舍凡是搞过光热调度的人都清楚DNI预测是最大的不确定性来源。DNI预测偏差直接传导到集热功率进而影响储热罐热量和发电能力。项目组试过两种主流方案。第一种是场景法。根据历史预测误差生成多个未来DNI场景每个场景给一个概率权重优化目标改为期望成本最小化。场景法结果直观但需要保证场景数量足够否则会低估风险。测试下来至少生成20个场景结果才趋于平稳。第二种是鲁棒优化。不预设场景分布只给DNI定义一个不确定性区间并引入不确定性预算Γ。Γ控制着决策者对最坏情况的保守程度Γ越大模型越倾向于预留更多储热容量同时适当降低发电计划。鲁棒解算出来的成本通常比场景法高但遇到极端天气时不会出大问题。完整项目里最终用了混合方案日前计划采用鲁棒优化用较保守的DNI区间确保光热电站能在全天提供基本出力日内滚动更新时换回场景法因为此时预测误差已经明显减小场景法可以抓住更多经济收益。3.3 多主体分布式求解为什么需要ADMM虚拟电厂未必是“一家人”光热电站、风电场、储能站可能分属不同运营方。集中式优化把所有成员数据收集到一起虽然模型理论上最优但实际中会碰到数据隐私和数据量过大的问题。分布式优化在这个时候更有意义。ADMM交替方向乘子法是业内用得多的分布式求解框架。思路很简单把总问题按成员拆成多个独立子问题每个成员自行求解本地子问题然后把边界功率信息上报给协调器协调器根据所有成员上报结果更新拉格朗日乘子再把信号下发如此反复迭代直到各成员输出与总目标之间的不一致性满足精度要求。用伪代码表示大概是初始化拉格朗日乘子λ0惩罚因子ρ 循环直到收敛: 1. 各成员并行求解本地子问题得到各自出力x_i 2. 上报x_i给协调器 3. 协调器计算聚合偏差r Σ x_i - 目标值D 4. 更新λ λ ρ·r 5. 若‖r‖小于阈值则停止否则继续ADMM的优势在于保留了各成员的自治权光热电站不用把储热罐的详细参数全部交给别人。但收敛速度是个问题特别是在通信条件差、成员数量多的情况下迭代可能几百次都不收敛所以实际使用时一般会设置最大迭代次数同时优化惩罚因子ρ的取值。经过调参ρ取0.5到2之间收敛效果最好。3.4 算例参数一座“虚构但合理”的50MW光热电站为了让整个优化调度流程跑通项目组虚构了一个典型的西部槽式光热电站参数参考了公开文献里的常用数据和同类项目的典型配置。不需要真实数据也完全够用因为调度的关键是逻辑验证不是说看绝对数值。下表是资源聚合体的基本参数。资源装机容量对应时间常数/储能容量爬坡能力光热电站50MW电储热容量800MW·h最大充放热功率120MW0.8MW/min风电场30MW无取决于风速光伏电站20MW无取决于辐照储能电池20MW/40MW·h电池容量40MW·h10MW/min可调负荷15MW无2MW/min储热容量按热功率标定800MW·h意味着这台光热电站在额定功率50MW、热电转换效率约40%的情况下满负荷可以连续发电约6.4小时。因为有储热这个“大水库”它完全可以做到白天蓄热、夜间持续发电这也是优化调度结果里最显著的策略。4. 实操过程一个典型日调度全流程4.1 数据准备预测是调度的“源”错了后面全废调度之前第一件事是收集数据。一个完整日调度需要的输入数据包括未来24小时DNI预测、风速预测、光伏辐照预测、虚拟电厂内部负荷预测、现货市场分时电价预测以及各设备当前运行状态比如光热电站储热罐当前SOC、储能电池电量、机组是否在线等。DNI预测这个环节最容易出问题。项目里一开始直接用气象预报的DNI数值结果发现很多预测明显偏高因为气象模型分辨率不够没有考虑山谷里的云团移动。后来加了一步处理用当地实测历史数据训练一个校正模型把气象预报转换为光热电站场址的DNI预测。简单说就是给预报结果加一个与太阳高度角相关的修正系数。这点非常关键哪怕没有复杂模型做一版线性回归也能明显改善预测精度。4.2 聚合与状态估计先摸清成员的“家底”虚拟电厂调度前不能盲目分配出力得先摸清每个成员的可调范围。储能电池的可调范围取决于当前SOC和充放电功率限值风光出力范围取决于天气预测而光热电站的可调范围最复杂它不仅取决于当前储热SOC还取决于未来集热功率的期望和储热罐充放热约束。实操中光热电站控制中心在调度前会做一个“能力曲线”计算给出未来24小时内任意时刻的可发电功率区间。比如早上10点储热罐热量充足、镜场开始集热未来可调出力区间大概是20到50MW傍晚5点如果储热罐热量已经被消耗到35%可调出力区间就会收窄到15到30MW。这个能力区间上报给虚拟电厂协调器之后后续所有优化决策都以此为边界。4.3 优化结果长啥样看出力曲线怎么“跟着价格走”取一个夏日的典型日DNI强、光伏大发、现货市场价格午间低晚间高。用前面建立的MILP模型做日前优化得到的光热电站出力有一个非常有意思的特征白天光伏大发时光热电站出力明显压低电加热器开启把部分光伏电力转化成热存进熔盐罐下午电价升高后储热罐开始放热汽轮机逐渐爬坡晚间高峰时段光热电站基本满发成为虚拟电厂对外输出的主力。用表格看几个关键时段的调度结果。时段光热出力/动作储能动作虚拟电厂与电网交互8:00-11:00低出力储热罐缓慢蓄热充电消耗少量网电11:00-14:00最低技术出力电加热器开启满充午间光伏富余时向电网售电14:00-17:00储热罐开始放热出力爬升保持高SOC售电增加17:00-21:00满发50MW储热罐快速放热放电顶峰峰值售电收益最高21:00-24:00出力逐步降低留储热余量停止放电购电成本低储能充电这个结果验证了优化调度的核心逻辑光热电站蓄热不是越多越好放热也不是越早越好一切以系统总成本最优为准则。储热罐像一座水坝什么时候蓄水、什么时候放水得看下游的“用水”需求。4.4 从调度到执行指令下发与滚动修正日前计划只是“图纸”真正执行时还要做滚动修正。每次滚动优化的时间窗口是4小时步长15分钟每次重新读取最新预测修正后续计划。这样既保留了日前计划的“大局观”又能利用最新数据减少预测误差的影响。有个执行细节值得单独提一下光热电站的汽轮机爬坡速率很慢滚动修正后的出力调整如果超过爬坡限制会直接导致执行失败。因此在实际执行层光热电站出力指令会先经过一个爬坡限幅环节把变化率限制在0.8MW/min以内再下发到汽轮机控制系统。储能电池则承担快速调节任务弥补光热响应慢的不足。5. 实际运行中踩过的坑与排查实录5.1 储热罐“温度分层”让模型偏差被低估项目初期储热模型用的是忽略温度分层的单节点模型也就是把所有熔盐当成同一温度来处理。结果出现了一个奇怪的现象优化结果里白天蓄热、晚上放热的策略执行得还挺好但实际放热功率总比模型预测偏低导致汽轮机出力上限达不到计划值需要临时调用备用。排查后确认是温度分层的问题。双罐储热系统中的热罐上层熔盐温度高、下层温度低放热时高温熔盐先从顶部抽出。简化模型假设罐内温度均匀其实是把可用热量高估了。后来我们把储热模型改成一维轴向分层模型虽然计算量增加了一些但放热功率和汽轮机供汽温度的估算准确了很多。这个坑提醒我对光热电站来说“热量可用性”比“热量总量”更重要。5.2 预测精度不够导致的紧急爬坡失误有一次实际运行遇到突发云层DNI在20分钟内从700W/m²掉到250W/m²镜场集热功率断崖式下跌。储热罐SOC当天故意留得不高模型里又有“尽量降低储热余量”的优化倾向结果就是集热跟不上、储热补不上、汽轮机出力下降虚拟电厂整体出力瞬间缺了一块。后来分析原因发现日前DNI预测虽然做了误差校正但云层移动这种短时变化没有被场景集覆盖。解决思路有两层一层是调度模型里给储热罐SOC设一个置信下限比如不低于20%避免优化器把热量用到极限另一层是给风光的预测置信区间加上一个极端场景确保鲁棒性。简单一句话调度计划永远别把资源用到满要留一条后路。5.3 现货市场价格信号和热惯性的错位现货市场价格是15分钟一个点而且发布有提前量。光热电站的热惯性决定了它今天晚上的出力策略需要提前几个小时定下来等到电价信号明确了再调整往往已经晚了。有一回晚间20点现货价格意外高涨模型算出来此时应该满发但汽轮机从最低技术出力爬坡到满发需要将近40分钟等它爬到满发时价格高峰已经过去了。这个问题是光热电站在虚拟电厂里最“拧巴”的地方市场信号很快物理系统很慢。解决办法是采用预测控制思想把未来一段时间的电价预期直接嵌入优化模型模型不只盯当前时段而是把未来4小时的价格趋势和机组爬坡约束一起考虑。这样一来发电策略提前布局价格高峰到来时正好满发不再临时抱佛脚。5.4 通信延迟与“状态不同步”虚拟电厂控制中心和电站现场之间的通信如果走无线公网指令下发会有几秒到几十秒的延迟。别小看这个延迟调度模型假设的是“下发指令后立即执行”但实际指令到场后储热罐SOC和机组状态可能已经变了。尤其是储能电池这种快资源几分钟内的状态变化相当大。项目后期给控制中心加了事件触发机制不是每15分钟被动收一次数据而是当设备状态偏离预测超过阈值时立刻主动上报重新触发滚动优化。这样既能保障状态新鲜度又不至于因为高频通信占用太多带宽。光热电站侧也做了一个本地缓存层协调器指令先落到缓存再按设备当前状态校验后执行避免状态过期导致指令冲突。5.5 问题排查速查表症状可能原因排查方向解决手段光热出力低于计划储热罐热分层模型不准检查储热模型与实际放热功率的偏差改分层模型放热效率按SOC修正虚拟电厂出力缺口DN I预测骤降场景不全检查预测置信区间增加极端场景设SOC下限峰时满发跟不上热惯性导致爬坡延迟检查爬坡约束是否完整预测控制提前布局指令执行失败通信延迟、状态过期检查通信链路和状态时间戳事件触发机制本地缓存校验6. 项目之后的思考光热电站虚拟电厂的扩展方向6.1 从“跟随调度”到“参与市场”项目做通以后下一步自然会想这套优化调度框架能不能帮光热电站赚更多钱答案是能但前提是调整目标函数。现货套利只是最基础的应用光热电站的储热罐和汽轮机还可以参与二次调频辅助服务用储热来缓冲蒸汽参数波动让汽轮机在AGC指令下快速改变出力。这相当于给光热电站开辟了一个新“人设”既卖电量也卖调节能力。参与调频市场对模型的要求更高因为目标函数里要加入AGC里程收益约束里要增加对调节速率和调节精度的限制。不过这些约束本质还是我们建过的那些东西只是换个赛道重新表达。6.2 与制氢联营把多余的热变成绿氢光热电站除了发电还能直接提供高温蒸汽。把富余的蒸汽引到电解制氢系统或热化学制氢系统就相当于把“储能”变成了“化工产品”。在虚拟电厂框架下如果再加入一个电解槽作为一个可调负荷制氢和发电之间就有了一个优化权衡电价高时蒸汽优先发电电价低时蒸汽优先制氢。这个扩展方向我在模拟中验证过可行性很高尤其适合西部光资源富集地区。6.3 从单体电站到区域虚拟电厂集群最后画一个更大的饼。在大型清洁能源基地未来可能会出现数座光热电站联合周边风光的区域虚拟电厂集群。多座光热电站的储热罐可以共享调节负担A电站储热量高就多承担晚高峰出力B电站储热量低就少承担配合起来整体灵活度会远超单座电站。当然这个方向对分布式优化算法的要求也更高数据交换、利益分配、成本分摊都会成为新的课题。我个人在实际操作中的体会是虚拟电厂里的光热电站调度本质上是“把不确定的太阳光通过一个可控制的热账户转换成可控的电”。它不像光伏那样直接看天吃饭也不像火电那样完全依赖燃料而是站在两者之间。做优化的人如果把光热电站当成普通新能源来处理模型会失真当成常规火电来处理又浪费了它的储热价值。只有把它当成一个带储能的受控热源虚拟电厂才算真正用对了这个资源。最后再分享一个小技巧判断一套调度模型好不好不要只盯着优化成本数字要看极端场景下模型能不能给出“不疯”的策略。也就是当预测误差很大、价格波动很剧烈时调度结果是不是仍然敢于把储热罐放空。如果模型在这时候还敢放空那说明它还不够稳留着备用余量才是光热电站调度里最值钱的经验。