LoginSignup
1
1

More than 1 year has passed since last update.

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

Last updated at Posted at 2022-07-21

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

今回はこのデータをサーバに送信します。
99f8027812fe841fafbb82cb316db3e062d514f019ff6.png
サンプルで使用するゲートウェイは、引き続きWEINTEK製ゲートウェイの開発環境であるEasyBuilderのシミュレーターです。WEINTEK製ゲートウェイはサーバへのデータ送信に2種類のインタフェースを持っており、そのひとつがMQTTです。サンプルではMQTTを使用してサーバにデータを送信します。

サーバ側にはMQTTのブローカーが必要となります。サンプルでは、MQTTブローカーとしてMosquittoを使用します。
ad4d70ef98a1d741deedb1e19d7eef3762d52f8173167.png
Mosquittoはテストの場面で必要となります。サンプルの実装に加えて、テストをしてみたいという方は、自己責任でMosquitto、あるいは他のMQTTブローカーを準備してください。Mosquittoの準備については以下を参照してください。
【MQTT】MQTTの導入 mosquittoのインストール/動作確認まで

ゲートウェイのMQTT送信設定

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

EasyBuilderのメニュー[IIoT/エネルギー]-[MQTT]をクリックすます。
27403bdd1beb17ed91a9e1faad0c1ca462d5180119baf.png
[有効にする]をクリックします。
419a1bed20d2da61b4a260fcfaa1a92f62d518b58b47d.png
[一般的な属性]はデフォルトのままです。サンプルでは、ゲートウェイのシミュレーターと同じWindowsでMosquittoを動作させるので、IPアドレスは127.0.0.1のままです。[OK]ボタンをクリックします。
3643faef7ae563403b18ecd92652d34562d5191b1eb6a.png
[トピック発行者]タブで[新規作成]ボタンをクリックします。
0602c7b6837e71a182c385cd85680f2862d51a01c7f24.png
999d37a64349d3064b39bf08d0b2694f62d51a4c34273.png
[一般的な属性]タブで以下のように設定します。
中ほどの設定、[アドレス]のLBと0は、LB0がONになったらMQTTでサーバにデータを送信する、という意図です。
01b4e17a1817470a004336900fa7ffbb62d51b4209fc2.png
[アドレス]タブに移り、[新規作成]ボタンをクリックします。
59910b8f3292a98b49714a41816f8c3762d51c263f6ec.png
58b56e5ee811a948f574326534769a5762d51c2fa8f19.png
ダイアログに以下のように設定し、[OK]ボタンをクリックします。
[アドレス]の設定LWと0は、LW0にあるデータを送信する、という意図です。LW0には、PLCから取得したデータが置かれています。
de2bc7ffeecf75b76dec7522f7a27fd162d51cb082328.png
[MQTTトピック発行者オブジェクト属性]ウィンドウの[OK]ボタンをクリックします。
bc638bc4ee1e717109c9a3a6157e5d5f62d51d48b7489.png
[MQTT]ウィンドウの[終了]ボタンをクリックします。
9534a197b16903a10274457bdd2e71e662d51dbac95f8.png
以上で、ゲートウェイのMQTT設定は完了です。

ゲートウェイのプログラミング

前回作成したゲートウェイのプログラムに、若干のステップを追加します。

EasyBuilderのメニュー[プロジェクト]-[マクロ]をクリックします。
b6df62bab4d0a16cee1095a55dcb836f62d5216eb34e4.png
5f0828812556ea6a775135414a365cc362d52185a7fbe.png
[ID : 001]をダブル・クリックします。
62d62aa6b4b8125fc109c443ad5f47b262d52233bc50d.png
以下のように、ステップを追加します。
48e72c305c89ae10a73ee74cb389156462d5295243ba1.png
6〜10行目では、今回取得したデータと前回取得したデータを比較して、同じデータであったら何もしない、と書いています。業務上、連続する同じデータは不要という場合に、サーバに無駄なデータを送信しません。
13〜14行目は、MQTT送信をキックするために、ゲートウェイのLB0をオンにします。LB0はMQTT送信後に自動でオフになります(そのようにMQTTを設定しました)。

コピーしたい方はこちらからどうぞ。

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
[コンパイルが成功]に[ID : 000]があることを確認します。
62d62aa6b4b8125fc109c443ad5f47b262d56ca4cea61.png

連続する同じデータは不要

連続する同じデータは不要という仕様は、よくある仕様です。例えば、工場の生産マシンで生産される製品の数をPLCで数えている場合、そのカウンタがこれに該当します。変化のないカウント値は不要なはずです。この不要なデータをネットワークやサーバに垂れ流すと、ネットワークやサーバにとって無駄な負荷となります。データベースのサイズも無駄に膨れ上がります。「IoTのデータは無駄なデータばかりだけど、そういうものだ」と考えられがちですが、実は、設計次第でエレガントなシステムになります。
ただし、ロガーなどを使って無秩序に記録したデータをデータベースにロードする、というような場合は、不要なデータの排除には苦労します。
連続する同じデータをサーバ側で捨てるテクニックもあります。これについては機会があれば、別途解説をさせていただきます。

テスト

テストには、MQTTブローカーと、一時的にテストで使用するMQTTの汎用サブスクライバーが必要となります。
これらは、Mosquittoが提供してくれます。Mosquittoの準備については以下を参照してください。
【MQTT】MQTTの導入 mosquittoのインストール/動作確認まで

私の開発・テスト環境では、MosquittoブローカーはWindowsの設定で自動起動にしてあり、常に実行中です。
d3c132e88775428a7334c810a8606fc362d5203d78fd4.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

注意: "mod_RSsim.exe"は連続起動に時間制限がある点に注意してください。制限を超えた場合は再起動させます。

EasyBuilderのメニュー[プロジェクト]-[オンラインシミュレーション]をクリックします。
439fd0e9432caba5e9ed0546875106a462d528085da76.png
シミュレーターが起動したことを確認します。
75590b5b1988d3633f2403c0eda4c4f762d5285c8e0d4.png
前回のテストと同様に、Mdobus/TCPシミュレーターのアドレス40001のデータを任意の数値に書き換えます。
117891e3a7d9cfb3ad2aee7bc5db0e2662d5287c3564a.png
Mosquittoのサブスクライバーが、受信したデータをコンソールに出力します。
e6004c9810a653ca72e7b22384c6d9b862d525e0e1ffc.png
ゲートウェイのプログラムで、データに変化があった場合にのみ送信、としているため同じデータが次々と送られてくることはありません。ゲートウェイを単なるプロトコル変換器だと考えているなら、それは誤りです。

ゲートウェイのMQTT設定にて、タイムスタンプを付与するよう設定したため、tsという名前でゲートウェイの時刻が送られてきます。

このゲートウェイの時刻はサーバの時刻と必ずしも一致しない、という点を設計上留意してください。時刻の取扱いについては別途、解説をさせていただきます。

以上でテストは終了です。

次回

続きは次回とさせていただきます。
次回は、データベースを準備します。

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

1
1
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
1
1