ナビゲーションをスキップする
All Places > All Things PI - Ask, Discuss, Connect > Japan PI Square > ブログ > 作成者 Kenji Hashimoto
1 2 前へ 次へ

Japan PI Square

29 投稿の作成者:: Kenji Hashimoto

AMChartを使用したレーダーチャートのサンプルがOSIsoftGithubにございます。

PI-Vision-Custom-Symbols/Community Samples/OSIsoft/amcharts-radar at master · osisoft/PI-Vision-Custom-Symbols · GitHub

こちらのサンプルは1つのアイテムの画面表示時間範囲における値をレーダーチャートで表示するものです。

それに対して複数のアイテムのsnapshot値をレーダーチャートに表示したいケースがあります。

例えばタービンの断面の温度をレーダーチャートで表示したい場合などが該当します。

弊社トレーニングなどでもこの要望はよく聞きました。

そこで今回、上記のサンプルコードを変更し、複数タグ、属性の値を表示できるサンプルを作成しました。

コードはgithubにあります。

https://github.com/kenji0711/PIVisionMultiRadarChart

元々の設定の他、ラベルの非表示も可能となっています(Show Label)。是非お試しください。

現在の処、タグ、属性を追加したら消せませんので、再度最初からやり直す必要があります。ラベルの表示内容の変更も対応していません。

ご注意ください。

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

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 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

以前、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に対して認証されることになります。

多くのユーザー様より、PI ProcessBookのようなSQCシンボルをPI Visionで表示したいというリクエストがございます。

現在、カスタマーフィードバックサイトにあるリクエストには88 votesがされています。

もし、PI Visionの標準シンボルでSQCがほしい方はこちらからvoteしてください。

https://feedback.osisoft.com/forums/320517-pi-coresight/suggestions/10745121-sqc-statistical-quality-control-symbol

 

標準機能で実装されるまでの間のため、PI VisionにてPI ProcessBookのSQCシンボルをまねた画面を作成してみました。

PI ProcessBookのSQCシンボルでは以下のようにヒストグラムデータとトレンドが表示されます。

このPI ProcessBookのシンボルをPI Vision (PI Coresight 2016 R2)で再現してみました。

ヒストグラムを表示するため、こちらのsample.を使用しました。

ヒストグラムを以下のように表示できます。

制限(HiHi, LoLo, など) は分析機能で演算して算出し、子属性となるようにしました。

PI Visionでは以下のような画面を作成できました。

トレンドではソースタグが青色の線で表示されています。制限値は点線にて表現されています。

赤のドットはHiHi, LoLoをオーバーしたところを表しており、こちらもAnalysisで作成されています。

もし、ヒストグラムが表示されない場合、ブラウザでデバッグコンソールを表示し、以下エラーがないか確認します。

“Too many points in dataset. Number of points is 401 and current limit is 400.“

この場合、イベント数が多すぎるという意味なので、時間間隔を短くして表示するか、カスタムシンボルのソースコードを編集します。

PI Visionでは"ext"フォルダのsym-amcharts-histogram.jsを開き"Intervals"プロパティを追加します。

Intervalsはシンボルが受け取るイベント数を表します。この数字を大きくすることはパフォーマンスに影響がある点はご注意ください。

私はSQCの統計式のスペシャリストではないため分析の式について適切なものとなっていない可能性があります。

もし、コメントや修正点などがあれば是非このポストにご返信いただければ幸いです。

 

本ブログポストはDaniel ChoJerome Lefebvreとともに作成しました。

イベントフレームはAFの分析機能かEvent Frame Generatorで生成できます。

Event Frame GeneratorはPI Batch InterfaceのようにActive Pointを設定し、Event Frameの名前もタグの値を使用して子イベントフレームも生成できます。

ただし、Event Frame GeneratorではAFの属性ベースではなく、タグベースでの設定になります。

過去のバージョンのAFの分析では子イベントフレームが作成できませんでしたが、AF 2016 R2からは子イベントフレームが生成できるようになっているので、その機能のご紹介です。

 

PI System Explorer 2016 R2 User Guide (Japanese)

https://techsupport.osisoft.com/Downloads/File/5d01b218-9400-4563-bec8-6bb2bac9b2c4

ユーザーマニュアルのP260に“複数の開始トリガーでの子イベントフレームの生成”について記載がございます。

 

早速、イベントフレームの作成のための準備を開始します。

まず、イベントのトリガータグは0~5の値を取り、それぞれが工程を表すとします。

今回はAF側で列挙セットを作成しました。

列挙セットにより、0から5の値をそれぞれの工程名を表すことができるようになります。

エレメントの属性側では列挙セットを指定することで、タグの値に従った工程名が確認できます。

イベントフレームテンプレートでは工程名が表示できるようにしました。

エレメントの分析タブにて

“新しい開始トリガーを追加”をクリックして、それぞれの工程を開始トリガーを複数個追加します。重大度はここではNoneとしました。

この設定により子イベントフレームが作成されます。

 

イベントフレームの生成の準備ができましたので、後は工程タグの値が変更されれば、イベントフレームが生成されます。

生成後は以下のように子イベントフレームとして複数イベントが生成されています。

通常、子イベントフレームは工程名などを入れたいと思いますが、イベントフレームテンプレートの名前付けパターンでは%Element%などは使用できますが、

属性の値は現在のバージョンでは入れられないため、動的には設定できません。AF 2017 R2にて対応予定です。

 

さて、子イベントフレーム付きのイベントフレームが作成できたので、PI Vision (PI Coresight)で表示してみましょう。

PI Visionでは、新規画面を作成し、イベントをクリックします。

検索条件の編集からイベントフレームの検索条件を入力します。

(画面に該当するエレメントの属性を張り付けてもイベントを見つけることができます。)

データベース、時間範囲、アセット名など変更し、該当イベントフレームを検索します。

右クリックして、種類が類似するイベントを比較とすると、イベントフレーム同士を重ね合わせて比較ができます。

比較したい属性をドラッグアンドドロップすると、トレンドで比較できます。

(イベントフレーム属性だけでなく、参照エレメントの属性もトレンド表示できます。ここではイベントフレーム属性の"工程"と、エレメントの属性の"温度"を表示しました。)

ここでは第2工程を比較したいとすると、第2工程にて右クリックして、配置を押します。

第2工程のスタート時刻が揃って表示されます。

また、配置と拡大表示とすると、その工程だけが拡大して表示されます。

そのほか、PI Vision 2017では固有のイベントフレームをピン止めする機能も提供されています。ゴールデンバッチのイベントをピン止めすることもできます。

この機能により、バッチ工程などを子イベントフレームの作成ができます。

テンプレートを使用することで、複数のエレメントに対して一律でイベントフレームが生成できるのも良い点です。

疑問点があればぜひコメントしてください。

ユーザーカンファレンス2017が行われ、その中でAF SDKの実装についての発表があったので、そのご紹介をさせていただきます。

Best Practices for Building AF SDK Applications (David Moler )

http://www.osisoft.com/Presentations/Best-Practices-for-Building-AF-SDK-Applications/

AF SDKでデータ取得するときにBulk Callにより飛躍的にパフォーマンスが向上する話が出ています。

パフォーマンスは以下で計測したそうです。

1000個を超えるメーターがあった際にその中のpowerを積算する計算を例にしています。

(Rollupでもいいのではと思ってしまいますが、まあパフォーマンステストなので、お付き合いください)

以下のようにシンプルに式を書くと、すごく時間がかかります。

①シンプル (1分24秒)

結果としては1分24秒もかかっています。(Elapsed timeがすべてのかかった秒数です)

以下はAF サーバー側とAF クライアント側、PI クライアント側のどこで時刻がかかったかを示しています。

この1分24秒を改善していくというシナリオで、まず試したのが Full Loadの使用です。

 

② Full Load の使用 (33秒)

foreachでFindElements(fullLoad: true)を追加しています。

そうすることで、foreach内の属性ではすでに属性がロードされているため、速度向上が図れます。

ちなみにEndOfStreamはsnapshotをUOM変換をプラスして取得するメソッドです。

詳しくはPI Live Libraryをご参照ください。(英語となります)

https://techsupport.osisoft.com/Documentation/PI-AF-SDK/html/M_OSIsoft_AF_Data_AFData_EndOfStream.htm

 

Full Loadの結果33秒という数字がでています。大幅な改善ですね。

さらにその後追加したのがBulk Loadの使用です。

 

③Bulk Load の使用 (17秒)

AFAttributeListにオブジェクトを追加し、そのlistオブジェクトからデータを取得します。

そうすることで1つ1つの属性に対して1回ずつサーバーに問合せに行く必要がなくなり、まとめてデータ取得が可能です。

その結果 17秒という結果となりました。

通常は大体ここまでですが、このプレゼンテーションではさらに次のことを試しています。

 

④ Cache search resultの使用 (14秒)

上記Bulk Loadの結果を見るとSearchObjectIdsというところでAF Server 3,354 AF Client 3,489と7秒近くかかっています。

キャッシュを使用することでこの速度が改善されます。

CacheTimeoutはキャッシュの保持期間となります。

もちろん、キャッシュなので、初期クエリ時はキャッシュがありません。2回目から速度改善が見込めるということですね。

その結果 14秒となっています。キャッシュを使用することでSearchObjectIdsにかかる時間が大幅に減りました。

ただし、GetModelsでまだ時間がかかっていることがわかります。

そこで次に試したのが以下です。

 

⑤Multi thread Load (4.7秒)

Multi threadを使用すると複数のプロセスが同時進行でクエリを処理します。

Multi threadの結果 4.7秒となっています。

上記結果をまとめると以下のように表で表せます。

上記より、

1. 沢山のRPCコールを行うならBulk callとしましょう

2. サーチに時間がかかっているならキャッシュを使用しましょう

3 Client側でプロセスに時間がかかっているならMulti threadとChunkが使用できます。

