PLCからゲートウェイでデータを取得し、データベースにJSONで保存します。複数回に分けて、サンプルを用いて解説します。
前回は、ゲートウェイを用いてPLCからデータを取得し、ゲートウェイのメモリに保存しました。
PLCからゲートウェイでデータを取得しデータベースにJSONで保存 (2)
今回はこのデータをサーバに送信します。
サンプルで使用するゲートウェイは、引き続きWEINTEK製ゲートウェイの開発環境であるEasyBuilderのシミュレーターです。WEINTEK製ゲートウェイはサーバへのデータ送信に2種類のインタフェースを持っており、そのひとつがMQTTです。サンプルではMQTTを使用してサーバにデータを送信します。
サーバ側にはMQTTのブローカーが必要となります。サンプルでは、MQTTブローカーとしてMosquittoを使用します。
Mosquittoはテストの場面で必要となります。サンプルの実装に加えて、テストをしてみたいという方は、自己責任でMosquitto、あるいは他のMQTTブローカーを準備してください。Mosquittoの準備については以下を参照してください。
【MQTT】MQTTの導入 mosquittoのインストール/動作確認まで
ゲートウェイのMQTT送信設定
データをサーバに送信するために、前回まで作成したプロジェクトに設定を加えます。
EasyBuilderのメニュー[IIoT/エネルギー]-[MQTT]をクリックすます。
[有効にする]をクリックします。
[一般的な属性]はデフォルトのままです。サンプルでは、ゲートウェイのシミュレーターと同じWindowsでMosquittoを動作させるので、IPアドレスは127.0.0.1のままです。[OK]ボタンをクリックします。
[トピック発行者]タブで[新規作成]ボタンをクリックします。
[一般的な属性]タブで以下のように設定します。
中ほどの設定、[アドレス]のLBと0は、LB0がONになったらMQTTでサーバにデータを送信する、という意図です。
[アドレス]タブに移り、[新規作成]ボタンをクリックします。
ダイアログに以下のように設定し、[OK]ボタンをクリックします。
[アドレス]の設定LWと0は、LW0にあるデータを送信する、という意図です。LW0には、PLCから取得したデータが置かれています。
[MQTTトピック発行者オブジェクト属性]ウィンドウの[OK]ボタンをクリックします。
[MQTT]ウィンドウの[終了]ボタンをクリックします。
以上で、ゲートウェイのMQTT設定は完了です。
ゲートウェイのプログラミング
前回作成したゲートウェイのプログラムに、若干のステップを追加します。
EasyBuilderのメニュー[プロジェクト]-[マクロ]をクリックします。
[ID : 001]をダブル・クリックします。
以下のように、ステップを追加します。
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
エディタの[閉じる]ボタンをクリックします。
[コンパイルが成功]に[ID : 000]があることを確認します。
連続する同じデータは不要
連続する同じデータは不要という仕様は、よくある仕様です。例えば、工場の生産マシンで生産される製品の数をPLCで数えている場合、そのカウンタがこれに該当します。変化のないカウント値は不要なはずです。この不要なデータをネットワークやサーバに垂れ流すと、ネットワークやサーバにとって無駄な負荷となります。データベースのサイズも無駄に膨れ上がります。「IoTのデータは無駄なデータばかりだけど、そういうものだ」と考えられがちですが、実は、設計次第でエレガントなシステムになります。
ただし、ロガーなどを使って無秩序に記録したデータをデータベースにロードする、というような場合は、不要なデータの排除には苦労します。
連続する同じデータをサーバ側で捨てるテクニックもあります。これについては機会があれば、別途解説をさせていただきます。
テスト
テストには、MQTTブローカーと、一時的にテストで使用するMQTTの汎用サブスクライバーが必要となります。
これらは、Mosquittoが提供してくれます。Mosquittoの準備については以下を参照してください。
【MQTT】MQTTの導入 mosquittoのインストール/動作確認まで
私の開発・テスト環境では、MosquittoブローカーはWindowsの設定で自動起動にしてあり、常に実行中です。
注意: 他のサーバ上の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"を起動します。
注意: "mod_RSsim.exe"は連続起動に時間制限がある点に注意してください。制限を超えた場合は再起動させます。
EasyBuilderのメニュー[プロジェクト]-[オンラインシミュレーション]をクリックします。
シミュレーターが起動したことを確認します。
前回のテストと同様に、Mdobus/TCPシミュレーターのアドレス40001のデータを任意の数値に書き換えます。
Mosquittoのサブスクライバーが、受信したデータをコンソールに出力します。
ゲートウェイのプログラムで、データに変化があった場合にのみ送信、としているため同じデータが次々と送られてくることはありません。ゲートウェイを単なるプロトコル変換器だと考えているなら、それは誤りです。
ゲートウェイのMQTT設定にて、タイムスタンプを付与するよう設定したため、tsという名前でゲートウェイの時刻が送られてきます。
このゲートウェイの時刻はサーバの時刻と必ずしも一致しない、という点を設計上留意してください。時刻の取扱いについては別途、解説をさせていただきます。
以上でテストは終了です。
次回
続きは次回とさせていただきます。
次回は、データベースを準備します。
PLCからゲートウェイでデータを取得しデータベースにJSONで保存 (1)
PLCからゲートウェイでデータを取得しデータベースにJSONで保存 (2)
PLCからゲートウェイでデータを取得しデータベースにJSONで保存 (4)
PLCからゲートウェイでデータを取得しデータベースにJSONで保存 (5)
PLCからゲートウェイでデータを取得しデータベースにJSONで保存 (6)