简介:这是一份面向电力系统分析场景的相序处理与相分量、序分量变换 MATLAB 脚本资源,适用于电气工程专业学生、科研人员及继电保护相关工程师,可帮助快速掌握正序、负序、零序分量的提取与计算。压缩包内仅含 1 个 m 文件,整体大小约 3KB,属于轻量级工具代码,可通过傅里叶变换或对称分量法对三相数据进行运算并输出各序分量结果,脚本结构简洁,便于阅读和二次修改。该资源已在平台积累 644 人次浏览学习,说明其在课程设计、故障分析与保护原理验证中具有一定参考价值。借助这份脚本,读者可以直接运行并验证相序变换流程,结合 PSCAD 或 Simulink 的仿真场景,深化对不对称故障、接地故障序分量特征的理解;也可将其作为电力系统分析工具的基础模板,用于教学演示或算法移植。
1. 相序处理是什么:三相信号到序分量的第一性原理
做电力系统故障分析或者继电保护调试的人,迟早都要跟相序处理打交道。相序处理的核心,就是把实测得到的A、B、C三相电压或电流(相分量),通过一个线性变换拆成三组工程上更好用的对称分量:零序、正序、负序。这个变换不是学术炫技,而是继电保护定值、故障测距、电能质量评估里的基础操作。比如母线电压不平衡度计算、负序过流保护、零序方向保护,背后全是这套数学。我最早接手故障录波分析时,以为“把三相波形画出来就能看出来问题”,后来才发现不经过相序变换,很多故障特征根本无从谈起——单相接地时三相电压幅值变化不大,但零序和负序分量的大小、相位组合能直接告诉你是哪一相、什么类型。这篇文章,就按我实际做过的方案讲清楚变换的数学来源、可复现的代码实现、参数选择边界,以及几个让我翻过车的地方。
2. 相分量与序分量的数学变换:从ABC到120的矩阵推导
2.1 为什么引入序分量:三相对称性被破坏后的工程语言
对称的电力系统里,三相电压或电流幅值相等,相位互差120°,这时分析起来很简单——看一相就够了。但发生短路、断线、负荷不平衡或者系统谐振时,三相不再对称。直接拿三相瞬时波形去分析,既看不出故障位置,也无法区分“这是过负荷还是接地”、“这是相间故障还是两相对地”。对称分量法的思路,是把任意一组不对称的三相相量,强行拆成三组各自对称的分量:
- 正序分量:三相幅值相等,相序为A-B-C,即A相超前B相120°,B相超前C相120°,旋转方向与系统正常运行方向一致。
- 负序分量:三相幅值相等,但相序为A-C-B,即A相超前C相120°。它只出现在不对称工况下。
- 零序分量:三相同幅值、同相位,相当于在三根导线上叠加了一个共同的中性点位移电压或零序电流。
用这套语言,任何三相不对称量都能拆成“对称的部分 + 不对称的偏差”,保护逻辑就能从中提取特征量。比如负序分量专门用来反映相间不对称,零序分量专门用来反映接地故障,正序分量则反映系统主能量。
2.2 Fortescue变换矩阵:正序、负序、零序的定义与旋转算子
对称分量变换最核心的数学依据是Fortescue原理,也就是用复数算子 a 表示“落后/超前120°”。定义:
[ a = e^{j\frac{2\pi}{3}} = \cos 120^\circ + j \sin 120^\circ = -0.5 + j0.866 ]
那么 a² 就表示旋转240°,a³ 表示旋转360°,回到原位。对于任意三相相量 ( \dot{F}_A, \dot{F}_B, \dot{F}_C ),序分量 ( \dot{F}_0, \dot{F}_1, \dot{F}_2 )(分别对应零序、正序、负序)按下式计算:
[ \begin{bmatrix} \dot{F}_0 \ \dot{F}_1 \ \dot{F}_2 \end{bmatrix} = \frac{1}{3} \begin{bmatrix} 1 & 1 & 1 \ 1 & a & a^2 \ 1 & a^2 & a \end{bmatrix} \begin{bmatrix} \dot{F}_A \ \dot{F}_B \ \dot{F}_C \end{bmatrix} ]
这里的关键是系数矩阵每行的相位关系。第二行是 A 相不动,B 相滞后得到正序;第三行是 B 相超前得到负序。不同的教材可能把负序写在第二行、正序写在第三行,但只要逆变换一致,工程上都能用。我个人习惯用“0、1、2”顺序,因为大多数保护装置的定值菜单也是这么排列的。
2.3 逆变换与功率不变原则:从序分量还原相分量
从序分量回到相分量,就是逆变换:
[ \begin{bmatrix} \dot{F}_A \ \dot{F}_B \ \dot{F}_C \end{bmatrix}
\begin{bmatrix} 1 & 1 & 1 \ 1 & a^2 & a \ 1 & a & a^2 \end{bmatrix} \begin{bmatrix} \dot{F}_0 \ \dot{F}_1 \ \dot{F}_2 \end{bmatrix} ]
注意逆矩阵的系数不是1/3,因为正变换已经除过了。如果你直接用原矩阵乘以序分量,会得到放大了3倍的相分量,这是我见到的第一个高频错误。
还有一件很多人会忽略的事:上面的变换是“幅值不变”形式,它不保证变换后的功率等于三相总功率。换句话说,用这个矩阵算出来的序分量幅值与相分量幅值相等,但序分量各自对应的功率之和并不等于三相总功率。如果要做功率分析或能量计算,需要用“功率不变”形式的变换矩阵,其系数是 ( \sqrt{2/3} ) 而不是 ( 1/3 )。大多数继电保护应用采用幅值不变形式,因为保护关心的是相量和幅值;但电能质量仪和功率测量装置通常采用功率不变形式。选哪一种,决定了你后续计算负序不平衡度时需不需要乘系数。
3. 用Python实现相序变换:最小可运行代码与参数调校
3.1 采集三相工频相量:从瞬时值到相量的FFT提取
实际现场拿到的数据往往是采样点序列,不是复数相量。所以相序变换的第一步,是先对每一相电压或电流做工频相量提取。比如用离散傅里叶变换(DFT)或者短时傅里叶变换(STFT)在工频频率点上的投影。我一般会用单频DFT,也就是余弦和正弦相关法,这样计算量小,对单一工频分量提取效果足够。采样率选128点/周期,也就是50Hz系统用6400Hz采样率,既兼顾了高次谐波分析,又不会让数据量失控。
import numpy as np def phasor_from_samples(samples, fs, f0=50.0): """从一相采样序列提取工频相量(复数形式) samples: 一相电压/电流采样值序列 fs: 采样率 Hz, f0: 工频 Hz 返回: 复数相量,幅值为真有效值(RMS) """ n = len(samples) t = np.arange(n) / fs # 余弦和正弦参考波形 cos_w = np.cos(2 * np.pi * f0 * t) # 注意:正弦参考取负,对应 sin(-ωt),使相位为滞后的正弦相量 sin_w = -np.sin(2 * np.pi * f0 * t) real = 2.0 / n * np.dot(samples, cos_w) imag = 2.0 / n * np.dot(samples, sin_w) return np.complex128(real + 1j * imag)这段代码里,最关键的是正弦参考波取了负号。如果取正号,得到的相位定义会变成“余弦相位”而不是“正弦相位”。工程上电网相量通常定义为 ( X(t) = \sqrt{2} |X| \sin(\omega t + \theta) ),其中 ( \theta ) 相对于过零点。我的习惯是统一用正弦基准,这样后续跟保护装置里的相量基准才能对上。如果混合使用,相位差会固定偏移90°,负序分量就会算错。
数据窗长度也很有讲究。最少需要一个完整工频周期,算法才能正确提取基波。实际做录波分析时,我会取3到5个周期平均,这样能压制噪声和非周期分量。但注意窗长不能太长,否则会平滑掉故障暂态过程中幅值相位的快速变化,负序保护的启动判据就变得迟钝。
3.2 核心变换函数:输入ABC复数数组输出序分量幅值相位
有了三相的工频相量后,就可以直接套变换矩阵。下面这个函数接受三个复数相量,返回零序、正序、负序的复数结果,并同时给出幅值和相位。
def sym_components_from_phasors(Fa, Fb, Fc): """将三相相量变换为序分量 Fa, Fb, Fc: 复数相量(A相、B相、C相) 返回: dict, 包含 'zero', 'positive', 'negative' 每个元素是 (幅值RMS, 相位角度°) """ a = np.exp(2j * np.pi / 3) # 旋转120° T = np.array([ [1, 1, 1], [1, a, a*a], [1, a*a, a] ]) / 3.0 F = np.array([Fa, Fb, Fc]) comp = T @ F def mag_phase(c): return abs(c), np.degrees(np.angle(c)) return { 'zero': mag_phase(comp[0]), 'positive': mag_phase(comp[1]), 'negative': mag_phase(comp[2]) }逻辑说明:矩阵 T 就是上一章的正变换矩阵,除以3放在矩阵里乘以电压或电流相量。结果 comp[0] 是零序,comp[1] 是正序,comp[2] 是负序。这里假设输入的 Fa, Fb, Fc 已经是RMS相量,输出幅值也是RMS值。如果输入的是峰值,则输出也是峰值,两者需要保持一致。我在这上面栽过跟头:录波文件里有些通道是峰值,有些是RMS,混着用导致负序幅值算出来偏大。
参数说明:a 的精度由 np.exp(2j * np.pi / 3) 保证,64位复数浮点,完全足够。关键参数是“输入相量的相位基准”,必须确认A相零度定义在哪里。有的装置以A相电压过零点为0°,有的以采样起始时刻为0°,若不做对齐,计算出的负序相位会整体偏转,导致选相逻辑误判。
3.3 参数调校:采样率、数据窗长度与相位基准
采样率建议不低于每周期64点,我常用128点。过低会带来基波相量提取误差,尤其在存在谐波时;过高则占用内存,且对同步要求更严格。数据窗长度,稳态分析取3个周期,故障暂态分析取1个周期或更短。如果做的是实时保护算法,窗长压缩到半周期也是常见做法,但此时提取出的相量并非严格稳态,需要配合补偿算法。
相位基准是最大的“隐性参数”。标准做法是,以A相电压的工频相位作为全局参考零点。如果你拿到的数据本身带有绝对时标,那直接按采样时刻构造时间轴即可。如果数据来自多个录波装置,则必须先做GPS对时校验,否则各相之间哪怕差0.1毫秒,负序相位就可能偏移十几度,足以让方向元件误动。我一般会在计算前打印三相原始相量,先人工检查一下是否为标准的“A超前B 120°、B超前C 120°”顺序,如果不满足,首先怀疑采样同步问题,而不是急着调算法。
4. 工程落地:继电保护与故障分析中的序分量应用
4.1 负序分量在不对称故障检测中的定值逻辑
负序分量最经典的应用就是负序过流保护和负序方向保护。以负序过流保护为例,整定值通常用负序电流与正序电流的比值,或者用负序电流绝对值。当前主流微机保护内部计算序分量时,用的就是Fortescue变换,只是实现上常采用数字滤波器直接输出负序分量,避免逐点做复数矩阵运算。实际整定时,负序过流一段定值要躲过正常运行时系统允许的最大不平衡电流。这个不平衡电流来自负荷不对称、三相电流互感器误差、变压器励磁涌流等,一般取额定电流的5%到10%。我见过由于CT二次回路接错导致负序电流长期大于定值,保护频繁发信的场景,后来用相序变换单独分析三相电流相位,发现B相极性接反,换算成负序后幅值达到额定值的30%,替换接线后恢复正常。
负序分量的相位还能用于故障方向判断。例如在双电源系统中,负序功率方向指向故障点。计算负序电压和负序电流之间的夹角,如果角度落在动作区,方向元件就判断为正方向故障。这要求对相量提取和相位基准的精度要求极高,任何固定的相位偏移都会导致方向误判。因此,在保护装置的调试中用继电保护测试仪模拟各类故障时,测试仪输出的故障分量必须严格按对称分量原理构造——输出电压/电流先合成序分量,再逆变换生成三相量,才能保证保护装置计算出的相位与预设值一致。
4.2 零序分量与接地故障:三次谐波与零序电流方向
零序分量的大小直接反映接地故障的严重程度。在小电流接地系统中,单相接地时零序电压约为相电压的√3倍(取决于中性点接地方式),零序电流则取决于系统对地电容。做故障选线时,通常比较各线路零序电流的幅值和相位,故障线路的零序电流相位与非故障线路相反。这需要正确处理零序电流的极性,也就是TA极性端子的接线方向。现场常见的坑是:三相CT二次绕组首尾端接反,导致零序电流变成3I0,但极性反向,造成选线错误。
还有一点:零序分量并非只在接地故障时出现。三相电流不平衡本身就会产生零序分量,特别是在三相四线制系统里,零序电流流经中性线。此外,非线性负荷产生的三次谐波虽然属于零序性质,但频率是150Hz,不是工频零序。很多电能质量监测仪把工频零序分量和三次谐波都归在“零序”类别里,做保护判定时必须用窄带滤波把工频零序提取出来,否则会误以为存在接地故障。
4.3 相序错误检测:负序电压的相位特征
相序处理还能用来判断三相电源的相序是否正确,也就是常说的“相序保护”。当一个电动机或电子设备的供电相序接反时,电机反转,设备可能损坏。利用序分量变换,只需要测量三相电压,计算负序分量的相位。正常相序下,负序电压几乎为零(不考虑不平衡),一旦任意两相对调,负序电压会陡然增大,且负序电压相对于正序电压的相位关系会呈现一个固定的角度差。通过这个角度,还能反推出是A、B交换还是B、C交换。我做过一台ATS切换开关的逻辑校验,现场用相序表测是对的吗?其实相序表只能告诉你是正相序还是逆相序,不能精确到哪两项互换。而用录波器采三相电压波形,做一次序分量计算,就能从负序分量相位差120°还是240°直接判断出是哪一组互换。
5. 相序变换的避坑与排查:相位基准、幅值标幺和零序陷阱
5.1 相位基准默认以A相为0°,不同数据源的对齐方式
现象:两台录波器分别记录同一母线电压,各自计算出的负序相位差了60°以上,导致方向保护判据无法统一。
原因:一台录波器以A相电压过零点作为基准,另一台以采样文件起始时刻作为0°;或者两台装置内部分别采用正弦和余弦基准定义相位。两种基准之间不是纯线性偏移,因为3/2矩阵对相位偏移敏感。
解决:统一在算法层把三相相量的相位归一到“A相工频相位为0°”的坐标系。具体做法是:先提取A相相位θA,然后构造复数相量 Fa' = Fa * exp(-jθA),Fb' = Fb * exp(-jθA),Fc' = Fc * exp(-jθA),再送入变换矩阵。这样可以消除所有通道间固定的相位偏移,只保留相对相位关系。
5.2 零序分量是3I0还是I0:位置和系数双重坑
现象:用公式计算零序分量得到幅值很大,与实测零序TA测量值对不上。
原因:很多教材在零序电流定义时,把“三相电流之和除以3”称为零序电流,即 I0 = (Ia+Ib+Ic)/3。而保护装置中的零序电流通常来自零序CT,其测量的是3I0 = Ia+Ib+Ic。如果直接拿零序CT的采样值除以3再送入变换,跟用Ia、Ib、Ic计算出的零序分量相比,会出现系数差3倍。另外,如果逆变换矩阵忘了乘系数,也会把零序放大。
解决:明确你的相分量是“相电流”还是“3I0合成量”。在变换代码里,输入必须是分别的A、B、C三相电流,零序分量才是标准的I0。如果数据源只有零序电流通道(3I0),则先除以3再参与变换,或者直接把它当作3U0,在输出解释时标注清楚。
5.3 用瞬时值做变换导致的虚假负序
现象:直接拿三相电压的每点瞬时采样值套用3x3矩阵,输出一个随时间旋转的负序矢量,幅值忽大忽小,无法用于定值判断。
原因:对称分量变换针对的是工频相量(复数),不是瞬时值。瞬时值做变换得到的是“瞬时对称分量”,只有在理想对称正弦条件下才与稳态相量相等。实际波形含有谐波、衰减直流分量、噪声,瞬时变换结果中会混入大量其他频率成分。
解决:先用DFT或窄带滤波器提取每相工频相量,再做序变换。如果是在线实时算法,使用带通滤波器组或卡尔曼滤波跟踪基波,而不是直接对原始采样点做矩阵乘法。这是我调过最多次的“玄学”问题,最终都归结为两个步骤:先相量提取,再序变换。
5.4 采样不同步引发的相位漂移
现象:变压器差动保护中的制动电流计算出现虚假负序,导致保护在穿越性故障时误动。
原因:变压器两侧电流互感器的采样通道可能由不同采集卡完成,通道间存在几微秒到几十微秒的恒定延迟。对于50Hz系统,1ms对应18°相位差。如果两侧通道没有统一的时间基准(比如采用插值重采样对齐),负序分量会凭空产生。
解决:在做多通道相序变换前,先对所有通道做时间标定。最简单的方法是利用已知的稳态三相正弦信号,计算各通道相对A相的相位差并补偿。对于跨越站点的数据,使用IEEE 1588对时或GPS/北斗脉冲对时,确保全局采样时钟一致。我在离线分析中,通常使用插值方法把所有通道重采样到同一个时间网格,然后再做DFT。
5.5 矩阵系数忘记除3或乘以√2
现象:同样一组数据,自己写的Python算出的负序幅值比保护装置显示的大约3倍或√2倍。
原因:一是变换矩阵没有除以3,直接用伴随矩阵做了正变换;二是输入的是峰值相量而装置显示的是RMS值,或者相反。这两种情况在代码迭代中非常容易混入。
解决:写一个简单的自测用例——输入三相完全对称的正序量,如 Fa=100、Fb=100e^{-j120°}、Fc=100e^{j120°},正确结果应该只有正序分量,幅值100,零序负序为0。然后用这个用例做回归测试,每次修改矩阵系数后跑一遍。养成这个习惯后,再也不会被系数问题坑到。
6. 进阶技巧:用序分量快速判别故障类型与选相
6.1 通过零序和负序的“有/无”表锁定故障类别
故障类型的判定不需要看完整波形,只需要看故障稳态阶段序分量的有无和相位关系。四类常见短路的序分量特征可以浓缩成一张表:
| 故障类型 | 正序 | 负序 | 零序 | 典型相位关系 |
|---|---|---|---|---|
| 三相短路 | 有 | 无 | 无 | 三相完全对称 |
| 两相短路 | 有 | 有 | 无 | 负序相位与故障相相关 |
| 单相接地 | 有 | 有 | 有 | 零序与负序幅值接近,相位关系固定 |
| 两相接地 | 有 | 有 | 有 | 负序与零序相位关系区别于单相接地 |
利用这个表,我写过一个小工具,在故障录波中自动区分故障类别。做法是:取故障后2到3个周波的采样数据,计算三相电压/电流的序分量,然后按幅值阈值判断“有无”。具体阈值按照额定值的5%来定,低于阈值视为无。然后进一步用负序电压和零序电压的比值区分单相接地和两相接地。实际项目中,这个方法对大多数金属性短路准确率很高,但对经过弧光电阻或过渡电阻的故障,零序幅值会压低,容易漏判。这时我通常再结合故障相电压突变量做二次确认。
6.2 利用负序相位做选相:一套可验证的手工计算
选相是距离保护和自动重合闸的逻辑基础。用序分量选相的核心是看负序电压/电流的相位与A相基准的夹角。例如单相接地故障,如果故障相是A相,则负序电流相位与正序电流反相;如果是B相故障,负序电流相位滞后又前移特定角度。我做过一个离线计算器,输入三相电流相量,程序输出“故障相为A/B/C”的判定。校验方法是手工算一遍:设A相接地,设故障电流在A相,按对称分量法算出正序、负序、零序电流,再验证程序输出。这一招能快速排查程序里的相位旋转方向是否定义反了。
用序分量做选相时,注意区分“电流选相”和“电压选相”。电流选相受负荷电流和系统阻抗影响较小,适合近区故障;电压选相则对双侧电源系统更可靠。保险起见,两者同时计算,结论一致才动作。
我个人的习惯是,每次写完相序变换代码,先跑一遍“理想正序输入”和“已知故障相输入”两个测试用例,确认没跑偏,再用于现场数据分析。这个习惯救过我很多次。相序处理说到底就是线性代数和信号处理的结合,公式不难,难的是在真实数据面前保持相位基准、幅值定义和采样同步这三个变量都不出错。希望这篇笔记能帮你少走几个弯路。
本文还有配套的精品资源,点击获取