2022-07-23に更新

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

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

今回はこのデータをサーバに送信します。
image

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

IT技術より生産現場の技術に強い方は、"MQTT"とか登場した時点で「もういやだな」となるかもしれません。そういった方はロガーの類が欲しくなりますよね。わかります。この記事ではロガーの類はまったく登場しません。この先を読み進めるかどうか、ご自由にご判断ください。

サーバ側にはMQTTのブローカーが必要となります。サンプルでは、MQTTブローカーとしてMosquittoを使用します。
image

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

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

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

EasyBuilderのメニュー[IIoT/エネルギー]-[MQTT]をクリックすます。
image

[有効にする]をクリックします。
image

[一般的な属性]はデフォルトのままです。サンプルでは、ゲートウェイのシミュレーターと同じWindowsでMosquittoを動作させるので、IPアドレスは127.0.0.1のままです。[OK]ボタンをクリックします。
image

[トピック発行者]タブで[新規作成]ボタンをクリックします。
image
image

[一般的な属性]タブで以下のように設定します。
中ほどの設定、[アドレス]のLBと0は、LB0がONになったらMQTTでサーバにデータを送信する、という意図です。
image

[アドレス]タブに移り、[新規作成]ボタンをクリックします。
image

image

ダイアログに以下のように設定し、[OK]ボタンをクリックします。
[アドレス]の設定LWと0は、LW0にあるデータを送信する、という意図です。LW0には、PLCから取得したデータが置かれています。
image

[MQTTトピック発行者オブジェクト属性]ウィンドウの[OK]ボタンをクリックします。
image

[MQTT]ウィンドウの[終了]ボタンをクリックします。
image

以上で、ゲートウェイのMQTT設定は完了です。

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

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

EasyBuilderのメニュー[プロジェクト]-[マクロ]をクリックします。
image
image

[ID : 001]をダブル・クリックします。
image

以下のように、ステップを追加します。
image
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

エディタの[閉じる]ボタンをクリックします。
image

[コンパイルが成功]に[ID : 000]があることを確認します。
image

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

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

テスト

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

私の開発・テスト環境では、MosquittoブローカーはWindowsの設定で自動起動にしてあり、常に実行中です。
image

注意: 他のサーバ上の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"は連続起動に時間制限がある点に注意してください。制限を超えた場合は再起動させます。

image

EasyBuilderのメニュー[プロジェクト]-[オンラインシミュレーション]をクリックします。
image

シミュレーターが起動したことを確認します。
image

前回のテストと同様に、Mdobus/TCPシミュレーターのアドレス40001のデータを任意の数値に書き換えます。
image

Mosquittoのサブスクライバーが、受信したデータをコンソールに出力します。
image

ゲートウェイのプログラムで、データに変化があった場合にのみ送信、としているため同じデータが次々と送られてくることはありません。ゲートウェイを単なるプロトコル変換器だと考えているなら、それは誤りです。

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

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

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

次回

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

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

ツイッターでシェア
みんなに共有、忘れないようにメモ

COOL MAGIC PRODUCTS

Crieitは誰でも投稿できるサービスです。 是非記事の投稿をお願いします。どんな軽い内容でも投稿できます。

また、「こんな記事が読みたいけど見つからない!」という方は是非記事投稿リクエストボードへ!

有料記事を販売できるようになりました!

こじんまりと作業ログやメモ、進捗を書き残しておきたい方はボード機能をご利用ください。
ボードとは?

コメント