ナビゲーションをスキップする
All Places > All Things PI - Ask, Discuss, Connect > Japan PI Square > ブログ > 2017 > March
2017

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の方がコードは書きやすいかと思います。

OSIsoftのインターフェイスには、バッファリング機能が備わっております。

この機能は、データソースから収集したデータを何らかの原因でPI Data Archiveに送れなくなった場合、

インターフェイスが一時的にデータを格納し、PI Data Archiveとの接続の回復後に格納したデータを送ることで、

データ欠損を防ぐ仕組みです。

 

あらかじめバッファリングを設定しておくと、

ネットワークの問題が発生した場合はもちろん、

マシンのメンテナンスやハードウェア・ソフトウェア更新などでPI Data Archiveを止めなくてはならない場合でも、

絶え間なく収集されるデータを途切れさせることなく復旧・更新ができます。

 

OSIsoftは、二種類のバッファリング機能を提供しております。

・API Buffer Server

・PI Buffer Subsystem

 

二つの機能の相違点の詳細につきましては、KB00042をご参照ください。(英語)

基本的には性能の高いPI Buffer Subssytemを使用することをお勧めいたします。

 

今回は、バージョン4.3以降のPI Buffer Subsystemの設定方法の手順をご紹介いたします。

 

事前準備

・インターフェイスのインストールされたマシンに、PI Buffer Subsystemもインストールされていることをご確認ください。

・あらかじめインターフェイスのサービスを作成し、実際にデータを収集できるか動作確認を行っておくことをお勧めいたします。

サービス作成の手順につきましては、この記事をご参照ください。

 

手順

 

  1. スタート > PI System > PI Interface Configuration Utilityを開く
  2. Tools > Bufferingをクリックすると、『PI Buffer Subsystemがこのシステム上で構成されていません。構成しますか?』というメッセージが表示されるので、はいをクリックする


(既にPI Buffer Subsystemの設定ができている場合は、構成されたBuffering Managerのウィンドウが開きます。この場合は、設定を行う必要はありません)

 

  3. 開かれるBuffering Managerのウィンドウにて、Continue with configurationをクリックする

 

  4. 既にインターフェイスのサービスが作成されている場合は、Detected PI Interfacesにサービスの一覧が表示されるので、Bufferのチェックボックスにチェックを入れてNextをクリックする


  5. PI Data Archiveにアクセスするための権限を設定する画面にて、権限を選ぶ


この画面では、PI Buffer Subsystemがどの権限を持ってPI Data Archiveに書き込みを行うかを設定します。

インターフェイスのサービスが書き込みを行う権限と同じ権限で問題ありません。

画面では、管理者権限であるpiadminを使用しています。この権限を使用する場合、強すぎる権限を与えることは推奨されませんというメッセージが表示されます。

 

  6. バッファリングデータの保存先を設定し、Nextをクリックする

一時的にデータを蓄積する保存先を設定します。

デフォルトではProgramData\OSIsoft\Bufferingとなります。

 

  7. 確認画面で、Connected successfullyと表示されたら、Exit new installation wizardをクリックする


 

これで、PI Buffer Subsystemが構成されました。

 

その後、PI Buffer Subsystemが有効になっていない場合は、以下のメッセージが表示されますので、はいをクリックします。


 

ICUのインターフェイスのGeneralに移動すると、Buffering Statusという欄が追加されています。

上記の手順を行っても追加されない場合は、ICUを一度閉じてもう一度開くことをお試しください。

 

Buffering StatusがOffになっている場合は、EnableボタンをクリックしてOnにし、インターフェイスを起動すると、バッファリングが有効な状態となります。

Enableボタンをクリックした際、手順5と同じ画面が再び表示されることがあります。

その場合は、再び手順に従い構成を行ってください。

何度構成を行っても手順5と同じ画面が表示される場合、ICUを一度閉じてもう一度開くことをお試しください。

 

Buffering StatusがOnになっていれば、バッファリングが有効な状態です。

インターフェイスを起動すると、PI Buffer Subsystemを介してデータがPI Data Archiveに送信されるようになり、PI Data Archiveとインターフェイス間の通信が途絶えても、データが蓄積されるようになります。

バッファリングの状態は、ICUのTools > Bufferingをクリックして開く、Buffering Managerで確認できます。


インターフェイスがPI Data Archiveと通信できなくなると、Buffering Managerの緑色のチェックマークが黄色の警告マークに変化し、キュー内のイベント数が増加していきます。


再び接続が回復すると、キュー内のイベント数が減少し、蓄積されたデータがPI Data Archiveに送信されます。

 

バッファリングが有効になっているかどうかを確認する簡単な方法として、PIPC.logを見る方法もあります。

インターフェイスを起動するたびに、PIPC.logに起動したインターフェイスの名前とバッファリングの有無が記録されます。

PIPC.logにBuffered[1]と記録されていれば、バッファリングが有効であるということになります。


DCSやPLCから、あるいはマシンのPerformance Counterなど、対応するデータを収集し、PI Data Archiveに送信するインターフェイスは、基本的にWindows サービスとして登録することで動作します。

登録を行う方法は、大きく分けて三つ存在します。

 

1. PI Interface Configuration Utility (PI ICU)を使用する

2. コマンド プロンプト上で-install コマンドを使用する (テキストエディタ等でbatファイルの編集が必要です)

3. コマンド プロンプト上でSC コマンドを使用する (テキストエディタ等でbatファイルの編集が必要です)

 

OSIsoftとしては、GUI上で比較的容易に操作が行えること、PIサーバー側にインターフェイスの情報が登録されることなどから、

特に理由がない限りは1のPI ICUを使用する方法をお勧めしております。

今回はこのPI ICUを使用する方法をご紹介いたします。

 

事前準備

・インターフェイスのプログラムのインストールが正しく行われていることをご確認ください。

・対象のデータソースの機器とインターフェイスマシン間の通信が行えるかをご確認ください。

・インターフェイスマシンとPIサーバーマシン間の通信が行えるかをご確認ください。

・PIサーバーマシン上で、インターフェイスマシンにPI TrustやPI Mappings等のアクセス認証がされていることをご確認ください。

 

手順

今回は例として、PI Performance monitor インターフェイスのサービス登録を行います。

 

  1. PIサーバーのマシンにて、 スタート > PI System > PI Interface Configuration Utilityを開く
  2. メニューから、New Windows Interface Instance from BAT File...を選択する




  3. PIPC\Interfaces\PIPefMonにあるPIPerfMon.bat_newファイルを開く

(ほとんどのインターフェイスは、PIPC\Interfaces\上にあるフォルダ内にbatファイルが存在します。そのファイルを開くことで、新しいサービスを作成できます)


  4. Select the host PI Data server/collectiveの欄で、対象のPIサーバーの名前を選ぶ

(AboutPI-SDKで登録されているサーバーがここで表示されます。一覧に対象のサーバー名が存在しない場合は、Add Serverボタンを押して追加してください)


  5. Serviceに移動し、Create/ Removeの欄でCreateボタンを押す

(これでWindowsのサービスが作成されます)


 

  6. 以下のメッセージが出現するので、はいを押し、開かれる二つのメモ帳のファイルpisrvsitestart.batにnet start サービス名 、pisrvsitestop.batにnet stop サービス名とそれぞれ記入して保存する

(これにより、マシンの起動時や終了時に連動してインターフェイスも起動・停止するようになります)



サービス名は手順5でService nameの欄に書かれた名前を記入してください。

 

  7. Windowsのサービス一覧を開き、追加されたPI Performance Monitor インターフェイスのサービスを右クリック > プロパティを選択し、ログオンのアカウントをローカル システム アカウントに変更する

(PI Performance Monitor インターフェイスにおいて、Performance Counterの情報を取得するにはローカル システム アカウントに変更する必要があります。ほかのインターフェイスでも、多くの場合は対象のデータソースにアクセスが可能なアカウントでサービスを起動する必要があります)

 

  8. サービスを起動する

 

これで、インターフェイスのサービスが作成され、サービスが起動します。

この手順とは別に、多くのインターフェイスでは固有の設定が必要となる場合があります。

例えばPI Interface for OPC DAでは、接続先のOPCサーバーの名前などを指定する必要があります。

ICUのGeneralの下にあるインターフェイスの固有設定に移動することで設定ができます。


 

また、動作確認でサービスを起動する際には、PI message logとPIPC logを表示しておくことをお勧めいたします。

何らかの問題が発生してデータが収集できない場合、その原因がログに表示されますので、その情報をもとにトラブルシューティングを行ってください。

ICUで以下の二つのボタンを押すと、PI message logとPIPC logの二つのログをコマンド プロンプト上に表示することができます。


 

 

以下のKBも併せてご参照ください。(英語)

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

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

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となっています。リンク先にもサンプルコードがあるので、そちらも併せてご確認ください。

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

先週終わった「Visualization Virtual Hackathon」というPI Coresightのカスタムシンボルのハッカソンの提出が各チームからされました。

 

世界中のPIユーザー様、パートナー様と弊社の社員が参加しました。

それぞれ提出されたカスタムシンボルに紹介ビデオがある上に、ソースコードも記載されています。

 

カスタムシンボルについてご興味がある方、是非、御覧ください。

Visualization Virtual Hackathon: Submissions

 

僕はJSKのチームの一人として参加致しました。PI CoresightにAFツリーを表示するカスタムシンボルを作成しました。

PI Visualization Hackathon - JKS Staleness Alert Tree

AlarmTree.gif