📄 fm_report.m
字号:
end
% power flow results
% ---------------------------------------------------------------
Header{4,1} = 'POWER FLOW RESULTS';
Cols{4,1} = {'Bus','V','phase','P gen','Q gen','P load','Q load'; ...
' ', kV, ['[',raddeg,']'],MW,MVar,MW,MVar};
Rows{4,1} = {nomi_bus{ordbus}}';
Matrix{4,1} = [Vs,angs,Pgs,Qgs,Pls,Qls];
% check violations
% ---------------------------------------------------------------
nh = 4;
idx = 1;
if strcmp(violations,'on')
for i = 1:Bus.n
if vVmin(i)
Header{5,1}{idx,1} = sprintf(['Minimum voltage limit violation at bus <%s>' ...
' [V_min = %g]'],Varname.bus{i},Vmin(i));
idx = idx + 1;
end
if vVmax(i)
Header{5,1}{idx,1} = sprintf(['Maximum voltage limit violation at bus <%s>' ...
' [V_max = %g]'],Varname.bus{i},Vmax(i));
idx = idx + 1;
end
if vVmaxabs(i)
Header{5,1}{idx,1} = sprintf('Voltage at its limits at bus <%s>', ...
Varname.bus{i});
idx = idx + 1;
end
if vVminabs(i)
Header{5,1}{idx,1} = sprintf('Voltage at its limits at bus <%s>', ...
Varname.bus{i});
idx = idx + 1;
end
if vQgmax(i)
Header{5,1}{idx,1} = sprintf(['Maximum reactive power limit violation at bus <%s>' ...
' [Qg_max = %g]'],Varname.bus{i},Qgmax(i));
idx = idx + 1;
end
if vQgmin(i)
Header{5,1}{idx,1} = sprintf(['Minimum reactive power limit violation at bus <%s>' ...
' [Qg_min = %g]'],Varname.bus{i},Qgmin(i));
idx = idx + 1;
end
if vQgmaxabs(i)
Header{5,1}{idx,1} = sprintf('Maximum reactive power at bus <%s>', ...
Varname.bus{i});
idx = idx + 1;
end
if vQgminabs(i)
Header{5,1}{idx,1} = sprintf('Minimum reactive power at bus <%s>', ...
Varname.bus{i});
idx = idx + 1;
end
end
Rows{5,1} = '';
Cols{5,1} = '';
Matrix{5,1} = [];
nh = nh + 1;
end
% state variables
% ---------------------------------------------------------------
if DAE.n
nh = nh + 1;
Header{nh,1} = 'STATE VECTOR';
Rows{nh,1} = Varname.uvars([1:DAE.n]);
Cols{nh,1} = '';
Matrix{nh,1} = DAE.x;
end
% synchronous machine variables
% ---------------------------------------------------------------
if Syn.n
nh = nh + 1;
Header{nh,1} = 'MECHANICAL POWERS & FIELD VOLTAGES';
Synnames = cell(2*Syn.n,1);
idx0 = DAE.n+2*Bus.n;
for kkk = 1:Syn.n
Synnames{kkk,1} = Varname.uvars{idx0+kkk};
end
idx0 = DAE.n+2*Bus.n+Syn.n;
for kkk = 1:Syn.n
Synnames{kkk+Syn.n,1} = Varname.uvars{idx0+kkk};
end
Rows{nh,1} = Synnames;
Cols{nh,1} = '';
Matrix{nh,1} = [Syn.pm;Syn.vf];
end
% exciter variables
% ---------------------------------------------------------------
if Exc.n
nh = nh + 1;
Header{nh,1} = 'EXCITER REFERENCE VOLTAGES';
idx0 = DAE.n+2*Bus.n+2*Syn.n;
Rows{nh,1} = Varname.uvars([idx0+1:idx0+Exc.n]);
Cols{nh,1} = '';
Matrix{nh,1} = [Exc.vrif];
end
% over excitation limiter variables
% ---------------------------------------------------------------
if Oxl.n
nh = nh + 1;
Header{nh,1} = 'FIELD CURRENTS';
idx0 = DAE.n+2*Bus.n+2*Syn.n+Exc.n;
Rows{nh,1} = Varname.uvars([idx0+1:idx0+Oxl.n]);
Cols{nh,1} = '';
Matrix{nh,1} = [Oxl.If];
end
% line flows (i -> j)
% ---------------------------------------------------------------
p_losses = (abs(line_ffrom(:,4)+line_fto(:,4)));
q_losses = (line_ffrom(:,5)+line_fto(:,5));
nh = nh + 1;
Header{nh,1} = 'LINE FLOWS';
Cols{nh,1} = {'From Bus','To Bus','Line','P Flow', ...
'Q Flow','P Loss','Q Loss'; ...
' ',' ',' ',MW,MVar,MW,MVar};
Rows{nh,1} = cell(length(line_ffrom(:,2)),2);
for iii = 1:length(line_fto(:,2))
Rows{nh,1}{iii,1} = nomi_bus{line_ffrom(iii,2),1};
Rows{nh,1}{iii,2} = nomi_bus{line_ffrom(iii,3),1};
end
Matrix{nh,1} = [line_ffrom(:,1),line_ffrom(:,4),line_ffrom(:,5), ...
p_losses,q_losses];
% check flow violations
% ---------------------------------------------------------------
if strcmp(violations,'on')
idx = 0;
nh = nh + 1;
for i = 1:Line.n
if vIs(i)
idx = idx + 1;
Header{nh,1}{idx,1} = sprintf( ...
['%sMaximum current limit violation [I = %g > I_max = ' ...
'%g]\n'], space,Is(i),Imaxs(i));
end
if vPs(i)
idx = idx + 1;
Header{nh,1}{idx,1} = sprintf( ...
'%sMaximum real power limit violation [P_max = %g]\n', ...
space,Pmax(i));
end
if vSs(i)
idx = idx + 1;
Header{nh,1}{idx,1} = sprintf( ...
['%sMaximum apparent power limit violation [S = %g > ' ...
'S_max = %g]\n'], space,Ss(i),Smax(i));
end
end
if idx
Matrix{nh,1} = [];
Cols{nh,1} = '';
Rows{nh,1} = '';
else
nh = nh - 1;
end
end
% line flows (j -> i)
% ---------------------------------------------------------------
nh = nh + 1;
Header{nh,1} = 'LINE FLOWS';
Cols{nh,1} = {'From Bus','To Bus','Line','P Flow', ...
'Q Flow','P Loss','Q Loss'; ...
' ',' ',' ',MW,MVar,MW,MVar};
Rows{nh,1} = cell(length(line_fto(:,2)),2);
for iii = 1:length(line_fto(:,2))
Rows{nh,1}{iii,1} = nomi_bus{line_fto(iii,2),1};
Rows{nh,1}{iii,2} = nomi_bus{line_fto(iii,3),1};
end
Matrix{nh,1} = [line_fto(:,1),line_fto(:,4),line_fto(:,5), ...
p_losses,q_losses];
% check flow violations
% ---------------------------------------------------------------
if strcmp(violations,'on')
idx = 0;
nh = nh + 1;
for i = 1:Line.n
if vIr(i)
idx = idx + 1;
Header{nh,1}{idx,1} = sprintf( ...
['%sMaximum current limit violation [I = %g > I_max = ' ...
'%g]\n'], space,Ir(i),Imaxr(i));
end
if vPr(i)
idx = idx + 1;
Header{nh,1}{idx,1} = sprintf( ...
'%sMaximum real power limit violation [P_max = %g]\n', ...
space,Pmax(i));
end
if vSr(i)
idx = idx + 1;
Header{nh,1}{idx,1} = sprintf( ...
['%sMaximum apparent power limit violation [S = %g > ' ...
'S_max = %g]\n'], space,Sr(i),Smax(i));
end
end
if idx
Matrix{nh,1} = [];
Cols{nh,1} = '';
Rows{nh,1} = '';
else
nh = nh -1;
end
end
% check for additional variables
% ---------------------------------------------------------------
%hdl_serv = findobj(gcf,'Tag','ListboxServ');
%Cella = get(hdl_serv,'String');
%if ~isempty(Cella)
% nh = nh + 1;
% Header{nh,1} = {'OTHER VARIABLES';' '};
% if ischar(Cella)
% Header{nh,1} = [Header{nh,1}; Cella];
% end
% if iscell(Cella)
% if strcmp(Cella{1,1}(1:7),'Pmech_1')
% Cella = Cella(2*Syn.n+1:end);
% end
% Header{nh,1} = [Header{nh,1}; Cella];
% end
% Matrix{nh,1} = [];
% Cols{nh,1} = '';
% Rows{nh,1} = '';
%end
% global summary
% ---------------------------------------------------------------
Pg_tot = sum(Pgs);
Qg_tot = sum(Qgs);
Pl_tot = sum(Pls);
Ql_tot = sum(Qls);
idx_i = find(Shunt.b < 0);
if ~isempty(idx_i)
Qsi_tot = abs(sum(Shunt.b(idx_i).*DAE.V(idx_i).*DAE.V(idx_i)).*MVA);
else
Qsi_tot = 0;
end
idx_c = find(Shunt.b > 0);
if ~isempty(idx_c)
Qsc_tot = -abs(sum(Shunt.b(idx_c).*DAE.V(idx_c).*DAE.V(idx_c)).*MVA);
else
Qsc_tot = 0;
end
Ps_tot = sum(Shunt.g.*DAE.V.*DAE.V).*MVA;
nh = nh + 1;
Header{nh,1} = 'GLOBAL SUMMARY REPORT';
Matrix{nh,1} = [];
Cols{nh,1} = '';
Rows{nh,1} = '';
nh = nh + 1;
Header{nh,1} = 'TOTAL GENERATION';
Matrix{nh,1} = [Pg_tot;Qg_tot];
Cols{nh,1} = '';
Rows{nh,1} = {['REAL POWER ',MW];['REACTIVE POWER ',MVar]};
nh = nh + 1;
Header{nh,1} = 'TOTAL LOAD';
Matrix{nh,1} = [Pl_tot;Ql_tot];
Cols{nh,1} = '';
Rows{nh,1} = {['REAL POWER ',MW];['REACTIVE POWER ',MVar]};
nh = nh + 1;
Header{nh,1} = 'TOTAL SHUNT';
Matrix{nh,1} = [Ps_tot;Qsi_tot;Qsc_tot];
Cols{nh,1} = '';
Rows{nh,1} = {['REAL POWER ',MW]; ...
['REACTIVE POWER (IND) ',MVar]; ...
['REACTIVE POWER (CAP) ',MVar]};
nh = nh + 1;
Header{nh,1} = 'TOTAL LOSSES';
Matrix{nh,1} = [P_loss;Q_loss];
Cols{nh,1} = '';
Rows{nh,1} = {['REAL POWER ',MW];['REACTIVE POWER ',MVar]};
% violation summary
% ---------------------------------------------------------------
if strcmp(violations,'on')
nh = nh + 1;
Header{nh,1}{1,1} = 'LIMIT VIOLATION STATISTICS';
vVtot = sum(vVmax)+sum(vVmin);
vQtot = sum(vQgmax)+sum(vQgmin);
vVabs = sum(vVmaxabs)+sum(vVminabs);
vQabs = sum(vQgmaxabs)+sum(vQgminabs);
if vVtot
Header{nh,1}{2,1} = sprintf('# OF VOLTAGE LIMIT VIOLATIONS: %d',vVtot);
else
if vVabs
Header{nh,1}{2,1} = sprintf(['ALL VOLTAGES WITHIN LIMITS (%d ' ...
'BINDING).'],vVabs);
else
Header{nh,1}{2,1} = 'ALL VOLTAGES WITHIN LIMITS.';
end
end
if vQtot
Header{nh,1}{3,1} = sprintf('# OF REACTIVE POWER LIMIT VIOLATIONS: %d',vQtot);
else
if vQabs
Header{nh,1}{2,1} = sprintf(['ALL REACTIVE POWERS WITHIN LIMITS (%d ' ...
'BINDING).'],vQabs);
else
Header{nh,1}{3,1} = 'ALL REACTIVE POWER WITHIN LIMITS.';
end
end
if Line.n
vItot = sum(vIs & vIr);
if vItot
Header{nh,1}{4,1} = sprintf('# OF CURRENT FLOW LIMIT VIOLATIONS: %d',vItot);
else
Header{nh,1}{4,1} = 'ALL CURRENT FLOWS WITHIN LIMITS.';
end
vPtot = sum(vPs & vPr);
if vPtot
Header{nh,1}{5,1} = sprintf('# OF ACTIVE POWER FLOW LIMIT VIOLATIONS: %d',vPtot);
else
Header{nh,1}{5,1} = 'ALL REAL POWER FLOWS WITHIN LIMITS.';
end
vStot = sum(vSs & vSr);
if vStot
Header{nh,1}{6,1} = sprintf('# OF APPARENT POWER FLOW LIMIT VIOLATIONS: %d',vStot);
else
Header{nh,1}{6,1} = 'ALL APPARENT POWER FLOWS WITHIN LIMITS.';
end
end
Matrix{nh,1} = [];
Cols{nh,1} = '';
Rows{nh,1} = '';
end
% writing data...
fm_write(Matrix,Header,Cols,Rows)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -