光伏储能虚拟同步发电机并网仿真模型详解:从VSG原理到Simulink实战
做光伏储能并网仿真做了一段时间后你会发现“光伏储能虚拟同步发电机并网仿真模型”这个名字虽然长但把它拆开就三件事光伏阵列和储能电池组成直流侧逆变器完成功率变换控制器里跑虚拟同步发电机VSG算法。用Simulink把这三段搭起来就能直观看到电网频率波动或者负载突变时系统是如何像一个真正的同步发电机一样提供惯量和阻尼支撑的。这篇就围绕这套模型聊聊整体架构、核心控制、并网测试以及我在实际搭建和调参过程中踩过的那些坑适合正在做新能源并网、微电网、电力电子控制或者VSG方向研究的朋友参考。这套模型最核心的价值不是让你“跑通一个仿真”而是让你能把同步发电机“转子运动”的物理概念和逆变器控制结合起来。很多同学一开始觉得VSG高深真正动手后发现无非就是在逆变器的控制环路里加了一个反映惯性的二阶方程再加一个下垂特性。可就是这个方程能让并网变流器从“只送电”变成“会支撑电网”区别非常大。1. 项目概述与核心思路拆解1.1 为什么要用虚拟同步发电机先问一个问题传统的并网逆变器控制已经能实现有功无功调节PQ控制和下垂控制也用了很多年为什么还要引入VSG因为传统PQ控制本质上是把逆变器当成一个电流源实时跟踪电网相位输出设定好的有功和无功。下垂控制虽然能模拟同步发电机的一次调频一次调压特性但缺少真正的惯性和阻尼。电网发生频率扰动时同步发电机会因为转子储藏的动能自动释放或吸收一点功率来减缓频率变化这个能力叫“惯量响应”。而电力电子变流器没有物理转子上一毫秒还在输出1千瓦下一毫秒可能就变成1.1千瓦这种“快”对弱电网来说反而是负担。VSG的思路就是在逆变器的控制算法里“虚拟”出同步发电机的转子运动方程让变流器在响应特性上具备惯量和阻尼。你不想让它太快它就故意慢一点电网频率下降时它会自动增加输出功率而不是只等上位机指令。换成人话VSG让逆变器从“工具人”变成“有态度的参与者”。光伏储能和VSG天然搭配。光伏本身输出波动大没有储能很难持续提供虚拟惯量所需的有功增量。加了储能电池后直流母线有稳定支撑VSG算法需要释放或吸收功率时储能电池可以快速补充或回收能量所以“光伏储能VSG”这套组合在微网和分布式能源场景里非常常见。控制方式输出特征惯量支撑阻尼特性适用场景PQ控制恒功率电流源无无电网强、直接并网下垂控制电压源带下垂无静特性弱微网、离网并联VSG控制电压源带惯量有有弱电网、微网、黑启动1.2 光伏储能VSG的架构设计整机架构可以分成三层看。第一层是源侧光伏阵列经Boost电路升压同时做MPPT最大功率跟踪储能电池经双向DC-DC变换器挂在直流母线上负责稳定母线电压。第二层是变换层三相逆变器把直流电变成交流电通过L或者LCL滤波后并网。第三层是控制层VSG算法采集逆变器输出电压、电流、频率计算出电压幅值和相位的指令再交给电压电流双闭环生成PWM。在Simulink里我习惯把模型分成几个独立子系统用黄色的注释框标清楚每个模块的作用。光伏阵列用Simscape Electrical里的PV Array模块电池用Battery模块逆变器用Universal BridgeBoost和双向DC-DC用半桥或者全桥的开关管搭控制器用标准库函数写。这样的好处是后续换参数、换工况很方便不用整个模型推倒重来。直流母线电压一般取750V左右具体看逆变器调制方式和并网电压等级。做模拟时我常用400V三相交流并网逆变器直流侧用800V这样调制比不至于太高波形谐波也小。储能电池端电压相对低双向DC-DC要升压到直流母线这部分不能省否则直流母线电压会随光伏出力波动VSG的输出也会跟着抖。2. 仿真模型搭建前的准备工作2.1 工具选型与版本说明如果你用的是MATLAB R2020a以上版本推荐直接用Simscape Electrical专项库组件比较全。需要注意不同版本里有些模块的命名和引脚会变比如旧版的“PV Array”新版叫“Solar Cell”模块的参数结构改了最好先打开模块帮助文档核对一遍。如果要做控制验证至少要装Simulink Control Design调参配合“Control System Designer”会比较方便。如果你想后面做模型输出还需要Simulink Coder、Embedded Coder这些。初期先用R2020a就够了不需要追求最新版。新版Simulink确实在界面和库上有所改进但个别第三方支持包可能要重新配置。而且网上能找到的参考资料很多是基于旧版的版本漂移后会遇到“模块找不到”的异常提示反而增加无谓的麻烦。另外搭建模型时养成两个好习惯。第一每个信号线尽量标明单位用Goto和From总线组织信号而不是靠颜色辨认第二模型里放几个“Scope”或者“Simulink Data Inspector”打点避免最后波形没存下来又要重跑。Simulink的数据记录功能默认是开启的但如果你勾选了“Fast restart”有些变量不会被记录排查问题时会很别扭。2.2 光伏储能单元建模基础光伏阵列建模时最常用的方式是直接把PV Array模块参数设置成实际光伏组件。我一般设定标准测试条件STC下最大功率约300W然后按阵列串并联数量配置。比如要做一个100kW的光伏侧选330W组件大概需要300块按20串15并排布每一串的电压约为额定电压的1.5倍。MPPT用扰动观察法在MATLAB Function里写个小函数采样光伏电压和电流通过比较当前功率和上一拍功率来决定扰动方向输出Boost的占空比。储能电池用Simscape Electrical的Battery模块选择锂离子类型容量和初始SOC按光伏功率差额来定。假设系统额定100kW光伏最高出力80kW负载最大60kW需要储能支撑的功率大概在20~50kW范围那么电池容量可以做150Ah左右2小时率放电能力能到75kW。初始SOC设在60%开工前要确认模块里的SOC曲线和开路电压拟合参数是合理的否则仿真中途SOC跳变会让人摸不着头脑。双向DC-DC控制是直流母线稳定的关键。我通常用电压外环加电流内环外环控制母线电压内环控制电感电流。母线电压给定值设为800V外环PI输出做电流指令电流环再输出PWM。这样做的好处是应对光伏功率突变时电池电流能快速响应母线电压波动控制在±5%以内。注意双向DC-DC有升压和降压两个方向所以控制要分象限处理用Enable或者switch逻辑切换工作模式不然电池充电和放电时电流环会打架。直流母线电容也不能乱取。经验公式是按照允许的母线电压纹波来确定C P/(2ωgVdc*ΔVdc)其中P是变换功率ωg是工频角速度ΔVdc是允许电压波动。以100kW、800V、允许10V波动为例C大约在10000uF左右。实际仿真实测时发现电容小了电压波动大电容大了一点系统动态响应变慢需要取折中值。3. 虚拟同步发电机核心控制算法实现3.1 有功-频率控制调速器模拟参数计算VSG的核心是转子运动方程写成电力电子控制里习惯的标幺形式就是J * dω/dt Pm - Pe - Dp(ω - ωn)其中J是虚拟转动惯量ω是VSG虚拟角速度ωn是额定角速度Pm是虚拟机械功率由有功指令和频率偏差合成Pe是逆变器实际输出的电磁功率Dp是阻尼系数。这个方程一句话解释当输出电磁功率不等于输入机械功率时角速度就会变化Dp提供与频差成正比的阻尼功率让振荡慢慢衰减。在Simulink里实现这个方程我习惯用两个积分器串联第一个积分器把角加速度积分成角速度第二个积分器对角速度积分得到虚拟相位角。虚拟机械功率Pm参考的是调速器特性Pm Pref Kf * (f_ref - f_grid)其中Kf是一次调频系数表示每0.5Hz频差能改变多少功率。如果系统额定功率100kW想做到4%下垂即频率偏离0.2Hz时功率变化100%那Kf 100kW / 0.2Hz 500kW/Hz。实际工程中Kf取值还要考虑频率死区避免微小频率波动引起功率抖动但仿真里先不加死区便于观察动态过程。转动惯量J如何定这里引入同步机惯量时间常数H的概念H J * ω0^2 / (2 * Sbase)表示转子储能相对于额定视在功率的比值。同步机的H通常在2~10s之间VSG也是一样。取H3sω0314 rad/sSbase100kVA则J 2HSbase / ω0^2 23100000 / 314^2 ≈ 6.1 kg·m^2。阻尼系数Dp则与系统的阻尼比相关可以用二阶系统等效Dp 2ζωn*Jζ取0.7~1时动态响应不过冲且收敛快。算出来以后放进模型先跑一次空载阶跃看功率和频率波形是否收敛。特别注意一个细节dω/dt方程里的Pe不能直接测量逆变器功率到控制环因为功率测量环节通常有滤波会引入延迟。更合理的做法是用VSG电压指令和输出电流计算出瞬时有功功率再经过一阶低通滤波器。低通滤波器时间常数不能太大否则惯量效果被滤没了一般取10~20ms。3.2 无功-电压控制励磁器模拟与虚拟阻抗VSG的电压控制模拟的是同步发电机励磁系统给定无功功率参考根据电网电压偏差调整内电势幅值。最常见的形式是E E_ref Kq * (Q_ref - Q_actual) Ku * (U_ref - U_grid)这个式子有两个作用第一Kq项让无功功率跟踪参考值类似下垂控制第二Ku项让机端电压跟踪额定值类似自动电压调节器。二者配合可以同时实现无功分配和电压稳定。注意符号不能搞反很多人在调这个地方发现电压越来越低就是Ku反馈成正反馈了。除了电压幅值还要考虑线路阻抗的影响。VSG输出电压和并网点之间隔着线路电感和变压器漏抗如果只控内电势功率耦合会比较严重尤其在中低压线路阻感比接近1时。解决办法是加入虚拟阻抗让VSG的输出阻抗呈现强感性保证有功和无功解耦。虚拟阻抗表达式为V_ref E - (R_v jX_v) * I_oR_v取0.01~0.05 p.u.X_v取0.1~0.3 p.u.。在dq坐标系下实现时把虚拟电阻和虚拟电感分别作用在d轴和q轴电流上注意交叉耦合项要补回来。公式可以写成V_d E_d - R_vi_d X_vi_q V_q E_q - R_vi_q - X_vi_d这个变换看起来简单但很容易把正负号弄反。我自己的调试经验是先在简单阻感负载下把单位功率因数并网跑通再加大虚拟阻抗看功角响应是否稳定。得到V_ref之后后面接电压外环和电流内环。电压外环用PI控制器把电容电压稳定在VSG给出的指令值上电流内环再控制电感电流跟踪电压外环输出。整个控制链从VSG到PWM有四级VSG计算电压给定电压外环生成电流指令电流内环生成调制波PWM发生器输出开关信号。每一级的带宽要拉开一般电流内环1000Hz左右电压外环100~200HzVSG的功率环10~20Hz这样层间不会相互打架。4. 并网运行仿真与结果分析4.1 并网测试场景设置模型搭完不是直接跑个正弦波就算完并网仿真最关键的是设计有说服力的测试工况。我自己常用三组场景第一组是电网频率阶跃跌落0.5Hz观察VSG有功输出是否先惯性爬升再稳定到一次调频点第二组是本地负载突增30kW观察母线电压和输出电流的动态第三组是光伏光照强度突变观察储能补偿和直流母线波动。并网操作本身也要做预同步。VSG要并网必须保证输出电压幅值、频率和相位与电网一致否则合闸瞬间冲击电流会很大。在模型里预同步环节可以做成一个独立的闭环把电网和VSG两边的电压差和相位差作为输入调节VSG的频率和幅值参考直到误差小于阈值。合闸用三相断路器但要注意断路器模块的时延设置。很多新手遇到“并网没反应”“断路器没闭合”就是因为把Timing参数里的“Switching of internal timer”打开了却没有给外部控制信号或者把transition time设成0导致仿真一开始就闭合后面又断不开。并网点选择也很关键。建议在断路器后面直接接一个Three-Phase Source代表无穷大电网再串一条线路电抗。这样既能模拟电网强度又能方便地施加电压跌落和频率偏移。如果要考虑弱电网可以把Source的短路容量调低比如设成200MVA甚至加一个可变阻抗来模拟不同电网强度下的VSG响应。仿真时长不要设太长我一般跑5秒步长10微秒用离散求解器。5秒足够覆盖动态过程又不会让数据文件炸掉。关键波形用Simulink Data Inspector记录比如PLL输出的电网频率、VSG虚拟角速度、输出三相电流、直流母线电压、电池SOC这些量是后续分析的全部依据。4.2 结果解读与波形分析看波形的时候最想看到的是“惯性”。电网频率在1秒时突然下降0.5Hz如果用传统的PQ控制逆变器有功基本不变或者按照下垂特性线性增加。而VSG控制下有功会先有一个“过冲”般的爬升然后回落到一个新的稳态这个爬升过程就是虚拟惯量在起作用。你可以把这条曲线和同步发电机的功率摆动曲线对比形状很接近。如果曲线直接阶跃跳变说明VSG方程没起作用多半是积分器被限幅卡死或者Pe计算反馈错了。有功响应的同时虚拟角速度会下降一点然后恢复到额定值附近。由于Dp的存在频率不会反复振荡。如果波形出现等幅振荡或者发散基本就是阻尼系数Dp太小、J太大或者电压电流内环响应太慢导致相位裕度不足。此时先调大Dp观察波形稳定后再慢慢减小Dp到一个合理值而不是上来就乱调J。直流母线电压波形同样有信息量。光伏出力稳定的情况下母线电压应该基本平直波动不超过±10V。负载突变时母线电压会有个几毫秒的下陷然后被双向DC-DC拉回来。如果这个下陷深度超过50V说明电池电流环带宽不够或者母线电容偏小。储能SOC曲线则是一条平缓下降或上升的斜率如果SOC变化特别剧烈说明你的MPPT和VSG有功指令存在反复摄动需要检查MPPT步长和信号滤波。无功部分看电压幅值和无功输出。无功阶跃时VSG内电势E会调整机端电压最终收敛到参考值附近。如果电压出现稳态偏差检查Ku参数和虚拟阻抗是否过大。虚拟阻抗太大会产生额外压降导致并网点电压偏低这时候必须在电压给定里做补偿或者把虚拟电阻和虚拟电感分别限幅。5. 常见问题与排查技巧实录5.1 仿真发散、步长和求解器问题我遇到最多的问题是“仿真跑着跑着发出NaN错误”或者“波形像锯齿一样高频振荡”。90%的情况出在求解器设置和PWM波形上。Simulink默认的变步长连续求解器适合简单连续系统但VSG模型里既有整流桥这种强非线性元件又有控制器里的离散采样PWM开关信号还会产生高频切换。强烈建议把求解器设为“discrete”固定步长设为1e-5或5e-6秒。这个步长要小于PWM载波周期的三分之一否则开关脉冲会失真。还有一个特别容易忽略的是代数环。转子运动方程里的Pe实际输出又反过来影响Vref如果直接把Pe连接成电压指令Simulink会提示有代数环导致步长越算越小。解决办法是在反馈回路上加一个Memory模块或者Transport Delay或者用离散积分器把循环截断。加Memory后波形可能会有一个步长延迟这在10微秒量级下几乎可以忽略但稳定性提升非常明显。数据类型问题也常见。Simulink里的开关控制信号如果从MATLAB Function出来默认可能是double而三相断路器的控制口需要boolean。这时候要用Convert模块或者在函数内部直接强制类型转换。不少人用“Selector”提取信号时没注意维数比如习惯写u(1)但输入信号是矩阵读到的不是想要的量。建议在信号线上先添加“Width”和“Display”模块确认维数再决定索引写几。5.2 参数适配与PI调参心得VSG模型里需要调的参数很多但如果找对顺序并不麻烦。我的调参顺序是先内环后外环先直流后交流。第一步把直流母线闭环调稳双向DC-DC的电压环PI带宽调到电流环的1/5左右。第二步把逆变器电流内环调稳用最传统的工程整定法忽略电网扰动把被控对象近似成一阶惯性环节Kp取L/(3*Ts)Ti取L/R。比如滤波电感2mH电阻0.1ΩTs1e-4Kp大约6.7Ti0.02s再根据实际波形微调。电压外环带宽要比电流环低一个数量级否则两个环之间会产生谐振。最简单的确认方法是在电流环参考上加一个小阶跃看电流是否能在1ms内跟踪上并且没有剧烈超调。如果电流环有震荡调大阻尼比也就是增加Kp的同时适当增加Ti直到波形干净。VSG功率环的J和Dp不建议一开始就用理论公式锤死可以先固定JDp从小到大扫一遍看频率最大偏差和恢复时间。我的经验是Dp太小频率振荡多个周期Dp太大虽然频率稳了但一次调频后的稳态偏差会被拉大。取一个既能抑制振荡又不牺牲调差率的中间值再回到理论公式验证一下是否接近。全部调完后把模型里所有Scope换成“To Workspace”方便批量保存数据做FFT或者误差分析。最后说两句体会跑这套模型最大的收获是终于理解了“惯性”不是玄学而是确确实实能在一个微分方程里表达出来的物理量。VSG不能替代真实的同步发电机组但它能让电力电子装置在弱电网环境下不再那么“玻璃心”。我在实际搭建中体会最深的是直流母线稳定才是VSG稳定输出的前提很多人在交流控制里反复调PI调不好其实问题出在直流侧被光伏波动带飞了。如果你也在搭类似的仿真建议先把光伏和储能独立跑通再接入VSG闭环每加一个环节就停下来检查波形不要等整个模型连起来才排查问题。后面我会把自己整理好的参数表、模块配置截图和典型工况波形整理出来放一起方便想快速复现的同学做对照。