☰
Simulink三段式电流与零序保护建模及整定配合仿真
2026/11/3 3:13:50 网站建设 项目流程

简介:面向电气工程、继电保护课程学习者和相关工程技术人员,这份资料围绕 Matlab/Simulink 三段式电流保护(含零序)仿真模型展开,可用于课堂教学、课题研究与保护方案验证。内容涉及瞬时电流速断、定时限与反时限过电流保护,以及零序电流检测、电流互感器、比较单元、延时与逻辑控制、故障注入和保护动作验证等关键环节,帮助读者理解保护整定与动作逻辑。资源以 1 个 PDF 文件交付,压缩包约 984KB,轻量易查阅,适合作为模型说明或学习参考。已有 1561 人学习,可作为搭建 Simulink 继电保护仿真、分析动作时间与保护区范围的入门素材,也便于结合仿真结果排查与优化模型。

1. 三段式电流保护为什么值得先在 Simulink 里跑一遍

把一份 Simulink 继电保护模型拿到手,多数人的第一反应是把断路器动作时间调快,看示波器上电流掉下去就认为通了。跑过整定的人清楚,动作快不等于动作对——I 段越界抢了下一级的活、零序在正常不平衡电流下先跳了、反时限曲线在 1.5 倍电流处永远算不出时间,这些在波形上都长得像“正常”。三段电流保护加上零序电流保护,说到底是一组带时间维度的判据,Simulink 继电保护模型的价值正是把判据的动作时序摊在一条时间轴上,让你看到谁先动、谁该等、谁根本不该动。这套三段式电流(含零序)保护仿真模型适合三类人:做课程设计的电气专业学生、要把保护逻辑讲透的教学者,以及需要在方案阶段快速核对整定配合的工程人员。它不替代整定计算书,但能把计算书里的数字变成看得见的动作顺序。

2. 一次系统与 CT 采样链路:把整定值落进 Simulink 参数框

2.1 单侧电源辐射网的等值化:哪些元件必须留,哪些可以砍

继电保护仿真最容易犯的错是把模型建得跟实际变电站一样全,结果跑一次要十几分钟,还没等看到跳闸就先崩了求解器。三段式电流保护关心的是故障后一到两个工频周波内的电流幅值,以及延时段的稳态幅值,发电机励磁调节、变压器铁芯饱和、负荷电动机的动态过程对动作时序的影响,通常远小于整定值本身的计算误差。所以一套能用的模型应该是“够用就好”的等值网络。

我一般会保留这几样:一个带内阻抗的三相电压源代表系统,一段集中参数线路代表被保护线路,一个恒阻抗或恒功率负荷代表下游,一个三相故障模块用来注入短路,一个三相断路器作为跳闸出口。变压器只有在需要演示差动配合或者多电压等级配合时才加,而且要加也得用简单的双绕组模型,不要一上来就开饱和特性。

具体到模块名,Simscape Electrical 里对应的是 Three-Phase Source、Three-Phase Series RLC Branch、Three-Phase V-I Measurement、Three-Phase Fault、Three-Phase Breaker,求解器配置在 powergui 里。这套组合的好处是全部走标幺值或实际值都行,接口统一,测量模块自带标签功能,后面用 From/Goto 布线不至于把线拉成一团。

元件Simulink 模块关键参数本次示例取值
系统电源Three-Phase Source线电压、短路容量、X/R10.5 kV、150 MVA、10
线路Three-Phase Series RLC BranchR、L(按 km 折算)1.2 Ω、16.7 mH
负荷Three-Phase Series/Parallel RLC有功、功率因数8 MW、0.9
测量Three-Phase V-I Measurement输出标签、单位Ia/Ib/Ic、A
故障Three-Phase Fault故障相、过渡电阻、起止时间AG、0.01 Ω
断路器Three-Phase Breaker初始状态、外部控制闭合、外部信号

这张表的价值不在数值本身,而在于每一项都对应一个会被后续判据读到的量。电源的短路容量决定了首端最大短路电流,线路阻抗决定了末端短路电流和 I 段保护范围,负荷决定了 III 段的启动值。这三个数一旦定下来,三段整定值的骨架就出来了,剩下的都是系数问题。

需要提醒的是线路模型的选择。集中参数支路在工频下够用,但如果要观察故障初期的直流分量衰减,就得换成分布参数线路或者至少加几个 π 节。对于只关心动作时序的三段保护,集中参数完全够,因为它引入的误差在毫秒级,而保护的时间级差是几百毫秒。

2.2 电流互感器与三相测量的接线细节

CT 这一环是新手翻车最集中的地方,因为它牵扯到“一次值还是二次值”这个根本问题。Simulink 里的 Three-Phase V-I Measurement 默认输出的是实际安培数,也就是一次侧电流。而保护装置的比较单元读的是二次侧,600/5 的 CT 意味着一次 600 A 对应二次 5 A。如果你的整定值是按一次值算的 1355 A,却把它填进一个已经除以 120 的比较器里,那这个保护永远不会动作,而且波形看上去一切正常——电流确实超过了 11.3 A,只是你没在看那个数。

处理方式有两种,选一种并全程贯彻。第一种是全程一次值,CT 用理想变比模块表示但不参与比较,整定值也全部用一次值,模型内部自洽,缺点是跟实际装置的定值单对不上。第二种是全程二次值,在测量模块后面串一个 Gain 等于 1/CT_ratio 的环节,整定值全部折算到二次,这种更贴近现场,也方便直接拿定值单来核对。我做教学模型时倾向第二种,因为它逼着你把变比这件事想清楚。

CT 饱和要不要建模,取决于你想验证什么。如果只是想看三段配合,理想 CT 就够;如果要看故障初期的暂态饱和导致保护延时或者拒动,就得用带非线性励磁支路的 CT 模型,或者至少用一个一阶惯性环节加限幅来近似。后者实现简单,效果也够看:

% CT 传变环节的一阶近似(放在 MATLAB Function 块或 Fcn 块中) % Ts : 仿真步长,单位 s % Tct : CT 等效时间常数,保护级 CT 一般取 0.02~0.05 s % Ksat : 饱和限幅,按准确限值系数 ALF 折算 function i_sec = ct_model(i_prim, Ts, Tct, Ksat, ratio) persistent i_prev if isempty(i_prev) i_prev = 0; end % CT 变比折算到二次 i_ideal = i_prim / ratio; % 一阶惯性逼近传变滞后 alpha = Ts / (Tct + Ts); i_out = i_prev + alpha * (i_ideal - i_prev); % 饱和限幅:超过 ALF 倍额定后不再线性传变 i_sec = max(min(i_out, Ksat), -Ksat); i_prev = i_sec; end

这段代码做了三件事:先按变比把一次电流折到二次,再用一阶惯性环节模拟 CT 的传变延时,最后用限幅模拟饱和。参数里ratio直接填 120(600/5),Tct填 0.02 到 0.05 之间的值,Ksat按 10 倍额定二次电流取 50 A 左右。要注意的是这个模型只是“看起来像饱和”,真要研究暂态饱和得用非线性电感,但对三段保护的时序验证来说,它能让你看到饱和导致的幅值削顶,这就够了。

测量点的位置也有讲究。CT 要装在被保护线路靠母线的一侧,断路器要装在线路侧,这样故障发生时 CT 能先看到故障电流,断路器动作后 CT 才看到电流消失。如果顺序装反了,跳闸后 CT 立刻失流,保护逻辑会误判成“故障自愈”,把已经发出的跳闸信号又撤回去,波形上就会出现一次莫名其妙的抖动。

2.3 基准值换算与参数批量化脚本

Simulink 模型的参数框一个个手填是最容易出错的做法,因为一旦线路长度改了,所有相关的整定值都得跟着改,改漏一个就前功尽弃。稳妥的做法是写一个初始化脚本,把所有基准值、一次参数、整定值都算好,以变量名的方式喂给模型,模型里只填变量名不填数字。

