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

![Screenshot from 2023-12-19 11-27-28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2737842/63427bac-a0b9-94dc-c092-16115de6bd0f.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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2737842/cbdf5d0f-1ab5-03d9-1a90-82e54f261136.png)

### アイテムの属性を変更
データを書き込む場合には、当該アイテムの[プロパティ]-[一般]-[属性]を[読み込み/書き込み]に変更します。
![Screenshot from 2023-12-17 12-23-56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2737842/f1b6ff85-f21c-bc29-085e-3d7a65db9651.png)

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

# ライブラリ参照とクラスのインポート
拡張子 xlsm でExcelブックを作成します。

### ライブラリの参照設定
メニュー[開発]-[コードの表示]でVBAのコード作成環境を表示させます。
![Screenshot from 2023-12-17 13-46-11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2737842/77338444-738b-6808-8e25-73d6abdd2b99.png)

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

![Screenshot from 2023-12-17 13-48-57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2737842/14a8c947-92ac-2953-6065-d72bc92d8fa2.png)

### 前提コードをインポート
以下の3つのコードをインポートします。
- VBA-JSON
- RestClient
- IDSClient

__VBA-JSON__
有志から提供いただいているコードを利用させていただきます。
[Download VBA-JSON](https://github.com/VBA-tools/VBA-JSON)

https://github.com/VBA-tools/VBA-JSON

__RestClient__
今回作成したクラスのひとつです。
[Download RestClient](https://coolmagic.guy.jp/computer/download/restclient_en.php)

https://coolmagic.guy.jp/computer/download/restclient_en.php

__IDSClient__
今回作成したクラスのひとつです。
[Download IDSClient](https://coolmagic.guy.jp/computer/download/idsclient_en.php)

https://coolmagic.guy.jp/computer/download/idsclient_en.php

ダウンロードした VBA-JSON を[標準モジュール]-[ファイルのインポート]でインポートします。
![Screenshot from 2023-12-19 16-59-26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2737842/fe25a380-c29d-87cc-0048-6315c6ecd368.png)

ダウンロードした RestClient と IDSClient を[クラスモジュール]-[ファイルのインポート]でインポートします。
![Screenshot from 2023-12-19 16-59-47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2737842/5d3e4907-a8e8-1eb2-a144-7d88675a1990.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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2737842/f061f8f7-b9ce-aec3-ffff-441beaa5adff.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
```