
做光伏储能仿真的朋友十有八九都会撞上同一个问题VSG虚拟同步发电机的原理一读就懂转子运动方程加上无功下垂公式也不复杂可真要把这套控制逻辑在Simulink里变成能跑的模型再扣上光伏和储能麻烦事一件接一件。我最早搭模型的时候最崩溃的一步不是算法本身而是Simulink里那堆模块之间的耦合关系功率测量送进转子运动方程运动方程算出的相位又去驱动PWMPWM一变测量值跟着变来回一耦合代数环和发散齐刷刷地冒出来。这篇东西就是我从一个能跑的并网模型到能扛负荷突变和光照突变的完整模型一路调过来攒下的经验写给正在搭光伏储能VSG仿真模型的人参考。不管是刚把VSG概念吃透、准备动手建模仿真的研究生还是已经跑通基础模型、想优化动态性能的工程师这篇内容都能给你省下不少试错时间。1. VSG方案为什么适合光伏储能从原理到Simulink落地的逻辑链条1.1 光伏侧为什么需要储能来“撑场面”光伏和储能放在一起做VSG首先是物理特性决定的。光伏阵列本身是一个电流源型的功率源它的出力完全取决于光照、温度和当前工作点既不提供惯量也不主动建立电压和频率。如果单独让光伏逆变器去带一个离网负荷光照一抖功率跟着抖电压和频率瞬间就跑飞了。储能则不一样电池通过双向DC/DC挂在直流母线上既能吸收多余功率也能在光伏出力不足时补上缺口。这就是所谓“光储联合”能承担构网型控制任务的物理基础光伏负责发能量储能负责做平衡。这个逻辑放进Simulink里就决定了模型的最上层架构光伏阵列和Boost电路组成一个功率源MPPT算法把光伏工作点钉在最大功率点附近储能电池和双向DC/DC组成一个母线电压稳定环它盯着直流母线电压高了就充电低了就放电然后整个直流母线通过一台三相逆变器接出去逆变器由VSG算法控制对外呈现出类似同步发电机的电压源特性。三者缺一不可少了储能那一环VSG再怎么调参数母线一垮全盘拉倒。1.2 虚拟同步发电机到底模拟了同步机的什么VSG的出发点是让逆变器在控制层面复现同步发电机的两个关键外特性惯性和阻尼以及一次调频调压的下垂特性。核心公式就是转子运动方程J dω/dt Pm − Pe − D(ω − ω0)这里的J是虚拟惯量单位是kg·m²D是阻尼系数Pm是虚拟机械功率Pe是逆变器实测输出有功功率ω是虚拟角速度ω0是额定角速度。方程的含义很直白当输出功率和输入功率不平衡时角速度按J/D的关系缓慢变化而不是瞬间跳变。这就是“虚拟惯量”的来源。另外还需要一条无功–电压下垂方程来决定虚拟电动势E的幅值E Eref Kq (Qref − Qo)其中Eref是额定电动势幅值Kq是无功下垂系数Qref是给定无功Qo是实测无功。两条公式合在一起VSG就能给出一个幅值和相位都受控的三相参考电压后续再叠加电压电流双闭环和PWM调制逆变器的行为就和一台“虚拟发电机”高度一致了。Simulink建模的核心就是把这两条方程用积分器、增益和减法器搭出来搭对了VSG的“魂”就出来了。1.3 Simulink建模的整体信号流设计实操中Simulink模型我建议按信号流分层搭别把功率电路和控制电路搅在一起否则后面查起问题来非常痛苦。整条信号流是这么走的光伏阵列输出电压电流进MPPT算出Boost占空比Boost输出接到直流母线储能双向DC/DC用母线电压外环加电流内环控制维持母线在750V左右母线再接入三相逆变桥逆变桥由VSG生成的PWM驱动逆变桥输出经过LC滤波器接并网开关再接到理想电压源或者本地负荷。控制侧信号流则是测量逆变器输出的三相电压电流算出有功功率Pe和无功功率QoPe送进转子运动方程得到虚拟角速度ω再积分得到相位θQo送进无功下垂方程得到电压幅值EE和θ合成三相参考电压进入电压电流双闭环输出调制信号最后和三角载波比较生成PWM。这套信号流搭完之后整个模型的可读性会好很多每个环节出问题都能通过Scope逐级定位。2. 光伏储能VSG模型的模块级拆解从光伏阵列到并网点2.1 光伏阵列与MPPT别在仿真里把简单问题做复杂光伏阵列在Simulink里直接用Simscape Electrical的PV Array模块就行。这个模块把光伏组件的I-V曲线、P-V曲线、温度和光照影响都内置好了你只需要设置组串数量、并联路数、Voc、Isc这些参数。MPPT算法我建议用扰动观察法写成一个S-Function或者用Simulink基础模块搭都行。核心逻辑是实时测量PV输出电压和电流计算功率然后根据功率变化方向调整下一个周期的占空比扰动方向。这里有个我踩过的坑MPPT的采样周期和Boost开关周期如果不匹配PWM和MPPT会互相打架。我习惯的做法是Boost开关频率设在10kHzMPPT的扰动周期设在0.01s也就是每200个开关周期才扰动一次这样光伏工作点在扰动之间能稳定收敛不会出现功率来回振荡。另外PV Array模块输出的电压电流波形是连续的但MPPT计算需要的是功率平均值所以中间要加一阶低通滤波时间常数取0.001s左右否则扰动很容易误判。2.2 储能单元与双向DC/DC母线电压稳定的关键储能单元在仿真模型里可以简化为一个电压源加内阻的直流电池模型但要真实反映SOC变化对母线的影响建议直接用Simscape的Battery模块。双向DC/DC的控制目标只有一个维持直流母线电压稳定。外环是母线电压PI控制器输出作为电流内环的给定内环是电感电流PI控制器输出占空比决定升压放电还是降压充电。母线电压环的带宽要设计得比VSG的功率环快得多不然负荷突变时VSG需要储能补功率储能却反应迟钝母线电压就会大幅跌落。我实测的经验是母线电压环穿越频率放在200Hz左右VSG的有功功率环等效带宽放在10~20Hz这样各级之间不会出现时间尺度上的冲突。电容值也不能太小我按50kW系统取4000μF左右母线电压波动能控制在±5%以内。2.3 VSG核心算法模块转子运动方程与虚拟调速器/励磁调节器VSG核心在Simulink里并不复杂难在信号连接的细节。我建议把转子运动方程、有功下垂、无功下垂单独封装成一个subsystem输入是Pe和Qo输出是θ和E。转子运动方程的实现方式为用增益模块把1/J乘进去经过积分器得到ω然后对(ω−ω0)做积分得到相位θ。积分器初值必须设成ω0也就是314.159否则启动瞬间等效相位跳变会产生极大的冲击电流。有功下垂也叫虚拟调速器它模拟一次调频特性Pm Pref Kp(ω0 − ω)也就是频率低了就增加输入功率。这个Pm在稳态时等于Pe动态过程中用来平衡负荷变化。无功下垂的实现更简单E Eref Kq(Qref − Qo)注意符号方向无功输出偏大时要压低电压所以Kq前面的符号按实际下垂方向定别接反了接反了调压就变成了增压系统会越来越不稳。2.4 电压电流双闭环与LC滤波器控制目标落实VSG计算出来的E和θ只是参考电压真正进入PWM之前还需要经过电压电流双闭环这是为了让逆变器输出的实际电压快速跟踪参考值同时具备限流能力。电压外环采用PI控制输入是参考电压和实际输出电压的误差输出是电容电流参考值电流内环也是PI输入是电流误差输出是调制波。Simulink里用离散PI控制器模块采样时间取1e-6到1e-5都可以但必须跟PWM计算步长保持一致。LC滤波器的参数对动态性能影响很大。L太大电流环响应慢C太大电压环容易振荡。我按额定功率50kW、交流380V、开关频率10kHz来设计取L1mH、C30μFLC谐振频率大约在919Hz比电压环带宽高、比开关频率低留足了设计裕量。算一下f_res 1/(2π√(LC)) 1/(2π×√(1e-3×30e-6)) 1/(2π×1.732e-4) ≈ 919Hz。这个值落在合理区间实测波形也比较干净。3. 模型参数整定惯量J和阻尼D到底该怎么给3.1 从二阶系统看惯量阻尼的选参逻辑VSG参数整定是很多人的心病尤其是J和D给小了频率乱跳给大了响应慢还超调。要解决这个问题得先把VSG的闭环动态等效成一个简单的二阶系统来看。忽略电压电流内环的延迟有功功率环路的闭环特征方程大致可以写成J d²Δθ/dt² D dΔθ/dt Kp Δθ ΔP所以等效二阶系统的自然角频率和阻尼比分别是ωn √(Kp/J)ζ D/(2√(Kp·J))注意这里的ΔP是负荷功率扰动Δθ是相角偏差。从这个表达式能得到几条直接可用的工程结论Kp决定稳态下垂特性Kp越大频率偏差越小J决定振荡频率J越大振荡越慢但恢复也越慢D决定振荡衰减速度D越大衰减越快但D太大会把频率变化压得太死影响惯性响应。给一套实际的起始参数我通常先把惯性时间常数H放在1~2秒范围。H和J的换算关系是H J·ω0²/(2·Snom)以50kW系统、额定角频率314rad/s为例取H1.5s算出来J 2·Snom·H/ω0² ≈ 1.52kg·m²。阻尼系数D先按Kp的0.5~1倍取Kp按“满功率对应0.5Hz偏差”来定也就是Kp 50000/(2π×0.5) ≈ 15915W·s/rad那D可先给8000~15000然后根据仿真波形微调。3.2 一套可直接用的参数算例与迭代方法直接给一套我实测跑得通的参数系统规模是光伏60kW、储能30kW、VSG额定50kW直流母线750V交流380V/50Hz开关频率10kHz具体参数如下表参数取值说明额定功率Snom50kWVSG逆变器额定额定角频率ω0314.159 rad/s50Hz×2π虚拟惯量J1.5 kg·m²对应H≈1.5s阻尼系数D12000 W·s/rad先取Kp的0.75倍有功下垂Kp15915 W·s/rad50kW对应0.5Hz偏差无功下垂Kq1900 Var/V30kVar对应15V偏差滤波电感L1 mH每相滤波电容C30 μF星形连接直流母线电容4000 μF支撑母线电压给完这套参数之后迭代方向只有一个跑负荷阶跃工况看频率波形。J不变时调大D频率振荡衰减明显变快但回路增益损失会导致稳态频率偏差增大调大J会让第一个波峰变浅、时间拉长但后续振荡的周期会明显变宽。如果发现频率曲线是单调但太慢地爬回额定值说明J偏大或Kp偏小如果曲线抖得厉害且长时间不收敛优先加D别去动J。一次性改太多参数是调试大忌。3.3 开关频率、采样时间与solver的互相约束参数整定不能只盯着控制参数仿真步长和求解器对结果的影响同样致命。Simulink里如果功率电路用Simscape的元件控制算法用离散模块模型的混合步长设置就得特别小心。我强烈建议把仿真类型设成定步长离散步长取1e-5秒也就是10kHz开关周期的十分之一。理由有三第一PWM调制需要足够的采样精度来判断三角载波和调制波的交叉点第二定步长离散模型的结果可重复性强不会因为变步长误差导致结果抖动第三后续要做硬件在环或者代码生成定步长离散模型几乎不需要改动。如果你坚持用变步长求解器比如ode23tb那就必须把PWM产生模块设置成“避免过零检测”否则每个载波周期都会触发无数个过零事件仿真速度慢到怀疑人生。Simscape的电气元件在变步长下通常没问题但PWM信号经过理想开关时会产生高频抖动这种抖动会传导到功率测量模块进而污染VSG的功率计算造成一系列莫名其妙的振荡。4. 仿真搭建中最容易翻车的几个环节完整排查链路4.1 启动冲击电流积分器初值设错引发的一连串连锁反应我第一个能跑的VSG模型启动瞬间电流尖峰直接冲到额定电流的7倍把Scope纵轴都拉满了。当时第一反应是LC参数太小一顿猛调参数毫无改善。后来静下心来做减法排查先断开储能和光伏让逆变器单独带一个纯电阻负载仍然冲击再把PWM信号断掉只观察参考电压波形发现参考电压的相位在启动瞬间是跳变的问题定位到了转子运动方程积分器的初始条件上。原因不复杂我的ω积分器初值默认是0VSG启动后要从0开始慢慢转到314这个过程中相位不是连续起步的等于给了一个阶跃相位差逆变器为了追这个相位差电流当然爆炸。正确做法是ω积分器初值设为ω0314.159θ积分器初值按并网相位设定Pm初始值设为当前负荷对应的功率空载就是0这样VSG在启动瞬间就“知道”自己该在什么状态输出电压和电网电压的相位差接近0冲击电流自然就没了。这个坑我记到现在任何积分器只要代表物理状态量的初始值都必须按实际工况给定不能拍脑袋留0。4.2 代数环与仿真发散solver设置里藏着的那些坑模型跑起来之后第二个大坑是代数环。报错信息会直接告诉你“This algebraic loop may be solved by introducing a memory block”之类的话但如果模型很大你可能连哪个位置形成了环都找不到。我的排查办法是先双击错误信息里的“Show algebraic loop”Simulink会高亮环上的模块路径再用二分法做减法测试——把VSG输出调制波断开接一个固定正弦波看还有没有环如果没有说明环在VSG功率反馈这条路上。形成环的机理是这样的PWM输出→逆变器功率→测量模块→转子运动方程→参考电压→电压电流环→PWM输入这是一个天然的即时反馈回路。功率测量结果和PWM输入在同一仿真步长内互相依赖Simulink只能迭代求解或报错。解决手段有两种一种是在功率测量模块后面加一个单位延迟Memory或离散一阶滤波把测量值延后一个步长再进VSG算法另一种更干净把整个VSG控制算法放到一个离散子系统里设置采样周期为TsSimulink会在子系统输入输出处自动插入采样和保持天然断开代数环。我推荐第二种因为单位延迟加多了会影响控制相位而离散子系统的时序更可控。4.3 PLL与构网控制的“抢相位”问题VSG明明是构网型控制自己生成频率和相位为什么Simulink模型里还得放PLL答案是并网预同步阶段需要知道电网的位置。离网模式下VSG自己当参考源不需要PLL但从离网切并网之前必须先把VSG输出电压的相位、幅值、频率都对齐到电网否则合闸瞬间就是事故。我踩过的坑是给模型同时保留VSG内部相位和PLL锁出来的相位两个相位源在切换逻辑里打架一会儿用这个一会儿用那个结果并网那一下相位差反而比不控制还大。排查之后我把控制逻辑理成了三个状态离网运行相位由转子运动方程积分生成PLL只做监视预同步用PLL误差修正转子运动方程的ω输入让VSG相位主动靠拢电网并网运行切换为电网钳制有功无功按设定输出。三种状态用状态机或Switch逻辑切换每次切换只允许一个相位源主导问题才彻底消除。Simulink里实现预同步也很直接把PLL测到的电网相位θPLL和VSG相位θ的差值经PI控制器叠加到ω上相当于给转子运动方程加了一个“牵引项”等差值收敛到零再合闸。4.4 从离线仿真到硬件在环的模型改造要点离线仿真跑通之后很多人会把模型往实时仿真平台搬这个过程中最头疼的就是Simulink模型和硬件平台的接口问题。离线模型里你随手放一个Transport Delay延迟1e-3秒离线仿真毫无感觉搬到实时机上直接吃掉一整个控制周期相位裕量全没了。我建议在做离线模型时就有意识地控制这些容易迟到的问题尽可能用离散一阶滤波代替Transport Delay功率测量模块用Simscape自带的mean值模块或者自己写一阶低通放弃用RMS模块做实时测量那个模块在实时机上的计算开销比其余所有模块加起来都大。另外S-Function在这个环节也容易出问题。VSG算法如果你想用C语言写S-Function离线仿真跑得好好的实时机上经常报任务超时。排查方向是看S-Function里有没有做耗时的动态内存分配、文件读写、或者printf打印。实时仿真对代码执行时间是硬约束S-Function里最好只做数学运算把所有输入输出都提前转成double数组避免mdlStart里做复杂初始化每次调用都从头到尾走一遍纯计算路径。5. 典型工况验证与结果解读模型到底搭没搭对5.1 负荷阶跃下的频率动态一眼看出惯量是否生效模型搭完第一个要跑的工况就是负荷阶跃。我的做法是先离网运行带一个20kW电阻负载稳定后在0.5s时刻再切一个10kW负荷上去然后盯着虚拟角频率、输出有功、直流母线电压三个Scope看。VSG惯量是否生效最直观的表现是频率跌落不是阶跃突变而是一条倾斜的曲线负荷突增的瞬间输出有功会瞬时增加由电容储能提供虚拟频率开始下降然后有功下垂环慢慢调高Pm频率逐渐回升到新的稳态。如果频率波形几乎垂直跌落说明J给得太小或者根本没传进转子方程如果频率跌落了半天不回来说明下垂Kp太小或D太大静态调差率已经超限。我通常要求的指标是10kW负荷阶跃频率动态偏差不超过0.3Hz恢复时间不超过2s稳态偏差不超过0.1Hz。实测下来J在1.2~2kg·m²范围基本能满足这个要求再大就显得拖沓了。5.2 光照突变与储能补偿母线电压的响应逻辑第二个关键工况是光照突变。Simulink里直接把PV Array的Irradiation信号从1000W/m²阶跃到600W/m²这时候光伏出力会下降大概40%如果没有储能顶着母线电压会跌到一塌糊涂。此时观察双向DC/DC的工作状态母线电压外环检测到跌落电流内环反向调节电池从充电转放电把功率缺口补上。这个工况最值得看的是母线电压波形。如果母线电压跌落超过5%优先查储能外环的PI增益尤其是比例增益一般需要加大如果母线电压出现持续振荡那多半是储能电流环带宽和母线电压环带宽太接近产生谐振了。把两个环的穿越频率拉开三倍以上振荡基本就消失了。另外一个容易被忽略的环节是电池模型本身Battery模块的SOC如果接近上下限开路电压会发生明显变化影响母线电压环的直流增益所以做长时间仿真时要把SOC初始值设置合理别在工况验证中途因为SOC跑到99%而让母线电压异常上浮。5.3 并离网切换最考验VSG控制品质的场景最后一个必测工况是并网到离网、离网到并网的切换。离线仿真里这个过程通常用三相Breaker来做。并网转离网时如果VSG没有提前预同步就直接断开负载突变会瞬间加速或减速虚拟转子频率剧烈波动离网转并网时如果相位对齐没做好合闸冲击电流可达到额定电流的4到5倍波形直接打穿。正确的测试流程是并网稳态→断开并网开关让VSG带本地负荷离网运行→观察频率和电压是否都能稳住→合上并网开关前先启动预同步等相位差小于1度、电压差小于1V、频率差小于0.05Hz时再合闸。整个切换过程在Simulink里可以用Stateflow状态机实现也可以用简单的Switch逻辑加延时模块关键是合闸条件必须用滞回比较器避免在临界点反复触发合闸导致多次冲击。我之前就是没加滞回相位差在0度附近抖动合闸指令一会儿有一会儿没有最后把示波器波形看成了一团乱麻。6. 一些从多次仿真失败中沉淀下来的调参手感6.1 先跑通纯VSG再加光伏储能别一上来就上全家桶这个顺序我每次跟人强调都不嫌多先把逆变器、LC滤波和VSG控制这三件套在离网电阻负载下调通确认频率、电压、电流都正常再加入并网功能和预同步逻辑跑通并离网切换之后才去加光伏和储能。原因很简单光伏的MPPT扰动、储能的母线电压环、VSG的功率环三个环的时间常数相差很大任何一个环节有问题其他两个环节都会被拖下水。叠加在一起调试你根本分不清振荡是来自光伏侧还是VSG侧。我见过太多人第一次搭VSG就非要直接做完整系统最后来来回回改了两周也没定位到问题。6.2 J和D调参时看波形比盯数值有用得多参数整定阶段我的习惯是把虚拟角频率、输出有功功率、母线电压三条曲线放在同一个Scope界面里。调J就看频率曲线第一个波峰的高度和位置波峰越高惯量越小波峰出现得越晚惯量越大。调D就看曲线恢复零点的快慢衰减慢就加D第一次回调过冲大也加D但如果加D之后频率出现高频小幅抖动说明D太大把噪声也放大了。这套手感没法完全靠公式替代多跑几次阶跃就能找到感觉。另外改完参数之后一定要重新跑一遍并网工况因为离网工况下转子运动方程的动态和并网工况完全不一样只调离网不管并网最后并网跌落照样会让你措手不及。6.3 模型里预留数据记录接口比事后翻Scope省力十倍最后一件事建议你从第一天就做在关键节点放To Workspace模块把虚拟频率、输出功率、母线电压、相位偏差这些量每隔一个固定步长存下来。Simulink的Scope虽然看波形直观但要做参数对比、频谱分析或者写报告时数据还是要落到工作区里。我习惯在每个仿真结束后马上执行一段脚本把这次仿真的参数存到一个表格里标注好J、D、Kp、工况、时间再附上几条关键指标的数值。这个习惯帮我省掉了大量“这个波形是哪组参数跑出来的”这类问题调参效率提升非常明显。模型本身是消耗品调参记录才是真正能沉淀下来的资产。