☰
Simulink风光火储一次调频与AGC二次调频联合仿真建模全解析
2026/10/10 10:26:22 网站建设 项目流程

我从实际做完一整套“Simulink风光火储一次调频 + 二次调频AGC”项目的角度,把整个模型的搭建思路、关键参数、容易踩的坑和排查过程原原本本写出来。这个项目我接手时的需求是:在Simulink里把风电、光伏、火电、水电、储能、电动汽车全部放进去,先做一次调频,再做AGC二次调频,风机还要细化为1.5MW直驱永磁机型。一开始看着像“大杂烩”,但拆开看,本质上是三类问题:原动机建模、调频控制器设计、多源协调逻辑。

1. 为什么一次调频和AGC二次调频必须分开做,但模型要放一起

很多新手拿到这类需求后,习惯把所有电源拖进一个大模型,母线、变压器、负载统统画满,然后直接跑仿真看频率曲线。这种做法不是不行,只是调试起来会非常痛苦——因为一次调频和二次调频的时间尺度、控制逻辑、资源作用方式完全不同,混在一起根本没法定位问题。

一次调频的本质是发电机组的调速器响应,时间尺度在秒级到十几秒级。当系统频率偏离额定值(比如50Hz降到49.8Hz),靠的是汽轮机调速器、水轮机调速器、储能PCS下垂控制、风机虚拟惯性等快速反应,把有功功率按照下垂系数调整上去,让频率先“刹住车”。它的核心是比例控制,不做频率偏差的消除,频率最终会稳定在一个偏离额定值的小范围内,这个差值就交给二次调频。

AGC二次调频的时间尺度要慢得多,是分钟级。它的任务是把频率偏差通过积分作用“拉回”到额定值,同时还要按照经济调度或责任分摊的原则,在火电、水电、储能之间分配有功指令。AGC用的是定频率控制或定交换功率控制,在仿真模型里体现为一个那周期的闭环调节,输出各机组的AGC功率增量指令。

模型一定要放一起,是因为AGC下发指令之后,机组是否真的能执行、执行速度有多快、会不会和一次调频打架,这是只有联合仿真才能看出来的问题。比如储能一次调频已经往下垂控制顶满了,AGC再给它加功率指令,就会面临容量冲突;火电AGC指令到了,但锅炉惯性还没跟上,一次调频的响应已经回落,频率曲线就会出现“先冲高、再回落、再爬升”的波浪形态。这些问题分开建模时完全看不见,合在一起才能暴露。

我的做法是在一个Simulink工程里建两个仿真模式:

  • 模式一:仅一次调频,固定AGC指令为零,专门调各电源的下垂参数和响应时间。
  • 模式二:一次调频 + AGC闭环,AGC周期设在4到12秒之间(模拟调度主站下发周期),观察频率回归过程。

两个模式共用同一套电源模型,只是切换AGC控制器的开关。这样既能快速定位一次调频问题,又能完整验证二次调频逻辑。

2. 风机模型怎么建才不会被仿真步长和直流过压坑死

标题里明确写了“风机”和“1.5MW直驱风机”,这是整个项目里最容易出幺蛾子的部分。1.5MW直驱永磁风机(PMSG)在Simulink里有好几种建法,从全细节开关模型到平均模型再到简化运动方程模型,我最终选的是背靠背变流器平均模型 + 转子运动方程 + 直流母线电容动态的组合。

全细节开关模型在单机仿真里还可以跑,但一旦放进风光火储联合系统,PWM开关频率设在几千赫兹,整个模型的仿真步长被迫压到微秒级,算一次20秒的调频动态得跑几个小时,完全没有意义。平均模型把IGBT桥路等效成受控电压源和受控电流源,忽略了开关纹波,但保留了交直流侧的能量交换关系,仿真步长可以放到1到2毫秒,调频动态的精度完全够用。

风机部分最值得讲的是直流母线电压稳定问题。背靠背变流器的机制是:机侧变流器控制永磁同步电机的电磁转矩,网侧变流器控制直流母线电压和有功输出。一次调频时,风机要快速改变输出有功,网侧电流突增,如果直流母线电容设计不当或者电压环带宽跟不上,母线电压会大幅跌落,触发过压/欠压保护,仿真里就会出现风机莫名其妙退出运行的情况。

这个现象背后的物理过程是:有功功率突增的瞬间,能量从直流电容里被抽走的速度大于机侧输入能量的速度,母线电压下降;反过来,有功突减时母线电压上升。而母线电压环的PI参数如果按额定工况整定,大扰动下会饱和,恢复不过来,风机就“掉线”了。

关于热搜里提到的“直流风机的母线采样电阻过冲电压与采样电流变化的关系”,这也是我在项目里真实遇到的问题。母线电压采样如果直接采电容两端,在功率突变瞬间会出现一个尖峰过冲,这个过冲不是真实电压,而是采样电路的回流电阻与母线寄生电感产生的谐振。如果控制器拿这个过冲电压做反馈,电压环会误判,以为母线过压了,从而限制网侧电流,导致调频有功出不来。

解决思路不是加一个低通滤波器就完事,我踩过这个坑。低通滤波器的截止频率设低了,会把真实的电压动态也滤掉,控制器响应变迟钝;设高了,谐振尖峰滤不干净。正确的做法是先测量过冲频率,通常由母线寄生电感L和吸收电容C决定,f=1/(2π√LC),在Simulink里可以用快速傅里叶变换看看电压波形的主振荡频率,然后针对性地在采样通道加陷波滤波器,或者直接改采样时刻——把采样点放在IGBT开关脉冲的中间时刻,避开开关动作引起的电压尖峰。

项目里我给出的风机调频模型参数如下:

参数数值说明
额定功率1.5MW直驱永磁同步发电机
额定风速12m/s用于标幺值基准
直流母线电压1100V背靠背变流器中间环节
直流母线电容0.06F按额定功率的6kJ/MVA选取
虚拟惯性系数2H模拟转子惯量释放
下垂系数3%一次调频有功-频率静特性

直流电容的选取有工程经验公式:电容储能≈(5%~8%)×额定功率×1秒,即C=2×E/U²。1.5MW机组,取6kJ储能,除以电压平方,算出来就是0.06F左右。电容选小了,动态电压波动大;选大了,成本高且电压环响应变慢。0.06F在我的仿真里母线电压动态偏差控制在±5%以内。

3. 储能和电动汽车:快速调频资源的响应速度与容量博弈

储能和电动汽车在调频仿真里的地位很特殊——它们是“快资源”,响应速度比火电水电高一个数量级,但容量又小,而且受SOC约束。我在模型里把储能和电动汽车放在同一个章节讨论,是因为两者在Simulink里的抽象模型几乎一样:都是有功-频率下垂 + 功率限幅 + 能量状态约束,只是参数不同。

储能用平均模型建:理想直流源 + DC/AC变流器 + 一阶惯性环节。一阶惯性时间常数取20到50毫秒,模拟PCS的功率响应速度。储能的一次调频逻辑是:

P_storage = -K_droop × (f - f_ref),并限制在±0.5MW范围内,同时SOC限制在20%~80%之间,SOC越界时限制功率输出方向。

这个模型看似简单,坑在于限幅环节和下垂控制的配合。如果把限幅放在下垂计算之后,大扰动时储能会立刻顶到±0.5MW,这时候它已经退出了下垂控制,频率偏差继续增大它也没反应了。AGC二次调频再给它加指令,它已经饱和,指令被丢弃,频率回归进程会被拖延。所以限幅后要加一个反算环节——把实际输出的功率回灌到下垂控制器的比较点,让控制器知道自己已经饱和,避免积分项继续累积。这个操作在Simulink里可以用一个简单的反馈回路实现,很多教程不会讲,但联调时这个细节至关重要。

电动汽车我采用的是聚合模型,不会一辆一辆建100辆车,那纯粹是自找麻烦。整个停车场聚合成一台等效储能装置,参数按车辆数量折算:

  • 每辆EV按V2G模式可提供约7kW放电功率,100辆就是700kW。
  • 聚合容量按平均可用电池容量55kWh计算,但只有50%的SOC可用窗口,再考虑用户出行需求预留20%,实际可调度能量约2200kWh。
  • EV聚合体的响应速度设定为100毫秒级,比储能慢但远快于火电。
  • EV接入充电桩的传输损耗统一折算成等效效率0.92,在功率指令前乘一个系数。