Buik, Multi thread(Parallel)については以下ポストも参考にしてください。

https://pisquare.osisoft.com/community/all-things-pi/japanese/blog/2017/03/28/afsdkによる複数アイテムのbulk読み込み

上記ビデオではほかにも将来のバージョンでサーチ時の速度向上についてやAFDataCacheの使用方法なども紹介しています。

 

さらに2017のLondonのユーザーカンファレンスでも同様の発表がされました。

https://www.osisoft.com/Presentations/Best-Practices-for-Building-AF-SDK-Applications-1x/

こちらではEvent Frames Searchの効率化やAttribute Search, Cacheについて追加されています。

以下がその内容です。

通常の方法で取得すると、2.442秒という結果でした。

Lite-Weight Searchという方法で、取得するフィールドを限定できます。

結果0.789秒で取得できるようになりました。

 

また、Attribute Searchのメソッドも紹介されています。このメソッドは2017 R2以降のバージョンで使用できます。

Light-Weight Searchもあります。

 

さらに長期にわたり動作するサービスアプリケーションを使用するときはキャッシュが利用できます。

このData Cacheを使用することで0.039秒で結果が取得できました。

複数のデータアイテムの更新を取得することもできます。

 

このコードにより、複数アイテムの変更も0.069秒で処理が完了しています。

キャッシュのアップデートが完了したらデータを読めばよいわけですね。

Visualization Virtual Hackathonの勝者が決定しました。

PI Visionのカスタムシンボルを競うイベントでした。

公式な結果は以下リンクをご参照ください。(英語)

Visualization Virtual Hackathon: WINNERS!

賞を受賞したカスタムシンボルは以下です。

 

Most Creative Use of External Data

Servelec Group - PI in the Sky

Hackathon Entry - Servelec Group - Team 1

リアルタイムのヘリコプター監視画面です。ヘリコプターの位置情報とスケジュールが同時に表示されます。

外部のウェブサイトからPowerShellでフライトスケジュールデータを取得し、その情報をイベントフレームに書いています。

ディスプレイ下部の表部分はイベントフレームから取得しています。

そしてヘリコプターのリアルタイムの位置情報はラズベリーパイを使用してPIに取り込みマップ上に表示しているそうです。

 

Biggest Potential Business Impact

Servelec Group - C.H.A.P.S. and L.A.D.Y.

Hackathon - Servelec Group - Team 2

Call Handling Advanced Performance Stats & Lifetime Analytic Data Yield

IT サービスデスクの問い合わせパフォーマンスを表示するダッシュボードです。

複数のカスタムシンボルを組み合わせて、きれいなダッシュボードを構成しています。

 

Best in Show

Magion Scatterplot Matrix

PI Visualization Hackathon - Magion Scatterplot Matrix

XYプロットが複数アイテムで表示できます。データの相関関係を見る分析がこのシンボル1つで可能です。

スクリーンショットはBA:Level.1, BA:Temp.1, BA:Conc.1を表示した際の結果です。

トレンドを見るとわかりますが、これらのタグは同じタイミングで変化しているので、

それぞれの関連性がこのカスタムシンボルから見て取れます。

ダウンロードして使用することも可能なので、皆さまも是非試してみてください。

 

Best in Show

Exele - Event Map

Exele Event Map - OSIsoft Visualization Virtual Hackathon 2017 Entry

Event Frameの可視化シンボルです。

それぞれのボックスが1つのイベントフレームとなります。

ボックスのサイズ:イベントフレームの期間の長さを表します。

ボックスの色:イベントフレームのテンプレートを表します。

このシンボルにより、どのイベントフレームがどれだけ発生しているか視覚的にわかります。

コードはGitHubにあるので、jsファイルのコード内のPVCSに変更すればPI Coresight 2016 R2でも動作します。

PVPI Visionの略、CSCoresightの略です。

 

Best OSIsoft Submission

PROJECT-OPERATION-PI-TANGO-DOOM-3D

PROJECT-OPERATION-PI-TANGO-DOOM-3D

Google Tangoをご存知ですか?Google TangoGoogleAR技術で、AndroidスマートフォンのアプリでARを体験できます。

http://www.moguravr.com/google-tango-ar-case/

このカスタムシンボルはGoogle Tangoのスマートフォンで2Dマップを作製し、その作成したマップ上にPIのデータをプロットするカスタムシンボルです。

OSIsoftの従業員のチームが作成したシンボルです。

 

上記紹介した勝者チーム以外にも様々なカスタムシンボルが作成されました。(日本オフィスからはJerome Lefebvre も参加していました)

PI Coresightのハッカソンの提出のビデオをご覧できます。

ほとんどのカスタムシンボルはApacheライセンスとなっているので皆さんが使用することが許可されたカスタムシンボルとなっています。

是非PI Coresight/ PI Visionで試してみてください。

また、みなさんもカスタムシンボルを作成した際にはJapan PI Squareでシェアしていただければと思います。

是非PI Coresight / PI Visionのカスタムシンボルにチャレンジしてみてください。

 

