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

📄 psse2psat

📁 电力系统的psat
💻
📖 第 1 页 / 共 3 页
字号:
#!/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
# Version: 1.2.0
#
#E-mail:    fmilano@thunderbox.uwaterloo.ca
#Web-site:  http://thunderbox.uwaterloo.ca/~fmilano

use strict;
use constant V23 => 23;
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 $n = 0;
my $npv = -1;
my $nsw = -1;
my $npq = -1;
my $npl = -1;
my $nsh = -1;
my $ntr = -1;
#my (@idxpv, @idxsw, @idxpq, @idxsh);
my $title1 = 'PSS/E Data Format File '.$ARGV[0];
my $title2 = '   ';
my $pbas = 100;
#my $iter = 20;
#my $toler = 0.0001;
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_version = V29; # By default, version is supposed to be 29 
my $flag = 1;
my @data;
my (@busidx,@bustype,@busname);
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);
my %kvbase;
my %busidw;
#my (@busfr,@busto);
#my (@rest,@reat,@susc,@tfas,@tfmi,@tfma,@phsf,@nbci,@cano,@caem,@sbas);	    
my (@areaidx,@areabus,@areaexp,@areaint,@areaname,@areaload,@arealoss);

# -----------------------------------------------------------------------
# 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 "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_/;
    $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";
}

# -----------------------------------------------------------------------
# open input data file
# -----------------------------------------------------------------------
print "Opening 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]) {$pbas = deblank($data[1]);}  # assign system base

$_ = <IN>;
chomp;
$title1 = $_;  # 1st header line

$_ = <IN>;
chomp;
$title2 = $_;  # 2nd header line

# bus data PSS/E V26, V29 
my ($swbus,@idxsh,$nisl,@islbus); 
my $pti = 0;
$nisl = -1;
while (<IN>) {
    
    @data = mysplit($_);
    if ($data[0] == 0) { last; } 
    if ($nbus < 0) {
	$pti = index "$_" , '\'';
	if ($pti > 20) { # data in PSS/E V23 format
	    $flag_version = V23;
	} 
    }
    if ($flag_version != V23) {
	$nbus++;
	$busidx[$nbus] = int($data[0]);
	$bustype[$nbus] = $data[3];
	$busname[$nbus] = $data[1];
	$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
	#print "$busidw{542}\n";
	if ($data[3] == 3) { $nsw++; $swbus = $data[0]; } 
	if ($data[3] == 4) { 
	    printf "Isolated bus " . $data[0] . " will be ignored.\n";
	    #printf "Bus " . $data[0] . " is an isolated bus.\n";
	    #$nbus--;
	    #$nisl++;
	    #$islbus[$nisl] = int($data[0]);	
	    #pop(@busidx);
	    #pop(@bustype);
	    #pop(@busname);
	    #pop(@kvb);
	    #pop(@ein);
	    #pop(@kae);
	    #pop(@kzo);
	    #pop(@ang);
	}
	
# bus data V23 format    
    } else { 
	$nbus++;
	$busidx[$nbus] = int($data[0]);
	$bustype[$nbus] = $data[1];
	$busname[$nbus] = $data[9];
	$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 identified warnings
	if ($data[1] == 3) { $nsw++; $swbus = $data[0]; } 
	if ($data[1] == 4) { 
	    printf "Isolated bus " . $data[0] . " will be ignored.\n";
	}
	
# load data V23 format  
	if (ididx(int($data[0]))) {next;} 
	$j = pqidx(int($data[0])); 
	if ($j >= 0) { 
	    # add powers if there are multiple 
	    # PQ loads at the same bus
	    $pqpl[$j] += $data[2]/$pbas;
	    $pqql[$j] += $data[3]/$pbas;
	} else {
	    $npq++;
	    $pqbus[$npq] = int($data[0]);
	    $pqpl[$npq] = $data[2]/$pbas;
	    $pqql[$npq] = $data[3]/$pbas;	
	}
    }	    
    
# shunt data V26 and V23 formats
    if (($data[4] != 0  || $data[5] != 0) && $data[3] != 4) {
	$nsh++; 
	$idxsh[$nsh] = int($data[0]);
	$psh[$nsh] = $data[4]/$pbas;	
	$qsh[$nsh] = $data[5]/$pbas;	
    }
}
# load data PSS/E V29
if ($flag_version != V23) {
    while (<IN>) {
	@data = mysplit($_);
	if ($data[0] == 0) { last; }  
	if (ididx(int($data[0]))) {next;} 
	
	$j = pqidx(int($data[0])); 
	if ($j >= 0) { 
	    # add powers if there are multiple 
	    # PQ loads at the same bus
	    $pqpl[$j] += $data[5]/$pbas;
	    $pqql[$j] += $data[6]/$pbas;
	} else {
	    $npq++;
	    $pqbus[$npq] = int($data[0]);
	    $pqpl[$npq] = $data[5]/$pbas;
	    $pqql[$npq] = $data[6]/$pbas;	
	}
	if ($data[7] != 0 || $data[8] != 0 || 
	    $data[9] != 0 || $data[10] != 0) {	
	    $npl++;
	    $plbus[$npl] = int($data[0]);
	    $plip[$npl] = $data[7]/$pbas;
	    $pliq[$npl] = $data[8]/$pbas;
	    $plyp[$npl] = $data[9]/$pbas;
	    $plyq[$npl] = $data[10]/$pbas;
	}
    }
}

