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

Japan PI Square

July 23, 2018 前日 翌日
Jerome Lefebvre

PIとMaximoの連携

投稿者 Jerome Lefebvre 従業員 Jul 23, 2018

状態基準保全のガイドブックが日本語で公開されたので、コンテンツの中身を実現したく本記事を書きました。

 

5章にPI SystemCMMSの連携の構成がいくつか紹介されています。

この記事では、Asset Analyticsを利用し、MaximoというCMMSにメーターのデータを更新する事例を紹介したいと思っています。

 

シナリオ4

残念ながら、Asset AnalyticsからMaximoへの直接データ送信は不可能です。なぜならば、Maximoにウェブ経由でデータを渡すためには、Token認証の接続が必要ですが、AF通信の機能は基本認証、Kerberos認証と匿名認証だけを対応しているからです。そのために、通信のために小さいウェブサーバー(Connector)を開発しました。

 
 

 

下記の事例で、AF上でポンプの稼働時間を計算し、このメーターのデータをMaximoに送信します。

稼働時間のデータのようなメーターデータであれば、一日一回のスケジュールで送れば十分です。

 

Maximo

Maximoの管理画面で、下記のように設備の一つのメーターデータを確認できます。

RUNHOURSというメーターが定義されて、現在、2018年2月3日にこのポンプの稼働時間は8392時間であったと確認できます。

 

この値の更新のために、MaximoRest APIに設備情報、メーターの名前などを送信する必要があります。

そのために、下記のようなリクエストを作る必要があります。

 

 

URLのパラメーターに設備の名前(ASSETNUM)、メーターの名前(METERNAME)などがあると確認できます。

このリクエストに必要な認証の情報もヘッダーにあります。

 

 

現在、AF通信はこの認証方法にまだ対応していませんが、下記のUserVoiceのアイテムがあります。ご興味があれば投票してください。

https://feedback.osisoft.com/forums/555148-pi-server/suggestions/33151276-enable-headers-for-soap-and-rest-web-service-notif

 

AF

ポンプの稼働時間を計算するために、センサーからポンプの流量(Flow Rate)を取得し、Maximoから最後の補修日(Last Maintance)を取得して、PIタグに保存しました。

 

ポンプのセンサーからON/OFFの信号の取得できないですが、流量がわかっているので、問題なくON/OFF信号が計算できます。

 

 

精度が落ちないために上記の計算をイベントトリガーに設定しています。

ON/OFFの信号があるので、稼働時間を簡単に計算できます。

稼働時間の計算が重い計算で、できれば頻繁に走らないほうがよいです。上記では一日一回だけ計算しています。

 

この計算を利用している補修のチームは、補修のスケジュールは毎週一回ぐらいと決めているので、頻繁に新規のデータを送っても、利用しないので、無駄の計算は実行する必要がありません。

■通信

AFの通信のトリガーはイベントフレームが作成されることです。一日毎にすべてのポンプの稼働時間を送るために、デーリーのイベントフレームを作成します。

注意:この方法で膨大のイベントフレームが作成され、その場合は、AFのパフォーマンスが悪化する可能性があります。Maximoに稼働時間を通信した後に、このイベントフレームを問題なく削除することです。イベントフレームの削除のサンプルコードは下記にあります。

 

■通信のトリガーとなるイベントフレーム

イベントフレームの作成のために、下記の定義を利用します。

 

結果のプレビューを確認すると、この分析は一日毎に一つのイベントフレームが作成される。

 

 

WebServiceの設定

このWebServiceはプロクシーのサーバーに稼働時間を通信するために、プロクシーサーバーのホスト名を記入します。プロクシーサーバーがPostリクエストを受けるため、Postも定義します。

 

Webserviceとトリガーとなるイベントフレームがあるので、下記のように通信を定義します。

 

 

Maximoに送りたい値

上記にあったリクエストにASSETNUMNEWREADINGNEWREADINGDATESITEIDのパラメーターをMaximoにリクエストがあります。このパラメーターをポンプのエレメントの属性に定義します。

 

この定義を通信のメッセージに定義します。

 

 

■プロクシーサーバー

上記の設定で、一日にすべてのポンプの稼働時間をプロクシーサーバーに通信します。

このプロクシーサーバーはAFからくる通信を受け、Maximoへのリクエストを作成します。このコードを下記のGitHubのページで確認してください。

https://github.com/JeromeLefebvre/Proxy-Server-for-PI-System-to-Maximo

 

 

■結果

高い精度の稼働時間はMaximo側で一日毎に更新されています。

PI Server 2018がリリースされ、新しい機能が多いですが、すぐに利用してみた機能は下記に公開しました。

PI Server 2018がリリースされました

体重の予測モデル

 

今回は一つのAF SDKの関数を紹介したいと思っています。

 

イベントフレームの機能は非常に便利だと思いますが、一つのAFサーバーで保存できるイベントフレームの数は限れています。

そのために、必要のないイベントフレームを周期で削除することが必要になるケースがあります。

 

イベントフレームを削除のために、PI System Explorer、AFDiagやAF SDKなどいろいろな方法があります。

AF 2018のバージョンからAF SDKからよりいい方法が提供されました。

2018のバージョンからAFEventFrame.DeleteEventFramesの関数があり、イベントフレームのIDのリストを取得すると一括で膨大のイベントフレームの削除は可能です。

IDを取得するために、下記のサンプルコードはAFEventFrameSearchのオブジェクトを利用します。

 

using System;
using System.Linq;
using System.Collections.Generic;
using OSIsoft.AF;
using OSIsoft.AF.EventFrame;
using OSIsoft.AF.Search;


namespace MassEFDelete
{
    class Program
    {
        static void Main(string[] args)
        {
            PISystem af = new PISystems().DefaultPISystem;
            AFDatabase db = af.Databases["Demo_Maximo_Integration"];


            // Retrieve all event frames that match the query, then access their GUID to delete them
            string query = @"Template:'Daily Event Frame' End:<'*-1d'";
            AFEventFrameSearch search = new AFEventFrameSearch(db, "Daily Event Frames", query);
            List<Guid> ids = search.FindObjectIds().ToList();
            
            AFEventFrame.DeleteEventFrames(af, ids);
        }
    }
}

 

このサンプルコードの実行結果です。

 

イベントフレームを検索するためにパフォーマンスのコツを下記の記事にいろいろあります。

AFEventFrameSearch Class