Node-REDでModbus TCP通信してInfluxDBにデータを蓄積する


はじめに

前回の記事ではPythonでModbus通信を行ってInfluxDBにデータを蓄積しました。
今回はNode-REDを使ってModbus通信を行い、InfluxDBにデータを蓄積してみたいと思います。
Node-REDを使うことで視覚的にデータの処理を行うことができます。

動作確認済みデバイス

動作確認済デバイス(OS)

  • e-RT3 Plus F3RP70-2L1(Ubuntu 18.04 32bit)
  • Raspberry Pi 4 Model B (Ubuntu Server 20.04 32bit)

これらのデバイスでは armhf アーキテクチャのパッケージが動作します。

構成

以下の構成でデータの収集~蓄積を行います。

  1. データ収集
    Node-REDでModbus TCP通信を行ってエッジデバイスが装置からデータを収集します。

  2. データ蓄積
    収集したデータをInfluxDBに蓄積します。

準備

Node-REDの準備

Node.jsとNode-REDのインストール

エッジデバイスで以下のコマンドを実行してNode.jsをインストールします2

curl -fsSL https://deb.nodesource.com/setup_14.x | sudo -E bash -
sudo apt-get install -y nodejs

Note
エッジデバイスがproxy環境下にある場合はproxy設定が必要です。

以下のコマンドを実行してNode-REDをインストールします3

sudo npm install -g --unsafe-perm node-red

以下のような出力が表示されたら成功です。

+ [email protected]
added 286 packages from 375 contributors in 142.031s

Note
エッジデバイスがproxy環境下にある場合はnpmのproxy設定が必要です。

ノードのインストール

Node-REDで使用するノードのインストールを行います。

エッジデバイスで以下のコマンドを実行してNode-REDを起動します。

node-red

起動したらPCのブラウザでhttp://<IP_ADDRESS_OF_EDGE_DEVICE>:1880にアクセスしてNode-REDの画面を開きます。<IP_ADDRESS_OF_EDGE_DEVICE>の部分はエッジデバイスのIPアドレスで置き換えてください。

画面右上のメニューアイコンをクリックして「パレットの管理」をクリックします。

「ノードを追加」タブの検索窓にnode-red-contrib-influxdbと入力し、該当するノードをインストールします。

同様の手順でnode-red-contrib-modbusもインストールします。 

InfluxDBの準備

こちらの手順でInfluxDBをインストールします。(Pythonパッケージのインストールは不要です。)
また、こちらの手順を参考にしてnoderedDBという名前でデータベースを作成します。

データ収集

Modbusサーバーの準備

今回は装置の代わりにPC上でModbusサーバーを起動します。
PCでこちらのプログラムを起動してModbusサーバーを立ち上げます。

Node-REDフローの作成

5秒おきにModbusサーバーからデータを取得するフローを作成します。今回はサーバーの保持レジスタに格納されている2つの時系列データを収集します。

左側のメニューから「Modbus-Read」ノードをドラッグ&ドロップし、ダブルクリックして設定画面を開きます。
Modbusサーバーの保持レジスタ2から2つの値を5秒おきに読み取るように設定を行います。

項目名 設定値
名前 read_holding_register
FC FC 3: Read Holding Registers
Address 2
Quantity 2
Poll Rate 5 seconds

Serverの設定では、右側のペンのボタンをクリックしてPCで起動しているModbusサーバーの情報を入力します。

項目名 設定値
名前 serverPC
Type TCP
Host Modbusサーバーを起動しているPCのIPアドレス
Port 5020

設定が完了したら「完了」ボタンをクリックします。

データが収集されていることを確認するために、「debug」ノードをドラッグ&ドロップして「read_holding_register」ノードの上側の端子と接続し、デプロイボタンをクリックします。

右側のデバッグタブをクリックして、以下のように収集したデータが表示されていれば成功です。

データ蓄積

収集したデータを加工してInfluxDBに格納します。

右側のメニューから「function」ノードをドラッグ&ドロップしてダブルクリックします。
「コード」タブを開き、収集したデータの配列をjson形式に加工する以下のプログラムを作成して「完了」をクリックします。

const data = msg.payload

payload = {
    "holding_register_2": data[0],
    "holding_register_3": data[1]
}

msg["payload"] = payload

return msg;

次に、データをInfluxDBに格納する「influxdb out」ノードをドラッグ&ドロップしてダブルクリックし、以下のように設定を行います。

項目名 設定値
名前 To_noderedDB
Measurement nodered_measurement

Serverの設定では、右側のペンのボタンをクリックしてエッジデバイスで起動しているInfluxDBの情報を入力します。

項目名 設定値
名前 noderedDB
Host localhost
Port 8086
Database noderedDB

すべての設定が完了したら以下のようにノードを接続し「デプロイ」ボタンをクリックします。

しばらく待ってからエッジデバイスで以下のコマンドを実行してデータベースの中身を確認します。データが格納されていたら成功です。

username@ubuntu:~$ influx
Connected to http://localhost:8086 version 1.8.10
InfluxDB shell version: 1.8.10
> USE noderedDB
Using database noderedDB
> SELECT * FROM "nodered_measurement" LIMIT 3
name: nodered_measurement
time                holding_register_2 holding_register_3
----                ------------------ ------------------
1643782593448526154 93                 24
1643782598683263519 99                 22
1643782603803351763 100                20

まとめ

今回はNode-REDでModbus通信を行ってデータをInfluxDBに格納する方法を紹介しました。
少ないプログラム量で視覚的にデータ収集アプリケーションを作成することができました。
前回の記事の可視化の手順を行えば、今回蓄積したデータをGrafanaで可視化することも可能です。是非お試しください。

補足

npmのproxy設定

デバイスがproxy環境下にある場合は、以下のコマンドを実行してnpmのproxy設定を行います。

sudo npm -g config set proxy http://{username}:{password}@{proxy-server-url}:{port}
sudo npm -g config set https-proxy https://{username}:{password}@{proxy-server-url}:{port}
  1. 産業用AIプラットフォーム | 横河電機株式会社

  2. distributions/README.md at master · nodesource/distributions · GitHub

  3. ローカルでNode-REDを実行する : Node-RED日本ユーザ会