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

📄 psse2psat

📁 一个较好的MATLAB潮流程序
💻
📖 第 1 页 / 共 2 页
字号:
#!/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.0.0##E-mail:    fmilano@thunderbox.uwaterloo.ca#Web-site:  http://thunderbox.uwaterloo.ca/~fmilanouse strict;# -----------------------------------------------------------------------# 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 = 'Generic PSAP 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 = 1;my @data;my (@busidx,@bustype,@busname);my (@ein,@ang,@pag,@prg,@qmi,@qma,@tap,@pac,@prc,@psh,@qsh,@kae,@kzo,@kvb);	    my %kvbase;#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 datamy ($swbus,@idxsh,$nisl,@islbus);$nisl = -1;while (<IN>) {    @data = mysplit($_);    if ($data[0] == 0) { last; }    $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];    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);    }    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 datamy (@plbus,@plip,@pliq,@plyp,@plyq);my (@pqbus,@pqpl,@pqql);while (<IN>) {    @data = mysplit($_);    if ($data[0] == 0) { last; }           if (isidx(int($data[0]))) {next;}    $j = pqidx(int($data[0]));    if ($j) { 	# 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 datamy (@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 (isidx(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) {	    # 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 datamy (@busfr,@bustt);my (@rest,@reat,@susc,@ratea,@rateb,@ratec,@phas,@lbas,@ratio);	    while (<IN>) {    @data = mysplit($_);    if ($data[0] == 0) { last; }        if (isidx(int($data[0])) || isidx(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];    $ratio[$nline] = 0;    $phas[$nline] = 0;    $ratea[$nline] = $data[6]/$pbas;    $rateb[$nline] = $data[7]/$pbas;    $ratec[$nline] = $data[8]/$pbas;    # additional shunt admittance at "from" bus    if ($data[9] != 0 || $data[10] != 0) {	$nsh++;	$idxsh[$nsh] = int($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($data[1]);	$psh[$nsh] = $data[11];		$qsh[$nsh] = $data[12];		    }}# transformer datamy (@data1,@data2,@data3,@data4,@data5);my (@bustw1,@bustw2,@bustw3);my ($ntw,$three_winding);my (@r12,@r23,@r13,@x12,@x23,@x13,@rt1a,@rt1b,@rt1c,    @rt2a,@rt2b,@rt2c,@rt3a,@rt3b,@rt3c);my ($nltc,@ltc_busfr,@ltc_busto,@ltc_busct,@ltc_r,@ltc_dm,    @ltc_x,@ltc_bas,@ltc_vma,@ltc_vmi,@ltc_ctr,@ltc_ref);my ($nphs,@phs_busfr,@phs_busto,@phs_r,@phs_x,@phs_bas,    @phs_vma,@phs_vmi,@phs_ref);$ntw = -1;$nltc = -1;$nphs = -1;while (1) {    # read first line    $three_winding = 0;    $_ = <IN>;    chomp;    @data1 = mysplit($_);    # check for end of transformer data    if ($data1[0] == 0) { last; }        # read second line    $_ = <IN>;    chomp;    @data2 = mysplit($_);    # read third line    $_ = <IN>;    chomp;    @data3 = mysplit($_);    # read fourth line    $_ = <IN>;    chomp;    @data4 = mysplit($_);    # check for three-winding transformers    if (int($data1[2]) != 0) {	$three_winding = 1;	$_ = <IN>;	chomp;	@data5 = mysplit($_);    }    if (isidx(int($data1[0])) || isidx(abs($data1[1]))) {next;}    if ($three_winding == 0) {	#if (abs($data3[6]) == 0 || abs($data3[6]) == 4) {	if (1) {	    # standard transformer	    $nline++;	    $ntr++;	    $busfr[$nline] = int($data1[0]);	    $bustt[$nline] = int($data1[1]);	    if (abs($data3[6]) == 4) {		printf "DC line control for transformer #" . 		    $ntr . " is ignored.\n";		}	    $rest[$nline] = $data2[0];	    $reat[$nline] = $data2[1];	    $susc[$nline] = 0;	    if ($data1[4] == 1) {		$ratio[$nline] = $data4[0];	    } else {		$ratio[$nline] = 1;			    }	    $phas[$nline] = 0.175*$data3[2];	    if ($data1[5] == 1) {		$lbas[$nline] = $pbas;		$ratea[$nline] = $data3[3]/$pbas;		$rateb[$nline] = $data3[4]/$pbas;		$ratec[$nline] = $data3[5]/$pbas;	    } elsif ($data1[5] == 2) {		$lbas[$nline] = $data2[2];		$ratea[$nline] = $data3[3]/$data2[2];		$rateb[$nline] = $data3[4]/$data2[2];		$ratec[$nline] = $data3[5]/$data2[2];	    } else {		$lbas[$nline] = $data2[2];		if ($data3[1] == 0) {		    $j = $kvbase{$busfr[$nline]};		} else {		    $j = $data3[1];				}		$h = $data2[2]*$data2[2]/3/$j/$j;		$rest[$nline] = $rest[$nline]/$h;		$ratea[$nline] = $data3[3]/$data2[2];		$rateb[$nline] = $data3[4]/$data2[2];		$ratec[$nline] = $data3[5]/$data2[2];		    }    	} elsif (abs($data3[6]) == 3) {	    # phase shifting transformer	    $nphs++;	    $phs_busfr[$nphs] = int($data1[0]);	    $phs_busto[$nphs] = int($data1[1]);	    $phs_r[$nphs] = $data2[0];	    $phs_x[$nphs] = $data2[1];	    $phs_vma[$nphs] = 0.175*$data3[8];	    $phs_vmi[$nphs] = 0.175*$data3[9];	    if ($data1[5] == 1) {		$phs_bas[$nphs] = $pbas;	    } elsif ($data1[5] == 2) {		$phs_bas[$nphs] = $data2[2];	    } else {		$phs_bas[$nphs] = $data2[2];		if ($data3[1] == 0) {		    $j = $kvbase{$phs_busfr[$nphs]};		} else {		    $j = $data3[1];				}		$h = $data2[2]*$data2[2]/3/$j/$j;		$phs_r[$nphs] = $phs_r[$nphs]/$h;	    }   		    $phs_ref[$nphs] = 0.5*($data3[10]+$data3[11])/$phs_bas[$nphs];	} elsif (abs($data3[6]) == 1 || abs($data3[6]) == 2) {	    # under load tap changer	    $nltc++;	    $ltc_busfr[$nltc] = int($data1[0]);	    $ltc_busto[$nltc] = int($data1[1]);	    $ltc_busct[$nltc] = int(abs($data3[7]));	    if ($ltc_busct[$nltc] == 0)	    {		$ltc_busct[$nltc] = $ltc_busto[$nltc];		    }	    $ltc_ctr[$nltc] = abs($data3[6]);	    if ($ltc_busct[$nltc] != $ltc_busfr[$nltc] || 		$ltc_busct[$nltc] != $ltc_busto[$nltc]) 	    {		$ltc_ctr[$nltc] = 3;	    	    }	    $ltc_r[$nltc] = $data2[0];	    $ltc_x[$nltc] = $data2[1];	    $ltc_vma[$nltc] = $data3[8];	    $ltc_vmi[$nltc] = $data3[9];	    if (int($data3[12]) == 0) {		$ltc_dm[$nltc] = 0;	    } else {		$ltc_dm[$nltc] = 0; #($data3[8]-$data3[9])/$data3[12];	    }	    $ltc_ref[$nltc] = 0.5*($data3[10]+$data3[11]);	    if ($data1[5] == 1) {		$ltc_bas[$nltc] = $pbas;	    } elsif ($data1[5] == 2) {		$ltc_bas[$nltc] = $data2[2];	    } else {		$ltc_bas[$nltc] = $data2[2];		if ($data3[1] == 0) {		    $j = $kvbase{$ltc_busfr[$nltc]};		} else {		    $j = $data3[1];				}		$h = $data2[2]*$data2[2]/3/$j/$j;

⌨️ 快捷键说明

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