Skip navigation
All Places > All Things PI - Ask, Discuss, Connect > Japan PI Square > Blog

本記事は英語版の翻訳をベースとしたものです。

How to Create a Certificate Using Your Enterprise CA for PI Web-based Products

 

PI Web APIを使用するにあたり、SSL証明書が必要となります。(PI Visionもhttpsで使用する場合は必要となります)

デフォルトのインストールでは自己証明書を作成しますが、ユーザーからみると証明書エラーが表示されてしまいます。

クライアントからはクリックしてエラー回避が可能ですが、ブラウザを危険にさらす可能性もあります。

よって日常的にこのように対処するのはあまりいい方法ではありません。

もっともシンプルに解決するためにはドメインにてEnterprise Certificate Authorityを使用し、証明書を作成することです。

ユーザーはグリーンのアイコンが表示され問題なく閲覧できるようになります。

このポストではどのようにドメイン証明書を作成するかを説明します。

PI VisionPI WebAPIのサーバーのことをPI Web Serverと記載します。

PI Web ServerLocal Administrators権限を持つドメインアカウントを用意します。

ドメインのAdministrator権限が必要になる場合があります。

Active Directory Certificate Servicesにて証明書を作成できる権限が必要となります。(ご自身の会社のITチームに確認することとなります)

 

手順

1.PI Web ServerLocal Administrators権限を持つドメインアカウントでログインします

2.スタートをクリック

3.プログラム検索ボックスでmmc.exeと入力し、Enterをクリックします。

4.File > Add/Remove Snap-inをクリックします。

5.リストの中からCertificatesを選択し、Addをクリックします

6.Computer accountをクリックし、次へをクリック

7.Local computerをクリックし、Finishをクリック

8.OKをクリック

9.コンソールツリーからCertificates(Local Computer)をダブルクリックします。

10.Personalを右クリックし、All Tasksを展開し、Request New Certificateをクリックし、Certificate Enrollmentウィザードを開始します

11.次へをクリック

12.次へをクリック

13.Web Serverテンプレートを探します。

もし、以下のスクリーンショットのようにテンプレートが見つからない場合、またはStatusがUnavailableの場合、

キャンセルをクリックし、Appendix 1に行ってください。手順を実行してからStep 10から再度実行します。

14.Web Serverテンプレートを選択します。WarningのMore information is required to enrol for this certificate. Click here to configure settingsのリンクをクリックします。

15.Subject nameの下にあるTypeにてCommon Nameをクリックします

16.Subject nameの下にあるValueにてサーバーのFQDN名を入力します。(FQDNはドメイン名までを含んだサーバー名です。ホスト名.ドメイン名)

17.Alternative nameの下にあるTypeにてDNSをクリックします

18.Alternative nameの下にあるValueにてPI Web ServerのFQDN名を入力します。

19.Alternative nameの下にあるValueにてPI Web Serverのマシン名(ホスト名)を入力します。

20.他の名前も登録したい場合、上記Alternative nameの手順を繰り返します。

21.OKをクリックします

22.Enrollをクリックします

23.Finishをクリックします

24.Personal > Certificates内にある、Certificate TemplateがWeb Serverの新しい証明書をダブルクリックします。

詳細タブにてSubject Alternative Name部分に上記入力した名前がすべて表示されている必要があります。

[Appendix 1]

  1. Certificate Authority Server(通常はDomain Controller)にてDomain AdministratorCA Administratorとしてログインします。
  2. CAコンピューター上でスタートからプログラムの検索ボックスにてcerttmpl.mscと入力し、Enterをクリックします。
  3. Certificate Templates Consoleにて表示されたWeb Server Templateを右クリックし、プロパティを開きます。

4.Securityタブをクリックします。

5.PI Web Serverのコンピューターアカウントをこちらに追加し、Enrollの権限を与えます。

あとはOKをクリックし、元の手順に戻ります。

 

 

[PI Web APIの証明書を変更する]

PI Web API Admin Utilityを起動し、CertificateにてChangeボタンをクリックします。

ドメインが発行しているCertificateを選びます。

 

[SHA1について]

SHA1は2017年2月以降、ChromeにてErrorとなります。

Active Directory Certificate Serviceのインストールおよび構成時に別のものを指定します。

本件はActive Directoryの知識ですが、質問があればコメントにご連絡ください。

PI AFのイベントフレームは、AF分析のイベントフレーム生成や、

PI Event Frame Generator Interfaceなどを使用して生成できます。

イベントフレームの作成方法は以下の記事に簡単な紹介がございます:

https://techsupport.osisoft.com/Troubleshooting/KB/KB01197/

 

 

現時点では、各イベントフレームの分析やActive Pointによる生成は、イベントフレームを重複して生成することができません。

例として、ある開始トリガーと終了トリガーを持つイベントフレーム生成の分析が、

開始トリガーの条件が満たされたことにより開いている状態で、

再度開始トリガーの条件が満たされても、

既存のイベントフレームが終了しない限り、二つ目のイベントフレームが生成されることはありません。

これは子イベントフレームにおいても同様です。

 

 

開始トリガーの条件が満たされるたびに、

既存のイベントフレームを閉じることなく、

別のイベントフレームを開始したいこともあると思います。

その場合は、AFSDKを使用してイベントフレームを作成する方法があります。

以下のスクリプトは、今日の午前0時から現在時刻までの範囲を持つイベントフレームを一つ生成し、

その時間範囲内で、あるポイントの値が変動するたびにその下に子イベントフレームを生成するというサンプルです。

 

using OSIsoft.AF;
using OSIsoft.AF.Asset;
using OSIsoft.AF.EventFrame;
using OSIsoft.AF.Time;

            // Get the Database and the EF Template
            PISystems myPISystems = new PISystems();
            PISystem myPISystem = myPISystems["AFSERVERNAME"];
            myPISystem.Connect();
            AFDatabase myDB = myPISystem.Databases["AFDATABASENAME"];
            // Set the Event Frame Template and the Primary Referenced Element
            AFElementTemplate myTemplate = myDB.ElementTemplates["EFTEMPLATENAME"];
            AFElement myElement = myDB.Elements["ELEMENTNAME"];
            // Create a parent Event Frame starting from today            
            AFEventFrame myEventFrame = new AFEventFrame(myDB,"TestEF_"+DateTime.Today);
            myEventFrame.SetStartTime(DateTime.Today);
            myEventFrame.PrimaryReferencedElement = myElement;
            // Create child Event Frames
            AFAttribute myAttribute = myElement.Attributes["ATTRIBUTENAME"];
            AFValues myAFValues = myAttribute.GetValues(new AFTimeRange(DateTime.Today,DateTime.Now),100,null);
            
            foreach (AFValue V in myAFValues)
            {
                    AFEventFrame myChildEventFrame = new AFEventFrame(myDB, "ChildEF_" + V.Timestamp, myTemplate);
                    myChildEventFrame.SetStartTime(V.Timestamp);
                    myChildEventFrame.PrimaryReferencedElement = myElement;
                    myEventFrame.EventFrames.Add(myChildEventFrame);
            }
            // Close Event Frames and check in
            myEventFrame.SetEndTime(DateTime.Now);
            foreach (AFEventFrame E in myEventFrame.EventFrames)
            {
                E.SetEndTime(DateTime.Now);
            }
            myDB.CheckIn();

 

例として、以下の値を持つPIポイントをActive Pointとして使用します。

このPIポイントをエレメントの属性に割り当て、上記の"ATTRIBUTENAME"に指定します。

次の行で指定した時間範囲で、その属性から最大n個(上記では100と指定)の記録された値を取得し、それぞれを開始時刻としてイベントフレームを生成します。

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

PI OPC DA InterfaceでHA構成を組んだ場合、Device Status = 70のログが出力され、頻繁にFail Overが発生する場合があります。

本来であればOPCサーバーとPI OPC DA Interface間で問題点を抽出すべきですが、なかなか原因が究明できない事もあります。

その場合の対応策を記述します。

 

対応可能バージョン

PI OPC DA Interface 2.6.15.3 以降

Read-Only、Read-Write共に対応可能

 

対応策

Device Status = 70の詳細確認

発生しているインスタンスに対してHealth Tagを追加します。

追加するHealth Tagは「Device Status」です。

Device Statusを収集するとDevice Status 70の詳細な内容を取得する事ができます。

 

それぞれの現象の詳細は以下の通りです。

https://livelibrary.osisoft.com/LiveLibrary/web/pub.xql?c=t&action=home&pub=int-opc-v6&lang=en#addHistory=true&filename=GUID-BED9E4B9-09AD-42F3-AEA1-AFED10855F3A.xml&docid=GUID-7460893F-398B-4FEA-898A-400CF49E93C2&inner_id=&tid=&query=&scope=&resource=&toc=false&eventType=lcContent.loadDocGUID-7460893F-398B-4FEA-898A-400CF49E93C2

 

 

/ISDSパラメータ

OPC DA Interfaceの起動パラメータに/ISDSパラメータを追加します。

Device Status = 70の原因についてFail Over条件から除外します。

パラメータの詳細は以下をご確認ください。

https://livelibrary.osisoft.com/LiveLibrary/web/pub.xql?c=t&action=home&pub=int-opc-v6&lang=en#addHistory=true&filename=GUID-27CBB4CD-0031-4D77-885B-AC325E33C924.xml&docid=GUID-16E29D13-D619-4CA8-B499-F2F80C3CD3FE&inner_id=&tid=&query=&scope=&resource=&toc=false&eventType=lcContent.loadDocGUID-16E29D13-D619-4CA8-B499-F2F80C3CD3FE

 

/ISDS = 127 を設定するとすべての原因を除外します。

Point TypeがDigitalのPI Pointに対してのデータ収集動作がUniIntのバージョンによって異なります。

ご注意ください。

 

UniInt 4.5 以前

収集文字列の右側の空白文字列を自動でTrimし、DigitalSetの文字列と比較して格納します。

 

サンプル

入力文字列:"Bad_____" → 収集文字列:"Bad"

(_でスペースを表現しています)

 

 

UniInt 4.6以降

収集文字列に対して自動ではTrimしません。

そのままの文字列で比較して格納します。

 

サンプル

入力文字列:"Bad_____" → 収集文字列:"Bad_____"

(_でスペースを表現しています)

 

UniInt 4.6以降で入力文字列をTrimする方法

ICUのUniInt画面で「Trim Digital State Names」チェックを付けてください。

左右の空白文字列をTrimします。

※説明文は左側だけTrimするように記述されていますが、左右Trimします。

https://techsupport.osisoft.com/Troubleshooting/Known-Issues/120958

 

 

コマンドラインパラメータは /DigStateTrimLeft です。

PI UFL InterfaceのDigCode関数はバージョンによって出力結果が異なります。

ご利用時にはPI UFL Interfaceのバージョンをご確認ください。

 

DigCode関数について

DigCode関数はパラメータに文字列を受け取り、その文字列に対応した SYSTEM DigitalSetの値を返します。

 

サンプル

' -246が返ります

Value_Number = DigCode("I/O Timeout")

 

 

バージョン間の違い

Ver 3.3.12.13まで

SYSTEM DigitalSet 0 ~ 3000:該当する数値が返ります。

SYSTEM DigitalSet 3001以降:-255 (Bad Input) が返ります。

 

Ver 3.3.21以降

SYSTEM DigitalSet 0 ~ 350:該当する数値が返ります。

SYSTEM DigitalSet 351以降:-255 (Bad Input) が返ります。

 

 