# generator data all formats (PSS/E V26, V29)
my (@pvbus,@pvpg,@pvqt,@pvqb,@pvvs,@pvsb,@pvpt,@pvpb);
my ($swpg,$swqt,$swqb,$swvs,$swsb,$swpt,$swpb);
while (<IN>) {
    
    @data = mysplit($_);
    if ($data[0] == 0) { last; }  
    if (ididx(int($data[0]))) {next;}  
    
    if ($data[0] == $swbus) {
	$swsb = $data[8]; 
	if ($swsb == 0) { $swsb = $pbas; } 
	$swbus = int($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 {
	$j = pvidx(int($data[0]));
	if ($j >= 0) { 
	    # add powers if there are multiple 
	    # PV generators at the same bus
	    $pvpg[$j] += $data[2]/$pvsb[$j];
	    $pvqt[$j] += $data[4]/$pvsb[$j];
	    $pvqb[$j] += $data[5]/$pvsb[$j];
	    $pvpt[$j] += $data[16]/$pvsb[$j];
	    $pvpb[$j] += $data[17]/$pvsb[$j];	    
	} else { 
	    $npv++;
	    $pvsb[$npv] = $data[8];
	    if ($pvsb[$npv] == 0) { $pvsb[$npv] = $pbas; }
	    $pvbus[$npv] = int($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];
	}
    }
}

# branch data PSS/E V29 (line and transformers data for PSS/E V26 and V23 data files)
my (@busfr,@bustt);
my (@rest,@reat,@susc,@ratea,@rateb,@ratec,@phas,@lbas,@ratio);	    
while (<IN>) {

    @data = mysplit($_);
   
    if ($data[0] == 0) { last; }    
    if (ididx(int($data[0])) || ididx(abs($data[1]))) {next;} 
                                                              
    $nline++;
    $busfr[$nline] = int($data[0]);
    $bustt[$nline] = abs($data[1]);
    $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;                         
    #$ratio[$nline] = 0; 
    if ($flag_version == V26 || $flag_version == V23) {
        # this is for PSS/E V26 and V23 data files
	if (/,,,/) {           
	    $ratio[$nline] = 0;
	    # additional shunt admittance at "from" bus
	    if ($data[9] != 0 || $data[10] != 0) { 
		$nsh++;
		$idxsh[$nsh] = int(abs($data[0])); 
		$psh[$nsh] = $data[9];	
		$qsh[$nsh] = $data[10];		
	    }
	    # additional shunt admittance at "to" bus
	    if ($data[11] != 0 || $data[12] != 0) {
		$nsh++;
		$idxsh[$nsh] = int(abs($data[1]));
		$psh[$nsh] = $data[11];	
		$qsh[$nsh] = $data[12];		
            }	       
	} else {
	    $ratio[$nline] = $data[9];
	}
    } else {
	$ratio[$nline] = 0; 
	if ($data[9] != 0 || $data[10] != 0) { 
	    $nsh++;
	    $idxsh[$nsh] = int($data[0]);
	    $psh[$nsh] = $data[9];	
	    $qsh[$nsh] = $data[10];		
	}

⌨️ 快捷键说明

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