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

PLCからゲートウェイでデータを取得し、データベースにJSONで保存します。複数回に分けて、サンプルを用いて解説します。
今回はその2回目、ゲートウェイによるPLCからのデータ取得です。
![c2c94364c86325cb400ed616c683221562d4d91f05808.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2737842/a26699f6-4925-098c-d44e-12b79c7a4664.png)
サンプルの環境については第一回で解説しています。必ず第一回を参照し、前提となる環境を理解した上で以下の解説を参照してください。
[PLCからゲートウェイでデータを取得しデータベースにJSONで保存 \(1\)](https://qiita.com/COOLMAGICPRODU1/items/31513295943763365915)
## 想定: PLC上のデータ
サンプルでは、取得するPLC上のデータを以下のように想定しています。
![520f28de070aceae292d971ae449b7a762d4e11edce3b.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2737842/fed3faa3-bf02-d55b-0eb5-d98e67ba4992.png)
> ### Modbus/TCP
> Modbus/TCPについては、このドキュメントが理解しやすいドキュメントです。M・SYSTEM技研さまに感謝です。
> [M・SYSTEM技研さま Modbusプロトコル概説書](https://www.m-system.co.jp/mssjapanese/kaisetsu/nmmodbus.pdf)
> 
> 間違っていただきたくないのは、"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"では、このような画面で眺めることが出来ます。
> ![59603780d55c186e1a70e1b112539c5562d4ea62383a2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2737842/9c508be9-c417-fb99-f534-e2a020747221.png)
## ゲートウェイの設定とプログラミング
前回は、ゲートウェイを設定し、PLCに見立てたModbus/TCPシミュレーターに接続しました。
今回は、ゲートウェイを使って、PLCに見立てたModbus/TCPシミュレーターからデータを取得します。サンプルでは前回と同様に、ゲートウェイの代わりにWEINTEK製ゲートウェイのソフトウェア開発ツールであるEasyBuilderのシミュレーターを使用します。

前回作成したEasyBuilderのプロジェクトを開き、メニュー[プロジェクト]-[マクロ]をクリックします。
![b6df62bab4d0a16cee1095a55dcb836f62d4f019b0314.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2737842/2173ca91-3ed4-192c-b318-91114e25cf01.png)
![5f0828812556ea6a775135414a365cc362d4f0418d4a6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2737842/86485547-5e85-012e-ef55-264927b1b203.png)
[マクロ]ウィンドウから[新規作成]をクリックします。
![3dc7453b874086ec512519c0c059939862d4f063d178d.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2737842/14963bbe-6707-a265-8aee-84ec5594a56a.png)
[マクロエディター]に以下のようにコードを記述します。
[周期的に実行する]オプションをオンにし、時間間隔を10にします。
![418d778add1fbee6a591cd7db72ef99462d4f0998d976.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2737842/7df37027-dd2e-a704-1695-c5b35a9c4069.png)
コピーしたい方はこちらからどうぞ。
```
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
```
[マクロエディター]の下にある[閉じる]をクリックします。
![901952ea06c21742a0a40d878071bca462d4f113d33c3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2737842/5e1b4744-1b9d-a68b-4b60-d78e6347975f.png)
[マクロ]ウィンドウの[コンパイルが成功]に新たなマクロが追加されたら、ひとまずプログラミングは終了です。
![62d62aa6b4b8125fc109c443ad5f47b262d4f137a479e.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2737842/3e2d57cb-3dd8-0808-2aed-7eb6ab87e81e.png)
> ### マクロ=プログラムの意図
> Modbus/TCPが定める"Holding Register"（アドレス: 40001〜）は、EasyBuilderでは"4x"で解釈されます。
> EasyBuilderでは、対象装置（今回はModbus/TCPシミュレーター）のメモリ・マップを参照することができます。EasyBuilderの[アドレス]ペイン（ウィンドウ）にて、装置名、ステーション番号、アドレスタイプを以下のように設定すると、ひとつめのアドレスが赤になっているはずです。これは、作成したマクロがこのアドレスを参照している、という証です。
> ![26365e0800f525da7b98106b7e7bd71062d4f28eba07f.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2737842/06c3fbfd-cacd-b962-fb1e-9bcca6f1c048.png)
> 今回作成したコードでは、行4で、対象装置の"4x"のひとつめのアドレスから1ワードだけデータを取得しています。対象装置は”MODBUS TCP/IP (32-Bit)”です。これは、前回、システムパラメータで設定した対象装置の「装置名」です。
> 行4で取得したデータを、行5で自らのメモリ"LW"のひとつめのアドレスにコピーしています。EasyBuilder（=WEINTEK製ゲートウェイ）も複数のメモリ領域をもっており、LWはそのうちのひとつです。LWは16bitワードであり、Modbus/TCPのHolding Registerと同じワード・サイズです。
> ![5e787b399f3f70441d4ec0226b16d5de62d4f52debe24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2737842/ce8c00ee-6be6-204d-3b33-977cc5e69fc8.png)
> [周期的に実行する]オプションのオンはこのプログラムを周期的に実行することを意味します。そしてその周期を今回は1000m秒（=１秒）としています。
> このプログラムで、PLCからデータを取得する、という今回の目的は達成されるはずです。
> ### 周期的に実行する
> とても残念なことに、PLCからデータを取得するゲートウェイは、PLC側のデータ変更等のイベントをもって振る舞いを起こすということが出来ません。これは、完全にPLC側の都合によるものです。このため、ゲートウェイがPLC上のデータを参照するとき、ゲートウェイは空振りすることを承知でPLCのメモリを周期的に参照します。いまどきのシステムとしては実に残念です。こういった問題は当面は放置され続けるでしょう。
## テスト
前回と同様に、PLCには、本物の代わりにModbus/TCPシミュレーターを使用します。

Modbus/TCPシミュレーター"mod_RSsim.exe"を起動しておきます。
![59603780d55c186e1a70e1b112539c5562d4f9862eaeb.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2737842/f3cb64dd-3a7d-e9fa-e149-287b29477484.png)
EasyBuilderのメニュー[プロジェクト]-[オンラインシミュレーション]をクリックします。
![e57da9ac757974ac53d74202ab3f186962d4f99fb1415.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2737842/e137d81e-ee66-0233-bb8c-f1eeb7edf47e.png)
シミュレーターが起動したら、メニュー[Object]を選択し、右側にある[＋]をクリックします。
![f596a7ef9d3f9ee63dadb64cd89f981d62d4fa3b2cb36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2737842/16ddb3f6-8195-9111-5435-d19ee2850a34.png)
ダイアログにて以下のように入力し[OK]ボタンをクリックします。
![8fc3bd495e156941cea03c12cf981d6062d4faaf89f7f.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2737842/bfac99c8-a63b-a033-06b0-3f69f725c3b0.png)
Modbus/TCPシミュレータの、アドレス40001（注意: +0です）をクリックし、Valueに任意の数値を入力、[OK]ボタンで閉じます。
![117891e3a7d9cfb3ad2aee7bc5db0e2662d4fc4dbfc1b.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2737842/3547acb2-8d56-3bec-c855-01c912e26516.png)
アドレス40001の表示が変わります。
![4b7477028132e4aa88253b72874d6e0d62d50fdb774c8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2737842/86b23a65-fd9d-8f65-7372-579eb484fa46.png)
EasyBuilderのシミュレータ上で、LW-0も変更されることを確認します。
![75590b5b1988d3633f2403c0eda4c4f762d4fb4d7cf76.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2737842/9154ab8f-2f25-bfbb-d5b8-db77e69cd3f6.png)
これでテストは終わりです。数行のプログラムのテストとしては十分でしょう。
## 次回
続きは次回とさせていただきます。
今回は、初心者には少しだけ難解であったかもしれません。慌てずじっくり、しっかり理解して進んでください。

[PLCからゲートウェイでデータを取得しデータベースにJSONで保存 \(1\)](https://qiita.com/COOLMAGICPRODU1/items/31513295943763365915)
[PLCからゲートウェイでデータを取得しデータベースにJSONで保存 \(3\)](https://qiita.com/COOLMAGICPRODU1/items/08891c828736428c1b5c)
[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)