You are on page 1of 12

!

-------------- Variables ----------------------

object oLDF, oTime, oResult, oPlotA, oPlotB, oPlotScript;

object oLine, oTerminal, oFeeder, oFBusA, oFBusB, oTrans;

object oDisLine, oGrid;

set sLine, sTerminal, sFeeder, sGrid;

set sFALine, sFATerminal, sFBLine, sFBTerminal, sTrans;

set sFBus, sGroupA, sGroupB, sLimLines;

set sAddTmp;

int iTimeStep, iDayofYear, iLoop, iValid;

int iCount, iRow, iCol;

double dTLossA, dTLossB, dLossP, dTime, dLoading;

string sName;

!-------------- Initialization -----------------

EchoOff();

oLDF = GetCaseObject('ComLdf'); ! Get load flow command form study case, if command not found it will create.

oTime = GetCaseObject('SetTime'); ! Get time object from case study.

oResult = GetCaseObject('LoadForeCast.ElmRes'); ! Get result file from case study. If not found, create result file

if (.not.oLDF) { ! Error check

Warn ('Load Flow Command Could Not Be Found:');

exit();

}
if(.not.oTime){

Warn ('Time Trigger Could Not Be Found:');

exit();

!oTime.Date();

oTime.SetTimeUTC(1388533039); ! Initialize the date and time to current system time. This is to set the 2014 year

oTime.Time(); ! Time in the study is not important.

oResult.Clear();

oLDF:iopt_fls = 1.0; ! Enable Load flow command option "Feeder Load Scaling"

oLDF.Execute(); ! Execute load flow, To collect the calculation relavent object

sLine = AllRelevant('*.ElmLne'); ! Collection of the elements

sTerminal = AllRelevant('*.ElmTerm');

sFeeder = AllRelevant('*.ElmFeeder');

sTrans = AllRelevant('*.ElmTr*');

sGrid = AllRelevant('*.ElmXnet');

oResult.AddVars(oTime,'dayofyear','cDate','cTime'); ! Initializatin of result file according to elements parameters

for (oLine = sLine.First(); oLine; oLine = sLine.Next()){

oResult.AddVars(oLine,'c:loading');
}

for (oTerminal = sTerminal.First(); oTerminal; oTerminal = sTerminal.Next()){

oResult.AddVars(oTerminal,'m:u');

for (oFeeder = sFeeder.First(); oFeeder; oFeeder = sFeeder.Next()){

oResult.AddVars(oFeeder,'c:LossP','c:umin');

for (oTrans = sTrans.First(); oTrans; oTrans = sTrans.Next()){

oResult.AddVars(oTrans,'c:loading');

for (oGrid = sGrid.First(); oGrid; oGrid = sGrid.Next()){

oResult.AddVars(oGrid,'m:P:bus1','m:Q:bus1');

oResult.Init();

!-------------- Program ------------------------

oTime:dayofyear = 1; ! Reseting of day of time scale to 1st of Jan

iDayofYear = 0; ! Loop parameter

iTimeStep = 1.0; ! Time step

for (iLoop = 1; iLoop <= 365; iLoop = iLoop + 1){ ! Main loop over time of 365 days. Execute load flow in each loop

oLDF.Execute(); ! and record result at each time step.

oResult.Write();
iDayofYear = iDayofYear + iTimeStep;

oTime:dayofyear = iDayofYear;

oResult.Flush(); ! Finalized the result file writing

LoadResData(oResult);

oFBusA = NULL; ! Variable for feeding busbars

oFBusB = NULL;

sFALine.Clear();

sFATerminal.Clear();

sFBLine.Clear();

sFBTerminal.Clear();

sFBus.Clear();

sGroupA.Clear();

sGroupB.Clear();

for (oFeeder = sFeeder.First(); oFeeder; oFeeder = sFeeder.Next()) { ! Create group of elements according to feeding point i.e. Busbar 2
and 3. Filtering elements according to feeder
oTerminal = oFeeder:cn_bus;

if (oFBusA = NULL) {

sName = oTerminal:loc_name;

iValid = strcmp(sName,'2',1); ! To ensure that sGroupA must have element with feeding busbar 2

if (iValid = 0) {

oFBusA = oTerminal;

sAddTmp.Clear();

sAddTmp = oFeeder.GetObjs('ElmLne');

sFALine.Add(sAddTmp);

sAddTmp.Clear();

sAddTmp = oFeeder.GetBuses(0);

sFATerminal.Add(sAddTmp);

sGroupA.Add(oFeeder);

else if (oFBusA = oTerminal) {

sAddTmp.Clear();

sAddTmp = oFeeder.GetObjs('ElmLne');

sFALine.Add(sAddTmp);

sAddTmp.Clear();

sAddTmp = oFeeder.GetBuses(0);
sFATerminal.Add(sAddTmp);

sGroupA.Add(oFeeder);

if (oFBusB = NULL) {

sName = oTerminal:loc_name;

iValid = strcmp(sName,'3',1);

if (iValid = 0) {

oFBusB = oTerminal;

sAddTmp.Clear();

sAddTmp = oFeeder.GetObjs('ElmLne');

sFBLine.Add(sAddTmp);

sAddTmp.Clear();

sAddTmp = oFeeder.GetBuses(0);

sFBTerminal.Add(sAddTmp);

sGroupB.Add(oFeeder);

else if (oFBusB = oTerminal) {

sAddTmp.Clear();

sAddTmp = oFeeder.GetObjs('ElmLne');
sFBLine.Add(sAddTmp);

sAddTmp.Clear();

sAddTmp = oFeeder.GetBuses(0);

sFBTerminal.Add(sAddTmp);

sGroupB.Add(oFeeder);

sFBus.Add(oFBusA);

sFBus.Add(oFBusB);

sAddTmp.Clear();

sAddTmp = Plots.GetContents('CurveA.IntDplmap',1); ! DPLMap is used to generatr the net active power losses. Script
subobject

oPlotA = sAddTmp.First(); ! Plot.ComTableReport will generate the curves. See sub-script Create for detail

sAddTmp.Clear();

sAddTmp = Plots.GetContents('CurveB.IntDplmap',1);

oPlotB = sAddTmp.First();

oPlotA.Clear();

oPlotB.Clear();
iRow = 0;

iCount = ResNval(oResult,0);

do { ! Summation of net power losses in all elements per group

dTLossA = 0.0;

iCol = ResIndex(oResult,oTime,'dayofyear');

GetResData(dTime,oResult,iRow,iCol);

for (oFeeder = sGroupA.First(); oFeeder; oFeeder = sGroupA.Next()){

iCol = ResIndex(oResult,oFeeder,'c:LossP');

iValid = GetResData(dLossP,oResult,iRow,iCol);

if (iValid = 0) {

dTLossA = dTLossA + dLossP;

oPlotA.Insert(dTime,dTLossA);

dTLossB = 0.0;

for (oFeeder = sGroupB.First(); oFeeder; oFeeder = sGroupB.Next()){

iCol = ResIndex(oResult,oFeeder,'c:LossP');

iValid = GetResData(dLossP,oResult,iRow,iCol);

if (iValid = 0) {

dTLossB = dTLossB + dLossP;

}
}

oPlotB.Insert(dTime,dTLossB);

iRow = iRow + 1;

while (iRow<iCount)

ReleaseResData(oResult);

ResCurves:iOption = 0; ! Generate Curves from result file. Sub script ResCurves perform this task

ResCurves:oResult = oResult;

ResCurves:sNamePage = 'Transformers Loading';

ResCurves:sNamePlot = 'Loading';

ResCurves:oAxisX = oTime;

ResCurves:sVariable = 'c:loading';

ResCurves:sAxisY = sTrans;

ResCurves.Execute();

ResCurves:oResult = oResult;

ResCurves:sNamePage = 'Feeder Terminals';

ResCurves:sNamePlot = 'Voltage';

ResCurves:oAxisX = oTime;

ResCurves:sVariable = 'm:u';
ResCurves:sAxisY = sFBus;

ResCurves.Execute();

ResCurves:oResult = oResult;

ResCurves:sNamePage = 'Terminals (min)';

ResCurves:sNamePlot = 'Min Voltage';

ResCurves:oAxisX = oTime;

ResCurves:sVariable = 'c:umin';

ResCurves:sAxisY = sFeeder;

ResCurves.Execute();

ResCurves:oResult = oResult;

ResCurves:sNamePage = 'Demand Curve';

ResCurves:sNamePlot = 'Power';

ResCurves:oAxisX = oTime;

ResCurves:sVariable = 'm:P:bus1';

ResCurves:sVariable2 = 'm:Q:bus1';

ResCurves:iOption = 1;

ResCurves:sAxisY = sGrid;

ResCurves.Execute();

EchoOn();
Report.Execute();

Plots.Execute();

sAddTmp.Clear();

sAddTmp = Report.GetContents('DisLine.IntDplmap',1);

oDisLine = sAddTmp.First();

sLimLines.Clear();

iLoop = oDisLine.First(oLine,dLoading); ! Collecting lines that are above then loading limits default limit is 100%.

while (iLoop = 0) { ! Lines are fileter in Report.ComTableReport. Line is consider as overloaded

sLimLines.Add(oLine); ! if it is overload at any time step.

iLoop = oDisLine.Next(oLine,dLoading);

iCount = sLimLines.Count();

if (iCount > 0) {

ResCurves:iOption = 0;

ResCurves:oResult = oResult;

ResCurves:sNamePage = 'OverLoading Lines';

ResCurves:sNamePlot = 'Loading';

ResCurves:oAxisX = oTime;

ResCurves:sVariable = 'c:loading';
ResCurves:sAxisY = sLimLines;

ResCurves.Execute();

You might also like