配电网单相接地故障选线:基于VMD与Simulink的仿真实践
2026/9/9 14:25:18 网站建设 项目流程

配电网发生单相接地故障时,选线难在故障特征微弱、故障点电流小,尤其在中性点经消弧线圈接地的系统里,故障线路的零序电流反而可能比非故障线路更小,按幅值选线直接失灵。这几年,变分模态分解(VMD)被引入故障暂态特征提取,效果不错,但多数教程只讲数学原理,真正落地到仿真建模和选线判断的资料少得可怜。我结合自己用Matlab/Simulink搭单相接地模型、再用VMD做选线的完整过程,把从建模到算法实现、再到调参踩坑的细节一次性说清楚,希望能帮正在做这个方向的朋友少走弯路。

这个模型能做什么?简单说,就是搭建一个配电网单相接地故障仿真环境,输出故障前后的零序电流、三相电压波形,然后通过VMD把暂态信号分解成若干个模态分量,从里面挖出不同线路在故障暂态过程中的差异,最后形成选线判据。适合电力系统研究生、配网自动化工程师以及所有需要做小电流接地选线算法仿真的读者。

1. 为什么单相接地选线模型必须用暂态量,而不是稳态量

1.1 稳态选线方法的先天不足

传统选线方法里,零序电流幅值比较、零序电流方向、零序功率方向这些都属于稳态量判据。在中性点不接地系统里,故障线路的零序电流确实远大于非故障线路,方向也相反,选起来比较直接。但问题在于,配电网普遍改成经消弧线圈接地之后,故障点电容电流被消弧线圈的感性电流补偿掉了,故障线路零序电流幅值大幅下降,甚至低于非故障线路。这时候再用稳态幅值、方向做判据,逻辑上就站不住了。

消弧线圈的补偿度通常设定在8%到10%,也就是说故障点的残流被压到很小。但故障发生的瞬间,暂态电容电流幅值可以达到稳态的几倍甚至十几倍,频率从几百赫兹到几千赫兹不等,而且不受消弧线圈影响,这就成了选线的突破口。很多研究都集中在故障暂态信号的利用上,问题是怎么把暂态信号里最有辨识度的特征提取出来。

1.2 从傅里叶到VMD,选线特征提取的演进逻辑

早期有人用FFT直接分析零序电流,但FFT是全局变换,拿到的频率分量是整段时间的平均,对暂态突变时刻的局部特征无能为力。后来出现小波变换、小波包,能同时看时间和频率,但小波基的选择和分解层数对结果影响很大,换一套参数结果就不稳定。再后来EEMD、CEEMDAN这类经验模态分解出来,可以自适应地分解信号,不用预设基函数,但模态混叠和端点效应始终没解决好。

VMD则把信号分解变成一个变分约束问题,通过迭代求解最优中心频率和带宽,把信号分解成若干个有限带宽的模态分量。它没有递归式剥离的过程,而是整体寻优,天然抑制了模态混叠,对噪声也有一定鲁棒性。放在单相接地选线场景里,我们可以把零序电流里面的工频稳态分量、高次谐波、暂态衰减分量相对干净地拆开,再从故障特征集中的暂态模态里构造判据。这也是为什么集成在Simulink模型上做选线,VMD比传统方法更合适。

2. 搭建单相接地故障仿真模型的关键环节

2.1 模型整体拓扑与元件选型

在Simulink里搭配电网单相接地模型,我建议用Simscape Electrical Specialized Power Systems模块库(老版本的SimPowerSystems),因为里面有现成的三相电源、分布参数线路和故障模块。我的模型是110kV/10kV系统简化的三段线路辐射网,具体结构如下:

  • 系统电源:110kV三相电压源,内阻按典型值设置,通过变压器降压到10kV。
  • 变压器:一次侧接法为Yn,二次侧为D/yn或者Y/yn,接线方式决定零序回路走向,注意选yn才能有零序通路。
  • 馈线:三条10kV线路,长度分别设为8km、12km和15km,采用分布参数线路模型(Distributed Parameters Line),这样可以更好地体现行波暂态特性。如果只关注稳态,用集中参数π模型勉强可以,但做暂态选线必须用分布参数,否则故障瞬间的高频分量会失真。
  • 中性点接地方式:在10kV母线中性点处设置一个可变电阻和消弧线圈并联支路,通过开关控制投切。我分别对中性点不接地和经消弧线圈接地两种工况都做了仿真,对比选线效果。
  • 故障模块:用Three-Phase Fault模块,设置在馈线3中点位置,故障类型设为单相接地(phase A grounding),过渡电阻最好可变,从0.01Ω到100Ω都试一遍。

特别提醒,Simulink里如果要做暂态分析,仿真步长不能选太大,我用的最大步长是50微秒(对应20kHz采样率),选用ode23tb变步长求解器。原因后面细讲。

2.2 零序电流的获取与数据导出

故障选线最核心的数据是各条馈线出线处的零序电流。用三相电流测量模块(Three-Phase V-I Measurement)分别测每条馈线的三相电流,然后在Matlab脚本里做Clark变换或者直接做算术运算得到零序电流:

i0 = (ia + ib + ic) / 3;

也可以直接用Simulink里的加法器和增益模块搭一个零序电流计算模块。我习惯把三相电流和母线零序电压都并用To Workspace模块导出到Matlab工作区,设置保存格式为Timeseries或Array,这一步很关键,后面VMD分解需要精确的时间轴和采样率信息。

这里有第一个容易踩的坑:To Workspace的采样时间必须显式设置,不能继承Simulink中变步长求解器的输出时间,否则导出的数据点时间间隔不均匀,后续VMD和特征提取会全部乱套。建议在模型里单加一个固定步长的采样保持环节(Zero-Order Hold),采样率设为10kHz或20kHz,再送给To Workspace。

2.3 故障时序控制与仿真参数

故障发生时刻通常设在0.04s(也就是故障发生在第2个工频周期过零附近),故障持续0.08s,整个仿真0.2s。用Programmable Step Time来编写故障触发信号,或者直接在Three-Phase Fault模块里设置Transition Time。我建议故障时间设为0.042s,稍微偏离电压过零点,这样能激发出更丰富的暂态分量,也更接近实际故障随机性的特点。

求解器方面,对于含多个分布参数线路和故障暂态过程的模型,我试过ode45和ode23tb,发现ode23tb在满足精度的前提下速度更快。相对容差设1e-4即可,模型不算刚性太强,太小会拖慢仿真,太大则暂态波形毛刺多。

3. VMD的原理与参数选定的实操要点

3.1 变分模态分解到底在做什么

VMD的思想看起来像信号处理的“分家”操作:原始信号 f(t) 被表示为K个模态分量 uk(t) 之和,每个模态都是围绕一个中心频率 ω_k 的有限带宽信号。通过求解下列约束变分问题:

min { uk, ωk } Σ_k || ∂t [ (δ(t) + j/πt) * uk(t) ] e^{-jωk t} ||_2^2 subject to Σ_k uk = f

简单的理解是:每个模态都在找一个带宽最窄的频率成分,同时所有模态拼起来要能还原原始信号。本质上是个最优化问题,用交替方向乘子法(ADMM)迭代求解,交替更新模态函数和中心频率。相比EMD那种“剥洋葱”式的递归分解,VMD是同步把所有模态一起解出来,所以模态之间不容易串混。

这个特点放在故障暂态上优势非常明显。零序电流里既有50Hz基波分量,也有高频衰减暂态分量,还有噪声。用VMD分解后,基波基本被单独分到一个模态里,暂态衰减分量集中在某几个高频模态中,噪声被分散到其它模态或余量里。后续选线只需要针对含有故障特征的高频模态做分析,不用处理整个原始信号,目标一下子清晰起来。

3.2 Matlab里的VMD实现与输入输出格式

Matlab官方文件交换中心有一个常用的VMD函数(作者Konstantin Dragomiretskiy),也有众多修改版。基本调用写法是:

[u, u_hat, omega] = VMD(signal, alpha, tau, K, DC, init, tol);

其中signal是一维时间序列,输出u是每个模态分量(维数是K×N),omega是迭代过程中各模态中心频率的轨迹。常见参数含义:

  • alpha:带宽惩罚参数,越小,各模态带宽越大,反之带宽越窄。
  • tau:噪声容忍参数,一般设为0。
  • K:模态总数,必须预先给定。
  • DC:是否把直流分量单独作为一个模态,一般为0。
  • init:初始中心频率设置方式,可取1(均匀分布)或0(全为0)。
  • tol:收敛容差,默认1e-7即可。

我的实际参数选择是:

K = 5; alpha = 2000; tau = 0; DC = 0; init = 1; tol = 1e-7;

为什么是K=5、alpha=2000?我解释一下选择过程。先把零序电流信号截取故障前0.01s到故障后0.04s共0.05s的数据,采样率10kHz即500个点。试算K从3到8:

  • K=3时,高频暂态和噪声被捆在一起,模态混叠明显,中心频率最后收敛得不好。
  • K=5时,模态中心频率大约分布在50、180、650、1500、3200Hz左右,前两个基本对应工频和低次谐波,后面几个包含故障暂态主频,效果比较理想。
  • K=6以上,会出现两个中心频率很接近的模态,产生虚假分解,其中一个模态能量很小,基本是多余的。

alpha=2000是我在带宽和噪声抑制之间取的平衡点。alpha太小(比如200),模态带宽变大,中心频率附近容易混入其它频率成分;alpha太大(比如20000),模态分得太窄,高频暂态分量被切成碎片,能量分散,选线特征不稳定。这个参数实际上跟信号幅值水平有关,不同系统下可能需要按比例调整,经验法则是先试一组数据,看中心频率轨迹是否收敛平稳。

3.3 直观理解VMD分解结果对选线的作用

以中性点不接地系统、A相接地故障为例,在故障线路的零序电流经VMD分解后,高频模态(比如中心频率650Hz和1500Hz对应的两个模态)在故障发生时刻会有一个明显的突变峰值,能量显著增加。非故障线路的零序电流,理论上只有本线路对地电容的充放电电流,高频成分弱很多,即使有也主要是系统侧传递过来的感应分量。故障前后同一时间窗内,故障线路高频模态的幅值包络斜率远大于非故障线路,这个差异就是后面选线判据的依据。

中性点经消弧线圈接地时,稳态零序电流接近抵消,但故障暂态过程的高频分量不会完全消失,线间差异依然存在,VMD分解后可以从高频暂态模态中提取能量比、暂态峰值等特征量。这比直接看零序电流波形更加鲁棒,因为波形上故障与非故障线路差异并不直观,特别是过渡电阻较大时,波形几乎没什么区别。

4. 基于VMD特征的选线判据设计与实现

4.1 从分解结果中构造选线特征量

拿到各条线路零序电流的VMD分解结果后,关键问题是用什么特征量来区分故障线路与非故障线路。我用过三种特征量做对比,分别是模态能量、暂态峰值和瞬时频率变化量,简单对比如下:

特征量计算方法对故障线路敏感度受过渡电阻影响可靠性
模态能量每个模态平方和积分
暂态峰值故障后高频模态峰值较大
加权组合能量×峰值×频带权重很高

实际测试下来,单靠模态能量在过渡电阻大于50Ω时故障线路和非故障线路的区别会变小,容易误判。因为过渡电阻越大,故障暂态强度越弱,但非故障线路的电容电流相对稳定,两者差距缩窄。于是我采用了组合特征量,把若干个特征值融合。

具体做法是:选取VMD分解得到的第3至第5个高频模态,对每个模态求故障后一个周期内的能量:

Ec(k) = sum( u_k(t).^2 ) * dt

然后把不同模态能量按照中心频率倒数为权重相加,突出高频分量的作用:

F = Σ (Ec(k) / ω_k)

为什么要用中心频率倒数加权?因为暂态电容电流的频率越高,衰减越快,但也越能反映故障路径的差异,加权后可以增强高频模态在判据中的占比。当然,这个公式不是唯一的标准,你也可以用信息熵、瞬时能量斜率等,只看你自己的故障特征分析结论。但核心原则是:特征量必须能放大故障线路与非故障线路在高频暂态上的差距。

