⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 simpow2psat

📁 用于电力系统的一个很好的分析软件
💻
📖 第 1 页 / 共 3 页
字号:
#!/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 + -