EXCEL VBAからのPI AFアクセス方法

EXCEL VBAからPI AFサーバにアクセスすることを検討していますが、どのようなアクセス方法があるのか、またどのアクセス方法が推奨できるのか教えてください。AF SDKはWrapperを用いるようなことが英語の記事として出ていましたが、詳細を参照することはできませんでした。こちらについても情報をいただけると助かります。

Parents
  • AF SDK Wrapperは推奨されないので、新規の開発では利用しないほうがいいと考えられます。

     

    一番単純ではVBAからPI Web APIにリクエストを出します。

    注意点:

      - VBAの中にJSONの処理する関数がないため、https://github.com/VBA-tools/VBA-JSONのようなライブラリを利用することが必要です。

     - VBAからPI Web APIにリクエストに送るヘルパーライブラリもないので、ご自身で作成が必要です。

     

     

    ***サンプルコード***

    勉強のために、下記のサンプルコードを提供しています。プロダクションのコードではありません。

     

    下記のサンプルはPIに接続し、AFとPI ServerのWebIDを取得します。

    まず、接続情報(PI Web APとAFのホスト名、利用したいデータベースめいなど)をシートに入れます。


    pastedImage_2.png.png

     

    Connectボタンを押すと、PI Web APIの状態(稼働中とか)を取得し、AF、PI、データベースのWebIDを取得します。

     

     

    Private log As Object
    Private LogLevel As Integer
    Function GetWebID(urlStump) As String
     Dim Json As Object
     Set Json = PIWebAPIGet(urlStump)
     GetWebID = Json("WebId")
    End Function
    
    Function PIWebAPIGet(urlStump) As Object
     Dim Username As String
     Dim Password As String
     Dim PIWebAPIRoot As String
     Dim Settings As Worksheet
     Dim hReq As Object
     Dim url As String
     
     Set Settings = ThisWorkbook.Worksheets(1)
     PIWebAPIRoot = Settings.Range("C1").Value
     Username = Settings.Range("C5").Value
     Password = Settings.Range("C6").Value
     url = PIWebAPIRoot + urlStump
     
     Set hReq = CreateObject("MSXML2.XMLHTTP")
     With hReq
     .Open "GET", url, False, Username, Password
     .Send
     End With
     Set PIWebAPIGet = JsonConverter.ParseJson(hReq.ResponseText)
     
     If LogLevel > 1 Then
     log.WriteLine "Request: GET"
     log.WriteLine url
     log.WriteLine hReq.Status
     log.WriteLine hReq.ResponseText
     log.WriteLine "---------------------------"
     log.WriteLine ""
     End If
     
    End Function
    
    Sub ConnectToPI()
     Dim WebID As String
     Dim Settings As Worksheet
     Dim DA As String
     Dim AF As String
     Dim DB As String
     Dim LogLevel As Integer
     Dim Logpath As String
     
     Set Settings = ThisWorkbook.Worksheets(1)
     
     ' Check if logging is enabled
     LogLevel = Settings.Range("C7").Value
     If LogLevel > 0 Then
     Logpath = Settings.Range("C8").Value
     CreateLogFile Logpath, LogLevel
     End If
    
     ' Get WebIDs of the two servers
     AF = Settings.Range("C2").Value
     DA = Settings.Range("C3").Value
     DB = Settings.Range("C4").Value
     WebID = GetWebID("assetservers?name=" + AF)
     Settings.Range("D2").Value = WebID
     
     WebID = GetWebID("dataservers?name=" + DA)
     Settings.Range("D3").Value = WebID
     
     Dim path As String
     
     path = AF + "\" + DB
     
     WebID = GetWebID("assetDatabases?path=\\" + path)
     Settings.Range("D4").Value = WebID
     
     ' Get the state of PI Web API
     
     Dim State As String
     State = PIWebAPIGet("system/status")("State")
     Settings.Range("D1").Value = State
     
     Dim Json As Object
     Set Json = PIWebAPIGet("system/userinfo")
     
     Dim index As Long
     Dim term As String
     
     For index = 5 To 9
     term = Settings.Range("D" + CStr(index)).Value
     Settings.Range("E" + CStr(index)).Value = Json(term)
     Next index
     
    End Sub
    

  • 回答ありがとうございます。

    EXCELのVBAによるPI AFのエレメント&属性やイベントフレームのデータにアクセスする方法は提示された方法以外にないということでしょうか?OLEDBなどSQLでのアクセスであれば可能でしょうか?あまり特殊な方法でのアクセスは用いたくありません。

  • ExcelからSQLデータベースにの接続機能があるので、ExcelからPI OLEDB Enterpriseを利用するのは可能ですが、

    PI OLEDB Enterpriseは読み専用なので、イベントフレームなどの作成が不可能です。

     

    去年にリリースされたPI OLEDB Enterpriseのクエリーエンジンとクエリーのスキーマが変わったので、下記にあるトレーディングを参照してください。

  • 私も、Excel VBAからAFサーバーへアクセスできないかと検討し、いろいろと調べています。

    VBAからPower Shell(WshShellオブジェクト)経由でPowerShell Tools for the PI Systemを使ってAFサーバーへアクセスするという手法が使えそうな気がするのですが、どうでしょうか?

     

    もし可能であれば、サンプルコードなど提示いただけると助かります。

Reply
  • 私も、Excel VBAからAFサーバーへアクセスできないかと検討し、いろいろと調べています。

    VBAからPower Shell(WshShellオブジェクト)経由でPowerShell Tools for the PI Systemを使ってAFサーバーへアクセスするという手法が使えそうな気がするのですが、どうでしょうか?

     

    もし可能であれば、サンプルコードなど提示いただけると助かります。

Children
No Data