📄 neplan2psat
字号:
#!/usr/bin/perl -w
# NEPLAN2PSAT converts NEPLAN data file into PSAT data file
#
# NEPLAN2PSAT <OPTIONS> FILEINPUT <FILEOUTPUT>
#
# Author: Federico Milano
# Date: 30-May-2005
# Version: 1.0.0
#
#E-mail: fmilano@thunderbox.uwaterloo.ca
#Web-site: http://thunderbox.uwaterloo.ca/~fmilano
use strict;
# -----------------------------------------------------------------------
# variable declaration
# -----------------------------------------------------------------------
my $tab = 0;
my %busname;
my %busnumb;
my %genname;
my @list;
my (@idxpv, @idxsw, @idxpq, @idxsh);
my $nargin;
my $verbose = 0;
my $helpmsg = 0;
my $colasadd = 0;
my $addfile = 0;
my ($i,$h,$k,$j);
my $format;
my $n = 0;
my $npv = -1;
my $nsw = -1;
my $npq = -1;
my $npl = -1;
my $nsh = -1;
my $ntw = -1;
my $ngen = 1;
my $pbas = 100;
my $nbus = -1;
my $nline = -1;
my $narea = -1;
my $flag_bus = 0;
my $flag_line = 0;
my $flag_area = 0;
my $flag_trsf = 0;
my $flag = 1;
my $key;
my $value;
my $add;
my $unit;
my $length;
my $zn;
my @data;
my @busidx;
my (@vn,@ein,@ang,@pag,@prg,@qmi,@qma,@pac,@prc,@psh,@qsh,@vmax,@vmin,@switch);
my (@kvbase,@busfr,@busto,@rest,@reat,@susc,@tap,@phi,@imax,@kt,@sbase);
my (@kvsh,@bsh,@gsh);
my (@r12,@r23,@r13,@x12,@x23,@x13,@twbus1,@twbus2,@twbus3);
my (@twkv1,@twkv2,@twkv3,@twtap,@twbase);
# -----------------------------------------------------------------------
# check inputs
# -----------------------------------------------------------------------
$nargin = @ARGV;
$nargin || die "Error: No input data file.\n";
my $title1 = 'Generic NEPLAN Data Format File '.$ARGV[0];
my $title2 = ' ';
# -----------------------------------------------------------------------
# check options
# -----------------------------------------------------------------------
while ($ARGV[0] =~ /^-/) {
if ($ARGV[0] =~ /v/) {$verbose = 1;}
if ($ARGV[0] =~ /h/) {$helpmsg = 1;}
if ($ARGV[0] =~ /a/) {
$colasadd = 1;
$addfile = $ARGV[1];
@ARGV = @ARGV[0, 2 .. $#ARGV];
$nargin--;
}
shift(@ARGV);
$nargin--;
if ($nargin == 0) {
last;
}
}
# -----------------------------------------------------------------------
# help (if requested)
# -----------------------------------------------------------------------
if ($helpmsg) {
print "\nNEPLAN2PSAT converts NEPLAN 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: 30-May-2005\n";
print "Version: 1.0.0\n\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*_*/d_/;
$ARGV[1] =~ s/[^\w\.]/_/g;
$ARGV[1] =~ s/\..+$/.m/;
} elsif ($nargin == 0) {
die "Error: Input file name is missing.\n";
}
# -----------------------------------------------------------------------
# open NDT data file
# -----------------------------------------------------------------------
print "Opening NEPLAN NDT file \"$ARGV[0]\"...\n";
carret();
open(IN,$ARGV[0]) || die "cannot open $ARGV[0]: $!\n";
# -----------------------------------------------------------------------
# scan input data file
# -----------------------------------------------------------------------
# read identification data
$_ = <IN>; # discard first line
if ($_ =~ /;/) {
$tab = ';';
} elsif ($_ =~ /\t/) {
$tab = '\t';
} elsif ($_ =~ /,/) {
$tab = ',';
} else {
die "Unknown separator in .ndt file";
}
@list = split(/$tab/);
while (<IN>) {
chomp;
if ($tab ne ',') {
$_ =~ s/,/\./g;
}
@data = split(/$tab/);
# build index of buses
# -------------------------------------------------------------------
$add = 1;
while ( ($key, $value) = each(%busname) ) {
if ($key eq $data[0]) {
$add = 0;
}
}
if ($add) {
$nbus++;
$busidx[$nbus] = $nbus+1;
$busname{$data[0]} = $nbus;
}
# determine bus type and save data
# -------------------------------------------------------------------
$value = $busname{$data[0]};
$vmax[$value] = $data[6]/100;
$vmin[$value] = $data[5]/100;
if (not $ein[$value]) {
$ein[$value] = $data[7]/100;
}
$ang[$value] = 0;
$qma[$value] = 0;
$qmi[$value] = 0;
if ($data[22] eq "T") {
$switch[$value] = 1;
} elsif ($data[22] eq "F") {
$switch[$value] = 0;
}
# This is to avoid multiple slack buses in the same network
if ($nsw == 0 and $data[1] eq "SL") {
$data[1] = "PV";
}
# This is to avoid multiple PV generators at the same bus
if ($genname{$data[0]}) {
$data[1] = "PQ";
}
# This is to avoid multiple PQ loads at the same bus
if ($pac[$value] or $prc[$value]) {
if (!$data[3]) {$data[3] = 0;}
$pac[$value] += $data[3]/$pbas;
if (!$data[4]) {$data[4] = 0;}
$prc[$value] += $data[4]/$pbas;
$data[1] = "NOTHING";
}
if ($data[1] eq "SL") {
$nsw++;
$ngen++;
$genname{$data[0]} = $ngen-1;
$idxsw[$nsw] = $value;
if ($data[10] and $data[3]) {
$pag[$value] = -$data[10]*$data[3]/$pbas;
} else {
$pag[$value] = 0;
}
if ($data[21] == 0) {
$ein[$value] = $data[7]/100;
} else {
$ein[$value] = $data[21]/100;
}
$ang[$value] = 0;
} elsif ($data[1] eq "PV") {
$npv++;
$ngen++;
$genname{$data[0]} = $ngen-1;
$idxpv[$npv] = $value;
$pag[$value] = -$data[10]*$data[3]/$pbas;
$ein[$value] = $data[21]/100;
} elsif ($data[1] eq "PQ") {
if (!$data[3]) {$data[3] = 0;}
$pac[$value] = $data[3]/$pbas;
if (!$data[4]) {$data[4] = 0;}
$prc[$value] = $data[4]/$pbas;
if ($pac[$value] != 0 or $prc[$value] != 0) {
$npq++;
$idxpq[$npq] = $value;
$pac[$value] = $data[10]*$data[3]/$pbas;
$prc[$value] = $data[10]*$data[4]/$pbas;
}
} elsif ($data[1] eq "NOTHING") {
# nothing to do ...
} else {
print "Conversion from bus type " . $data[1] . "is not supported.";
}
}
# -----------------------------------------------------------------------
# close NDT data file
# -----------------------------------------------------------------------
close(IN) || die "cannot close $ARGV[0]: $!\n";
# -----------------------------------------------------------------------
# open EDT data file
# -----------------------------------------------------------------------
if (!$addfile) {
$addfile = $ARGV[0];
$addfile =~ s/\.ndt$/\.edt/;
}
print "Opening NEPLAN EDT file \"$addfile\"...\n";
open(IN,$addfile) || die "cannot open $addfile: $!\n";
# -----------------------------------------------------------------------
# scan input data file
# -----------------------------------------------------------------------
# read identification data
$_ = <IN>; # discard first line
if ($_ =~ /;/) {
$tab = ';';
} elsif ($_ =~ /\t/) {
$tab = '\t';
} elsif ($_ =~ /,/) {
$tab = ',';
} else {
die "Unknown separator in .edt file";
}
@list = split(/$tab/);
while (<IN>) {
chomp;
if ($tab ne ',') {
$_ =~ s/,/\./g;
}
@data = split(/$tab/);
if ($data[0] == 1) { # transmission line
$nline++;
addbus($data[5]);
$busfr[$nline] = $busname{$data[5]}+1;
$vn[$busname{$data[5]}] = $data[12];
addbus($data[6]);
$busto[$nline] = $busname{$data[6]}+1;
$vn[$busname{$data[6]}] = $data[12];
$sbase[$nline] = $pbas;
$kvbase[$nline] = $data[12];
$unit = $data[35]; # 1 => Ohm/km
# 2 => Ohm/mile
# 3 => Ohm/ 1000 feet
$length = $data[31];
$zn = $data[12]*$data[12]/$pbas;
if ($unit == 1 or $unit == 2 or $unit == 3) {
$reat[$nline] = $length*$data[19]/$zn;
$rest[$nline] = $length*$data[22]/$zn;
$susc[$nline] = $zn*$length*$data[25]/1000000;
} else {
print "* * * Unknown units for line length. Guessing [p.u.]\n";
$reat[$nline] = $data[19];
$rest[$nline] = $data[22];
$susc[$nline] = $data[25];
}
$kt[$nline] = 0;
$tap[$nline] = 1;
$phi[$nline] = 0;
$imax[$nline] = 1.7320508*$data[12]*$data[18]/$pbas/1000;
} elsif ($data[0] == 2) { # coupling transmission line
$nline++;
addbus($data[5]);
addbus($data[6]);
$busfr[$nline] = $busname{$data[5]}+1;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -