はじめに
前回の記事ではPythonでModbus通信を行ってInfluxDBにデータを蓄積しました。
今回はNode-REDを使ってModbus通信を行い、InfluxDBにデータを蓄積してみたいと思います。
Node-REDを使うことで視覚的にデータの処理を行うことができます。
構成
以下の構成でデータの収集~蓄積を行います。
-
データ収集
Node-REDでModbus TCP通信を行ってエッジデバイスが装置からデータを収集します。 -
データ蓄積
収集したデータをInfluxDBに蓄積します。
動作確認済みデバイス
動作確認済デバイス(OS)
- e-RT3 Plus F3RP70-2L1(Ubuntu 18.04 32bit)
- Raspberry Pi 4 Model B (Ubuntu Server 20.04 32bit)
これらのデバイスでは armhf アーキテクチャのパッケージが動作します。
準備
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
以下のような出力が表示されたら成功です。
+ node-red@2.2.0
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}