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

📄 psse2psat

📁 这是一个很适合研究和学习用的电力系统仿真软件
💻
📖 第 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
# Update:   24-March-2006 by JC.Morataya@ieee.org
# Version:  1.2.1
#
#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 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 $title1 = 'PSS/E Data Format File '.$ARGV[0];
my $title2 = '   ';
my $pbas = 100;
my $nbus = -1;
my $nline = -1;
my $narea = -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 $cmt = 0;
my $cmtwt = 0;
my $flag_version = V29; # By default, version is supposed to be 29 
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,@stt,@chkcard);
my $stt = '%';
my %kvbase;
my %busidw;
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 " 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 "Openning PSS/E file \"$ARGV[0]\"...\n";
carret();
open(IN,$ARGV[0]) || die "cannot open $ARGV[0]: $!\n";
while (<IN>) {
    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 V > 25 file found...\n"; }
	    $V26_up = 1;
	} else {
	    if ($ncard == 3 && $guess == 0) { print "PSS/E V < 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";

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

$_ = <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>) {
    @data = mysplit($_);
    last if /^\s*0/; 
    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
	if ($data[3] == 3) { $nsw++; $swbus = $data[0]; } 
	if ($data[3] == 4) { 
	    printf "Isolated bus " . $data[0] . " will be ignored.\n";
	}
	
	# 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  
	next if (ididx(int($data[0])));
	$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 V23, V24 and V25 formats
    if (($data[4] != 0  || $data[5] != 0) && $data[3] != 4) {
	$nsh++; 
	$idxsh[$nsh] = int($data[0]);
	$psh[$nsh] = $data[4]/$pbas/$ein[$nbus]/$ein[$nbus];	
	$qsh[$nsh] = $data[5]/$pbas/$ein[$nbus]/$ein[$nbus];	
    }
}

# load data PSS/E V29 and V30
if ($flag_version != V23) {
    while (<IN>) {
	@data = mysplit($_);
	last if /^\s*0/;  
	
	next if (ididx(int($data[0])));
	$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 V23 - V29)
my (@pvbus,@pvpg,@pvqt,@pvqb,@pvvs,@pvsb,@pvpt,@pvpb);
my ($swpg,$swqt,$swqb,$swvs,$swsb,$swpt,$swpb);
while (<IN>) {
    @data = mysplit($_);
    last if /^\s*0/;
    next if (ididx(int($data[0])));  
    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 and V30 (line and transformers 
# data for PSS/E V23, V24 and V25 data files)
my (@busfr,@bustt);
my (@rest,@reat,@susc,@ratea,@rateb,@ratec,@phas,@lbas,@ratio);	    
while (<IN>) {
    @data = mysplit($_);

⌨️ 快捷键说明

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