PI OLEDB Enterpriseのクエリ作成の演習

バージョン 1

    以下の演習はPI SQL Commander, PI SQL Commander Liteにて実行できます。

    添付のXMLからOSIsoft Enterprisesのデータベースをインポートして演習ができます。

    Server名はPISRV1となっています。クライアント側でAliases:を登録することで使用可能です。

    タグは添付のExcel(OSIsoft EnterprisesAllTags.xlsx)を使用して作成できます。

     

    1 1つのテーブルからデータを取得

    OSIsoft Enterprises」データベース内のすべてのエレメントの名前、説明を表示するクエリをElementテーブルから作成してください。

    Joinは使用しないで実現できます。クエリを実行し、正しい結果が取得できるか確認してください。

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

    Name

    Description

    Huston

    The Huston Plant

    …                                                                       

     

    回答例

    SELECT e.Name, e.Description

    FROM [OSIsoft Enterprises].[Asset].[Element] e

     

    2 2つのテーブルからデータを取得

    前のクエリにさらにクエリを足す形で、結果列に名前、説明、親エレメントのパスを表示するクエリを作成してください。

    ID列に入っているGUIDを使用して2つのテーブルをjoinする必要があります。

    一般的に言ってPI OLEDB Enterpriseで必要な情報を取得する場合、少なくとも2つ以上のテーブルをJoinする必要が出てくることがほとんどです。

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

    Path

    Name

    Description

    \

    Houston

    The Houston Plant

     

    回答例

    SELECT eh.Path, e.Name,

    e.Description

    FROM [OSIsoft Enterprises].[Asset].[Element] e

    INNER JOIN [OSIsoft Enterprises].[Asset].[ElementHierarchy]

    eh ON e.ID = eh.ElementID

     

    3 3つのテーブルからデータを取得

    全てのエレメント内の「Fuel Gas Flow」属性の名前、自身のエレメント名、親エレメントのパス、エレメントの説明を取得します。

    ここでは別名を使用する必要があります。そうしないとNameという同じ名前の列名が複数になってしまうためです。

    1つは、Element.Name 列、もう1つはAttribute.Name列となります。以下のようにリネームする必要があります。

    • Path => Element Parent
    • Name => Element Name
    • Description => Element Description
    • Joinしたテーブルより: Attribute Name

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

    Element Parent

    Element Name

    Element Description

    Attribute Name

    \Tucson\Cracking Process

    Boiler-309

    Cracking Boiler B-309

    Fuel Gas Flow

     

    回答例

    SELECT eh.path as [Element Parent],

    e.name as [Element Name], e.description as [Element

    Description], ea.name as [Attribute Name]

    FROM [OSIsoft Enterprises].[Asset].[Element] e

    INNER JOIN [OSIsoft Enterprises].[Asset].[ElementHierarchy]

    eh ON eh.ElementID = e.ID

    INNER JOIN [OSIsoft Enterprises].[Asset].[Elementattribute]

    ea ON ea.ElementID = e.ID

    WHERE ea.name = 'Fuel Gas Flow'

     

    4 4つのテーブルからデータを取得

    4つのテーブルをjoinします。前のクエリと同じ列を表示し、さらに現在のTimestampValue を表示します。

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

    Element Parent

    Element Name

    Element Description

    Attribute Name

    Time

    Value

    \Tucson\Cracking Process

    Boiler-309

    Cracking Boiler B-309

    Fuel Gas Flow

    2015-04…

    1. 66.4…

     

    回答例

    SELECT eh.path as [Element Parent],

    e.name as [Element Name],

    e.description as [Element Description],

    ea.name as [Attribute Name],

    s.Time,

    s.Value

    FROM [OSIsoft Enterprises].[Asset].[Element] e

    INNER JOIN [OSIsoft Enterprises].[Asset].[ElementHierarchy] eh ON eh.ElementID = e.ID

    INNER JOIN [OSIsoft Enterprises].[Asset].[Elementattribute] ea ON ea.ElementID = e.ID

    INNER JOIN [OSIsoft Enterprises].[Data].[Snapshot] s ON ea.id = s.ElementAttributeID

    WHERE ea.name = 'Fuel Gas Flow'

     

    5 演習 –Viewを作成します

    リレーショナルデータベースにおいて「view」は他のテーブルと同じようにクエリを実行できる仮想的なテーブルのように扱えます。

    1. 前の演習のクエリをコピーします。
    2. PI SQL Commander LiteData Sources > AF Servers > localhost > Catalogs > OSIsoft Enterprises > Asset > Viewsを開きます。右クリックして、「Create View…」を選びます。
    3. [ <view name> ] [Fuel Gas Flows]とします。
    4. ポップアップウィンドウの<query>セクションに演習のクエリをペーストします。
    5. クエリを実行します。
    6. Views」を右クリックし、「Refresh」を実行します。
    7. Views」を展開し、新しいViewを右クリック「Execute Predefined Query」を実行します。

     

    6 演習 – Data Transpositions

    今度はCatalogs > OSIsoft Enterprises > Data Tについて見ていきたいと思います。取得したいものは以下のデータです。

    Element

    Attribute

    Current Value

    Pump 1

    Flow

    43 m3/h

    Pump 1

    Power draw

    1. 17.1 A

    Pump 1

    Spindle speed

    1960 RPM

    Pump 2

    Flow

    29 m3/h

    Pump 2

    Power draw

    1. 13.8 A

    しかしながら、上記表よりも、下記のように結果をtransportするともっと見やすいものになります。

    Element

    Flow

    Power draw

    Spindle speed

    Pump 1

    43 m3/h

    1. 17.1 A

    1960 RPM

    Pump 2

    29 m3/h

    1. 13.8 A

    1754 RPM

     

    PI OLEDB EnterpriseTranspositionを使えば上記が実現可能です。TranspositionBIアプリケーションのPower Pivotのようなものです。ViewTranspositionは必要に応じて、自身で作成する必要があります。

    アプローチ

    1. PI SQL Commander Liteを使用し、Data Sources > AF Servers > localhost > Catalogs > OSIsoft Enterprises > DataT > Functionsを開きます。Functionsを右クリックし、New Transpose Functions > (asset):を選択します。
    2. Boiler」にチェックを入れてnextをクリックします。
    3. Attribute Pathのダイアログでは変更せずにnextをクリックします。
    4. TransposeSnapshot」にチェックを入れnextをクリックします。
    5. デフォルトのまま、nextをクリックします。
    6. next / executeを通して作成を完了させます。

    上記作業によって、functionとテーブルがDataT以下に作成されます。これらを使用して以下演習を行います。

    DataT > Tables > ft_TransposeSnapshot_Boilerを開き、新しいテーブルを右クリックし、「Execute Predefined Query」を実行します。クエリを編集し、実行することで価値のあるデータを表示することができます。

     

    7 演習– PI OLEDBを利用してタグデータの一括削除

    SQL Queryを使用すると、where条件式を利用すれば、特定のイベントを抽出することも簡単です。

    たとえば、PI Data Archiveを停止すると、ShutdownフラグがONのタグに対して、PI Shutdown Subsystemによって”Shutdown”というデジタルステートがタグに書き込まれます。

    ここではその”Shutdown”イベントを一括して削除してみましょう。

    アプローチ

    1. PI SQL Commander Liteを使用し、Data Sources > PI Servers > ServerName > Catalogs > piarchive > Tables > picomp2を開きます。右クリックし、Execute Predefined Queryを実行します。
    2. まず、削除したいイベントをSelect文で表示してみます。“Shutdown”の値のあるタグ(sinusoidタグなど)を表示します。

    どのカラムにほしい情報が入っていますか?

    また、数字で入っているので、”Shutdown”という文字列が表示したい場合はどのようにしますか?

       3. 表示できたら、SelectDeleteに変更し、実行します。(1つのテーブルで実行できるのであれば簡単に実施可能です)Joinした結果を削除したい場合、Deleteクエリは1つのテーブルで実施する必要があるため、WHEREtime inSelect文)のように実行する必要があります

       4. 実行結果をクライアント製品やPI SMTで確認しましょう。


    回答例

    Delete [piarchive].[picomp2] WHERE time in (Select time from [piarchive].[picomp2] ar

    JOIN pids.pids ds

    ON ar.status = ds.code

    WHERE ar.time BETWEEN '*-2h' AND '*'

    And ds.name= 'Shutdown')