电力系统故障分析课程设计报告
一、概论:
电力系统故障分析课程设计是“电力系统故障分析”课程的实践性教学环节,具有很强的实践性和现实意义。通过这次的课程设计可以使我们对用计算机计算电力系统故障的原理和过程有更为清晰和深刻的理解,同时进一步掌握电力系统故障计算的基本知识和方法,提高动手编制计算程序的能力,为今后进行电力系统故障计算打下初步的基础。而随着计算机技术在电力系统中应用的日益普及,这次的实践对自己在日后的工作和学习中运用计算机解决实际问题有很大的帮助。
经过约一周时间的编程和调试,在指导老师和同学的帮助下,编制出了电力系统短路故障计算程序,完成了课程设计指定的各项基本要求任务。
二、任务:
1、 对于给定的系统接线图,按照要求手工计算出各种简单故障的电气量值;
2、 用C语言或相关的语言编制一个电力系统短路故障的计算程序并上机调试,要求该程序能处理各种简单的故障,并将计算结果以文件形式输出。
三、任务设计阶段:
(一) 计算的假设
1、 不计各元件的电阻,即R=0;
2、 各元件的正序和负序电抗相等,即X1=X2;
3、 不计线路电容电流的影响;
4、 计算简单短路故障时,各发电机电势的标幺值均为E=j1。
5、 各种短路均为金属性短路,纵向不对称故障指一相断相和两相断相;
6、 故障形式取A相为特殊相,故障计算以A相为基准相。
(二) 准备工作
1、 始数据计算
根据给定的系统原始数据计算系统各元件的标幺值参数,取。
(1)发电机参数
①计算公式:X = X
②计算结果
(2)变压器
①计算公式:X=, (i,j,k,=1,2,3)
②计算结果:
(3) 线路
① 计算公式: , , ,
② 计算结果:
(4)系统
系统Ⅰ:X1=0.36 X0=0.87
系统Ⅱ:X1=0.38 X0=0.51
2、序网络的制定
根据上面的基本数据可以制定出系统的正序、负序、零序网络图。由假设2可知,正、负序网络相同,故在此只需制定正、零序网络。网络如下所示:
说明:正序网络中电源支路的等效电抗为发电机电抗与变压器电抗之和,系统Ⅰ、Ⅱ均处理
为发电机模型。
(三)、手工计算系统故障时各电气量
为了便于验证程序运行的正确性,在编制程序之前先对系统进行手工的故障计算,确定故障时系统的各个电气量。其大体步骤是:化简序网络,计算出各个序网的电流分布系数,计算特定故障点的正、零序综合电抗并由此确定故障点的短路电流,利用分布系数求出各支路电流,计算各节点电压。
1、化简序网络
对系统网络进行“星-三角”变换,得下图:
2、计算电流分支系数
在特定故障点加入单位电流,求出各支路电流,该电流即为支路的电流分支系数。而原网络三角形回路的支路电流可由星形支路电流求得,其关系如下:
现将计算结果列表如下:
3、计算故障点综合阻抗
母线C:
4、计算故障口电流
各种类型的故障口基准相正序电流计算公式如下:
而基准相的负、零序电流与正序电流又存在如下关系:
据此可求出各类故障的故障口基准相序电流:
5、利用分支系数求解各线路的序电流
相电流计算 Ia=Ia1+Ia2+Ia3; Ib= a²Ia1+aIa2+Ia3;Ic= aIa1+²Ia2+Ia3
6、节点电压的计算(计算A母线即节点1的电压)
计算各相电压:Ua=Ua1+Ua2+Ua3;Ub= a²Ua1+aUa2+Ua3; Uc= aUa1+ a²Ua2+Ua3
(四)故障计算程序的编制
1、 数学模型的选择
电力系统网络的数学建模主要有节点阻抗方程和节点导纳方程两种,节点导纳方程与节点阻抗方程相比较,Y阵稀疏,占用内存少,Z阵为满阵,占用内存多;Y阵形成容易,速度块,Z阵形成较难,速度也慢。然而,在电力系统故障计算中,节点的注入电流通常为已知量,用节点阻抗方程进行故障计算比较直观,解算简单且物理意义明确。因此,选用节点阻抗方程法计算故障系统的电气量值,而节点阻抗矩阵的形成采用Y阵求逆法。
2、 程序设计的总体思想
系统的原始数据以文件的形式输入,程序根据这些信息形成导纳矩阵,再对之求逆形成阻抗矩阵,由阻抗矩阵求得故障口三序电流,进而求得各节点的三序电压,并由之求得各支路三序电流,最后将序分量合成相分量,完成一个完整的故障电气量计算。
程序流程图(见附录1)。
3、 程序的主要功能
(1) 形成网络的节点导纳矩阵和节点阻抗矩阵;
(2) 可以计算各种短路故障:
A) 故障口的序电流和相电流;
B) 网络中各支路的序电流
C) 网络中各节点的序电压和相电压。
(3) 能够以文件的形式清楚地输出计算结果。
4、 程序使用说明
本程序使用简单,只需按规定格式输入电力系统的网络信息到一个名为“in.txt”的文本文件,再运行可执行文件后按屏幕提示输入即可。运行结果保存在指定的文件里,打开它便可查看计算结果。
5、 运行结果分析
经核对,程序的运行结果与指导书和手算结果基本一致,故本程序能正确地实现故障计算的功能。手算过程与计算机计算过程之间的差别在于所选取的计算模型不同,手算的关键在于正确地化简网络,求得网络的电流分支系数和故障点综合阻抗;而计算机则是以线性方程组作为计算模型,它的关键是要形成一个正确的阻抗矩阵与及能正确求解线性方程组。解算过程虽不一样但结果是基本吻合的。
四、总结、体会、建议:
通过这次电力系统故障分析课程设计我加深了对电力系统故障分析课程的基本原理和知识的理解。检验和锻炼自己综合运用知识的能力。经过了这一次的课程设计,我已经初步掌握了如何利用计算机求解电力系统的潮流分布和故障状态下的各个电气量的方法和技巧,具备了一定的编制、调试计算程序的能力。掌握这些能里又为我今后的学习和分析解决电力系统问题时提供帮助。
这次课程设计已达到了设计任务的基本要求,但就程序本身来说还是存在许多不足之处的。首先,故障计算是在作了很多简化处理的假设基础上进行的,因此其计算结果的准确性是不够的;其次,处理的故障类型仅限于简单的短路计算,还不具备处理断相及复合故障的能力;再次,计算结果只反映出电气量的模值和它们之间的相对相位关系,没有给出各电气量的相角;最后就是该计算没有考虑故障时的过渡过程。还有c语言的应用上还有不足。这些问题都有待日后的不断完善。
总之,在这次实践中我获益非浅,在老师的指导下,深刻的了解了故障上机分析的步骤和方法,有了一定的时间能力。
附录 1 开 始
数组、变量的定义
从文件输入原始数据
形成正、零序网的导纳矩阵,并输出
对导纳矩阵求逆形成阻抗矩阵,并输出
计算各节点电压的正常分量,并输出
故障类型FType
FType=1 FType=2 FType=3 FType=4
K(3)故障 K(1)故障 K(2)故障 K(1,1)故障
各节点序电压
各节点序电流
各电气量的相量
输出计算结果 结 束
附录 2 短 路 计 算 程 序 的 源 程 序 清 单
#include <math.h>
#include <stdio.h>
#define N1 5 /*正序结点数*/
#define M1 9 /*正序支路数*/
#define N0 5 /*零序结点数*/
#define M0 9 /*零序支路数*/
float SR[3][3],SI[3][3]; /*算子矩阵*/
FILE *rf,*wf; /*输入,输出文件指针*/
main()
{
void prog1();
void prog2();
void prog3();
void prog4();
void prog5();
float Y1[N1][N1],Y0[N0][N0],Z1[N1][N1],Z0[N0][N0]; /*结点导纳,阻抗矩阵*/
float I0[N1]; /*结点注入电流正常分量*/
float UN[N1][3],U[N1][3],IL[M1][3],I[M1][3]; /*结点序相电压,支路序相电流*/
float UP1,ZP1,ZP2,ZP0,IF[3],IFX[3]; /*故障口电压,口阻抗,口电流*/
float z1[M1],z0[M0]; /*正,零序支路阻抗*/
int n11[M1],n12[M1],n01[M0],n02[M0],zl1[M1],zl0[M0]; /*支路相关结点,支路编号*/
int i,j,t,p; /*控制循环变量*/
int kp,sign; /*故障类型,故障结点*/
int n1,m1,n0,m0; /*正零序结点数支路数*/
rf=fopen("d:\in.txt","r"); /*打开文件*/
wf=fopen("d:\out.txt","w");
if(rf==NULL)
{
fprintf(wf,"不能打开文件!");
return;
}
fscanf(rf,"%d%d",&n0,&m0); /*读入数据*/
fscanf(rf,"%d%d",&n1,&m1);
fscanf(rf,"%d%d",&kp,&sign);
for(i=0;i<m0;i++)
fscanf(rf,"%d%d%d%f",&zl0[i],&n01[i],&n02[i],&z0[i]);
for(i=0;i<m1;i++)
fscanf(rf,"%d%d%d%f",&zl1[i],&n11[i],&n12[i],&z1[i]);
for(i=0;i<3;i++)
for(j=0;j<3;j++)
fscanf(rf,"%f%f",&SR[i][j],&SI[i][j]);
for(i=0;i<n1;i++)
fscanf(rf,"%f",&I0[i]);
prog1(Y1,z1,n11,n12,n1,m1); /*形成正序结点导纳矩阵*/
prog1(Y0,z0,n01,n02,n0,m0); /*形成零序结点导纳矩阵*/
prog2(Y1,Z1,n1); /*形成正序结点阻抗矩阵*/
prog2(Y0,Z0,n0); /*形成零序结点阻抗矩阵*/
UP1=0; /*形成口电压,口阻抗*/
for(i=0;i<n1;i++)
UP1+=Z1[sign-1][i]*I0[i];
ZP1=ZP2=Z1[sign-1][sign-1];
ZP0=Z0[sign-1][sign-1];
if(kp==1) /*形成口电流*/
{
IF[0]=-UP1/ZP1;
IF[1]=IF[2]=0;
}
else if(kp==2)
{
IF[0]=-UP1/(ZP2+ZP1);
IF[1]=-IF[0];
IF[2]=0;
}
else if(kp==3)
IF[0]=IF[1]=IF[2]=-UP1/(ZP2+ZP1+ZP0);
else if(kp==4)
{
IF[0]=-UP1/(ZP1+ZP1*ZP0/(ZP1+ZP0));
IF[1]=-(IF[0]*ZP0)/(ZP1+ZP0);
IF[2]=-(IF[0]*ZP1)/(ZP1+ZP0);
}
prog3(IF,IFX,1);
for(i=0;i<n1;i++) /*形成结点序电压*/
for(j=0;j<3;j++)
UN[i][j]=0;
for(i=0;i<n1;i++)
{
for(j=0;j<n1;j++)
UN[i][0]+=Z1[i][j]*I0[j];
UN[i][0]+=Z1[i][sign-1]*IF[0];
UN[i][1]=Z1[i][sign-1]*IF[1];
UN[i][2]=Z0[i][sign-1]*IF[2];
}
prog3(UN,U,n1);
for(i=0;i<m1;i++) /*形成支路序电流*/
{
t=n11[i];
p=n12[i];
if(t==0)
{IL[i][0]=UN[p-1][0]/z1[i]+I0[p-1];
IL[i][1]=UN[p-1][1]/z1[i];}
else if(p==0)
{IL[i][0]=-UN[t-1][0]/z1[i]+I0[t-1];
IL[i][1]=-UN[t-1][1]/z1[i];}
else {IL[i][0]=(UN[t-1][0]-UN[p-1][0])/z1[i];
IL[i][1]=(UN[t-1][1]-UN[p-1][1])/z1[i];}
}
for(i=0;i<m0;i++)
{
t=n01[i];
p=n02[i];
if(t==0)
IL[i][2]=UN[p-1][2]/z0[i];
else if(p==0)
IL[i][2]=-UN[t-1][2]/z0[i];
else IL[i][2]=(UN[t-1][2]-UN[p-1][2])/z0[i];
}
prog3(IL,I,m1);
fprintf(wf,"故障分析的计算结果为:\n"); /*输出计算结果*/
fprintf(wf,"零序网络的结点数,支路数分别为:%d %d\n",n0,m0);
fprintf(wf,"正序网络的结点数,支路数分别为:%d %d\n",n1,m1);
fprintf(wf,"正序结点导纳矩阵为:\n");
prog4(Y1,n1);
fprintf(wf,"正序结点阻抗矩阵为:\n");
prog4(Z1,n1);
fprintf(wf,"零序结点导纳矩阵为:\n");
prog4(Y0,n0);
fprintf(wf,"零序结点阻抗矩阵为:\n");
prog4(Z0,n0);
fprintf(wf,"故障类型为: ");
if(kp==1)
fprintf(wf,"k(3)\n");
else if(kp==2)
fprintf(wf,"k(2)\n");
else if(kp==3)
fprintf(wf,"k(1)\n");
else if(kp==4)
fprintf(wf,"k(1,1)\n");
fprintf(wf,"故障结点为:N=%d\n",sign);
fprintf(wf,"故障点的序(1,2,0),相(A,B,C)电流为:\n");
for(i=0;i<3;i++)
fprintf(wf,"%f ",IF[i]);
for(i=0;i<3;i++)
fprintf(wf,"%f ",IFX[i]);
fprintf(wf,"\n");
fprintf(wf,"各支路的序(1,2,0),相(A,B,C)电流为:\n");
prog5(IL,I,m1);
fprintf(wf,"各结点序(1,2,0),相电压(A,B,C)为:\n");
prog5(UN,U,n1);
}
void prog1(float Y[N1][N1],float z[M1],int n1[M1],int n2[M1],int n,int m) /*形成结点导纳矩阵*/
{
float y[M1];
int i,j,k;
for(i=0;i<n;i++)
for(j=0;j<n;j++)
Y[i][j]=0;
for(i=0;i<m;i++)
y[i]=1/z[i];
for(i=0;i<n;i++)
for(j=0;j<m;j++)
if(n1[j]==i+1||n2[j]==i+1)
Y[i][i]+=y[j];
for(i=0;i<n;i++)
for(j=0;j<n;j++)
for(k=0;k<m;k++)
if(i!=j&&((n1[k]==i+1&&n2[k]==j+1)||(n1[k]==j+1&&n2[k]==i+1)))
Y[i][j]=-y[k];
}
void prog2(float Y[][N1],float Z[][N1],int n) /*形成结点阻抗矩阵*/
{ /*三角分解法*/
float L[N1][N1],D[N1],I[N1],U[N1];
int i,j,k;
for(i=0;i<n;i++)
{
D[i]=Y[i][i];
for(j=0;j<i;j++)
L[i][j]=Y[i][j];
}
for(k=0;k<n;k++)
{
L[k][k]=1;
for(j=0;j<k;j++)
{
for(i=0;i<j;i++)
L[k][j]-=L[k][i]*D[i]*L[j][i];
L[k][j]/=D[j];
}
for(i=0;i<k;i++)
D[k]-=L[k][i]*L[k][i]*D[i];
}
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
I[j]=U[j]=0;
I[i]=1;
for(k=0;k<n;k++)
{
for(j=0;j<k;j++)
U[k]+=L[k][j]*U[j];
U[k]=I[k]-U[k];
}
for(k=0;k<n;k++)
U[k]/=D[k];
for(k=n-1;k>=0;k--)
for(j=k+1;j<n;j++)
U[k]-=L[j][k]*U[j];
for(k=0;k<n;k++)
Z[k][i]=U[k];
}
}
void prog3(float A[][3],float B[][3],int n) /*由序分量形成相分量*/
{
float R[M1][3],I[M1][3];
int i,j,k;
for(i=0;i<n;i++)
for(j=0;j<3;j++)
R[i][j]=I[i][j]=0;
for(i=0;i<n;i++)
for(j=0;j<3;j++)
{
for(k=0;k<3;k++)
{
R[i][j]+=SR[j][k]*A[i][k];
I[i][j]+=SI[j][k]*A[i][k];
}
B[i][j]=R[i][j]*R[i][j]+I[i][j]*I[i][j];
B[i][j]=sqrt(B[i][j]);
}
}
void prog4(float Y[][N1],int n) /*输出矩阵*/
{
int i,j;
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
fprintf(wf,"%f ",Y[i][j]);
fprintf(wf,"\n");
}
}
void prog5(float A[][3],float B[][3],int n) /*输出矩阵*/
{
int i,j;
for(i=0;i<n;i++)
{
fprintf(wf,"%d ",i+1);
for(j=0;j<3;j++)
fprintf(wf,"%f ",A[i][j]);
for(j=0;j<3;j++)
fprintf(wf,"%f ",B[i][j]);
fprintf(wf,"\n");
}
}