IoT Data Share はPLCを含めた製造機械のデータを読み書きしますが、WEB-APIを備えており、外部からRestでデータの読み書きをリクエストすることもできます。
つまり、Excelから IoT Data Share を介してPLC等のデータを読み書きすることもできます。これって、いろんなことに応用できそうですよね。その気になれば、Excelから製造機械をコントロールすることもできるでしょう。
とりあえず、IoT Data Share にリクエストするVBAのクラスを作成してみました。
この記事では、IoT Data Share にリクエストするVBAのクラス IDSClient の導入と使い方を解説します。
IoT Data Share はデンソーウェーブ様のサイトからダウンロードすることができます。ダウンロードした IoT Data Share は、試行ライセンスで動作させることができます。試行ライセンスでは、連続動作1時間という制限付きで使用することができます。
https://www.denso-wave.com/ja/system/iot/download/application/share.html
IoT Data Share の設定
PLC等を読み書きするなどの設定については、ここでは記載しませんので、必要であればマニュアルなどを参照してください。
ここでは、WEB-APIを使用してデータを読み書きするための設定について書きます。
Web API 設定
メニュー[エクステンション]-[Web API]-[設定]でダイアログを表示させ[有効]をオンにします。
アイテムの属性を変更
データを書き込む場合には、当該アイテムの[プロパティ]-[一般]-[属性]を[読み込み/書き込み]に変更します。
IoT Data Server の設定を変更したら、プロジェクトを再起動しましょう。
ライブラリ参照とクラスのインポート
拡張子 xlsm でExcelブックを作成します。
ライブラリの参照設定
メニュー[開発]-[コードの表示]でVBAのコード作成環境を表示させます。
[ツール]-[参照設定]でダイアログを開き、以下のライブラリを参照するよう設定します。
- Microsoft Scripting Runtime
- Microsoft XML v6.0
前提コードをインポート
以下の3つのコードをインポートします。
- VBA-JSON
- RestClient
- IDSClient
VBA-JSON
有志から提供いただいているコードを利用させていただきます。
Download VBA-JSON
RestClient
今回作成したクラスのひとつです。
Download RestClient
IDSClient
今回作成したクラスのひとつです。
Download IDSClient
ダウンロードした VBA-JSON を[標準モジュール]-[ファイルのインポート]でインポートします。
ダウンロードした RestClient と IDSClient を[クラスモジュール]-[ファイルのインポート]でインポートします。
IDSClientクラス
url プロパティ
IoT Data Share の WEB-API へのURLを指定します。
proxyHost プロパティ
IoT Data Share の WEB-API へのアクセスにプロキシを通過させる場合には、プロキシのアドレスとポート番号を指定します。
credentialUser プロパティ
IoT Data Share の WEB-API へのアクセスにプロキシを通過させ、かつその際に認証が必要となる場合には、認証のためのユーザIDを指定します。
credentialPassword プロパティ
IoT Data Share の WEB-API へのアクセスにプロキシを通過させ、かつその際に認証が必要となる場合には、認証のためのパスワードを指定します。
credentialPassword プロパティ
IoT Data Share の WEB-API へのアクセスにプロキシを通過させ、かつその際に認証が必要となる場合には、認証のためのパスワードを指定します。
GetValue メソッド
IoT Data Share を介して、デバイスからデータを取得します。
構文)Function GetValue (controller, item)
controller は IoT Data Share 上に定義されたコレクターの名称です。
item はIoT Data Share 上に定義された、コレクター配下のアイテムの名称です。
GetValue はデバイスから取得されたデータを返します。
PutValue メソッド
IoT Data Share を介して、デバイスにデータを書き込みます。
構文)Function PutValue (controller, item, value) as Boolean
controller は IoT Data Share 上に定義されたコレクターの名称です。
item はIoT Data Share 上に定義された、コレクター配下のアイテムの名称です。
item は書き込みデータの値です。
PutValue はデバイスへのデータ書き込みの成功/失敗を返します。
GetStatus メソッド
GetValue, PutValue による WEB-API のステータスを返します。ここで示すステータスとは、HTTPのステータスです。
構文)Function GetStatus ()
GetResponce メソッド
GetValue, PutValue による WEB-API で得たレスポンス・データを返します。これは連想配列であり Directory 型のデータです。
構文)Function GetResponce () as Directory
GetResponceJson メソッド
GetValue, PutValue による WEB-API で得たレスポンス・データを返します。これはJSON文字列です。
構文)Function GetResponceJson ()
サンプル
IDSClient を使ったPLC等のデバイス・アクセスを、サンプルを使って解説します。
サンプルでは、下図のような画面(Excelシート)を使って、IoT Data Share を介してPLC等のデバイスを読み書きします。サンプルでは理解しやすいように、このようなシンプルな画面を用いています。
サンプルでは、[Get]ボタンでデータを取得し、[Set]ボタンでデータを書き込みます。
[Get]ボタンでは、シート上に指定された CONTROLLER, ITEM に該当するデータが取得され、VALUEにデータが表示されます。
[Set]ボタンでは、シート上に指定された CONTROLLER, ITEM に該当するデバイスのアドレスに、VALUE で指定された値が書き込まれます。
各ボタンのコードは以下のとおりです。
Get
Option Explicit
Private Const proxyHost = "proxy:8080"
Private Const credentialUser = "hoge"
Private Const credentialPassword = "hogehoge"
Private Const url = "http://hoge:5225/"
Private Sub CommandButton1_Click()
GetValue
End Sub
Private Sub GetValue()
On Error GoTo GetValueError
Dim ids As IDSClient
Set ids = New IDSClient
ids.url = url
ids.proxyHost = proxyHost
ids.credentialUser = credentialUser
ids.credentialPassword = credentialPassword
Dim objSheet As Worksheet
Set objSheet = ThisWorkbook.Worksheets("Sheet1")
Dim controller, item
controller = objSheet.Range("B6").value
item = objSheet.Range("C6").value
Dim value
value = ids.GetValue(controller, item)
Debug.Print "GetValueレスポンス"
Debug.Print ids.GetStatus
Debug.Print ids.GetResponceJson
If IsNull(value) Then
MsgBox "Error"
Exit Sub
End If
objSheet.Range("D6").value = value
GetValueError:
If Err <> 0 Then MsgBox Error(Err), vbExclamation, "GetValueError"
On Error Resume Next
Err.Clear
Exit Sub
End Sub
Set
上から6ステップは Get との共有部です。
Option Explicit
Private Const proxyHost = "proxy:8080"
Private Const credentialUser = "hoge"
Private Const credentialPassword = "hogehoge"
Private Const url = "http://hoge:5225/"
Private Sub CommandButton2_Click()
SetValue
End Sub
Private Sub SetValue()
On Error GoTo SetValueError
Dim ids As IDSClient
Set ids = New IDSClient
ids.url = url
ids.proxyHost = proxyHost
ids.credentialUser = credentialUser
ids.credentialPassword = credentialPassword
Dim objSheet As Worksheet
Set objSheet = ThisWorkbook.Worksheets("Sheet1")
Dim controller, item, value
controller = objSheet.Range("B6").value
item = objSheet.Range("C6").value
value = objSheet.Range("D6").value
If Not ids.PutValue(controller, item, value) Then MsgBox "Error"
Debug.Print "PutValueレスポンス"
Debug.Print ids.GetStatus
Debug.Print ids.GetResponceJson
SetValueError:
If Err <> 0 Then MsgBox Error(Err), vbExclamation, "SetValueError"
On Error Resume Next
Err.Clear
Exit Sub
End Sub