文字列比較の特性

DigCode関数のパラメータの文字列はSYSTEM DigitalSetの文字列と完全に一致する必要があります。

大文字・小文字の違いも判断されるので気を付けてください。

また、必要に応じてTRIM関数を使用し、文字列の前後の空白文字列を削除してください。

Infomation

PI UFL Interfaceでデータ格納処理を作成するにあたり、文字列を判断する機能が新規に追加されました。

本機能はPI UFL Interface 3.5 以降で使用できます。

 

IsNumber 関数

IsNumber( "String" )

パラメータは文字列で受け取ります。

パラメータ文字列が数値と認識された場合は 1、そうでない場合は 0を返します。

 

使用例

データが数値だった場合はそのまま格納、文字列だった場合はDigitalSet SYSTEMで格納するサンプルを

以下に記述します。

 

IF (IsNumber(Value_String) == 1) THEN StoreInPI(Tag, ,Timestamp,Value_String, , ) ELSE StoreInPI(Tag, ,Timestamp, 0, DigCode(Value_String), , ) ENDIF

テクストファイルの内容を取得し、PIに書き込むためのPI Connector for UFLがあります。

それぞれのデータファイルの種類を処理するためにINIファイルの作成が必要です。

このINIファイルにタグ名の取得の仕方などが含まれています。

 

INIファイルの作成をより簡単に作成するために、PI Connector for UFL v1.2に新しい関数が提供されています。

PI Connector for UFL v1.2は現在ベータとして提供されています。

ベータのバージョンを試したいパートナー様がいましたら、下記の開発のリードのChris Coenのメーセージを読んでください。(英語となります)

Beta program now open for PI Connector for UFL version 1.2

 

この新しい関数はCSV型とJSON型があるファイルを簡単に処理するための関数です。

 

例えば、CSVのファイルのにデータの行は「タイムスタンプ、値、値、値、値、...」のフォーマットであれば

データを取得するINIファイルの章は下記のように作成できます。

 

下記に事例では、利用する新しい機能はForeachの制御構造、CsvGetItemの関数、値の列と複数値を同時に送るためのStoreEventsの関数です。

 

Counter = 0
' 各項目をループします。
' __MESSAGEは現在処理する行という変数です。
FOREACH (CsvGetItem(__MESSAGE, ",")) DO
  ' 初の項目は値ではなく、タイムスタンプで、
  ' TimeStampの変数に保存します
  IF(Counter == 0) THEN
    TimeStamp = __ITEM
  ' 他の項目は値なので、値の列に追加する
  ELSE
    Values = Add(__ITEM)
  ENDIF
 Counter = Counter + 1
ENDFOR
' PI Serverに送ります。
StoreEvents(TagNames, ,Timestamp, Values)


 

この新しい関数を利用すると、CSVファイルの処理するために60行ぐらいのINIファイルでできます。

バージョン1.2以前では項目が多いCSVファイルの場合は500以上の行のINIファイルの作成が必要だったので、大部楽になりました。

PI AFでエレメント構造を作成するにあたり、「参照」という機能があります。

参照を作成するにあたってかならず設定が必要なのが「参照型」です。

概念がわかりにくく、弊社でのパブリックトレーニングやカスタマサポートへのお問い合わせが

多く発生しておりますので、ブログ記事で開設させていただきます。

 

■ コピー と 参照の違い

エレメントのコピーはPSEGUI上で行う場合、Ctrlキーを押しながら、コピー元のエレメントを

選択し、コピー先のエレメント以下にドラッグします。

コピーとの名前の通り、実体の複製が作成されます。

 

参照の作成はPSEGUI上で行う場合は、特にキー操作せずに、

参照元のエレメントを選択し、参照を作成するエレメント以下にドラッグします。

参照は実体は一つのままです。

一つの実体を複数のエレメントの子エレメントとして使用する場合に使用できます。

 

参照が便利な場面は複数の組織で同一の設備を扱う場合です。

 

 

■ 参照型について

参照の種類には4種類あります。以下に参照の強度順に並べます。

1.      合成

2.      親子(プライマリ)

3.      親子(プライマリ以外)

4.      弱い参照

 

 

■ 合成について

合成はもっとも強力な関係性です。

合成関係は一つの親エレメントとしか結ぶ事ができません。

また、合成関係を持つと、他の親エレメントに親子(プライマリ)関係を結ぶ事はできません。

 

親エレメントとまったく同一の存在の表現方法です。

合成関係の親エレメントが削除された場合、自動で子エレメントも削除されます。

 

 

■ 親子について

親子関係(プライマリ)は一つの親エレメントとしか結ぶ事ができません。

また、親子関係(プライマリ)関係を持つと、他の親エレメントに合成関係を結ぶ事はできません。

親子(プライマリ以外)は複数の親エレメントと結ぶ事ができます。

 

標準的な関係を表現する方法です。

親子(プライマリ)関係の親エレメントが削除された場合、他の親子(プライマリ以外)関係の

親エレメントのうち一つが新たに親子(プライマリ)関係になります。

もし、一つも他の親子(プライマリ以外)関係が存在しない場合、自動で子エレメントも削除されます。

 

 

■ 弱い参照

複数の親エレメントと結ぶ事ができます。

 

親エレメント側で子エレメントの生存期間を管理しない場合に使用します。

子エレメントが削除された場合、自動で参照が削除されます。

 

 

■ 具体例について

以下に例を表現します。

 

RelationImage1.png

 

RelationImage2.png

燃料タンク1と燃料送液ポンプは 親子(プライマリ)関係です。

それとは別に参照で燃料タンク2と親子(プライマリ以外)関係を結んでいます。

 

もし、燃料タンク1が撤去されたとしても、燃料送液ポンプは

燃料タンク2につながっているため、自動で削除される事はありません。

 

燃料送液ポンプとモーターはお互いが密接な関係を持つので、

合成で関係を結びます。

燃料送液ポンプが削除されると、自動でモーターも削除されます。

 

また、設備管理部門がポンプやモーターを管理する場合には

弱い参照で関係を結びます。

この場合、設備として燃料送液ポンプやモーターが撤去された場合、

自動でポンプ管理やモーター管理から自動で削除される事となります。

注意:下記のファイルのサンプルコードが更新中で、しばらく公開されません。

 

PI上にアプリケーションを開発するお客様のためにAF SDKの入門資料を公開しました。

 

是非、ダウンロードしてAF SDKについて勉強してください!

https://techsupport.osisoft.com/Downloads/File/2c278307-bcfc-4f66-b0f4-2d9fc980e397

 

VLEも提供されております。

 

同トレーニングの利用するコードは下記に公開されています。

GitHub - osisoft/AF-SDK-Getting-Started-Guide: Lab Exercises for the PI AF SDK for Begginers

 

 

内容:

  • PI Data Archive や PI AF データベースに接続す る
  • アセットの検索
  • データの読み込みと書き込み
  • AF 階層の構築
  • AF イベントフレームを使用した作業

PI Visionで角度を表示するため、コンパスを表示したい場合があります。

たとえば風向きを表示したり、人、車、ものなどの現在の向きを表示したりする場合です。

 

Canvas Gaugeのライブラリを見つけたので、PI Visionで表示してみました。

GitHub - Mikhus/canvas-gauges: HTML5 Canvas Gauge (Camvas Gaugesのライブラリ)

PI Visionで表示するコンパスゲージのコードは以下にあります。

GitHub - kenji0711/CompassGaugeCustomSymbol: PI Vision 2017 custom symbol. It can show compass. the value should be from…

tagの値が0-360であればその数字をもとに角度が表示できます。

是非利用してみてコメントいただければ幸いです。

 

利用方法:

%PIHOME64%\PIVision\Scripts\app\editor\symbols\extに以下をコピーします。

sym-compassgauge.js

sym-compassgauge-config.html

sym-compassgauge-template.html

さらにext\librariesに以下をコピーします。

fonts.css

gauge.min.js

ext\Iconsに以下をコピーします。

compass.svg

データを集まった後に、データをもう少し分かるためにいろいろな分析があります。

例えば、複数属性を比べて、相関性があるかどうか、あれば重回帰分析ができるかどうか。

今回、Tibco Spotfireの使い、単純なデモを紹介したいと思います。

 

AFでPLCのデータを管理しています。

 

 

相関性があるかどうかPI Vision 2017のXYplotのシンボルで確かめます。

例えば、センサ1とセンサ8は相関性があまりないですが、センサ2とセンサ8のほうが相関性があると確認しました。

(ρの絶対値は大きいほど相関性が高い)

 

それぞれの属性

すべての属性を相互に比較して相関を理解することができます。

ですが、膨大のデータやアセットがある場合は、分析の専門ツールを使って方がいい可能性があります。

そのため、Spotfireを使いました。

Spotfireで分析したいなら、まずはデータを渡すのは必要です。そのため、Integratorを使いました。PI Viewを作成した後に単純にSpotfireでデータを取得できます。

 

Spotfireにデータを渡した後に分析をしはじめます。

SpotfireのData Relationshipsの機能を使い、簡単に相関性の分析できます。

 

 

Data Relationshipsの機能を使うと下記のテーブルさ作成できます。例えば、センサ8について特に興味があれば、センサ1からセンサ16までに相関性があるかどうかすぐに確認できます。

このテーブルを見るとセンサ3、センサ2、センサ7、センサ4とセンサ5はセンサ8と相関性が高いと分かります。(Rの絶対値は大きいほど相関性が高い)

 

センサ3、センサ2、センサ7、センサ4とセンサ5を使い、センサ8の重回帰分析のモデルを作成できます。

モデルを作成するためにSpotfireのLine Similarityを使います。下記のテーブルを作成できます。

 

つまり、センサ8のモデルは下記のように作成できます。

'センサ8' 123.54 - 3.06*'センサ3' - 0.30*'センサ2' - 0.29*'センサ4' - 0.1*'センサ7' + 1.28*'センサ5'

 

こんなような式があれば、AF分析で簡単に実装できます。

 

PI Visionで確認すると良いモデルを作成できるようです。

はじめに

 

PI Vision (旧PI Coresight) 及びPI AFではWindows認証を使用してPI Data Archiveやほかのサービスに

Windowsユーザの認証情報を渡す機能が標準で搭載されております。

この機能はKerberos認証という認証方法を用いて実現できますが、

実際Kerberos認証を設定するためには様々な知識が必要となります。

従来のNTLM認証をそのまま使用されてる場合、Kerberos認証を正しく設定する必要性が感じられないかもしれません。

但し、Kerberos認証によってよりセキュリティを強化し、正しく設定されておりましたら

Windowsユーザの認証情報をそのままPI Data Archive、PI AF、またはほかのサービス(RDB等)に認証情報を渡すことができるようになります。

 

この記事ではKerberos認証について説明し、更にPI VisionでKerberos認証を使用するための手順を説明します。

後半の部分は英語で公開されてる「Coresight Squared – What’s next? Kerberos and more..」記事に基づいて説明します。

 

Kerberosの簡易説明

 

まず、Kerberos認証について説明します。

 

Kerberos認証の目的はクライアントとサービスの間に両者が自分であることを証明し、

サービス側はそのクライアントの認証情報に基づいて適切な権限を与える仕組みです。

いわゆるNTLM認証みたいなネットワーク認証方法の一つです。

 

その仕組みを説明するためにはKerberos認証の用語を紹介する必要があります。

Kerberos認証で主に使われてる単語は以下の通りです。

 

Principal名 (略:PN)

Ticket Granting Server (略:TGS、訳:チケット付与サーバ)

