Dlgfault.m
上传用户:eighthdate
上传日期:2014-05-24
资源大小:270k
文件大小:5k
源码类别:

其他行业

开发平台:

Matlab

  1. % The program dlgfault is designed for the double line-to-ground
  2. % fault analysis of a power system network. The program requires
  3. % the positive-, negative- or zero-sequence bus impedance matrices,
  4. % Zbus1 Zbus2,and Zbus0. The bus impedances matrices may be defined
  5. % by the user, obtained by the inversion of Ybus or it may be
  6. % determined either from the function Zbus = zbuild(zdata)
  7. % or the function Zbus = zbuildpi(linedata, gendata, yload).
  8. % The program prompts the user to enter the faulted bus number
  9. % and the fault impedance Zf. The prefault bus voltages are
  10. % defined by the reserved Vector V. The array V may be defined or
  11. % it is returned from the power flow programs lfgauss, lfnewton,
  12. % decouple or perturb. If V does not exist the prefault bus voltages
  13. % are automatically set to 1.0 per unit. The program obtains the
  14. % total fault current, bus voltages and line currents during the fault.
  15. %
  16. % Copyright (C) 1998 Hadi Saadat
  17. function dlgfault(zdata0, Zbus0, zdata1, Zbus1, zdata2, Zbus2, V)
  18. if exist('zdata2') ~= 1
  19. zdata2=zdata1;
  20. else, end
  21. if exist('Zbus2') ~= 1
  22. Zbus2=Zbus1;
  23. else, end
  24. nl = zdata1(:,1); nr = zdata1(:,2);
  25. nl0 = zdata0(:,1); nr0 = zdata0(:,2);
  26. nbr=length(zdata1(:,1)); nbus = max(max(nl), max(nr));
  27. nbr0=length(zdata0(:,1));
  28. R0 = zdata0(:,3); X0 = zdata0(:,4);
  29. R1 = zdata1(:,3); X1 = zdata1(:,4);
  30. R2 = zdata2(:,3); X2 = zdata2(:,4);
  31. for k = 1:nbr0
  32.     if R0(k) == inf | X0(k) == inf
  33.     R0(k) = 99999999; X0(k) = 999999999;
  34.     else, end
  35. end
  36. ZB1 = R1 + j*X1;  ZB0 = R0 + j*X0;
  37. ZB2 = R2 + j*X2;
  38. if exist('V') == 1
  39.     if length(V) == nbus
  40.     V0 = V;
  41.     else, end
  42. else,  V0 = ones(nbus, 1) + j*zeros(nbus, 1);
  43. end
  44. fprintf('nDouble line-to-ground fault analysis n')
  45. ff = 999;
  46. while ff > 0
  47. nf = input('Enter Faulted Bus No. -> ');
  48. while nf <= 0 | nf > nbus
  49.      fprintf('Faulted bus No. must be between 1 & %g n', nbus)
  50.      nf = input('Enter Faulted Bus No. -> ');
  51.      end
  52. fprintf('nEnter Fault Impedance Zf = R + j*X in ')
  53. Zf = input('complex form (for bolted fault enter 0). Zf = ');
  54. fprintf('  n')
  55. fprintf('Double line-to-ground fault at bus No. %gn', nf)
  56. a =cos(2*pi/3)+j*sin(2*pi/3);
  57. sctm = [1   1   1; 1 a^2  a; 1 a  a^2];
  58. Z11 = Zbus2(nf, nf)*(Zbus0(nf, nf)+ 3*Zf)/(Zbus2(nf, nf)+Zbus0(nf, nf)+3*Zf);
  59. Ia1 = V0(nf)/(Zbus1(nf,nf)+Z11);
  60. Ia2 =-(V0(nf) - Zbus1(nf, nf)*Ia1)/Zbus2(nf,nf);
  61. Ia0 =-(V0(nf) - Zbus1(nf, nf)*Ia1)/(Zbus0(nf,nf)+3*Zf);
  62. I012=[Ia0; Ia1; Ia2];
  63. Ifabc = sctm*I012; Ifabcm=abs(Ifabc);
  64. Ift = Ifabc(2)+Ifabc(3);
  65. Iftm = abs(Ift);
  66. fprintf('Total fault current = %9.4f per unitnn', Iftm)
  67. fprintf('Bus Voltages during the fault in per unit nn')
  68. fprintf('     Bus    -------Voltage Magnitude-------  n')
  69. fprintf('     No.    Phase a     Phase b     Phase c  n')
  70. for n = 1:nbus
  71. Vf0(n)= 0 - Zbus0(n, nf)*Ia0;
  72. Vf1(n)= V0(n) - Zbus1(n, nf)*Ia1;
  73. Vf2(n)= 0 - Zbus2(n, nf)*Ia2;
  74. Vabc = sctm*[Vf0(n); Vf1(n); Vf2(n)];
  75. Va(n)=Vabc(1); Vb(n)=Vabc(2); Vc(n)=Vabc(3);
  76. fprintf(' %5g',n)
  77. fprintf(' %11.4f', abs(Va(n))),fprintf(' %11.4f', abs(Vb(n)))
  78. fprintf(' %11.4fn', abs(Vc(n)))
  79. end
  80. fprintf('  n')
  81. fprintf('Line currents for fault at bus No.  %gnn', nf)
  82. fprintf('     From      To      -----Line Current Magnitude----  n')
  83. fprintf('     Bus       Bus     Phase a     Phase b     Phase c  n')
  84. for n= 1:nbus
  85.    for I = 1:nbr
  86.       if nl(I) == n | nr(I) == n
  87.          if nl(I) ==n       k = nr(I);
  88.          elseif nr(I) == n  k = nl(I);
  89.          end
  90.             if k ~= 0
  91.             Ink1(n, k) = (Vf1(n) - Vf1(k))/ZB1(I);
  92.             Ink2(n, k) =  (Vf2(n) - Vf2(k))/ZB2(I);
  93.             else, end
  94.       else, end
  95.    end
  96.    for I = 1:nbr0
  97.       if nl0(I) == n | nr0(I) == n
  98.          if nl0(I) ==n       k = nr0(I);
  99.          elseif nr0(I) == n  k = nl0(I);
  100.          end
  101.             if k ~= 0
  102.             Ink0(n, k) =  (Vf0(n) - Vf0(k))/ZB0(I);
  103.             else, end
  104.       else, end
  105.    end
  106.    for I = 1:nbr
  107.       if nl(I) == n | nr(I) == n
  108.          if nl(I) ==n       k = nr(I);
  109.          elseif nr(I) == n  k = nl(I);
  110.          end
  111.             if k ~= 0
  112.             Inkabc = sctm*[Ink0(n, k); Ink1(n, k); Ink2(n, k)];
  113.             Inkabcm = abs(Inkabc); th=angle(Inkabc);
  114.                 if real(Inkabc(2)) < 0
  115.                 fprintf('%7g', n), fprintf('%10g', k),
  116.                 fprintf(' %11.4f', abs(Inkabc(1))),fprintf(' %11.4f', abs(Inkabc(2)))
  117.                 fprintf(' %11.4fn', abs(Inkabc(3)))
  118.                 elseif real(Inkabc(2)) ==0 & imag(Inkabc(2)) > 0
  119.                 fprintf('%7g', n), fprintf('%10g', k),
  120.                 fprintf(' %11.4f', abs(Inkabc(1))),fprintf(' %11.4f', abs(Inkabc(2)))
  121.                 fprintf(' %11.4fn', abs(Inkabc(3)))
  122.                 else, end
  123.              else, end
  124.       else, end
  125.    end
  126.    if n==nf
  127.    fprintf('%7g',n), fprintf('         F'),
  128.    fprintf(' %11.4f', Ifabcm(1)),fprintf(' %11.4f', Ifabcm(2))
  129.    fprintf(' %11.4fn', Ifabcm(3))
  130.    else, end
  131. end
  132. resp=0;
  133.    while strcmp(resp, 'n')~=1 & strcmp(resp, 'N')~=1 & strcmp(resp, 'y')~=1 & strcmp(resp, 'Y')~=1
  134.    resp = input('Another fault location? Enter ''y'' or ''n'' within single quote -> ');
  135.    if strcmp(resp, 'n')~=1 & strcmp(resp, 'N')~=1 & strcmp(resp, 'y')~=1 & strcmp(resp, 'Y')~=1
  136.    fprintf('n Incorrect reply, try again nn'), end
  137.    end
  138.    if resp == 'y' | resp == 'Y'
  139.    nf = 999;
  140.    else ff = 0; end
  141. end   % end for while