カスタムシンボルは現在もCTPバージョンです。以下情報も確認してください。

PI Coresightのカスタムシンボルの開発についてのプロダクトマネージャーからのメッセージ

 

そのほかにもOSIsoftのカスタムシンボルの例もございます。

PI Coresight 2016 R2のカスタムシンボルの例がGitHubに追加されました

英語の記事でpythonでAFSDKを使用する投稿があります。(Rafael Borges が作成した投稿です。)

PI and Python? PIthon!

PI Systemのトレーニングを実施しても、お客様の中でPythonからPIのデータを取得したいという要望はあります。

通常はおそらくPI Web APIを使用すると思うのですが、AFSDKも上記ポストの方法で呼び出せるのでその紹介です。

なお、PythonにてPI Web APIからデータ取得する例は以下のポストをご参照ください。

PythonにてPI Web APIからデータを収集の例 - GET

 

まず、Pythonをダウンロードします。

https://www.python.org/downloads/

2.7と3.6がありますが、今回は3.6で行いました。

pythonnetをインストールします。

http://pythonnet.github.io/

具体的にはpipを使用してインストールすると、楽です。

コマンドプロンプトでpython 3.6のフォルダまで移動し、

cd scripts

pip install pythonnetを実行します。(以下スクリーンショットはPython3.6をC:\Python36にインストールした場合です)

あとは以下コードをPIthon.pyとして保存し、Python実行フォルダに入れて、

python.exe PIthon.pyをコマンドプロンプトで実行します。

 

GitHubにコードも上がっています。

GitHub - kenji0711/PIthon: Python and AFSDK project

 

*注意 PI Tagへの書き込みの機能が入っています。

writept = PIPoint.FindPIPoint(piServer,"PleaseEnterWriteTagName")

の"PleaseEnterWriteTagName"を書き込みを実施するタグ名に変更してください。

また、AFはNuGreenの階層を元に作成しています。ご自身のAFのエレメント、属性に変更してください。

import sys
import clr


sys.path.append(r'C:\Program Files (x86)\PIPC\AF\PublicAssemblies\4.0')  
clr.AddReference('OSIsoft.AFSDK')


from OSIsoft.AF import *
from OSIsoft.AF.PI import *
from OSIsoft.AF.Asset import *
from OSIsoft.AF.Data import *
from OSIsoft.AF.Time import *
from OSIsoft.AF.UnitsOfMeasure import *


print("Welcome to PIthon!!")
# PI Data Archive
piServers = PIServers()  
piServer = piServers.DefaultPIServer;


pt = PIPoint.FindPIPoint(piServer, "sinusoid")
name = pt.Name.lower()
# CurrentValue
print('\nShowing PI Tag CurrentValue from {0}'.format(name))
current_value = pt.CurrentValue()
print( '{0}\'s Current Value: {1}'.format(name, current_value.Value))


#recordedvalues
timerange = AFTimeRange("*-3h", "*")
recorded = pt.RecordedValues(timerange, AFBoundaryType.Inside, "", False)
print('\nShowing PI Tag RecordedValues from {0}'.format(name))
for event in recorded:
    print('{0} value: {1}'.format(event.Timestamp.LocalTime, event.Value))


#plotValues
plotvalues = pt.PlotValues(timerange, 100)
print('\nShowing PI Tag PlotValues from {0}'.format(name))
for event in plotvalues:
    print('{0} value: {1}'.format(event.Timestamp.LocalTime, event.Value))


#interpolatedvalues
span = AFTimeSpan.Parse("1h")
interpolated = pt.InterpolatedValues(timerange, span, "", False)
print('\nShowing PI Tag InterpolatedValues from {0}'.format(name))
for event in interpolated:
    print('{0} value: {1}'.format(event.Timestamp.LocalTime, event.Value))


#summariesvalues
summaries = pt.Summaries(timerange, span, AFSummaryTypes.Average, AFCalculationBasis.TimeWeighted, AFTimestampCalculation.Auto)
print('\nShowing PI Tag SummariesValues(Average) from {0}'.format(name))
for summary in summaries:
    for event in summary.Value:
        print('{0} value: {1}'.format(event.Timestamp.LocalTime, event.Value))


#writeValue
writept = PIPoint.FindPIPoint(piServer,"PleaseEnterWriteTagName")
writeptname = writept.Name.lower()
val = AFValue()
val.Value = 20
#val.Timestamp = AFTime("t+9h")


print('\nWrite value to {0} value: {1}'.format(writeptname, val.Value))
writept.UpdateValue(val, AFUpdateOption.Replace, AFBufferOption.BufferIfPossible)


#Connect to AF
print ('\nConnect to AF')
afServers = PISystems()
afServer = afServers.DefaultPISystem
DB = afServer.Databases.DefaultDatabase
#DB = afServer.Databases.get_Item("NuGreen")
element = DB.Elements.get_Item("NuGreen").Elements.get_Item("Little Rock").Elements.get_Item("Extruding Process").Elements.get_Item("Equipment").Elements.get_Item("K-435")


