📄 odm2psat
字号:
$narea++; $areaname[$narea] = $area->{"pss:areaName"}; $areanum[$narea] = $area->{"pss:areaNumber"}; # default values $areaslack[$narea] = $swidx[0]+1; $areaexp[$narea] = 0; $areatol[$narea] = 0; if (defined($area->{"pss:swingBus"})) { $areaslack[$narea] = $busid{$area->{"pss:swingBus"}->{"pss:idRef"}}+1; } if (defined($area->{"pss:interchangePowerUnit"})) { if ($area->{"pss:interchangePowerUnit"} eq "MW") { $areaexp[$narea] = $area->{"pss:interchangePower"}/$pbas; $areatol[$narea] = $area->{"pss:interchangeErrTolerance"}/$pbas; } elsif ($area->{"pss:interchangePowerUnit"} eq "PU") { $areaexp[$narea] = $area->{"pss:interchangePower"}; $areatol[$narea] = $area->{"pss:interchangeErrTolerance"}; } } elsif (defined($area->{"pss:interchangePower"}->{"pss:unit"})) { if ($area->{"pss:interchangePower"}->{"pss:unit"} eq "MW") { $areaexp[$narea] = $area->{"pss:interchangePower"}->{"pss:p"}/$pbas; $areatol[$narea] = $area->{"pss:interchangeErrTolerance"}/$pbas; } elsif ($area->{"pss:interchangePower"}->{"pss:unit"} eq "PU") { $areaexp[$narea] = $area->{"pss:interchangePower"}->{"pss:p"}; $areatol[$narea] = $area->{"pss:interchangeErrTolerance"}; } }}# -----------------------------------------------------------------------# zone data# -----------------------------------------------------------------------for $temp ( @{$data->{"pss:baseCase"}->{"pss:lossZoneList"}->{"pss:lossZone"}} ) { $nzone++; $zonename[$nzone] = $temp->{"pss:zoneName"}; $zonenum[$nzone] = $temp->{"pss:zoneNumber"};}# -----------------------------------------------------------------------# case information# -----------------------------------------------------------------------$title1 = $data->{"pss:baseCase"}->{"pss:id"};$title1 =~ s/_/ /g;$title2 = "Case: " . ($nbus+1) . "-bus " . ($nline+1) . "-line system.";$title3 = "Date: " . $date;$title4 = "Originator: " . $originator;if (defined($data->{"pss:baseCase"}->{"pss:nvPairList"})) { for $temp ( @{$data->{"pss:baseCase"}->{"pss:nvPairList"}->{"pss:nvPair"}} ) { $nvpair{$temp->{"pss:name"}} = $temp->{"pss:value"}; } if (defined($nvpair{Season})) { $season = $nvpair{Season}; } if (defined($nvpair{Year})) { $year = $nvpair{Year}; } if (defined($nvpair{Date})) { $date = $nvpair{Date}; } if (defined($nvpair{"Originator Name"})) { $originator = $nvpair{"Originator Name"}; } if (defined($nvpair{"Case Identification"})) { $id = $nvpair{"Case Identification"}; } $title2 = "Case:" . $id . ", " . $year . " " . $season . " (" . ($nbus+1) . "-bus " . ($nline+1) . "-line system)"; $title3 = "Date: " . $date; $title4 = "Originator: " . $originator;}# -----------------------------------------------------------------------# open output data file# -----------------------------------------------------------------------print "Writing PSAT file \"$ARGV[1]\"...\n";open(OUT,">$ARGV[1]") || die "cannot open $ARGV[1]: $!\n";# -----------------------------------------------------------------------# write output data file# -----------------------------------------------------------------------print OUT "% File generated by PSAT from ODM data file. \n";print OUT "% "."-" x 78 . "\n";print OUT "% Author: Federico Milano\n";print OUT "% E-mail: Federico.Milano\@uclm.es \n";print OUT "% "."-" x 78 . "\n";print OUT "% $title1 \n";print OUT "% $title2 \n";unless ($date eq "unknown") { print OUT "% $title3 \n"; }unless ($originator eq "unknown") { print OUT "% $title4 \n"; }print OUT "\n";# -----------------------------------------------------------------------# write Bus.con# -----------------------------------------------------------------------if ($nbus >= 0) { $format = "%4d %7.2f %8.5f %8.5f %2d %2d;\n"; print OUT "Bus.con = [ ...\n"; for ($i = 0; $i <= $nbus; $i++) { printf OUT $format,$i+1,$buskv[$i],$busvol[$i], $busang[$i],$area[$i],$zone[$i]; } printf OUT " ];\n\n";}# -----------------------------------------------------------------------# write SW.con# -----------------------------------------------------------------------if ($nsw >= 0) { print OUT "SW.con = [ ...\n"; $format = "%4d $pbas %7.2f " . "%8.5f " x 7 . " 1 1 1;\n"; for ($i = 0; $i <= $nsw; $i++) { $h = $swidx[$i]; printf OUT $format,$h+1,$buskv[$h],$busvol[$h],$busang[$h], $qswmax[$i],$qswmin[$i],$vmax[$h],$vmin[$h],$psw[$i]; } printf OUT " ];\n\n";} # -----------------------------------------------------------------------# write PV.con# -----------------------------------------------------------------------if ($npv >= 0) { print OUT "PV.con = [ ...\n"; $format = "%4d $pbas %7.2f " . "%8.5f " x 6 . " 1 1;\n"; for ($i = 0; $i <= $npv; $i++) { $h = $pvidx[$i]; printf OUT $format,$h+1,$buskv[$h],$pgen[$i], $busvol[$h],$qmax[$i],$qmin[$i],$vmax[$h],$vmin[$h]; } printf OUT " ];\n\n";}# -----------------------------------------------------------------------# write PQgen.con# -----------------------------------------------------------------------if ($npqgen >= 0) { print OUT "PQgen.con = [ ...\n"; $format = "%4d $pbas %7.2f " . "%8.5f " x 4 . " 1 1;\n"; for ($i = 0; $i <= $npqgen; $i++) { $h = $pqgenidx[$i]; printf OUT $format,$h+1,$buskv[$h],$ppqgen[$i], $qpqgen[$i],$vmax[$h],$vmin[$h]; } printf OUT " ];\n\n";}# -----------------------------------------------------------------------# write PQ.con# -----------------------------------------------------------------------if ($npq >= 0) { print OUT "PQ.con = [ ...\n"; $format = "%4d $pbas %7.2f " . "%8.5f " x 4 . " 1 1;\n"; for ($i = 0; $i <= $npq; $i++) { $h = $pqidx[$i]; printf OUT $format,$h+1,$buskv[$h],$pload[$i], $qload[$i],$vmax[$h],$vmin[$h]; } printf OUT " ];\n\n";}# -----------------------------------------------------------------------# write Shunt.con# -----------------------------------------------------------------------if ($nsh >= 0) { print OUT "Shunt.con = [ ...\n"; $format = "%4d %7.2f %7.2f $fbas %8.5f %8.5f 1;\n"; for ($i = 0; $i <= $nsh; $i++) { $h = $shidx[$i]; printf OUT $format,$h+1,$shsb[$i],$shvb[$i],$pcap[$i],$qcap[$i]; } printf OUT " ];\n\n";}# -----------------------------------------------------------------------# write Line.con# -----------------------------------------------------------------------if ($nline >= 0) { print OUT "Line.con = [ ...\n"; $format = "%4d %4d %7.2f %7.2f $fbas 0 " . "%8.5f " x 7 . " 0 0 1;\n"; for ($i = 0; $i <= $nline; $i++) { printf OUT $format,$busfr[$i]+1,$busto[$i]+1,$linesb[$i], $linevb[$i],$kt[$i],$rline[$i],$xline[$i],$bshunt[$i], $tap[$i],$phs[$i],$imax[$i]; } printf OUT " ];\n\n";} # -----------------------------------------------------------------------# write Areas.con# -----------------------------------------------------------------------if ($narea >= 0) { print OUT "Areas.con = [ ...\n"; $format = "%4d %4d $pbas %8.5f %8.5f 0 0 0;\n"; for ($i = 0; $i <= $narea; $i++) { printf OUT $format, $areanum[$i],$areaslack[$i], $areaexp[$i],$areatol[$i]; } printf OUT " ];\n\n"; }# -----------------------------------------------------------------------# write Regions.con# -----------------------------------------------------------------------if ($nzone >= 0) { print OUT "Regions.con = [ ...\n"; $format = "%4d 0 $pbas 0 0 0 0 0;\n"; for ($i = 0; $i <= $nzone; $i++) { printf OUT $format, $zonenum[$i]; } printf OUT " ];\n\n"; }# -----------------------------------------------------------------------# write bus names# -----------------------------------------------------------------------$nbus >= 0 && print OUT "Bus.names = { ...\n";$h = ($nbus+1) % 5;if ($h == 0) {$h = 5;}if (($nbus+1) > 5) { for ($i = 0; $i <= $nbus-$h; $i+=5) { print OUT " '$busname[$i]'; '$busname[$i+1]'; " . "'$busname[$i+2]'; '$busname[$i+3]'; '$busname[$i+4]';\n"; }}print OUT " ";for ($i = $nbus-$h+1; $i <= $nbus-1; $i++) { print OUT "'$busname[$i]'; ";}print OUT "'$busname[$nbus]'};\n\n";# -----------------------------------------------------------------------# write area names# -----------------------------------------------------------------------$nzone >= 0 && print OUT "Areas.names = { ...\n";for ($i = 0; $i <= $nzone-1; $i++) { print OUT " '$zonename[$i]';\n";}$nzone >= 0 && print OUT " '$zonename[$nzone]'};\n\n";# -----------------------------------------------------------------------# write region names# -----------------------------------------------------------------------$narea >= 0 && print OUT "Regions.names = { ...\n";for ($i = 0; $i <= $narea-1; $i++) { print OUT " '$areaname[$i]';\n";}$narea >= 0 && print OUT " '$areaname[$narea]'};\n\n";# -----------------------------------------------------------------------# close output data file# -----------------------------------------------------------------------close(OUT) || die "cannot close $ARGV[1]: $!\n";print "Conversion completed.\n";# -----------------------------------------------------------------------# function for adding a shunt admittance element# -----------------------------------------------------------------------sub addshunt { my $h = $_[0]; $shidx[++$nsh] = $_[1]; # default values $pcap[$nsh] = 0; $qcap[$nsh] = 0; if ($h->{"pss:unit"} eq "PU") { $pcap[$nsh] = $h->{"pss:g"}; $qcap[$nsh] = $h->{"pss:b"}; } elsif ($h->{"pss:unit"} eq "MICROMHO") { my $base = $_[3]*$_[3]/$_[2]; $pcap[$nsh] = $base*$h->{"pss:g"}/1000000; $qcap[$nsh] = $base*$h->{"pss:b"}/1000000; } $shsb[$nsh] = $_[2]; $shvb[$nsh] = $_[3]; }# -----------------------------------------------------------------------# function for determining branch ratings# -----------------------------------------------------------------------sub ratings { my $h = $_[0]; if (defined($h->{"pss:ratingData"})) { my $j = $h->{"pss:ratingData"}; if (defined($j->{"pss:fromRatedVoltage"})) { if ($j->{"pss:fromRatedVoltage"}->{"pss:unit"} eq "KV") { $linevb[$nline] = $j->{"pss:fromRatedVoltage"}->{"pss:voltage"}; } elsif ($j->{"pss:fromRatedVoltage"}->{"pss:unit"} eq "VOLT") { $linevb[$nline] = $j->{"pss:fromRatedVoltage"}->{"pss:voltage"}/1000; } } if (defined($j->{"pss:toRatedVoltage"})) { if ($j->{"pss:toRatedVoltage"}->{"pss:unit"} eq "KV") { $kt[$nline] = $linevb[$nline]/$j->{"pss:toRatedVoltage"}->{"pss:voltage"}; } elsif ($j->{"pss:toRatedVoltage"}->{"pss:unit"} eq "VOLT") { $kt[$nline] = $linevb[$nline]/($j->{"pss:toRatedVoltage"}->{"pss:voltage"}/1000); } } if (defined($j->{"pss:ratedPower"})) { if ($j->{"pss:ratedPower"}->{"pss:unit"} eq "MVA") { $linesb[$nline] = $j->{"pss:ratedPower"}->{"pss:p"}; } elsif ($j->{"pss:ratedPower"}->{"pss:unit"} eq "KVA") { $linesb[$nline] = $j->{"pss:ratedPower"}->{"pss:p"}/1000; } } }}# -----------------------------------------------------------------------# function for determining branch impedance# -----------------------------------------------------------------------sub impedance { my $h = $_[0]; if ($h->{"pss:z"}->{"pss:unit"} eq "PU") { $rline[$nline] = $h->{"pss:z"}->{"pss:r"}; $xline[$nline] = $h->{"pss:z"}->{"pss:x"}; } elsif ($h->{"pss:z"}->{"pss:unit"} eq "OHM") { my $base = $linevb[$nline]*$linevb[$nline]/$linesb[$nline]; $rline[$nline] = $h->{"pss:z"}->{"pss:r"}/$base; $xline[$nline] = $h->{"pss:z"}->{"pss:x"}/$base; }}# -----------------------------------------------------------------------# function for determining branch tap ratio# -----------------------------------------------------------------------sub tapratio { my $h = $_[0]; if (defined($h->{"pss:fromTurnRatio"})) { $tap[$nline] = $h->{"pss:fromTurnRatio"}; } if (defined($h->{"pss:toTurnRatio"})) { $tap[$nline] = 1/$h->{"pss:toTurnRatio"}; }}# -----------------------------------------------------------------------# function for determining branch phase shifting# -----------------------------------------------------------------------sub phaseshifting { my $h = $_[0]; if (defined($h->{"pss:fromAngle"})) { if ($h->{"pss:fromAngle"}->{"pss:unit"} eq "DEG") { $phs[$nline] = $h->{"pss:fromAngle"}->{"pss:angle"}; } elsif ($h->{"pss:fromAngle"}->{"pss:unit"} eq "RAD") { $phs[$nline] = $h->{"pss:fromAngle"}->{"pss:angle"}*(57.295779513082323); } } if (defined($h->{"pss:toAngle"})) { if ($h->{"pss:toAngle"}->{"pss:unit"} eq "DEG") { $phs[$nline] = -$h->{"pss:toAngle"}->{"pss:angle"}; } elsif ($h->{"pss:toAngle"}->{"pss:unit"} eq "RAD") { $phs[$nline] = -$h->{"pss:toAngle"}->{"pss:angle"}*(57.295779513082323); } }}# -----------------------------------------------------------------------# function for determining branch shunt admittance# -----------------------------------------------------------------------sub lineshunt { my $h = $_[0]; if (defined($h->{"pss:totalShuntY"})) { if ($h->{"pss:totalShuntY"}->{"pss:unit"} eq "PU") { $bshunt[$nline] = $h->{"pss:totalShuntY"}->{"pss:b"}; $gshunt[$nline] = $h->{"pss:totalShuntY"}->{"pss:g"}; } elsif ($h->{"pss:totalShuntY"}->{"pss:unit"} eq "MICROMHO") { my $base = $linevb[$nline]*$linevb[$nline]/$linesb[$nline]; $bshunt[$nline] = $h->{"pss:totalShuntY"}->{"pss:b"}*$base/1000000; $gshunt[$nline] = $h->{"pss:totalShuntY"}->{"pss:g"}*$base/1000000; } } if (defined($h->{"pss:toShuntY"})) { addshunt($h->{"pss:toShuntY"},$busto[$nline],$linesb[$nline],$linevb[$nline]/$kt[$nline]); } if (defined($h->{"pss:fromShuntY"})) { addshunt($h->{"pss:fromShuntY"},$busfr[$nline],$linesb[$nline],$linevb[$nline]); }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -