
简介基于Matlab-Simulink的三段式电流含零序保护仿真模型PDF文档面向电力系统继电保护教学、科研与工程仿真场景帮助读者理解瞬时电流速断、定时限和反时限三段保护及零序接地保护的原理与实现方法。文档从简化电力系统模型入手依次介绍发电机、变压器、线路与负荷建模电流互感器配置三段式比较单元整定零序电流提取与判断以及延时和逻辑控制环节并结合故障注入示例给出动作特性分析与参数优化思路可直接迁移至课程设计或现场整定计算。资源为单个PDF文件压缩包大小约984KB内容附带作者原创讲解视频入口详见文内目前已有1560人学习下载适合电气工程相关专业学生、继电保护初学者以及Simulink仿真爱好者作为入门与设计参考。1. 基于Matlab-Simulink的三段式电流(含零序)保护仿真模型为什么值得亲手搭一遍做过继保整定的人都有这种体会保护定值算得头头是道可一旦要解释「线路末端三相短路时I段为什么不动而II段必须动」「单相接地时为什么零序II段要比相间II段先出口」光靠公式和口头描述很难讲透。基于Matlab-Simulink的三段式电流(含零序)保护仿真模型就是把输电线路的电流保护配合过程压缩到一个可调参数、可设置故障、可观测波形的环境里让动作时序和整定边界变得可见。这套模型适合两类人一是刚接触继保、想把「定时限、速断、零序」从理论变成画面的学习者二是需要验证新整定方案、或者做保护装置逻辑测试的调试工程师。你不需要先精通Simulink只需要理解电流保护原理跟着下面步骤把模块连起来就能得到一个能复现「I段瞬时、II段延时、零序躲过不平衡」的仿真平台。2. 从保护逻辑到仿真构架三段式电流与零序保护先立住2.1 三段式保护的时间-电流配合关系三段式电流保护的灵魂不是「三个定值」而是「定值时限」构成的时间阶梯。第I段是瞬时电流速断按躲过本线路末端最大短路电流整定只保护线路首端到中段约80%的范围动作时间是固有动作时间一般小于0.1s。第II段是限时电流速断按躲过下级线路I段的动作范围整定时限通常取0.5s保护范围延伸到下级线路首端但不越过其I段保护区。第III段是定时限过流按躲过最大负荷电流整定时限比下级线路III段大一个阶梯作为近后备和远后备。这条逻辑落在仿真正是「时间阶梯」。很多第一次搭模型的人把三段定值分别算完就完事了结果仿真里I、II段同时动作因为忽略了Simulink的比较器本身不产生延时II段需要自己加Transport Delay或Timer逻辑。理解保护配合的先后关系是后面搭模型的前提我把常用整定关系先列成一张对照表段别整定依据典型时限保护范围I段速断躲过本线路末端最大短路电流瞬时约0.02~0.1s本线路首端 ~ 80%II段限时速断躲过下级线路I段保护区末端0.3~0.6s本线路全长 下级线路首端III段定时限过流躲过最大负荷电流并校验返回系数1.0~1.5s本线路及相邻元件后备2.2 零序保护为什么要单独做一套逻辑零序电流只在接地故障时出现与相间短路的三段式电流保护在原理上互补。中性点直接接地系统发生单相接地或两相接地时三相电流之和不等于零出现3I0分量而相间短路时三相电流对称3I0为零。所以标题里「含零序」的含义是模型除了相间保护的三段逻辑外还要单独提取并判断零序电流零序保护自身也按I段瞬时、II段限时0.5s、III段定时过流配置。零序保护与相间保护最重要差别在整定源零序I段要躲过本线路末端单相接地时的最大3I0同时还要可靠躲过断路器三相不同期合闸引起的暂态零序电流零序III段整定值要躲过线路最大不平衡电流。这些边界条件在纯公式计算里容易忽略但放到仿真模型里就会原形毕露——我见过有人在模型里直接把零序III段定值按最大负荷电流的0.3倍去设仿真一跑线路正常送电就跳闸原因就是没考虑不平衡电流。这个后文避坑章节里专门讲。2.3 模型整体构架与仿真平台选型整套模型建议用「单侧电源双分段线路」结构一个无穷大系统电源带两条串联线路L1和L2保护安装在线路L1首端靠近母线M侧故障点可以设置在线路L1中部、末端和线路L2首端三个位置用来验证I段、II段、III段以及零序各段的选择性与灵敏性。为什么选Simulink而不是直接写Python做短路计算因为保护定值整定只是第一步你真正要看的是时间配合、跳闸信号锁存、故障切除后的电流变化。Simulink的Simscape Electrical老版本叫SimPowerSystems提供三相电源、分布式参数线路、三相故障、断路器模块可以直接在连续域仿真暂态过程适合复现保护动作的物理时序。元件清单上模型主体包含这些模块Three-Phase Source电源、Three-Phase V-I Measurement电压电流测量、PI Section Line线路正序零序参数分开设、Three-Phase Fault可编程故障类型和时序、Three-Phase Breaker断路器、Fourier基波幅值提取比RMS模块更贴近实际保护装置的数字滤波特性、继电器逻辑模块/自定义MATLAB Function。测量点放在线路首端断路器下游模拟保护装置从CT获取电流。我一般会再用一组Gain模块模拟CT变比把一次侧电流折算到二次侧方便后用实际定值验证。3. 用 Simulink 从零搭模型从电源到保护逻辑的完整步骤3.1 系统主电路搭建与关键参数打开Simulink空模型从Simscape Electrical库拖出以下模块并按顺序连线Three-Phase Source → Three-Phase V-I Measurement → Three-Phase Breaker → PI Section LineL1→ 母线B → PI Section LineL2→ Three-Phase Fault → Three-Phase Series RLC Load。注意这里断路器位置很有讲究放在测量点和线路之间模拟的是断路器跳闸切除故障。电源和线路的典型参数这样设置电源线电压110kV、三相短路容量1500MVA对应系统阻抗约8.1Ω频率50Hz。线路用PI Section Line模型正序阻抗按0.42Ω/km、正序电抗0.4mH/km设零序阻抗设为正序的3倍这是220kV以下线路常见的近似比例。L1长度取20kmL2取15km故障点可以先用L2末端后面扫故障距离时再改。% init_model.m —— 模型初始化脚本放在模型回调或单独运行 % 说明所有定值和系统参数都从工作区传入避免在模块图里硬编码 Vn 110e3; % 系统额定线电压(V) Sn 1500e6; % 电源短路容量(VA)决定系统阻抗 f0 50; % 系统频率(Hz) L1_len 20; % 线路L1长度(km) L2_len 15; % 线路L2长度(km) r1 0.42; x1 2*pi*f0*0.4e-3; % 正序电阻/感抗(Ω/km) r0 3*r1; x0 3*x1; % 零序电阻/感抗(Ω/km)按3倍正序 Zs Vn^2 / Sn; % 系统等效阻抗(Ω)忽略阻抗角差别 CT_ratio 600/5; % CT变比一次600A/二次5A这段脚本的逻辑是把系统阻抗按短路容量折算成欧姆值用来估算各级短路电流把CT变比集中定义后面整定计算都以二次侧电流为基准。参数集中放脚本的好处是后面做批量扫描时只需要改脚本里的L1_len或故障位置再用sim()重跑模型不需要逐个打开模块对话框去翻参数。3.2 电流信号处理提取基波幅值与零序分量Three-Phase V-I Measurement模块输出的是三相瞬时电流。保护装置实际拿到的电流要经过数字滤波动作量用的是基波幅值而不是瞬时值或全波RMS否则非周期分量和暂态谐波会干扰整定配合。Simulink里对应做法是先把电流转成标量信号再送入Fourier模块。具体接法测量模块的电流输出经Selector或端子分裂出Ia、Ib、Ic三条信号各接一个Fourier模块。Fourier模块的参数里Fundamental Frequency填50Harmonic n填1输出选Magnitude就会输出基波分量的幅值。很多人图省事改用RMS或Mean模块测幅值仿真结果在稳态段同样能动作但故障初始的非周期分量会导致幅值冲得很高I段比理论计算提前动作时序就不对了。零序电流的提取是重点。基于对称分量法三相电流瞬时值相加等于3I0所以直接用一个Sum模块把Ia、Ib、Ic加起来就得到3I0。如果后续要跟定值比较习惯上会再除3得到I0但我建议保留3I0形式因为零序电流保护的整定值大多用3I0表示这也是保护装置的通用做法。零序支路同样要过一遍Fourier提取基波因为接地故障瞬间会有较大的衰减直流分量。% 说明在Simulink中用Sum模块做 IaIbIc % Sum模块符号列表填 输出即 3I0 % 再接一个Fourier模块基波50Hz输出Magnitude % 得到的就是用于零序保护的基波3I0幅值3.3 三段式逻辑判断模块与出口保持三段式逻辑适合用MATLAB Function模块实现比堆一堆Relay、AND、OR模块更直观也方便整定值从工作区传入。函数输入是基波幅值If和3I0幅值内部完成四段判断相间I段、相间II段、相间III段、零序各段。注意保护逻辑有个关键点跳闸信号必须在故障切除后保持住否则故障电流一消失信号就回落无法记录动作事实。用SR Flip-Flop做信号保持是常见做法。比较器的输出接S端R端接一个手动复归按钮Constant常数双击置1复位。这样任何一段保护动作后跳闸信号一直维持高电平直到你手动复归这也是实际保护装置的「合后记忆」逻辑。下面是一个简化的MATLAB Function内部代码判断逻辑清晰便于改成你自己的定值function Trip protection_logic(If, I0_3) % 保护判断函数输入基波相电流幅值If、基波3I0幅值 % 定值通过模型参数从工作区读入这里写默认参考值 % 相间保护三段定值二次值单位A Izd1 24.5; % 相间I段躲末端三相短路 Izd2 8.3; % 相间II段与下级I段配合 Izd3 3.2; % 相间III段躲最大负荷电流 I0zd1 6.8; % 零序I段躲末端单相接地3I0 I0zd2 2.1; % 零序II段与下级零序I段配合 I0zd3 0.4; % 零序III段躲不平衡电流 % 各段动作判断输出0/1 Trip_ph_I double(If Izd1); Trip_ph_II double(If Izd2); Trip_ph_III double(If Izd3); Trip_0_I double(I0_3 I0zd1); Trip_0_II double(I0_3 I0zd2); Trip_0_III double(I0_3 I0zd3); % 出口汇总相间或零序任一满足都跳闸 Trip max([Trip_ph_I, Trip_ph_II, Trip_ph_III, ... Trip_0_I, Trip_0_II, Trip_0_III]); end这段代码的要点是定值先按二次侧值写方便后续与保护装置定值单对照每个段位都是一个独立的「过定值即动作」判断时限配合不在函数里做而在Simulink里用延时模块实现。比如II段动作信号从函数输出后接一个Transport Delay延时0.5s再和I段的瞬时信号一起进入SR触发器。这样做的原因是函数内部放延时容易把代码写乱用Simulink自带延时块看得见、调得动Scope里直接能看到阶梯关系。3.4 故障设置与时序控制Three-Phase Fault模块支持设置故障类型A相接地、BC相间短路、三相短路都可以通过下拉菜单选择。要模拟故障发生和切除过程把故障模块的External Control勾上用Step模块产生控制信号Step初始值0在0.3s跳变到1表示故障在0.3s发生再用另一个Step在0.7s从1跳回0表示故障消失。故障持续时间0.4s这个窗口足够观察保护动作时序。故障时序和仿真时间的配合是模型里最容易出玄学问题的环节。我习惯把仿真总时长设2s故障窗0.3~0.7s。为什么不是0.5s切故障因为III段时限整到1.0s以上时故障必须在保护动作前持续足够时间否则II段还没延时完故障就没了。把故障持续时间设到0.7s以后保证最慢的III段也有机会动作要观察不同段位动作就把故障点挪位置故障点近线路首端I段应该先跳故障点在线路末端I段应该被拒动II段延时0.5s后动作。这个「移动故障点看动作情况」是后面验证配合的核心手段。4. 整定计算与仿真验证让保护在设定时间动作4.1 手算整定值的思路与算例搭好模型后不能急着跑仿真先把整定值算出来再对照仿真结果否则保护该动的不动、不该动的乱动你很难判断是逻辑错误还是定值错误。以第3章的模型参数为例做一次手算整定系统阻抗Zs8.1Ω一次侧L1正序阻抗20km×0.37Ω/km≈7.4ΩL2正序阻抗15km×0.37≈5.6Ω。母线B三相短路电流为 110kV/√3 除以(ZsZ_L1)约等于64kV/(8.17.4)Ω≈4120A线路L2末端三相短路电流为64kV/(8.17.45.6)Ω≈3030A。这里算的都是一次值折算到CT二次侧I段按躲L2末端三相短路取可靠系数1.3I_DZ11.3×3030/120≈32.8A灵敏性校验用母线B两相短路约0.866×41203568AKsen3568/(32.8×120)0.91不满足1.2的要求说明I段保护范围不达标模型里就能看到末端故障时I段拒动的现象。段别一次整定值(A)二次整定值(A)动作时限整定原则相间I段394032.8瞬时躲L2末端三相短路×1.3相间II段145312.10.5s躲下级I段保护区与下级I段配合相间III段4623.851.0s躲最大负荷电流300A校返回系数零序I段246020.5瞬时躲L2末端单相接地3I0零序II段8757.30.5s与下级零序I段配合零序III段1201.01.0s躲线路最大不平衡电流需要注意的是相间II段的整定值必须小于本线路末端故障电流这样才能保证近处故障II段可靠启动同时大于下级I段末端故障电流否则会越级动作。表格里的数值已经按这两个条件校过但如果把模型里的线路长度改了这些值必须重算。这也是把参数集中放初始化脚本的意义——改完脚本让MATLAB把新定值自动算好再传给MATLAB Function。4.2 模型参数与仿真求解器设置模型参数设置要从两个层面看一是模块参数二是求解器参数。模块参数里最常被忽视的是线路PI Section的正序零序电容仿真模型里如果只填阻感参数空载长线路的充电电流会偏小但故障电流主要由阻感决定影响不大。值得关注的是Powergui模块必须设为Continuous模式不能用Phasor模式因为Phasor模式是相量域求解看不到暂态波形和动作时序。求解器设置我一般这样配Solver选VariableStepSolverType选ode23tbMaxStep设1e-31ms相对误差1e-4。为什么要限制最大步长故障瞬间电流变化剧烈如果步长太大波形峰值会被平滑掉保护动作时刻会出现0.几毫秒的偏差差之毫厘就会导致II段和III段的分界判断模糊。变步长ode23tb对刚性系统友好电力电子和短路暂态都能稳定跑这个组合是我做了多个模型后固定下来的习惯配置。% 仿真控制语句在MATLAB命令行运行 % 设置仿真时长和控制参数 set_param(model_name, StopTime, 2); set_param(model_name, Solver, VariableStepAuto); set_param(model_name, MaxStep, 1e-3); % 运行仿真并把结果存回工作区 simOut sim(model_name, SaveOutput, on, ... OutputFcn, );这里有两个坑一是模型名不能带中文和空格否则set_param找不到模型路径二是OutputFcn参数如果在模型配置里没勾选保存输出sim()返回的结构体可能没有输出字段。所以我一般建议模型里的波形用Scope看同时用To Workspace模块把关键信号If、3I0、Trip存成数组便于后处理。4.3 结果判读从波形辨识保护动作行为仿真跑完打开Scope同时看四路信号三相电流看短路发生时刻、基波幅值If看保护测量量、3I0看零序量、Trip信号看跳闸时刻。合格模型的输出应该是这样0.3s故障发生瞬间If从负荷电流水平跳到几千ATrip信号在0.3s附近立刻拉高说明I段动作0.7s故障消失If回落Trip信号因为SR锁存继续保持高电平直到手动复归。判读时序的要点是看动作时间差。比如故障在线路L1末端时If升高但I段定值32.8A没被超过Trip信号应该在0.3s0.5s0.8s位置拉高对应II段动作。如果看到Trip在0.3s就动说明定值没生效——大概率是MATLAB Function里的定值变量没从工作区传入函数用了内部默认值。零序保护同理单相接地故障时3I0波形会出现零序I段瞬时动作如果只看到If变化而3I0一直为零就要查三相电流求和信号的极性或者故障类型是否选了三相短路。5. 常见问题与排查5 个让模型翻车的细节5.1 一上电波形就在振荡发散现象仿真一开始电流波形就剧烈振荡数值跑到10的8次方以上求解器报错或卡死。 原因多数是求解器参数和模型设置不匹配最常见的是Powergui处于Phasor模式却用Continuous求解器或者线路分布参数模型的阻抗矩阵在初始时刻存在数值突变。另一个原因是断路器初始状态设置冲突比如断路器初始状态设为闭合但线路对地电容预充电压不一致合闸瞬间出现高频振荡。 解决把Powergui切到Continuous求解器用ode23tbMaxStep设1e-3检查断路器初始状态是否为1闭合把线路模型改用PI Section并勾选Initialize with a load flow。做完这三步绝大多数振荡都能压住。5.2 三段保护同时动作、时序乱套现象故障发生后I、II、III段跳闸信号在同一时刻拉高完全看不出时间阶梯。 原因逻辑判断函数通常只输出「动作」指示不生成各自的延时信号。三条线路的Trip信号直接汇总到一个SR触发器的S端谁先触发谁保持后面的信号被覆盖。 解决不要共用同一个SR触发器每段各配一个SR锁存II段动作信号前串Transport Delay设0.5s、III段设1.0s最终跳闸信号用OR合成。这样Scope里可以看到I段先跳II段0.5s后再补跳阶梯关系一目了然。5.3 单相接地时零序电流提取不到现象切到A相接地故障If波形明显变化3I0信号一直是零或者只有毛刺。 原因Sum模块的输入符号填错了。三相电流从测量模块出来时通道顺序可能不是Ia、Ib、Ic如果Sum模块实际做的是IaIb-Ic对称分量法就不成立了另一个常见原因是故障模块的三相接地端子没接回线路末端故障电流没有构成零序通路。 解决用Multimeter或Scope逐个查看测量模块输出的通道顺序确认三个电流信号与A、B、C相对应故障模块的接地端必须物理连接到线路末端的中性点或直接接地否则零序通路被切断。检查办法是跑一个三相平衡负荷工况正常时3I0应该非常接近0不平衡时才出现幅值。5.4 跳闸信号一直保持、不返回现象故障切除后Trip信号始终是1甚至手动把故障模块清零也无法复归。 原因这不是bug而是SR锁存器的正常行为——S端触发后R端必须要有复归信号才能复位。很多人忘了给R端接任何东西SR触发器就无限保持。 解决给R端接一个Constant模块常数值设为0需要复归时双击改成1再改回0模拟保护装置的手动复归。如果你想做自动重合闸就把R端接到重合闸判断逻辑的输出重合成功后再复位这属于进阶玩法。这个细节我在第6章展开。5.5 故障点距离改变后动作结果完全乱套现象初始化脚本里把L2长度改了或者故障点位置从L2末端改到L2中部仿真结果里原本该动作的II段不动作、III段动作时间漂移。 原因整定值没有随线路长度和系统运行方式变化重新计算。脚本里如果只改了线路长度但故障电流和定值还是按旧参数手算填入MATLAB Function整定配合就被破坏了另一个原因是故障点位置变了但故障类型或过渡电阻没同步调整导致短路电流幅值和理论预期差很多。 解决把整定计算也写进初始化脚本先计算当前线路参数下的各点短路电流再生成定值最后传给保护逻辑函数。切忌在MATLAB Function里写死定值常量这是我见过最多的翻车原因。用一个脚本把「参数定义→短路计算→定值生成→模型赋值→运行仿真」串起来才能保证改距离后模型依然成立。6. 进阶用脚本批量扫描故障位置验证保护配合的灵敏性与选择性模型能跑、单点故障能正确动作只算完成了第一步。真正让模型发挥价值的是批量扫描把故障点从线路首端一路挪到线路末端和下级线路记录每个位置下各段的动作时间生成一张「保护范围—动作时间」对照表。这一步能把I段保护范围不够、II段与下级配合重叠这类隐患一次性暴露出来。实现方法是用MATLAB脚本循环改PI Section Line的线段长度参数多次调用sim()每次记录Trip信号从0跳1的时刻。关键点是线路模块的Segment Length参数名随模型不同有差异建议把线路长度做成一个Output端口的参数或者在脚本里用set_param配合路径查找避免手工改模块名。% scan_fault.m —— 批量扫描故障位置输出各段动作时间 fault_positions 5:2:35; % 距保护安装处距离(km)覆盖L1L2 act_time zeros(length(fault_positions), 3); for k 1:length(fault_positions) dist fault_positions(k); set_param(model_name/LineL1, Length, num2str(min(dist, 20))); set_param(model_name/LineL2, Length, num2str(max(dist - 20, 0.1))); simOut sim(model_name, StopTime, 1.5, ... MaxStep, 1e-3); Trip_data simOut.get(Trip_log); % Nx1数组 t_data simOut.get(t_log); idx find(diff(Trip_data) 0.5, 1, first); if ~isempty(idx) act_time(k, 1) t_data(idx 1); % 首次跳闸时间 else act_time(k, 1) NaN; % 该位置未动作 end end % 结果绘图横轴故障距离纵轴动作时间 plot(fault_positions, act_time(:, 1), o-); xlabel(故障距离(km)); ylabel(跳闸时间(s)); grid on;这段脚本循环里每次把L1、L2的长度重新切分保证总长度和故障点位置同步变化模拟故障点沿线路移动。这样扫出来的曲线会出现明显的阶梯距离近时I段瞬时动作曲线平直在0.05s附近故障越过I段保护范围后曲线跳到0.5s平台对应II段再远到下级线路末端跳到1.0s平台对应III段。如果曲线跳变点对应的距离和手算的I段保护范围偏差超过10%重新检查整定值和线路参数。这个技巧的价值在于它把一次一次的「单点试错」变成「全局验证」一个下午就能把线路全线动作行为扫完还能把结果导出成表格直接贴进整定报告里。这是我的习惯——每次改完线路参数或系统运行方式必跑一遍扫描曲线再下结论。早年间我偷懒只看一两个点位的动作情况结果某次换了一个远端的故障点II段拒动整整查了一下午从那时候起我就再也不敢省这一步。希望你也能在这个模型上把保护配合看通透各种工况都能自己动手验证希望帮到你。本文还有配套的精品资源点击获取