Modbus データを MQTT にブリッジしてIIoTを実現:ステップバイステップチュートリアル
目次
Modbus の概要
Modbus は、産業用オートメーションデバイスを接続するためのシリアル通信プロトコルです。当初は1979年にModiconによって開発され、産業オートメーション分野で広く使用される汎用通信規格の1つに発展しました。
Modbus はマスター・スレーブ方式を採用し、シリアル(RS-232/485)やイーサネット(TCP/IP)など、複数の伝送モードをサポートしています。主にセンサー、モーター、PLCなどの自動化機器の監視と制御に使用されます。デバイス間のデータ交換を容易にし、制御コマンドの伝送を可能にすることで、異なるデバイス間の連携を実現します。
Modbus プロトコルでは、コイル、離散入力、入力レジスター、保持レジスターの4種類の記憶域が定義されています。記憶域のタイプによって、読み書きの操作が異なります。
記憶域名 | データ型 | アクセス種類 | PLCアドレス | レジスターアドレス |
---|---|---|---|---|
コイル | ビット | 読み書き | 000001-065536 | 0-65535 |
離散入力 | ビット | 読み取り専用 | 100001-165536 | 0-65535 |
入力レジスター | ワード | 読み取り専用 | 300001-365536 | 0-65535 |
保持レジスター | ワード | 読み書き | 400001-465536 | 0-65535 |
各記憶域には固有のアドレス範囲と読み書き操作コードがあります。アプリケーションシナリオに応じて適切な記憶域を選択し、読み書き操作を行うことが重要です。
Modbus TCPを例にとると、そのメッセージ構造はMBAP(Modbus Application Protocol Header)とPDU(Protocol Data Unit)から成ります。
Modbus プロトコルでは、メモリ領域へのアクセスや操作のために複数のファンクションコードが定義されています。よく使われるファンクションコードを以下に示します。
ファンクションコード | 機能 | 操作タイプ | 操作数 |
---|---|---|---|
01 | コイルの読み取り | ビット操作 | 単数または複数 |
02 | 離散入力の読み取り | ビット操作 | 単数または複数 |
03 | 保持レジスタの読み取り | ワード操作 | 単数または複数 |
04 | 入力レジスタの読み取り | ワード操作 | 単数または複数 |
05 | 単一コイルの書き込み | ビット操作 | 単数 |
06 | 単一レジスタの書き込み | ワード操作 | 単数 |
15 | 複数コイルの書き込み | ビット操作 | 複数 |
16 | 複数レジスタの書き込み | ワード操作 | 複数 |
スレーブIDが01H、読み取る保持レジスタの開始アドレスが006BH、読み取るレジスタ数が2個の場合、命令は以下のようになります。
スレーブID | ファンクションコード | 開始アドレス(上位バイト) | 開始アドレス(下位バイト) | レジスタ数(上位バイト) | レジスタ数(下位バイト) |
---|---|---|---|---|---|
01 | 03 | 00 | 6B | 00 | 02 |
各保持レジスタの長さは2バイトです。低位アドレスのレジスタが先に送信され、その後に高位アドレスのレジスタが続きます。各レジスタでは、上位バイトが先に送信され、下位バイトが後に続きます。応答は以下のようになります。
スレーブID | ファンクションコード | バイト数 | 006BH(上位バイト) | 006BH(下位バイト) | 006CH(上位バイト) | 006CH(下位バイト) |
---|---|---|---|---|---|---|
01 | 03 | 04 | 00 | 00 | 00 | 00 |
なぜModbusをMQTTにブリッジするのか?
Industry 4.0の到来により、製造業におけるインテリジェンス化、自動化、デジタル化への需要が高まっています。このような状況下では、Modbusプロトコルにはいくつかの課題があります。
- まず、Modbusプロトコルにはセキュリティ上の重大な問題があります。その単純なコミュニケーション方式により、ハッキング攻撃やデータ改ざんなどのセキュリティリスクの影響を受けやすくなっています。
- 次に、リアルタイム性能や帯域幅利用効率の点で、Modbusプロトコルは現代の産業用通信規格に比べて不十分です。特に大規模なデバイスネットワークの場合、従来のシリアル通信方式では要件を満たすことができなくなっています。
- さらに、多層アーキテクチャやクラウドプラットフォームの適用の面でも、Modbusプロトコルには一定の制約があります。ポイントツーポイント通信しかできず、分散システムやクラウドコンピューティングプラットフォームをうまくサポートできません。
Modbusプロトコルと比較すると、MQTTプロトコルには明らかな利点があります。MQTTプロトコルは、Pub/Subモデルに基づく軽量メッセージ伝送プロトコルで、TCP/IPプロトコル上に構築されています。1999年にIBMによってリリースされ、2014年にOASISによって正式に承認された通信規格となりました。現在ではIoT、モバイルインターネット、スマートハードウェア、コネクテッドカー、スマートシティ、遠隔医療、電力、石油・エネルギーなどの分野で広く適用されています。
MQTTの主な利点は以下の通りです。
- 軽量:MQTTは非常に軽量で、帯域幅が限られていたりネットワーク品質が悪かったりする環境でも使用できます。
- 柔軟性:MQTTは複数の接続方法をサポートし、Pub/Subモデルを通じて柔軟なメッセージ伝送を実現します。
- 信頼性:MQTTは再接続と通信の復旧を可能にすることで、ネットワークが中断した場合でもメッセージの確実な伝送を保証します。
- セキュリティ:MQTTはSSL/TLS暗号化と認証メカニズムをサポートし、データのセキュリティを確保します。
したがって、IoTの分野では、MQTTは分散システムにおけるメッセージ伝送により適しています。
ModbusからMQTTへのブリッジアーキテクチャ
ModbusからMQTTへのブリッジアーキテクチャは、主に2つのコンポーネントで構成されています。ModbusデータソースとMQTTブローカーです。データソースはModbusデータをMQTTブローカーに送信し、MQTTブローカーはそのデータを受信して転送します。このプロセスを実現するには、2つの重要な要素が必要です。1つはModbusプロトコルをMQTTに変換し、データをMQTTブローカーに送信するエッジデバイスであり、もう1つはMQTTメッセージを処理するMQTTブローカーです。
本記事では、NeuronとEMQXを使用してブリッジプロセスを実装します。
Neuronは、標準またはプロプライエタリなプロトコルを使用してさまざまな産業用デバイスを接続できる、現代的な産業用IoT接続サーバーです。産業用IoTプラットフォームとデバイス間の相互接続を実現します。軽量な産業用ソフトウェアであるNeuronは、リソースが限られたさまざまなIoTエッジハードウェアデバイス上で実行できます。データを中心とした自動化機器データの統一的なアクセスの難しさを解決し、スマートマニュファクチャリングのための基盤を提供することを目的としています。
EMQXは、高性能でスケーラブルな、世界をリードするオープンソースの分散型IoT MQTT ブローカーです。EMQXは、大量のIoTデバイスに効率的で信頼性の高い接続を提供し、メッセージとイベントフローデータのリアルタイムな移動と処理を高性能でサポートすることで、ユーザーが重要なビジネス向けのIoTプラットフォームとアプリケーションを迅速に構築できるようにします。
以下の図は、Neuronがエッジからデータをどのように収集し、それをMQTTに変換してEMQXにアップロードするかを示しています。
NeuronによるModbusからMQTTへのブリッジ
本節では、NeuronでModbusデバイスからデータを収集し、収集したデータをEMQXにアップロードし、MQTTXで閲覧する方法を紹介します。
EMQXクイックスタート
EMQXは複数のインストール方法を提供しており、ユーザーはドキュメントで詳細なインストール方法を確認できます。本例ではコンテナデプロイを使用し、EMQXをすぐに体験できるようにします。
次のコマンドを実行してDockerイメージを取得します。
docker pull emqx/emqx:5.1.0
次のコマンドを実行してDockerコンテナを起動します。
docker run -d --name emqx -p 1883:1883 -p 8081:8081 -p 8083:8083 -p 8084:8084 -p 8883:8883 -p 18083:18083 emqx/emqx:5.1.0
Webブラウザで http://localhost:18083/
(「localhost」を実際のIPアドレスに置き換えてください)にアクセスすると、EMQX Dashboardにアクセスできます。これにより、デバイスの接続を管理し、関連するメトリクスを監視できます。このチュートリアルではDockerコンテナを実行したままにしておいてください。興味がある方は、ドキュメントを参照して、Dashboardでより多くの機能を体験してみてください。
初期ユーザー名:admin
、初期パスワード:public
Modbusシミュレーターのインストール
PeakHMI Slave Simulatorsをインストールします。インストールパッケージはPeakHMIの公式Webサイトからダウンロードできます。
インストール後、Modbus TCP slave EXを実行します。Neuronとシミュレーターが同じローカルネットワーク上で実行されていることを確認してください。
Windows->レジスターデータをクリックしてデータを表示します。
ステーション番号1を選択します。
保持レジスターを選択します。これでシミュレーターの起動は完了です。シミュレーターを開いたままにして、Neuronの操作を続けます。
Neuronクイックスタート
Neuronは様々なインストール方法を提供しており、ユーザーはドキュメントで詳細なインストール方法を確認できます。本例ではコンテナ化されたデプロイを使用します。
Dockerイメージの取得:
$ docker pull emqx/neuron:latest
Dockerコンテナの起動:
$ docker run -d --name neuron -p 7000:7000 --privileged=true --restart=always emqx/neuron:latest
Webブラウザを開き、ゲートウェイのアドレスとポート番号を入力すると、Neuronを実行できます。これで管理コンソールページに移動します。デフォルトのポート番号は7000です。ブラウザでhttp://localhost:7000/
(「localhost」を実際のIPアドレスに置き換えてください)にアクセスできます。
ステップ1: ログイン
初期ユーザー名とパスワードでログインします。
- ユーザー名:
admin
- パスワード:
0000
ステップ2: 南向きデバイスの追加
設定メニューの南向きデバイスを選択し、南向きデバイスのインターフェースに入ります。デバイスの追加をクリックして、新しいデバイスを追加します。
- 名前: デバイスの名前を入力します。例えば、「modbus-tcp-1」など。
- プラグイン: ドロップダウンボックスからModbus TCPプラグインを選択します。
ステップ3: 南向きデバイスのパラメータ設定
南向きデバイスを追加すると、自動的にデバイス設定画面に入ります。そこでパラメータを入力し、送信します。
- 伝送方式: TCPを選択します。
- 接続方式: クライアントを選択します。
- 最大再試行回数: 0
- 再試行間隔: 0
- 送信間隔: 20
- IPアドレス: PeakHMI Slave SimulatorsソフトウェアがインストールされているPCのIPアドレスを入力します。
- ポート: 502
- 接続タイムアウト: 3000
ステップ4: デバイスカードにグループを作成
デバイスノードカードの任意の空白部分をクリックし、グループリスト管理画面に入ります。作成をクリックすると、グループ作成のダイアログボックスが表示されます。パラメータを入力し、送信します。
- グループ名: グループ名を入力します。例えば、「group-1」など。
- 間隔: 1000
ステップ5: グループにタグを追加
グループカードの任意の空白部分をクリックし、ポイントリスト管理画面に入ります。作成をクリックすると、データポイント追加ページに入ります。
データポイントのパラメータを入力し、送信します。
- 名前: ロケーション名を入力します。例えば、tag-1など。
- 属性: ドロップダウンメニューからロケーション属性を選択します。例えば、読み取り、書き込みなど。
- タイプ: ドロップダウンメニューからデータタイプを選択します。例えば、INT16など。
- アドレス: ドライバーアドレスを入力します。例えば、1!40001など。1はModbusシミュレーターで設定したロケーションのステーション番号を表し、40001はロケーションのレジスターアドレスを表します。
- 説明、小数点、精度: 入力しません。
ステップ6: データ監視で収集データを表示
左側のナビゲーションメニューから監視→データ監視を選択します。作成したデータポイントによって読み取られた値を表示します。以下の図のようになります。
注: Modbusシミュレーターが起動されていることを確認してください。
データ監視ではグループ単位で値を表示します。
- 南向きデバイス: ドロップダウンメニューから表示したい南向きデバイスを選択します。例えば、作成したmodbus-tcp-1など。
- グループ名: 選択した南向きデバイスの下にある、表示したいグループをドロップダウンメニューから選択します。例えば、作成したgroup-1など。
- 選択後、ページには選択したグループで読み取られたすべてのポイントの値が表示されます。
ステップ7: 北向きプラグインモジュールをアプリケーションに追加
北向きアプリケーションを作成することで、Neuronは北向きアプリケーションとの接続を確立し、収集したデバイスデータをEMQXにアップロードします。
設定メニューの北向きアプリケーションを選択し、アプリケーションの追加をクリックします。以下の図のようになります。
MQTTクラウド接続モジュールを追加します。
- 名前: アプリケーション名を入力します。例えば、MQTTなど。
- プラグイン: ドロップダウンからMQTTプラグインを選択します。
ステップ8: 北向きアプリケーションのパラメータ設定
北向きアプリケーションを追加すると、自動的にアプリケーション設定画面に入ります。パラメータを入力し、送信します。
MQTT接続を設定します。
- クライアントID: このIDは互いに独立している必要があります(IDが重複すると、クライアントがキックされます)。例えば、MQTT1999に設定します。
- QoSレベル: デフォルトは0です。
- アップロード形式: デフォルトはValues-formatです。
- 書き込み要求トピック: デフォルトは/neuron/MQTT/write/reqです。
- 書き込み応答トピック: デフォルトは/neuron/MQTT/write/respです。
- オフラインデータキャッシュ: デフォルトではオフです。
- ブローカーホスト: 作成したemqxブローカーのアドレスを入力します。通常はlocalhostです。つまり、実際のIPアドレスです。
- ブローカーポート: デフォルトは1883です。
- ユーザー名、パスワード: 不要です。
- SSL: デフォルトではオフです。
ステップ9: 南向きポイントグループのサブスクライブ
新しく作成したMQTTアプリケーションノードカードの任意の空白部分をクリックし、サブスクリプショングループ画面に入り、「サブスクリプションの追加」をクリックします。
南向きデバイスのデータグループをサブスクライブします。
- 南向きデバイス: ドロップダウンリストから作成した南向きデバイスを選択します。例えば、modbus-tcp-1など。
- グループ: ドロップダウンリストからサブスクライブするグループを選択します。例えば、group-1など。
- トピック: MQTTトピックです。本例ではデフォルトで/neuron/MQTT/group-1に設定されています。次に、このトピックをサブスクライブし、MQTTXでメッセージを受信します。
ステップ10: MQTTクライアントでデータを表示
サブスクライブ後、MQTTクライアントを使用してEMQXに接続し、報告されたデータを表示できます。ここでは、強力なクロスプラットフォームMQTTクライアントツールであるMQTTXを使用します。公式サイトからダウンロードできます。
MQTTXを起動したら、メインページの+新しい接続をクリックし、設定パラメータを入力して、右上の接続をクリックします。
- 名前: メッセージに名前を付けると表示しやすくなります。例えば、modbus-tcpという名前を付けます。
- クライアントID: デフォルト値を使用してもよいですが、IDが独立していることを確認してください。
- ホスト: ws:// を選択し、
emqx@localhost
(「localhost」を実際のIPアドレスに置き換えてください)を入力します。 - ポート: 8083
オプションのパラメータを入力し、完了後に右上の接続ボタンをクリックします。接続が成功したら、トピックをサブスクライブします。
- サブスクリプションの追加をクリックし、トピックはステップ9と同じにします。例えば、
/neuron/MQTT/group-1
と入力します。
サブスクライブが成功すると、MQTTXがNeuronによって収集・報告されたデータを継続的に受信していることがわかります。以下の図のようになります。
IIoTのユースケース
石油生産データの取得
石油生産におけるデジタル化の規模が拡大するにつれ、自動化機器の数が増加し、データ収集と管理が複雑になっています。
オープンな機器データネットワークを構築することで、油田データセンターはRTU、DTU、PLCなどの様々なデータ収集デバイスと直接接続することができます。NeuronのようなIndustrial Protocol Gatewayソフトウェアを使用することで、Modbus/TCPやベンダー固有のプロトコルをMQTTデータ(IoT向けの標準プロトコル)に変換し、リアルタイムに収集、処理、報告することができます。これにより、上位のビジネスシステムでのデータの保存と消費が容易になります。
Neuron と EMQX、eKuiper、EMQX ECP などの他の EMQ 製品を組み合わせた全体的なソリューションは、石油業界に以下のようなメリットをもたらします。
- フロントエンドを軽量化し、バックエンドを重視するシステムアーキテクチャにより、現場の機器とシステムの運用・保守コストを削減できます。
- MQTTのIoTプロトコルを主なデータ収集・伝送方式として利用することで、生産データをリアルタイムに報告し、業務システムの応答性を向上させます。
- 生産・監視機器など、多種多様な機器やシステムからの大量のリアルタイムデータを集約し、保存することができます。
- 統一されたアクセスミドルウェアプラットフォームと豊富なデータインターフェースによって、データ収集システムとデータ消費システムを分離し、アプリケーション開発をより簡単かつ効率的にします。
産業のネットワーク化、デジタル化、インテリジェント化の実現
Industry 4.0の文脈では、統合されたワンストップのIndustrial IoTデータプラットフォームが不可欠になります。
NeuronはModbus、OPC-UA、IEC61850、IEC104などの完全な産業用プロトコルをサポートし、異種産業機器のデータへの効率的なアクセスを実現します。リアルタイムに収集されたデータは、軽量エッジストリーミング処理エンジンであるeKuiperによってエッジでキャプチャ、フィルタリング、補完、時間枠計算されるため、エッジAI推論サービスに高品質のデータソースを提供できます。
クラウド側でのリアルタイムなデータ接続、移動、保存、処理、分析を可能にすることで、ビッグデータ分析や人工知能アプリケーションのための堅牢なデータ基盤を提供し、企業が上位層のアプリケーションを迅速に開発できるようにします。
まとめ
Modbusプロトコルを使用すると、デバイス間の通信とデータ交換が可能になり、一方でMQTTは効率的で柔軟かつ安全なメッセージ伝送メカニズムを提供します。Modbus RTUまたはTCPをMQTTメッセージに変換することで、必要に応じてデバイスデータをクラウドに簡単に送信し、リモートで制御および監視することができます。このアプローチは、産業企業が機器や生産プロセスをより適切に管理し、生産性と品質を向上させるのに役立ちます。