% init_params.m —— 一次系统基准值与线路参数换算 clear; clc; Sb = 100e6; % 基准容量 100 MVA Ub = 10.5e3; % 基准电压 10.5 kV(线路侧平均额定电压) Zb = Ub^2 / Sb; % 基准阻抗 = 1.1025 ohm Ib = Sb / (sqrt(3)*Ub); % 基准电流 = 5499 A Sk = 150e6; % 系统短路容量 XoR = 10; % 系统阻抗比 X/R Zs_pu = Sb / Sk; % 系统阻抗标幺值 = 0.667 Rs_pu = Zs_pu / sqrt(1 + XoR^2); Xs_pu = Rs_pu * XoR; L = 15; % 线路长度 km r1 = 0.08; % 正序电阻 ohm/km x1 = 0.35; % 正序电抗 ohm/km RL_pu = r1 * L / Zb; % 线路电阻标幺值 = 1.088 XL_pu = x1 * L / Zb; % 线路电抗标幺值 = 4.762 P_load = 8e6; % 负荷有功 W cosphi = 0.9; % 负荷功率因数 I_load = P_load / (cosphi * sqrt(3) * Ub); % 负荷电流 ≈ 489 A % 首端、末端三相短路电流(标幺值转有名值) Z_head = Rs_pu + 1j*Xs_pu; Z_end = (Rs_pu + RL_pu) + 1j*(Xs_pu + XL_pu); Ik_head = Ib / abs(Z_head); % ≈ 8244 A Ik_end = Ib / abs(Z_end); % ≈ 1084 A fprintf('Zb=%.4f ohm, Ib=%.1f A\n', Zb, Ib); fprintf('Ik_head=%.1f A, Ik_end=%.1f A, I_load=%.1f A\n', ... Ik_head, Ik_end, I_load);

这段脚本的输出是后续所有整定的输入。Zb和Ib是两个基准,所有标幺值都以它们为准;Zs_pu由短路容量反推,工程上比直接填阻抗更常见,因为短路容量是电网公司给的;Ik_head和Ik_end分别是首端和末端三相短路电流,前者决定 I 段要不要躲、后者决定 I 段保护范围。脚本里用abs()取复数模,是因为短路电流的大小取决于总阻抗的模,而不是实部或虚部单独一个。

在模型里,电源模块的阻抗填Rs_pu和Xs_pu(记得把模块单位切成标幺),线路模块填RL_pu和XL_pu,负荷填P_load和cosphi。这样只要改L或者Sk,重新跑一遍init_params.m,整定值跟着重算,不会出现“改了线路忘了改定值”的情况。

提示:把init_params.m设成模型的 PreLoadFcn 回调,每次打开模型自动执行,可以避免工作区变量丢失导致模型报“未定义变量”的红字错误。

3. 三段判据的落地:比较单元、时间元件与跳闸出口

3.1 I 段瞬时速断:整定、保护范围与防抖确认

I 段的整定原则是躲过被保护线路末端的最大三相短路电流,公式是I_set_I = K_rel * Ik_end_max,可靠系数取 1.2 到 1.3。之所以要躲末端,是因为 I 段不带延时,如果定值低于末端短路电流,那么末端故障时 I 段会动作,而末端故障本应由下一级保护切除,这就造成了越级跳闸。

用上一节的数,Ik_end = 1084 A,取K_rel = 1.25,得到I_set_I = 1355 A。这个定值对应的保护范围可以反算:设故障点距首端为线路全长的 x 倍,则故障回路总阻抗为Zs + x*(ZL),令短路电流等于 1355 A,解出 x ≈ 0.79,也就是 I 段能保护线路全长的 79%。这个数落在典型的 70% 到 85% 区间内,说明参数选得合理;如果算出来只有 40%,那多半是系统阻抗太大或者线路太长,I 段基本没用,得考虑加装其他保护。

比较单元本身很简单,一个 Relational Operator 加一个 Abs 模块就能实现。真正需要处理的是防抖。故障发生瞬间,电流里含有衰减的直流分量,有效值计算模块的输出在头半个周波内会有明显波动,如果直接用瞬时比较,可能在前几个采样点就产生一串窄脉冲。工程上的做法是加一个短确认延时,通常取一个工频周波 0.02 s,只有电流连续超过定值满一个周波才认定故障成立。在 Simulink 里可以用 S-R 触发器加一个 Transport Delay 实现,也可以用第 3.4 节的 MATLAB Function 统一处理。

3.2 II 段定时限过流:时间元件的两种实现与级差配合

II 段的整定有个迭代过程,不是一次算完的。第一步先按与下一级 I 段配合,I_set_II = K_rel * I_set_next_I,可靠系数取 1.1 到 1.15。假设下一级线路的 I 段整定值是 1000 A,那么本线路 II 段定值是 1150 A。第二步做灵敏度校验,用本线路末端最小短路电流除以定值,要求不小于 1.3。本例中 1084/1150 = 0.94,明显不够,说明 II 段保护不了本线路全长。

这时候要往下走第三步:改与下一级 II 段配合。假设下一级 II 段定值是 700 A,则本线路I_set_II = 1.15 * 700 = 805 A,灵敏度 1084/805 = 1.35,合格。时限上t_II = t_next_I + Δt,机电保护取 Δt = 0.5 s,微机保护可以取 0.3 s。这个“先配合、再校验、不合格就换配合对象”的流程,就是整定计算书里最常被跳过的一段,很多仿真模型跑出来 II 段不动,根子就在这里。

时间元件的实现有两种。第一种是 Transport Delay 加 Relational Operator,把过流信号延时 0.5 s 后输出,简单直观,但延时精度受求解器步长影响,变步长求解器下实际延时可能是 0.48 也可能是 0.53。第二种是在 MATLAB Function 里用持久变量按固定步长累加,只有累加值超过定值才输出,精度取决于步长而不是求解器,我一般用这种。

% II 段定时限元件:按固定步长累加计时 % Ts : 仿真步长 5e-5 s % Iset : II 段整定值 805 A % Tset : II 段延时 0.5 s function trip_II = tds_overcurrent(I_rms, Ts, Iset, Tset) persistent t_acc if isempty(t_acc) t_acc = 0; end if I_rms >= Iset t_acc = t_acc + Ts; % 过流持续则累加 else t_acc = 0; % 电流返回立即清零 end trip_II = double(t_acc >= Tset); end

这里的关键是t_acc = 0那一行。定时限保护的“返回”特性要求电流一旦低于定值,计时立刻清零重新开始,不能保留余量。如果写成累减或者保留,会出现“故障电流断断续续但计时一直在涨”的情况,最终在不应动作的时刻跳闸。参数上Ts必须和 powergui 里设置的离散步长严格一致,否则计时会整体偏移;Iset和Tset用变量名从工作区传入,方便批量改。

3.3 III 段反时限:曲线方程、离散化与数值陷阱

反时限这一段是整个模型里最容易“看起来能跑、其实全错”的地方。IEC 标准给出的通用方程是:

t = TMS * K / ((I/Is)^α - 1)

不同曲线的 α 和 K 取值不同:标准反时限 α=0.02、K=0.14,非常反时限 α=1、K=13.5,极端反时限 α=2、K=80。三段式过流保护里通常用非常反时限,因为它的时间随电流变化更明显,跟定时限的配合也更好做。

以Is = 750 A、TMS = 0.3、非常反时限为例,不同电流倍数下的动作时间如下表:

电流倍数 I/Is实际电流 (A)计算动作时间 (s)
1.290020.25
1.4510849.10
2.015004.05
3.022502.03
5.037501.01
10.075000.45

这张表有两个信息值得注意。第一,在 1.2 倍这种轻度过负荷下,动作时间超过 20 s,实际系统里负荷早就自己恢复了,这个时间长度没有意义,所以 III 段定值必须高于最大负荷电流并留足裕度,本例中 750/489 = 1.53 倍,是合理的。第二,当电流倍数趋近于 1 时分母趋近于零,时间趋于无穷,仿真里如果积分器一直累加而仿真时长只有几秒,你永远看不到跳闸,然后误以为逻辑写错了——这就是第 5 章要展开的坑之一。

实现上,把曲线方程写进 MATLAB Function,输出目标时间,再用累加器比对:

% III 段反时限元件(IEC 非常反时限) % Is : 启动值 750 A % TMS : 时间倍率 0.3 % K, alpha : 曲线常数 13.5 / 1.0 function trip_III = inv_overcurrent(I_rms, Ts, Is, TMS, K, alpha) persistent t_acc if isempty(t_acc) t_acc = 0; end % 倍数下限保护,避免分母为零 ratio = max(I_rms / Is, 1.02); t_target = TMS * K / (ratio^alpha - 1); % 时间上限,防止低倍电流下无限等待 t_target = min(t_target, 60); if I_rms >= Is t_acc = t_acc + Ts; else t_acc = 0; end trip_III = double(t_acc >= t_target); end

ratio用max(..., 1.02)做下限,是为了在电流刚好等于启动值时给一个有限的时间,否则ratio^alpha - 1等于零会直接除零报错。t_target加 60 s 上限,是为了让模型在低倍过流下也有个明确结果,而不是一直挂着。这两个处理在教科书里不会写,但不加就一定会在仿真里翻车。

3.4 三段逻辑的组合与跳闸出口

三段各自出信号之后,要用一个或门合成总跳闸信号,再送去断路器的外部控制端。这里有两个细节。第一是锁存:跳闸信号一旦发出,应该在故障切除前保持住,不能因为电流过零瞬间低于定值就撤销,否则断路器会在分闸过程中反复动作。用 S-R 触发器,S 端接三段或门输出,R 端接一个手动复归或者延时复归。第二是出口极性:Three-Phase Breaker 的外部控制信号,1 表示合闸、0 表示分闸,跟很多人的直觉相反,接反了就会出现“故障时断路器合得更紧”的荒唐现象。

% 三段合成与锁存(S-R 触发器的 MATLAB 实现) function [trip, tripI, tripII, tripIII] = three_stage(I_rms, I0_rms, Ts) persistent latch if isempty(latch) latch = 0; end Iset_I = 1355; % I 段定值 A Iset_II = 805; % II 段定值 A Iset_III = 750; % III 段启动值 A Tset_II = 0.5; % II 段延时 s Is0 = 60; % 零序启动值 A(二次折算后按实际填写) tripI = double(I_rms >= Iset_I); tripII = tds_overcurrent(I_rms, Ts, Iset_II, Tset_II); tripIII = inv_overcurrent(I_rms, Ts, Iset_III, 0.3, 13.5, 1.0); % 零序作为独立判据并入总出口 trip0 = double(I0_rms >= Is0); if (tripI || tripII || tripIII || trip0) latch = 1; end trip = latch; end

这段代码把三段和零序合到一个出口,latch保证跳闸后信号自保持。参数里Iset_I、Iset_II、Iset_III都来自第 2 章脚本的计算结果,改了线路参数要同步改这三个数。trip0直接并入或门,是因为零序保护在接地故障时本来就该独立启动,不需要等三段判据。实际装置里零序一般有自己的出口继电器,模型里为了简化合成一路也够用,但如果要分别观察各段动作情况,就把tripI、tripII、tripIII分别引出接示波器。

4. 零序电流保护:三相矢量和、滤序器与接地故障注入

4.1 零序电流的两条获取路径:三相求和与序分量模块

零序电流的定义是三相电流的矢量和除以三,即3I0 = Ia + Ib + Ic。在 Simulink 里有两条路可以拿到它。第一条是用 Sum 模块把三相电流直接相加,简单粗暴;第二条是用 Simscape 自带的 Sequence Analyzer 或者自己搭一个派克变换加低通滤波,提取出正序、负序、零序分量。

两条路的差别在于“相量”和“瞬时值”。Sum 模块相加的是瞬时采样值,理论上三相对称时瞬时和为零,但实际上因为采样时刻、数值精度、系统固有的不对称,会残留一个几安培的工频量。如果零序定值只有几十安培,这个残留就可能造成误动。Sequence Analyzer 输出的是基波相量,把高频残留滤掉了,稳定性好得多,代价是需要一个周波的窗长,动作会滞后 0.02 s。

我一般用 Sequence Analyzer 的输出,因为零序保护的定值本来就低,经不起残留折腾。如果模型里没有这个模块(老版本),可以用三个 RMS 模块分别取有效值再相加,效果接近,但要保证三相 RMS 的窗口严格对齐。

% 零序电流获取与零序三段整定 I0_unb = 0.1 * I_load; % 正常运行最大不平衡电流,取负荷电流 10% I0_set_III = 1.5 * I0_unb; % 零序 III 段:躲不平衡电流,Krel=1.5 % 本线路末端单相接地时的最大 3I0(由仿真或短路计算得出) I0_end_max = 900; % 示例值 A I0_set_I = 1.25 * I0_end_max; % 零序 I 段:躲末端接地故障,Krel=1.25 % 与下一级零序 I 段配合 I0_set_next_I = 600; % 下一级零序 I 段定值 A I0_set_II = 1.15 * I0_set_next_I; % 零序 II 段定值 A t_II_0 = 0.5; % 零序 II 段时限 s fprintf('3I0 不平衡=%.1f A, III段=%.1f A, I段=%.1f A, II段=%.1f A\n', ... 3*I0_unb, 3*I0_set_III, 3*I0_set_I, 3*I0_set_II);

这段脚本里有个容易混的地方:I0_unb是单相值还是三相和。工程上说“3I0”指的是三相电流之和,而保护装置显示的往往是 3I0 的数值,所以定值单上的数字是三相和。脚本里I0_set_III = 1.5 * I0_unb算出来的是单相值,最后打印时乘了 3,这个换算必须全程一致,否则差三倍。

