
简介面向电气工程、继电保护课程学习者和相关工程技术人员这份资料围绕 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直接填 120600/5Tct填 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、K0.14非常反时限 α1、K13.5极端反时限 α2、K80。三段式过流保护里通常用非常反时限因为它的时间随电流变化更明显跟定时限的配合也更好做。以Is 750 A、TMS 0.3、非常反时限为例不同电流倍数下的动作时间如下表电流倍数 I/Is实际电流 (A)计算动作时间 (s)1.290020.251.4510849.102.015004.053.022502.035.037501.0110.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); endratio用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 段躲不平衡电流Krel1.5 % 本线路末端单相接地时的最大 3I0由仿真或短路计算得出 I0_end_max 900; % 示例值 A I0_set_I 1.25 * I0_end_max; % 零序 I 段躲末端接地故障Krel1.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.1K_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 改成 DiscreteSample 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; % 1I段 2II段 3III段 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本文还有配套的精品资源点击获取