attribute = element.Attributes.get_Item("Steam Flow")
attval = attribute.GetValue()


print ('Element Name: {0}'.format(element.Name))
print ('Attribute Name: {0} | Value : {1} {2}'.format(attribute.Name, attval.Value, attribute.DefaultUOM))


#create element with attribute
print('\nCreate Element with Attribute')
if DB.Elements.get_Item("Test New Element") is not None:
    print("Already Existing Element: Test New Element")
else:
    newelement = DB.Elements.Add("Test New Element")
    newelement.Description = "Created element from PIthon"
    newattribute = newelement.Attributes.Add("Test Attribute")
    newattribute.DataReferencePlugIn = afServer.DataReferencePlugIns.get_Item("PI Point")
    newattribute.DataReference.ConfigString = "cdt158"
    DB.CheckIn()
    print("Created new Element : Test New Element")











 

以下のように実行できます。

ちなみにPython 3.6, 2.7どちらも実行できることを確認しています。

Python + AFSDKはHelpファイルがなく、Python 2.7だとAFValueを生成する際など、

val = AFValue(30) が動作しないなど癖がありますが、手さぐりで上記コードを作成してみました。

ちなみにPython 3.6ではval = AFValue(30)でも動作します。

Python3.6の方がコードが楽に書けてよいかと思います。

 

疑問点があればぜひコメントしてください。

以下Postで複数属性、複数タグへのBulkでの書き込み方法を紹介しました。

AFSDKによる複数属性、複数PIタグへのBulk書き込み

今回は複数アイテムのBulkでの読み込みをご紹介します。

なお、Bulkコールの他にParallelコールがあり、どちらが良いかはシチュエーションにより異なります。

以下KBを参考にしてください。(英語)

 

KB01216 - AF SDK Performance: Serial vs. Parallel vs. Bulk

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

 

BulkコールについてAFSDKのヘルプにサンプルコードがあります。

https://techsupport.osisoft.com/Documentation/PI-AF-SDK/html/abb5db84-4593-4937-b146-428622f719f2.htm

なお、listResultsに対してParallelで結果を取得することも可能です。(結果についてParallelを使用しているのでデータ取得はシングルのBulkコールです)

以下サンプルです。

PIServer myPIDataArchive = PIServer.FindPIServer("PIDataArchiveName");  
// For tag search mask  
String TagNameMask = "testtag*";  
//Start Time and End Time  
AFTimeRange timeRange = new AFTimeRange("*-10d", "*");  
PIPointList pointList = new PIPointList(PIPoint.FindPIPoints(myPIDataArchive, TagNameMask));  
int counter1 = 0;  
PIPagingConfiguration config = new PIPagingConfiguration(PIPageType.TagCount, 100);  
//Stopwatch Start  
Stopwatch sw1 = Stopwatch.StartNew();  
//Bulk Call for pointList  
IEnumerable<AFValues> listResults = pointList.RecordedValues(timeRange, AFBoundaryType.Inside, "", true, config);  
Parallel.ForEach(listResults, afValues =>  
{  
    Console.WriteLine(afValues.PIPoint);
    foreach (AFValue value in afValues)  
    {  
        counter1 += 1;
        //Console.WriteLine(value.PIPoint + ":" + value.Timestamp.LocalTime + " : " + value.Value.ToString());
    }  
});  
//Stopwatch Stop  
sw1.Stop();  
  
//Write results  
Console.WriteLine("Bulk Call Results");  
Console.WriteLine("Event number : " + counter1);  
Console.WriteLine("Bulk Time : " + sw1.Elapsed.TotalSeconds);  

Parallelを使用する場合、上記コードに付随して以下で使用できます。

//Parallel  
int counter2 = 0;  
//Stopwatch Start  
Stopwatch sw2 = Stopwatch.StartNew();  
//Parallel call for pointList  
Parallel.ForEach(pointList, new ParallelOptions { MaxDegreeOfParallelism = 8 }, piPoint =>  
{  
    var afValues = piPoint.RecordedValues(timeRange, AFBoundaryType.Interpolated, null, false);  
    Console.WriteLine(piPoint.Name);
    foreach (AFValue value in afValues)  
    {  
        counter2 += 1;
        //Console.WriteLine(value.PIPoint + ":" + value.Timestamp.LocalTime + " : " + value.Value.ToString());
    }  
});  
//StopStopwatch  
sw2.Stop();  
//Write results  
Console.WriteLine("Parallel Call Results");  
Console.WriteLine("Event number : " + counter2);  
Console.WriteLine("Parallel Time : " + sw2.Elapsed.TotalSeconds);  

KBにも記載がありますが、複数アイテムを取得する場合、シングルスレッドでループすると遅くなってしまいます。

Parallelを使用する際は終了が同期されているわけではないので、アプリケーション側で同期などは対処する必要があり、コードが複雑になるケースがある点はご注意ください。

例えばファイル書き出しなどする場合、Parallel.ForEach内では複数アクセスになるため、書き出せません。

