AFSDKを使用したEvent Framesの重複生成

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と指定)の記録された値を取得し、それぞれを開始時刻としてイベントフレームを生成します。


pastedImage_0.png.png

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


pastedImage_2.png.png