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

📄 odm2psat

📁 用于电力系统的一个很好的分析软件
💻
📖 第 1 页 / 共 2 页
字号:
    $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 + -