☰
风光火储一次调频与AGC二次调频Simulink建模全解析
2026/10/3 4:12:33 网站建设 项目流程

上个月帮人救一个Simulink调频模型,他把火电AGC、风电惯量响应和储能下垂控制三个模型并在一起,跑5秒就发散,问了一圈人也没解决。我看了一眼就发现他把频率偏差信号直接从输出端又接回了输入端,形成了代数环,整张图全是红色问号。这种问题,不是参数不匹配,而是建模习惯的问题。

这篇文章想把风光火储一次调频和含风电、储能、电动汽车、水电、火电的二次调频AGC仿真完整讲清楚。我在这个方向折腾了大概两年,从单机调速器模型做到多区域AGC,从火电做到风、光、储、EV,踩过非常多的坑。如果你是做毕设、项目或者课题要搭类似的仿真,这篇文章能给你省下好几周的时间。

我默认你用的是MATLAB R2020之后的版本,Simulink对连续系统的求解器没有太大变化,老版本照样能跑。下面所有内容都以电力系统机电暂态视角为主,不涉及电磁暂态,所以模型几乎全部由传递函数、积分器、惯量方程构成,看懂了原理,搭模型只是时间问题。

1. 调频仿真的底层逻辑:一次和二次差在哪里

做仿真之前,一定要先把物理概念掰清楚。很多人上来就找模块拖到画布上,结果AGC和一次调频信号混在一起,逻辑全乱。电力系统的频率本质上是发电机转子动能和负荷功率之间的平衡关系,可以用一个很简单的转子运动方程描述:

2H * df_per_unit/dt = ΔP_m - ΔP_e - D * Δf

这里H是发电机组的惯性时间常数,单位是秒,物理意义是转子从静止加速到额定转速需要的时间。ΔP_m是机械功率增量,ΔP_e是电磁功率增量,D是负荷的频率调节系数。这个方程贯穿全文所有模型,是核心中的核心。

一次调频和二次调频的区别在于控制信号从哪来、调节精度到哪去:

  • 一次调频是原动机调速器自主完成的。频率偏差被调速器检测到后,直接调节汽门或导叶开度,改变机械功率。特征是响应快,几秒到几十秒内完成,但属于有差调节,频率回不到50Hz,总有一个残差。就像家里热水器温度低了,感温元件自动点火,最后水温稳定在一个略低于设定值的点。

  • 二次调频是由调度侧的AGC系统完成的。AGC实时计算频率偏差和联络线功率偏差,得到区域控制偏差ACE,然后通过控制指令去修改各个机组的出力设定点。特征是从几十秒到几分钟尺度,属于无差调节,能把频率拉回50Hz。类比的话,一次调频是感温元件自动点火,二次调频是你发现水温不对,手动把设定温度调高了两度。

仿真模型搭建时的做法是:一次调频部分建调速器、原动机、惯量响应模型;二次调频部分建ACE计算、PI控制器、机组指令分配逻辑。两条通道分别在频率偏差的不同时间尺度起作用,但在模型里会叠加在同一条功率平衡方程上,这就是为什么很多人容易搞混。

对单一区域电网来说,系统频率是全区域一致的,不需要建潮流模型。Simulink里建多电源调频模型通常都用集中参数模型,把整个电网等效成一台大发电机,所有机组的出力变化都汇入同一个功率平衡节点。这样既抓住了调频的核心动态,又不会让仿真复杂到没法收敛。

2. 一次调频模型怎么搭:从调速器到惯量响应

一次调频建模的核心是还原各种电源对频率偏差的响应特性。不同电源的响应速度、调节范围、约束条件天差地别,把它们放在同一个模型里对比,就是多源调频仿真的价值所在。

2.1 骨架:集中惯量系统模型

我习惯先建一个集中惯量块作为整个系统的频率响应中心。输入落在外面的功率差ΔP(机械出力增量总和减去负荷扰动),输出是频率偏差Δf。这个块内部就是一个积分器加反馈:

Δf = (1 / (2H*s + D)) * ΔP

在Simulink里落地很简单:一个积分器、一个增益、一个求和模块。反馈系数D代表负荷本身的调频特性,负荷多了电网频率会自愈一部分,就是靠这个D体现的。

整个多源系统里,每个电源都有自己的出力增量输出,全部求和后输入这个惯量块,得到频率偏差,再反馈给每个电源的控制器作为输入。这样一个闭环就成了。实际项目里我会给这个惯量块单独封装成子系统,取名叫System inertia center,方便后续加多区域模型时复用。

2.2 火电和水电:传统调速器模型

火电模型是调频仿真里最繁琐的。汽轮机有高压缸和再热器,调速器动作后机械功率不会立刻上来,而是一个多时间常数的滞后过程。常用模型结构是调速器惯性环节、汽轮机惯性环节、再热器惯性环节串联。

一个典型火电机组的传递函数链是:

G(s) = 1/(T_g*s + 1) * (F_hp*T_r*s + 1)/(T_r*s + 1) * 1/(T_t*s + 1)

  • T_g是调速器时间常数,通常0.2秒
  • T_r是再热器时间常数,通常7到10秒,这是火电响应慢的关键
  • T_t是原动机蒸汽容积时间常数,通常0.3秒
  • F_hp是高压缸功率占比,通常0.3左右

如果不想要这么细,直接把三个传递函数块串联就行。我给一个常用的Simulink参数表,可以直接抄:

模块参数建议取值
调速器T_g0.2 s
汽轮机T_t0.3 s
再热器T_r7 s
高压缸占比F_hp0.3
调差系数R0.05 pu
死区DB±0.033 Hz

调差系数R是垂直线斜率,决定了同样频率偏差下机组增出力的多少。R越小,机组对频率越敏感,一次调频承担比例越大。Simulink里调速器结构是:频率偏差经过死区,除以R,再经过限幅,最后进入一串惯性环节。

水电模型比火电简单,但多了一个水锤效应。水轮机的机械功率变化与导叶开度变化之间存在反相位特性,导叶开大时水流惯性导致功率先下降再上升。标准模型用水流时间常数T_w来近似:

G_water(s) = (1 - T_w*s) / (1 + 0.5*T_w*s)

T_w通常取1秒左右。这个环节是个非最小相位系统,仿真时容易给人一种模型不稳的错觉,其实是物理特性,正常现象。做双区域联调的时候,水电机组往往是区域里调节速度最快的常规电源,搭好这个模型后你会看到频率震荡曲线里水电贡献的部分很灵敏。

2.3 风机怎么参与一次调频:惯量响应与备用功率

这里要特别说,因为很多人做风电调频时容易犯一个本质错误:直接把风机当成传统同步机,加一个调速器模型。这是不对的。双馈和直驱风机都是通过变流器并网的,转子转速和电网频率之间没有物理耦合。也就是说,电网频率变化时,风机如果不额外加控制,它的出力根本不会变。

要让风电参与一次调频,必须附加控制。常见的两种:

第一种是虚拟惯量控制。它模拟同步机的惯量特性,把频率变化率df/dt作为附加信号,叠加到有功功率参考值上。频率下跌时,风机通过释放转子动能,短时间提升出力。惯量响应有其物理极限,转子转速不能跌破最低值,而且出力的提升是暂时的,等转速降到最低后出力会跌落,甚至低于响应前水平,这段跌落是仿真时最容易忽略的坑。

第二种是超速减载和桨距角减载控制。正常风电是MPPT最大功率追踪,要留出一部分功率储备参与调频,就得让风机偏离最优转速或桨距角运行,比如减载10%运行。频率变化后,控制把减载释放出来,形成持续的一次调频支撑。

Simulink里实现的话,虚拟惯量控制是一个增益环节加限幅,输入频率偏差,输出功率增量。减载控制则需要一个逻辑判断:判断频率偏差是否超出死区,超出则把减载量转化为功率增量。风机出力的总增量就是惯量响应增量加上减载释放增量,再叠加本身的风速功率波动。

风速模型是另一个容易出问题的地方。最简单的做法是用组合风速模型,包含基本风、渐变风、阵风、随机风四个分量。实测数据也是好选择,但如果你只是做控制策略研究,组合风速模型配合一个低通滤波器已经够用。我习惯把风速模型单独放在最上层,计算出的机械功率再进入发电机模型,避免和调频控制逻辑混在一起。

2.4 光伏和储能:一次调频中的快通道

光伏的机械部分没有惯性,它和风机一样,本质上是逆变器接口电源。要让光伏参与一次调频,常规做法是让光伏减载运行,预留出功率,再用下垂控制响应频率偏差。光伏减载运行会造成弃光,实际工程里接受度有限,所以仿真时通常把它当做一个可调裕度很小的电源,在AGC层面参与,而不承担主要一次调频责任。

储能不同。储能是这些东西里响应速度最快的,功率变换器的响应时间常数可以做到几十毫秒,几乎可以忽略。储能一次调频下垂控制的Simulink模型极其简单:频率偏差经过死区,乘以下垂系数,再经过一个0.01到0.1秒的惯性环节,输出功率指令,送到电池功率响应模型。

真正需要费心思的是SOC状态和功率限制。储能容量有限,不能让它在一次调频中一直出力。我通常这样建模:

  • 功率指令经过一阶惯性后,跟SOC形成闭环计算
  • SOC高于90%或低于10%时,封锁功率,不让储能继续参与
  • 储能出力限幅设置成实际功率等级的0.5C到1C倍率

C倍率是电池容量倍率,1C代表用1小时充满或放完的电流水平。一次调频功率冲击频繁,仿真时如果不对SOC做约束,会出现频率已经被拉回来了,储能还在持续出力的异常结果,频率会反方向超调,这是很多储能模型跑出来曲线形状奇怪的原因。

3. 二次调频AGC模型:从ACE计算到机组指令分配

二次调频的模型结构和一次调频有本质区别:它多了区域控制偏差ACE的计算,多了PI控制器,还要解决一个电能潮流里最现实的问题,指令怎么分给下面这么多不同的机组。

3.1 ACE计算环节怎么搭

单区域系统里没有联络线,ACE等于B乘以频率偏差。B叫频率偏差系数,单位通常是MW/0.1Hz,取值大约等于系统自然频率特性的0.5到1倍。我建模型时用一个增益块就完成了。

多区域互联系统就要考虑联络线功率偏差了。ACE的公式是:

ACE = ΔP_tie + B * Δf

ΔP_tie是联络线功率偏差。两个区域互联时,把对方区域的功率偏差耦合进来,才会出现两个区域的AGC互相联动。Simulink里建立两区域互联很简单,就是把区域A的频率信号通过联络线增益接到区域B的模型里,反过来同样处理。

这一层建模比较容易碰到的问题是信号单位。我的做法是全程用标幺值,频率基准50Hz,功率基准用区域总装机容量。比如区域总装机2000MW,那么0.001pu的功率偏差等于2MW。标幺值的优势是AGC控制器、下垂系数、调差系数都能直接用文献里查到的经典取值,不需要反复量纲换算,模型里的增益块数值会比较符合直觉,调试起来也更方便。

3.2 AGC控制器:为什么不能直接用大积分增益

AGC控制器的经典结构是PI控制器。频率偏差进入PI控制器后,输出的是机组总功率调节指令。

但是这里有个非常关键的细节:AGC控制器的输出不是给单台机组,而是要给整个机组群。机组群内部火电、水电、风电、储能、电动汽车的响应特性差别太大了,如果直接把总指令发给所有机组,你会看到火电追不上指令,储能瞬间顶满,风电场那边混乱震荡。

