PLCからゲートウェイでデータを取得しデータベースにJSONで保存 (3)

PLCからゲートウェイでデータを取得し、データベースにJSONで保存します。複数回に分けて、サンプルを用いて解説します。
前回は、ゲートウェイを用いてPLCからデータを取得し、ゲートウェイのメモリに保存しました。
[PLCからゲートウェイでデータを取得しデータベースにJSONで保存 (2)](https://qiita.com/COOLMAGICPRODU1/items/370b1bd37dca8a4fd9ae)

今回はこのデータをサーバに送信します。
![99f8027812fe841fafbb82cb316db3e062d514f019ff6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2737842/57fae69b-42ac-b7b7-98e3-582e997dd10f.png)
サンプルで使用するゲートウェイは、引き続きWEINTEK製ゲートウェイの開発環境であるEasyBuilderのシミュレーターです。WEINTEK製ゲートウェイはサーバへのデータ送信に2種類のインタフェースを持っており、そのひとつがMQTTです。サンプルではMQTTを使用してサーバにデータを送信します。

サーバ側にはMQTTのブローカーが必要となります。サンプルでは、MQTTブローカーとしてMosquittoを使用します。
![ad4d70ef98a1d741deedb1e19d7eef3762d52f8173167.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2737842/d2f1be2f-0a1a-2e46-2e7c-2075491c2f83.png)
Mosquittoはテストの場面で必要となります。サンプルの実装に加えて、テストをしてみたいという方は、自己責任でMosquitto、あるいは他のMQTTブローカーを準備してください。Mosquittoの準備については以下を参照してください。
[【MQTT】MQTTの導入 mosquittoのインストール/動作確認まで](https://qiita.com/koichi_baseball/items/8fa9e0bdbe6d0aebe57d)

## ゲートウェイのMQTT送信設定
データをサーバに送信するために、前回まで作成したプロジェクトに設定を加えます。

EasyBuilderのメニュー[IIoT/エネルギー]-[MQTT]をクリックすます。
![27403bdd1beb17ed91a9e1faad0c1ca462d5180119baf.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2737842/b20d42df-329f-3077-4bd9-3bb32281c3ce.png)
[有効にする]をクリックします。
![419a1bed20d2da61b4a260fcfaa1a92f62d518b58b47d.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2737842/4343bcc8-eaf5-fbd3-8f5b-9a9723b52a17.png)
[一般的な属性]はデフォルトのままです。サンプルでは、ゲートウェイのシミュレーターと同じWindowsでMosquittoを動作させるので、IPアドレスは127.0.0.1のままです。[OK]ボタンをクリックします。
![3643faef7ae563403b18ecd92652d34562d5191b1eb6a.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2737842/48911765-2eb8-6c70-f346-f321024322fd.png)
[トピック発行者]タブで[新規作成]ボタンをクリックします。
![0602c7b6837e71a182c385cd85680f2862d51a01c7f24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2737842/46b42832-2f0e-cf93-5a01-b354662452fc.png)
![999d37a64349d3064b39bf08d0b2694f62d51a4c34273.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2737842/daa8105e-197d-ffdd-7a3e-100ae8bc6619.png)
[一般的な属性]タブで以下のように設定します。
中ほどの設定、[アドレス]のLBと0は、LB0がONになったらMQTTでサーバにデータを送信する、という意図です。
![01b4e17a1817470a004336900fa7ffbb62d51b4209fc2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2737842/3c4a0d76-7a44-5c3a-8969-6c036f642d93.png)
[アドレス]タブに移り、[新規作成]ボタンをクリックします。
![59910b8f3292a98b49714a41816f8c3762d51c263f6ec.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2737842/7e5804aa-e799-0a80-1300-1540ff2cbdc4.png)
![58b56e5ee811a948f574326534769a5762d51c2fa8f19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2737842/eb05e8c5-5bfa-6525-e25a-4c759b172e03.png)
ダイアログに以下のように設定し、[OK]ボタンをクリックします。
[アドレス]の設定LWと0は、LW0にあるデータを送信する、という意図です。LW0には、PLCから取得したデータが置かれています。
![de2bc7ffeecf75b76dec7522f7a27fd162d51cb082328.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2737842/2bc264eb-1f5b-1508-3d60-3d536cfd6b66.png)
[MQTTトピック発行者オブジェクト属性]ウィンドウの[OK]ボタンをクリックします。
![bc638bc4ee1e717109c9a3a6157e5d5f62d51d48b7489.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2737842/5484cc18-a9cb-8f2b-47e7-dd8cfef1148d.png)
[MQTT]ウィンドウの[終了]ボタンをクリックします。
![9534a197b16903a10274457bdd2e71e662d51dbac95f8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2737842/651ff3c9-e410-0c9d-d53f-9aa253ee292e.png)
以上で、ゲートウェイのMQTT設定は完了です。
## ゲートウェイのプログラミング
前回作成したゲートウェイのプログラムに、若干のステップを追加します。

EasyBuilderのメニュー[プロジェクト]-[マクロ]をクリックします。
![b6df62bab4d0a16cee1095a55dcb836f62d5216eb34e4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2737842/2f74f71c-ab04-f320-95fd-50e92cfafc1b.png)
![5f0828812556ea6a775135414a365cc362d52185a7fbe.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2737842/aef69ea3-c262-e0f6-c882-73f6a7245c05.png)
[ID : 001]をダブル・クリックします。
![62d62aa6b4b8125fc109c443ad5f47b262d52233bc50d.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2737842/7cd5a36c-4dcd-5e9b-6db2-54d2cf91b83b.png)
以下のように、ステップを追加します。
![48e72c305c89ae10a73ee74cb389156462d5295243ba1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2737842/9cf47ada-6d25-905e-df55-d338b5b5e609.png)
6〜10行目では、今回取得したデータと前回取得したデータを比較して、同じデータであったら何もしない、と書いています。業務上、連続する同じデータは不要という場合に、サーバに無駄なデータを送信しません。
13〜14行目は、MQTT送信をキックするために、ゲートウェイのLB0をオンにします。LB0はMQTT送信後に自動でオフになります（そのようにMQTTを設定しました）。

コピーしたい方はこちらからどうぞ。
```C
macro_command main()
        unsigned short        x40001 = 0
        GetData(x40001, "MODBUS TCP/IP (32-Bit)", 4x, 1, 1)
        
        unsigned short        LW0 = 0
        GetData(LW0, "Local HMI", LW, 0, 1)
        if x40001 == LW0 then
                return
        end if

        SetData(x40001, "Local HMI", LW, 0, 1)
        bool        LB0 = 1        
        SetData(LB0, "Local HMI", LB, 0, 1)

end macro_command
```
エディタの[閉じる]ボタンをクリックします。
![901952ea06c21742a0a40d878071bca462d56c6e2048c.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2737842/cb4f3111-93c7-7cce-4d4c-3295fceda0ca.png)
[コンパイルが成功]に[ID : 000]があることを確認します。
![62d62aa6b4b8125fc109c443ad5f47b262d56ca4cea61.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2737842/4ea1ad2d-65ef-82d8-b576-7f98a56ed052.png)
> ### 連続する同じデータは不要
> 連続する同じデータは不要という仕様は、よくある仕様です。例えば、工場の生産マシンで生産される製品の数をPLCで数えている場合、そのカウンタがこれに該当します。変化のないカウント値は不要なはずです。この不要なデータをネットワークやサーバに垂れ流すと、ネットワークやサーバにとって無駄な負荷となります。データベースのサイズも無駄に膨れ上がります。「IoTのデータは無駄なデータばかりだけど、そういうものだ」と考えられがちですが、実は、設計次第でエレガントなシステムになります。
> ただし、ロガーなどを使って無秩序に記録したデータをデータベースにロードする、というような場合は、不要なデータの排除には苦労します。
> 連続する同じデータをサーバ側で捨てるテクニックもあります。これについては機会があれば、別途解説をさせていただきます。
## テスト
テストには、MQTTブローカーと、一時的にテストで使用するMQTTの汎用サブスクライバーが必要となります。
これらは、Mosquittoが提供してくれます。Mosquittoの準備については以下を参照してください。
[【MQTT】MQTTの導入 mosquittoのインストール/動作確認まで](https://qiita.com/koichi_baseball/items/8fa9e0bdbe6d0aebe57d)

私の開発・テスト環境では、MosquittoブローカーはWindowsの設定で自動起動にしてあり、常に実行中です。
![d3c132e88775428a7334c810a8606fc362d5203d78fd4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2737842/0e3a9201-a724-723b-a8a5-0ae9d5f0706d.png)
> 注意: 他のサーバ上のMosquittoへ送信する場合には注意が必要です。Mosquittoは、標準の設定では外部からのメッセージを受け付けません。この場合は、外部からのメッセージを受け付けるよう、Mosquittoの設定を変更する必要があります。

受信側となるMQTTサブスクライバーを起動しておきます。
Mosquittoにはコマンド起動可能な簡単なサブスクライバーが付属しています。Windowsでは、このコマンドはMosquittoのインストール・フォルダにあります。
以下のように起動しておきます。
```
c:\Program Files\mosquitto>mosquitto_sub -h localhost -t sample
```
オプション -h localhost は、localhost上のブローカーから受信することを示しています。-t sample はトピック名を示しており、ゲートウェイのMQTT設定で設定したトピック名と同じである必要があります。mosquitto_sub はトピックsampleのメッセージをひたすら待ち続けます。

前回のテストと同様に、Modbus/TCPシミュレーター"mod_RSsim.exe"を起動します。
![59603780d55c186e1a70e1b112539c5562d52790afb85.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2737842/3e8981a1-cf2f-0e2d-eb53-c08ea2102fb7.png)
> 注意: "mod_RSsim.exe"は連続起動に時間制限がある点に注意してください。制限を超えた場合は再起動させます。

EasyBuilderのメニュー[プロジェクト]-[オンラインシミュレーション]をクリックします。
![439fd0e9432caba5e9ed0546875106a462d528085da76.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2737842/ad7f90b6-8940-5647-b576-fb6583ec8582.png)
シミュレーターが起動したことを確認します。
![75590b5b1988d3633f2403c0eda4c4f762d5285c8e0d4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2737842/0bcbff48-9c16-d30f-b434-2c46472616ac.png)
前回のテストと同様に、Mdobus/TCPシミュレーターのアドレス40001のデータを任意の数値に書き換えます。
![117891e3a7d9cfb3ad2aee7bc5db0e2662d5287c3564a.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2737842/eb82f571-b0cb-3c96-e424-965d1e92dede.png)
Mosquittoのサブスクライバーが、受信したデータをコンソールに出力します。
![e6004c9810a653ca72e7b22384c6d9b862d525e0e1ffc.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2737842/cc842d41-b615-7acd-3c78-173e76a1806c.png)
ゲートウェイのプログラムで、データに変化があった場合にのみ送信、としているため同じデータが次々と送られてくることはありません。ゲートウェイを単なるプロトコル変換器だと考えているなら、それは誤りです。

ゲートウェイのMQTT設定にて、タイムスタンプを付与するよう設定したため、tsという名前でゲートウェイの時刻が送られてきます。
> このゲートウェイの時刻はサーバの時刻と必ずしも一致しない、という点を設計上留意してください。時刻の取扱いについては別途、解説をさせていただきます。

以上でテストは終了です。
## 次回
続きは次回とさせていただきます。
次回は、データベースを準備します。

[PLCからゲートウェイでデータを取得しデータベースにJSONで保存 (1)](https://qiita.com/COOLMAGICPRODU1/items/31513295943763365915)
[PLCからゲートウェイでデータを取得しデータベースにJSONで保存 (2)](https://qiita.com/COOLMAGICPRODU1/items/370b1bd37dca8a4fd9ae)
[PLCからゲートウェイでデータを取得しデータベースにJSONで保存 (4)](https://qiita.com/COOLMAGICPRODU1/items/449f206bbdf07c8e491b)
[PLCからゲートウェイでデータを取得しデータベースにJSONで保存 (5)](https://qiita.com/COOLMAGICPRODU1/items/92724b0908143275cfac)
[PLCからゲートウェイでデータを取得しデータベースにJSONで保存 (6)](https://qiita.com/COOLMAGICPRODU1/items/5afd3a846791046ef128)