⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 fm_ssr.m

📁 这是一个很适合研究和学习用的电力系统仿真软件
💻 M
字号:
function fm_ssr(flag)
% FM_SSR Model of the synchronous machine with shaft dynamics and compensated line
%
% FM_SSR(FLAG)
%       FLAG = 0 initializations
%       FLAG = 1 algebraic equations
%       FLAG = 2 algebraic Jacobians
%       FLAG = 3 differential equations
%       FLAG = 4 state matrix
%       FLAG = 5 non-windup limits
%
%Author:    Federico Milano
%Date:      11-Nov-2002
%Version:   1.0.0
%
%E-mail:    fmilano@thunderbox.uwaterloo.ca
%Web-site:  http://thunderbox.uwaterloo.ca/~fmilano
%
% Copyright (C) 2002-2006 Federico Milano

global SSR DAE Bus Settings PV jay

id = DAE.x(SSR.Id);
iq = DAE.x(SSR.Iq);
If = DAE.x(SSR.If);
ed = DAE.x(SSR.Edc);
eq = DAE.x(SSR.Eqc);
w1 = DAE.x(SSR.omega_HP);
w2 = DAE.x(SSR.omega_IP);
w3 = DAE.x(SSR.omega_LP);
w4 = DAE.x(SSR.omega);
w5 = DAE.x(SSR.omega_EX);
t1 = DAE.x(SSR.delta_HP);
t2 = DAE.x(SSR.delta_IP);
t3 = DAE.x(SSR.delta_LP);
t4 = DAE.x(SSR.delta);
t5 = DAE.x(SSR.delta_EX);

xd  = SSR.con(:,5);
xq  = SSR.con(:,6);
xad = SSR.con(:,8);
xf  = SSR.con(:,13);

xl  = SSR.con(:,10);
xc  = SSR.con(:,11);
xeq = xad.*xad-xf.*(xd+xl);

rf  = SSR.con(:,12);
ra  = SSR.con(:,7);
r   = SSR.con(:,9);

D1 = SSR.con(:,19);
D2 = SSR.con(:,20);
D3 = SSR.con(:,21);
D4 = SSR.con(:,22);
D5 = SSR.con(:,23);

M1 = SSR.con(:,14);
M2 = SSR.con(:,15);
M3 = SSR.con(:,16);
M4 = SSR.con(:,17);
M5 = SSR.con(:,18);

k12 = SSR.con(:,24);
k23 = SSR.con(:,25);
k34 = SSR.con(:,26);
k45 = SSR.con(:,27);

Tm  = SSR.Tm;
Efd = SSR.Efd;
Wb = Settings.rad;

V = DAE.V(SSR.bus);
a = DAE.a(SSR.bus);
cdt = cos(t4-a);
sdt = sin(t4-a);

