做新能源并网仿真这几年,我有个很深的体会:以前分析电力系统稳定,绕不开“转子”这两个字;现在分析新能源接入,问题往往变成“没有转子怎么办”。构网变流器(Grid-Forming Converter)之所以在各种技术讨论里频繁出现,核心就是因为低惯量系统下的频率稳定问题已经绕不过去了。风机、光伏通过电力电子接口接入电网,它们不提供物理旋转质量,系统惯量变低,同样的扰动下频率变化率(RoCoF)会明显变大,甚至触发低频减载。
这篇文章我想完整梳理一遍构网变流器是如何在低惯量场景里“补位”的,重点放在它和同步电机之间的交互机制上——这恰恰是很多仿真项目里最容易被忽略、也最容易踩坑的地方。文章会给出Simulink模型的搭建思路、核心控制参数计算方法,以及一批可以直接拿去用的Matlab代码片段。适合正在做微电网仿真、新能源并网研究,或者刚接触构网控制、虚拟同步机但还没把原理和仿真串起来的读者。
1. 低惯量系统到底“低”在哪:同步电机的机械转子不是摆设
1.1 从惯量到频率:转子运动方程是所有分析的起点
要理解构网变流器的重要性,先得理解同步电机的转子在电网里扮演什么角色。它的物理意义很简单:转子有质量、在转,所以它储存动能。当系统里出现功率缺额时,比如一台发电机跳闸或者一个大型负荷投入,同步电机会把转子的部分动能释放出来,抵抗频率下降。
转子运动方程一般写成:
2H · (dω/dt) = P_m - P_e - D(ω - ω_0)
这里的H是惯性时间常数,单位是秒,代表转子储存的动能除以额定视在功率。汽轮发电机H通常在3到5秒之间,水轮发电机在2到4秒之间。如果系统突然损失ΔP的有功功率,频率变化率近似为:
df/dt ≈ f_0 · ΔP / (2H · S_B)
举个例子:一个1000MVA的系统,H=4s,损失了100MW的发电功率,那么RoCoF大约是50×100/(2×4×1000)=0.625 Hz/s。这已经很剧烈了。如果H降到1s,RoCoF直接变成2.5 Hz/s,继电保护、汽轮机叶片、负荷都会面临严峻考验。
这就是低惯量系统的“病根”:大量同步机被变流器替代后,H整体下降,系统的频率响应变得“脆”。
1.2 电力电子接口为什么不天然提供惯量
风机和光伏并网用的逆变器,在没有构网控制时,本质上是个受控电流源。它通过锁相环(PLL)跟踪电网电压的相位,按功率指令输出电流。这种控制方式下,逆变器对电网来说像是一个“跟跑者”,它没有自己的旋转质量,也就没有天然的惯性响应。
直流母线电容虽然能储存一点能量,但容量极小。你可以算一笔账:一个1MW、直流电压1100V的变流器,直流侧电容通常只有几毫法,储存的能量大约0.5×0.01×1100²=6050J。而一台1MW的同步电机,H=2s的话,转子动能就是2×1,000,000=2,000,000J,差了三个数量级。指望电容给系统提供惯量,完全不现实。
所以低惯量系统的本质问题,不是缺少“能量”,而是缺少“按物理规律自动释放能量的机制”。同步电机会自己响应频率变化,而变流器不会——除非你在控制算法里给它“制造”一个虚拟转子。
2. 构网变流器的工作逻辑:把自己当成一台发电机
2.1 跟网型与构网型的本质差异
先理清概念。传统的并网逆变器控制称为跟网型(Grid-Following, GFL),它的特点是必须有电网电压作为参考,通过PLL锁定相位,然后控制电流。构网型(Grid-Forming, GFM)恰恰相反:它自身就是电压源,输出一个幅值和相位可控的电压,不需要PLL去“看”电网。
我做了个对比表,方便直观理解:
| 特性 | 跟网型(GFL) | 构网型(GFM) |
|---|---|---|
| 输出特性 | 受控电流源 | 受控电压源 |
| 同步方式 | PLL跟踪电网相位 | 功率平衡自动同步 |
| 是否需要电网电压 | 必须 | 可以独立建压 |
| 弱网适应性 | 弱网下PLL易失稳 | 在弱网下仍可运行 |
| 惯量贡献 | 无自然惯量 | 通过控制算法模拟惯量 |
| 典型应用 | 常规风电、光伏 | 微网主电源、孤岛供电 |
2.2 下垂控制与虚拟同步机:两种构网实现路线
构网控制不是某一种固定算法,而是一类策略。最常见的两种:
第一种是下垂控制。原理很简单,有功功率增大的时候,频率降一点;无功功率增大的时候,电压降一点。这就是同步发电机的一次调频调压特性。它实现简单,响应快,但缺乏惯性滤波效果,频率变化会很“直给”。
第二种是虚拟同步机(VSG / Virtual Synchronous Machine)。它在频率控制环里直接放一个转子运动方程:
J · (dω/dt) = T_m - T_e - D(ω - ω_0)
这里的J不再是物理转子的转动惯量,而是虚拟转动惯量,你可以任意设定。通过这个方程,变流器的输出频率会像真实同步机一样,受到功率差额的驱动而“缓慢”变化,从而表现出惯性。
需要提醒一下:这里说的“虚拟同步机”和永磁同步电机(PMSM)的“同步电机”完全是两码事。永磁同步电机参数辨识是电机驱动领域的课题,而虚拟同步机是一种电网接口控制策略,不要搞混。很多人搜索“构网变流器 同步电机”的时候,其实想看的既包括“构网控制如何模拟同步电机”,也包括“构网变流器和物理同步电机并联时如何交互”,这两层我们都会讲到。
2.3 构网变流器的“内环”也很关键
构网控制的顶层是功率环和虚拟惯量环,但它最终输出的是一组电压指令。要让变流器真正把这个电压发出来,还得有电压电流双闭环。外层电压环控制LC滤波器的电容电压,内层电流环控制电感电流,最后通过PWM生成开关信号。
还有一个经常被忽略的模块——虚拟阻抗。构网变流器作为电压源,如果输出阻抗太小,并联运行时均流效果差,还容易引发环流。通过在控制环里串入虚拟阻抗(通常是虚拟电阻+虚拟电感),能改善阻尼和均流特性。这个虚拟阻抗可以理解为“给电压源外挂一个看不到的阻抗”,它的值直接影响构网变流器的外特性,也会影响后续与同步电机的交互行为。
3. 交互机制解密:两台“电压源”在弱网里的博弈
3.1 同步电机与构网变流器并联:谁跟随谁?
当构网变流器和一个同步电机在同一个微网或局域电网里并联运行时,两者都是电压源。同步电机靠转子的物理运动完成同步,构网变流器靠功率环的控制算法完成同步。两个电压源之间的功率流动,由两者的电压幅值和相位差决定:
P = (E1 · E2 / X) · sin(δ)
这里的δ是两者之间的功角差,X是联接电抗。有功功率总是从相位超前的设备流向相位滞后的设备。如果构网变流器输出的频率高于同步电机,它的相位会逐渐超前,输出功率变大,从而被“拉回”来;反之亦然。这个负反馈过程就是同步机制的本源。
3.2 小扰动下的模式交互
把同步电机和构网变流器放在一个简化两机系统里分析,我们可以得到很有意思的结论。把两个设备的摇摆方程等效合并,系统的动态可以用下面的二阶模型描述:
2H_eq · (d²δ/dt²) + D_eq · (dδ/dt) + K_s · δ = 0
其中H_eq是等效惯性时间常数,包含了同步电机的物理惯量和构网变流器的虚拟惯量之和;D_eq是等效阻尼系数,包含了同步电机的阻尼绕组效应和构网控制里的阻尼项;K_s是同步转矩系数,由运行点、电压幅值和联线阻抗决定。
自然振荡频率和阻尼比可以写为:
ω_n = sqrt(K_s · ω_0 / (2H_eq))
ζ = D_eq / (2 · sqrt(2H_eq · K_s / ω_0))
这里能看到很关键的trade-off:虚拟惯量J取得大,H_eq增大,低频振荡频率变低,有利于减小初始RoCoF,但如果阻尼D_eq没有同步匹配,系统会更“摇晃”,振荡衰减变慢。反过来,J取得太小,频率变化太快,又失去了构网控制的意义。
在实际仿真里,我见过不少项目把虚拟惯量调到很大,然后发现系统在扰动后出现长时间的低频功率振荡。原因就是阻尼参数没跟上。正确的做法是J和D一起调,让阻尼比保持在0.4到0.7之间比较理想。
3.3 弱网场景:短路比、电压支撑与交互振荡
弱电网场景更能体现构网变流器和同步电机的交互问题。短路比(SCR)低意味着电网阻抗大,同步电机在这个网络里的稳定裕度本就受限,构网变流器接入后,两者之间可能出现新的振荡模态。
构网变流器对频率的响应会改变微网整体的谐振特性。如果构网控制的带宽和同步电机的励磁系统、调速器带宽接近,就可能发生模态交互,导致系统出现新的弱阻尼模式。这种问题在纯理论分析里很难发现,通常要靠扫频分析和特征值分析来识别。不过好在通过Simulink做时域仿真,可以直接看到交互振荡的波形。
还有一个重要的工程现实:构网变流器的电流不会无限增长。同步电机能承受短时过载,而电力电子器件过流能力非常薄弱。当系统扰动导致功率振荡时,构网变流器可能触发现流限制,导致其外特性从电压源退化成电流源——这个时候它就不再提供惯量和电压支撑了。这种“模式跌落”往往是引发级联问题的根源。所以在仿真模型里一定要加入限幅环节,并观测限幅是否经常被触发。
4. 在Simulink里搭出这套系统:模型架构与参数落地
4.1 主电路:同步电机、变流器与网络模型怎么选
如果要复现“构网变流器+同步电机”的交互过程,我推荐在Simscape Electrical(Specialized Power Systems)环境下搭建。主电路分四块:
- 同步电机:用Simscape Electrical自带的三相同步电机模块。先明确电机参数,比如额定视在功率、额定线电压、极对数、定子电阻电感、励磁方式和初始转速。建议在仿真前让电机运行在额定电压和额定频率的稳态,再开始扰动测试。
- 构网变流器:用三相两电平VSC桥臂加直流电压源。如果只是研究控制逻辑,可以先不搞IGBT开关级模型,用平均模型,仿真速度快很多;但要观察PWM谐波影响,必须用开关模型。
- 滤波器:构网变流器输出需要接LC或LCL滤波器。电感值的选择影响电流纹波和电压控制带宽;电容值影响无功输出和谐振点。一般按滤波器谐振频率设计在开关频率的1/10到1/5。
- 网络与负荷:用Three-Phase Series RLC Branch模拟线路阻抗,用Three-Phase Series RLC Load模拟负荷,用Three-Phase Fault模块制造短路或负荷突变的扰动。
4.2 控制部分:功率计算与构网控制器的Simulink实现
构网控制器的实现可以分为三个环节:功率计算、功率环(含虚拟惯量)、电压电流内环。
功率计算可以采用瞬时功率法。把三相电压电流做Clarke变换得到αβ分量,然后:
P = 1.5 · (v_α · i_α + v_β · i_β) Q = 1.5 · (v_β · i_α - v_α · i_β)
注意系数1.5是在等幅值变换下的结果,如果用的是等功率变换,系数是1。这个细节经常导致仿真功率值差1.5倍,排查起来很费时间。
功率环输出的是角频率ω和相角θ。这里可以采用离散化的转子运动方程:
ω[k+1] = ω[k] + Ts · (P_ref - P_meas - D·(ω[k] - ω_0)) / (J·ω_0) θ[k+1] = θ[k] + Ts · ω[k+1]
电压幅值由无功-电压下垂给出:
E = E_0 + n_q · (Q_ref - Q_meas)
这里n_q是无功下垂系数。生成的参考电压再经过虚拟阻抗修正,进入电压电流双闭环,最终输出PWM。
4.3 参数设定建议表与仿真步长选择
我给出一组可以当起点的参数,单位统一采用SI:
| 参数 | 数值 | 说明 |
|---|---|---|
| 额定功率 P_n | 2 MW | 构网变流器容量 |
| 额定电压 | 690 V | 线电压有效值 |
| 额定频率 f_0 | 50 Hz | |
| 直流母线电压 V_dc | 1100 V | |
| LC滤波电感 L | 0.2 mH | 谐振频率约 |
| LC滤波电容 C | 300 μF | |
| 下垂系数 m_p | 0.02 pu | 频率偏差2%对应满功率 |
| 无功下垂系数 n_q | 0.05 pu | |
| 虚拟惯量 H_virtual | 2 s | 等效H=2s |
| 阻尼系数 D | 50 pu | 标幺值 |
虚拟转动惯量J的换算公式是:J = 2H_virtual · P_n / ω_0²,代入数值:
J = 2×2×2,000,000 / (2π×50)² ≈ 81 kg·m²
这个数值可以直接放到转子运动方程里。
仿真步长要看模型性质。用离散求解器加开关模型,建议Ts=1e-6到5e-6秒,对应IGBT开关频率内能分辨PWM占空比变化;如果用的是平均模型,Ts可以放大到1e-5秒甚至更大,显著提升仿真速度。我在做参数扫描时会先用平均模型跑粗结果,再用开关模型精算关键工况,这样能省不少时间。
5. Matlab代码实现:让仿真可批量扫描、可复现
5.1 用脚本控制Simulink模型,做参数批量扫描
很多人跑Simulink仿真是直接在界面上改参数、点运行,这种做法在调试阶段没问题,但研究交互机制时需要扫描虚拟惯量、阻尼系数对频率稳定性的影响,就必须脚本化。
先建一个参数初始化脚本:
%% 系统参数定义 clear; clc; Pn = 2e6; % 额定功率 W Vll = 690; % 线电压 V f0 = 50; % 额定频率 Hz omega0 = 2*pi*f0; % 额定角频率 rad/s Vdc = 1100; % 直流母线电压 V % 构网控制参数 mp_droop = 0.02; % 有功频率下垂 0.02pu nq_droop = 0.05; % 无功电压下垂 H_virtual = 2; % 虚拟惯量时间常数 s J_virtual = 2*H_virtual*Pn/omega0^2; % 虚拟转动惯量 kg.m^2 D_damp = 50; % 阻尼系数 pu % 滤波器参数 Lf = 0.2e-3; % H Cf = 300e-6; % F % 保存到模型工作区 sim_params = struct('Pn',Pn,'Vll',Vll,'f0',f0,'omega0',omega0,... 'Vdc',Vdc,'mp_droop',mp_droop,'nq_droop',nq_droop,... 'J_virtual',J_virtual,'D_damp',D_damp,'Lf',Lf,'Cf',Cf); assignin('base','sim_params',sim_params);5.2 虚拟同步机功率环的MATLAB函数实现
下面这段函数可以直接作为MATLAB Function块嵌入Simulink,也可以用于纯代码仿真:
function theta = vsg_power_loop(P_ref, P_meas, J, D, omega0, Ts, theta_prev, omega_prev) % VSG功率环离散化实现 % 输入: P_ref 参考有功功率, P_meas 实测有功功率 % J 虚拟转动惯量, D 阻尼系数, omega0 额定角频率 % Ts 采样时间, theta_prev 上一拍相角, omega_prev 上一拍角频率 % 输出: theta 本次相角 % 转子运动方程离散化 domega = (P_ref - P_meas - D*omega0*(omega_prev/omega0 - 1)) / (J*omega0); omega = omega_prev + domega * Ts; % 相角积分 theta = theta_prev + omega * Ts; % 角度归一化到 [-pi, pi],避免无限增长 theta = mod(theta, 2*pi); if theta > pi theta = theta - 2*pi; end end注意里面的阻尼项处理:D·ω0·(ω/ω0-1)实际上就是在标幺值频率偏差为1时施加D倍的额定转矩。这个写法便于阻尼系数与同步电机的阻尼绕组概念对应起来。
5.3 后处理:自动计算RoCoF与频率最低点
仿真跑完,需要从波形数据里提取关键指标。下面这个脚本可以帮你快速判断虚拟惯量参数对频率稳定性的影响:
%% 频率指标后处理 % 假设仿真输出变量中有 f_meas (Hz) 和 t_out (s) function metrics = freq_metrics(t_out, f_meas, f0) % 频率偏差最小点(最低频率) [f_nadir_val, f_nadir_idx] = min(f_meas); % RoCoF = 第一秒内的最大变化率 idx_1s = find(t_out <= 1.0, 1, 'last'); rocof = max(abs(gradient(f_meas(1:idx_1s), t_out(1:idx_1s)))); % 频率恢复时间:回到49.8Hz以上的时间点 recover_idx = find(f_meas > 49.8, 1, 'first'); if isempty(recover_idx) recover_time = inf; else recover_time = t_out(recover_idx); end metrics = struct('nadir', f_nadir_val, 'nadir_time', t_out(f_nadir_idx), ... 'rocof', rocof, 'recover_time', recover_time); end参数扫描的骨架也简单:
%% 扫描虚拟惯量对频率稳定性的影响 H_list = [0.5 1 2 4 6]; for i = 1:length(H_list) H_virtual = H_list(i); J_virtual = 2*H_virtual*Pn/omega0^2; assignin('base','J_virtual',J_virtual); simOut = sim('gm_vsm_system.slx', 'StopTime', '20'); f_meas = simOut.f_meas; t_out = simOut.tout; result(i) = freq_metrics(t_out, f_meas, 50); end如果模型比较大,跑得慢,可以把for循环改成parfor并行扫描,前提是每个worker能独立访问工作区变量。这是提速最直接的办法。
6. 调试中的高频翻车现场与排查经验
6.1 启动瞬间的电流冲击:预同步和软启动缺一不可
构网变流器作为电压源,最怕的问题就是并网瞬间相位不一致。如果变流器输出电压和电网电压之间存在相位差或幅值差,闭合并网开关时会出现巨大的冲击电流,仿真里表现为电流波形爆炸、甚至求解器报错。
我的习惯做法是加一个预同步环节:在并网开关闭合前,让构网控制器跟踪电网电压的相位、幅值和频率,当偏差小于阈值时才允许闭合并网。这个环节在仿真里做起来很容易,一个PI调节器加上判断逻辑就够。另外还可以配合软启动,让变流器输出电压幅值从0逐渐抬高,从分。很多刚接触构网控制的人图省事直接初始化到固定相位,结果第一步就炸了,然后花很长时间排查主电路参数,其实问题完全出在同步逻辑上。
6.2 离散步长与数值振荡:仿真跑飞不一定是控制参数问题
用开关级模型做构网变流器仿真时,如果Ts设置过大,PWM分辨不了占空比,会出现明显的数值振荡。但如果为了让数值收敛把步长设得太小,仿真时间又长得无法接受。我的一般策略是:PWM开关频率10kHz左右时,Ts取2e-6秒;如果模型里既有快速电力电子开关,又有慢速机电动态(同步电机的转子摇摆),就要警惕刚性系统问题。
这里推荐使用ode23t或ode15s这类变步长刚性求解器,然后限制最大步长不超过开关周期的1/10。纯离散模型则固定Ts,不做变步长。如果发现仿真波形出现不该有的高频抖振,先把步长缩短一半试一下,排除数值因素再回头调控制参数。这个排查顺序能省很多没意义的“调参游戏”。
6.3 Simulink数据链问题:数组维度、数据类型与FMU导出
还有一个很容易被忽略的坑:Simulink模型内部的信号维度不匹配。特别是在把多路测量信号(比如三相电流、三相电压)从主电路连接到控制子系统时,如果用错Mux和Vector Concatenate,或者信号线类型冲突,就会报“Invalid input”或维度错误。我的建议是统一用Bus Creator组织信号,或者在连接的边界加Signal Conversion块转换为显式信号线,避免隐式数据类型推断带来的麻烦。
在需要把模型导出为FMU或者生成C代码做快速原型时,构网控制器里某些模块(比如连续时间积分器、触发脉冲发生器)会导致编译不过或仿真超时。处理方法是把控制环离散化,避免连续时间状态;把脉冲发生器替换为基于Modulo计数生成的PWM逻辑;同时确保MATLAB Function块里的代码支持代码生成,不能用动态内存分配。这个过程比较琐碎,但算是把仿真模型推向工程应用的关键一步。
6.4 参数整定的顺序:先内环后外环,先单机后并联
最后分享一个整定顺序的经验。构网控制器的参数不是一次能调到位的,按下面这个顺序会顺很多:
- 第一步,单独测试电流环。给固定电压参考,看电流跟踪速度和超调,整定电流环PI参数。
- 第二步,加上电压环。设定参考电压,测试电容电压控制效果,整定电压环PI参数。
- 第三步,单独跑构网变流器带电阻负载,验证下垂特性和虚拟惯量逻辑是否正确。
- 第四步,加入同步电机模型,小扰动测试,观察两者的功率分配和振荡特性。
- 第五步,做参数扫描,批量测试不同惯量、不同阻尼下的极限工况。
我自己在做过仿真和半实物测试之后,最大的感受是:Simulink里跑通的构网变流器,一旦到实际控制器里,通信延时、采样延时、过流保护动作时间都会改变系统的等效阻尼和等效惯量。仿真给了我们一个很好的起点,但真正的稳定性边界必须在更精细的模型中验证。
如果你正在搭类似的系统,建议从一个小容量微网模型开始,先把构网变流器孤岛带载跑通,再去并网并联。这样每一步的问题都清晰可控。参数扫描脚本建议从一开始就写好,因为虚拟惯量和阻尼之间的配合关系,靠人工一组一组去试,效率太低。