PI AF SDKの一般的な利用方法の1つとして自動で複雑なデータベースを生成する機能を実現する方法があります。
この演習ではAF SDKを使用してアセットの作成を行ってみたいと思います。
1. 管理者としてVisual Studioを開きます
2. 新規プロジェクトを作成し、Visual C# > Console Applicationを選択し、名前を「AccessAF」とします。
3. PI AF SDKの参照をプロジェクトに追加します
- プロジェクト > 参照の追加...
- アセンブリ > 拡張
- OSIsoft.AFSDKにチェックを付けOKをクリック。バージョン4.0のAFSDKにチェックをつけるようにしてください
4. 「using」の宣言をコード上部に追加します。
using OSIsoft.AF; using OSIsoft.AF.Asset;
5. 次のコードをMainメソッドに追加して、PI AF Serverに接続し、AF Databaseをセットするようにします。
ここでは「OSIsoft Enterprises」という名前のデータベースを使用します。必要があればPI System Explorerなどで作成してください。
// Connect to the default AF Server and OSIsoft Enterprises Database
PISystems myPISystems = new PISystems();
PISystem myPISystem = myPISystems.DefaultPISystem;
myPISystem.Connect();
AFDatabase myDB = myPISystem.Databases["OSIsoft Enterprises"];
Console.WriteLine($"Database: {myDB.Name}");
Console.Read();
6. PI Systemsを定義している行にて、その横にあるグレーの部分をクリックすることでブレークポイントが作成できます。(赤い●が表示されます)
緑の三角形とともにある開始ボタンをクリックしてデバッグを開始します。(またはデバッグ > デバッグ開始)
デバッグ状態では一行一行実行するため、F10キーを押してください。コマンドウィンドウを確認し、以下の表示が出れば上記コードは正常に実行されています。

7. 早速エレメントを作成したいと思います。
AFElement createboiler = myDB.Elements.Add("ボイラー");
createboiler.Description = "ボイラーのエレメント";
createboiler.CheckIn();
実行後、PI System Explorerで確認すると、ボイラーが作成されていることが確認できます。

なお、2回実行すると、エラーとなるため、コメントアウトするかtry- catchなど使用するとよいかと思います。
try
{
AFElement createboiler = myDB.Elements.Add("ボイラー");
createboiler.Description = "ボイラーのエレメント";
createboiler.CheckIn();
}
catch (Exception e){
Console.WriteLine("Error : {0}", e.Message);
}
8. ボイラーエレメントの子エレメントとしてボイラー1を作成します。子エレメントの場合、親エレメントでチェックインを実施します。(この場合boilerオブジェクトです)
ここでも作成済みの場合の処理も入れるとよいでしょう。
AFElement boiler = myDB.Elements["ボイラー"];
AFElement boiler1 = boiler.Elements.Add("ボイラー1");
boiler1.Description = "ボイラー1号機";
boiler.CheckIn();
エレメントを足す際にエレメントテンプレートを指定することも可能です。
elements.add("エレメント名", myDB.ElementTemplates["エレメントテンプレート名"]);
9. 属性を追加します。ボイラー1に温度という属性を追加し、ba:temp.1というタグを紐づけます。
AFElement boiler1 = boiler.Elements["ボイラー1"];
AFAttribute temperature = boiler1.Attributes.Add("温度");
temperature.DataReferencePlugIn = myPISystem.DataReferencePlugIns["PI Point"];
temperature.DataReference.ConfigString = "ba:temp.1";
boiler1.CheckIn();
温度の属性が追加されたことを確認してください。

10. C#のコードから属性の値を確認してみましょう。
AFValue val = temperature.GetValue();
Console.WriteLine("属性名 : {0} , {1} , {2}",temperature.Name,val.Timestamp.LocalTime, val.Value);
11. 属性がタグの場合、Attribute.Dataを使用してRecordedValuesなども取得可能です。
AFTimeRange range = new AFTimeRange("*-1h", "*");
AFValues vals = temperature.Data.RecordedValues(range,OSIsoft.AF.Data.AFBoundaryType.Inside,null,"",true);
foreach (AFValue value in vals)
{
Console.WriteLine("{0} , {1}", value.Timestamp.LocalTime, value.Value);
}
AF SDKにてPI Data Archiveに直接アクセスし、値を取得する方法は以下に記載があります。参考にしてみてください。
AF SDKにてPI Data Archiveから値を取得する(基礎)