在做新能源并网越来越多、电网扰动性越来越强的这几年,火电机组单扛二次调频已经越来越吃力。我这两年接过不少仿真类调频项目,其中“储能辅助火电机组二次调频”这个方向的需求反馈相当集中,主要是两类人:一类是做传统电源控制或调度的工程师,想快速建立一套“火电+储能联合AGC”的仿真能力;另一类是刚介入储能调频市场的项目前期人员,想算清楚配多大功率、多大容量才能达标且回本。这篇内容围绕“储能辅助火电机组二次调频控制策略及容量优化配置”整套仿真研究工作展开,涉及Matlab代码和Simulink仿真建模,适合想用较短时间内搭建起完整、可复现的调频研究框架的人参考。
1. 项目核心拆解:为什么要用储能去“辅助”火电机组调频
1.1 二次调频的真实痛点
电力系统的频率调整通常分为一次调频和二次调频。一次调频靠调速器自主响应,动作快、频率偏差大时自动介入,但无法消除稳态频差;二次调频才是真正把频率拉回额定值、并消除联络线功率偏差的手段,也就是我们常说的AGC(自动发电控制)。
传统上AGC命令主要由火电机组执行,但火电机组有几个天然短板:其一是响应温差大且非线性强,受制于锅炉和汽轮机热惯性,调门动作后出力响应存在明显的爬坡限制和滞后;其二是机组自身存在调节死区、机械磨损和运行寿命损耗,频繁跟随AGC会让检修压力和考核风险明显上升;其三是随着新能源装机比例上升,留给火电的净负荷波动越来越剧烈,原本够用的调节速率和调节精度被压缩得非常紧。
储能就不一样,它的特点是响应快、爬坡不受限、跟踪精度高,充放切换可以在几十到几百毫秒内完成。把储能和火电机组并联起来,让储能先顶上高频波动和快速爬坡分量,火电机组用较低强度去跟缓变分量,就能在不伤机的条件下大幅提升整个调频响应性能。这正是“辅助”二字的含义——储能不是为了取代火电机组,而是补足它的短板。
1.2 仿真对象拆解:控制策略和容量优化是两条线
一个完整的“储能辅助火电机组二次调频”仿真项目,表面上是做一个Simulink模型,实际拆开看是两个交互的子问题:
第一,控制策略问题。储能和火电机组在AGC指令来临时如何分配出力?在什么情况下储能出力占大头,什么情况下火电机组兜底?电池SOC(荷电状态)到达高限和低限时怎么办?这些都要靠控制逻辑解决,是仿真模型中真正花心思设计的部分。
第二,容量优化配置问题。储能配多大功率、多大容量才合适?功率太小补不上爬坡速率缺口,容量太小撑不住持续的高强度调频需求。但容量配大了参数固然保守,却会拉高投资成本、回收期延长。因此要在控制策略确定的前提下,以经济效益或碳排放等综合指标为目标,搜索最优的功率和容量组合。
还有一个容易忽略的细节:控制策略和容量优化其实互相影响。同样的储能容量,策略好不好,最终表现出来的调频效果和电池循环寿命大不相同;而容量变化后,策略参数又往往需要重新适配。仿真项目里的合理做法是“先设计策略,再固定策略搜容量,最后回到策略层微调”,这个迭代思路我在第4章会展开讲。
2. Simulink仿真模型搭建架构与三个关键技术细节
2.1 整体仿真拓扑怎么搭
我搭这套仿真模型时,用的是Matlab/Simulink,外层结构是典型的三通道闭环:AGC指令通道、频率反馈通道、储能与火电功率通道。模型顶层从上到下依次是:AGC信号输入源、负荷扰动信号、区域电网频率计算、储能出力模块、火电出力模块、联络线功率偏差计算以及考核指标统计模块。
顶层不需要太花哨,核心是把数据流理顺。AGC指令从调度侧进入,经过联合出力分配逻辑后,分别给储能模块和火电模块。两个模块的出力相加,加上负荷扰动,汇入频率动态环节,得到系统频差;频差再计算成ACE(区域控制误差),反馈回AGC分配逻辑,形成闭环。
模块之间的采样时间设置有讲究。我一般把AGC指令采样周期设为1秒,控制逻辑里用连续或离散模块均可;频率反馈和储能出力通道的等效计算步长不要放得太大,否则储能响应快的优势体现不出来,仿真步长推荐用固定步长,比如0.01秒或0.05秒,避免变步长下数值振荡把PSS(电力系统稳定器)类的动态干扰放大。
2.2 火电机组与储能系统的动态模型选择
火电机组模型,我建议不要用过于复杂的锅炉燃烧模型,研究级调频仿真用经典汽轮机-调速器二阶级联模型就足够了。传递函数形式大致是:
G_thermal = 1 / ((1 + Tg*s) * (1 + Tt*s));其中Tg是调速器时间常数,典型值为0.06~0.2秒;Tt是汽轮机时间常数,典型值为0.2~0.5秒。如果是再热机组,还要加上再热时间常数T_rh,你可以让再热器提供40%左右的级联补偿,构建传递函数如下:
G_thermal = (1 + F_HP * T_rh * s) / ((1 + T_g*s) * (1 + T_t*s) * (1 + T_rh*s));储能系统仿真模型,在调频策略研究层面不必动用Simscape电池详细电化学模型,效率低而且参数难调。我更推荐一阶滞后模型加出力限幅和SOC外特性:
G_bess = 1 / (1 + T_bess*s);T_bess取0.01~0.05秒,外加输出限幅(比如额定功率的1.2倍短时过载能力)和SOC积分环节。SOC通过有功积分折算而成,公式可以写成:
SOC = SOC0 - (1 / E_rated) * ∫ P_bess dt充放电的能量转换效率也要在积分前处理,充电时乘以效率,放电时除以效率。
2.3 并联储能防顶牛的设计
我曾见过有人直接把AGC指令一份二,储能和火电机组同时全功率响应,结果电池很快顶到限幅,火电机组还在缓慢爬坡,两条通道功率叠加后严重超调,系统频率反而来回晃。这是联合调频最典型的“控制策略没设计好”的表现。
合理做法是加入分配权重和协调逻辑。具体来说:
- 当储能SOC处在舒适区(比如0.4~0.8)时,储能承担快速分量,火电机组承担慢变分量,两个通道之间不再简单平均分绿地,而是采用低通滤波分配;
- 当SOC偏低或偏高时,储能出力权重大幅降低,并向火电机组让渡主导权;
- 在AI预测补偿或模拟扰动中还要加入防顶牛限幅逻辑,火电机组出力憋高时储能不要继续往外抡功率。
简言之,两层分配逻辑必须同时存在:一层是按频率分量的动态分配,另一层是按SOC状态的静态修正。这套逻辑做扎实了,后面的容量优化才不是在错误的控制地基上盖楼。
3. 二次调频控制策略的进阶实现与Matlab代码实操
3.1 从一次调频到二次调频的控制思路
建模之前先理清楚一次和二次的关系,免得仿真逻辑乱了。一次调频依赖本地频率偏差信号,响应快,调速器在死区内不动作;二次调频依赖ACE信号,是远方AGC计算出来的区域控制偏差,通过负荷频率控制器分配命令。ACE计算公式常见的有两种表达方式,一般可写成:
ACE = (P_tie_actual - P_tie_scheduled) + B * (f_actual - f_scheduled)其中B是频率偏差系数,单位MW/0.1Hz;P_tie是联络线功率偏差。区域电网里,AGC根据ACE生成区域调节需求,再结合参与AGC机组的调节能力和经济分配策略,下发到各机组。
所以咱们做的二次调频控制策略,本质上是解决“分配+执行”的问题。分配指上级AGC怎么把调节需求切分给火电机组和储能,执行指火电机组和储能内部的控制器怎么跟踪指令。在Matlab里我们通常把上层AGC逻辑简化成一个区域调节需求信号作为输入,重点研究下层联合执行控制。
3.2 三种经典控制策略搭建与对比
我在项目里对比验证过三种联合控制策略:
策略一:纯火电机组AGC,也就是传统的PI控制器加爬坡限制,这是基线对照策略。
策略二:固定加权分配策略。公式比较简单:
P_bess_ref = w_b * P_agc; P_thermal_ref = (1 - w_b) * P_agc;w_b是储能分配系数,常取0.5~0.7。优点是实现简单,缺点是SOC一旦越界就没办法自主修正,实用性差。
策略三:自适应SOC加频率分层的变权重策略。核心思路是给储能分配权重加一个SOC调节因子,SOC越高,放电方向权重越大,充电方向权重越小;同时用低通滤波器把AGC指令里的高频分量分给储能,低频分量压给火电机组。Matlab伪代码大致是:
alpha = 0.5 + k1 * (SOC - 0.5); % 基础权重+SOC修正系数 if SOC < 0.2 || SOC > 0.8 alpha = alpha * 0.4; % 越界时强制弱化储能出力 end P_bess_ref = alpha * P_agc + k2 * (P_agc - P_thermal_prev_delay);其中P_thermal_prev_delay是火电机组实际出力的滞后一点,再把差值高频部分给储能去补。这个策略稳定性好一些,储能介入强度可自适应调整,就是参数调试工作量多些。
3.3 AGC指令跟踪控制器的参数整定技巧
联合控制策略里常会对储能和火电分别加PI控制器。调试经验上我给三个建议:
第一,储能通道的PI比例增益可以放得相对大一些,但不能牺牲稳定性;积分增益宜小,否则SOC会积累较大偏移。第二,火电机组通道的PI要配合爬坡限制,你不能指望输出阶跃变化时火电有很快的响应,应直接按斜坡信号预估算,否则PI会产生强烈的积分饱和。第三,为了抑制储能快速响应带来的抖动,可在储能控制器输出端增加一阶低通滤波时间常数,大约0.05~0.2秒之间,太小过滤不了抖动,太大则会让储能优势大打折扣。
我还遇到过把储能等效时间常数取0.1秒以上,导致快速功率支撑能力被削弱的现象,仿真里看不出来,但实际对比曲线就会发现BESS通道响应慢了半拍。这种情况正确做法是单独把储能模型时间常数设为0.01秒再调控制参数,别把电池动态特性和滤波器混淆在一起处理。
4. 储能容量优化配置方法:目标函数、约束条件与Matlab实现
4.1 优化问题数学化的标准写法
容量优化这步,我的经验是先把整个问题写成明确的数学优化形式,再选择求解工具。目标函数可以写成年综合费用最小化或者全生命周期净收益最大化。
以全生命周期净收益最大化为例,目标函数大致是:
max: R_total = R_freq + R_energy - C_invest - C_om - C_battery_replace其中:
- R_freq:调频里程补偿收益,和储能出力里程强相关;
- R_energy:电能量市场收益或辅助节省的燃料成本;
- C_invest:储能系统的初始投资,包括功率成本和容量成本;
- C_om:年运营维护费用;
- C_battery_replace:电池寿命损耗折旧费用,与放电深度、循环次数强相关。
约束条件包括:
- 储能功率约束:0 ≤ P_bess ≤ P_rated,且遵守SOC边界约束;
- 容量约束:E_rated ≥ P_rated * T_min(保证持续支撑时间满足政策要求);
- SOC运行范围约束:一般设置0.1~0.9,长周期优化会进一步优化为浅充浅放区间;
- 火电机组出力上下限、爬坡约束;
- 联合出力的频率响应性能约束,如N-1调频合格率或CPS1、CPS2达标要求。
4.2 Matlab求解实现路径
路径我常给两条,任选一条都通。
路径一:直接用Matlab Optimization Toolbox的fmincon,做连续变量优化。优点是方便,缺点是维度高了以后初值敏感,而且容易陷入局部最优,建议多试几个初值点。
路径二:用Matlab里的particleswarm粒子群算法,搭配一些简单的自适应惯性权重改进。粒子群对这类低维强非线性优化问题效果好,实现起来也非常简单,核心代码大概长这样:
nvars = 2; lb = [10, 10]; % 功率下限10MW,容量下限10MWh ub = [100, 100]; % 功率上限100MW,容量上限100MWh options = optimoptions('particleswarm', ... 'SwarmSize', 50, ... 'MaxIterations', 200, ... 'Display', 'iter'); [x_opt, f_opt] = particleswarm(@capacityCostFunc, nvars, lb, ub, options);目标函数capacityCostFunc里面要做的不是简单套公式,而是要嵌入控制策略、储能寿命模型和调频收益模型,把候选的功率容量参数带入进行仿真,再反推收益和成本,输出适应度值。这是整个项目里最容易出错但也是最核心的一步。
在容量配置的迭代过程中,我建议同步绘制一个“功率-容量-净收益”三维图,或者做二维等高线图,扫出明显的收益峰值区域,再进行细粒度搜索。只看最优点容易漏掉工程可实施性,比如某个点虽然最优,但容量是31.7MWh这种非标档位,现实设备采购反而不如落在30MWh档位下来得划算。
4.3 仿真验证与容量迭代校正
容量优化结果不能直接交付,必须拿回Simulink模型做全工况验证。我的做法是从容量优化结果出发,生成该功率容量对应的模型参数,然后跑以下几种工况:
- 连续AGC指令随机变化工况;
- 大幅负荷阶跃工况;
- SOC归位工况(即电池在某些时段不参与调频,等待火电补位恢复SOC);
- 极端场景下电池过载的短时过充过放模拟,验证保护动作。
跑完这些再统计储能等效全循环次数、SOC越界时长、频率合格率。如果发现某个约束被频繁触碰,比如储能频繁顶限、SOC频繁到80%以上,说明容量配置偏小,要回头把容量上限往上提。反之若SOC长期集中在0.4~0.6且利用率很低,则可以缩容量降功率,让投资更紧凑。
这套迭代往往要来回两三轮才能收敛。正因为如此,我才反复强调建模初期就要把仿真环境的通用性做出来,比如把储能功率、容量、控制系数全部变量化,放在模型初始化脚本里统一赋值,否则每次迭代都要改一堆分散参数,效率极低。
5. 仿真结果的分析方法与实用考核指标
5.1 调频性能怎么量化:CPS1、CPS2和里程叠加
调频性能在业内通常用CPS1、CPS2和调频里程三个关键指标衡量。CPS1主要反映ACE与频率偏差之间的统计相关性,CPS2反映ACE在十分钟窗口内的波动水平,调频里程则直接和设备收益挂钩。
在Matlab仿真里,我习惯用simout把模型的频率偏差、联络线功率偏差、各机组出力等关键信号全部导出,然后在事后处理中计算这几个指标。代码大致框架如下:
f_dev = simout_freq.Data; % 频率偏差序列 ace_seq = simout_ace.Data; % ACE序列 ts = simout_freq.Time; % CPS2计算,10分钟窗口ACE均方根 T_window = 600 / (1/(ts(2)-ts(1))); ACE_threshold = 25; % 视区域大小取阈值CPS1可根据统计公式计算,不需要额外工具箱。这些指标能客观对比不同控制策略的好坏,同时也能支撑容量配置目标函数里动态收益模型的修正。
5.2 典型结果对比:策略差异和容量拐点
我在自己做对比测试时给出一组典型的标幺化数据供参考,30MW/30MWh储能联合600MW火电机组,在相同AGC扰动序列下,三种策略的差异挺明显。
| 策略类型 | CPS1提升幅度 | 频差最大偏差缩小幅度 | 火电调节里程下降比例 | 储能SOC越界次数 |
|---|---|---|---|---|
| 纯火电AGC(基线) | - | - | - | - |
| 固定加权分配 | 约9%~14% | 约15% | 约22% | 中低 |
| 自适应分层分配 | 约16%~22% | 约28% | 约35%~42% | 明显更低 |
注意这是测试算例,不代表所有系统都定量一致,但趋势上是稳定的。也就是说自适应分层策略在各方面都优于固定加权,火电磨损降幅尤其明显,这正是联合调频能落地的最核心卖点之一。
容量方面,不同功率/容量组合下净收益通常会呈现一个“先升后降”的山丘曲线。功率过小时跟不上考核节奏,容量过小导致SOC经常跌到底、可参与调频时间不够;容量过大则投资成本拖后腿,收益曲线尾端下降很快。这条曲线的拐点处,就是最合适的配置区间。
5.3 结果解读里最容易被忽视的坑
不少人在做仿真对比时长篇大论分析频率恢复曲线,却忽略了对储能SOC管理策略的统计。我之前就吃过亏:某次策略改进让调频性能指标显著提升,但SOC在一天仿真里多次触顶触底,实际项目里电池必然频繁触发保护甚至停机,真实效果远不如仿真。
所以现在我对仿真分析提出严格要求:除了看频率结果,必须同步看储能SOC曲线与越界次数、电池循环寿命估算、充放电功率是否频繁超过额定值。任何以牺牲SOC和电池寿命为代价换来的调频性能提升,都不能算真正有效的策略优化。
6. 实操心得与避坑指南
6.1 模型搭建阶段踩过的三个坑
第一个坑是采样时间不一致导致代数环报错。储能用连续模型,AGC却用离散信号,连接处不设率转换或缓冲模块,仿真常常直接报错。处理办法是固定统一采样基准,各模块间的接口信号全部规整为连续或离散统一格式。
第二个坑是初始SOC设置不当导致储能一开始就进入“锁死”状态。如果初始SOC设为0.9,且策略里设定SOC大于0.85不许储能充电,那么一开始遇到充电指令时储能完全没反应,火电又响应慢,频率偏差第一波就烂掉了。初始SOC要按电力市场调频电池典型工况习惯取0.5或0.6,别太贴近边界。
第三个坑是容量优化目标函数里漏算了寿命损耗成本。如果只计初始投资和调频收益,优化结果会偏向用大功率容量去换更高收益,仿真好看,但实际电池因为深度循环衰减严重,两年就得更换,全生命周期算下来可能亏损。
6.2 参数调优的实操路线
调优方面,我个人的流程是:先用固定加权策略快速跑通模型,得到基准性能;再切到自适应加权策略,先固定SOC修正系数为零,只调频率分层滤波器,观察火电荷储能功率通道分离效果;然后将SOC修正系数从0.1开始逐渐拉大,并同步观察SOC曲线和CPS指标的变化。
每调一步都记录对比,不要直接一次把所有参数都改了,否则出了结果根本分不清哪个参数贡献了性能,哪个参数干扰了稳定性。我习惯用Excel登记每次运行的控制策略参数、关键指标和SOC越界次数,后面写报告“参数敏感性分析”章节时,数据全都是现成的。
6.3 后期扩展方向建议
这套“储能辅助火电二次调频控制策略及容量优化配置”建模体系在完成项目后还能继续扩展:一是把单区域模型扩展为多区域互联模型,研究联络线功率协调下的AGC效果;二是在策略层加入基于预测数据的协调提前补偿,用负荷或新能源预测序列优化储能预动作;三是在容量优化层融入电池健康状态退化模型,让容量配置在全生命周期尺度上更贴近工程实际。
从我的实际经验看,真正值得投入时间的是把控制策略的多场景鲁棒性测全,而不仅仅把容量优化算对一次。毕竟工程上的调频环境素来多变,一套模型只有把各种边界条件都照顾好,交付出去才不至于变成纸面仿真。