Node-RED で工場シミュレーターを操作してみた #2 Node-RED フロー作成編

# はじめに

こんにちは。
[KCCS デジタルソリューション Advent Calendar 2023](https://qiita.com/advent-calendar/2023/kccs-digital-solution) 24 日目担当の福留（@kccs_kazuo_fukudome）です。

今回は、[前回の記事](https://qiita.com/kccs_kazuo_fukudome/items/b324708dd6be22b8b2f1)で環境構築した工場シミュレーター（GRFICS）を Node-RED で操作していきたいと思います。本記事では、OT 分野の内容にも触れます。OT 分野については、まだまだ勉強中のため間違った情報を記載している場合もあるかもしれません。もし、内容に間違いがある場合は、コメントを頂けると幸いです。

## 連載記事一覧

- [Node-RED で工場シミュレーターを操作してみた #1 環境構築編](https://qiita.com/kccs_kazuo_fukudome/items/b324708dd6be22b8b2f1)
- Node-RED で工場シミュレーターを操作してみた #2 Node-RED フロー作成編 <font color="darkorange">★ 本記事 ★</font>

## 環境構築したネットワークや工場（OT）の機器について

工場シミュレーターを Node-RED で操作するにあたって、作成した環境のネットワーク構成を説明します。GRFICS V1 のものですが、[ドキュメント](https://github.com/djformby/GRFICS/blob/master/modbus_documentation.txt)を参考にすると、次の図のような構成となります。今回は、工場シュミレーターのバルブを含めた OT 機器と Node-RED をインストールした PC が、同一のネットワーク上にあります。
※Ubuntu Linux（Node-RED）は、DHCP による IP 割り当てのため、末尾 121 の IP が割り当たると思います。該当の VM にて ip コマンドを利用すれば確認できます。

![image1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2852633/a9ac109b-d20c-40e7-eca7-c0b4b5d12453.png)

さらに、先ほどのドキュメントに "REMOTE MODBUS IO DEVICES" と記述されていますが、工場シミュレーター内にあるバルブなどは、産業界（OT）でよく使われている **Modbus** プロトコルで通信できる機器になっていることもわかります。また、アクセスするメモリの種類やアドレスも記載されています。この情報をもとに実際に Node-RED を利用して操作します！

## Modbus 通信ライブラリのインストール

先ほど述べたように、工場内のバルブなどは Modbus 通信を利用して操作します。今回は、[node-red-contrib-modbus](https://flows.nodered.org/node/@kenke7/node-red-contrib-modbus) というライブラリを利用した説明を行います。Node-RED のパレットマネージャで、"modbus"と検索すれば、該当のライブラリが見つかると思います。

:::note info
node-red-contrib-modbus をインストールする時は、インターネット接続が必要なため VirtualBOX のネットワークアダプターの割り当てを "ホストオンリーアダプター"から"NAT"に一時的に変更する必要があります。
:::

![image2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2852633/499acdf4-f468-8064-7d02-cc97d5480e92.png)

## A バルブの値を取得してみよう！

それでは、実際に工場シュミレータにある A バルブの値を取得してみましょう！
※A バルブは、シミュレーター画面の一番左 A タンクから、画面中央の炉と繋がっているパイプ上にあるバルブになります。

[node-red-contrib-modbus](https://flows.nodered.org/node/@kenke7/node-red-contrib-modbus) のインストールが完了すると、パレットのカテゴリに modbus ができます。読み取り用のノードは、3 種類ありますが、今回は説明しやすい Modbus-Read ノードを利用します。

![image3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2852633/0fc838f2-df51-1f4a-c49e-7a69748b4e1b.png)

ワークフローにノードをセットし、値を取得する A バルブ（Server）の設定を次のように行います。基本は、デフォルトの値で、Host の部分に、A バルブの IP アドレスを設定します。

![image4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2852633/b670eb30-260e-b8d8-cbd9-c26a85176ace.png)

続いて、Server 以外の部分の設定を行います。先ほどの V1 のドキュメントに A バルブ（feed 1）の input regiser 1 と 2 は、それぞれバルブの開閉値とパイプの流量と記載されています。
なので、FC FC4：Read Input Registers、Address 1、Quantity 2 をそれぞれ設定します。ポーリング間隔については、今回はテストのため 1 時間にします。

:::note info
FC（Function Code）や、input register って何？と思われる方もいるかもしれません。これらの用語は、Modbus プロトコルや OT 機器に関することになりますので、本記事での説明は割愛します。
:::

![image5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2852633/6730d209-fa93-4dde-6ef5-4be4aa5c0142.png)

上記のように設定をしたら、データ取得確認用の debug ノードをつなぎ、Node-RED のデプロイを行います。Modbus-Read ノードには、小さなボタンがあります。このボタンを押すと即時でポーリングが実行されます。デプロイ後にボタンを押すことで、次の画面のようにバルブの開閉量 203、パイプの流量 260 という値が取れます。工場シミュレーター（http://192.168.95.10 ）で確認すると、A バルブの開閉量は 0 と表示されていると思いますが、ほんの少しだけ開いていたことが、実際に数値を取ることでわかります。
![image6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2852633/68af5c1b-bffc-b76e-b109-76043ba678d9.png)

## A バルブをもっと開けてみよう！

今回の A バルブは、Modbus 通信を利用して開閉量を設定することもできます。続けて、少し開いている A バルブをもっと開けてみましょう。使うノードは、Modbus-Write になります。

![image7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2852633/8e660e11-3360-9cd4-a0f8-d87d6d7aea96.png)

読み取りの時と同じですが、V1 ドキュメントに A バルブ（feed 1）の holding register 1 は、0（閉）～ 65535（開）との記載があります。
ワークフローにノードをセットし、FC FC6：Preset Single Registers、Address 1 を設定します。
Server には、デフォルトで読み取り時に登録した A バルブが設定されていると思います。
![image8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2852633/6f9b003e-e8ad-5288-9e76-178bf281ab2d.png)

セットする数値は、Modbus-Write ノードの input の msg.payload にセットしてくださいとヘルプに記載があります。バルブを開けたいので、inject ノードで 65535（開）をセットします。そして、先ほどと同様に debug ノードもつなげてデプロイをします。
![image9.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2852633/2fe0431c-e00d-4023-386f-4da196729825.png)

デプロイを実行したら、inject ノードからフローを実行してみましょう。設定が間違っていなければ、次のように debug にメッセージが表示されて、A バルブに 65535（開）が設定できたことが確認できます。
![image10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2852633/c5b3a53f-ae40-6362-8492-4498c2aadbd7.png)

また、この状態で工場シミュレーター（http://192.168.95.10 ）で確認すると、A バルブの値が 100 になっていることも確認できます。
![image11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2852633/3cc96e78-3347-95a5-bc61-71f95175d259.png)

## まとめ

今回は、A バルブの値の取得と操作を行いましたが、A バルブと同様に B バルブや、反応炉の値を取得することもできます。また、Node-RED の他のノードを組み合わせることで、工場シミュレーターを自在に動かすことが可能です。連載当初にも書きましたが、本記事をきっかけに Node-RED や、OT 分野について、やってみようという方の一助になれば幸いです。

弊社[<img width = 13 src = https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2852633/ab0b59a4-92f2-a678-ffd4-9b383922b55f.png>](https://x.com/kccs_digital) では、Qiita 投稿に関する情報や各種セミナー情報をお届けしております！情報収集や学びの場を求める方々にぜひフォローしていただき、最新情報を手に入れてください！！👍