VSG暂态失稳与虚拟阻抗限流:Matlab并网仿真全解析

发布时间:2026/10/2 9:44:44
VSG暂态失稳与虚拟阻抗限流:Matlab并网仿真全解析 做虚拟同步发电机VSG并网仿真的同学应该都撞过同一堵墙Matlab里搭好的模型稳态好好的一放三相短路就变成两场灾难同时上演——逆变器输出电流瞬间冲到额定值四五倍触发过流保护直接封波而VSG的功角还在积分器里冲等故障切除后它已经跑出了同步稳定区怎么拉都拉不回来。这个现象背后就是标题里那串关键词的完整逻辑链虚拟同步发电机VSG的暂态失稳、虚拟阻抗限流、以及最终要验证的暂态稳定性提升。这三个东西不是分开的三个模块而是一个闭环。你只加限流不去管稳定性故障电流是压住了但功角照样失步你只研究稳定性不管限流仿真里IGBT早就炸了。所以这篇内容我不打算泛泛讲原理而是直接顺着为什么失稳→怎么用虚拟阻抗限流→如何在Matlab里搭出能复现、能验证的仿真→参数到底怎么调这条线把整个项目完整拆一遍。1. VSG暂态失稳的本质先过流后失稳1.1 同步发电机那套钢筋铁骨不是白给的先看真同步发电机。真机在电网故障时为什么能扛一下最直观的答案就是转子有真实的转动惯量转子铁芯、绕组、原动机的惯性几吨到几十吨的旋转质量让转子转速不可能突变。故障瞬间发电机输出功率骤降原动机输入的机械功率却不会立刻减少差额功率就会加速转子但加速过程是秒级的、被巨大的惯性缓冲了。更关键的是真同步发电机故障电流虽然大但它是绕组电流可以在几秒内承受数倍额定电流而不损坏而且故障期间发电机的电动势仍然由主磁场维持着它还能向电网送出一定的有功和无功。也就是说它在故障期间仍然是一个有源支撑元件不是一断就脱网。这套物理基础决定了同步发电机暂态稳定分析里那些概念——加速面积、减速面积、等面积法则、极限切除角——都能成立。你把这一套搬到逆变器上就会发现一个问题逆变器的转子是控制器里一个积分器它的惯性是你写进程序里的一个常数J而它的绕组是IGBT过流能力是按2倍额定电流承受几微秒来设计的。物理基础完全不一样了。1.2 故障瞬间VSG内部发生了什么VSG的核心是转子运动方程通常用标幺值写成这样2H × dω_pu/dt Pm_pu − Pe_pu − D × (ω_pu − 1)dδ/dt ω0 × (ω_pu − 1)其中H是虚拟惯量时间常数D是阻尼系数Pm是机械功率Pe是电磁功率。正常运行时Pm和Pe相等功角δ稳定在某个平衡点。现在电网发生三相短路机端电压跌到很低的水平VSG通过传输阻抗能送出去的功率P ≈ (EV/X)sinδ电压V一跌Pe像瀑布一样往下掉。但Pm在控制方程里不会瞬间变化于是不平衡功率ΔP Pm − Pe变得很大功角开始加速偏移。很多初学的同学在这里有个误区以为H取大一点功角就不会冲太远。错了。H只是让加速变慢但不平衡功率是持续的时间越长功角偏离越多。J或者H只是改变了冲多远的节奏没有改变冲不冲这个事实。真正决定最后稳不稳的是故障清除后系统还能不能提供足够的减速能力。1.3 过流保护与控制失稳的矛盾这才是实际项目里最尖锐的矛盾。VSG内部的Pe反馈来自主电路功率计算主电路过流时你只有两个选择。第一个选择是封波IGBT封锁触发脉冲。电流迅速变零IGBT保住了但Pe瞬间变成0这是最糟糕的情况——不平衡功率直接变成满额Pm功角加速斜率最大。你相当于在故障最需要控制介入的时刻把VSG的控制彻底废掉了。而且封波期间VSG控制器的积分还在继续积等故障切除你再重新发波功角已经不知道跑到哪里去了。实测中这种模型做出来经常是故障切除后振荡几下然后直接失步。第二个选择就是让VSG继续运行但必须把电流限制在安全范围。这就引出了虚拟阻抗限流的思路在VSG的电压参考信号里虚拟地串入一个阻抗让电流变大时自动产生电压降从而把电流压住。方法很直接但控制细节里全是坑后面专门讲。这里先记住结论限流不是独立的保护功能它是VSG暂态稳定控制的一部分。限流方案好不好不看电流峰值压下去多少要看限流期间的功角响应和故障切除后的恢复能力。2. VSG控制链路建模从摇摆方程到Simulink模块2.1 功频环惯量和阻尼在程序里怎么造出来在Matlab/Simulink里做VSG最核心的是把转子运动方程落成可仿真、可调参的模块。我建议第一步先别急着连主电路先用一个纯控制环测试功频响应。系统架构是这样的有功功率参考Pref经过一次调频下垂可选形成虚拟机械功率Pm输出有功Pe反馈回来二者之差进入带惯量J的积分环节得到虚拟角频率ωv和功角δvδv再参与坐标变换和参考电压生成。实际接线时Pm不是简单等于Pref如果你要做一次调频特性Pm Pref Kω×(ω0 − ωv)。但做暂态稳定性仿真时我更倾向直接让Pm Pref因为你要研究的重点是故障期间功角怎么变一次调频的时间尺度是秒级相对暂态过程可以忽略。除非你专门做频率稳定否则别让一大堆环节干扰你对暂态过程的理解。阻尼项D直接在方程里写D×(ωv − ω0)。注意D这个符号在不同文献里定义的符号和量纲都不一样有的用D作为阻尼转矩系数有的用Kd作为阻尼功率系数。我的习惯是全都化成标幺值方程统一用功率形式2H × dω_pu/dt Pm_pu − Pe_pu − Kd × (ω_pu − 1)这样Kd的单位就是功率标幺值除以频率标幺值调参方向很清晰Kd越大功角振荡衰减越快但太大会让VSG失去惯量的柔软度严重时连功率跟踪都变慢。2.2 励磁环无功电压调节无功电压环相对简单一般按下垂特性E E0 Kq × (Qref − Qe)E是VSG参考电压幅值E0是空载电动势Kq是无功下垂系数。有的文献还会加一个电压调节项E E0 Kq×(Qref−Qe) Ku×(Vref−Vm)这就是把自动电压调节器AVR的功能也模拟进来。暂态稳定仿真里无功环的重要性不亚于功频环因为故障期间机端电压深度跌落VSG能不能快速顶起电压、向电网送无功直接影响功角恢复。为什么因为传输功率P (EV/X)sinδ在功角δ还没有来得及变化之前机端电压V是唯一能动的量。故障期间你迅速增大E就能让Pe不要跌太多加速面积自然就小了。这就是无功支撑对暂态稳定性的贡献。所以做仿真时别只盯着有功环调J和DKq、Ku的整定同样关键我在第6节会给具体的调参方法。2.3 主电路与坐标变换部分控制策略定好了开始搭主电路。我这里给一套常用的参考参数额定功率10kW直流母线800V经三相两电平逆变器、LC滤波后并入380V/50Hz电网。用Simscape Electrical里的Universal Bridge搭IGBT逆变器LC滤波电感2mH、电容20uF并网点接三相电压源模拟无穷大电网。控制回路里的信号流程是并网点三相电压和逆变器输出电流经测量模块进abc/dq坐标变换dq变换角度用VSG自身的功角δv而不是电网PLL的角度——这是VSG与普通PQ控制逆变器的一个本质区别。VSG的坐标变换、功率计算、电压参考生成都在它自己建立的同步坐标系里完成所以高速旋转的dq参考坐标系必须跟着δv走。你如果用PLL锁出来的角度去做整个控制VSG的惯量特性就被PLL的带宽架空了等于又变回一个普通跟网型逆变器。坐标变换之后的瞬时功率计算直接就地写Pe 1.5 × (Vd×Id Vq×Iq)Qe 1.5 × (Vq×Id − Vd×Iq)注意三相幅值表示和相电压有效值表示的系数差异。用相电压峰值表示的坐标变换功率系数就是3/2用相电压有效值表示系数是3。我习惯全程用峰值表示因为Matlab里的三相电压源和测量模块默认给你的是峰值还是RMS很值得检查这地方错一次所有功率反馈和控制增益都会差√3倍。2.4 S-Function写核心方程VSG核心控制器的实现方式有两种一种是用Simulink的积分器、增益、乘法器搭框图另一种是用Matlab Function或S-Function写方程。我个人推荐S-Function原因很实在调参全在代码里版本管理方便而且虚拟阻抗、限流逻辑、功角限幅这些非线性逻辑用代码写比连线清晰得多。核心S-Function的导数函数可以写成这样function sys mdlDerivatives(t, x, u) % x [omega_pu; theta; E_pu] % u [Pe_pu; Qe_pu; Vt_pu] H 1.5; % 虚拟惯量时间常数, s Kd 20; % 阻尼系数(pu功率/pu频率) Pm 1.0; % 机械功率给定(pu) Qref 0; % 无功给定(pu) Kq 0.1; % 无功下垂系数 Ku 0.05; % 电压调节系数 Vref 1.0; % 机端电压参考(pu) omega0 2*pi*50; d_omega (Pm - u(1) - Kd*(x(1)-1)) / (2*H); d_theta omega0 * (x(1) - 1); E_ref 1.0 Kq*(Qref - u(2)) Ku*(Vref - u(3)); d_E (E_ref - x(3)) / 0.02; % 励磁惯性,避免E突变 sys [d_omega; d_theta; d_E];输出函数里用x(2)的θ生成三相参考电压的幅值和相位E_pu直接乘以311得到相电压峰值然后按cosθ、cos(θ−2π/3)、cos(θ2π/3)生成三相调制波。这套结构的核心优势是故障清除时间、限流触发、参数切换都可以通过修改S-Function的输入信号和内部状态来控制而不用拆模型。3. 虚拟阻抗限流的三层设计检测、触发、恢复3.1 为什么选虚拟阻抗而不是直接限幅常见的限流办法有好几种我做了个表对比限流方案实现方式优点典型问题硬件物理电抗并网回路串真实电感可靠性极高不需检测体积大、成本高、稳态压降损耗电流指令饱和限幅电流环参考值实现最简单有功/无功深度耦合电压跌落严重过流封波检测过流后封锁IGBT保护效果直接控制失效功角加速最严重虚拟阻抗限流控制环节叠加阻抗压降无硬件损耗、可调性强、保持VSG控制依赖检测带宽和参数整定用虚拟阻抗的理由就一条它能够在不切断控制回路的前提下限制电流而且这个阻抗的阻值是可以随时切换的。故障时切大把电流压住稳态时切小或置零不影响正常运行。对于VSG这种靠功角维持同步的装置来说持续运行四个字就是稳定性的前提。虚拟阻抗的实现位置在VSG参考电压生成之后、电压电流双闭环之前。三相电流经过坐标变换得到Id和Iq然后计算阻抗压降Vd_drop Rv × Id − Xv × IqVq_drop Rv × Iq Xv × Id再用VSG输出的电压参考减去这个压降得到修正后的电压指令。这里的负号不要搞错Xv和Rv都是压降方向要保证能压住电流而不是抬高电流。我在第一次搭模型的时候正负号反了限流变成了助流故障电流冲到额定值七倍那波形我到现在都记得。3.2 触发检测与滞回逻辑限流逻辑不能只做一个简单的电流比较器否则临界值附近会反复切入切出系统会在限流模式和非限流模式之间高频振荡。我用的是阈值触发滞回最小保持时间三件套。触发电流用dq轴电流合成幅值Ip sqrt(Id² Iq²)换算成标幺值。触发阈值I_on取1.2pu退出阈值I_off取0.9pu进入限流模式后至少保持20ms不允许退出。逻辑写成代码Ip sqrt(u(1)^2 u(2)^2); % u(1)Id_pu, u(2)Iq_pu if (mode 0) (Ip 1.2) mode 1; t_entry t; elseif (mode 1) (Ip 0.9) (t - t_entry 0.02) mode 0; end触发之后虚拟阻抗从稳态值切换到大阻值Rv 0.02 mode × (0.30 − 0.02) Xv 0.10 mode × (0.20 − 0.10)注意这里Xv不要加得太大。有不少文献把限流电抗加得很大表面上看电流限得很好实际上故障期间VSG送不出去的无功和有功全被虚拟电抗吃掉机端电压进一步被拉低效果适得其反。限流以电阻为主、电抗为辅的原则在实际调参里很好用。3.3 限流退出与故障恢复策略故障清除瞬间才是最考验限流策略的时刻。故障切除后电网电压恢复VSG为了补上此前积压的功率差电流内环会疯狂拉电流这是一个必然出现的二次冲击。如果这时虚拟阻抗立即退出二次冲击就完全裸露出来如果退出太慢VSG的功率恢复又会被拖住功角该减速的时候没有减速能力。我的经验做法是分段退出故障清除后先保持限流状态20ms让电流峰值峰值度过去然后虚拟电阻按时间线性衰减比如在50ms内从0.3pu线性降回0.02pu既能阻尼功角回摆又不延长功率恢复时间。这个线性渐变在S-Function里做非常简单就是加一个mode状态和time counter。还有一个容易被忽略的细节故障期间VSG的功角已经在往前冲了故障切除后功角恢复过程本质上是减速制动过程。限流模式下的虚拟电阻本身就提供了一个额外的等效阻尼它消耗的是控制意义上的虚拟功率相当于在摇摆方程里临时增大阻尼系数Kd。这就是为什么设计得当的虚拟阻抗限流不仅能保住IGBT还能同时改善暂态稳定性的根本原因。4. 暂态稳定性仿真场景与判据怎么判断稳还是不稳4.1 故障场景设置与Simulink仿真脚本仿真模型搭好之后稳定性仿真的故障设置建议用三相接地短路这是最严重的情况做稳定性的默认科目。在Simscape Electrical里直接用Three-Phase Fault模块故障类型选Three Phase to Ground接地电阻设0.001Ω故障起始时间用Step信号控制。我常用的故障时序是这样0 ~ 1.0s稳态运行让VSG完成启动和并网过渡1.0s三相短路故障投入1.0 Δt故障清除Δt从0.05s开始扫总共仿真3s保证功角振荡至少能看到两个完整周期故障清除时间的设定不要在模型里手动改用变量名t_clear传到故障模块和时间触发信号里。调试时写一个脚本循环扫描t_clear就能自动扫出临界切除时间t_fault 1.0; cct_lower 0.05; cct_upper 0.30; step 0.02; for t_clear cct_lower:step:cct_upper sim(VSG_virtual_impedance.slx); delta logsout.get(delta).Values.Data; if max(abs(delta)) 2.5 % 功角未超过约143° disp([清除时间, num2str(t_clear), s, 稳定]); else disp([清除时间, num2str(t_clear), s, 失稳]); break; end end判断稳定与否的这条阈值我取的是功角是否超过2.5rad约143°。为什么不是90°因为VSG的传输等效阻抗里含电阻分量稳定极限功角并不是90°而是90°以内一个由阻抗角决定的数值实际同步发电机稳定极限功角在考虑电阻时通常也更小。工程上为了留裕度一般用功角超过某个门槛后不再回摆作为失步判据2.5rad是一个工程上可靠的近似值。4.2 临界切除时间的求法循环扫描得到的最大稳定切除时间一个步长就是临界清除时间CCT。这个指标是整个暂态稳定性仿真最有价值的输出因为它把复杂的稳定性问题压缩成了一个数。同样一套VSG参数不加虚拟阻抗限流时CCT可能是0.12s加上虚拟阻抗限流并调好参数后CCT可能变成0.18s这一个差值就是你的限流策略对暂态稳定性的量化贡献。投论文也好、做工程报告也好这个数比一堆波形有说服力得多。扫描的时候注意先粗扫再细扫。第一遍步长0.02s找到失稳区间后步长缩到0.005s在临界点附近再扫一轮否则你只能给一个粗糙区间。还有一点扫CCT时每次仿真都要把模型状态变量初始化干净最好每次调用sim之前给模型的状态全部清零否则上一次失稳的残留状态会污染下一次结果。4.3 波形判读的实用技巧做暂态稳定仿真我的锁定顺序是电流波形→功角波形→有功波形→电压波形。电流波形先看确认限流策略真的把峰值压住了功角波形Second看判断系统在故障切除后有没有失步的趋势然后再看有功波形和电压波形理解功率平衡怎么演变。注意功角波形不要直接看delta的绝对值要看相对并网电网电压相角的变化量。VSG坐标系角度本身一直在旋转如果你用VSG内部积分出来的θ直接当功角画图看到的是一条不断上升的斜坡真正的功角是θ减去电网相位这个操作很多人会漏。实际工程中我一般再搭一个电网侧PLL把电网角度解出来然后画Δδ θ_vsg − θ_pll。5. 限流前后仿真结果对比不只电流小了功角也稳了5.1 短路电流与IGBT应力先看最基本的指标。同样的故障参数不加虚拟阻抗时VSG输出电流峰值按Id和Iq合成幅值算大概能冲到额定值的5.8倍这个数字已经远超IGBT模块的SOA安全工作区实际工程里就是炸管的节奏。加入虚拟阻抗后电流幅值被压在1.4pu以内动态过程的峰值略高于稳态触发的1.2pu大约1.4pu。为什么比阈值高一点因为虚拟阻抗的压降是由电流本身产生的形成的是一个负反馈闭环但从检测到修正电压再到电流响应中间隔着电压外环和电流内环的带宽响应有滞后。第一波电流峰值吃掉了这部分硬件延迟但后面就被稳定压住了。所以给阈值留20%裕量是必要的。这里特别提醒判断虚拟阻抗限流的成效不要只盯着第一个峰值。真正重要的是这个策略在整个故障期间都能维持电流受限而不是第一波掐住了、后面几十毫秒又失控。5.2 机端电压与无功支撑故障期间电网电压深度跌落VSG机端电压也会被拉着往下掉。不限制流时因为电流过大导致坐标系里的虚拟压降和内部阻抗相互作用机端电压在故障期间出现比较深的塌陷甚至接近零。加入虚拟阻抗限流后由于电流被控制住VSG输出端的电压反而能维持在0.6pu左右。这个现象我当年第一次看到的时候也觉得反直觉加了个阻抗不是应该压降更大吗实际原因是虚拟阻抗修正的是VSG的参考电压而机端电压由电网和滤波电容电压决定。限流后控制器没有饱和得像一滩烂泥它仍然有能力按照无功环和电压调节指令向故障点输送无功电流这正是维持机端电压的关键。所以限流和电压支撑不矛盾设计得好是双赢。5.3 功角摆动与失步对比最关键的对比放在功角上。无虚拟阻抗限流时因为过流保护封波VSG输出功率瞬间清零功角在故障期间以最大斜率加速。假设故障持续0.15s功角已经从正常的30°冲到超过150°。这时即便故障切除系统功率传输能力已经不足以把这个功角拉回同步区功角继续摆过180°VSG失步。加虚拟阻抗限流后同样的故障时长功角先以较慢斜率加速故障切除时刻功角大约在70°~80°留给减速面积的裕量明显更大。故障切除后虚拟电阻继续工作功角在120°附近掉头经过两三个振荡周期后回落到新的平衡点附近。整个过程的加速面积被压缩减速面积被扩大这就是等面积法则在虚拟阻抗限流策略里的实际体现。如果波形里能看到故障切除后功角最多冲到某个峰值然后开始回落并且峰值不超过失稳门槛这基本上就能判稳定。反之如果功角在故障清除之后还在持续加速突破150°那基本可以宣告失稳再往下等它也不会回来。6. 参数整定与调试经验限流方案经过实测的调参顺序6.1 惯量H和阻尼Kd怎么配很多同学一上来就把H设得很大因为模型里仿真机器不会有转子太重带不起来的问题就以为H越大越稳定。实际仿真扫参你会发现H增大确实能降低功角加速率但同时也延长了功角振荡周期故障切除后的最大功角摆幅反而可能变大。我的调参习惯是先固定Kd20左右把H从0.5扫到4观察功角振荡周期和最大摆幅选一个振荡能在一个周期内明显衰减的中间值。然后再固定H把Kd从5扫到50观察衰减速度和稳态误差Kd太大功率响应会变得很钝仿佛是响应迟钝的发电机这在并网工况上不是好事。一个经验初值组合是H1.5~2.0sKd15~25然后根据你的额定功率折算成实际值。6.2 虚拟阻抗与阈值的整定顺序虚拟阻抗的参数我建议按这个顺序调先调触发阈值再调电阻值最后才调电抗。触发阈值要结合电流内环的PI饱和水平看。实际限流会先把电流内环推入饱和然后虚拟阻抗的修正电压才会有效果整个过程有耦合。阈值太低稳态轻载时一个扰动就误触发阈值太高虚拟阻抗还没来得及压住电流IGBT已经过流了。我用的1.2pu触发、0.9pu退出、20ms保持是几轮仿真下来比较稳的一组你按自己模型的主电路阻抗水平适当缩放。电阻值的量级参考用标幺值看0.2pu到0.4pu是可用的区间太小压不住电流太大短路电流倒是不大了但故障期间输出功率也归零功角照样冲。虚拟电抗取值最好不超过0.15pu它的作用主要是改变故障电流的相位分布让电压支撑方向更合理而不是真的靠它限流。6.3 仿真步长与数值刚性问题最后说一个很实际的坑。VSG控制环的响应带宽通常几kHzLC滤波器的谐振频率大概在几百Hz到1kHz虚拟阻抗的检测和控制环节又引入了延迟。如果你仿真固定步长设成1e-4极限切除时间扫描的稳定性结论可能完全不对因为你把控制环的离散延迟等效成了额外的相位滞后相位滞后一大本来稳定的工况也变不稳定了。我用的是离散定步长仿真步长建议2e-5到5e-5秒。扫描CCT这种事对精度要求高统一用2e-5秒跑虽然仿真时间长了点但结论可信。另外S-Function的采样时间要显式写别让它继承否则Simulink可能跑出混杂步长功角波形上会出现不自然的锯齿。如果你要保存功角、电流、电压这些波形做后续分析优先用信号日志和Dataset格式导出数据别用To Workspace的数组格式后者在多次循环仿真时容易覆盖和错位。我用脚本扫CCT的时候就吃过这个亏跑完一循环所有结果都堆在一个默认变量里前几次的数据全被冲掉了。最后一句话总结我这个项目的执行顺序先搭纯控制环验证摇摆方程再接主电路然后加虚拟阻抗限流最后做故障扫描求CCT。每一步都单独验证过再往前走出问题时能立刻定位是控制参数的问题、主电路参数的问题还是虚拟阻抗限流逻辑的问题。这套路径你自己走一遍会比看十篇文献都管用。