PI AFのイベントフレームは、AF分析のイベントフレーム生成や、
PI Event Frame Generator Interfaceなどを使用して生成できます。
イベントフレームの作成方法は以下の記事に簡単な紹介がございます:
https://techsupport.osisoft.com/Troubleshooting/KB/KB01197/
現時点では、各イベントフレームの分析やActive Pointによる生成は、イベントフレームを重複して生成することができません。
例として、ある開始トリガーと終了トリガーを持つイベントフレーム生成の分析が、
開始トリガーの条件が満たされたことにより開いている状態で、
再度開始トリガーの条件が満たされても、
既存のイベントフレームが終了しない限り、二つ目のイベントフレームが生成されることはありません。
これは子イベントフレームにおいても同様です。
開始トリガーの条件が満たされるたびに、
既存のイベントフレームを閉じることなく、
別のイベントフレームを開始したいこともあると思います。
その場合は、AFSDKを使用してイベントフレームを作成する方法があります。
以下のスクリプトは、今日の午前0時から現在時刻までの範囲を持つイベントフレームを一つ生成し、
その時間範囲内で、あるポイントの値が変動するたびにその下に子イベントフレームを生成するというサンプルです。
using OSIsoft.AF;
using OSIsoft.AF.Asset;
using OSIsoft.AF.EventFrame;
using OSIsoft.AF.Time;
// Get the Database and the EF Template
PISystems myPISystems = new PISystems();
PISystem myPISystem = myPISystems["AFSERVERNAME"];
myPISystem.Connect();
AFDatabase myDB = myPISystem.Databases["AFDATABASENAME"];
// Set the Event Frame Template and the Primary Referenced Element
AFElementTemplate myTemplate = myDB.ElementTemplates["EFTEMPLATENAME"];
AFElement myElement = myDB.Elements["ELEMENTNAME"];
// Create a parent Event Frame starting from today
AFEventFrame myEventFrame = new AFEventFrame(myDB,"TestEF_"+DateTime.Today);
myEventFrame.SetStartTime(DateTime.Today);
myEventFrame.PrimaryReferencedElement = myElement;
// Create child Event Frames
AFAttribute myAttribute = myElement.Attributes["ATTRIBUTENAME"];
AFValues myAFValues = myAttribute.GetValues(new AFTimeRange(DateTime.Today,DateTime.Now),100,null);
foreach (AFValue V in myAFValues)
{
AFEventFrame myChildEventFrame = new AFEventFrame(myDB, "ChildEF_" + V.Timestamp, myTemplate);
myChildEventFrame.SetStartTime(V.Timestamp);
myChildEventFrame.PrimaryReferencedElement = myElement;
myEventFrame.EventFrames.Add(myChildEventFrame);
}
// Close Event Frames and check in
myEventFrame.SetEndTime(DateTime.Now);
foreach (AFEventFrame E in myEventFrame.EventFrames)
{
E.SetEndTime(DateTime.Now);
}
myDB.CheckIn();
例として、以下の値を持つPIポイントをActive Pointとして使用します。
このPIポイントをエレメントの属性に割り当て、上記の"ATTRIBUTENAME"に指定します。
次の行で指定した時間範囲で、その属性から最大n個(上記では100と指定)の記録された値を取得し、それぞれを開始時刻としてイベントフレームを生成します。

結果はこのようになります。