比較すると、Bulkの方がコードは書きやすいかと思います。

PI API 2016 for Windows Integrated Security (WIS) install kit

https://techsupport.osisoft.com/Downloads/File/cc9f18b1-c32a-464a-93b9-419ab10c7d47

がリリースされています。

 

今までOSIsoftのインターフェースはPI APIという言語で通信をしているためPI Trustを設定してあげることが必須でした。

これはPI APIの言語がWindows Userの情報を渡すことができなかったためです。

今回、PI API 2016がリリースされたことで、PI APIにおいてもPI TrustやExplicit loginではなくMappingが使えるようになりました。

 

PI Data ArchiveはIP, マシン名などを指定するTrustとWindowsユーザーを使用するMappingという2つの認証方法があり、

Windowsユーザーを使用した認証の方がよりセキュリティが高いです。

 

このPI API 2016を使用するための必要条件は以下です。

https://techsupport.osisoft.com/Products/Other-Products/PI-API/System-Requirements

Windows Mapping機能をサポートするPI Data Archive 3.4.380以降のバージョンが必要です。

 

PI API 2016へのバージョンアップ後はTrust, Explicit Loginは使用せず、Mappingを使用するようになるため、

それぞれのインターフェースマシンで準備が必要です。

 

0 PI Data Archive上にてPI Identityの用意

PI Data Archive上で PI SMT > Security > Identities, Users, & Groups > PI Identities タブ

すでにインターフェース、PI Buffer Subsystemが使用する PI Identitieがある場合、この項目は飛ばします。

これから構成する場合、新たにIdentityを作成します。より安全にご使用いただくためには、インターフェースに対し2つのIdentityを用意します。

・インターフェースが使用するIdentity - タグのPoint Securityの読み込み権限が必要です。

・PI Buffer Subsystemが使用するIdentity - タグのData Securityの書き込み権限が必要です。

細かな話ですが、PI ICUでサービスを作る場合、MDBなどへの変更権限も必要なので、

アドミンのユーザーが別ユーザーでインターフェースノードにログインし、別のIdentityで認証されるようにするのがよいでしょう。

 

1 サービスの起動ユーザーの変更

各インターフェースのサービス、PI Buffer Subsystemの起動ユーザーを変更する必要があります。

Local Systemではなく、専用のドメインユーザーを作成するのが良いです。

ユーザー変更を適用するにはサービスの再起動が必要です。

BufferingのユーザーはインターフェースマシンのローカルグループPI Buffering Administratorsに登録します。

 

2 マッピングの作成

PI Data Archive上で PI SMT > Security > Mappings & Trusts > Mappingsタブ

上記のインターフェース、PI Buffer Subsystemで使用するドメインユーザーに対してマッピングを作成します。

上記で準備完了です。

さて、インストーラーを起動すると、以下が表示されます。

このPI API 2016をインストールすると、PI TrustとExplicit login (PIユーザーの直指定での接続)ができなくなることが書かれています。

マッピングの用意、インターフェースサービス、PI Buffer Subsystemのログオンユーザーの変更が終わっていればインストールを勧めます。

インストール後、サービスを起動するとMappingを使用し、インターフェースが接続するようになります。

PI Data ArchiveのPI SMT > Operation > Network Manager Statisticsにて確認します。

PI API 2016 アップグレード前 (Trustが使用されています)

PI API 2016へアップグレード後 (Mappingが使用されています)

PI API 2016を使用することで、Trustを全部削除し、

PI SMT > Security > Security Settingsも一番上まで上げていただくことができます。

よりセキュリティを高くPI Data Archiveをご使用いただけます。

 

なお、インターフェースマシンがDomainに参加しておらず、WorkGroupのためWindowsUserが使用できないケースがあります。

その場合以下KBを参照してください。(リンク先は英語となります。)

KB01457 - Using Windows Credential Manager with PI applications

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

ポイントはWork Groupのマシンで該当ユーザーでコマンドプロンプトを起動し、以下コマンドを実行します。

CMDKEY /add:PIDataArchiveName /user:PIDomain\Username /pass:password

を実行します。

こちらを実行するとインターフェースマシンからPI DAに対して指定したWindows Domain Userで接続しに行きます。

よってWorkGroupのインターフェースマシンでもマッピングが可能になります。

詳細はKB1457をご確認ください。

 

このPI API 2016についてはUCでも発表されています。(英語)

http://www.osisoft.com/Presentations/OSIsoft--What-s-New-in-PI-Security-/

また、以下も参考になります。(英語)

http://www.osisoft.com/Presentations/OSIsoft--Cyber-Security/

OSIsoftのインターフェース製品のように複数タグ、複数属性にAFSDKで値を書き込みたい場合があります。

その際に利用できるメソッドをご紹介します。

AFListData.UpdateValues Method (複数属性)

https://techsupport.osisoft.com/Documentation/PI-AF-SDK/html/M_OSIsoft_AF_Data_AFListData_UpdateValues_1.htm