还有一个细节:EV的**无响应区(死区)**设置要比储能的死区略大。因为频繁的小幅调频会加速电池循环老化,用户也不愿意。我采用的方案是:频率偏差大于±0.05Hz时EV才参与,而储能从±0.033Hz就开始动作。这个差异化设计也符合实际调频市场的规则,死区小、响应快的资源优先动作,死区大的作为后备。

储能的AGC指令分配我给了更高优先级,因为它的调节精度高,而EV的聚合模型毕竟是估算出来的,分配太多指令容易过调。在AGC分配策略里,EV的权重系数我只给了储能的一半,实测频率超调量明显减小。

4. 火电和水电的调速器模型:惯性大、响应慢,但也有脾气

火电和水电在一次调频里的角色是“基本盘”。它们的容量占总装机的大部分,但响应速度慢——火电的汽轮机惯性、锅炉蓄热限制,水电的水锤效应,都会让有功出力不能立刻跟上频率变化。Simulink建模时,如果只用一个一阶惯性环节糊弄过去,联合仿真出来的频率曲线会过于理想,AGC的调节压力评估也会失真。

火电模型我采用的是汽轮机-调速器经典模型,Simulink的Simscape Electrical里有现成的模块(Steam Turbine and Governor),但直接用的效果不好,因为它的默认参数基于60Hz系统,用在50Hz系统里要重新标定。我习惯自己搭建,结构是:

转速偏差 → 调速器(含下垂系数和伺服执行机构)→ 蒸汽容积效应(一个实际是一阶惯性,时间常数取0.3秒左右)→ 再热器(取8到10秒的大惯性)→ 机械功率输出。

这里的关键是再热时间常数。再热式汽轮机的再热容积很大,蒸汽从高压缸出来经过再热器再到中低压缸,中间有几十立方米的容积,导致中低压缸功率变化滞后于高压缸。整个汽轮机的功率响应呈现“先快后慢”的特征——高压缸先贡献约30%的功率,再热器慢慢释放剩余70%。如果模型里忽略再热惯性,火电一次调频的功率顶峰会提前出现,和实际曲线差得很远。

水轮机模型更麻烦,它的水锤效应表现为:导叶开度增大时,水流量并不能立刻增大,反而因为水柱惯性的原因先出现一个短暂的功率下降,然后才上升。这个“反调”现象在Simulink里用一阶惯性是模拟不出来的,必须用弹性水锤模型或简化的非线性水锤方程。我使用的简化模型是:

P_turbine = (1 - T_w × s) / (1 + 0.5 × T_w × s) × Δ导叶开度

其中T_w是水流惯性时间常数,典型值取1到2秒。这个模型能复现水轮机功率先降后升的典型响应。

火电和水电的AGC响应速度差异也要在模型里体现。火电的AGC指令通常通过DEH(数字电液调节系统)执行,功率变化率限制在每分钟1.5%到3%额定功率;水电的AGC通过调速器执行,爬坡率可以到每分钟10%。我在模型里给火电AGC指令通道加了一个Rate Limiter,限速为每分钟2%额定功率,给水电的是每分钟8%。这样AGC闭环时,频率回归曲线会呈现“储能和EV先顶上→水电跟上→火电慢慢接棒”的阶梯形态,与实际电网的行为一致。

参数配置建议:

类型一次调频下垂系数调速器时间常数AGC爬坡限速
火电4%~5%0.3~0.5s2%/min
水电3%~4%0.5~1s8%/min
储能2%~3%0.05s无限制(限幅为主)
风电3%~5%0.1s看风速条件
光伏不参与一次调频无看AGC配置

光伏在模型里我设定为不参与一次调频,只参与AGC。因为光伏逆变器的控制策略目前主流是最大功率跟踪,没有预留调频备用容量。如果要让它参与调频,就必须人为弃光,留出上调空间,这属于高级配置,放在AGC分配策略里单独处理。

5. AGC二次调频的闭环逻辑:从定功率到定频率的升级路线

AGC二次调频是整个模型的控制中枢,也是最容易让仿真“彻底放飞”的部分。我最开始做的版本是定功率AGC——调度给定各机组一个固定的出力计划,然后机组跟随,但这种方式根本消不掉频率偏差,因为负荷一变,计划功率和实际负荷的差值就产生了新的频率偏差。

后来升级为定频率AGC:测量系统频率偏差Δf,经过AGC控制器计算总调节功率ΔP_total,再按分配策略下发给各机组。用Simulink实现起来,逻辑链是:

