AF SDKを用いたAFエレメントのオブジェクト生成について

PI System Explorerを使用して、AFデータベースにエレメントツリー構造を作成しました。

AFデータベース上に存在するエレメントを対象にAF SDKを用いてオブジェクト生成を検証しております。

特定のエレメントオブジェクトの生成と、そのエレメントが持つ特定の属性オブジェクトの

生成はどのようすれば宜しいでしょうか?

 

 

AFElement element = new AFElement()

AFAttribute attribute = new AFAttribute()

Parents
  • ご質問ありがとうございます。

     

    エレメントオブジェクトについても属性オブジェクトについても必ず階層構造を構成する必要があります。

    そのため、親となるオブジェクトの参照まで取得し、そのオブジェクトが保持するコレクションに追加するという方法で実現します。

     

    エレメントオブジェクトの生成については以下の2通りの方法があります。

    1. 事前にオブジェクトをnewした後、親オブジェクトのコレクションに追加
    2. 親オブジェクトのコレクションに追加した後、対象オブジェクトの取得

     

    属性オブジェクトの生成については対象エレメントのコレクションに追加した後、対象オブジェクトを取得して編集する事となります。

     

    以下にサンプルコードを記載いたします。

     

     private void button1_Click(object sender, EventArgs e)
     {
     PIServer piServer = PIServer.FindPIServer("MHAYAKAWA7440Z");
    
     PISystems piSystems = new PISystems();
     PISystem piSystem = piSystems.DefaultPISystem;
     AFDatabase database = piSystem.Databases.DefaultDatabase;
    
     // 先行してElementを作成する場合
     AFElement preElement = new AFElement();
     preElement.Name = "先行作成エレメント";
     AFAttribute preAttribute = preElement.Attributes.Add("属性1");
     preAttribute.PIPoint = PIPoint.FindPIPoint(piServer, "CDT158");
     database.Elements.Add(preElement);
    
     // CollectionにAddしてElementを作成する場合
     AFElement postElement = database.Elements.Add("追加作成エレメント");
     AFAttribute postAttribute = postElement.Attributes.Add("属性2");
     postAttribute.PIPoint = PIPoint.FindPIPoint(piServer, "SINUSOID");
     database.CheckIn();
     }
    

    AFElementクラスにはElementsプロパティが存在しますので、エレメントの階層構造を構築する場合にはこちらのプロパティを使用してください。

    追加の手順につきましてはAFDatabseのElementsプロパティと同様です。

  • ご回答ありがとうございます。

    ご提示頂いた内容はAF SDKでエレメントを新規作成・追加を行う内容でしょうか?

     

    既存エレメントを対象に、値の取得や属性値の取得の検証を行っております。

    FindElementsメソッドにて、エレメントの検索及び値取得までは確認出来たのですが、

    ピンポイントで既存エレメントのオブジェクトを生成する手法を現在探しております。

  • コメントありがとうございます。

     

    先程の投稿内容はAF SDKでエレメントや属性の追加を行う方法でした。

     

    既存のエレメントを抽出するにはご指摘通り、FindElementsメソッドを使用し、AFNamedCollectionListクラスを組み合わせる事で対象のオブジェクトに簡単にアクセスできるようになります。

    AFNamedCollectionListクラスのコンストラクタにFindElementsメソッドの実行結果を入れる事により、エレメント名をパラメータに渡す事で取得できるようになります。

    以下にサンプルコードを記述いたします。

    private void button2_Click(object sender, EventArgs e)
    {
     PISystems piSystems = new PISystems();
     PISystem piSystem = piSystems.DefaultPISystem;
     AFDatabase database = piSystem.Databases.DefaultDatabase;
     AFElementSearch query = new AFElementSearch(database, "ElementSearch", "Name:\"*作成*\"");
     AFNamedCollectionList<AFElement> elementList = new AFNamedCollectionList<AFElement>(query.FindElements());
     AFElement element = elementList["追加作成エレメント"];
    }
    

Reply
  • コメントありがとうございます。

     

    先程の投稿内容はAF SDKでエレメントや属性の追加を行う方法でした。

     

    既存のエレメントを抽出するにはご指摘通り、FindElementsメソッドを使用し、AFNamedCollectionListクラスを組み合わせる事で対象のオブジェクトに簡単にアクセスできるようになります。

    AFNamedCollectionListクラスのコンストラクタにFindElementsメソッドの実行結果を入れる事により、エレメント名をパラメータに渡す事で取得できるようになります。

    以下にサンプルコードを記述いたします。

    private void button2_Click(object sender, EventArgs e)
    {
     PISystems piSystems = new PISystems();
     PISystem piSystem = piSystems.DefaultPISystem;
     AFDatabase database = piSystem.Databases.DefaultDatabase;
     AFElementSearch query = new AFElementSearch(database, "ElementSearch", "Name:\"*作成*\"");
     AFNamedCollectionList<AFElement> elementList = new AFNamedCollectionList<AFElement>(query.FindElements());
     AFElement element = elementList["追加作成エレメント"];
    }
    

Children
  • ご回答ありがとうございます。

    AFElementSearchを使用したエレメント検索も出来ました。

    AFエレメント階層情報を使用して、既存エレメントを検索する事は出来ないのでしょうか?

     

    エレメント階層情報

    \\サーバー名\データベース名\エレメント1\エレメント2

  • ありがとうございました。

    ご提示頂いた方法にて、既存エレメントをピンポイントでオブジェクト化して内容を閲覧する事が出来ました。

  • FindElementsByPath methodが使用できます。

    AFElement.FindElementsByPath Method

    以下例です。

    //FindElementsByPath method
    String path = @"\\ServerName\Utilities Cost Management\Plant\Building1\Electric User1";
    List<string> myList = new List<string>();
    myList.Add(path);
    AFKeyedResults<String,AFElement> myElmList = new AFKeyedResults<String, AFElement>();
    myElmList = AFElement.FindElementsByPath(myList,null);
    AFElement TargetElm = myElmList[path];
    
    

     

    しかし、もしパスがわかっているなら、以下のような書き方でも取得できます。

    //AFElement
    String path2 = @"Plant\Building1\Electric User1";
    AFElement TargetElm2 = database.Elements[path2];