Lesson 5 exercise solutions
- Last UpdatedMay 16, 2023
- 2 minute read
- PI System
- AF SDK 2.10
- PI Server
-
Exercise 1: Create Event Frame Template
static AFElementTemplate CreateEventFrameTemplate(AFDatabase database)
{
AFElementTemplate eventFrameTemplate =
database.ElementTemplates["Daily Usage"];
if (eventFrameTemplate != null)
return eventFrameTemplate;
eventFrameTemplate = database.ElementTemplates.Add("Daily Usage");
eventFrameTemplate.InstanceType = typeof(AFEventFrame);
eventFrameTemplate.NamingPattern =
@"%TEMPLATE%-%ELEMENT%-%STARTTIME:yyyy-MM-dd%-EF*";
AFAttributeTemplate usage =
eventFrameTemplate.AttributeTemplates.Add("Average Energy Usage");
usage.Type = typeof(Single);
usage.DataReferencePlugIn = AFDataReference.GetPIPointDataReference();
usage.ConfigString = @".\Elements[.]|Energy Usage;TimeRangeMethod=Average";
usage.DefaultUOM = database.PISystem.UOMDatabase.UOMs["kilowatt hour"];
if (database.IsDirty)
database.CheckIn();
return eventFrameTemplate;
} -
Exercise 2: Create Event Frames
static void CreateEventFrames(AFDatabase database, AFElementTemplate eventFrameTemplate)
{
string queryString = "Template:MeterBasic";
{
// This method returns the collection of AFBaseElement objects that
// were created with this template.
using (AFElementSearch elementQuery =
new AFElementSearch(database, "Meters", queryString))
{
DateTime timeReference = DateTime.Today.AddDays(-7);
int count = 0;
foreach (AFElement meter in elementQuery.FindElements())
{
foreach (int day in Enumerable.Range(1, 7))
{
AFTime startTime = new AFTime(timeReference.AddDays(day - 1));
AFTime endTime = new AFTime(startTime.LocalTime.AddDays(1));
AFEventFrame ef = new AFEventFrame(database, "*",
eventFrameTemplate);
ef.SetStartTime(startTime);
ef.SetEndTime(endTime);
ef.PrimaryReferencedElement = meter;
// It is good practice to periodically
// check in the database
if (++count % 500 == 0)
database.CheckIn();
}
}
}
}
if (database.IsDirty)
database.CheckIn();
} -
Exercise 3: Capture Values
static public void CaptureValues(AFDatabase database, AFElementTemplate eventFrameTemplate)
{
// Formulate search constraints on time and template
AFTime startTime = DateTime.Today.AddDays(-7);
string queryString = $"template:\"{eventFrameTemplate.Name}\"";
using (AFEventFrameSearch eventFrameSearch =
new AFEventFrameSearch(database, "EventFrame Captures",
AFEventFrameSearchMode.ForwardFromStartTime, startTime, queryString))
{
eventFrameSearch.CacheTimeout = TimeSpan.FromMinutes(5);
int count = 0;
foreach (AFEventFrame item in eventFrameSearch.FindEventFrames())
{
item.CaptureValues();
if ((count++ % 500) == 0)
database.CheckIn();
}
if (database.IsDirty)
database.CheckIn();
}
} -
Exercise 4: Print Report
static void PrintReport(AFDatabase database, AFElementTemplate eventFrameTemplate)
{
AFTime startTime = DateTime.Today.AddDays(-7);
AFTime endTime =
startTime.LocalTime.AddDays(+8); // Or DateTime.Today.AddDays(1);
string queryString =
$"template:'{eventFrameTemplate.Name}' ElementName:Meter003";
using (AFEventFrameSearch eventFrameSearch =
new AFEventFrameSearch(database, "EventFrame Captures",
AFSearchMode.StartInclusive, startTime, endTime, queryString))
{
eventFrameSearch.CacheTimeout = TimeSpan.FromMinutes(5);
foreach (AFEventFrame ef in eventFrameSearch.FindEventFrames())
{
Console.WriteLine("{0}, {1}, {2}",
ef.Name,
ef.PrimaryReferencedElement.Name,
ef.Attributes["Average Energy Usage"].GetValue().Value);
}
}
}