正确的做法是把总指令按照机组特性分层分配。我实际采用的分配逻辑是:

  1. 储能和电动汽车作为快速响应层,承担指令中高频变化的部分
  2. 水电机组作为中速层,承担增量中的中间部分
  3. 火电机组作为慢速层,承担剩余的稳态增量

做分配时,各层分配系数可以不恒定,动态调整效果更好。Simulink里用比例分配块实现最简单,要高级一点可以用MATLAB Function写一段分配逻辑,根据各机组的当前出力、剩余容量、爬坡速率动态改变系数。

分配完之后要再次经过各自的限幅和第二层校验。AGC指令分配错误是模型跑飞的头号原因,我见过太多人只加增益不加限幅,最后的曲线直接上天。

3.3 储能和电动汽车的AGC快速响应通道

储能参与AGC是最近几年的热点,因为它响应速度快,调节精度高,特别适合补偿风电光伏的波动。在Simulink里建模,储能AGC通道是一二次调频的叠加:储能接受AGC总指令中分给它的一份,加上一次调频下垂控制给出的功率增量,两个信号求和后进入储能功率执行环节。

电动汽车参与AGC要麻烦一些。真实电动汽车的聚合量很大,几千台车的动力电池聚在一起才会有一个可观的调节容量。Simulink建模的经典做法是聚合模型,把单体电池模型乘以聚合数量得到车队总效应。单台车的充放电功率通常在7到50千瓦级别,几千台车聚合后能达到几十兆瓦。

电动汽车模型的另一个关键约束是充电意愿。车辆可能随时拔枪开走,所以参与AGC的车辆数量是动态的。简化模型里把这个因素折算成可调度容量衰减系数。比如区域内登记了5000辆可调度EV,但实际接入充电桩并能响应调频指令的可能只有60%,那么有效响应容量就是3000辆车对应的功率。这个系数给模型增加了真实性,又不能过度复杂。

在我的AGC模型里,EV被建模成一个带SOC约束的功率源,控制指令经过一个比储能稍慢的0.2秒惯性环节,在几十秒到几分钟时间尺度上响应AGC指令。这样和储能模型的区别体现出来了:储能是毫秒到秒级,EV可以做到几十秒级但容量更大,和火电水电形成互补。

4. 多源系统整体搭建与参数整定

模型搭到一定程度,你会发现每个电源单独跑都正常,一并网就乱。这往往是参数兼容和初始化的问题,和你的控制逻辑没多大关系。

4.1 模块组织与子系统封装

我强烈建议从一开始就按物理对象划分子系统。每个电源做成一个Simulink子系统,输入是频率偏差和AGC指令,输出是功率增量。这样后续想删掉某个电源,直接删掉整个子系统,前面的接线不用动。

子系统内部再划分层:控制器层,执行机构层,功率输出层。控制器层纯粹是算法,执行机构层是惯性环节和限幅,功率输出层把标幺值指令折算成功率。封装好之后用Mask给每个子系统设置参数变量,脚本初始化时统一赋值。

这样的结构还有一个好处是方便排查问题。仿真发散时,我可以在每个子系统的输出端加Scope或者To Workspace模块,看是哪个电源的功率增量先把系统拖崩的,而不是在几百个模块里瞎找。

4.2 参数从哪里来:典型值和计算过程

没有真实机组数据时,参数用文献里的典型值就行。下面是我常用的初始化参数表,适用于标幺值系统:

电源类型关键参数典型值
火电惯性时间常数H4.5 s
火电调差系数R5%
水电水流时间常数T_w1 s
风电减载率10%
风电惯量响应时间常数0.1 s
储能响应惯性常数0.05 s
储能下垂系数0.03 pu
EV响应惯性常数0.2 s
负荷频率调节系数D1.5 pu

有些参数是需要计算的,比如储能AGC的分配比例。我设三个条件:储能容量50MW、火电爬坡率5MW/min、水电调节速率100MW/min。那么发生100MW的负荷扰动时,快速需求部分是50MW给储能,剩下的水电承担30MW、火电承担20MW。分配比例就是50%、30%、20%,这个比例不是拍脑袋,是根据各机组能在一分钟内实际完成的调节量算出来的。

4.3 求解器与仿真时长的选择

调频模型属于连续过程,不涉及电力电子开关,不需要用刚性求解器。我用的是变步长ode23t,容差保持默认,大多数情况下足够。

但如果你把储能模型建得太细,加了电力电子换流器内部开关逻辑,那就必须换固定步长求解器,比如ode3或者ode4,步长设置成10到50微秒。这会直接导致仿真时间指数级上升。我的建议是初版模型不要建电力电子细节,重点看控制层面的动态,用一阶惯性代替PWM特性。等控制策略验证完毕,再单独建一个电力电子级的详细模型去验证特定工况。

仿真时长要根据你研究的事件类型定:一次调频响应看30到60秒就足够;二次调频AGC要跑到300到600秒,因为要看到火电机组的爬坡过程;电动汽车充放电切换等长时间工况,要跑到1000秒以上。时长设短了,曲线看起来可能正常,但根本没展示出慢速机组的完整调节过程。

5. 调试过程中踩过的坑,每条我都付过学费

这一章是我最想写的。模型跑不通、曲线发散的坑,翻来覆去就那么几类,但只要踩一次,至少浪费两天时间。

5.1 代数环:看上去是控制问题,实际是建模问题

代码块一开始提到的那个案例,就是典型的代数环。Simulink模型里如果信号从输出端直接反馈到输入端,中间没有任何状态模块(积分器、传递函数、Memory之类的),Simulink就会提示代数环,严重时直接报错。

比如储能下垂控制,频率偏差Δf由惯量块计算而来,储能出力ΔP_storage又依赖于Δf,而ΔP_storage又反过来影响Δf。如果在惯量方程里没有用积分器或任何带状态变量模块隔开,信号环路就形成了。

解决代数环的办法很简单:在反馈路径里插入一个Time Delay、Memory或者极小时间常数的一阶惯性环节。这么做物理上也能解释,储能响应虽然快但毕竟是有限时间,把时间常数设为0.01秒不影响结果。

调试时观察模型界面左下角有没有黄色三角形警告,那里面就会写Algebraic loop detected。看到后别急着改参数,先把环路断开加上状态模块,这是第一优先级。

5.2 风光波动模型太尖锐,仿真曲线没法看

用随机数生成风速时,如果直接用Uniform Random Number,输出功率会跳变得非常剧烈,看起来就像噪声而不是实际风速变化。

实际风速变化是平滑的,我处理办法:先让基础风速保持恒定,叠加的随机扰动经过一个时间常数为5到10秒的低通滤波器,模拟风的惯性。另外用谱分析方法模拟更好,把Kaimal谱或者Von Karman谱转换成时域信号,但这是进阶玩法,一般项目和毕设完全可以用低通滤波器快速得到可信曲线。

光伏波动类似,云层遮挡造成的功率变化时间尺度在几十秒到几分钟,用带滤波的阶跃或斜坡信号叠加到基础功率上即可。

5.3 储能SOC约束导致的突变

有一次我把储能模型里SOC当作连续积分直接从初始状态开始积分,结果仿真到400秒时SOC到达上限,我在代码里写了一个fal函数,一旦SOC超限就让功率指令直接归零。这个阶跃直接给系统注入了一个大扰动,频率曲线瞬间被拉歪。

正确的做法是SOC受限时平滑地限制功率变化率,而不是瞬间切掉。储能SOC过高时,限制只放不充或只充不放,同时用斜坡限制摆率,让功率在几秒内渐变为零。Simulink里可以用Rate Limiter模块,比直接写if逻辑平滑得多。

