ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

风光火储一次调频与AGC二次调频Simulink建模全解析

风光火储一次调频与AGC二次调频Simulink建模全解析 上个月帮人救一个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控制器的输出不是给单台机组而是要给整个机组群。机组群内部火电、水电、风电、储能、电动汽车的响应特性差别太大了如果直接把总指令发给所有机组你会看到火电追不上指令储能瞬间顶满风电场那边混乱震荡。正确的做法是把总指令按照机组特性分层分配。我实际采用的分配逻辑是储能和电动汽车作为快速响应层承担指令中高频变化的部分水电机组作为中速层承担增量中的中间部分火电机组作为慢速层承担剩余的稳态增量做分配时各层分配系数可以不恒定动态调整效果更好。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 puEV响应惯性常数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.033HzAGC死区设成±0.01Hz看起来都是文献里的典型值结果跑出来频率在死区边界附近反复穿越AGC频繁动作火电一直在爬坡和降出力之间切换。后来我用了一个配合策略一次调频死区大于AGC死区让AGC在更小的频率偏差时就开始动作这样一次调频尚未触发时AGC已经领先拉动频率火电不必在大范围内反复调节。这个配合关系是工程经验没有哪个文档会直接告诉你得自己试验才能体会。另外限幅的斜率要和爬坡率匹配。火电出力变化率上限是每分钟3%到5%额定功率如果AGC输出指令没有加这个爬坡限制火电追不上指令导致积分累积最终引起超调。5.5 单位制混乱最隐蔽的错误标幺值系统建好后各模块的增益全部按照标幺值设好仿真正常。有一天我为了让结果更直观把频率偏差的单位从pu改成Hz直接改了两个增益的数值结果整个AGC控制器的动态完全变了频率不收敛。排查了两小时才发现问题根本不在数值而在单位。我的建议是全程统一用标幺值最后只在Scope显示模块里通过乘以50Hz来还原成实际频率绝不在中途混用单位制。这个原则看起来只是一个规范问题却能避免掉一半以上的调参混乱。6. 模型跑通之后还能怎么扩展基础模型跑通后扩展空间很大。这个模型框架几乎可以无缝升级把你研究的各种策略塞进去验证。最自然的扩展是到两区域互联模型把集中单区域拆成两个子系统中间通过联络线功率耦合增加联络线功率偏差控制就变成一个标准的AGC研究平台可以直接应用于区域调频、联络线交换功率考核、储能辅助调频市场策略等方向的研究。如果想往工程化走可以把建好的Simulink模型用Simulink Coder生成C代码部署到实时数字仿真装置里做硬件在环测试。储能逆变器、风机变流器的控制策略在真实控制器上跑之前先用这个模型做一次快速验证能省下大量现场调试时间。生成代码时注意把连续求解器换成离散求解器设置一个合适的采样周期比如1msAGC部分的采样时间可以用100ms到1秒。如果想跟调度策略结合可以在AGC控制器里嵌入一个经济调度算法利用MATLAB Function调用optimoptions和linprog做实时滚动优化把二次调频的指令分配从简单比例变成考虑发电成本的最优分配。每次优化周期以当前机组出力和预测负荷为输入输出各机组下一时段的出力修正量。这个方向已经是目前电网调频研究的主流搭建起来工作量并不大核心框架还是这篇文章里的这些模块。我个人在这套模型里做过的最后一项扩展是把电动汽车从单一功率源改成分群聚合模型每群有自己的SOC、充放电效率和响应速度AGC指令发到群里后由群控策略决定哪辆车响应。这个模型可以从策略研究层面体现电动汽车的调节潜力又能节省数千辆车逐一建模的计算量属于性价比很高的扩展示范。做调频仿真最耗时间的往往不是搭模型本身而是被移植过来的各种细节问题拖住。参数初始化脚本、单位统一、死区配合、SOC处理这些坑我都替你踩过了。如果你现在手里的仿真模型也遇到了发散、震荡或者结果完全不合理的问题建议先从头把频率响应的闭环画一遍把信号回路理清楚再回来调参数。顺着这个逻辑走绝大多数问题都能在半天内定位到根因。
返回列表