Ticket Granting Ticket (略:TGT、訳:チケット付与チケット)

 

Kerberos認証では二つのPrincipal Nameが使われます。

そのPrincipal Nameは「User Principal Name」(略:UPN)と「Service Principal Name」(略:SPN)です。

UPNはドメインアカウント毎にて定義され、UPNは主にユーザ名とドメイン名を合わせることによって構成されております。

例としてユーザ名「rob」が「test.int」ドメインに登録された場合、そのユーザのUPNは「rob@test.int」となります。

SPNは登録されてるユーザやマシンで実行されてるサービスを定義します。

また、SPNは一つのWindows Forest内で重複されることはできません。

通常の場合、SPNは主にサービスが実行されるマシンに登録されておりますが、場合によってユーザアカウント

(サービス実行専用アカウント等)に登録されることもあります。

例としてSQL Serverが専用のサービスアカウントで実行されてる場合、

そのサービスアカウントに対して以下のSPNが登録されます。

 

MSSQLSvc/sqlserver.test.int:1433

 

PI VisionでKerberos認証を設定する場合、SPNが重要です。

特に、どのアカウントでどのSPNを登録するかによってKerberos認証が正しくできるようになります。

 

TGSはKerberos認証で使われてるチケットの発行マシンです。

多くの場合、これはドメインのドメインコントローラーになります。

 

TGTは最初にユーザがログインされた時、そのユーザに発行されるチケットです。

いわゆる、チケットを要求できるチケットです。

チケットはサービスに認証するため使われる物です。

 

それでは、結局PI Visionによって上記の仕組みがどう動くのかを説明します。

 

Kerberos認証とPI Vision

 

PI Visionのサーバを立てる時、一般的にPIサーバではなく、別のサーバをWebサーバとして設置し、

そのWebサーバ上にPI Visionを導入します。

この構成を取った場合、イメージとしては下記のとおりになります。

 

上記の図で実際何が起きてるかを順番で説明します。

 

1. ユーザがクライアントPCにログオンされた時、ドメインコントローラーにTGTを要求し、TGTが返されてきます。

 

2. PI Visionサーバに登録されてるPI Visionサービスにアクセスするため、

 1で貰ったTGTを使用しPI Visionサービス用のチケットを要求します。

 TGTに問題がなければ、PI Vision認証用のチケットが発行され、クライアントPCに送られます。

 

3. クライアントPCはPI Visionサーバに接続し、1で貰ったTGTと2で貰ったPI Vision認証用のチケットを送ります。

 

4. PI Visionサービスは3で貰ったクライアントユーザのTGTを使ってPI Data ArchiveやPI AFサーバ認証用のチケット発行を要求します。

 

5. 4で貰ったチケットを使用し、PI VisionサービスがクライアントユーザとしてPI Data ArchiveやPI AFサーバに接続し認証されます。

 

上記の手順で重要な点は以下の三つです。

 

  • PI Visionサービスアクセス用のチケット (2)
  • PI VisionサービスがTGTを取り扱える許可 (3)
  • PI VisionサービスがTGTを使って発行できる認証用チケット (4)

 

まず、PI Visionサービスにアクセスするためチケットの発行が必要となります。

TGS(ドメインコントローラー)がPI Visionサービスに対してチケットを発行するためには

PI Vision実行ユーザ(NETWORK SERVICE等の場合はマシン)に対してSPNを登録する必要があります。

SPNが存在しない場合、TGSの観点からはそのサービスが存在しないことになり、チケットは発行されません。

すなわち、SPNが登録されてないサービスについてチケット要求をTGSに送っても何も返ってきません。

この場合、Kerberos認証は失敗し、ほかに設定されてる認証方法(NTLM等)を使う必要があります。

 

二つ目のポイントはPI VisionがユーザのTGTを扱う権限です。

デフォルト設定では、ほかのマシンやユーザがTGTを扱える権限を持っておりません。

そのため、PI Visionの実行ユーザに対して明示的にTGTを扱えるように設定する必要があります。

この設定はドメインコントローラー上で行うこと、またはADの編集権限を持つアカウントで

AD編集機能が追加されてるパソコンで設定の編集を行います。

 

三つ目は制約付きKerberos認証が必要です。

PI Coresight 2016 R2から必要となっておりますが、制約付きKerberos認証では

PI Vision実行ユーザが代理で発行できるSPNを定義します。

通常の場合、これはPI Data ArchiveとPI AFのSPNになります。

 

それでは、実際上記の設定を行う手順について説明します。

 

PI VisionのKerberos認証設定手順

 

まず、下記三つのサーバーが存在すると仮定します。

 

  • PIServer.domain.int - PIサーバー (PI Data Archive、PI AFマシン)
  • PIWebServer.domain.int - PI Vision用サーバー
  • DC.domain.int - 「domain.int」ドメインのドメインコントローラーサーバー

 

今回の場合、PI Visionのアプリケーションプールユーザーはデフォルトの「NETWORK SERVICE」と指定します。

では、早速手順を見てみましょう。

 

まず、IIS側でKerberos認証を使用するために下準備を行います。

 

1. Windows認証の有効化

 

IISマネージャーを開き、PI Visionがインストールされているウェブサイトを選択し、

「認証」の項目を選択してください。

認証画面が表示されます。

この画面で「Windows認証」が有効化されていることを確認してください。

 

2. カーネルモード認証の設定

 

上記の1の画面から「Windows認証」を右クリックし、詳細オプションを選択してください。

ここで「カーネルモード認証」のオプションが表示されますが、

こちらが有効化されていることを確認してください。

 

なお、この設定が有効化されていて、カスタムアカウントでPI Visionを

実行する場合、下記の追加作業が必要です。

 

  • PI Visionがインストールされているウェブサイトを選択し、「構成エディター」を選択してください。
  • セクションの欄に下記の文書を記入し、Enterキーを押してください。

