0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

Excelで生産ラインをコントロールする

Last updated at Posted at 2023-12-19

Screenshot from 2023-12-19 11-27-28.png

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]-[設定]でダイアログを表示させ[有効]をオンにします。
Screenshot from 2023-12-17 12-22-42.png

アイテムの属性を変更

データを書き込む場合には、当該アイテムの[プロパティ]-[一般]-[属性]を[読み込み/書き込み]に変更します。
Screenshot from 2023-12-17 12-23-56.png

IoT Data Server の設定を変更したら、プロジェクトを再起動しましょう。

ライブラリ参照とクラスのインポート

拡張子 xlsm でExcelブックを作成します。

ライブラリの参照設定

メニュー[開発]-[コードの表示]でVBAのコード作成環境を表示させます。
Screenshot from 2023-12-17 13-46-11.png

[ツール]-[参照設定]でダイアログを開き、以下のライブラリを参照するよう設定します。

  • Microsoft Scripting Runtime
  • Microsoft XML v6.0

Screenshot from 2023-12-17 13-48-57.png

前提コードをインポート

以下の3つのコードをインポートします。

  • VBA-JSON
  • RestClient
  • IDSClient

VBA-JSON
有志から提供いただいているコードを利用させていただきます。
Download VBA-JSON

RestClient
今回作成したクラスのひとつです。
Download RestClient

IDSClient
今回作成したクラスのひとつです。
Download IDSClient

ダウンロードした VBA-JSON を[標準モジュール]-[ファイルのインポート]でインポートします。
Screenshot from 2023-12-19 16-59-26.png

ダウンロードした RestClient と IDSClient を[クラスモジュール]-[ファイルのインポート]でインポートします。
Screenshot from 2023-12-19 16-59-47.png

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等のデバイスを読み書きします。サンプルでは理解しやすいように、このようなシンプルな画面を用いています。

Screenshot from 2023-12-17 12-02-37.png

サンプルでは、[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
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?