简介:本资源面向电气工程、电力电子与继电保护方向的本科及研究生毕业设计场景,围绕母线继电保护动作行为仿真分析展开,提供一套可直接运行的Simulink仿真模型与配套研究文档,帮助读者理解双母线结构一次系统建模、母线完全电流差动保护原理及区内区外故障下的动作特性对比。压缩包共19个文件,约95.88MB,包含6个slx仿真模型、6份pdf参考资料、2份docx研究文档,以及m脚本、说明文档与工程备份文件,覆盖建模、仿真、分析与论文写作全流程。资源中既有双母线结构一次系统与差动保护模型,也包含TA饱和、输电线路波形等扩展仿真,配合母线差动保护讲义与相关论文,便于对照学习保护判据与波形特征。目前已有662人学习下载,适合需要完成毕设仿真、复现母线保护动作行为或撰写继电保护论文的读者参考使用。
1. 母线继电保护动作行为仿真分析系统:从“看不懂波形”到“敢下结论”
做变电站二次调试的人大多有过这种经历:母线差动保护在实验室里动作逻辑跑得通,可一到现场投运,区外故障时保护偶尔误动,翻看录波图却看不出所以然。问题往往出在CT饱和、和应涌流、死区故障这些边界工况上,真到现场去复现几乎不可能。母线继电保护动作行为仿真分析系统就是干这件事的——在电力电子仿真环境里搭出母线、CT、断路器、保护装置的等效模型,人为构造各种故障场景,观察保护的动作行为,把“玄学误动”变成可解释、可复现的仿真结论。这套东西适合继保调试人员、电力电子方向做毕设的学生,以及需要验证母线保护逻辑的二次设计工程师。它不替代现场试验,但能让你在动手接线之前,先把保护的动作边界摸清楚。
2. 母线保护仿真建模:从一次系统到二次逻辑的映射
2.1 为什么母线保护仿真比线路保护仿真更难做
线路保护仿真相对成熟,因为线路参数分布均匀,故障电流路径单一,模型简化后误差可控。母线保护不一样,它的核心难点在于“节点”特性:母线上挂接多条进出线,故障时电流从多个方向汇入,差动电流是各支路电流的矢量和。这意味着仿真模型必须同时满足两个条件——一次系统的拓扑要准确到每条支路的阻抗和互感,二次侧的CT传变特性要能反映暂态饱和。很多毕设或论文里的母线保护仿真只搭了理想CT模型,结果区外故障时差动电流始终为零,保护永远不误动,仿真结论和现场实际完全对不上。常见做法是:一次系统用三相集中参数模型,CT用Jiles-Atherton磁滞模型或分段线性化励磁曲线,保护逻辑用Comtrade录波数据驱动或直接搭建差分算法模块。
2.2 用Python搭一个最小母线差动保护仿真回路
下面这段代码用纯Python加NumPy实现一个单母线两进一出的简化模型,目的是跑通“区外故障时差动电流不为零”这个关键现象。代码不依赖Simulink或PSCAD,方便快速验证逻辑。
import numpy as np import matplotlib.pyplot as plt # 参数设置 fs = 10000 # 采样率 10kHz T = 0.1 # 仿真时长 0.1s t = np.arange(0, T, 1/fs) f = 50 # 工频 # 三条支路电流:支路1和2为进线,支路3为出线(区外故障时穿越性电流) # 区外故障:电流从支路1流入,支路2流出,支路3流出 I1 = 5 * np.sin(2*np.pi*f*t) # 进线1 I2 = -3 * np.sin(2*np.pi*f*t) # 进线2(反向) I3 = -2 * np.sin(2*np.pi*f*t) # 出线 # 理想差动电流 Id_ideal = I1 + I2 + I3 # 考虑CT饱和:支路1的CT在电流过零附近出现传变误差 # 用分段线性函数模拟饱和:电流超过阈值后传变比下降 def ct_saturate(i, threshold=4.0, ratio=0.6): out = np.copy(i) mask = np.abs(i) > threshold out[mask] = np.sign(i[mask]) * (threshold + ratio*(np.abs(i[mask])-threshold)) return out I1_sat = ct_saturate(I1) I2_sat = ct_saturate(I2) I3_sat = ct_saturate(I3) Id_real = I1_sat + I2_sat + I3_sat # 绘制波形 fig, ax = plt.subplots(2,1, figsize=(10,6)) ax[0].plot(t, Id_ideal, label='理想差动电流') ax[0].plot(t, Id_real, label='CT饱和后差动电流', linestyle='--') ax[0].set_ylabel('电流 (A)') ax[0].legend() ax[0].grid(True) # 计算差动电流有效值 Id_rms_ideal = np.sqrt(np.mean(Id_ideal**2)) Id_rms_real = np.sqrt(np.mean(Id_real**2)) ax[1].bar(['理想', '饱和'], [Id_rms_ideal, Id_rms_real]) ax[1].set_ylabel('差动电流有效值 (A)') ax[1].grid(True) plt.tight_layout() plt.show() print(f"理想差动电流有效值: {Id_rms_ideal:.4f} A") print(f"CT饱和后差动电流有效值: {Id_rms_real:.4f} A")这段代码的逻辑说明:三条支路电流之和在理想情况下为零(基尔霍夫电流定律),但CT饱和后支路1的二次电流不再线性传变,导致差动电流出现非零分量。参数说明:threshold=4.0是CT饱和阈值,对应一次电流的拐点;ratio=0.6是饱和后的传变比例,数值越小饱和越严重。实际工程中这个阈值和比例需要根据CT的伏安特性曲线用最小二乘法拟合得到,不能随便拍。跑完这段代码你会看到,理想差动电流有效值接近零,而饱和后差动电流有效值可能达到0.5A以上——这就是区外故障误动的根源。
2.3 保护动作判据的仿真实现与参数整定
差动电流算出来之后,下一步是模拟保护的动作判据。母线差动保护常用比率制动特性,动作方程是Id > Icdqd且Id > K * Ir,其中Icdqd是差动启动定值,K是制动系数,Ir是制动电流。仿真时要把这两个判据都写进去,否则无法复现“区外故障不动作、区内故障动作”的选择性。
# 比率制动特性仿真 Icdqd = 0.5 # 差动启动定值 0.5A K = 0.5 # 制动系数 # 制动电流取各支路电流绝对值之和的一半(常见取法) Ir = 0.5 * (np.abs(I1_sat) + np.abs(I2_sat) + np.abs(I3_sat)) # 动作判据 trip = (np.abs(Id_real) > Icdqd) & (np.abs(Id_real) > K * Ir) # 统计动作时间 trip_indices = np.where(trip)[0] if len(trip_indices) > 0: print(f"保护动作时刻: {t[trip_indices[0]]*1000:.2f} ms") else: print("保护未动作")参数整定的经验:Icdqd一般取0.3~0.5倍额定电流,K取0.3~0.5。如果仿真中区外故障时保护频繁动作,优先检查CT饱和模型是否过于理想,其次看制动电流的取法是否合理。有些保护装置采用最大制动电流而不是求和制动,仿真时要把这个差异体现出来。
3. 故障场景构造:区外故障、区内故障与CT饱和的仿真复现
3.1 区外故障时差动电流为什么不为零
区外故障的仿真目标是验证保护不动作。但实际仿真中,只要CT模型不是理想的,差动电流就一定存在。区别在于这个不平衡电流是否超过启动定值。构造区外故障场景时,关键参数是故障点位置和过渡电阻。故障点越靠近母线,穿越性电流越大,CT饱和越严重。过渡电阻越大,故障电流越小,饱和反而减轻。仿真时建议设置三组对比:金属性故障(过渡电阻0.01Ω)、经电阻故障(过渡电阻5Ω)、高阻故障(过渡电阻100Ω),观察差动电流的变化趋势。
# 区外故障场景对比 Rf_list = [0.01, 5, 100] # 过渡电阻 for Rf in Rf_list: # 简化:故障电流与过渡电阻成反比 Ifault = 10 / (1 + Rf/0.1) # 经验公式,仅用于演示趋势 I1 = Ifault * np.sin(2*np.pi*f*t) I2 = -0.6 * Ifault * np.sin(2*np.pi*f*t) I3 = -0.4 * Ifault * np.sin(2*np.pi*f*t) I1_sat = ct_saturate(I1) Id = I1_sat + I2 + I3 Id_rms = np.sqrt(np.mean(Id**2)) print(f"过渡电阻 {Rf}Ω: 差动电流有效值 {Id_rms:.4f} A")跑完会发现,金属性故障时差动电流最大,高阻故障时差动电流反而小。这跟直觉相反——很多人以为过渡电阻越大越容易误动,实际上过渡电阻限制了故障电流,CT饱和程度降低,不平衡电流反而减小。这个结论对整定Icdqd有直接指导意义:定值不能按最严重饱和来躲,否则区内高阻故障时灵敏度不够。
3.2 区内故障时保护动作边界的扫描方法
区内故障的仿真目标是验证保护可靠动作。但“可靠动作”不是看一个点,而是看动作边界。具体做法是:固定故障类型(单相接地、相间短路、三相短路),扫描故障位置从母线到线路末端,记录每个位置下差动电流和制动电流,画出动作特性平面上的轨迹。轨迹进入动作区则保护动作,否则拒动。
# 区内故障动作边界扫描 fault_positions = np.linspace(0, 1, 21) # 0表示母线,1表示线路末端 trip_results = [] for pos in fault_positions: # 故障电流随位置衰减 Ifault = 10 * (1 - 0.8*pos) I1 = Ifault * np.sin(2*np.pi*f*t) I2 = 0.1 * Ifault * np.sin(2*np.pi*f*t) # 对侧电源贡献 I3 = 0.0 # 出线无贡献 Id = I1 + I2 + I3 Ir = 0.5 * (np.abs(I1) + np.abs(I2) + np.abs(I3)) trip = (np.abs(Id) > Icdqd) & (np.abs(Id) > K * Ir) trip_results.append(np.any(trip)) # 输出动作边界 for pos, res in zip(fault_positions, trip_results): print(f"故障位置 {pos:.2f}: {'动作' if res else '拒动'}")这个扫描能帮你找到保护的死区——通常是母线附近经过渡电阻故障时,差动电流刚好在启动定值附近,制动电流又比较大,导致拒动。解决方法是引入故障分量差动或零序差动作为补充判据,仿真时可以把这两条判据也加进去对比。
3.3 CT饱和对保护动作行为的影响怎么量化
CT饱和的量化指标有两个:饱和深度和饱和时刻。饱和深度用饱和后的传变比下降幅度表示,饱和时刻用饱和起始角表示。仿真时可以通过改变这两个参数,观察保护动作时间的变化。下面这段代码扫描饱和深度对动作时间的影响。
# 饱和深度对动作时间的影响 ratios = [0.9, 0.7, 0.5, 0.3] for r in ratios: I1_sat = ct_saturate(I1, threshold=4.0, ratio=r) Id = I1_sat + I2 + I3 Ir = 0.5 * (np.abs(I1_sat) + np.abs(I2) + np.abs(I3)) trip = (np.abs(Id) > Icdqd) & (np.abs(Id) > K * Ir) trip_idx = np.where(trip)[0] if len(trip_idx) > 0: print(f"饱和比例 {r}: 动作时间 {t[trip_idx[0]]*1000:.2f} ms") else: print(f"饱和比例 {r}: 未动作")结果通常显示:饱和越严重(ratio越小),差动电流越大,保护动作越快。但这不代表保护性能更好——区外故障时饱和越严重,误动风险也越高。所以仿真报告里必须同时给出区内和区外的结果,不能只报动作时间。
4. 仿真避坑:母线保护建模中容易翻车的五个地方
4.1 现象:区外故障仿真时差动电流始终为零
原因:CT模型用了理想传变,或者饱和阈值设得过高,导致不平衡电流被完全忽略。解决:把CT励磁曲线用分段线性或非线性电感替代理想变压器,饱和阈值根据实际CT的伏安特性设置,一般取额定电流的3~5倍。
4.2 现象:区内故障时保护拒动,但波形上看差动电流很大
原因:制动电流的取法有问题。如果制动电流取了各支路电流的矢量和而不是绝对值和,区外故障时制动量可能为零,区内故障时制动量又过大。解决:确认保护装置的制动电流公式,常见的有“最大制动电流”和“求和制动”两种,仿真时严格按装置说明书实现。
4.3 现象:仿真步长改变后动作时间跳变
原因:步长太大导致过零点附近采样不准,差动电流的相位误差被放大。解决:仿真步长至少取1/10000秒,对应10kHz采样率。如果保护算法里有傅里叶滤波,步长还要更小,建议50kHz以上。
4.4 现象:CT饱和模型参数调好后,换一个故障类型结果完全不对
原因:饱和参数是针对特定故障电流幅值拟合的,故障类型改变后电流幅值和波形都变了,原来的分段线性参数不再适用。解决:用Jiles-Atherton模型替代分段线性模型,或者针对每种故障类型单独拟合饱和参数。
4.5 现象:仿真结论和现场录波对不上
原因:仿真里忽略了母线电压的影响。实际CT饱和与一次回路的时间常数有关,而时间常数又受母线电压和系统阻抗影响。解决:在仿真中加入母线电压测量,用电压和电流的联合判据来修正饱和模型,或者直接用Comtrade录波数据回放来验证仿真模型。
5. 从仿真到结论:怎么用这套系统写出一份能站住脚的分析报告
5.1 仿真报告里必须有的三张图
第一张是差动电流和制动电流的轨迹图,横轴制动电流、纵轴差动电流,把区内和区外故障的轨迹画在同一张图上,动作区用阴影标出。第二张是动作时间随故障位置的变化曲线,横轴故障位置、纵轴动作时间,区外故障用虚线标出。第三张是CT饱和深度对差动电流的影响柱状图,对比不同饱和比例下的不平衡电流有效值。这三张图能覆盖选择性、速动性和可靠性三个维度,比堆一堆波形图有用得多。
5.2 参数灵敏度分析怎么做才有说服力
不要只给一组参数下的结果。把Icdqd和K各取三档,交叉组合成九组,每组都跑一遍区内和区外故障,统计动作正确率。下面是一个简单的灵敏度分析框架。
# 参数灵敏度分析 Icdqd_list = [0.3, 0.5, 0.8] K_list = [0.3, 0.5, 0.7] results = [] for Icdqd in Icdqd_list: for K in K_list: # 区内故障动作正确率 correct_in = 0 total_in = 0 for pos in np.linspace(0, 0.5, 11): # 区内故障 Ifault = 10 * (1 - 0.8*pos) I1 = Ifault * np.sin(2*np.pi*f*t) I2 = 0.1 * Ifault * np.sin(2*np.pi*f*t) Id = I1 + I2 Ir = 0.5 * (np.abs(I1) + np.abs(I2)) trip = (np.abs(Id) > Icdqd) & (np.abs(Id) > K * Ir) if np.any(trip): correct_in += 1 total_in += 1 # 区外故障不动作正确率 correct_out = 0 total_out = 0 for pos in np.linspace(0.5, 1, 11): # 区外故障 Ifault = 10 * (1 - 0.8*pos) I1 = Ifault * np.sin(2*np.pi*f*t) I2 = -0.6 * Ifault * np.sin(2*np.pi*f*t) I3 = -0.4 * Ifault * np.sin(2*np.pi*f*t) I1_sat = ct_saturate(I1) Id = I1_sat + I2 + I3 Ir = 0.5 * (np.abs(I1_sat) + np.abs(I2) + np.abs(I3)) trip = (np.abs(Id) > Icdqd) & (np.abs(Id) > K * Ir) if not np.any(trip): correct_out += 1 total_out += 1 results.append((Icdqd, K, correct_in/total_in, correct_out/total_out)) # 输出表格 print("Icdqd\tK\t区内正确率\t区外正确率") for r in results: print(f"{r[0]}\t{r[1]}\t{r[2]:.2f}\t\t{r[3]:.2f}")跑完这张表,你会看到一组“甜点参数”——区内正确率接近1且区外正确率也接近1。如果找不到这样的参数组合,说明仿真模型本身有问题,比如CT饱和模型太激进或者制动电流公式不对。这时候不要硬调参数凑结果,回去检查模型。
5.3 我自己的一个习惯
每次仿真跑完,我都会把关键波形和动作结果存成CSV,然后用一个独立的脚本重新读出来画图。这样做的好处是:仿真脚本可以随便改,但分析脚本只读数据,保证结论不受仿真代码改动的影响。另外,仿真报告里从来不写“仿真结果表明保护性能良好”这种话,而是写“在过渡电阻0.01Ω、故障位置0.3倍线路长度时,差动电流有效值1.2A,制动电流有效值3.5A,动作时间12ms”。数字比形容词有说服力。希望帮到你。
本文还有配套的精品资源,点击获取