switch flag
 case 0 % initialization

  VV =  V.*exp(jay*a);
  S = Bus.Pg(SSR.bus) - jay*Bus.Qg(SSR.bus);
  I = S./conj(VV);
  delta = angle(VV + (ra+r + jay*(xq+xl-xc)).*I);
  cdt = cos(delta-a);
  sdt = sin(delta-a);
  Idq = I.*exp(-jay*(delta-pi/2));
  Id = real(Idq);
  Iq = imag(Idq);
  If = (xl.*Id+(ra+r).*Iq+xd.*Id-xc.*Id+V.*cdt)./xad;
  Te = (xq-xd).*Id.*Iq+xad.*If.*Iq;
  delta_LP = Te./k34+delta;
  delta_IP = ((k23+k34).*delta_LP-k34.*delta)./k23;
  delta_HP = ((k12+k23).*delta_IP-k23.*delta_LP)./k12;
  B = (ra+r).*Id-xl.*Iq-xq.*Iq+xc.*Iq+V.*sdt;

  SSR.Tm = k12.*delta_HP-k12.*delta_IP;
  SSR.Efd = xf.*B./rf + xad.*If;

  DAE.x(SSR.Id) = Id;
  DAE.x(SSR.Iq) = Iq;
  DAE.x(SSR.If) = If;

  DAE.x(SSR.omega_HP) = 1;
  DAE.x(SSR.omega_IP) = 1;
  DAE.x(SSR.omega_LP) = 1;
  DAE.x(SSR.omega) = 1;
  DAE.x(SSR.omega_EX) = 1;

  DAE.x(SSR.Eqc) = -xc.*Id;
  DAE.x(SSR.Edc) =  xc.*Iq;

  DAE.x(SSR.delta) = delta;
  DAE.x(SSR.delta_EX) = delta;
  DAE.x(SSR.delta_HP) = delta_HP;
  DAE.x(SSR.delta_IP) = delta_IP;
  DAE.x(SSR.delta_LP) = delta_LP;

  % find & delete static generators
  check = 1;
  for j = 1:SSR.n
    if ~fm_rmgen(SSR.bus(j)), check = 0; end
  end

  if ~check
    fm_disp('SSR models cannot be properly initialized.')
  else
    fm_disp('Initialization of SSR models completed.')
  end

 case 1 % algebraic equations

  DAE.gp = DAE.gp - sparse(SSR.bus,1,V.*sdt.*id+V.*cdt.*iq,Bus.n,1);
  DAE.gq = DAE.gq - sparse(SSR.bus,1,V.*cdt.*id-V.*sdt.*iq,Bus.n,1);

 case 2 % algebraic Jacobians

  DAE.J11 = DAE.J11 + sparse(SSR.bus,SSR.bus,V.*cdt.*id-V.*sdt.*iq,Bus.n,Bus.n);
  DAE.J12 = DAE.J12 - sparse(SSR.bus,SSR.bus,sdt.*id+cdt.*iq,Bus.n,Bus.n);
  DAE.J21 = DAE.J21 - sparse(SSR.bus,SSR.bus,V.*sdt.*id+V.*cdt.*iq,Bus.n,Bus.n);
  DAE.J22 = DAE.J22 + sparse(SSR.bus,SSR.bus,sdt.*iq-cdt.*id,Bus.n,Bus.n);

 case 3 % differential equations

  Te = ((xq-xd).*id+xad.*If).*iq;
  B = Wb*((ra+r).*id-(xl+w4.*xq).*iq+ed+V.*sdt);
  C = Wb*(rf.*Efd./xad-rf.*If);

  DAE.f(SSR.Id) = (xf.*B-xad.*C)./xeq;
  DAE.f(SSR.Iq) = -Wb*((xl+w4.*xd).*id+(ra+r).*iq-w4.*xad.*If+eq+V.*cdt)./(xq+xl);
  DAE.f(SSR.If) = (xad.*B-(xd+xl).*C)./xeq;
  DAE.f(SSR.Edc) = Wb*(xc.*id+eq);
  DAE.f(SSR.Eqc) = Wb*(xc.*iq-ed);
  DAE.f(SSR.omega_HP) = (Tm-D1.*(w1-1)+k12.*(t2-t1))./M1;
  DAE.f(SSR.omega_IP) = (-D2.*(w2-1)+k12.*(t1-t2)+k23.*(t3-t2))./M2;
  DAE.f(SSR.omega_LP) = (-D3.*(w3-1)+k23.*(t2-t3)+k34.*(t4-t3))./M3;
  DAE.f(SSR.omega) = (-Te-D4.*(w4-1)+k34.*(t3-t4)+k45.*(t5-t4))./M4;
  DAE.f(SSR.omega_EX) = (-D5.*(w5-1)+k45.*(t4-t5))./M5;

  DAE.f(SSR.delta_HP) = Wb*(w1-1);
  DAE.f(SSR.delta_IP) = Wb*(w2-1);
  DAE.f(SSR.delta_LP) = Wb*(w3-1);
  DAE.f(SSR.delta)    = Wb*(w4-1);
  DAE.f(SSR.delta_EX) = Wb*(w5-1);

 case 4 % Jacobians of state variables

  DAE.Fx = DAE.Fx + sparse(SSR.delta_HP,SSR.omega_HP,Wb,DAE.n,DAE.n);
  DAE.Fx = DAE.Fx + sparse(SSR.delta_IP,SSR.omega_IP,Wb,DAE.n,DAE.n);
  DAE.Fx = DAE.Fx + sparse(SSR.delta_LP,SSR.omega_LP,Wb,DAE.n,DAE.n);
  DAE.Fx = DAE.Fx + sparse(SSR.delta,SSR.omega,Wb,DAE.n,DAE.n);
  DAE.Fx = DAE.Fx + sparse(SSR.delta_EX,SSR.omega_EX,Wb,DAE.n,DAE.n);

  DAE.Fx = DAE.Fx - sparse(SSR.omega_HP,SSR.omega_HP,D1./M1,DAE.n,DAE.n);
  DAE.Fx = DAE.Fx - sparse(SSR.omega_HP,SSR.delta_HP,k12./M1,DAE.n,DAE.n);
  DAE.Fx = DAE.Fx + sparse(SSR.omega_HP,SSR.delta_IP,k12./M1,DAE.n,DAE.n);

  DAE.Fx = DAE.Fx - sparse(SSR.omega_IP,SSR.omega_IP,D2./M2,DAE.n,DAE.n);
  DAE.Fx = DAE.Fx + sparse(SSR.omega_IP,SSR.delta_HP,k12./M2,DAE.n,DAE.n);
  DAE.Fx = DAE.Fx - sparse(SSR.omega_IP,SSR.delta_IP,(k12+k23)./M2,DAE.n,DAE.n);
  DAE.Fx = DAE.Fx + sparse(SSR.omega_IP,SSR.delta_LP,k23./M2,DAE.n,DAE.n);

  DAE.Fx = DAE.Fx - sparse(SSR.omega_LP,SSR.omega_LP,D3./M3,DAE.n,DAE.n);
  DAE.Fx = DAE.Fx + sparse(SSR.omega_LP,SSR.delta_IP,k23/M3,DAE.n,DAE.n);
  DAE.Fx = DAE.Fx - sparse(SSR.omega_LP,SSR.delta_LP,(k23+k34)./M3,DAE.n,DAE.n);
  DAE.Fx = DAE.Fx + sparse(SSR.omega_LP,SSR.delta,k34./M3,DAE.n,DAE.n);

  DAE.Fx = DAE.Fx - sparse(SSR.omega_EX,SSR.omega_EX,D5./M5,DAE.n,DAE.n);
  DAE.Fx = DAE.Fx + sparse(SSR.omega_EX,SSR.delta,k45./M5,DAE.n,DAE.n);
  DAE.Fx = DAE.Fx - sparse(SSR.omega_EX,SSR.delta_EX,k45./M5,DAE.n,DAE.n);

  DAE.Fx = DAE.Fx + sparse(SSR.omega,SSR.delta_LP,k34./M4,DAE.n,DAE.n);
  DAE.Fx = DAE.Fx - sparse(SSR.omega,SSR.delta,(k34+k45)./M4,DAE.n,DAE.n);
  DAE.Fx = DAE.Fx + sparse(SSR.omega,SSR.delta_EX,k45./M4,DAE.n,DAE.n);
  DAE.Fx = DAE.Fx - sparse(SSR.omega,SSR.omega,D4./M4,DAE.n,DAE.n);
  DAE.Fx = DAE.Fx - sparse(SSR.omega,SSR.Id,(xq-xd).*iq./M4,DAE.n,DAE.n);
  DAE.Fx = DAE.Fx - sparse(SSR.omega,SSR.Iq,((xq-xd).*id+xad.*If)./M4,DAE.n,DAE.n);
  DAE.Fx = DAE.Fx - sparse(SSR.omega,SSR.If,xad.*iq./M4,DAE.n,DAE.n);

  DAE.Fx = DAE.Fx + sparse(SSR.Edc,SSR.Id,Wb*xc,DAE.n,DAE.n);
  DAE.Fx = DAE.Fx + sparse(SSR.Edc,SSR.Eqc,Wb,DAE.n,DAE.n);
  DAE.Fx = DAE.Fx + sparse(SSR.Eqc,SSR.Iq,Wb*xc,DAE.n,DAE.n);
  DAE.Fx = DAE.Fx - sparse(SSR.Eqc,SSR.Edc,Wb,DAE.n,DAE.n);

  DAE.Fx = DAE.Fx + sparse(SSR.Id,SSR.Id,Wb*xf.*(ra+r)./xeq,DAE.n,DAE.n);
  DAE.Fx = DAE.Fx - sparse(SSR.Id,SSR.Iq,Wb*xf.*(xl+w4.*xq)./xeq,DAE.n,DAE.n);
  DAE.Fx = DAE.Fx + sparse(SSR.Id,SSR.If,Wb*xad.*rf./xeq,DAE.n,DAE.n);
  DAE.Fx = DAE.Fx + sparse(SSR.Id,SSR.Edc,Wb*xf./xeq,DAE.n,DAE.n);
  DAE.Fx = DAE.Fx - sparse(SSR.Id,SSR.omega,Wb*xf.*iq.*xq./xeq,DAE.n,DAE.n);
  DAE.Fx = DAE.Fx + sparse(SSR.Id,SSR.delta,Wb*V.*xf.*cdt./xeq,DAE.n,DAE.n);

  DAE.Fx = DAE.Fx + sparse(SSR.If,SSR.Id,Wb*xad.*(ra+r)./xeq,DAE.n,DAE.n);
  DAE.Fx = DAE.Fx - sparse(SSR.If,SSR.Iq,Wb*xad.*(xl+w4.*xq)./xeq,DAE.n,DAE.n);
  DAE.Fx = DAE.Fx + sparse(SSR.If,SSR.If,Wb*(xd+xl).*rf./xeq,DAE.n,DAE.n);
  DAE.Fx = DAE.Fx + sparse(SSR.If,SSR.Edc,Wb*xad./xeq,DAE.n,DAE.n);
  DAE.Fx = DAE.Fx - sparse(SSR.If,SSR.omega,Wb*xad.*iq.*xq./xeq,DAE.n,DAE.n);
  DAE.Fx = DAE.Fx + sparse(SSR.If,SSR.delta,Wb*xad.*V.*cdt./xeq,DAE.n,DAE.n);

  DAE.Fx = DAE.Fx - sparse(SSR.Iq,SSR.Id,Wb*(xl+w4.*xd)./(xq+xl),DAE.n,DAE.n);
  DAE.Fx = DAE.Fx - sparse(SSR.Iq,SSR.Iq,Wb*(ra+r)./(xq+xl),DAE.n,DAE.n);
  DAE.Fx = DAE.Fx + sparse(SSR.Iq,SSR.If,Wb*(w4.*xad)./(xq+xl),DAE.n,DAE.n);
  DAE.Fx = DAE.Fx - sparse(SSR.Iq,SSR.Eqc,Wb./(xq+xl),DAE.n,DAE.n);
  DAE.Fx = DAE.Fx + sparse(SSR.Iq,SSR.omega,Wb*(If.*xad-xd.*id)./(xq+xl),DAE.n,DAE.n);
  DAE.Fx = DAE.Fx + sparse(SSR.Iq,SSR.delta,Wb*V.*sdt./(xq+xl),DAE.n,DAE.n);

  DAE.Fy = DAE.Fy - sparse(SSR.Id,SSR.bus,Wb*V.*cdt.*xf./xeq,DAE.n,2*Bus.n);
  DAE.Fy = DAE.Fy + sparse(SSR.Id,SSR.bus+Bus.n,Wb*sdt.*xf./xeq,DAE.n,2*Bus.n);
  DAE.Fy = DAE.Fy - sparse(SSR.If,SSR.bus,Wb*V.*cdt.*xad./xeq,DAE.n,2*Bus.n);
  DAE.Fy = DAE.Fy + sparse(SSR.If,SSR.bus+Bus.n,Wb*sdt.*xad./xeq,DAE.n,2*Bus.n);
  DAE.Fy = DAE.Fy - sparse(SSR.Iq,SSR.bus,Wb*V.*sdt./(xq+xl),DAE.n,2*Bus.n);
  DAE.Fy = DAE.Fy - sparse(SSR.Iq,SSR.bus+Bus.n,Wb*cdt./(xq+xl),DAE.n,2*Bus.n);

  DAE.Gx = DAE.Gx - sparse(SSR.bus,SSR.Id,V.*sdt,2*Bus.n,DAE.n);
  DAE.Gx = DAE.Gx - sparse(SSR.bus+Bus.n,SSR.Id,V.*cdt,2*Bus.n,DAE.n);
  DAE.Gx = DAE.Gx - sparse(SSR.bus,SSR.Iq,V.*cdt,2*Bus.n,DAE.n);
  DAE.Gx = DAE.Gx + sparse(SSR.bus+Bus.n,SSR.Iq,V.*sdt,2*Bus.n,DAE.n);
  DAE.Gx = DAE.Gx + sparse(SSR.bus,SSR.delta,-V.*cdt.*id+V.*sdt.*iq,2*Bus.n,DAE.n);
  DAE.Gx = DAE.Gx + sparse(SSR.bus+Bus.n,SSR.delta,V.*sdt.*id+V.*cdt.*iq,2*Bus.n,DAE.n);

end

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -