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

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