📄 psse2psat
字号:
#!/usr/bin/perl -w# PSSE2PSAT converts PSS/E data file into PSAT data file## PSSE2PSAT <OPTIONS> FILEINPUT <FILEOUTPUT># # Author: Federico Milano# Date: 19-July-2004# Update: 24-March-2006 by JC.Morataya@ieee.org# Update: 12-December-2007# Version: 1.3##E-mail: fmilano@thunderbox.uwaterloo.ca#Web-site: http://thunderbox.uwaterloo.ca/~fmilano use strict;use constant V23 => 23;use constant V24 => 24;use constant V25 => 25;use constant V26 => 26;use constant V29 => 29;use constant V30 => 30; # -----------------------------------------------------------------------# variable declaration# -----------------------------------------------------------------------my $nargin = 0;my $verbose = 0;my $helpmsg = 0;my ($i,$h,$k,$j);my $format;my $format1;my $n = 0;my $npv = -1;my $nsw = -1;my $npq = -1;my $npl = -1;my $nsh = -1;my $ntr = -1;my $nsvc = -1;my $title1 = 'PSS/E Data Format File '.$ARGV[0];my $title2 = ' ';my $pbas = 100;my $nbus = -1;my $nline = -1;my $narea = -1;my $nzone = -1;my $ncard = -1;my $flag_bus = 0;my $flag_line = 0;my $flag_area = 0;my $flag_trsf = 0;my $V26_up = 0;my $V25_down = 0;my $guess = 0;my $psse_v = 0;my ($ver,$pos,$rev,$block);my $flag_version = V29; # By default, version is supposed to be 29 my @data;my (@busidx,@bustype,@busname,%extname);my (@ein,@ang,@pag,@prg,@qmi,@qma,@tap, @pac,@prc,@psh,@qsh,@kae,@kzo,@kvb); my (@plbus,@plip,@pliq,@plyp,@plyq);my (@pqbus,@pqpl,@pqql,@stt,@chkcard,@pqu,@shu,@plu,@pvu);my $stt = '%';my %kvbase;my %busidw;my (@svcbus,@svcbma,@svcbmi,@svcref);my (@areaidx,@areabus,@areapdes,@areaptol,@areaname);my (@zoneidx,@zonename);# -----------------------------------------------------------------------# 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;} shift(@ARGV); $nargin--; if ($nargin == 0) { last; }} # -----------------------------------------------------------------------# help (if requested)# -----------------------------------------------------------------------if ($helpmsg) {print "\nPSSE2PSAT converts PSS/E data files into PSAT data files.\n\n";print "psse2psat <options> fileinput <fileoutput>\n";print " -v verbose\n";print " -h print this help and exit\n\n";print " Author: Federico Milano\n";print " Date: 19-July-2004\n";print " Update: 24-March-2006 by JC.Morataya\@ieee.org\n";print " Version: 1.2.1\n";print "E-mail: fmilano\@thunderbox.uwaterloo.ca\n";print "Web-site: http://thunderbox.uwaterloo.ca/~fmilano\n";die "\n";} # -----------------------------------------------------------------------# define output file name (if necessary)# -----------------------------------------------------------------------if ($nargin == 1) { $ARGV[1] = $ARGV[0]; $ARGV[1] =~ s/^/d_/; $ARGV[1] =~ s/^d_d/d_/; $ARGV[1] =~ s/[^a-zA-Z0-9_\.]/_/g; $ARGV[1] =~ s/\..*/.m/;} elsif ($nargin == 0) { die "Error: Input file name is missing.\n";}# -----------------------------------------------------------------------# find data version# -----------------------------------------------------------------------print "Opening PSS/E file \"$ARGV[0]\"...\n";carret();open(IN,$ARGV[0]) || die "cannot open $ARGV[0]: $!\n";while (<IN>) { if (/PSS\/E-30/) { $flag_version = V30; } if (/Version:24/) { $flag_version = V24; } if (/Version:25/) { $flag_version = V25; } if (/Version:26/) { $flag_version = V26; } next if !/\d+/; if (/^\s*0/) { $ncard++; $chkcard[$ncard] = $_; if ($ncard == 0) { $pos = index "$_" , 'RAW'; $block = substr "$_",$pos,16; $block =~ s/\s+//g; if ($pos == -1) { $pos = index "$_" , 'PSS/E'; $block = substr "$_",$pos,16; $block =~ s/\s+//g; $psse_v = 1; } unless ($pos == -1) { if ($psse_v != 1) { $ver = substr "$block",3,2; $rev = substr "$block",9,2; print "PSS/E V-"."$ver"." revision "."$rev"." file found...\n"; } else { $ver = substr "$block",6,4; print "PSS/E V-"."$ver"." file found...\n"; } $guess = 1; } } if ($ncard == 4) { last; } if ($chkcard[$ncard] =~ /^\s*0\s*\//) { #if ($ncard == 3 && $guess == 0 ) { print "PSS/E Version > 25 file found...\n"; } $V26_up = 1; } else { #if ($ncard == 3 && $guess == 0) { print "PSS/E Version < 26 file found...\n"; } } } else { if ($ncard == 0) { $V25_down = index "$_" , '\''; if ($V25_down > 20) { $flag_version = V23; } } elsif ($ncard == 3) { if (/,,,/) { if ($V26_up == 1) { $flag_version = V26; } else { $flag_version = V24; } } } }} close (IN) || die "cannot close $ARGV[0]: $!\n";print "PSS/E data version " . $flag_version . "\n"; # -----------------------------------------------------------------------# open input data file# -----------------------------------------------------------------------#print "Scanning PSS/E file \"$ARGV[0]\"...\n";#carret();open(IN,$ARGV[0]) || die "cannot open $ARGV[0]: $!\n"; # -----------------------------------------------------------------------# scan input data file# -----------------------------------------------------------------------# read identification data$_ = <IN>;chomp;@data = mysplit($_);if ($data[1]) { # assign system base $pbas = deblank($data[1]); chomp($pbas);} print "Power Base = " . $pbas . " MVA\n";$_ = <IN>;chomp;$title1 = $_; # 1st header line$_ = <IN>;chomp;$title2 = $_; # 2nd header line# bus data PSS/E V24, V29 my ($swbus,@idxsh,$nisl,@islbus); $nisl = -1;while (<IN>) { chomp; @data = mysplit($_); last if /^\s*0/; if ($flag_version != V23) { $nbus++; $busidx[$nbus] = int($data[0]); $bustype[$nbus] = $data[3]; $busname[$nbus] = $data[1]; $extname{$busname[$nbus]} = $busidx[$nbus]; $kvb[$nbus] = $data[2]; $ein[$nbus] = $data[8]; $ang[$nbus] = 0.0175*$data[9]; $kae[$nbus] = $data[6]; $kzo[$nbus] = $data[7]; $kvbase{$busidx[$nbus]} = $kvb[$nbus]; $busidw{$busidx[$nbus]} = $busname[$nbus]; # for the warnings if ($data[3] == 3) { $nsw++; $swbus = $data[0]; } if ($data[3] == 4) { $nisl++; $islbus[$nisl] = $data[0]; # printf "Isolated bus " . $data[0] . " will be ignored.\n"; } } else { # bus data V23 format $nbus++; $busidx[$nbus] = int($data[0]); $bustype[$nbus] = $data[1]; $busname[$nbus] = $data[9]; $extname{$busname[$nbus]} = $busidx[$nbus]; $kvb[$nbus] = $data[10]; $ein[$nbus] = $data[7]; $ang[$nbus] = 0.0175*$data[8]; $kae[$nbus] = $data[6]; $kzo[$nbus] = $data[11]; $kvbase{$busidx[$nbus]} = $kvb[$nbus]; $busidw{$busidx[$nbus]} = $busname[$nbus]; # to identify warnings if ($data[1] == 3) { $nsw++; $swbus = $data[0]; } if ($data[1] == 4) { $nisl++; $islbus[$nisl] = $data[0]; # printf "Isolated bus " . $data[0] . " will be ignored.\n"; } # load data V23 format if ($data[2] != 0 || $data[3] != 0) { $npq++; $pqbus[$npq] = int($data[0]); $pqpl[$npq] = $data[2]/$pbas; $pqql[$npq] = $data[3]/$pbas; $pqu[$npq] = ididx($pqbus[$npq]); } } # shunt data V23, V24 and V25 formats if ($data[4] != 0 || $data[5] != 0) { $nsh++; $idxsh[$nsh] = int($data[0]); $psh[$nsh] = $data[4]/$pbas/$ein[$nbus]/$ein[$nbus]; $qsh[$nsh] = $data[5]/$pbas/$ein[$nbus]/$ein[$nbus]; $shu[$nsh] = ididx($idxsh[$nsh]); }}# load data PSS/E V29 and V30if ($flag_version != V23) { while (<IN>) { chomp; @data = mysplit($_); last if /^\s*0/; if ($data[5] != 0 || $data[6] != 0) { $npq++; $pqbus[$npq] = extended($data[0]); $pqpl[$npq] = $data[5]/$pbas; $pqql[$npq] = $data[6]/$pbas; $pqu[$npq] = ididx($pqbus[$npq]); } if ($data[7] != 0 || $data[8] != 0 || $data[9] != 0 || $data[10] != 0) { $npl++; $plbus[$npl] = extended($data[0]); $plip[$npl] = $data[7]/$pbas; $pliq[$npl] = $data[8]/$pbas; $plyp[$npl] = $data[9]/$pbas; $plyq[$npl] = $data[10]/$pbas; $plu[$npl] = ididx($plbus[$npl]); } }}# generator data all formats (PSS/E V23 - V29)my (@pvbus,@pvpg,@pvqt,@pvqb,@pvvs,@pvsb,@pvpt,@pvpb);my ($swpg,$swqt,$swqb,$swvs,$swsb,$swpt,$swpb);while (<IN>) { chomp; @data = mysplit($_); last if /^\s*0/; if (extended($data[0]) == $swbus) { $swsb = $data[8]; if ($swsb == 0) { $swsb = $pbas; } $swbus = extended($data[0]); $swpg = $data[2]/$swsb; $swqt = $data[4]/$swsb; $swqb = $data[5]/$swsb; $swvs = $data[6]; $swpt = $data[16]/$swsb; $swpb = $data[17]/$swsb; } else { $npv++; $pvsb[$npv] = $data[8]; if ($pvsb[$npv] == 0) { $pvsb[$npv] = $pbas; } $pvbus[$npv] = extended($data[0]); $pvpg[$npv] = $data[2]/$pvsb[$npv]; $pvqt[$npv] = $data[4]/$pvsb[$npv]; $pvqb[$npv] = $data[5]/$pvsb[$npv]; $pvvs[$npv] = $data[6]; $pvpt[$npv] = $data[16]/$pvsb[$npv]; $pvpb[$npv] = $data[17]/$pvsb[$npv]; $pvu[$npv] = ididx($pvbus[$npv]); }}# branch data PSS/E V29 and V30 (line and transformers # data for PSS/E V23, V24, V25 and V26 data files)my (@busfr,@bustt);my (@rest,@reat,@susc,@ratea,@rateb,@ratec,@phas,@lbas,@ratio); while (<IN>) { chomp; @data = mysplit($_); last if /^\s*0/; $nline++; $busfr[$nline] = extended($data[0]); $bustt[$nline] = extended($data[1]); $stt[$nline] = ididx($busfr[$nline])*ididx($bustt[$nline]); $lbas[$nline] = $pbas; $rest[$nline] = $data[3]; $reat[$nline] = $data[4]; $susc[$nline] = $data[5]; $phas[$nline] = 0; $ratea[$nline] = $data[6]/$pbas; $rateb[$nline] = $data[7]/$pbas; $ratec[$nline] = $data[8]/$pbas; unless ($flag_version <= V24) { $stt[$nline] = $data[13]; } if ($flag_version <= V26) { # this is for PSS/E V23-V26 data files if (/,,,/) { $ratio[$nline] = 0; # additional shunt admittance at "from" bus if ($data[9] != 0 || $data[10] != 0) { $nsh++; $idxsh[$nsh] = extended($data[0]); $psh[$nsh] = $data[9]; $qsh[$nsh] = $data[10]; $shu[$nsh] = ididx($idxsh[$nsh]); } # additional shunt admittance at "to" bus if ($data[11] != 0 || $data[12] != 0) { $nsh++; $idxsh[$nsh] = extended($data[1]); $psh[$nsh] = $data[11]; $qsh[$nsh] = $data[12]; $shu[$nsh] = ididx($idxsh[$nsh]); } $stt[$nline] = $data[13]; } else { $ratio[$nline] = $data[9];
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -