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

📄 ge2psat

📁 这是一个很适合研究和学习用的电力系统仿真软件
💻
📖 第 1 页 / 共 2 页
字号:
#!/usr/bin/perl -w
# GE2PSAT converts GE data file into PSAT data file
#
# GE2PSAT <OPTIONS> FILEINPUT <FILEOUTPUT>
#
# Author:  Juan Carlos Morataya
# Date:    25-Oct-2005
# Version: 1.0.0
# 
# E-mail:    jmorataya@eegsa.net
#

use strict;

# -----------------------------------------------------------------------
# variable declaration
# -----------------------------------------------------------------------
my $nargin = 0;
my $verbose = 0;
my $helpmsg = 0;
my ($i,$j,$h,$k);

my $nbus = -1;
my $nsw = -1;
my $npv = -1;
my $npq = -1;
my $npl = -1;
my $nsh = -1;
my $nline = -1;
my $ntitle = -1;
my $ncom = -1;
my $trg = -1;
my $ntw = -1;
my $nsvc = -1;
my $zone = 0;

my $pbase;

my ($kvb,$kae,$ein,$ang,);

my ($swbus,$swsb,$swvs,$swqt,
    $swqb,$swpg,$swpb,$swpt);
    
my (@plbus,@plip,@pliq,@plyp,@plyq);
my (@pqbus,@pqpl,@pqql);    

my ($title1,$title2,$ver,);
my $pbas = 100;
my $freq = 60;
my $format;

my (@data,@data1,@data2,@data3);

my $value;

my $bustype;

my (@kvb,@kzo,@kae,@ein,@ang,@bustype,
    @busidx,@busname,@pload,@qload,@qcap,
    @qmi,@qma,@bshunt,@title,@comment,
    @pbtf);
    
my (@pvbus,@pvsb,@pvpg,@pvvs,
    @pvqt,@pvqb,@pvpt,@pvpb);    
    
my (@swidx,@pvidx,@pqidx,@idxsh,
    @vmax,@vmin,@psh,@qsh);

my (@busfr,@bustt);

my (@rest,@reat,@susc,@ratea,@rateb,
    @ratec,@phas,@ratio);	    
    
my (@idxsvc,@svcbus,@svcbma,@svcbmi,
    @svcref,@rgn,@rtc);

my (%kvbase,%zoneid,%phasereg,%phaseshf,%einsch);

my $narea = -1;
my (@areanum,@areaslack,@areaexp,@areatol);


# -----------------------------------------------------------------------
# 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 "\nGE2PSAT converts GE data files into PSAT data files.\n\n";
    print "ge2psat [options] fileinput [fileoutput]\n";
    print "  -v   verbose\n";
    print "  -h   print this help and exit\n\n";
    print "Author:   Juan Carlos Morataya\n";
    print "Date:     25-Oct-2005\n";
    print "Version:  1.0.0\n\n";
    print "E-mail:   jmorataya\@eegsa.net\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 input data file
# -----------------------------------------------------------------------
print "Opening GE data file \"$ARGV[0]\"...\n";
carret();
open(IN,$ARGV[0]) || die "cannot open $ARGV[0]: $!\n";

# -----------------------------------------------------------------------
# scan data file
# -----------------------------------------------------------------------

# read title
while (<IN>) {
    chomp;
    if (/^title/) { next; }
    if (/^!/) { last; }
    $ntitle++;
    $title[$ntitle] = $_;
}

# read comments
while (<IN>) {
    chomp;
    if (/^comments/) { next; }
    if (/^!/) { last; }
    $ncom++;
    $comment[$ncom] = $_;
}

# read solution parameters
while (<IN>) {
    chomp;
    if (/^!/) { last; }
    if (/^sbas/) { 
	@data = mysplit0($_);
	$pbas = $data[1]; 
    }
}

# read bus data
while (<IN>) {
    chomp;
    if (/^bus/) { next; }
    if (/^branch/) { last; }
    @data = mysplit($_);
    $nbus++;
    $busidx[$nbus] = $data[0];
    $busname[$nbus] = $data[1];
    $kvb[$nbus] = $data[2];
    $bustype[$nbus] = $data[3];
    $ein[$nbus] = $data[5];
    $ang[$nbus] = $data[6];
    $kae[$nbus] = $data[7];
    $kzo[$nbus] = $data[8]; 
    $vmax[$nbus] = $data[9];
    $vmin[$nbus] = $data[10];
    $kvbase{$busidx[$nbus]} = $kvb[$nbus];
    $einsch{$busidx[$nbus]} = $ein[$nbus]; 
    if ($data[3] == 0) { $nsw++; $swbus = $data[0]; } 
}

# read branch data
while (<IN>) {
    chomp;
    # read first line
    my $branch_data = 0;
    if (/^transformer/) { last; }
    @data1 = mysplit($_); 
      
    # read second line
    $_ = <IN>;
    chomp;
    @data2 = mysplit($_);
    
    if ($branch_data == 0) { 
	if ($data1[9] == 1) {
	    $nline++;
	    $busfr[$nline] = $data1[0];
	    $bustt[$nline] = $data1[3];
	    $rest[$nline] = $data1[10];
	    $reat[$nline] = $data1[11];
	    $susc[$nline] = $data1[12];
	    $ratea[$nline] = $data1[13]/$pbas;
	    $rateb[$nline] = $data1[14]/$pbas;
	    $ratec[$nline] = $data1[15]/$pbas;
	    $ratio[$nline] = 0;
	    $phas[$nline] = 0;
	}
    }
}