以下サンプルコードです。

PISystems myPISystems = new PISystems();
PISystem myPISystem = myPISystems.DefaultPISystem;
AFDatabase db = myPISystem.Databases["DBName"];
AFElement element = db.Elements["ElementName"];
AFAttributes atrs = element.Attributes;
List<AFValue> listvals1 = new List<AFValue>();
Random rnd1 = new Random();
foreach (AFAttribute atr in atrs)
{
    AFValue value1 = new AFValue(atr, rnd1.Next(0,10), new AFTime("*"));
    listvals1.Add(value1);
}
AFErrors<AFValue> errors1 = AFListData.UpdateValues(listvals1,AFUpdateOption.Replace);

Element内の複数属性に値を書き込みます。

なお、コードではrnd1というオブジェクトでランダム値(0から10の値)を書いています。

 

PIServer.UpdateValues Method (複数PIタグ)

https://techsupport.osisoft.com/Documentation/PI-AF-SDK/html/M_OSIsoft_AF_PI_PIServer_UpdateValues_1.htm

以下サンプルコードです。

PIServers myPIServers = new PIServers();
PIServer myPIDA = myPIServers.DefaultPIServer;
PIPoint pt;
List<AFValue> listvals2 = new List<AFValue>();
String servertagname;
Random rnd2 = new Random();
for (int i = 1; i <= 3; i++)
{
    PIPoint.TryFindPIPoint(myPIDA, "TagnamePrefix" + i, out pt);
    servertagname = @"\\" + myPIDA.Name + @"\" + pt.Name ;
    AFAttribute myTagAttribute = new AFAttribute(String.Format(CultureInfo.InvariantCulture, servertagname, myPIDA.Name,pt.Name));
    AFValue value2 = new AFValue(myTagAttribute, rnd2.Next(10, 20), new AFTime("*"));
    listvals2.Add(value2);
}
AFErrors<AFValue> errors2 = myPIDA.UpdateValues(listvals2, AFUpdateOption.Replace);

PIPointsオブジェクトにBulkで書き込むことはできないので、一度myTagAttributeオブジェクトのようにAFAttributeオブジェクトとしてタグを定義し、PIServerに対してUpdateValuesで書き込みます。

なお、コードではrnd2というオブジェクトでランダム値(10から20の値)を書いています。

 

それぞれのリンク先はLiveLibraryとなっています。リンク先にもサンプルコードがあるので、そちらも併せてご確認ください。

これらのメソッドで効率的に値書き込みができるかと思います。

PI Coresightの標準のValueシンボルまたは標準テキストでは文字列の改行コードを含むものであっても一行で表示されてしまいます。

 

テキストに<br>や\r\nなど入れても動作しないことを確認しています。

スタイル指定で <style="white-space: pre-line”>を指定すると改行ができるようになりますが、

上記標準シンボルはフォントサイズをシンボルのボックスサイズによって調整するため、

改行が仮にできるようになったとしても表示が収まらなくなってしまいます。

複数行表示したい場合カスタムシンボルを使用します。

simple valueという単純なサンプルコードがあります。

GitHub - osisoft/PI-Coresight-Custom-Symbols: Learn how to add a custom symbol, created with JavaScript and HTML, to PI …

PI-Coresight-Custom-Symbols/tutorials/simplevalue/

sym-simplevalue-template.htmlを以下のように変更します。

<div style="white-space: pre-line;text-align:left;">{{value}}</div>

改行コードを含む文字列を生成するのにはAFのText Visualizerが利用できます。

Stringの属性の値入力時にF2をクリックします。

 

複数行になっていることが確認できます。

この属性を表示すれば1つのカスタムシンボル内で改行されCoresightで表示できます。

また、この改行コードを含んだText Visualizerの文字列をコピーしてタグの値として保存しても、

Coresightで複数行として表示可能です。

ここでは新しくリリースされたPI Notification 2016 R2の設定方法をGUIベースで紹介したいと思います。

PI Notification 2016 R2はPI Notification 2012までと異なり、イベントフレームに統合されています。

 

PI Notification 2016 R2をインストールする前提条件

PI AF Server 2016 R2以降のバージョンが必要です。

PI AF Client 2016 R2以降のバージョンが必要です。

 

PI Notification 2016 R2を使用するには、まずインストールキットをダウンロードし、インストールします。

https://techsupport.osisoft.com/Downloads/File/b4880c51-cf72-4ada-b44b-16f56e179a51

日本語可の言語パック(MUI)もリリースされています。

https://techsupport.osisoft.com/Downloads/File/2dbea50f-d916-475a-92eb-a496f67b3d7d

PI Notification 2012が入っているマシンでPI Notification 2016 R2をインストールすると、Migration ToolにてPI Notification 2016 R2にMigrateが可能です。

さらに、PI Notification 2012をアンインストールしないと、PI Notification 2012もマシン上に残っています。

サービス名も別名となっています。 PI Notification 2016: PI Notifications Service, PI Notification 2012 : PI Notification Secheduler

