Kenji Hashimoto

AF SDKにてPI Data Archiveから値を取得する(基礎)

Blog Post created by Kenji Hashimoto on Sep 30, 2016

PI AF SDKPI AFPI Data Archiveに直接接続するメソッドを提供しています。

PI Data Archiveに高速に書き込み処理を行う場合などにはPI Data Archiveに直接することは大変便利な機能です。

PI Data Archiveに直接接続するには.Net4を使用する必要があります)

 

アプローチ

  1. Visual Studioを開きます
  2. 新規プロジェクトを作成し、Visual C# > Console Applicationを選択し、名前を「AccessPI」とします。
  3. PI AF SDKの参照をプロジェクトに追加します
    1. プロジェクト > 参照の追加...
    2. アセンブリ > 拡張
    3. OSIsoft.AFSDKにチェックを付けます。バージョン4.0AFSDKにチェックをつけるようにしてください
    4. OKをクリックします
  4. using」の宣言をコード上部に追加します。
using OSIsoft.AF.PI;
using OSIsoft.AF;
using OSIsoft.AF.Time;
using OSIsoft.AF.Asset;

   5.default PI Data Archiveに接続します

PIServers myPIServers = new PIServers();
PIServer myPIServer = myPIServers.DefaultPIServer;
myPIServer.Connect();

   6.SinusoidPI Pointを探します

PIPoint pt = PIPoint.FindPIPoint(myPIServer, "sinusoid");   

   7.Current valueを取得します

AFValue Snapshot = pt.CurrentValue();
Console.WriteLine("Snapshot from Sinusoid: " + Snapshot.Value + "\t" + Snapshot.Timestamp.LocalTime);

   8.1日前から現在までのrecorded valuesを取得します

AFTimeRange range = new AFTimeRange("*-1d", "*");
AFValues Recorded = pt.RecordedValues(range, OSIsoft.AF.Data.AFBoundaryType.Inside, "", false);
Console.WriteLine("Showing Recorded data from Sinusoid...");
foreach (AFValue val in Recorded)
{
     Console.WriteLine("{0,20}{1,30}", val.Value, val.Timestamp.LocalTime);
}
Console.ReadLine();

   9.1日前から現在まで1時間毎のinterpolated valuesを取得します。

AFTimeSpan span = AFTimeSpan(hour: 1);
AFValues Interpolated = pt.InterpolatedValues(range, span, "", false);
Console.WriteLine("Showing Interpolated data from Sinusoid...");
foreach (AFValue val in Interpolated)
{
 Console.WriteLine("{0,20}{1,30}", val.Value, val.Timestamp.LocalTime);
}
Console.ReadLine();

   10.「s」の文字で始まるすべてのPI Pointを取得します

PIPointQuery query1 = new PIPointQuery(PICommonPointAttributes.Tag, OSIsoft.AF.Search.AFSearchOperator.Equal, "s*");
IEnumerable<PIPoint> foundPoints = PIPoint.FindPIPoints(myPIServer, new PIPointQuery[] { query1 });
foreach (PIPoint tag in foundPoints)
{
     Console.WriteLine(tag.Name);
}
Console.ReadLine();

  11.Sinusoidのタグからdescriptor, location1 , excdevの属性を取得します

IDictionary<string, object> atrs = pt.GetAttributes(new string[] { "descriptor","location1","excdev" });
Console.WriteLine("\n\nSinusoid PI Point attributes: \n");
Console.WriteLine("descriptor = " + atrs["descriptor"]);
Console.WriteLine("location1 = " + atrs["location1"]);
Console.WriteLine("excdev = " + atrs["excdev"]);

12.デバッグを開始し、表示される結果を確認します。

 

なお、複数タグの値を取得する場合、PIPointListを使用するのがよいでしょう。

PIPointList Class

>The PIPointList is the primary way to make bulk data access calls to the PIServer.

 

PIPointListを使用するとBulk callが使用され、パフォーマンスが向上します。

AFSDKにてエレメント、属性にアクセスする方法は以下を参照してください。

AF SDKにてエレメントと属性を作成する方法(基礎)

Outcomes