📄 simpow2psat
字号:
#!/usr/bin/perl -w
# SIMPOW2MAT converts SIMPOW data files into Matlab files
#
# SIMPOW2MAT [OPTIONS] OPTPOW_FILE [DYNPOW_FILE] [FILEOUTPUT]
#
# Author: Federico Milano
# Date: 02 October 2006
# Version: 0.02
#
#e-mail: Federico.Milano@uclm.es
use strict;
use Cwd;
use File::Basename;
# -----------------------------------------------------------------------
# variable declaration
# -----------------------------------------------------------------------
my $nargin = 0;
my $verbose = 0;
my $helpmsg = 0;
my $samedir = 1;
my $nodyn = 0;
my ($file, $outfile, $dir);
my $dynfile = '';
my $tempfile = '';
my $outdir = '';
my ($i,$j,$h,$k);
my $nbus = -1;
my $nsw = -1;
my $npv = -1;
my $npq = -1;
my $npg = -1;
my $nsh = -1;
my $ntw = -1;
my $ncv = -1;
my $nsr = -1;
my $nline = -1;
my $ntitle = -1;
my $nsyn = -1;
my $ngen = -1;
my $nexc = -1;
my $type = 0;
my $pbase = 100;
my $lbase = 100;
my $fbase = 60;
my $symod = "N";
my ($format,$title,$firstline,@data,@title,%data,@alter);
my (@kvb,@karea,@kzone,@busname,%nameidx,@vol,@ang);
my (@swbus,@swfi,@swvs,@swqt,@swqb,@swpg,@swtype,@swidx);
my (@pvbus,@genbus,@genname,@pvpg,@pvvs,@pvqt,@pvqb,@pvidx);
my (@pqbus,@pqpl,@pqql,@umin,@umax,@loadstatus,@loadno);
my (@shbus,@vbsh,@psh,@qsh,@shstatus,@shno);
my (%lineno,@busfr,@bustt,@linevb,@tfsb,@no,@linetype);
my (@rest,@reat,@susc,@kt,@ratio,@phas,@imax,@pmax,
@steps,@stepp,@stepm,@linestatus,@treg,@linefi,
@linecnode,@lineconv,@linepar,@length,@tapside);
my (%twno,@twsb,@bus1,@bus2,@bus3,@vb1,@vb2,@vb3,
@r12,@r13,@r23,@x12,@x13,@x23,@twstatus);
my (@synbus,@pbgen,@mstt,@xd,@xq,@xdp,@xqp,@xdb,@xqb,@xl,
@td0p,@td0b,@tq0p,@tq0b,@gentype,@damp,@gbas,@ra,@pf,@qf,@synvreg);
my (@pgbus,@pqpg,@pqqg,@pgidx);
my (@cvname,@cvidx,@cvidn,@cvudion,@cvdx,@cvdr,%cvidx,@cvbusdc2,
@cvtyp,@cvio,@cvdi,@cvamin,@cvgmin,@cvbus,@cvbusdc1);
my (@srbus1,@srbus2,@srno,@srtype,@srr,@srl,@srx,@srncon);
my (@exctype,@exccode,@excka,@excta,@excte,@exckf,@exctf,@exctr,@excvrmax,@excvrmin);
# -----------------------------------------------------------------------
# check inputs
# -----------------------------------------------------------------------
$nargin = @ARGV;
$nargin || die "Error: No input data file.\n";
# -----------------------------------------------------------------------
# check options
# -----------------------------------------------------------------------
while ($ARGV[0] =~ /^-/) {
if ($ARGV[0] =~ /v/) {
$verbose = 1;
}
if ($ARGV[0] =~ /h/) {
$helpmsg = 1;
}
if ($ARGV[0] =~ /d/) {
$samedir = 0;
}
if ($ARGV[0] =~ /n/) {
$nodyn = 1;
}
shift(@ARGV);
$nargin--;
if ($nargin == 0) { last; }
}
($file,$dir) = fileparse($ARGV[0]);
if (!$dir) { $dir = getcwd(); }
print "Working directory <" . $dir . ">\n";
$title = 'Generic SIMPOW Data File <' . $file . '>';
# -----------------------------------------------------------------------
# help (if requested)
# -----------------------------------------------------------------------
if ($helpmsg) {
print "\nSIMPOW2PSAT converts SIMPOW data files into PSAT files.\n\n";
print "simpow2psat <options> fileinput <fileoutput>\n";
print " -v verbose\n";
print " -h print this help and exit\n\n";
print "Author: Federico Milano\n";
print "Date: 01-Nov-2007\n";
print "Version: 2.0.0\n\n";
print "E-mail: Federico.Milano\@uclm.es\n";
die "\n";
}
# -----------------------------------------------------------------------
# define output file name (if necessary)
# -----------------------------------------------------------------------
if ($nargin == 2 && $ARGV[1] =~ /.dynpow$/) {
$dynfile = $ARGV[1];
$nargin = 1;
}
if ($nargin == 2 && $ARGV[1] =~ /.m$/) {
($outfile,$outdir) = fileparse($ARGV[1]);
}
if ($nargin == 3) {
$dynfile = splice(@ARGV,1,1);
$nargin = 2;
($outfile,$outdir) = fileparse($ARGV[1]);
}
if ($nargin == 1) {
$outfile = $file;
$outfile =~ s/^d*_*/d_/;
$outfile =~ s/[^\w\.]/_/g;
$outfile =~ s/\..+$/.m/;
$ARGV[1] = $dir . $outfile;
} elsif ($nargin == 0) {
die "Error: Input file name is missing.\n";
}
if ($samedir && (!$outdir || $outdir eq "./") && $nargin == 2) {
$ARGV[1] = $dir . $ARGV[1];
}
# -----------------------------------------------------------------------
# open, store and close OPTPOW file
# -----------------------------------------------------------------------
print "Opening SIMPOW-OPTPOW file <$file>\n";
open(IN,$ARGV[0]) || die "Cannot open $file: $!\n";
@data = <IN>;
close(IN) || die "Cannot close $file: $!\n";
# -----------------------------------------------------------------------
# scan OPTPOW data
# -----------------------------------------------------------------------
# read file header
while (defined($_ = shift(@data))) {
chomp;
last if /^\*\*/;
if (/^\$DISABLE/) { discom(); next; }
if (/^\$INCLUDE/) { include(); next; }
$ntitle++;
$_ =~ s/^\!+//;
$title[$ntitle] = $_;
}
# read data
while (defined($_ = shift(@data))) {
next if /^!/;
if (/^\$DISABLE/) { discom(); next; }
if (/^\$INCLUDE/) { include(); next; }
$firstline = "NULL";
if (/^GENERAL/) { # System bases
while ($firstline ne "END") {
%data = splitdata(0);
$pbase = assign("SN",$pbase);
$lbase = assign("LBASE",$pbase);
}
} elsif (/^NODE/) { # Bus data
while ($firstline ne "END") {
%data = splitdata(1);
if ($data{"BUS1"} eq "END") { last; }
$nbus++;
$busname[$nbus] = $data{"BUS1"};
#print $busname[$nbus] . "\n";
$kvb[$nbus] = assign("UB",1);
$vol[$nbus] = assign("UI",1);
$ang[$nbus] = 0.017453*assign("FII",0);
$karea[$nbus] = assign("AREA",1);
$kzone[$nbus] = assign("REGION",1);
$nameidx{$busname[$nbus]} = $nbus;
}
} elsif (/^LINE/) {
while ($firstline ne "END") {
%data = splitdata(2);
if ($data{"BUS1"} eq "END") { last; }
$nline++;
$busfr[$nline] = $nameidx{$data{"BUS1"}};
$bustt[$nline] = $nameidx{$data{"BUS2"}};
$linevb[$nline] = $kvb[$busfr[$nline]];
$lineno{$data{"BUS1"}.$data{"BUS2"}.assign("NO",1)} = $nline;
$no[$nline] = assign("NO",0);
$linetype[$nline] = 0;
$tfsb[$nline] = $lbase;
$h = assign("TYPE",1);
if ($h == 0) {
$rest[$nline] = 0;
$reat[$nline] = 0.0001;
$susc[$nline] = 0;
} elsif ($h == 6) { # DC LINE
$rest[$nline] = assign("R",0);
$reat[$nline] = assign("LL",0.0001);
$susc[$nline] = 0;
$linetype[$nline] = 6;
} elsif ($h > 10) { # PER UNIT DATA
$rest[$nline] = assign("R",0);
$reat[$nline] = assign("X",0.0001);
$susc[$nline] = assign("B1",0)+assign("B2",0)+assign("B",0);
} else { # OHM UNITS
$rest[$nline] = assign("R",0)*$lbase/($linevb[$nline]**2);
$reat[$nline] = assign("X",0.0001)*$lbase/($linevb[$nline]**2);
$susc[$nline] = assign("B1",0)+assign("B2",0)+assign("B",0);
$susc[$nline] = $susc[$nline]/$lbase*($linevb[$nline]**2);
}
$length[$nline] = assign("L",0);
if ($length[$nline] > 0) {
$rest[$nline] = $rest[$nline]*$length[$nline];
$reat[$nline] = $reat[$nline]*$length[$nline];
$susc[$nline] = $susc[$nline]*$length[$nline];
}
$kt[$nline] = 0;
$tapside[$nline] = 2;
$ratio[$nline] = 0;
$phas[$nline] = 0;
$imax[$nline] = assign("I1MAX",0)*sqrt(3)*$linevb[$nline]/$lbase;
$pmax[$nline] = assign("I2MAX",0)*sqrt(3)*$linevb[$nline]/$lbase;
$linestatus[$nline] = status();
$steps[$nline] = 0;
$stepp[$nline] = 0;
$stepm[$nline] = 0;
$treg[$nline] = 0;
$linefi[$nline] = 0;
$linecnode[$nline] = 0;
$lineconv[$nline] = 0;
$linepar[$nline] = 0;
}
} elsif (/^TRANSFORMER/) {
while ($firstline ne "END") {
%data = splitdata(-2);
if ($data{"BUS1"} eq "END") { last; }
$j = assign("NW",2);
if ($j == 2) {
$nline++;
$busfr[$nline] = $nameidx{$data{"BUS1"}};
$bustt[$nline] = $nameidx{$data{"BUS2"}};
$lineno{$data{"BUS1"}.$data{"BUS2"}.assign("NO",1)} = $nline+1;
$no[$nline] = assign("NO",0);
$linetype[$nline] = 1;
$linevb[$nline] = assign("UN1",$kvb[$busfr[$nline]]);
$tfsb[$nline] = assign("SN",$lbase);
$length[$nline] = 0;
$kt[$nline] = $linevb[$nline]/assign("UN2",$kvb[$bustt[$nline]]);
$rest[$nline] = assign("ER12",0);
$reat[$nline] = assign("EX12",0.0001);
$susc[$nline] = 0;
$ratio[$nline] = 0;
$tapside[$nline] = assign("TAPSIDE",2);
$phas[$nline] = assign("FI",0);
$imax[$nline] = assign("S1MAX",0)/$lbase;
$pmax[$nline] = assign("S2MAX",0)/$lbase;
$steps[$nline] = assign("STEP",0);
$stepp[$nline] = assign("+NSTEP",0);
$stepm[$nline] = assign("-NSTEP",0);
$treg[$nline] = 0;
$linefi[$nline] = 0;
$linecnode[$nline] = 0;
$lineconv[$nline] = 0;
$linepar[$nline] = 0;
$linestatus[$nline] = status();
} elsif ($j == 3) {
$ntw++;
$twsb[$ntw] = assign("SN",$lbase);
$bus1[$ntw] = $nameidx{$data{"BUS1"}};
$bus2[$ntw] = $nameidx{$data{"BUS2"}};
$bus3[$ntw] = $nameidx{$data{"BUS3"}};
$twno{$data{"BUS1"}.$data{"BUS2"}.$data{"BUS3"}.assign("NO",1)} = $ntw+1;
$vb1[$ntw] = assign("UN1",$kvb[$bus1[$ntw]]);
$vb2[$ntw] = assign("UN2",$kvb[$bus2[$ntw]]);
$vb3[$ntw] = assign("UN3",$kvb[$bus3[$ntw]]);
$r12[$ntw] = assign("ER12",0);
$r13[$ntw] = assign("ER13",0);
$r23[$ntw] = assign("ER23",0);
$x12[$ntw] = assign("EX12",0);
$x13[$ntw] = assign("EX13",0);
$x23[$ntw] = assign("EX23",0);
$twstatus[$ntw] = status();
}
}
} elsif (/^CONVERTORS/) {
while ($firstline ne "END") {
%data = splitdata(4);
if ($data{"BUS1"} eq "END") { last; }
$ncv++;
$cvname[$ncv] = $data{"BUS1"};
$cvidx{$cvname[$ncv]} = $ncv;
$cvbus[$ncv] = $nameidx{$data{"BUS2"}};
$cvbusdc1[$ncv] = $nameidx{$data{"BUS3"}};
$cvbusdc2[$ncv] = $nameidx{$data{"BUS4"}};
$cvidn[$ncv] = $data{"IDN"};
$cvudion[$ncv] = $data{"UDION"};
$cvdx[$ncv] = assign("DX",0.06);
$cvdr[$ncv] = assign("DR",0.006);
}
} elsif (/^SREACTORS/) {
while ($firstline ne "END") {
%data = splitdata(2);
if ($data{"BUS1"} eq "END") { last; }
$nsr++;
if ($data{"BUS1"} eq "DCGROUND") {
$srbus1[$nsr] = -1;
} else {
$srbus1[$nsr] = $nameidx{$data{"BUS1"}};
}
if ($data{"BUS2"} eq "DCGROUND") {
$srbus2[$nsr] = -1;
} else {
$srbus2[$nsr] = $nameidx{$data{"BUS2"}};
}
$srno[$nsr] = assign("NO",0);
$srtype[$nsr] = assign("TYPE",1);
$srr[$nsr] = assign("R",0);
$srl[$nsr] = assign("L",0);
$srx[$nsr] = assign("X",0);
$srncon[$nsr] = !assign("NCON",0);
}
} elsif (/^SHUNT/) {
while ($firstline ne "END") {
%data = splitdata(1);
if ($data{"BUS1"} eq "END") { last; }
$nsh++;
$shbus[$nsh] = $nameidx{$data{"BUS1"}};
$vbsh[$nsh] = assign("UN",$kvb[$shbus[$nsh]]);
$psh[$nsh] = -assign("P",0)/$pbase;
$qsh[$nsh] = -assign("Q",0)/$pbase;
$shstatus[$nsh] = status();
$shno[$nsh] = assign("NO",0);
}
} elsif (/^LOAD/) {
while ($firstline ne "END") {
%data = splitdata(1);
if ($data{"BUS1"} eq "END") { last; }
$npq++;
$pqbus[$npq] = $nameidx{$data{"BUS1"}};
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -