2022-07-23に更新

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

PLCからゲートウェイでデータを取得し、データベースにJSONで保存します。複数回に分けて、サンプルを用いて解説します。
今回はその2回目、ゲートウェイによるPLCからのデータ取得です。
image
サンプルの環境については第一回で解説しています。必ず第一回を参照し、前提となる環境を理解した上で以下の解説を参照してください。
PLCからゲートウェイでデータを取得しデータベースにJSONで保存 (1)

想定: PLC上のデータ

サンプルでは、取得するPLC上のデータを以下のように想定しています。
image

Modbus/TCP

Modbus/TCPについては、このドキュメントが理解しやすいドキュメントです。M・SYSTEM技研さまに感謝です。
M・SYSTEM技研さま Modbusプロトコル概説書

間違っていただきたくないのは、"Modbus/TCP"とは、PLCが自身のメモリを後悔するためのインタフェースのひとつにすぎない、ということです。"Modbus/TCP"が貴重なプロトコルである理由を述べます。PLCが自身のメモリを公開するためのプロトコルは他にもたくさんあります。そして、それらの多くは各PLCメーカー固有のものです。Modbus/TCPの特徴は、複数のPLCメーカー間で横断で採用されているプロトコルという点です。複数のメーカーのPLCは、標準ではModbus/TCPが使用できずオプションとして提供され、標準では当該メーカー固有のプロトコルがサポートされます。

Holding Registers

"Holding Registers"とは、Modbus/TCPが定める複数のメモリ領域のうちのひとつです。主に、数値や文字を記憶するために用いられます。アドレスは40001〜です。サンプルでは、40001上のデータをターゲットにします。
今回、PLCの代わりに活躍してくれる"mod_RSsim.exe"では、このような画面で眺めることが出来ます。
image

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

前回は、ゲートウェイを設定し、PLCに見立てたModbus/TCPシミュレーターに接続しました。
今回は、ゲートウェイを使って、PLCに見立てたModbus/TCPシミュレーターからデータを取得します。サンプルでは前回と同様に、ゲートウェイの代わりにWEINTEK製ゲートウェイのソフトウェア開発ツールであるEasyBuilderのシミュレーターを使用します。

前回作成したEasyBuilderのプロジェクトを開き、メニュー[プロジェクト]-[マクロ]をクリックします。
image
image

[マクロ]ウィンドウから[新規作成]をクリックします。
image

[マクロエディター]に以下のようにコードを記述します。
[周期的に実行する]オプションをオンにし、時間間隔を10にします。
image
コピーしたい方はこちらからどうぞ。

macro_command main()
        unsigned short        x40001 = 0
        GetData(x40001, "MODBUS TCP/IP (32-Bit)", 4x, 1, 1)
        SetData(x40001, "Local HMI", LW, 0, 1)

end macro_command

[マクロエディター]の下にある[閉じる]をクリックします。
image

[マクロ]ウィンドウの[コンパイルが成功]に新たなマクロが追加されたら、ひとまずプログラミングは終了です。
image

マクロ=プログラムの意図

Modbus/TCPが定める"Holding Register"(アドレス: 40001〜)は、EasyBuilderでは"4x"で解釈されます。
EasyBuilderでは、対象装置(今回はModbus/TCPシミュレーター)のメモリ・マップを参照することができます。EasyBuilderの[アドレス]ペイン(ウィンドウ)にて、装置名、ステーション番号、アドレスタイプを以下のように設定すると、ひとつめのアドレスが赤になっているはずです。これは、作成したマクロがこのアドレスを参照している、という証です。
image
今回作成したコードでは、行4で、対象装置の"4x"のひとつめのアドレスから1ワードだけデータを取得しています。対象装置は”MODBUS TCP/IP (32-Bit)”です。これは、前回、システムパラメータで設定した対象装置の「装置名」です。
行4で取得したデータを、行5で自らのメモリ"LW"のひとつめのアドレスにコピーしています。EasyBuilder(=WEINTEK製ゲートウェイ)も複数のメモリ領域をもっており、LWはそのうちのひとつです。LWは16bitワードであり、Modbus/TCPのHolding Registerと同じワード・サイズです。
image
[周期的に実行する]オプションのオンはこのプログラムを周期的に実行することを意味します。そしてその周期を今回は1000m秒(=1秒)としています。
このプログラムで、PLCからデータを取得する、という今回の目的は達成されるはずです。

周期的に実行する

とても残念なことに、PLCからデータを取得するゲートウェイは、PLC側のデータ変更等のイベントをもって振る舞いを起こすということが出来ません。これは、完全にPLC側の都合によるものです。このため、ゲートウェイがPLC上のデータを参照するとき、ゲートウェイは空振りすることを承知でPLCのメモリを周期的に参照します。いまどきのシステムとしては実に残念です。"Factory Automation"の技術者は、ITの世界ではとっくに古典となった"Message Passing"や"Data Driven"といった考え方すら学んでいないのです。こういった問題は当面は放置され続けるでしょう。

テスト

前回と同様に、PLCには、本物の代わりにModbus/TCPシミュレーターを使用します。

Modbus/TCPシミュレーター"mod_RSsim.exe"を起動しておきます。
image

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

シミュレーターが起動したら、メニュー[Object]を選択し、右側にある[+]をクリックします。
image

ダイアログにて以下のように入力し[OK]ボタンをクリックします。
image

Modbus/TCPシミュレータの、アドレス40001(注意: +0です)をクリックし、Valueに任意の数値を入力、[OK]ボタンで閉じます。
image
アドレス40001の表示が変わります。
image

EasyBuilderのシミュレータ上で、LW-0も変更されることを確認します。
image

これでテストは終わりです。数行のプログラムのテストとしては十分でしょう。

次回

続きは次回とさせていただきます。
今回は、初心者には少しだけ難解であったかもしれません。慌てずじっくり、しっかり理解して進んでください。

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

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

COOL MAGIC PRODUCTS

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

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

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

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

コメント