Simulink三段式电流保护仿真模型搭建与避坑指南
简介面向电力系统继电保护教学与研究的Matlab/Simulink仿真模型资源完整演示三段式电流保护瞬时电流速断、定时限过电流、反时限过电流与零序电流保护的建模思路适合电气工程专业学生、教师及从事继电保护设计的工程人员用来理解整定值配合、延时逻辑与接地故障检测。压缩包仅含1个PDF文件整体约984KBPDF中归纳了从电力系统元件搭建、电流互感器配置、比较单元设计到零序电流提取、故障注入验证的完整流程。已有1560人浏览学习属于入门门槛较低、可直接对照上手的继电保护仿真参考资料。读者可借此掌握Simulink环境下电流保护模型的搭建方法同时了解零序电流的产生、检测与保护配合逻辑用于课程设计、毕设仿真或现场保护方案验证前的快速预研。1. 先说结论这套 Simulink 模型把三段式电流保护的「动作时序」从课本搬成了可调试的实物我在拆这套基于 Matlab/Simulink 的三段式电流保护含零序仿真模型时第一感受是它把继电保护课里最绕的「三段配合 零序判别」变成了能直接改参数、注故障、看断路器动作的实物。速断、限时速断、定时限过电流和零序电流保护四条通路分开搭各有独立整定值和跳闸出口拿过来就能往里扔故障。适合三类人做继电保护课程设计的学生、刚接整定计算想验证配合关系的运行人员、要给培训做直观演示的讲师。下文按拆解顺序讲保护逻辑怎么映射到 Simulink、一次系统和保护链路怎么搭、故障怎么注入验证以及五个常见翻车点。2. 三段式电流保护的动作逻辑先弄清四条保护通路的分工再谈模块映射2.1 三段式保护的阶梯配合速断、限时速断、定时限各管一段很多初学者拿到模型第一反应是「三个比较器并联谁先满足谁就跳」这是错的。三段式电流保护是围绕同一条线路、按「范围 时间」两个维度分工的阶梯配合三段串联起来各有各的保护区谁都不能越级。I 段瞬时电流速断按躲过本线路末端最大三相短路电流整定动作时间接近继电器和断路器的固有时间工程上按 20~40ms 估计。它的保护范围只有线路全长的 20%~80%代价是范围短换来的是近端故障快速切除。II 段限时电流速断按与下级线路 I 段配合整定保护范围伸到本线路全长再延伸到下级线路一部分动作时间与下级 I 段差一个时间阶梯 Δt常规取 0.3~0.5s。III 段过电流保护按躲过最大负荷电流并校核返回系数整定覆盖本线路和相邻线路是本线路的近后备和相邻线路的远后备。动作特性有两种定时限是固定延时反时限是电流越大动作越快。这套模型的三个比较环节第二路走的定时限逻辑第三路走反时限逻辑两种特性都在。段别整定依据动作时间保护范围存在意义I 段 速断躲过本线路末端最大短路电流固有时间 20~40ms本线路 20%~80%快速切除近端故障II 段 限时速断与下级线路 I 段配合0.3~0.5s本线路全长 部分下级线路切除本线路剩余范围III 段 过电流躲过最大负荷电流0.5s 起逐级增加 Δt本线路 相邻线路近后备 / 远后备映射到 Simulink 时这三段的差异其实只集中在「比较器之后的出口逻辑」I 段比较器输出直接进跳闸链路II 段比较器后接一个固定延时模块III 段按反时限特性做积分累计电流越大积分越快。我一般把三段各封装成一个子系统整定值做成子系统输入口调参数不用打开模型内部结构现场改定值也不会翻车。2.2 零序电流保护接地故障特有的第三路电流必须单独一条判别通路零序电流的本质是三相电流瞬时值向量和不为零。正常对称运行时三相电流各差 120°Ia Ib Ic 0发生接地故障时故障相经故障点与地构成通路三相不再平衡出现 3I0。继电保护现场说的零序电流通常指的就是三相 CT 二次侧按同极性并联得到的 3I0数值上等于三相电流之向量和。零序保护只反映接地故障不反映负荷电流和相间短路所以在中性点有效接地系统里灵敏度很高是接地故障的主保护。模型里取零序有两条路。一条是用 Simscape Electrical 的 Sequence Analyzer 模块输入三相电流输出正序、负序、零序分量另一条更直接——用一个 Sum 模块把 Ia、Ib、Ic 相加输出就是 3I0除以 3 才是每相零序分量 I0。我习惯用 Sum 方式中间少一个模块想对比三相合成波形也更方便。这里有个关键前提零序电流的大小与中性点接地方式强相关。中性点有效接地系统里单相接地零序电流大零序过电流保护才能可靠动作中性点不接地或经消弧线圈接地系统单相接地时零序电流只有很小的电容电流零序过电流保护基本无法动作得改走零序电压或方向元件。所以拿到模型先确认变压器中性点有没有接地别在错误的系统结构下测零序测出来的数据会让你怀疑人生。2.3 模型总览一次系统、测量、保护逻辑、断路器四层信号流把整套模型的信号流理顺搭建顺序就出来了一次系统层三相电源Three-Phase Source→ 输电线路Three-Phase PI Section Line分段是为了模拟不同故障点→ 负荷Three-Phase Series RLC Load变压器按需放在电源和线路之间。测量层线路首端接 Three-Phase V-I Measurement输出三相相电压和相电流瞬时值信号一路送保护逻辑一路送示波器。保护逻辑层四个比较环节——速断、限时速断、定时限/反时限、零序——各自输出动作条件经延时和自保持合成一个 Trip 跳闸信号。执行层Trip 信号送到 Three-Phase Breaker 的跳闸输入断路器分闸切断故障电流。故障注入层用 Three-Phase Fault 模块布置在线路各分段上。最容易搞反的一步测量层必须先做 CT 变比折算再做幅值比较。不要拿一次侧的大电流直接进比较器否则整定值要跟着波形幅值走换个系统参数就全乱。3.2 节给出折算的具体处理方式。3. 搭建一次系统与保护逻辑初始化脚本、测量折算、三段出口一次说清3.1 一次系统参数脚本用 MATLAB 初始化脚本管理所有可调参数我一般会先在模型外用脚本把所有参数集中管理。原因很实际Simulink 模型里的常数模块不好改用 set_param 一条条改又繁琐把所有参数写成工作区变量模型里的模块直接引用变量名调整定值时只改脚本重跑 sim 就行。这套模型同样适合这种组织方式拿到手先把参数集中起来后续验证能省一半时间。% 一次系统参数110kV 单电源辐射网 Vn 110e3; % 额定线电压V fn 50; % 工频Hz Sn 100e6; % 系统短路容量VA用于折算系统阻抗 Zsys (Vn^2/Sn)*(0.08 1j*0.92); % 系统等效阻抗折到 110kV 侧Ω % 线路参数LGJ-240 型导线典型值 L_line 20e3; % 线路全长m R1 0.13; X1 0.40; % 正序电阻/电抗Ω/km R0 0.28; X0 1.20; % 零序电阻/电抗Ω/km % CT 变比与保护整定值 nCT 600/5; % CT 变比一次 600A / 二次 5A Iset1 1800; T1 0.05; % I 段整定值一次值 A按固有动作时间 50ms Iset2 650; T2 0.5; % II 段整定值延时 0.5s Iset3 420; % III 段反时限启动值 Tset 0.5; % 反时限时间整定系数 Iset0 150; T0 0.5; % 零序整定值延时 0.5s % 故障时间窗 t_fault 0.2; % 故障起始时刻s t_clear 0.8; % 故障切除时刻s要大于保护动作时间这段脚本里最需要注意的是单位统一电压用 V、电流用 A、阻抗用 Ω模型里的 Three-Phase Source 和 Line 模块直接填这些变量模块里就不会出现一团来历不明的数字。整定值我习惯先写一次值在比较器前统一除以 CT 变比折算成二次值这样和现场保护定值单的习惯完全一致改起来顺手。模块关键参数取值Three-Phase SourcePhase-to-phase voltage (Vrms)VnThree-Phase PI Section LineFrequency、正序/零序 R/L/C 每公里值、Lengthfn、R1/X1/R0/X0、L_lineThree-Phase Series RLC LoadActive/Reactive power按负荷水平设Three-Phase FaultFault type、Fault resistance、Transition times见第 4 章Three-Phase BreakerInitial status、Transition times0、[0 0]3.2 测量与折算相电流转幅值、CT 二次折算、零序分量提取Three-Phase V-I Measurement 模块默认输出三相电流瞬时值一次侧安培。但保护比较器需要的是幅值不是瞬时值所以在电流进比较器之前要先用 RMS 模块把每相电流的有效值算出来再取三相最大值作为相间保护的判据。RMS 模块的计算窗口要设成一个工频周期 0.02s太小会抖动太大会延迟0.02s 正好。折算这一步直接决定整定值准不准。模型里保护逻辑层都按二次值工作所以比较器的阈值要用二次整定值% 二次侧整定值 一次整定值 / CT 变比 Iset1_2nd Iset1 / nCT; % 速断二次整定值 Iset2_2nd Iset2 / nCT; % 限时速断二次整定值 Iset3_2nd Iset3 / nCT; % 过电流二次启动值 Iset0_2nd Iset0 / nCT; % 零序二次整定值对应到模型里V-I Measurement 之后接 Gain 模块Gain 1/nCT之后才是比较器。这个 Gain 放这里的好处是换 CT 变比时只改脚本里的 nCT模型结构完全不用动。零序提取放在 Gain 之前用 Sum 模块把三相电流相加得到 3I0一次值再走同一个 Gain 折算成二次零序电流。注意如果模型里直接用了一次电流比较你会发现同样的整定值在不同故障电流水平下动作时间完全对不上。先确认信号路径上有没有这个 1/nCT 的 Gain没有就先补上。3.3 三段比较与跳闸出口速断直跳、限时延时、反时限积分比较环节用 Simulink 的 Relational Operator模块输入是折算后的电流幅值阈值是二次整定值。三段区别全在出口I 段速断比较器输出直接作为跳闸条件进自保持回路。没有延时唯一要考虑的是继电器固有动作时间所以整定值里我一般预留 50ms 左右的固有时间概念实测动作时间只要在 50ms 内就算正常。II 段限时速断比较器输出先经过一个延时模块延时整定为 T2 0.5s。Simulink 里可以用 On-Delay 模块也可以用一个 Enabled Timer 自己搭比较器输出为 1 时计时器积分累计达到 T2 就输出 1。后一种方式更接近继电器实现原理也方便观察计时过程。III 段反时限这是最容易做错的一段。反时限不能用固定延时模块必须按 IEC 标准反时限公式算理论动作时间再积分累计。公式是 t(I) K × Tset / ((I / Is)^α - 1)标准反时限取 α 0.02、K 0.14Is 是启动整定值。在模型里用一个 MATLAB Function 模块算 t(I)再用积分器累计 1/t累计值到 1 就触发。关键是积分器要加使能只有电流大于启动值 Is 时才累计电流回落就清零否则会误动。% 模型里 MATLAB Function 模块内容输入 I二次值输出 tt function tt inv_time(I) alpha 0.02; K 0.14; % IEC 标准反时限常数 Is 420 / 600 * 5; % 启动值二次值视实际折算调整 tt K * 0.5 / ((I/Is)^alpha - 1); end四个跳闸条件I 段、II 段、III 段、零序最终进一个 OR 门合成。OR 门输出不能直接接断路器必须先经过 SR 触发器做自保持set 端接 OR 输出reset 端接手动复归信号。为什么必须自保持第 5 章细讲但搭模型时记得先把这个 S-R 触发器放进去不然后面每次仿真都要回来补。4. 故障注入与仿真验证三相短路、两相接地、单相接地各跑一遍4.1 Fault 模块参数与故障位置故障类型、过渡电阻、动作时序Three-Phase Fault 模块是验证的核心。它有三个参数组Fault type 勾选哪几相、Fault resistance 过渡电阻、Transition times 故障投入和退出时刻。勾选组合直接决定这次故障考验哪条保护通路验证目标Fault type 勾选预期动作通路I 段速断动作ABC 三相短路I 段 20~50ms 跳闸II 段限时速断线路末端附近 ABC 短路II 段 0.5s 跳闸III 段反时限/定时限负荷侧 AB 相间短路III 段按曲线或固定延时跳闸零序 I 段动作A-G 单相接地零序通路 0.5s 跳闸零序 相间后备AB-G 两相接地零序与 II/III 段配合故障位置的设置方式在 PI Section Line 上把线路拆成几段每段末端放一个 Fault 块。例如 20km 线路拆成 4 段每段 5km四个 Fault 块依次代表 25%、50%、75%、100% 处故障。同一时刻只激活一个故障块其余块的 Transition times 设成 [10 11]晚于仿真结束时间等于没投入。Transition times 的第二个时间要大于整条保护链路完成动作的时间。如果 toff 设得太早断路器还没跳完故障就消失了测不到动作时序。我一般设 [0.2 0.8]给 0.6s 的观察窗口足够让 1s 以内的保护段完整动作。过渡电阻也不要直接设 0给 0.01Ω 的弧光电阻既接近实际又避免理想短路导致求解器卡死。4.2 求解器与步长选错 solver速断能给你算出 60ms 延迟Simscape Electrical 的模型建议用变步长隐式求解器我一般用 ode23tb相对误差 1e-3最大步长限到 1e-3s。如果你的模型是离散化的采样保持加离散积分器那就用 discrete solver步长取 1e-4 到 1e-5s。为什么强调这个零序分量和反时限积分对步长很敏感。步长太大反时限积分一步跨过去直接触发动作时间虚小步长太小仿真慢到怀疑人生。我见过有人用 ode45 跑这个模型故障瞬间步长崩到 1e-9一个 1.5s 的仿真挂机跑了一晚上这是典型的 solver 玄学问题。solve 换回 ode23tb问题立刻消失。% 仿真参数统一设置 set_param(model_name, Solver, ode23tb); set_param(model_name, StopTime, 1.5); set_param(model_name, MaxStep, 1e-3); set_param(model_name, RelTol, 1e-3);4.3 动作时间判读与验证清单从 Trip 波形读动作时刻仿真完成后Trip 信号用 To Workspace 模块存到工作区。判读动作时间不靠肉眼盯波形写两行脚本读首个上升沿% 读取 Trip 信号首次动作时刻 SimOut sim(model_name); Trip SimOut.trip_signal; % trip_signal 是 To Workspace 输出 idx find(Trip.Data 0.5, 1); % 阈值取 0.5滤掉数值抖动 t_trip Trip.Time(idx) - t_fault; % 相对故障时刻的动作时间 fprintf(保护动作时间: %.3f s\n, t_trip);阈值取 0.5 是因为 Trip 是逻辑 0/1 信号取半值能稳定抓到第一次跳变。用 t_trip 跟整定值对照就能判断是哪一段起的动作。完整的验证清单我一般按五步走近端三相短路看 I 段是否 50ms 内跳线路中段故障看 II 段是否 0.5s 跳末端故障看 III 段是否按反时限曲线动作单相接地看零序通路是否动作最后确认动作时间和整定值误差在 10% 以内。五条全过这个模型才算真的能拿去用。5. 避坑指南六个让跳闸逻辑翻车的细节与解决这套模型踩坑点高度集中在信号处理和保护出口这两块以下六条是按实际拆解中「现象 → 原因 → 解决」整理的血泪经验。5.1 速断保护怎么都不动作现象三相短路故障电流远超整定值I 段比较器输出明明是 1断路器就是不跳电流波形一直挂着。原因最常见的两种。一是 Fault 块的 Transition times 用了 [0.2 0.8]但仿真 StopTime 只设了 0.5s——故障还没结束仿真就停了示波器里看到的是故障持续但不是保护没动。二是 Fault 块误勾了 External control外部控制信号一直是 0故障块从未被触发。解决先确认 Fault 块内部触发模式再看 StopTime。我一般把 StopTime 设 1.5s故障窗 [0.2 0.8]留足 0.7s 观察窗口。检查顺序是Fault 触发 → 比较器输出 → Trip 信号 → 断路器跳闸用 Scope 逐级看哪一级断了补哪一级。5.2 零序电流恒为零现象单相接地故障零序通路输出一直是 0零序保护纹丝不动。原因三个典型。一是测量模块取的是线电流/线电压而不是相电流零序计算的前提就没有了二是 Fault 块没勾选接地 G单相接地变成了相间开路没有入地回路三是零序提取用的 Sequence Analyzer 输入接反而把零序分量算到负序里去了。解决先用 Sum(la、lb、lc) 直接相加的方式替代 Sequence Analyzer看 3I0 有没有值。没值就从 Fault 块 G 端开始查接地勾选了吗中性点接地了吗测量输出是相电流吗这三处查完零序恒为零的问题基本能定位。5.3 反时限曲线变成固定延时现象III 段在大电流故障下动作时间和预期反时限曲线完全不符不管电流多大都固定 1s 跳。原因模型里用固定延时模块实现了反时限这是原理性错误。反时限的本质是 t 随 I 连续变化固定延时模块只有两个状态计时开始、计时到点中间没有任何电流相关性。解决换回第 3.3 节的方案用 MATLAB Function 算 t(I)配积分器累计 1/t。注意积分器必须加电流大于启动值的使能条件否则正常负荷电流也会缓慢累计挂久了照样误跳。5.4 断路器跳开后马上又合上现象示波器里 Trip 信号先是 1断路器分闸电流归零后 Trip 立刻回落 0断路器随即重合故障电流复燃。原因比较器输出直接接了断路器没有自保持。断路器跳开后故障电流消失比较器条件不再满足Trip 被撤掉断路器又按初始状态合回去了。解决在比较器和断路器之间加 SR 触发器set 端接 OR 输出reset 端接人工复归。这是继电保护现场「跳闸出口必须自保持」的硬要求不只为了仿真正确这个习惯带到实际调试里能少烧不少设备。我见过三套模型挂在同一个问题上全是补了个 S-R 触发器就好了。5.5 仿真不收敛或步长崩塌现象加进故障块后仿真报 Solver stuck或者时间步长掉到 1e-9 量级一个 1.5s 的仿真跑不完。原因一次系统参数不合理占多数。线路阻抗设得极小导致短路电流巨大或者 Fault 块过渡电阻设 0 且直接并联在理想电压源上数值求解直接溢出。解决Fault 块的 Fault resistance 给 0.01Ω系统阻抗 Zsys 不要设 0solver 换 ode23tb 并限制 MaxStep 为 1e-3。改完这三处绝大多数收敛问题都会消失。如果还卡把线路阻抗按真实导线参数复核一遍别用拍脑袋的小电阻。5.6 整定值改了但仿真结果没变现象脚本里把 Iset1 从 1800 改成 3000重跑后 I 段动作时间和原来一模一样。原因模型里的常数模块写死了数值没有引用工作区变量。脚本改了模型纹丝不动这是最隐蔽的坑。解决模型里所有整定值和延时都填变量名而不是数值Iset1_2nd、T2 这些统一从工作区读。跑仿真前先执行一次初始化脚本或者用模型的 PreLoadFcn 回调自动加载参数。从那以后我每次拿到模型第一件事就是搜常数模块看哪些地方写死了数字写死的一律改成变量引用。6. 进阶用脚本批量扫故障位置把模型变成整定配合验证台模型单次跑通只是起点真正有价值的是把它变成批量验证工具。做法是给每个故障段配一个 Fault 块用循环脚本依次激活自动采集各段保护动作时间一次性验证整条线路的保护配合。% 线路拆成 5 段每段末端一个 Fault 块 mdl model_name; fault_blocks {Fault_L1,Fault_L2,Fault_L3,Fault_L4,Fault_L5}; results []; for k 1:5 % 只激活第 k 个故障其余全部设为仿真结束后再触发 for j 1:5 if j k tt [0.2 0.8]; % 本次要考察的故障 else tt [10 11]; % 晚于 StopTime1.5s等于不投入 end set_param([mdl / fault_blocks{j}], ... TransitionTimes, mat2str(tt)); end SimOut sim(mdl, StopTime, 1.5); Trip SimOut.trip_signal; idx find(Trip.Data 0.5, 1); t_trip Trip.Time(idx) - 0.2; results(k, :) [k*20, t_trip]; % 故障位置百分比、动作时间 end disp(results);这段脚本跑完你会得到一张「故障位置 — 动作时间」对照表25% 处故障 I 段 50ms 内跳50% 处 II 段 0.5s 跳100% 处 III 段按反时限曲线动作。把这张表和整定计算书的预期值摆在一起哪里配合不上立刻暴露。我一般还会顺手画一条 t 随故障位置变化的曲线保护范围的边界一目了然比对着波形猜准得多。这套模型我前后替三个不同场景的同事做过适配每次改动都强制走一遍「初始化脚本 → 改整定 → 跑五种故障 → 判读动作时间」的标准流程再也不敢跳步。模型本身不复杂但保护逻辑这种东西错一步就是误动或拒动仿真阶段多花十分钟现场少折腾一下午。希望帮到你。本文还有配套的精品资源点击获取