电力系统风储联合一次调频仿真模型,用Simulink实现,这套东西我前后折腾了两周才跑通。网上的资料要么只讲风机虚拟惯量,要么只搭储能电池模型,能把“风储联合参与一次调频”这件事完整闭环搭成可复现模型的,确实不多。这个模型解决的核心问题很直接:电网频率跌落时,风机和储能各自该出多少力、怎么配合,才能把频率最低点拉起来,并把稳态频率控制在合理范围。所以我先从问题背景讲起,再拆解建模思路,最后给出参数配置和排查经验。不管你是做风电控制的研究生,还是刚接触电力系统仿真的工程师,照着搭一遍,基本能把风储联合调频的链路摸透。
1. 问题背景与项目目标
1.1 一次调频为什么绕不开风机和储能
电力系统的频率由有功平衡维持。突然一台机组跳机,或者负荷突增,系统有功出现缺口,频率开始下跌。在AGC二次调频跟上之前,主要由发电机组的一次调频和系统惯量扛住最危险的前几秒。传统火电、水电有旋转惯量,转子能够天然释放动能支撑频率;风电机组经过电力电子变流器并网,机械转子和电网之间并不是刚性连接,转子动能不会自动送给电网。这就是“风机频率响应弱”的核心原因。
再加上很多风电场正常按最大功率追踪(MPPT)运行,没有预留备用容量,频率跌落时即使想多出力也调不出来。这时候储能的价值就体现出来了。储能装置的响应速度可以达到毫秒级,又能双向充放电,刚好补上风机一次调频的短板。把风电和储能放在一起做联合一次调频,等于让缓慢但容量较大的风机,和快速但能量受限的储能互相配合,这比单独任何一种方式都更符合工程实际。这个仿真模型就是在Simulink环境里把这条路线“跑”起来,用数据验证它到底能把频率稳定到什么水平。
1.2 模型设计目标与适用场景
我搭这个模型的时候给自己列了四个目标。第一,模拟一次调频全过程,负荷突增后频率变化、最低点、恢复过程要都能看到;第二,量化风储各自出力,弄清风电备用比例和储能容量该怎么选;第三,检验控制策略在风速波动、SOC变化、扰动大小变化时是否仍然有效;第四,为后续扩展到多机系统、AGC协调留出接口。这套模型的实际用途有三块:风电场一次调频能力评估、储能容量配置方案比选、调频控制器参数预整定。
对做风电并网研究的学生来说,它可以当实验平台;对在设计储能电站的技术人员来说,它可以作为容量和策略验证工具。我采用的不是特别复杂的电磁暂态模型,而是以功频动态为目标的等效建模。这样做的好处是仿真速度快、可复现性高,更适合做策略层面的验证和批量扫参数。等确认策略没问题,再往详细电气模型迁移也不迟。
2. 模型整体设计与仿真方案选型
2.1 建模深度和仿真模式怎么选
一开始我以为模型越细越好,把风机、变流器、储能电池全部按器件级搭起来。结果仿真慢到怀疑人生,还经常报不收敛。后来想明白一件事:一次调频研究的时间尺度是秒级到分钟级,核心变量是系统频率、机组出力和储能功率,并不是IGBT的开关过程。于是我最终放弃了器件级建模,改用“功率源+系统频率闭环”的思路。
在Simulink里有两条路可以走。第一,用Simscape Electrical Specialized Power Systems元件搭三相电网和同步机,频率通过三相PLL锁相测量。这种模型很接近实际,能直接看到三相电压电流,但动态步长小,仿真时长有限,调参也费劲。第二,用受控功率源和功频传递函数搭简化频率响应模型。系统频率与有功不平衡的关系本质上是摇摆方程,完全可以用积分器、增益模块搭出来。这种模型计算量小,适合长时间仿真和参数扫描。我的建议很明确:如果重点研究控制器策略,直接选路线二;如果必须验证控制器接入电气系统后的真实响应,再选路线一,并把控制策略原样移植过去。
从路线二切到路线一时,要注意Simulink控制信号和Simscape物理信号之间的转换。实际信号接口要用Simulink-PS Converter和PS-Simulink Converter连接,电气模型里还要确保参考节点存在。但控制器的架构、参数、死区逻辑这些完全不用改,这也是分层建模的最大优势。
2.2 风储联合一次调频的闭环结构
模型的闭环结构我习惯分成三层看。最底层是“系统功频响应模型”,也就是频率对功率缺额的响应环节:功率不平衡产生频率偏差,频率偏差反过来影响发电和负荷。中间层是“一次调频控制器”,它检测频率偏差,经过死区,计算调频功率指令。最上层是“风储功率分配层”,它把总调频指令分配给风电机组和储能。
这个分层方式清晰,每一层都可以独立修改。比如你把底层从简化模型换成Simscape电气模型,中间和上层不需要大改。风储功率分配策略我采用的方式是:储能先承担短时突发的惯性功率,风机承担持续的下垂功率;等风机功率爬坡结束后,储能再逐渐回收出力。当然也可以让两者按固定比例同时响应,模型里我预留了两个比例系数,可以自由切换。
整体框架在Simulink里大致是几个子系统:系统频率响应子系统、调频控制器子系统、风电子系统、储能子系统、测量与显示子系统。这样做的好处是排错方便,哪个环节不对就单独看哪个子系统的波形。
3. 关键环节建模与参数整定
3.1 风电场等效模型:MPPT、备用和出力响应
风电场的等效模型我压缩成三个环节。第一个环节是风速与机械功率计算,用简化的风功率公式评估基准出力:Pw = 0.5ρACpV^3。如果不打算拟合Cp曲线,我就做成一个查表模块,输入风速,输出功率基准值。第二个环节是风机控制模式。调频前风电场可以运行在MPPT,也可以运行在减载备用模式。如果跑MPPT,风速不变的情况下风机根本没有上调功率的空间;为了让风机参与调频,我一般让风电场正常时刻预留10%备用,也就是减载运行,频率跌落时通过增大出力支撑系统。
第三个环节是出力动态特性。风机功率指令到实际出力之间必须加一个一阶惯性环节,时间常数取2到5秒,用来模拟桨距控制和变流器控制的综合响应。需要特别提醒的是,风机参与调频的上调能力不能超过备用限额。比如减载10%,调频最多只能多出10%额定功率,仿真中一定要加限幅模块。很多人忽略这一步,不限幅的话功率指令超过物理上限,仿真出来的频率曲线就是假的,因为风机不可能凭空出力。
3.2 储能模块:功率源加SOC积分
储能在简化模型中可以用一个受控功率源实现。给定储能功率指令Pbess,先经过一个很小的惯性环节模拟变流器响应,然后接到系统功率节点上。关键是两个地方:储能有功输出限幅,以及SOC计算模块。SOC的计算公式可以写成:
SOC = SOC0 - ∫(Pbess / (E_rated * 3600)) dt
功率单位是MW,能量单位是MWh,转换到秒单位要除以3600。在Simulink里用一个Integrator模块就能实现,初值设为SOC初始值,积分增益设为1/(E_rated*3600),输出范围限幅在0到1之间。我还会在SOC接近10%或90%的时候,通过Switch模块把储能功率指令缩到0,防止储能过放或过充。
如果你非要用Simscape的Battery模块看电池端电压、电流、内阻等细节,那当然也可以,但需要配置电化学参数,仿真步长会被压缩,策略验证阶段不建议这么干。先让SOC和功率限幅的逻辑跑通,后面再替换成详细电池模型,是更稳妥的顺序。
3.3 一次调频控制器:死区、下垂、虚拟惯量
控制器是整个模型的核心。常规一次调频控制率是功率指令ΔP = -Kd × Δf,这里的Kd就是下垂增益。由于系统频率偏差标幺值很小,比如0.1Hz对应0.002pu,如果不放大Kd,功率指令会非常小,所以Kd的标幺值通常要取到几十甚至上百。
除了下垂,我还加入了虚拟惯性环节,用来模拟传统机组转子的惯性释放,表达式是ΔPvi = -Kvi × df/dt。它的作用是在频率快速下降的瞬间提供额外功率,把频率最低点压低。注意,微分项不能直接接在测量频率上。频率测量信号有噪声和PLL动态,直接微分会产生很大的毛刺。我的做法是先在频率偏差后面串一个一阶低通滤波器,时间常数0.1s,再进入导数模块求导。
几个参数需要配合整定。死区设0.033Hz左右,低于这个偏差不响应,防止正常波动下储能频繁充放电。下垂系数Kd决定稳态频率偏差,虚拟惯量系数Kvi决定频率最低点。Kd过大会导致储能功率限幅饱和,Kvi过大会让频率变化方向反转,甚至诱发功率振荡。实际调试我一般从Kvi等于Kd的1/5到1/3开始试。
3.4 系统惯量与负荷扰动的设定算例
为了给参数设定一个参照基准,我用了一个经典的单区域系统算例。系统基准容量100MW,频率50Hz,等效惯量时间常数H=5s。如果负荷在t=5s时刻突然增加0.1pu,也就是10MW,在没有任何一次调频的情况下,用标幺值摇摆方程估算,频率会持续下跌,直到调速器或低频减载动作。如果只看风储联合下垂通道贡献,设风储联合下垂总增益K=40,那么负荷0.1pu带来的稳态频率偏差大约是0.0025pu,换算到实际频率是0.125Hz,最终稳定在49.875Hz。
这个计算可以给参数设定一个量级概念。具体K值怎么定?如果目标是稳态频率偏差不超过0.2Hz,即0.004pu,那么K至少要大于0.1/0.004=25。考虑到系统里还有其他一次调频机组,风储联合总增益取到40比较合理。仿真时可以先从K=40起步,再根据波形反复调整。需要说明的是,这里忽略其他机组调速器,只是为了先得到一个可直接复用的数量级。
4. 实操过程与核心配置
4.1 快速搭出第一版可运行模型
下面说怎么在Simulink里从零搭建。我会以“简化功频模型”为例讲步骤,这条路最快看到结果。
- 新建Simulink模型,打开Simulink Library Browser。
- 建立系统频率响应模块。用增益、积分模块实现2H × dΔf_pu/dt = ΔPm - ΔPe。功率偏差ΔP以标幺值输入,先除以2H,再积分,得到频率偏差标幺值,最后乘以50Hz换算成实际频率。
- 建立一次调频控制器。用Dead Zone模块实现死区,增益Kd,再并联低通滤波加微分增益Kvi,求和得到总调频指令。
- 建立风电子系统。用Saturation限制备用上限,一阶惯性时间常数设为2s。
- 建立储能子系统。用Saturation限制功率幅值±0.1pu,加上SOC积分和Switch保护。
- 建立负荷扰动源。用Step模块,在t=5s从0跳到0.1pu。
- 关闭控制器增益跑一次,记录无控制时的频率跌落曲线;打开增益再跑一次,对比频率和功率曲线。
- 加To Workspace模块保存频率、风机功率、储能功率、SOC数据,方便后续用MATLAB脚本画图。
第一次跑通不需要太复杂。Subsystem里各放一个阶跃、增益、积分、示波器就可以。重点是先让闭环稳定,再去细化模块。
搭完以后运行前检查三件事:控制器输出限幅有没有加,SOC积分初值是否合理,Simulink求解器是否选了ode23tb或ode15s。这三样经常出问题。
4.2 主要参数配置表(可直接复用)
下面这份参数表是我调试后觉得比较稳的一组值,可以直接复制到你的模型里,再根据你的系统容量等比例换算。
| 参数 | 符号 | 推荐值 | 说明 |
|---|---|---|---|
| 系统基准容量 | S_base | 100 MVA | 所有标幺值的功率基值 |
| 额定频率 | f0 | 50 Hz | 如需60Hz,注意标幺换算 |
| 系统惯量时间常数 | H | 5 s | 代表所有同步机等效惯量 |
| 负荷突增 | ΔPL | 0.1 pu | 从t=5s开始,持续到仿真结束 |
| 一次调频死区 | deadband | ±0.033 Hz | 低于这个偏差不响应 |
| 风储下垂总增益 | Kd | 40 | 标幺值,决定稳态偏差 |
| 虚拟惯量增益 | Kvi | 10 | 约为Kd的1/4 |
| 频率低通滤波时间常数 | Tf | 0.1 s | 用于抑制微分噪声 |
| 风机响应时间常数 | Tw | 2 s | 模拟变流器和桨距响应 |
| 风机备用比例 | Reserve | 10% | 减载运行的可上调空间 |
| 储能响应时间常数 | Tb | 0.01 s | 模拟变流器快速响应 |
| 储能额定容量 | E_bess | 5 MWh | 用于SOC计算 |
| 储能初始SOC | SOC0 | 80% | 保证足够放电容量 |
| 储能功率限幅 | P_bess_max | ±0.1 pu | 即±10MW |
| 仿真时长 | Tsim | 30 s | 覆盖一次调频全过程 |
参数之间的单位关系要统一。比如Kd标幺对应的功率基准是100MW,20倍增益就意味着0.1Hz偏差产生实际多少MW,可以用公式换算。SOC计算里的能量单位如果搞错,仿真结果会出现SOC快速越界或基本不变的情况。
4.3 结果观测与调参验证
模型运行后,重点看三个曲线。第一个是系统频率曲线,关注最大跌落、最低点对应时间和稳态偏差;第二个是风机和储能功率曲线,看两者如何分担调频出力;第三个是SOC曲线,确认储能没有在仿真中途越限。
一个典型结果是这样的:负荷突增前系统频率稳定在50Hz,t=5s时频率开始下跌;虚拟惯性环节让储能立刻抬升功率,兜住最低点;随后风机功率爬坡,频率缓慢往回收;最终频率稳定在接近目标的位置,SOC出现一个小幅下降。如果看到频率到达最低点后出现反向振荡,通常说明Kvi太大,或者低通滤波时间常数太小。如果稳态频率偏差达不到预期,优先增大Kd,而不是Kvi。
我个人调试顺序是:先把Kd调到稳态达标,再加Kvi压低最低点,最后加SOC约束微调。用Simulink的参数变量配合脚本批量扫描,比手动拖滑块效率高很多。
5. 常见问题与排查技巧实录
5.1 仿真不收敛或代数环报错
简化模型里最常遇到的是代数环报错。频率反馈回路如果直接用增益模块搭,很容易出现代数环。解决方法是给反馈路径增加一个Memory模块或一阶惯性模块,把代数环打破。导数项最好用带记忆的动态模块实现,不要直接对测量信号求导。
求解器方面,我推荐ode23tb,最大步长设置在1e-3秒左右。仿真时长30秒,总步数可以接受。如果使用Simscape电气模型,还要注意三相网络的节点是否悬空、电源模块和测量模块是否匹配。遇到不收敛时不要盲目减小步长,先检查模型里是否有瞬时电流源与电感直接并联这类矛盾结构。
5.2 频率测量毛刺引发控制功率抖动
用三相PLL测频率时,扰动瞬间PLL输出会有比较大的尖峰,控制器拿到带尖峰的频率信号,功率指令就会来回抖。我踩过这个坑,后来是在频率测量输出后加了一阶低通滤波器,时间常数50ms左右。控制器微分通道也加了一级低通,既滤掉高频噪声,又不影响调频的动态响应。
另一个技巧是给储能功率指令加Rate Limiter,把功率变化率限制在5到10pu/s以内。这样即使指令有尖峰,实际功率也不会剧烈抖动。对于简化功频模型没有PLL毛刺问题,但微分通道的滤波依然必要。
5.3 储能SOC保护导致调频中断
储能一次调频能力受剩余容量限制很强。比如储能容量5MWh,一次调频放电10MW,持续30秒只消耗约0.083MWh,SOC变化不大。但如果SOC初始值很低,或者放电功率大,就很容易触发SOC下限保护。仿真中我遇到过SOC降到下限后,储能功率被Switch置0,但频率还没恢复,结果系统频率二次下跌。
解决思路是给储能设定合理的工作SOC范围,并在分配策略里加入优先级递减逻辑:SOC低时减少储能出力,把缺额转移给风机或传统机组。如果风机也没有备用,模型会明确告诉你储能容量配置不够,需要扩大容量。这也是这个模型很有价值的一点,它能把容量瓶颈直接暴露出来。
5.4 死区和控制器参数之间的隐患
死区设置直接影响控制器的动作逻辑。死区太小,比如0.01Hz,正常频率波动下储能就会频繁充放电,仿真里可以看到储能出力不停跳变。死区太大,比如0.1Hz以上,频率偏差超过阈值时动作又太晚,控制效果会变差。工程上一般取0.033Hz左右,但如果做学术方案对比,可以把死区设成可调常数,观察不同死区对频率最低点的影响。
下垂系数Kd太大容易和其他机组调速器形成振荡,Kd太小稳态偏差又会很大。虚拟惯量Kvi太大,在频率恢复阶段储能功率可能反向,反而造成“第二次频率低谷”。所以我建议Kvi先取Kd的1/5到1/3,观察波形再决定要不要增加。
5.5 排查速查表
| 问题 | 可能原因 | 处理办法 |
|---|---|---|
| 仿真不收敛 | 代数环、微分噪声、步长太大 | 加Memory、低通滤波,改用ode23tb,最大步长1e-3 |
| 扰动瞬间频率毛刺 | PLL动态、微分项 | 频率测量后加低通滤波,控制器微分通道再滤波 |
| 储能频繁充放电 | 死区过小 | 调大死区到0.03~0.05Hz |
| 储能中途退出引起频率二次跌落 | SOC保护触发 | 提高初始SOC、扩大储能容量、转移功率给风机 |
| 稳态频率偏差不达标 | 下垂增益不足 | 增大Kd |
| 频率振荡 | Kvi过大、响应时间不匹配 | 减小Kvi,增大滤波时间常数 |
6. 实操心得与后续扩展
6.1 几个必须记住的建模纪律
第一,模型里一定要有一个“调频投入开关”,可以方便对比调频参与和不参与的频率曲线。第二,所有功率指令必须加限幅,风机有备用上限,储能有功率限幅,否则曲线再好看也是假的。第三,SOC积分模块一定要限制输出范围,否则长时间仿真SOC会飘到1.2或者-0.3,完全没有物理意义。第四,PLL测频信号不要直接微分,容易把噪声放进控制回路。第五,仿真步长和精度要平衡,变步长时最大步长不宜超过1e-3秒,否则频率曲线会有明显的台阶。
这些都是我反复调试总结出来的。现在搭建任何调频模型,我都会先检查这几个地方,能省下大把排查时间。
6.2 从单机到区域的扩展思路
这套模型的价值不止于单机验证。我在跑通单区域模型之后,把它扩展到了三区域互联系统,每个区域包含火电、风电和储能。扩展时要注意不同区域的频率测量不要交叉,控制器应当作用在本地频率偏差上,区域间联络线功率加入偏差信号。这样才能研究风储联合调频对区域惯量支撑、联络线功率波动的影响。
还可以把风速序列从阶跃改成实测数据,用From Workspace模块导入,看看随机风速下调频效果是否稳定。如果要进一步做储能容量优化,外围套一个MATLAB脚本,循环改变储能容量和Kd/Kvi,自动统计频率最低点。这个数据对工程选型特别有说服力。我个人现在的习惯是先把这套简化模型跑熟,再把控制策略带到详细电气模型里验证,实际能省很多弯路。