4.2 完整的选线判定逻辑与边界情况

模型里有三条馈线,每条线路都计算一个特征量F1、F2、F3。选线判据我用的是相对阈值:

  • 计算三条线路特征量的最大值Fmax和第二大值Fsec。
  • 如果 (Fmax - Fsec) / Fmax > 0.15,则判定Fmax对应的线路为故障线路。
  • 如果不满足,则判定为母线故障(即故障点位于母线而非任何出线)。

这个判据不是为了蹭什么先进算法,而是因为实际仿真中我也遇到母线故障的情况,如果不考虑这种边界,把最大特征值硬判为故障线路会误判。仿真结果:中性点不接地系统下,过渡电阻0.01Ω、10Ω、100Ω时,判据都正确选出了故障线路;经消弧线圈接地系统,0.01到10Ω正确,100Ω时判据偶尔出现(Fmax-Fsec)/Fmax接近0.12,低于阈值,于是判为母线故障——实际上仍是线路故障,这里暴露了高阻故障的局限性,也是当前配网选线领域公认的难点,后面我会提到怎么进一步优化。

4.3 MATLAB脚本与Simulink的联合运行方式

我不建议把VMD写成Simulink的S-Function嵌进去,因为VMD是迭代优化过程,在变步长仿真里每次步长都执行会非常耗时。更合理的做法是先用Simulink把故障波形算好,然后通过脚本离线分析,这也是大多数科研人员的做法。

一个完整的联合分析脚本框架如下:

% 载入Simulink导出到工作区的数据 load('fault_I0.mat'); % 包含t, i0_line1, i0_line2, i0_line3 Fs = 10000; % 采样率10kHz t_start = 0.03; % 故障前0.01s开始取数据 t_end = 0.08; % 故障后0.04s结束 mask = t >= t_start & t <= t_end; for k = 1:3 sig = i0_data(k, mask); [u, ~, omega] = VMD(sig, 2000, 0, 5, 0, 1, 1e-7); % 计算高频模态能量(取后三个模态) Ec(k) = sum(sum(u(3:5,:).^2, 2) / Fs) / mean(omega(3:5,end)); end [maxF, fline] = max(Ec); ...

注意这段脚本里的omega是最终收敛后的中心频率,用mean取后三个模态中心频率的均值。实际调试中我发现omega轨迹在迭代中会有一个从初始值到收敛值的变化过程,我们只需要最后迭代步的中心频率,也就是omega(:,end)。

5. 仿真与算法联合调试中的踩坑记录

5.1 采样率不足导致VMD频率塌缩

最初我按1kHz采样率导出数据,Simulink里也按1kHz采样保持。结果VMD分解出来的中心频率竟然集中在100Hz以下,完全没有高频模态。检查之后发现,零序电流中的暂态高频分量在故障初瞬间频率可达数千赫兹,1kHz采样率对应Nyquist频率只有500Hz,等于把高于500Hz的分量全部混叠到了低频段。把采样率提高到10kHz后,中心频率分布才正常。这是最基础的信号处理常识,但放在仿真流程里特别容易忽略,因为Simulink变步长求解器内部步长可能很小,你误以为数据精度够高,其实导出数据经过了1kHz的ZOH,高频信息早被滤掉了。

还有一个细节是:部分版本的VMD函数内部有下采样或滤波操作,输入信号点数太少会严重影响结果。我建议至少保留0.05s时间窗,10kHz采样率下是500个点,5kHz采样率下是250个点,低于200个点时VMD收敛曲线开始出现异常抖动。

5.2 分布参数线路的仿真步长约束

Simulink中分布参数线路模型(Distributed Parameters Line)用的是传输线行波方程,仿真步长必须足够小才能捕捉线路上波的传播。10kV线路长度8到15km,行波在这一段上的传播时间大概几十微秒,如果步长大于1e-4s,行波前沿就会被严重平滑掉。我一开始偷懒用最大步长1e-3s,结果故障瞬间的暂态电流峰值比小步长仿真低了将近30%,VMD分解后的高频模态能量也明显偏小。建议最大步长设为等于行波通过最短线路长度的十分之一,或者干脆用50微秒。代价是仿真速度变慢,0.2s仿真大概需要一两分钟,对于离线分析完全能接受。

