📄 pst2psat.m
字号:
function check = pst2psat(filename, pathname)
% PST2PSAT convert data files in the Power System Toolbox
% version 2.0 format in the PSAT format.
% During the conversion process, approximations
% and/or guesses may be used.
%
% CHECK = PST2PSAT(FILENAME,PATHNAME)
% FILENAME name of the file to be converted
% PATHNAME path of the file to be converted
%
% CHECK = 1 conversion completed
% CHECK = 0 problem encountered (no data file created)
%
%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 Settings
check = 1;
pathname = [pathname,filesep];
fm_disp
fm_disp('Conversion from Power System Toolbox format...');
fm_disp(['Source data file "',pathname,filename,'"'])
% initialization of PST global variables
bus = []; % load flow data
line = [];
mac_con = []; % synchronous machine data
exc_con = []; % excitation system data
load_con = []; % non-conforming load data
ltc_con = [];
ind_con = []; % induction motor data
mld_con = [];
svc_con = []; % SVC data
pss_con = []; % PSS data
tg_con = []; % turbine-governor data
dcsp_con = []; % HVDC data
dcl_con = [];
dcc_con = [];
sw_con = []; % switch data
scr_con = [];
ibus_con = [];
netg_con = [];
stab_con = [];
% load PST data & check for consistency
try,
eval(filename(1:end-2));
catch,
check = 0;
fm_disp('Error encountered while opening PST data file...')
return,
end
if isempty(bus)
fm_disp(['Selected file "',filename, ...
'" does not appear a valid PST data file.'],2);
check = 0;
return
end
% some settings
bus(:,3) = pi*bus(:,3)/180;
mvabas = 100;
sizebus = length(bus(:,1));
net_line = line;
sizeline = length(net_line(:,1));
heading = ['File originated from data in PST format: #bus = ', ...
num2str(sizebus),', #line = ',num2str(sizeline)];
% definition of file name for PSAT data file
newfile = strrep(filename,'.m','_pst.m');
if ~strcmp(newfile(1), 'd'); newfile = ['d_',newfile]; end
% open file for writing
fid = fopen([pathname, newfile], 'wt');
count = fprintf(fid, ['%% ', heading, '\n\n']);
% Bus data Bus.con
% ---------------------------------------------------------------
fm_disp('bus -> Bus.con')
count = fprintf(fid, 'Bus.con = [ ...\n');
nrow = length(bus(1,:));
bus = [bus,zeros(sizebus,15-nrow)];
idx = find(bus(:,13)==0);
if idx, bus(idx,13) = 1; end
count = fprintf(fid,'%4d %8.4g %8.4g %8.4g;\n',bus([1:end-1],[1,13,2,3])');
count = fprintf(fid,'%4d %8.4g %8.4g %8.4g];\n\n\n',bus(end,[1,13,2,3]));
% Slack bus data SW.con
% ---------------------------------------------------------------
row = find(bus(:,10) == 1);
if ~isempty(row)
fm_disp('bus -> SW.con')
count = fprintf(fid, 'SW.con = [ ...\n');
format = '%4d %8.4g %8.4g %8.4g %8.4g %8.4g %8.4g %8.4g %8.4g %8.4g %2u';
for i = 1:length(row)-1
k = row(i);
if ~bus(k,11), bus(k,11) = 99; end
if ~bus(k,12), bus(k,12) = -99; end
if ~bus(k,14), bus(k,14) = 1.2; end
if ~bus(k,15), bus(k,15) = 0.8; end
data = [bus(k,1),mvabas,bus(k,[13, 2, 3, 11, 12, 14, 15, 4]),1];
count = fprintf(fid,[format,';\n'],data);
end
k = row(end);
data = [bus(k,1), mvabas, bus(k,[13, 2, 3, 11, 12, 14, 15, 4]),1];
count = fprintf(fid,[format,']; \n\n\n'],data);
end
% PV bus data PV.con
% ---------------------------------------------------------------------
row = find(bus(:,10) == 2);
if ~isempty(row)
fm_disp('bus -> PV.con')
format = '%4d %8.4g %8.4g %8.4g %8.4g %8.4g %8.4g %8.4g %8.4g %2u';
count = fprintf(fid, 'PV.con = [ ...\n');
for i = 1:length(row)-1
k = row(i);
if ~bus(k,11), bus(k,11) = 99; end
if ~bus(k,12), bus(k,12) = -99; end
if ~bus(k,14), bus(k,14) = 1.2; end
if ~bus(k,15), bus(k,15) = 0.8; end
data = [bus(k,1), mvabas, bus(k,[13, 4, 2, 11, 12, 14, 15]),1];
count = fprintf(fid, [format,';\n'],data);
end
k = row(end);
data = [bus(k,1), mvabas, bus(k,[13, 4, 2, 11, 12, 14, 15]),1];
count = fprintf(fid, [format,']; \n\n\n'],data);
end
% PQ bus data PQ.con
% ---------------------------------------------------------------------
row = find(bus(:,6) ~= 0 | bus(:,7) ~= 0);
if ~isempty(row)
fm_disp('bus -> PQ.con')
count = fprintf(fid, 'PQ.con = [ ...\n');
format = '%4d %8.4g %8.4g %8.4g %8.4g %8.4g %8.4g %2u';
for i = 1:length(row)-1
k = row(i);
if ~bus(k,14), bus(k,14) = 1.2; end
if ~bus(k,15), bus(k,15) = 0.8; end
data = [bus(k,1), mvabas, bus(k,[13,6,7,14,15]),0];
count = fprintf(fid, [format, '; \n'], data);
end
k = row(end);
data = [bus(k,1), mvabas, bus(k,[13,6,7,14,15]),0];
count = fprintf(fid, [format,']; \n\n\n'], data);
end
% Shunt bus data Shunt.con
% ---------------------------------------------------------------------
row = find(bus(:,8) ~= 0 | bus(:,9) ~= 0);
if ~isempty(row)
fm_disp('bus -> Shunt.con')
count = fprintf(fid, 'Shunt.con = [ ...\n');
format = '%4d %8.4g %8.4g %8.4g %8.4g %8.4g';
for i = 1:length(row)-1
k = row(i);
data = [bus(k,1), mvabas, bus(k,13), 60, bus(k,[8,9])];
count = fprintf(fid, [format,'; \n'], data);
end
k = row(end);
data = [bus(k,1), mvabas, bus(k,13), 60, bus(k,[8,9])];
count = fprintf(fid, [format, ']; \n\n\n'], data);
end
% Line data Line.con
% --------------------------------------------------------------------
% adjust line matrix dimensions
nrow = length(net_line(1,:));
if nrow < 10, net_line = [net_line,zeros(sizeline,10-nrow)]; end
idx = find(net_line(:,8)==0 & net_line(:,9)==0 & net_line(:,10)==0);
if ~isempty(idx)
fm_disp('line -> Line.con')
format = ['%4d %4d %8.4g %8.4g %8.4g %8.4g %8.4g %8.4g ' ...
'%8.4g %8.4g %8.4g %8.4g %8.4g'];
count = fprintf(fid, 'Line.con = [ ...\n');
for i = 1:length(idx)-1
k = idx(i);
kV = bus(find(bus(:,1)==net_line(k,1)),13);
%if net_line(k,6) ~= 0 | net_line(k,7) ~= 0
kV2 = bus(find(bus(:,1)==net_line(k,2)),13);
tap = kV/kV2;
if tap == 1, tap = 0; end
data = [net_line(k,[1 2]),mvabas,kV,60,0,tap,net_line(k,[3,4,5,6,7]),0];
%else
% data = [net_line(k,[1 2]),mvabas,kV,60,0,0,net_line(k,[3,4,5]),0,0,0];
%end
count = fprintf(fid, [format,';\n'],data);
end
k = idx(end);
kV = bus(find(bus(:,1)==net_line(k,1)),13);
%if net_line(k,6) ~= 0 | net_line(k,7) ~= 0
kV2 = bus(find(bus(:,1)==net_line(k,2)),13);
tap = kV/kV2;
if tap == 1, tap = 0; end
data = [net_line(k,[1 2]),mvabas,kV,60,0,tap,net_line(k,[3,4,5,6,7]),0];
%else
% data = [net_line(k,[1 2]),mvabas,kV,60,0,0,net_line(k,[3,4,5]),0,0,0];
%end
count = fprintf(fid, [format,'];\n\n\n'],data);
end
% Under load transformer data Ltc.con
% ------------------------------------------------------------------------
idx = find(net_line(:,8)~=0 | net_line(:,9)~=0 | net_line(:,10)~=0);
if ~isempty(idx)
fm_disp('line -> Ltc.con')
format = ['%4d %4d %8.4g %8.4g %8.4g %8.4g %8.4g %8.4g ' ...
'%8.4g %8.4g %8.4g %8.4g %8.4g %8.4g %8.4g %4d'];
count = fprintf(fid, 'Ltc.con = [ ...\n');
for i = 1:length(idx)-1
k = idx(i);
kV = bus(find(bus(:,1)==net_line(k,1)),13);
%vref = bus(find(bus(:,1)==net_line(k,2)),2);
data = [net_line(k,[1,2]),mvabas,kV,60,net_line(k,6),0, ...
0.1,net_line(k,[8,9,10]),1,net_line(k,[4,3]),0,1];
count = fprintf(fid, [format, ';\n'],data);
end
k = idx(end);
kV = bus(find(bus(:,1)==net_line(k,1)),13);
%vref = bus(find(bus(:,1)==net_line(k,2)),2);
data = [net_line(k,[1,2]),mvabas,kV,60,net_line(k,6),0, ...
0.1,net_line(k,[8,9,10]),1,net_line(k,[4,3]),0,1];
count = fprintf(fid, [format, ']; \n\n\n'],data);
end
% Sychronous machine data Syn.con
% --------------------------------------------------------------------
if ~isempty(mac_con)
fm_disp('mac_con -> Syn.con')
% adjust mac_con matrix dimension & data
nrow = length(mac_con(1,:));
ngen = length(mac_con(:,1));
if nrow < 23, mac_con = [mac_con,zeros(ngen,23-nrow)]; end
format = ['%4d %8.4g %8.4g %8.4g %4d %8.4g %8.4g %8.4g %8.4g ' ...
'%8.4g %8.4g %8.4g %8.4g %8.4g %8.4g %8.4g %8.4g ' ...
'%8.4g %8.4g %8.4g %8.4g %8.4g %8.4g %8.4g'];
mac_con(find(mac_con(:,22)==0),22) = 1;
mac_con(find(mac_con(:,23)==0),23) = 1;
count = fprintf(fid, 'Syn.con = [ ...\n');
for i = 1:ngen-1
kV = bus(find(bus(:,1)==mac_con(i,2)),13);
% choice of machine model
Td1 = mac_con(i,9);
Td2 = mac_con(i,10);
Tq1 = mac_con(i,14);
Tq2 = mac_con(i,15);
if Tq2 & Tq1 & Td2, ord = 6;
elseif Tq2 & Td2, ord = 5.2;
elseif Tq1 & Tq2, ord = 5.1;
elseif Tq1, ord = 4;
elseif Td1, ord = 3;
else, ord = 2;
end
data = [mac_con(i,[2,3]),kV,60,ord,mac_con(i,[4:15]),2*mac_con(i,16), ...
mac_con(i,[17]),0,0,mac_con(i,[22,23]),0];
count = fprintf(fid, [format, ';\n'],data);
end
i = ngen;
kV = bus(find(bus(:,1)==mac_con(i,2)),13);
% choice of machine model
Td1 = mac_con(i,9);
Td2 = mac_con(i,10);
Tq1 = mac_con(i,14);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -