EXCEL VBAからPI AFサーバにアクセスすることを検討していますが、どのようなアクセス方法があるのか、またどのアクセス方法が推奨できるのか教えてください。AF SDKはWrapperを用いるようなことが英語の記事として出ていましたが、詳細を参照することはできませんでした。こちらについても情報をいただけると助かります。
EXCEL VBAからPI AFサーバにアクセスすることを検討していますが、どのようなアクセス方法があるのか、またどのアクセス方法が推奨できるのか教えてください。AF SDKはWrapperを用いるようなことが英語の記事として出ていましたが、詳細を参照することはできませんでした。こちらについても情報をいただけると助かります。
回答ありがとうございます。
EXCELのVBAによるPI AFのエレメント&属性やイベントフレームのデータにアクセスする方法は提示された方法以外にないということでしょうか?OLEDBなどSQLでのアクセスであれば可能でしょうか?あまり特殊な方法でのアクセスは用いたくありません。
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のホスト名、利用したいデータベースめいなど)をシートに入れます。

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から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サーバーへアクセスするという手法が使えそうな気がするのですが、どうでしょうか?
もし可能であれば、サンプルコードなど提示いただけると助かります。