后来我又补了一个细节:SOC的计算要考虑充放电效率,充电时乘以0.95的系数,放电时除以0.95,长期仿真下SOC衰减才是合理的,不然静态误差会让结果失真。

5.4 死区与限幅配合不当导致频率振荡

一次调频死区、AGC死区、机组调节限幅三者是配套的。我刚开始建模时,死区设成±0.033Hz,AGC死区设成±0.01Hz,看起来都是文献里的典型值,结果跑出来频率在死区边界附近反复穿越,AGC频繁动作,火电一直在爬坡和降出力之间切换。

后来我用了一个配合策略:一次调频死区大于AGC死区,让AGC在更小的频率偏差时就开始动作,这样一次调频尚未触发时,AGC已经领先拉动频率,火电不必在大范围内反复调节。这个配合关系是工程经验,没有哪个文档会直接告诉你,得自己试验才能体会。

另外限幅的斜率要和爬坡率匹配。火电出力变化率上限是每分钟3%到5%额定功率,如果AGC输出指令没有加这个爬坡限制,火电追不上指令导致积分累积,最终引起超调。

5.5 单位制混乱:最隐蔽的错误

标幺值系统建好后,各模块的增益全部按照标幺值设好,仿真正常。有一天我为了让结果更直观,把频率偏差的单位从pu改成Hz,直接改了两个增益的数值,结果整个AGC控制器的动态完全变了,频率不收敛。

排查了两小时才发现问题根本不在数值,而在单位。我的建议是:全程统一用标幺值,最后只在Scope显示模块里通过乘以50Hz来还原成实际频率,绝不在中途混用单位制。这个原则看起来只是一个规范问题,却能避免掉一半以上的调参混乱。

6. 模型跑通之后还能怎么扩展

基础模型跑通后,扩展空间很大。这个模型框架几乎可以无缝升级,把你研究的各种策略塞进去验证。

最自然的扩展是到两区域互联模型,把集中单区域拆成两个子系统,中间通过联络线功率耦合,增加联络线功率偏差控制,就变成一个标准的AGC研究平台,可以直接应用于区域调频、联络线交换功率考核、储能辅助调频市场策略等方向的研究。

如果想往工程化走,可以把建好的Simulink模型用Simulink Coder生成C代码,部署到实时数字仿真装置里做硬件在环测试。储能逆变器、风机变流器的控制策略在真实控制器上跑之前,先用这个模型做一次快速验证,能省下大量现场调试时间。生成代码时注意把连续求解器换成离散求解器,设置一个合适的采样周期,比如1ms,AGC部分的采样时间可以用100ms到1秒。

如果想跟调度策略结合,可以在AGC控制器里嵌入一个经济调度算法,利用MATLAB Function调用optimoptions和linprog做实时滚动优化,把二次调频的指令分配从简单比例变成考虑发电成本的最优分配。每次优化周期,以当前机组出力和预测负荷为输入,输出各机组下一时段的出力修正量。这个方向已经是目前电网调频研究的主流,搭建起来工作量并不大,核心框架还是这篇文章里的这些模块。

我个人在这套模型里做过的最后一项扩展,是把电动汽车从单一功率源改成分群聚合模型,每群有自己的SOC、充放电效率和响应速度,AGC指令发到群里后由群控策略决定哪辆车响应。这个模型可以从策略研究层面体现电动汽车的调节潜力,又能节省数千辆车逐一建模的计算量,属于性价比很高的扩展示范。

做调频仿真,最耗时间的往往不是搭模型本身,而是被移植过来的各种细节问题拖住。参数初始化脚本、单位统一、死区配合、SOC处理,这些坑我都替你踩过了。如果你现在手里的仿真模型也遇到了发散、震荡或者结果完全不合理的问题,建议先从头把频率响应的闭环画一遍,把信号回路理清楚,再回来调参数。顺着这个逻辑走,绝大多数问题都能在半天内定位到根因。

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

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

立即咨询