频率偏差Δf → 区域控制偏差(ACE)计算 → PI控制器 → 总调节功率 → 分配策略 → 各机组AGC指令 → 机组执行 → 频率恢复。

ACE的计算要考虑区域交换功率,但单区域孤网仿真里,ACE就等于Δf乘上一个偏差系数。PI控制器的参数我采用的方法是先整定比例项,让总调节功率与频率偏差的比例关系等于系统总下垂的倒数,然后再加积分项消除静差。积分时间常数从60秒起步,逐步减小到20秒左右,直到频率曲线在扰动后3分钟内回到额定值且不出现持续振荡。

分配策略是整个AGC的灵魂。我对比了三种策略,最终选了比例分配 + 调节速度修正:

  • 按可调容量比例分配:谁的容量大谁多分担,这是基础。
  • 按调节速度修正:容量大的火电虽然分得多,但响应慢,前30秒实际出力跟不上,缺口由储能和EV弥补。所以把储能和EV的分配比例在前30秒临时调高,然后缓慢回落到稳态比例。
  • 考虑机组调节方向冲突:如果一个机组一次调频已经出力顶到上限,AGC就不给它分额外的上调任务。

这种动态分配策略在Simulink里用简单的时序逻辑就能实现。我建了一个Matlab Function模块,输入是当前频率偏差、各机组当前出力、各机组可调上下限,输出是各机组的AGC功率增量指令。代码逻辑只有几十行:

function [agc_p, status] = agc_allocator(delta_f, p_now, p_max, p_min, k_prio) % 按容量比例分配,对快速资源加临时权重 persistent t_start e_int; if isempty(t_start), t_start = 0; e_int = zeros(size(p_max)); end if t == 0, t_start = t; end dt = t - t_start; % 基础比例 = 1/下垂系数,反映调节能力 base_w = k_prio .* (p_max - p_min); % 快速资源临时权重,30秒后衰减 fast_w = base_w .* (1 + 0.5 * exp(-dt/20) .* k_prio); % 总调节功率计算(PI) e = delta_f; e_int = e_int + ki * e * sample_time; p_total = kp * e + e_int; % 限幅到可调总容量 p_total = max(min(p_total, sum(p_max) * 0.8), -sum(p_max) * 0.8); % 分配 agc_p = p_total .* (fast_w / sum(fast_w)); % 逐台机组限幅 for i = 1:length(p_now) agc_p(i) = max(min(agc_p(i), p_max(i)-p_now(i)), p_min(i)-p_now(i)); end status = 1; end

这个版本的分配器在我仿真里表现稳定,负荷阶跃5%情况下,频率最低点比纯容量比例分配提高了0.05Hz,回归时间缩短了约40秒。代价是实现复杂度高了一点,但在Simulink里也就是一个模块的事。

AGC控制器里的另一个要点是积分限幅与抗饱和。AGC的积分项如果无限累积,会导致各机组指令持续增大,但机组早就顶到上限了,频率还是不回来,积分还在往里加,一旦扰动消失,频率会朝反方向冲过头。我在积分环节前面加了条件:当总调节功率达到可调上限且频率偏差方向不变时,暂停积分累积。这个逻辑在Matlab Function里用一个if语句就行,但效果天差地别。

6. 联调阶段最常翻车的三类问题与排查过程

把所有电源模型和AGC控制器拼在一起后,才是项目真正困难的部分。我在这里把遇到的三类典型问题和排查链路完整写下来,供后来者参考。

第一类:AGC频率曲线出现持续振荡。表现是频率在额定值附近等幅波动,周期大约几十秒到几分钟。排查过程是:先把AGC断开,只保留一次调频,看频率是否稳定——如果一次调频下频率能衰减到稳态,说明问题在AGC闭环。再把AGC的积分项置零,只留比例项,如果振荡消失,基本可以锁定是积分增益过大或积分限幅不合理。最后做的方法是减小积分增益(从20秒调到40秒),同时检查分配策略里快速资源的临时权重导致相位滞后。我最后把临时权重的衰减时间常数从20秒改成40秒,振荡就消除了。