system.webServer/security/authentication/windowsAuthentication

  • 中央の画面で「useAppPoolCredentials」の項目を有効化(True)に設定してください。

 

もし上記の作業ができない場合、カーネルモード認証を無効化する必要があります。

 

3. Kerberos認証が可能な状態に設定

 

先ほどの1と2の同じ画面に戻り、「Windows認証」を右クリックし、「プロバイダ」項目を選択してください。

プロバイダの設定画面が表示されます。

ここで「Negotiate」が一番上にあることを確認してください。

「Negotiate」が一番上に存在しない場合、Kerberos認証が行われない可能性があります。

 

IISの下準備はこれで以上になります。

 

続いて、Kerberos認証の設定に移ります。

設定の手順は主に下記の3点で説明できます。

 

  • PI Vision用のSPN作成
  • PI AFやPI Data ArchiveのSPN作成確認
  • 制約付きKerberos認証定義 (Constrained Delegation)

 

それでは、順番に設定方法を案内します。

 

1. PI Vision ウェブサイトアプリケーションプールユーザーに対してSPNを作成

 

PI Visionアプリケーションプールユーザー(NETWORK SERVICE)に対してSPNを作成します。

SPN作成のためにはドメイン管理者権限が必要となります。

 

ドメイン管理者権限を所有するアカウントで管理者権限のコマンドプロンプトを

ドメインに参加しているマシンのいずれかで実行し、下記のコマンドを実行します。

 

setspn -S HTTP/PIWebServer.domain.int PIWebServer
setspn -S HTTP/PIWebServer PIWebServer

 

こちらのコマンドを実行することでSPNが作成されます。

正しく作成されたことを確認するためには下記のコマンドを実行してください。

 

setspn -Q HTTP/PIWebServer

 

なお、こちらのコマンドはどのドメインユーザーでも実行できます。

 

2. PI AFやPI Data ArchiveのSPN作成確認

 

制約付きKerberos認証を設定する必要があるため、

PI Visionの接続先にもSPNが定義されている必要があります。

PI Data Archiveの場合、PI Network Subsystemの実行ユーザーに対して

「PIServer/PIDataArchiveホスト名」のSPNを作成する必要があります。

PI AFの場合、PI AF Application Serviceの実行ユーザーに対して

「AFServer/AFServerホスト名」のSPNを作成する必要があります。

 

SPNの作成方法は上記の1と同じになります。

 

3. 制約付きKerberos認証の定義

 

Kerberos認証を使用する場合、以下四つの認証方法があります。

  • 制約付き委任(Kerberosのみ) (英:Constrained Delegation - Kerberos Only)
  • 制約付き委任(すべての認証プロトコル) (英:Constrained Delegation - Any Authentication Protocol)
  • リソースに基づく制約付き委任 (英:Resource based constrained delegation) (Windows Server 2012から実装、GUIから設定不可能)
  • 制約のない委任 (英:Unconstrained Delegation) (非推奨)

 

PI Visionのマニュアルでは「制約付き委任(すべての認証プロトコル)」の設定方法について説明しております。

マニュアルは下記のリンク先でダウンロードできます。 (PI Coresight 2016 R2の日本語マニュアル)

 

https://techsupport.osisoft.com/Downloads/File/83e7f716-0c7b-444b-a0bb-ad3ae6c9cb9b

Kerberos委任設定の手順は49ページから記載されております。

 

こちらでは「リソースに基づく制約付き委任」について説明します。

 

リソースに基づく制約付き委任のKerberos認証方法はWindows Server 2012から

新たに実装された機能です。

こちらの機能を使うことで委任設定を委任元(今回の場合はPI Visionアプリケーションプールユーザー)に

紐付く必要がなく、すべての設定は委任先(PI AFとPI Data Archive)に紐付けられます。

また、ほかの認証方法と違って、設定する際にドメイン管理者権限が要りません。

詳しくは下記のリンク先(Microsoft社のKerberos認証の新機能説明記事)をご参照ください。

 

https://technet.microsoft.com/ja-jp/library/hh831747(v=ws.11).aspx

 

なお、リソースに基づく制約付き委任のKerberos認証を使うためには下記の条件を満たす必要があります。

  • ドメインのレベルがWindows Server 2012以上
  • 委任元の端末(今回ではPI Vision用のサーバ機)がWindows Server 2012以上
  • 委任先のADオブジェクトに対して「Write account restrictions」の権限 (委任設定ユーザーのみ必要)

 

それでは、リソースに基づく制約付き委任を設定します。

設定する端末にはPowerShellのActive Directoryモジュールがインストールされている必要があります。

 

PowerShellを立ち上げて下記のコマンド文を実行してください。

 

$frontendidentity = Get-ADComputer -Identity PIWebServer
$backendidentity = Get-ADComputer -Identity PIServer
Set-ADComputer $backendidentity -PrincipalsAllowedToDelegateToAccount $frontendidentity
Get-ADComputer $backendidentity -Properties PrincipalsAllowedToDelegateToAccount

 

上記の1行目と2行目は委任元と委任先を変数に保存しております。

保存後、3行目のコマンドで委任先に対して委任できる委任元として設定します。

4行目は確認用のコマンドです。

 

こちらの例文はPIWebServerのKerberosチケットをPIServerのサービスに委任できるように設定しております。

今回の場合、こちらのコマンドでPI ServerとAF Server両方の委任設定が完了されますが、

もしAF Serverのサービスが別のユーザーアカウントで実行されている場合、「$backendidentity」の変数を変えて

再度コマンド文を実行する必要があります。

 

以上でKerberos認証の設定が完了されます。

 

まとめ

 

PI VisionとKerberos認証に関しては以上となりますが、いかがでしたでしょうか。

Kerberos認証は相当奥が深い課題ですが、本記事ではできるだけ