マシンにPI Notification 2012がインストールされているのであればMigration Toolを走らせたので、PI Notification 2012 はアンインストールします。

 

ここでは簡易的にNotificationをテストする方法を記載します。

あくまで公式なものとしてはユーザーマニュアルとなりますので、そちらもご参照ください。

https://techsupport.osisoft.com/Downloads/File/dd5c4f6f-47b5-44a5-b0be-4c073289b1a6

 

なお、NotificationをテストするにはSMTP Server(メールサーバー)が設定されている必要があります。

インストール時に指定しますが、変更する場合、

PI System Explorer > データベース > Configuration > エレメント > OSIsoft > PIANO > DeliveryChannel > ID Number > 属性

SMTPServerやSenderEmailを正しいものとする必要があります。

 

1 PI System Explorerにてエレメントと属性を作成します

2 イベントフレームを作成するためにイベントフレームテンプレートを作成します

ライブラリ > テンプレート > イベントフレームテンプレート

右クリック > 新規テンプレート

なお、確認可能のチェックボックスをつけると、イベントフレームにてAcknowledge (確認)ができるようになります。

 

属性テンプレートはSinusoid属性の値を表示する属性を作成します。

.\Elements[.]|Sinusoidを設定します。

3 分析によるイベントフレームの作成

 'sinusoid' > 50という式を設定します。重大度はMajorとします。

イベントフレームの詳細設定...をクリックします。

上で設定したトリガー条件はテストのため1つしかありませんが、イベントフレームの開始条件は複数指定することが可能です。

イベントフレームの詳細設定にて、開始トリガー名と開始トリガー式をイベントフレーム属性に追加することが可能です。

追加すると、イベントフレーム内でStart Trigger名とその式を属性として表示することが可能です。

今回はテストなので、チェックを外していただいても構いません。

 

4 Notification Rulesの作成

トリガー > この通知ルールのトリガー条件を設定してください をクリックします。

条件モードにて分析のラジオボタンを選択し、Sinusoidイベント生成の分析をプルダウンから選択します。

トリガー条件が真の場合 を選択します。

ここではメールをどの重要度で送るかを設定することが可能です。

 

5 サブスクリプションの設定

サブスクリプション > サブスクリプションの表示/編集 をクリックしてコンタクトを検索し、Emailを設定します。

なお、通知オプションをイベントの開始と終了 とすると、イベントフレーム開始時と終了時にメールが受け取れます。

サブスクリプション > 形式の管理 より、メールのフォーマットが変更できます。

開始時と終了時に受け取る場合、Message for Closed Notificationを本文に追加することで、開始時か終了時か認識することが可能です。

Sinusoidが50を超えるとメールが送られてきました。

TimeFormatを変える場合、AFのConfigurationデータベースの以下2箇所にTimeFormatという属性を作成し、指定します。

OSIsoft > PIANO > TimeFormat

OSIsoftt > PIANO > Notifications > Service

Notificationの過去の履歴はイベントフレームの検索で確認できます。

(PI Notification 2012以前で使用していた、PI Data ArchiveのHistoryタグはPI Notification 2016では使用しません。)

PI System Explorer > イベントフレーム

NotificationのAcknowledgementはPI Coresight 2016 R2から可能です。

以下はPI Coresight 2016 R2の画面です。Notificationのエレメントの属性を画面内にドロップし、イベントをクリックします。

該当するイベントを右クリックし、イベントの詳細を開くと、以下画面となります。

右上の確認ボタンをクリックすると、Acknowledgeが可能です。

また、コメントを追加し、追加ボタンをクリックすると、コメントが追加できます。

コメントと確認の結果はPI System Explorerで確認可能です。

 

また、イベントフレームを生成している分析はバックフィルが可能です。

Notificationが動作した状態で分析のバックフィルを実行すると、複数のメールが送られてくるので、注意が必要です。

 

PI Notificaiton 2012とPI Notification 2016 R2の機能の比較は以下となります。

Custom Delivery ChannelはPI Notification 2016 R2の初期リリースではサポートされません。

今後のバージョンで開発予定となっています。

 

PI Notification 2012の作成方法は以下参照。(日本語)

PI Notification 2012の設定方法のご紹介

以下英語ポストの日本語版となります。

Delete PI Data Archive tag values by AFSDK Sample

 

PI Data Archiveのタグの値を削除するツールは公式なものはあまり用意されていません。

特定の時刻、特定の値を削除したいというケースは多いものです。

そこで、AFSDKを使用したサンプルを作成してみました。

コードはGitHubにあります。

GitHub - kenji0711/DeleteTagEvents: DeleteTagEvents Created by Visual Studio 2013 / C# / AFSDK

このツールはタグの値を削除することができます。

以下指定できる項目です。

PIタグ名

All Eventsか、Specific Eventsか (値は手動で入力できます)

Start Time/End Time

タグの値を削除することはPI Data Archiveのパフォーマンスに影響があります。

まとめてたくさんの値を削除するよりも、少ないタグ数で削除することをお勧めします。