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

Document created by Kenji Hashimoto on Dec 4, 2017
Version 1Show Document
  • View in full screen mode

以下の演習は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')  

Outcomes