PI Visionに関する項目だけを説明しております。

もしほかにKerberos認証について説明が望ましい場合、是非Microsoft社が公開されている記事をご参照ください。

 

上記の手順を実行した後、PI VisionからPI Data ArchiveやPI AFへの接続はKerberos認証が行われ、

PI Visionにアクセスしているユーザーとして権限を持ち編集やデータの閲覧等ができます。

 

PI Visionからイベントフレームにコメントを書き込む作業や

PI Vision 2017で追加されたXYプロットを使用するためにはKerberos認証が必要です。

また、PI Web API経由で処理を行うカスタムシンボルをPI Visionで使用する場合、

Kerberos認証が必要になります。

 

今後の新しい機能を活用するためやPI Visionを更に活用するために

是非Kerberos認証を設定することをご検討ください。

機能の動作の確認、社内のデモのために、データの作成が必要なケースがあります。

 

そのために、色々なオプションがあります。

 

などあります。

 

今回はAF Analysisを使い、デモダータを作成したいと思います。

 

事前に準備した一分のデータをテーブルで作成しました。(このデータをExcelで作成しました)

 

このAFテーブルの定義です。

 

このデータを表示できる属性を作成します。データはAFテーブルに保存されているので、Table Lookのデータ参照を作成し、下記の定義を設定します。

他のテーブルデータ参照と違って、Whereの条件を使わずにAFテーブルに時系列データがあると設定します。

この属性のトレンドをPSEで下記のように表示されます。データは2017/01/01 00:00:00から2017/01/01 00:01:00までにだけあるので、この間だけにトレンドが現れます。

同じトレンドをループするために、AF Analysisで下記の分析を設定します。

一行目は現在の秒数を使用し、新しいタイムスタンプを作成します。このタイムスタンプはAFテーブルにあるタイムレンジの間にあります。

二行目では、モデルの属性の値を取得します。

 

この設定を使うと下記のデータを作成できます。

以前、PIタグの値をAFSDKのフォームアプリケーションから削除するサンプルをJapan PI Squareにポストしました。

AFSDKでPI Data Archiveのタグの値を削除するサンプル

今回は同様の動きをPI Web APIを使ってウェブから実現したく、このサンプルを作成しました。(クライアントはLinuxOSを想定しています)

HTMLファイルとJavaScriptファイルを作成し、Windows MachineのIISでホストするようにしました。

このウェブページからイベントを削除することが可能です。

CentOS (Linux)のクライアントマシンがあるので、そこからイベントの削除が可能です。

このサンプルではBasic認証を使用しているため、LinuxからアクセスしてもPI Web APIは動作します。

このウェブページは"Search Tags"ボタンにPI Web API Search Crawlerを使用しています。

”Delete Events”ボタンにはバッチリクエストでイベントを削除するようになっています。

