Azure連携(1):クラウド-デバイス間のMQTTによるデータ交換

この記事で紹介している内容の多くは、PLCnext Control に限らず一般的なパソコン等にも適用可能です。

PLCnext Control は様々なクラウドサービスと連携することが可能です。
この記事では PLCnext Control から Microsoft Azure サービスへ MQTT でデータを送信し、クラウド側でデータに対する処理を行ってからその結果を MQTT でデバイスへ送信し、PLCnext Control でそのデータを受信する方法の概要を解説します。

各処理の実装方法の詳細については、以下の記事もご覧ください。

関連する一連の記事
  • Azure連携(1):クラウド-デバイス間のMQTTによるデータ交換 [当記事]
  • Azure連携(2):デバイスからIoT HubへのMQTT送信(Python) … <準備中>
  • Azure連携(3):IoT Hub受信データをCosmos DBへ自動保存 … <準備中>
  • Azure連携(4):IoT Hub受信データをAzure Functionsで処理(C#) … <準備中>
  • Azure連携(5):Azure FunctionsからデバイスへのMQTT送信(C#) … <準備中>
  • Azure連携(6):クラウドからのMQTT通信を受信(Python) … <準備中>
  • Azure連携(7):IoT Hub受信データをPower BIで可視化 … <準備中>
目次

デバイスと Azure サービスによるシステム構成例

クラウドを使って実現したい内容

クラウドを使って実現したい内容
クラウドを使って実現したい内容

左の図のように、PLCnext Control からクラウドへデータを送信し、クラウド上で処理を行った結果を別の PLCnext Control で受信して使用する例を考えます。

やりたいことはシンプルですが、実現方法はクラウドサービス毎に異なります。

Azure による具体的なシステム構成

Azure では、以下の様に IoT Hub サービス、Cosmos DB サービス、及び Functions サービスを組み合わせることでこの目的を実現することが出来ます。

主なプロセス
  1. デバイス 上のデータを MQTT で Azure へ送信
  2. Azure で受信したデータをクラウド上で処理
  3. クラウド上での処理結果を MQTT でデバイスへ送信
  4. クラウドから MQTT で送られてきたデータをデバイス側で受信
Azure による具体的なシステム構成
Azure による具体的なシステム構成

Azure を始め各クラウドサービス内には様々な機能が用意されているため、一つの目的に対して複数の実現方法が考えられます。最適な実現方法を検討するためには、使用するクラウドサービスのアーキテクチャの全体像を理解しておく必要があります。

Azure 内で使用するサービス

Azure の無料アカウントなら 最初の30 日間は USD$200 分のクレジットを無料で利用できます。
そのため、以下で紹介しているサービスのうち有料のものでも、その期間中にその金額以内の分なら無料で使用することが出来ます。
ただし 30 日を過ぎると、残額があってもそのクレジットは使えなくなります。
詳しくは、Azure のサイト等をご参照ください。

Azure IoT Hub サービス

IoT Hub は、現場 (フィールド) で使用するデバイスと Azure クラウド間の橋渡しを行うサービスです。

通信を行いたいエッジデバイス毎に、IoT Hub 内に「デバイス」の設定を作成します。
上記の図では、「センサデータ送信用デバイス」と「警報判定結果受信用デバイス」の 2 つのデバイスを設定を IoT Hub 内に作成しています。

また、「センサデータ送信用デバイス」にてクラウド側で受信したデータは自動的に Cosmos DB というデータベースサービス※1へ送られるように設定しています。このようなサービス間での自動的なデータ転送は、「IoT Hub メッセージルーティング」機能で実現することができます。
※1:データベースでなく、ストレージサービスへ送ることも可能です。今回は扱いの容易さなどを考慮して Cosmos DB の使用を選択しました。

メッセージルーティングは単純にデータを転送するだけでなく、条件式を用いて転送先を分けることも出来ます※2。 例えば、IoT Hub で 受信した JSON データの Status という要素の値が “Error” の時は転送先 1 のサービスへ、そうでなければ転送先 2 のサービスへ、という具合です。
※2:クラウドで受信したデータが JSON の場合

Azure IoT Hub サービスは扱う最大メッセージ数に応じて料金が変わりますが、最もメッセージ数が少ないものであれば無料で使用できます。ちょっとした実験をする程度であれば、無料のもので十分です。

Azure アカウントの作成と IoT Hub 設定についての基本的な手順は、以下の記事でも紹介しています。
PLCnext コントローラ-クラウド間データ転送実験の準備:Azure IoT Hubの設定

Azure Cosmos DB サービス

Cosmos DB は、NoSQL (Not only SQL) 型、つまり非リレーショナル型のデータベースです。

データベースのレコードに追加・更新・削除が起きると、それをトリガーにして Azure Functions サービス内の関数の実行へとつなげることが出来ます。

当記事のようなちょっとした実験をするだけであれば、Cosmos DB は Free Tier (無料プラン) で十分です。

Azure Functions サービス

Azure Functions は、ユーザが作成した関数 (プログラム) をクラウド上で実行するサービスです。

当記事では、Cosmos DB のレコードの変化をトリガとして関数を実行する例を紹介しています。
これにより、Iot Hub が MQTT でデータを受信しデータベースにレコードが追加されると、ユーザが作成して Azure Functions に登録しておいた関数が実行されることとなります。

Azure Functions は、C#, JavaScript, Python, Java, PowerShell, TypeScript など、多くの言語をサポートしています。

当記事のようなちょっとした実験をするだけであれば、Azure Functions の従量課金プラン (サーバレス、Consumption、使用量プランとも呼ばれる ) で十分です。その場合はサーバレス動作となり、必要なときにのみ関数のインスタンスが作成されて実行されます。

デバイス上のデータを MQTT で Azure へ送信

PLCnext Control で MQTT 通信を行う方法はいくつかあります。

言語説明
Python・汎用の MQTT ライブラリ paho-mqtt モジュールを使用する。
・Azure 専用ライブラリ azure.iot.device モジュールを使用する。
Node-RED・デフォルトの MQTT ノードを使用する。
・Azure IoT Hub 専用ノードを使用する。
IEC 61131-3
(ラダー言語、ST言語、FBD など)
・MQTT 接続用ライブラリ “IIoT Library” (Phoenix Contact 社製、無料) を使用する。
PLCnext で Azure と MQTT 通信を行う手段のいろいろ

以下の記事では、Python と Azure 専用ライブラリ azure.iot.device モジュールを用いて PLCnext Control から Azure IoT Hub へ MQTT 通信を行うための実装の詳細を紹介しているので、合わせてご参照ください。

[リンク] Azure連携(2):デバイスからIoT HubへのMQTT送信(Python) … <準備中>

Azure で受信したデータをクラウド上で処理

Azure のクラウドサービス上に存在するユーザのプログラムを実行するためのトリガにはいくつか種類があります。
当記事では、Azure Cosmos DB トリガを利用して関数を実行する例を紹介しています。

トリガ説明
HTTP トリガHTTP 要求があると関数を実行します。WEB API を実装することが出来ます。
タイマー トリガ指定された時刻に関数を実行します。
Blob Storage トリガAzure Storage 内の Blob が作成または更新されたときに関数を実行します。
キュー トリガ新しいキューメッセージが到着したときに関数を実行します。
Event Grid トリガEvent Grid イベントが発生したときに関数を実行します。
Event Hubs トリガEvent Hubs イベントが発生したときに関数を実行します。
Azure Cosmos DB トリガAzure Cosmos DB にデータが追加または更新されたときに関数を実行します。
Service Bus トリガService Bus メッセージが到着したときに関数を実行します。
Azure Functions のトリガ

以下の記事では、Azure Cosmos DB トリガを使うための準備として、IoT Hub で受信したデータをメッセージルーティングにより CosmosDB へ自動的に登録する方法の詳細を紹介しているので、合わせてご参照ください。

[リンク] Azure連携(3):IoT Hub受信データをCosmos DBへ自動保存 … <準備中>

C# で作成したプログラムを Azure Functions によりクラウド上で実行する方法の詳細は以下の記事で紹介しています。

[リンク] Azure連携(4):IoT Hub受信データをAzure Functionsで処理(C#) … <準備中>

クラウド上での処理結果を MQTT でデバイスへ送信

クラウド上で処理した内容をデバイスに対して MQTT で送信するには、Azure Functions の関数内から IoT Hub へサービス接続を行って MQTT の送信要求を行うことで実現できます。

デバイスからクラウド (IoT Hub) への MQTT 送信とは使用する機能や手続きが異なります。
実装の詳細については、以下の記事で紹介しています。

[リンク] Azure連携(5):Azure FunctionsからデバイスへのMQTT送信(C#) … <準備中>

クラウドから MQTT で送られてきたデータをデバイス側で受信

デバイスから Azure へ MQTT へデータを送信するときと同様の言語とライブラリを使用して実現できます。

実装の詳細については、以下の記事で紹介しています。

[リンク] Azure連携(6):クラウドからのMQTT通信を受信(Python) … <準備中>

クラウド上のデータを Power BI で可視化

Azure IoT Hub で受信したデータを Microsoft Power BI サービスを用いて可視化することも出来ます。

Azure と Power BI の連携
Azure と Power BI の連携

以下の記事で、具体的な方法を紹介しているので、ご参照ください。

[リンク] Azure連携(7):IoT Hub受信データをPower BIで可視化 … <準備中>

次の記事:Azure連携(2):デバイスからIoT HubへのMQTT送信(Python)

  • URLをコピーしました!
目次