後編: OTとLoRaWANの融合
1. はじめに
前回の記事では、Dragino 社の新製品 MS48-LR の特徴と、OT と LoRaWAN を融合させることの意義について解説しました。
今回は、実際にMS48-LRと Plat’Home 社のOpenBlocks IoT を用いた簡単なデモを通じて、この革新的なソリューションの実践的な活用方法をご紹介したいと思います。
2. デモの概要
ここでは、今回のデモの全体像を把握するため、システム構成、使用機器、データの流れを説明します。
2.1. デモの構成
主要な構成要素は、以下の4つです。
- LoRaWAN センサー: EM-ELHT01
- LoRaWAN ゲートウェイ/LoRaWAN サーバ/Modbus サーバ: MS48-LR
- (PLC 代替として)Modbus クライアント/mqtt パブリッシュ: OpenBlocks IoT EX1
- mqtt broker: (大好きな)shiftr.io
# OpenBlocks IoT EX1は EOL製品かもしれません。最新は FXというシリーズになっています。
2.2. データの流れ
- LoRaWAN センサー EM-ELHT01 から MS48-LR へのデータ送信
- MS48-LR で Modbus TCP への変換
- OpenBlock IoT EX1 内で動作する Node-RED 内のノードから、MS480-LR の指定レジスタのデータを取得
- 取得したデータをNode-RED内の mqttノードから shiftr.ioへデータをパブリッシュ
# IoT と OT の世界観がぐちゃぐちゃですが、ご容赦ください。
3. MS48-LR の設定
MS48-LR の設定内容・手順を説明します。
2. ビルトイン LoRaWAN ネットワークサーバへのデバイス登録
3. Modbus TCP の設定
この Techblogをご覧の多くの皆様は、LoRaWAN についてある程度の知識や動作経験があるという前提を勝手に置かせていただき、上述の 1 番目と 2 番目の説明はここでは割愛します。その役目はメーカー公式マニュアルに譲りたいと思います。
Modbus TCP の設定
3 番目のModbus TCP の設定について説明します。
まず、MS48-LR の WebUI の管理画面の「Modbus タブ」を開きます。
ここで、Modbus RTU スレーブ(TCP ならサーバ)の設定を行います。
設定項目は以下の通りです。
- RTC なのか TCP なのかの選択
- Modbus 用のポート番号(デフォルト 502 ですね)
- LoRaWAN センサーの登録(DevEUI の設定)
- レジスターの開始アドレスの設定(Hex 列での指定です。今回は 0xAAAA です)
- レジスター長の設定(LoRaWAN 側の payload 長も意識して、今回は 14 を設定します)
とりあえず、これで終わりです。簡単ですね。
4. OpenBlocks IoT EX1 の設定
本題から少し外れますが、(PLC 想定の)OpenBlocks IoT の設定が少し手間です。少しだけ細かく触れていきたいと思いますが、基本的なことは、やはりメーカー公式マニュアル(FW5)をご確認ください。
OpenBlocks IoT EX1 の設定内容・手順を説明します。
2. IoT データの送受信設定
3. Node-RED のフロー作成
Modbus クライアントのデバイス登録
まず、本装置を Modbus クライアントとして利用するための設定が必要になります。 サービスタブの「デバイス登録機能」をクリックします。
「Dev 登録」タブ内の「Modbus(C)登録」画面で、MS48-LR のデータを読みに行くための Modbus クライアントを登録します。名前は好みのものをつけてください。保存すると、画面下に OpenBlocks IoT 内部で(自動で)管理されるデバイス番号とともに表示されるはずです。
IoT データの送受信設定
次は、本装置として送受信したいデータに関する設定です。
トップ画面でのサービスタブの「IoT データ」をクリックします。
「IoT データ」タブ内の「モジュール設定」画面で、本装置内で独自に定義された送受信モジュール群が表示されます。
今回は、「PD Repeater」と「PD Handler MODBUS Client」を利用しますので、この二つを「使用する」ように設定をします。
次に、「PD Handler MODBUS Client」の詳細設定です。この管理画面上で WebUI で設定した内容を使いたい場合は「本システムコンフィグ」側を選択します。
今度は、「IoT データ」タブ内の「送受信設定」画面です。詳細は本家マニュアルに譲りますが、ドメインソケット(lsocket)の部分に、本装置内で動作する Node-RED(後述)へデータを渡すためのおまじない設定をします。
「IoT データ」タブ内の「送受信設定」画面の「Modbus クライアントデバイス設定」ペインで、データの取得先(MS48-LR)の設定を行います。MS48-LR のModbus TCP の設定の内容を思い出しながら、設定をします。読込方法など、キャプチャ画面通りに設定します。
Node-RED のフロー作成
ここまで設定が終わると、次はビルトインされた Node-RED でのフロー作成になります。
トップ画面でのサービスタブの「Node-RED」をクリックします。
「Node-Red」タブのリンクボタンをクリックすると、Node-RED のフロー設計画面が開きます。
今回は簡単なデモなので、利用するノードは3つだけです。
- ipc-in ノード(青色)
- mqtt out ノード(紫色)
- debug ノード(緑色)
「ipc-in ノード」は、本装置で受信したデータを受け取るインタフェースです。 プロパティ画面のPath項目に、先程定義したModbus クライアントのデバイス番号を利用して、キャプチャ画面のように設定します。
次に、「mqtt out ノード」です。mqtt broker に関する設定をします。設定項目は、shiftrの情報に従って設定してます。
動作結果
もし、MS48-LR に繋がっていれば、Node-RED 画面右側に表示できるデバッグ画面に、取得できたデータが Json 形式で表示されるはずです。Modbus クライアントの設定で、1 分間隔でのポーリングを定義しているので、おおよそ 1 分毎にデータが表示されるはずです。
先のデバッグ画面に追加データが表示されるのと(ほぼ)同時に、shiftr側の画面にも、データがサブスクライブされることがわかります。
5. 受信データの解析
さて、肝心要の受信データがどうなっているか?を見てみます。
{
"address": 43690,
"function": 3,
"data_type": "uint16_t",
"values": [87, 44956, 10, 120, 52246, 2746, 559, 3584, 0, 32256, 26264, 40520, 0, 0],
"time": "2024-07-18T13:53:51.024+09:00",
"memo": "MR48-LR",
"protocol": "tcp",
"node": "192.168.xxx.xxx",
"port": 502,
"unit": 1
}
ここに表示されている数字はすべて 10 進数です。これらを 16 進数で読みとってあげることで、それぞれ何を意味しているかがわかります。
1. adress: 43690
16 進数にすると、0xaaaaです。 レジスタの開始アドレスですね。
2. function: 3
これは、ちょっと難しいかもしれませんが、Modbus の設定に慣れている方はすぐにピンとくると思います。Modbus のデータの読み取り方法を表しています。read_holding_registersです。
3. values: [87, 44956, 10, 120, 52246, 2746, 559, 3584, 0, 32256, 26264, 40520, 0, 0]
まずは、それぞれを 16 進数に直してみます。
- 87 -> 0x0057
- 44956 -> 0xaf9c
- 10 -> 0x0010
- 120 -> 0x0078
- 52246 -> 0xcc16
- 2746 -> 0x0aba
- 559 -> 0x022f
- 3584 -> 0x0e00
- 0 -> 0x0000
- 32256 -> 0x7e00
- 26264 -> 0x6698
- 40520 -> 0x9E48
実は、これ、LoRaWAN サーバから出力されたデータになります。
最初の 2 つは、LoRaWAN サーバ側で管理されている当該 LoRaWAN センサーデバイスのデバイスアドレスです。
87 -> 0x0057
44956 -> 0xaf9c
3 つ目は、uplink 回数である fcnt 値です。16 進数に直す必要がありませんでした。
10 -> 0x0010
4 つ目は、RSSI 値(の絶対値)です。これも、16 進数に直す必要はありませんでしたね。
120 -> 0x0078
5 つ目から 10 個目は、frame payload です。この 16 進数を LoRaWAN センサーデバイスの仕様に従ってデコードすることで、人間でも可読な値に変換することができます。
- 52246 -> 0xcc16
- 2746 -> 0x0aba
- 559 -> 0x022f
- 3584 -> 0x0e00
- 0 -> 0x0000
- 32256 -> 0x7e00
11 個目と 12 個目は LoRaWAN サーバ側でデータを取得した時間になります。 それぞれの 16 進数をつなげて、改めて 10 進数に直すと1721278024という値が得られます。これは unixtime で、通常の日付形式にすると「2024-07-18 13:47:04(日本時間)」となります。
13 個目と 14 個目は、意味のあるデータがありません。これは、無駄にレジスタ長を設定したためです。
4. time 以降
これは、見ての通りですので、説明を省きます。
6. 考察
簡単なデモは終わりです。いかがでしたでしょうか?
OT 用語と IoT 用語だらけで、よくわからないという方もいらっしゃるかと思います。が、ただの慣れですので気になさらないでください。
ここまでみてお分かりだと思うのですが、多少機器の基本的なことは理解しなくていけませんが、プログラムを一切書かずとも、LoRaWAN センサーのデータを、OT の世界のプロトコル(Modbus)を経由して、容易に取得できてしまいました。
これ、驚愕ではありませんか?
もちろん、産業用途の信頼性があるのかよ?! とか、こんなもんで長期運転に耐えられうのかよ?! とか、性能出ないでしょ? とか、色々ご意見はあると思います。
今は、不足する部分もあるかもしれません。しかし、今も、世界各地で利用されている仕組みであり、日々発展しています。期待しかありませんね。
7. まとめ
最後に、おさらいです。
前回の記事では、新製品 MS48-LR の特徴と、OT と LoRaWAN を融合させることの意義について解説しました。
本記事では、実際に MS48-LRと Plat’Home 社のOpenBlocks IoT を用いた簡単な動作デモをご紹介しました。
OT と LoRaWAN の橋渡しである MS48-LRを活用することで、
2. 電源の確保が困難な場所でもデータ収集が可能となり
3. 既存の OT システムへの取り込みが容易に可能である
ことがお分かりいただけたのではないでしょうか?
ぜひ、皆さんからも、こんな使い方してみたいよ〜 なんてご要望を頂戴できると幸いです。
なお、当社 EC サイトでは、MS48-LR をはじめ各種 IoT 機器をお買い求めいただけます。よろしくお願いいたします。