4.2 零序整定:躲不平衡电流与 CT 误差的叠加

零序保护的定值比相间保护低一个数量级,因为接地故障的零序电流本身就小,同时正常运行时的三相不平衡也小。但“小”带来的问题是各种误差的相对占比变大,所以整定时要考虑的因素反而更多。

零序 III 段(最灵敏段)的整定原则是躲过正常运行时的最大不平衡电流,公式是I_set = K_rel * K_cap * K_err * K_per * I_load,其中K_cap是线路电容电流的影响系数,K_err是 CT 误差系数(一般取 0.1),K_per是两侧 CT 不同期或者变比不匹配的系数,K_rel是可靠系数取 1.2 到 1.5。对于短线路,电容电流可以忽略,主要就是 CT 误差那一项,所以 10% 是个常用值。

零序 I 段按躲过本线路末端接地故障时的最大 3I0 整定,I_set_I = K_rel * 3I0_end_max,可靠系数取 1.2 到 1.3。零序 II 段与下一级零序 I 段配合,时限加一个级差。这个结构和相间三段完全对应,只是把“三相短路电流”换成了“零序电流”。

实际整定里还有一个隐含约束:零序 I 段的定值不能低于零序 III 段,否则三段顺序就乱了。如果算出来 I 段比 III 段还小,说明本线路太短或者系统接地阻抗太大,零序 I 段没有保护范围,应该取消,只保留 II、III 段。这种“某段不存在”的情况在配电网里很常见,模型里把对应判据的定值设成一个大数让它永不动作即可,不需要删模块。

4.3 接地故障注入与 CT 极性核对

Simulink 的 Three-Phase Fault 模块可以配置故障相和过渡电阻。做零序保护验证时,要选单相接地(AG)或者两相接地(ABG),过渡电阻从 0.01 Ω 到几十欧姆分别试。过渡电阻越大,零序电流越小,零序保护的灵敏度越差,这是接地故障保护的核心矛盾。模型里至少要跑三组:金属性接地、5 Ω 接地、20 Ω 接地,看零序 III 段还能不能动作。

CT 极性这件事必须单独说。三相电流求和得到零序,前提是三相 CT 的极性一致,都是同名端朝向母线。如果某一相 CT 接反了,正常运行时的三相和就不再是零,而是接近两倍的单相电流,零序保护会立刻误动,而且波形上看起来“就是有不平衡电流”,非常具有迷惑性。在模型里验证极性的方法是:不注入故障,空载跑一次,看零序电流是否接近零;如果明显不为零,就去检查三个电流测量模块的方向,或者检查求和时的符号。

% CT 极性自检:空载运行时零序应接近 0 I0_noload = (Ia + Ib + Ic) / 3; if abs(I0_noload) > 2 % 以二次值 2 A 为门槛 warning('零序不平衡超限 %.2f A,检查 CT 极性或变比', abs(I0_noload)); end

门槛取 2 A 是经验值,二次侧额定 5 A 的情况下,正常不平衡一般在几百毫安以内。超过这个数八成是接线问题,而不是系统真的不平衡。这段代码可以放在模型的 InitFcn 回调里,每次仿真自动跑一遍。

5. 避坑记录:五条让模型“看起来对”却全错的血泪经验

5.1 断路器分了闸,示波器上故障电流还在

现象:跳闸信号已经置 1,断路器模块也显示分闸状态,但故障电流波形纹丝不动,持续到仿真结束。

原因有两个最常见。一是断路器外部控制信号的极性搞反了,Simscape 的 Three-Phase Breaker 在外部控制模式下,控制端为 1 表示闭合、为 0 表示断开,很多人按“给信号就跳闸”的直觉接成 1 跳闸,结果故障时反而把断路器合得更死。二是测量点和断路器的位置装反了,CT 装在断路器负荷侧,断路器断开后 CT 应该失流,但如果故障模块直接接在 CT 与断路器之间,故障电流就绕过了断路器,波形当然不变。

解决:先在断路器模块的参数里确认 Initial state 和外部控制的对应关系,再沿着单线图从电源到故障点逐段核对 CT、断路器、故障模块的先后顺序。正确的顺序是电源—CT—断路器—线路—故障点,跳闸后 CT 读到的是零。

5.2 RMS 窗口加传输延时,动作时间整体偏后

现象:II 段延时设的 0.5 s,仿真出来跳闸时刻是 0.52 s,怎么调都对不上。

原因:电流有效值模块需要一个工频周期的滑动窗口,输出天然滞后 0.02 s;如果这段信号后面又串了一个 0.5 s 的 Transport Delay,总延时就是 0.52 s。定值单上写的 0.5 s 是从故障发生时刻算起的,不是从有效值稳定算起的。

解决:二选一。要么把延时改成 0.48 s 补偿掉窗口滞后,要么不用 Transport Delay,改用 3.2 节那种从“电流首次超定值”开始累加的计时方式,后者更接近真实装置的做法,也不受窗口长度影响。

5.3 反时限在低倍电流处永远不出动作

现象:III 段设了反时限,注入 1.1 倍电流,跑了 5 s 仿真,一次都没跳闸,逻辑看起来没错。

原因:t = TMS*K/((I/Is)^α - 1)在 I/Is 趋近 1 时分母趋近零,时间趋于无穷。1.1 倍电流下算出来的时间可能是几百秒,而仿真的 StopTime 只有 5 s,当然看不到跳闸。这不是逻辑错误,是物理规律。

解决:把仿真时长加到覆盖最长动作时间,或者在代码里给t_target加一个上限(本文取 60 s),让低倍电流下也有个确定的等待时间。同时确认 III 段定值本身高于最大负荷电流,1.1 倍负荷电流属于正常过负荷,本来就不该跳闸,这时候“不动作”才是对的。

5.4 零序在正常运行时误动

现象:没加任何故障,零序保护在 0.1 s 左右就动作了,或者反复抖动。

原因:多半是三相电流求和的环节用了瞬时值,采样时刻不一致或者存在数值残差;也可能是某相 CT 变比设错,比如两相填 120、一相填 100,正常运行时三相和就不为零;还有一种是把相电流的相角参考设错了,导致求和结果偏了一个角度。

解决:换成序分量模块提取零序,或者在求和前先各自取 RMS;用 4.3 节的空载自检脚本跑一遍,定位到具体是哪一相的问题;核对三个电流测量模块的方向和变比参数,确保完全一致。

5.5 代数环与求解器步长把模型拖死

现象:模型编译报代数环错误,或者仿真跑到跳闸时刻卡住不动,或者跳闸时间每次跑都不一样。

原因:保护逻辑的输出直接控制断路器,断路器状态又反过来影响电流测量,测量结果再进保护逻辑,形成了代数环。另外 powergui 如果用 Continuous 加 ode45 变步长,跳闸这种不连续事件会让求解器反复缩步,时间精度不可控。

解决:把 powergui 的 Simulation type 改成 Discrete,Sample time 设 5e-5 s,与保护逻辑里的Ts严格一致;在测量输出和逻辑输入之间插一个 Unit Delay 打断代数环;断路器控制信号后面加一个 Data Type Conversion 确保是 double 而不是 boolean。

6. 用保护范围扫描反验整定:一趟跑完三段配合的脚本

模型能跳闸只是及格线,真正要确认的是“跳得对不对”。单次仿真只能看到一个故障点下的动作情况,而整定的合理性要看整条线路上的动作边界。我的做法是写一个扫描脚本,让故障点沿线移动,记录每一处的动作时间和动作段别,最后画成一条曲线,I 段保护范围、II 段灵敏度、III 段后备范围一目了然。

% sweep_fault.m —— 沿线扫描故障点,记录动作时间与动作段别 model = 'three_stage_protection'; fault_pos = 0.05:0.05:1.0; % 故障点位置占线路全长比例 res = zeros(numel(fault_pos), 3); % [位置, 动作时间, 动作段别] for k = 1:numel(fault_pos) assignin('base', 'x_fault', fault_pos(k)); % 供模型读取的故障位置 out = sim(model, 'StopTime', '3'); t_trip = out.trip_time; % 模型输出的跳闸时刻 seg = out.trip_seg; % 1=I段 2=II段 3=III段 if isempty(t_trip) res(k,:) = [fault_pos(k), NaN, 0]; else res(k,:) = [fault_pos(k), t_trip(end), seg(end)]; end end disp(array2table(res, 'VariableNames', {'pos','t_trip','segment'}));

脚本里的x_fault需要在模型内部接一个 From 模块,用来控制故障点位置,可以用受控电压源分段实现,也可以简单地用多个故障模块并联、按位置使能。trip_time和trip_seg

本文还有配套的精品资源,点击获取

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

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

立即咨询