Professional Documents
Culture Documents
set sAddTmp;
string sName;
EchoOff();
oLDF = GetCaseObject('ComLdf'); ! Get load flow command form study case, if command not found it will create.
oResult = GetCaseObject('LoadForeCast.ElmRes'); ! Get result file from case study. If not found, create result file
exit();
}
if(.not.oTime){
exit();
!oTime.Date();
oTime.SetTimeUTC(1388533039); ! Initialize the date and time to current system time. This is to set the 2014 year
oResult.Clear();
oLDF:iopt_fls = 1.0; ! Enable Load flow command option "Feeder Load Scaling"
sTerminal = AllRelevant('*.ElmTerm');
sFeeder = AllRelevant('*.ElmFeeder');
sTrans = AllRelevant('*.ElmTr*');
sGrid = AllRelevant('*.ElmXnet');
oResult.AddVars(oLine,'c:loading');
}
oResult.AddVars(oTerminal,'m:u');
oResult.AddVars(oFeeder,'c:LossP','c:umin');
oResult.AddVars(oTrans,'c:loading');
oResult.AddVars(oGrid,'m:P:bus1','m:Q:bus1');
oResult.Init();
for (iLoop = 1; iLoop <= 365; iLoop = iLoop + 1){ ! Main loop over time of 365 days. Execute load flow in each loop
oResult.Write();
iDayofYear = iDayofYear + iTimeStep;
oTime:dayofyear = iDayofYear;
LoadResData(oResult);
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);
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);
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);
dTLossA = 0.0;
iCol = ResIndex(oResult,oTime,'dayofyear');
GetResData(dTime,oResult,iRow,iCol);
iCol = ResIndex(oResult,oFeeder,'c:LossP');
iValid = GetResData(dLossP,oResult,iRow,iCol);
if (iValid = 0) {
oPlotA.Insert(dTime,dTLossA);
dTLossB = 0.0;
iCol = ResIndex(oResult,oFeeder,'c:LossP');
iValid = GetResData(dLossP,oResult,iRow,iCol);
if (iValid = 0) {
}
}
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:sNamePlot = 'Loading';
ResCurves:oAxisX = oTime;
ResCurves:sVariable = 'c:loading';
ResCurves:sAxisY = sTrans;
ResCurves.Execute();
ResCurves:oResult = oResult;
ResCurves:sNamePlot = 'Voltage';
ResCurves:oAxisX = oTime;
ResCurves:sVariable = 'm:u';
ResCurves:sAxisY = sFBus;
ResCurves.Execute();
ResCurves:oResult = oResult;
ResCurves:oAxisX = oTime;
ResCurves:sVariable = 'c:umin';
ResCurves:sAxisY = sFeeder;
ResCurves.Execute();
ResCurves:oResult = oResult;
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%.
iLoop = oDisLine.Next(oLine,dLoading);
iCount = sLimLines.Count();
if (iCount > 0) {
ResCurves:iOption = 0;
ResCurves:oResult = oResult;
ResCurves:sNamePlot = 'Loading';
ResCurves:oAxisX = oTime;
ResCurves:sVariable = 'c:loading';
ResCurves:sAxisY = sLimLines;
ResCurves.Execute();