简介:这份PDF期刊论文聚焦电力系统故障诊断与评估平台开发,研究如何将分散在不同安全分区的故障数据与信息进行跨区分类、关联和融合,提出基于多源数据融合的主网与配网智能诊断技术。文中以江苏电力系统为例,综合电网运行信息、设备状态信息和环境监测信息进行了平台研制与故障辅助分析系统的实践验证,结果表明利用多源数据冗余信息可更快、更准地实现故障智能诊断。资源为单文件PDF,约4.9MB,适合从事电力系统自动化、智能运维研究的学生、工程师与科研人员参考,也可作为电力信息化与故障诊断技术方向的文献资料。已有169人学习,可用于理解电力大数据融合方法、主网与配网诊断评估流程及实际落地思路。
1. 多源数据融合的电力故障诊断:单一数据源为什么注定不够用
做过变电站故障分析的工程师基本都有过这种经历:故障录波器明明启动录波了,SCADA 却因为刷新周期太长没记下关键电压跌落;PMU 拿到暂态数据了,但控制保护信息又没跟上,最后推理了半天连故障相别都定不了。单靠一路数据源去判断一次故障,就像是闭着一只眼挑短路点,总有盲区。这个多源数据融合的故障诊断与评估平台,解决的就是这一整条链路的问题:把 SCADA 稳态量、PMU 暂态量、故障录波和保护动作信号汇总到一个平台里,做时间对齐、特征提取、故障诊断和严重度评估。目标很直接:让诊断结论从「大概知道哪儿跳了」推进到「哪一相、什么故障类型、距离多远、有多严重」,并且把整个过程落实成一套可维护、可验证的工程代码。
2. 让 SCADA、PMU 与录波数据在时间轴上对齐:融合的第一步
2.1 三种数据源的根本差异:刷新率、时标与触发方式
SCADA 数据来自 RTU 或测控装置,典型刷新周期是 1~5 秒,存的是稳态量,母线电压、线路电流、有功无功都在这一层。PMU 也叫同步相量测量单元,能输出 50 帧/秒甚至更高频率的相量数据,带 GPS 时标,能看到故障前几个周波到故障后的动态过程。故障录波器则只在故障或扰动触发时启动,记录时间短但采样率高,通常做到 1 kHz 到 10 kHz,是三种数据源里细节最丰富的。
在做平台开发时,这个差异直接决定了融合策略:不能用 SCADA 的周期去对齐 PMU 帧,也不能拿录波的暂态数据去填补 SCADA 的稳态缺口。我一般把三者定义成「背景数据、过程数据、事件数据」,SCADA 管设备运行背景,PMU 管故障前后的动态过程,录波管故障瞬间的精确波形。融合的关键是把它们拉到一个可比较的时间轴上。
这个环节最常犯的错误是直接按「秒级时间戳」去 join。SCADA 的时标可能只有秒精度,PMU 是毫秒甚至微秒精度,录波的时间则是从触发点开始折算的。如果不处理时标精度差异,后面对齐出来的故障时间会漂移几百毫秒,在区内外故障判定时直接翻车。
2.2 用 merge_asof 把三路数据对齐到同一时间轴
代码层面的对齐,我推荐用 pandas 的 merge_asof 来做非精确时间匹配。它不同于普通的 merge,它允许左表的每个时间点在右表里匹配「最近一条时间戳不晚于它」的记录,这正好贴合故障场景:我们要的是一条电气量在某个故障时刻前后的 SCADA 断面和 PMU 帧,而不是要求两边时间精确相等。
import pandas as pd # 样例数据结构(实际从各自接口读入后统一改列名) scada_df = pd.DataFrame({ "timestamp": pd.to_datetime(["2025-06-01 10:00:01", "2025-06-01 10:00:06", "2025-06-01 10:00:11"]), "Ua": [10.2, 9.8, 10.1], "Ia": [0.3, 0.4, 0.3] # 母线电压(kV)、电流(kA) }) pmu_df = pd.DataFrame({ "timestamp": pd.to_datetime(["2025-06-01 10:00:01.500", "2025-06-01 10:00:02.700", "2025-06-01 10:00:07.250"]), "Ua_pmu": [10.1, 9.5, 10.0], "Ia_pmu": [0.32, 0.45, 0.31] }) # 统一按升序排序是 merge_asof 的前提 scada_df = scada_df.sort_values("timestamp") pmu_df = pmu_df.sort_values("timestamp") # 以 SCADA 时间轴为基准,向右匹配最近一条 PMU 记录 aligned = pd.merge_asof( scada_df, pmu_df, on="timestamp", direction="backward", tolerance=pd.Timedelta("5s") # 最多容忍 5 秒偏差,超出不匹配 ) print(aligned)这里有两个参数值得认真对待。direction="backward" 表示匹配「不晚于 SCADA 时间点」的最近 PMU 帧,这样 PMU 带过来的是故障前或故障瞬间的最新状态,不会拿未来的数据来填空;tolerance 则用来限制最远匹配距离,如果 SCADA 和 PMU 的时差超过了 tolerance,就输出 NaN,在后续诊断时走数据缺失分支。
提示:如果你的实际场景里能拿到设备对时状态,建议把对时状态也作为一列接入。GPS 失步的 PMU 数据即使时间戳对齐了也不能直接参与诊断。
2.3 波形数据的对齐:录波文件按触发时间折算绝对时间
录波器记录的是相对时间,COMTRADE 文件里的时间轴是从触发时刻开始的。在融合之前需要把相对时间换算成绝对时间:从 COMTRADE 的 CFG 文件里找到触发时间戳,再将每个采样点的相对偏移加到触发时间上。这样录波数据才能与 PMU 的绝对时标放在同一个时间轴里参与对齐。
我见过不少团队把录波的采样点序号直接当时间用,结果录波起始时间和 PMU 时间轴差了秒级,后续不管是做行波测距还是故障类型识别,时间基准错了一点,结果就完全不对。这里没有巧办法,只有一条:解析 CFG 文件字段时把 triggers 时标和采样速率读出来,统一换算后落库,后面所有算法都基于这套绝对时间戳运行。
3. 故障诊断与评估引擎:判型、测距与严重度打分
3.1 电气量突变检测:用滑窗差分构造故障特征
对齐后的数据有了统一时间轴,下一步是从电气量里提取故障特征。最稳定的两类特征:电压幅值跌落和电流幅值突增。实现上我一般用滑窗差分,以当前采样点前后的均值做差,避免单点噪声造成误判。
import numpy as np def detect_fault_start(u_a, i_a, fs=1000, window=20, u_th=0.2, i_th=0.5): """ 基于电压跌落和电流突增的双判据故障起始检测 u_a: 三相电压序列之一,kV i_a: 三相电流序列之一,kA fs: 采样率,Hz window: 差分数值窗口长度,采样点数 u_th: 电压跌落阈值(标幺值),0.2 表示跌到额定值的 80% 以下 i_th: 电流突增阈值(标幺值),0.5 表示电流上升 50% """ u_diff = np.abs(np.diff(u_a)) i_diff = np.abs(np.diff(i_a)) # 滑窗平均,压制高频噪声 def sliding_mean(x): kernel = np.ones(window) / window return np.convolve(x, kernel, mode="same") u_avg = sliding_mean(u_diff) i_avg = sliding_mean(i_diff) # 电压判据:跌落后斜率突变超过额定值 20% u_base = np.median(u_a[:int(fs * 0.2)]) # 用前 0.2 秒中位数作为故障前基准 i_base = np.median(i_a[:int(fs * 0.2)]) u_th_abs = u_th * u_base i_th_abs = i_th * i_base fault_idx = np.where((u_avg > u_th_abs) & (i_avg > i_th_abs))[0] return int(fault_idx[0]) if len(fault_idx) else None参数选择上,window 取 20 个采样点对应 50 Hz 系统的一个周波,可以有效抑制谐波干扰;u_th 取 0.2 是为了和距离保护 I 段的电压判据保持一致,灵敏度较高但不会对正常的电压波动告警。如果现场出现频繁误报,优先把 u_th 提到 0.3,同时把 i_th 降到 0.3——不同变电站的系统阻抗不同,这两个值需要根据录波数据回放来标定。
这个函数返回的 fault_idx 就是整个平台所有下游判断的时间基准:故障类型判据、测距计算、保护信息匹配,全都要从这一刻开始算窗口。
3.2 故障相别识别:基于三相电流突变的比例判断
知道故障发生的时刻后,下一步是判断故障相别。常见做法是计算 A/B/C 三相在故障后一个周波内的电流幅值增量,做一个归一化的比例矩阵,再套用标准故障类型的判据。比如单相接地故障时只有一个相的电流突变显著,两相短路时有两个相的电流同时大幅上升,三相短路则是三相都上升且幅值接近。
这个环节最怕的是高阻接地:故障电流增幅可能只有额定电流的 0.3 倍,判据阈值设置得稍微高一点,单相接地就直接漏判。我在工程里通常给电流判据设置两套阈值,一组高阈值用于快速报告明显故障,另一组低阈值用于高阻故障的补充识别,后者判断为疑似后还要结合零序电流和电压的零序分量做二次确认。
3.3 故障严重度评估:从跳闸到打分
标题里的「评估」不只是故障类型,更要回答「这次故障多严重」。我常用三个维度:故障电流倍数、电压跌落深度和故障持续时间。它们本质上描述了故障对系统的冲击程度——电流倍数越高、电压跌得越狠、持续时间越长,对一次设备和系统稳定性的影响越大。
具体打分逻辑可以做成一个加权综合指标,每个维度的分数范围是 0 到 100,最终输出一个 0 到 100 的严重度分数。我一般把权重设为电流倍数 0.4、电压跌落 0.35、持续时间 0.25,这样既照顾故障本身的剧烈程度,也不忽略继电保护切除时间对设备损伤的影响。
4. 平台怎么搭:数据接入层、融合引擎与诊断评估服务
4.1 分层架构与模块划分
这个平台虽然名义上叫「评估平台」,实际落地时不需要做成一整套大型软件,我更建议按服务方式拆分:数据接入层负责从 SCADA、PMU、录波器、保护装置四个接口拉数据;融合引擎做时间对齐和特征提取,输出统一格式的故障事件;诊断服务跑故障类型识别、测距和严重度打分;评估服务负责把诊断结果和设备历史状态、故障电流累计次数做比对,给出运行建议。
对接电力系统内部数据时,一般优先用 IEC 61850 的 MMS 服务接入保护装置数据,用 IEC 60870-5-104 接入 SCADA 遥信遥测,PMU 数据按 IEEE C37.118 协议接入。录波文件走 COMTRADE 文件解析。如果现场暂时不支持这些规约,常见做法是先由各子站把数据推送到前置机,平台从前置机的数据库里统一读取,避免每个设备单独写采集代码。
4.2 最小可跑的评估引擎骨架
平台的核心服务没必要一开始就写得非常复杂,我建议先实现一个能出结果的骨架,再逐步丰富。下面的代码是一个简化版的故障事件评估服务:输入对齐后的数据帧,输出故障类型、严重度分数和推荐处理动作。
class FaultAssessmentService: def __init__(self, fault_type_weights=None): # 三相突变权重,用于严重度归一化 self.fault_type_weights = fault_type_weights or { "单相接地": 0.6, "两相短路": 0.8, "三相短路": 1.0 } def assess(self, event: dict) -> dict: """ event 结构: { "fault_type": "单相接地", "i_pu_max": 2.3, # 最大故障电流倍数(标幺值) "u_drop_percent": 0.72, # 电压跌落百分比,0.72 表示跌到 28% "duration_ms": 95, # 故障持续时长,毫秒 } """ score_i = min(100, 30 * event["i_pu_max"]) # 2 倍电流 -> 60 分 score_u = min(100, event["u_drop_percent"] * 120) # 0.7 跌落 -> 84 分 score_d = 100 if event["duration_ms"] > 80 else 50 sev_score = ( 0.4 * score_i + 0.35 * score_u + 0.25 * score_d * self.fault_type_weights.get(event["fault_type"], 0.8) ) sev_score = round(min(100, sev_score), 1) # 推荐动作按严重度分档 if sev_score >= 85: action = "立即安排抢修,并检查相邻设备状态" elif sev_score >= 60: action = "安排检修,评估重合闸投退策略" else: action = "登记缺陷,跟踪后续运行数据" return {"severity_score": sev_score, "action": action} service = FaultAssessmentService() result = service.assess({ "fault_type": "单相接地", "i_pu_max": 2.3, "u_drop_percent": 0.72, "duration_ms": 95, }) print(result)这段骨架代码的价值在于把「评估」从口头概念变成了能跑的模块。你可以基于这个骨架逐步加入历史对比、设备状态联动、告警推送。注意其中的权重和分数曲线是经验值,实际部署时需要用当地电网的历史故障数据进行校准,而不是直接照抄。
4.3 数据入库与事件关联
诊断服务跑完后,事件需要落到时序数据库里,并和原始数据关联。我一般用两套存储:ClickHouse 或 TimescaleDB 存采样数据和融合后的特征序列,MySQL/PG 存诊断结果事件。评估平台的前端只查事件表和特征快照,不直接扫原始波形,这样可以保证查询速度。
5. 故障诊断平台避坑:时间错位、数据缺失与阈值误判
5.1 SCADA 时标不准确导致故障时间点漂移
现象:merge_asof 对齐后,PMU 匹配到的故障前断面离真实故障时刻差了几个周波,后续突变检测得出的 fault_idx 前后漂移。
原因:SCADA 的时标在部分老站是后台程序打上的,有的滞后 1~2 秒才刷新。如果拿这个滞后时间戳做对齐,PMU 匹配过去的「故障前」数据其实是故障发生后的数据,突变检测会被污染。
解决:处理时先做时标校验。常见做法是拉一段 PMU 和 SCADA 同时刻的电压幅值做互相关系数,如果相关系数低于 0.9,说明 SCADA 时标偏差大,此时以 PMU 时标为基准,把 SCADA 的时标向前平移一个固定偏差后重新对齐。
5.2 故障录波缺失或录波启动失败
现象:诊断平台收不到录波文件,故障类型和测距结果出不来。
原因:录波器的启动门槛跟平台不一致,比如启动定值里的零序电流门槛高于实际故障的零序量,导致故障后录波器没有启录。
解决:平台不能把录波数据当成必选输入。在没有录波文件时,退回到 PMU 加 SCADA 的稳态/动态数据组合,用 PMU 的暂态相量做低精度测距,同时给评估结果降级标注,注明可信度。在运维侧,还需要把录波器启动门槛和平台检测门槛做一次联动核对,保证至少一路会触发。
5.3 阈值不当把励磁涌流误判为故障
现象:变压器空充时平台频繁上报「区内故障」,严重度评分还不低。
原因:励磁涌流的特点是电流幅值上升明显、谐波含量高,但电压跌幅不大。只按电流突增和持续时间判故障,完全不看电压判据,自然会误报。
解决:在突变检测和相别识别之间插入谐波分量分析。励磁涌流的二次谐波与基波比通常在 15% 以上,而内部故障很少有这么高的二次谐波占比。只对谐波占比低于 15% 的事件继续走故障诊断流程,超过 15% 的标记为疑似涌流事件,走单独的涌流识别逻辑。
5.4 保护动作信号和电气量特征矛盾
现象:保护动作报文显示 A 相跳闸,但电气量特征显示两相短路特征。
原因:开关跳闸后重合闸逻辑介入,或者上一级后备保护先断开,导致平台抓到的电气量是保护动作之后的状态而不是故障过程的原始状态。
解决:在故障事件窗口上做裁剪。取 fault_idx 前 20 ms 到 fault_idx 后 40 ms 作为分析窗口,而不是取跳闸信号之后的全部数据。同时把保护动作报文按照 SOE 时间戳对齐到事件轴,如果动作信号时间和电气量特征时间差超过一个周波,对两个结论做优先级仲裁:电气量特征优先生成诊断结论,保护动作报文作为核对项,两者一致才提升可信度,不一致时输出提示信息。
6. 用故障回放把平台从样本验证推到在线调试
平台开发完成后,验证环节我强烈建议用故障回放的方式做闭环。具体做法是:抽取一条有完整录波的历史故障,把 COMTRADE 文件和对应的 SCADA 断面、PMU 帧一起输入到平台的融合引擎和诊断服务,检查输出的事件类型、故障相别、测距区间和严重度分数是否与调度端结论一致。这个步骤可以手动逐条做,也可以写成下面的回放脚本自动跑。
# 回放脚本核心流程(假设数据已从存储导出为 parquet) python engine.py --input ./events/fault_20250601_100002.parquet \ --scada-uri postgres://localhost/scada \ --pmu-uri clickhouse://localhost/pmu \ --config ./configs/station_A.yaml \ --output ./reports/fault_20250601_result.json回放不是只跑一条就算过。我通常至少做三类场景验证:瞬时性故障、永久性故障和高阻接地故障。瞬时性故障主要看平台能不能在重合闸之前给出完整诊断;永久性故障要看平台能不能稳定输出故障性质供后续检修参考;高阻接地故障重点看低阈值判据的灵敏度设置是否合理。
调试中最麻烦的是「现场采集到的数据质量比样本库差」这件事。工厂里拿样本测试时,数据是干净的、录波是完整的、时标是准的;到现场接入真实链路后,丢帧、乱序、时标跳变几乎到处都是。这也是我做这个平台后的一个固定教训:一定要先花时间写数据质量校验模块,再让诊断服务消费数据,数据质量不过关的直接进待清洗队列,宁可不诊断也不能用脏数据硬算。
还有一个容易被忽略的细节:平台输出的故障报告要留一份「原始数据快照」的存档,包括对齐前后时间轴的偏差量、对齐用的参数版本和算法版本。这样后面结果出问题,可以回到当时的输入做复现,而不是面对一个黑匣子干瞪眼。做平台越往后越会发现,真正决定诊断可信度的,不是某个算法多聪明,而是数据链路是否扎实。把对齐、校验、回放这三件事做扎实,平台才值得让一线人员信任它输出的每一个结论。希望这些经验能帮你在同样的方向上少走两步弯路。
本文还有配套的精品资源,点击获取