5.3 故障时间附近的数据对齐问题

VMD分析要求时间窗起点必须严格对齐到同一时刻。因为Simulink的To Workspace输出是独立采样的,三相电压电流分别导出时,可能出现百万分之一的时钟偏差,波形看起来不明显,但VMD分解特别敏感,中心频率轨迹会出现微小的波动。解决办法是在Simulink里把所有To Workspace模块设置为同一个采样时间,并且配置“Save Format”为Timeseries,这样Matlab会利用Simulink内部的统一采样时刻,避免各自插值。还有一个笨办法:导出后先做个交叉相关,调整多路信号的时间偏移,但对于选线仿真,统一采样时间已经够了。

5.4 VMD初始化参数对选线结果的影响

VMD函数里的init参数决定初始中心频率的分布方式。init=1表示在频域均匀分布,init=0表示所有模态从同一初始频率开始。实测下来,init=0时VMD收敛结果受alpha影响非常大,在alpha取2000时会陷入局部最优,把全部模态都收敛到50Hz附近,高频模态全部丢失。init=1则从不同的初始位置出发,更容易找到全局最优解。这不是玄学,是ADMM迭代的初始值选择问题,在一维信号分解里均匀初始化是比较稳妥的做法。

5.5 高阻接地故障的选线盲区与补偿措施

过渡电阻到100Ω以上时,故障线路的暂态高频分量衰减严重,VMD分解后高频模态能量不大,与健全线路的差异缩小。单一靠能量特征很难可靠判别。我从实践中摸索出一个办法:把故障相电压突变时刻作为时间对齐基准,计算各线路暂态零序电流的“斜率”特征——即故障后0.5ms内电流变化率最大值。这个短窗特征对高阻故障更敏感,因为高阻情况下电流幅值小,但暂态上升沿的陡峭程度还有一定差异。把斜率特征和VMD能量特征做加权融合后,100Ω下正确率从原来的60%左右提升到了90%左右。

6. 扩展一点:这套模型还能怎么用

模型搭好之后,不只是VMD选线可以用。我把故障录波数据批量导入后,还测试过暂态零序电流的小波包分析、时频熵特征,效果都还算一致。Simulink模型本身也可以加上消弧线圈自动调谐、不同中性点接地方式切换、分布式电源接入等模块,用来评估不同条件下选线算法的鲁棒性。

有一点我特别想提醒:VMD不是万能的,它要求信号在分解窗口内相对平稳,如果窗口过长,故障暂态的衰减特性和工频部分的相位变化很容易混淆。我的经验是时间窗不要太长,取故障后2到3个工频周期就够,取更长反而会把负载波动也分解进高频模态里,干扰特征提取。

另外,如果把VMD做成S-Function实时选线,要提前优化算法,比如固定迭代次数、减小模态数K、用C代码生成。我之前在Simulink里尝试过嵌入VMD的C生成代码,用了嵌入式编码器,把K固定为4、迭代次数限制为20次,在dSPACE上能跑到毫秒级,但精度略微下降。所以离线科研用Matlab脚本就够了,工程化选线装置还是要用C/C++重写核心分解算法。

最后再说一个调试小技巧:VMD分解前,用零相位滤波(filtfilt)把信号滤到200到3000Hz带通,能显著减少VMD的负担,减少模态数K的依赖。但要小心,带通滤波本身可能改变暂态相位信息,做选线判据时最好在滤波后的数据上重新标定阈值,不能直接用原始数据训练好的阈值。

做完整套仿真和算法验证,最大体会是:选线算法真正的瓶颈往往不在算法本身,而在前端的仿真建模是否逼近真实故障场景。Simulink模型里的线路参数、中性点接地方式、故障电阻、采样率任何一个地方偷懒,后面VMD分解得再漂亮,选线结论也是空中楼阁。希望这份踩坑记录能帮你把从数学模型到选线结果的整条链路走通。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询