第二类:负荷突增后频率先快速恢复,然后缓慢跌落。这个现象一度让我怀疑是模型能量不守恒。后来查了半天才发现是火电AGC指令限速导致的。负荷突增时储能顶上去把频率拉了回来,AGC给火电分配了增量指令,但火电爬坡慢,储能因为容量小随后退出,火电还没来得及跟上,频率又跌下去了。这个问题的根源不是参数错误,而是分配策略忽略了火电的爬坡约束,把太多指令分给了慢资源,而快资源又没能力维持那么久。解决方案是把火电AGC指令的前馈量加大,让火电提前按预估负荷增量爬坡,同时降低储能在AGC分配里的稳态比例,让储能储备更多能量应对突发扰动。

第三类:仿真卡死或步长收敛失败。联合模型规模一大,Simulink默认的变步长求解器经常在某个开关动作或限幅切换点卡住。我遇到过储能限幅频繁切换导致仿真在某个时间点寸步难行的情况。排查思路比较朴实:先把模型切成固定步长,步长取2毫秒,能跑但慢,用来定位是哪个模块导致的问题,定位思路是逐个断开可疑模块的信号线,看仿真能否通过。最后发现是储能限幅环节的零极点切换导致代数环问题,在限幅后加了一个很小的惯性滤波(时间常数0.1毫秒),问题立刻消失。

风机在联调里的问题则和风速工况强相关。如果风速高,风机满发,它就没有上调能力了;风速低,发电本身小,下调能力也有限。我专门做了一个风速工况切换模块,运行到某个时间点风速从12m/s降到8m/s,模拟风机从满发到部分发的过程,观察一次调频和AGC的表现。实际跑下来发现:风速8m/s时风机可上调容量变小,一次调频明显变弱,频率最低点比满发时低了0.08Hz。在AGC分配里我加入了基于风机实时有功输出的自适应权重,风机的分配比例随风速变化动态调整,频率偏差波动明显收敛。

7. 仿真设置与验证工况设计的一些经验

最后分享一些模型配置层面的经验。这部分往往决定了仿真结果是否可信,而技巧基本不会出现在官方文档里。

求解器方面:联合模型我推荐用固定步长求解器,步长1到2毫秒。原因在于模型里大量限幅、切换、逻辑判断模块在变步长求解器下会在切换点反复缩短步长,计算效率急剧下降。固定步长牺牲了一点精度,但联合仿真的整体效率大幅提升。步长1毫秒时,20秒仿真大约需要几分钟,步长2毫秒时更快,但频率波形的细节会略糙,看低频动态完全够用。

仿真步长和PWM开关频率的匹配是个大坑。如果风机模型里保留了PWM发生器,开关频率设在5kHz,而仿真步长是2毫秒(500Hz采样率),PWM波的占空比会严重失真。要么步长压到0.1毫秒,要么把PWM发生器去掉换成平均模型。我强烈建议用平均模型——调频研究关注的是有功功率和频率的慢动态,PWM纹波属于无关噪声,去掉之后曲线反而干净得多。

验证工况我是这样设计的:先做小扰动,再做爬坡,最后做阶跃。初始工况满足所有机组出力与负荷平衡,系统频率稳定在50Hz,AGC输出为零。小扰动用2%负荷阶跃,观察一次调频是否能快速稳住频率且不发散。爬坡工况模拟负荷在10秒内线性增加8%,检验AGC的动态跟踪能力和机组爬坡限速是否合理。大阶跃直接跳到10%负荷阶跃,观察频率最低点是否越限(不超过±0.5Hz),以及AGC在3分钟内的恢复能力。

一个容易忽略的初始化细节:储能和EV的SOC初值必须设置合理,不能是满电也不能是空电,否则它们的可调容量在仿真的前几秒就是错的。我习惯把储能SOC初始化为50%,EV聚合法设置为60%,留出双向调节空间。火电锅炉压力的初值也要注意,它影响再热器惯性的初始状态,如果初始化成零,AGC第一次动作时火电的响应会异常剧烈。

个人习惯是用版本化模型文件保存每一步的进展,比如model_v1.mdl、model_v2.slx,每调通一个模块就另存一份。因为联合仿真的参数耦合太多,经常会出现调好AGC之后发现一次调频的参数也被动过了的情况,没有版本回退很容易陷入“改了一处、崩了三处”的泥潭。每次保存之前先跑一遍现有的所有验证工况,确保改动没有破坏之前的成果,这个习惯在项目收尾阶段省了我无数时间。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询