(PI Web API search crawlerは"Basic認証"では動作しない点にご注意ください。Basic認証を使用すると、参照することは可能ですが、新たなタグが追加されても、アップデートされることはありません。

Basic認証を使用して、最新のCrawler結果を使用したい場合、Indexed Search Shared Index CTPが使用できます。https://techsupport.osisoft.com/Downloads/File/53b2552a-2d62-4ae0-aa75-82b02c5a0ac6)

実際のファイルのコードは以下です。

 

Index.html

<!DOCTYPE html>
<html>
<head>
  <meta http-equiv="content-type" content="text/html; charset=UTF-8"/>
  <meta name="viewport" content="width=400"/>
  <script type="text/javascript" src="http://code.angularjs.org/angular-1.0.1.js"></script>
  <script src="app.js"></script>
  <title>Delete Tag Events</title>  
</head>

<body ng-app="myApp">
    <div ng-controller="MyCtrl" >
        Search Tag Name : <input type="Text" ng-model="tagmask"><br>
        <button class="test" type="button" ng-click="searchtags()">
        <span class="ng-scope">Search Tags</span>
        </button>
        <div ng-show="TagSearchResult">
            <hr>
            Search Tag Results:<br>
            <div ng-repeat="item in search_items">
                {{item.Name}}
            </div>
            <hr>
            Start Time : <input type="Text" ng-model="starttime"><br>
            End Time : <input type="Text" ng-model="endtime"><br>
            Max delete event count : <input type="Text" ng-model="maxdelevnum" style="width:40px;">
            <br>
            <button class="test" type="button" ng-click="delete()">
            <span class="ng-scope">Delete Events</span>
            </button>
        </div>
        <div ng-show="DelResult">
            <hr>
            Delete Event Results:<br>
            <div ng-repeat="item in del_items">
                {{item.Content.Name}} 
                : Deleted {{item.Content.Count}} events
            </div>
            <hr>
        </div>
    </div>
</body>
</html>

app.js ( var servername ="localhost";の部分を自分の環境のPI Web API Server名に変更してください。もしBasic authenticationを使用する場合、XXXXXの部分も入れてください。)

angular.module('myApp', [])
.controller('MyCtrl', ['$scope','$http', function($scope,$http) {
    //Set PIWebAPI Server Name
    var servername ="localhost";
    //Basic Authentication
    //put the 64bit encoded (username:password) to the XXXXXXXXXXXXXXXXXXXXXXXXXXXXX for using Basic Authentication.
    $http.defaults.headers.common['Authorization'] = "Basic " + "XXXXXXXXXXXXXXXXXXXXXXXXXXXXX";
    $http.defaults.headers.common['Content-Type'] = 'application/json';
    // Default values
    $scope.tagmask = "sin*";
    $scope.starttime = "*-8h";
    $scope.endtime = "*";
    $scope.maxdelevnum = "50000";
    $scope.TagSearchResult = false;
    $scope.DelResult = false;
    
    //"Search Tags" Button
    $scope.searchtags= function(){
        var batch_searchtags = {  
            "searchTags": {  
                "Method": "GET",  
                "Resource": "https://" + servername + "/piwebapi/search/query?q=name:"+$scope.tagmask +"&fields=Name"
            }
        }
        $http.post("https://" + servername + "/piwebapi/batch", batch_searchtags, {}).success(function(response) {
            $scope.search_items = response.searchTags.Content.Items;
        });
        //display the results
        $scope.TagSearchResult = true;
    };


    //"Delete Events Button
    $scope.delete= function(){
        var batch_data = {
            "searchTags": {  
                "Method": "GET",  
                "Resource": "https://" + servername + "/piwebapi/search/query?q=name:" + $scope.tagmask + "&fields=Name;Links"
            },  
            "getTagInfo": {  
                "Method": "GET",  
                "RequestTemplate" : {"Resource": "{0}?selectedfields=Name;Links.RecordedData"},
                "ParentIds": ["searchTags"],  
                "Parameters": ["$.searchTags.Content.Items[*].Links.Self"]  
            },
            "getData":{
                "Method" : "GET",
                "RequestTemplate" : {
                    "Resource": "{0}?maxCount=" + $scope.maxdelevnum + "&selectedfields=Items.Timestamp;Items.Value&StartTime="
                     + $scope.starttime + "&EndTime=" + $scope.endtime 
                },
                "ParentIds": ["getTagInfo"],
                "Parameters" : ["$.getTagInfo.Content.Items[*].Content.Links.RecordedData"]
            }
        }
        $http.post("https://" + servername + "/piwebapi/batch", batch_data, {}).success(function(response) {
            $scope.del_items = response.getTagInfo.Content.Items;
            //Tags loop
            var del_data_body="";
            for (var i = 0; i < response.getTagInfo.Content.Items.length; i++) {
                $scope.del_items[i].Content.Count = response.getData.Content.Items[i].Content.Items.length;
                del_data_body= response.getData.Content.Items[i].Content.Items;
                var tagaddress = response.getTagInfo.Content.Items[i].Content.Links.RecordedData + "?updateOption=remove";
                $http.post(tagaddress, del_data_body, {}).success(function(response) {
                    //alert("success to delete");
                })
            }
        });
        //display the results
        $scope.DelResult = true;
    }
}]);

 

PITagのイベントの削除はPI Data Archiveのパフォーマンスに影響することに注意してください。

また、このウェブサイトで200,000イベントを削除しようとするとエラーとなりました。

CentOSのFirefoxのブラウザから100,000イベントを削除することは可能でした。

ソースコードはGithubに挙がっています。

GitHub - kenji0711/PIWebAPIDeleteEvents

 

PI Data Archiveがテスト用、または開発用のものであればこのツールをご使用いただけます。

本番機にてPI Web API/AFSDKなどをご使用になる場合、End UserがPSA Licenseを持っている必要があります。

本サンプルは Jerome Lefebvre と共に作成しました。

LinuxOSにてApatchを使用して、このページをホストすることもテストしました。問題なく動作します。

その際には、認証はPI Web APIを使用するため、LinuxOSではなく、クライアントマシンからPI Web API Serverに対して認証されることになります。

関西電力さま、サンフランシスコで3月20日から4日間にわたり開催されたグローバルユーザカンファレンスに参加頂きました。

Day 2 の発電事業者専門セッションでは、日本の電力会社として初となるユーザ講演をして頂きました!

 

講演の様子はこちらから

http://www.osisoft.jp/Presentations/Optimization-of-Operation-and-Maintenance-in-Thermal-Power-Plants-using-the-PI-System/

 

、、、大好評 !!!

 

講演中のQ&Aでも活発な質問が相次ぎ、講演後も会場そでには講演者お二方へのご挨拶とさらなる質問攻めで行列となりました。

次の講演開始までの休憩時間15分が経過してもまだ途切れず、致し方なくモデレータから「続きは会場の外で」と促されるほどでした (^^;

関西電力さまの取り組みと成果、そして大きな変革が始まった日本の電力業界への世界的な注目の高さを目の当たりにした思いです。

 

その夜、関西電力さま含む Day 2 の発電事業者専門セッションの講演者の皆さまへの感謝の意を込めて、サンフランシスコ市内で

Power Generation Dinner になだれ込みました。日本からご参加頂いた大手電力会社さまや関連事業者さまもお招きし、グローバルの

電力関連事業者が一堂に会し、海外の場ならではの交流がなされたとても印象深い一夜となりました!

 

 

また、カンファレンスを通じて開催されていた OSIsoft Partner EXPO では、例年に負けず劣らず、数十社の OSIsoft パートナーが実績

豊富なソリューションやアプリケーションをブース出展。今年は、やはりなんといっても AI (人工知能)やMachine Learning (機械学習)を

活用したものが目立っていました。皆さま非常に熱心にヒアリングされ、グローバルのトレンドやアプリケーションの品質・完成度等、日本に

多くの情報をお持ち帰り頂いた様子でした。

 

電力業界の他にも、石油・ガス・化学・製薬・鉄鋼・紙パルプといった業界を中心に、最近では運輸業界(鉄道等)、食品業界、ファシリティ(DC等)

など、PI System の活用事例はさらに広がりを見せています。このような多様なユーザ事例や弊社パートナー製品との連携を通じて、皆さまの

抱える設備管理の高度化、さらなる運転効率(資産効率)の向上、何よりも人や組織の持つ知識・経験の形式知化と活用、業務効率化や業務改革

といった検討課題の達成に向けて、PI System というデータインフラが持つポテンシャルをさらに引き出して頂くきっかけとなれば嬉しい限りです!

 

 

OSIsoftグローバルユーザカンファレンス2017、電力関連のその他の講演はこちら

http://www.osisoft.com/about-osisoft/presentations/?year=2017&industry=powerutilities