# read transformer data
while (<IN>) {
    chomp;
    if (/^generator/) { last; }
    # read first line
    @data1 = mysplit($_); 
    
    # read second line
    $_ = <IN>;
    chomp;
    @data2 = mysplit($_);
    
    # read third line
    $_ = <IN>;
    chomp;
    @data3 = mysplit($_); 
  
    if ($data1[8] == 1) {
	$nline++;
	$busfr[$nline] = $data1[0];
	$bustt[$nline] = $data1[3];
	$rest[$nline]  = $data1[23];
	$reat[$nline]  = $data1[24];
	$susc[$nline]  = 0;
	$ratio[$nline] = $data2[16];
	$phas[$nline]  = 0;
	if ($data1[19] != $pbas && $data1[19] != 0) { 
	    $pbtf[$nline] = $data1[19]; 
	} else { 
	    $pbtf[$nline] = $pbas; 
	}
	$ratea[$nline] = $data2[6]/$pbtf[$nline];
	$rateb[$nline] = $data2[7]/$pbtf[$nline];
	$ratec[$nline] = $data2[8]/$pbtf[$nline];
    }
}

# read generator data
while (<IN>) {
    chomp;
    if (/^load/) { last; }

    # read first line
    @data1 = mysplit($_); 
    
    # read second line
    $_ = <IN>;
    ## second line is not need for now ...
    # chomp;
    # @data2 = mysplit($_);
    
    if ($data1[5] == 1) {    
	if ($data1[0] == $swbus) {
	    $swsb = $data1[19]; 
	    if ($swsb == 0) { $swsb = $pbas; } 
	    $swbus = $data1[0];            
	    $swpg = $data1[13]/$swsb; 
	    $swpt = $data1[14]/$swsb;
	    $swpb = $data1[15]/$swsb;           
	    $swqt = $data1[17]/$swsb;
	    $swqb = $data1[18]/$swsb;
	    $swvs = $einsch{$swbus};
	} else {
	    $npv++;
	    $pvsb[$npv] = $data1[19];
	    if ($pvsb[$npv] == 0) { $pvsb[$npv] = $pbas; }
	    $pvbus[$npv] = $data1[0];
	    $pvpg[$npv] = $data1[13]/$pvsb[$npv];
	    $pvqt[$npv] = $data1[17]/$pvsb[$npv];
	    $pvqb[$npv] = $data1[18]/$pvsb[$npv];
	    $pvvs[$npv] = $einsch{$pvbus[$npv]};
	    $pvpt[$npv] = $data1[14]/$pvsb[$npv];
	    $pvpb[$npv] = $data1[15]/$pvsb[$npv];
	}
    }   
}

# read load data
while (<IN>) {
    chomp;
    if (/^shunt/) { last; }

    @data = mysplit($_);
    if ($data[5] == 1) {
	$npq++;
	$pqbus[$npq] = $data[0];
	$pqpl[$npq] = $data[6]/$pbas;
	$pqql[$npq] = $data[7]/$pbas;	
	if ($data[8] != 0  || $data[9]  != 0 || 
	    $data[10] != 0 || $data[11] != 0) {
	    $npl++;
	    $plbus[$npl] = $data[0];
	    $plip[$npl] = $data[8]/$pbas;
	    $pliq[$npl] = $data[9]/$pbas;
	    $plyp[$npl] = $data[10]/$pbas;
	    $plyq[$npl] = $data[11]/$pbas;
	}
    }
}

# read shunt data
while (<IN>) {
    chomp;
    if (/^svd/) { last; }

    @data = mysplit($_);
    if ($data[10] == 1) {
	if ($data[13] != 0 || $data[14] != 0) {
	    $nsh++;
	    $idxsh[$nsh] = $data[0];
	    $psh[$nsh] = $data[13];	
	    $qsh[$nsh] = $data[14];		    
	}
    }
}

# read svc data
while (<IN>) {
    chomp;
    if (/^area/) { last; }
    
    # read first line
    @data1 = mysplit($_); 
    
    # read second line
    $_ = <IN>;
    chomp;
    @data2 = mysplit($_);
    
    $j = pvidx($data1[0]);
    # add SVC only if there is no PV at the same bus
    if ($j >= 0) {
	printf "SVC at PV bus " . $data1[0] . " will be ignored.\n" ;
	
    } else { 
	
	if ($data1[5] == 1) { 
	    $nsvc++;
	    $idxsvc[$nsvc] = $data1[0];
	    if ($data1[17] != 0) { $svcbmi[$nsvc] = $data1[17]; 
			       } else { $svcbmi[$nsvc] = -1; }
	    if ($data1[18] != 0) { $svcbma[$nsvc] = $data1[18]; 
			       } else { $svcbma[$nsvc] = 1; }
	    $rgn[$nsvc] = $data2[2];
	    $rtc[$nsvc] = $data2[3];
	    
	    # add PV generator to initialize SVC component
	    $npv++;
	    $pvsb[$npv] = $pbas;
	    $pvbus[$npv] = $data1[0];
	    $pvpg[$npv] = 0;
	    $pvqt[$npv] = 99;
	    $pvqb[$npv] = -99;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -