Modbus​の​概要

概要

Modbus​通信​プロトコル​は、​自動化​デバイス​間​の​通信​を​可能​に​する​ため​に、​1979​年​に​開発​さ​れ​ま​した。 当初​は、​シリアル​層​経由​で​データ​を​転送​する​アプリケーション​レベル​プロトコル​として​実装​さ​れ​てい​ま​した​が、​その後、​シリアル、​TCP/​IP、​UDP(ユーザ​データ​グラム​プロトコル)​経由​の​実装​を​含む​よう​に​拡張​さ​れ​ま​した。 現在​では、​さまざま​な​タイプ​の​ネットワーク​間​で​単純​で、​信頼​性​と​効率​の​高い​通信​を​実現​する​ため​に​多数​の​デバイス​で​一般​的​に​使用​さ​れ​てい​ます。

内容

Modbus​の​概要

Modbus​は、​デバイス​間​の​SCADA(リモート​監視・​制御​システム)​スタイル​の​ネットワーク​通信​で​よく​使用​さ​れ​ます。 たとえば、​プログラマブル​ロジック​コントローラ​(PLC)​または​プログラマブル​オートメーション​コントローラ​(PAC)​の​マスタ​に​は、​大型​サーバ​を​使用​し、 PLC/​PAC​が​センサ、​バルブ、​モータ、​その他​の​組​込​デバイス​を​マスタ​し​ます。

Modbus​は、​これらの​ニーズ​に​応える​ため​に、​柔軟​な​データ/​機能​モデル​を​採用​した​要求/​応答​モデル​として​設計​さ​れ​てい​ます。​この​機能​が、​現在​でも​引き続き​使用​さ​れ​て​いる​理由​の​一部​です。

要求/​応答​サイクル

Modbus​プロトコル​は、​マスタ/​スレーブ​アーキテクチャ​を​採用​し​て​おり、​マスタ​が​スレーブ​に​要求​を​送信​し​て、​応答​を​待ち​ます。 この​アーキテクチャ​は、​情報​の​流れ​を​マスタ​が​完全​に​制御​できる​ので、​旧式​の​分岐​シリアル​ネットワーク​にとって​有益​です。 現代​の​TCP/​IP​ネットワーク​でも、​マスタ​が​スレーブ​動作​の​多く​を​制御​できる​ため、​一部​の​デザイン​では​便利​です。

1. Modbus​デバイス​の​マスタ/​スレーブ、​要求/​応答​の​関係

Modbus​では、​この​要求​は、​階層​化​さ​れ​た​データセット​です。 最初​の​レイヤ​は、​アプリケーション​データ​ユニット​(ADU)​です。​これ​は、​使用​する​Modbus​の​タイプ​とも​いえ​ます。 ASCII、​リモート​端末​装置​(RTU)、​TCP/​IP​の​3​つ​の​ADU​が​あり​ます。

TCP​は、​要求​ごと​に​専用​の​接続​と​ID​を​使用​し​て​ネットワーク​処理​を​効率​化​する​とともに、​Modbus​要求/​応答​を​ソフトウェア​で​効率​的​に​処理​できる​現代​的​な​フォーマット​です。 RTU​と​ASCII​は、​旧式​の​シリアル​ADU​形式​で、​2​つ​の​違い​は、​RTU​が​コンパクト​な​バイナリ​表記​を​使用​する​の​に対して、​ASCII​は​すべて​の​要求​を​ASCII​文字​の​ストリーム​として​送信​し​ます。

ほとんど​の​アプリケーション​で、​どの​ADU​が​推奨​さ​れる​か​は、​目的​の​物理​ネットワーク​(Ethernet、​シリアル、​その他)、​ネットワーク​上の​デバイス​数、​ネットワーク​上​で​マスタ​および​スレーブ​デバイス​が​サポート​する​ADU​の​数​に​依存​し​ます。 Modbus​を​使用​する​アプリケーション​から​見​た​とき、​データ​は、​あたかも​ADU​が​存在​しない​よう​に​見える​必要​が​あり​ます。

各​ADU​内​に​は、​Modbus​プロトコル​の​中心​で​ある​プロトコル​データ​ユニット​(PDU)​が​あり​ます。 各​PDU​に​は、​関数​コード​と​関連​データ​が​含​まれ​てい​ます。 各​関数​コード​に​は、​応答​を​適切​に​定義​し​ます。​この​関数​コード​は、​スレーブ​に​送信​さ​れる​コマンド​と​いえ​ます。

エラー​が​発生​する​場合​が​あり​ます。 Modbus​では、​例外​用​に​特定​の​PDU​が​定義​さ​れ​て​おり、​これ​は​何​が​起​きた​か​を​マスタ​に​知らせ​ます。 ほとんど​の​ドライバ​は、​これ​を​使用​中​の​言語​または​アプリケーション​用​が​理解​できる​形式​に​変換​し​ます。

Modbus​データモデル

Modbus​は、​データ​の​アクセス​を​単純​かつ​柔軟​に​管理​し​ます。 Modbus​は、​ブール​値​と​符号​なし​16​ビット​整数​の​2​つ​の​データタイプ​を​ネイティブ​に​サポート​し​ます。

SCADA​システム​では、​組​込​デバイス​で​ゲイ​ン、​PID(比例、​積分、​積分)​など​の​値​を​入力​として​定義​し、​また、​現在​の​温度​や​バルブ​位置​など​の​値​を​出力​として​定義​する​こと​が​よく​あり​ます。 この​ニーズ​に​応える​ため​に、​Modbus​データ​値​は、​4​つ​の​範囲​に​分割​さ​れ​てい​ます​(表​1​を​参照)。 スレーブ​では、​範囲​あたり​最大​65,536​個​の​要素​を​定義​でき​ます。

メモリ​ブロック データタイプ マスタ​アクセス スレーブ​アクセス
コイル ブール 読み取り/​書き込み 読み取り/​書き込み
ディスク​リート​入力 ブール 読み取り​専用 読み取り/​書き込み
保持​レジスタ 符号​なし​ワード​整数 読み取り/​書き込み 読み取り/​書き込み
入力​レジスタ 符号​なし​ワード​整数 読み取り​専用 読み取り/​書き込み

表​1. Modbus​データモデル​ブロック

多く​の​場合、​センサ​や​その他​の​デバイス​は、​単純​な​ブール​や​符号​なし​整数​以外​の​タイプ​の​データ​を​生成​し​ます。 一般​的​に、​スレーブ​デバイス​は​これらの​大きな​データタイプ​を​レジスタ​に​変換​し​ます。 たとえば、​圧力​センサ​は、​32​ビット​浮動​小数点​数値​を​2​つ​の​16​ビット​レジスタ​に​分割​する​場合​が​あり​ます。

Modbus​は、​これらの​値​を​完全​に​概念的​な​方法​で​露出​する​ため、​実際​に​は​メモリ​に​存在​しない​場合​が​あり​ます。 たとえば、​スレーブ​で​保持​レジスタ​と​入力​レジスタ​が​同じ​メモリ​を​共有​する​こと​が​合理​的​な​場合​は、​そのように​定義​する​こと​が​でき​ます。 ほとんど​の​場合、​スレーブ​は、​サポート​する​データタイプ​ごと​に​別々​の​メモリ​に​格納​し、​マスタ​が​アクセス​できる​データ​要素​数​を​制限​し​ます。 この​柔軟性​は、​Modbus​機能​の​詳​しく​定義​さ​れ​た​動作​を通じて​データ​が​露出​さ​れる​方法​が​理由​で​オプション​です。

Modbus​機能​コード

Modbus​機能​コード​は、​マスタ​が​データ​に​アクセス​する​方法​および​データ​を​変更​する​方法​を​定義​し​ます。 データ​範囲​が​概念的​で​ある​の​と​は​異​なり、​機能​コード​は​動作​が​詳​しく​定義​さ​れ​てい​ます。 スレーブ​は、​機能​コード​の​実行​を​依頼​さ​れる​と、​機能​の​パラメータ​を​使用​し​て、​詳​しく​定義​さ​れ​た​動作​を​実行​し​ます。 図​2​は、​機能​要求​と​デバイス​の​実際​の​メモリ​と​の​リンク​を​示し​てい​ます。

図​2. 機能​コード、​データ​範囲、​スレーブ​デバイス​の​実際​の​メモリ​の​間​の​マッピング

ほとんど​の​一般​的​な​機能​コード​は、​変更​または​アクセス​する​概念的​な​データ​範囲​に従って​名前​が​付け​ら​れ​てい​ます。 たとえば、​「Read Holding Registers(保持​レジスタ​の​読み取り)」​は、​保持​レジスタ​として​定義​さ​れ​て​いる​メモリ​から​データ​を​読み取り、​マスタ​に​返し​ます。 表​2​は、​一般​的​な​機能​コード​を​表​し​てい​ます。

表​2. 一般​的​な​機能​コード

LabVIEW​で​Modbus​を​使用​する

Modbus​デバイス​と​通信​する​方法​は、​(1) 高​レベル​OPC​サーバ (2) Modbus I/​O​サーバ (3) NI LabVIEW 2014​で追加された、​LabVIEW Real-​Time​または​LabVIEW Datalogging and Supervisory Control(DSC)​経由​の​低​レベル​Modbus API

LabVIEW Modbus API

Modbus​要求​の​シーケンシング​と​タイミング​に関して​アプリケーション​で、​高​レベル​の​制御​が​必要​な​場合​は、​低​レベル​Modbus API​を​お​勧め​し​ます。 また、​柔軟性​が​非常​に​重要​な​場合​も、​低​レベル​API​を​お​勧め​し​ます。 LabVIEW Modbus API​により​柔軟性​と​パワー​得​られる​反面、​API​を​正しく​管理​する​ため​に​アプリケーション​コード​が​複雑​に​なら​ざる​を​え​ま​せん。 この​複雑​性​の​理解​を​助ける​ため​に、​LabVIEW​に​2​つ​の​サンプル​が​含​まれ​てい​ます。

Modbus​の​最初​の例

最初​の​サンプル(Modbus Library.lvproj)​は、​API​の​基本​機能​を​紹介​する​もの​です。 また、​PC​で​の​実装​と​リアルタイム​ターゲット​で​の​実装​の​違い​も​紹介​し​てい​ます。 図​3​は、​Real-​Time Modbus Master​サンプル​を​表​し​てい​ます。

図​3. Master on RT Target.vi

この​サンプル​は、​LabVIEW API​を​使用​する​Modbus​アプリケーション​の​中心​的​要件​を​表​し​てい​ます。 まず、​Modbus​インスタンス​を​作成​し​ます。 ここ​では、​TCP​マスタ​です。 これ​は、​多​態​性​インスタンス​セレクタ​で​シリアル​マスタ​に​変更​する​こと​により、​切り替え​ら​れ​ます。

図​4. Modbus​マスタ​の​タイプ​の​変更

インスタンス​を​作成​すると、​スレーブ​デバイス​に​データ​の​ポーリング​を​開始​でき​ます。 ここ​では、​機能​コードRead Input Registersを​使用​し​ます。 API​で​サポート​さ​れる​すべて​の​Modbus​機能​コード​は、​適切​な​パレット​に​表示​さ​れ​ます。 スレーブ​API​に​は、​プロトコル​の​実装​が​理由​で、​マスタ​では​実装​でき​ない​追加​機能​が​あり​ます。 たとえば、​スレーブ​は、​入力​レジスタ​範囲​に​書き​込​め​ます​が、​マスタ​は​範囲​から​読み取る​こと​しか​でき​ま​せん。 図​5​は、​機能​コード​を​表​し​てい​ます。

図​5. 機能​コード​を​表示​し​て​いる​Modbus​マスタ​および​スレーブ​パレット

最後​に、​Modbus​インスタンス​を​閉​じ​ます。​これ​により、​インスタンス​に​関連​付け​ら​れ​て​いる​メモリ​が​解放​さ​れ​ます。 また、​これ​により、​インスタンス​が​使用​し​てい​た​TCP​接続​または​NI-​VISA​シリアル​リファレンス​など​の​リファレンス​も​閉​じ​ら​れ​ます。

ここ​まで、​マスタ​の​サンプル​だけ​を​紹介​してき​ま​した​が、​すべて​の​サンプル​は、​「開く、​読み取り/​書き込み、​閉じる」​という​LabVIEW​で​定型​的​な​基本​パターン​に従って​い​ます。

最後​に、​API​の​外観​は​同じ​でも、​重要​な​違い​を​理解​し​て​おく​必要​が​あり​ます。 デバイス​が​マスタ​で​あれ​ば、​データ​を​集録​する​ため​に​適切​な​スレーブ​に​ネットワーク​経由​で​要求​を​送信​する​必要​が​あり​ます。 これ​に対して、​スレーブ​は​自分​の​データ​ストレージ​が​ある​ので、​データ​に​素​早く​アクセス​でき​ます。

冗長​化​マスタ​の例

一部​の​アプリケーション​に​は​基本​サンプル​で​十分​ですが、​センサ​や​ゲート​ウェイ​と​通信​する​という​複雑​な​アプリケーション​に​は​不十分​な​場合​が​あり​ます。 この​ギャップ​を​埋める​ため​に、​サンプル​アプリケーション​で、​2​つ​の​マスタ​を​使用​し​て​スレーブ​と​通信​する​方法​を​紹介​し​ます。 1​つ​の​マスタ​に​障害​が​発生​し、​スレーブ​または​HMI(ヒューマン​マシン​インタフェース)​と​の​接続​が​失​われ​た​場合、​もう​1​つ​の​マスタ​が​処理​を​実行​し​ます。

図​6. 冗長​化​マスタ​の​設計例

この​設計​が​あなた​の​アプリケーション​の​ニーズ​に​一致​し​て​いるか、​これ​より​複雑​な​Modbus​通信​について​知​り​たい​場合​は、​サンプル​ファインダでRedundant Modbus Masters.lvprojを​参照​し​て​くだ​さい。

Modbus I/​O​サーバ

LabVIEW DSC​および​LabVIEW Real-​Time​モジュール​に​含​まれ​て​いる​Modbus I/​O​サーバ​は、​Modbus​経由​で​通信​する​高​レベル​エンジン​を​提供​し​ます。 送信​する​機能​コード​を​指定​する​の​では​なく、​アクセス​した​い​データセット​を​登録​し​て​おく​こと​で、​指定​頻度​で​I/​O​サーバ​が​自動的​に​要求​を​スケジューリング​し​ます。

I/​O​サーバ​を​使用​する​に​は、​プロジェクト​で​目的​の​ターゲット​に​新​しく​I/​O​サーバ​を​追加​し​ます。 低​レベル​API​と​同様、​Modbus​マスタ​または​スレーブ​を​選択​でき、​それに​応​じ​て​追加​パラメータ​が​表示​さ​れ​ます。 たとえば、​マスタ​では、​ポーリング​レート​を​定義​し​ます。​ポーリング​レート​と​は、​スレーブ​に​すべて​の​要求​が​送信​さ​れる​頻度​です。​スレーブ​は​それらの​要求​を​待つ​側​なので、​タイミング​は​定義​しま​せん。

I/​O​サーバ​を​作成​したら、​デバイス​から​読み取る​項目​を​指定​でき​ます。 低​レベル​API​の​場合​は、​要求​を​自分​で​生成​し​て​処理​する​必要​が​あり​ます​が、​Modbus I/​O​では、​多数​の​形式​と​データタイプ​から​選択​でき​ます。 たとえば、​項目​400001​に​変数​を​マッピング​する​こと​で​アドレス​0​の​保持​レジスタ​を​読み取り、​400001.1​を​選択​する​こと​で​この​レジスタ​の​最初​の​ビット​を​読み取り、​F400001​を​選択​する​こと​で​レジスタ​0​と​1​に​格納​さ​れ​て​いる​単精度​浮動​小数​を​読み取る​こと​が​でき​ます。

アクセス​する​変数​を​選択​したら、​ブロック​ダイ​ア​グラム​上の​シェア​変数​ノード​を​使用​し​て​これらの​変数​を​読み書き​でき​ます。 変数​名​を​エイリアス​する​こと​も​でき​ます。

図​7. シンプル​な​I/​O​サーバ​アプリケーション

​ ​I/​O​サーバ​アプリケーション​に​必要​な​プログラミング​作業​は、​最小限​かつ​理解​し​やすい​もの​です。 この​使い​やす​さ​に​は、​制約​が​伴う​こと​を​理解​し​て​くだ​さい。 データは既定のレートでのみ更新され、​要求​する​データ​を​実行​時に​追加​した​り​削除​する​こと​は​でき​ま​せん。 これらの​制約​が​アプリケーション​で​許容​できる​ならば、​I/​O​サーバ​は​推奨​の​クロス​プラットフォーム​オプション​です。

詳しい​内容​と​手順​について​は、「Connect LabVIEW to Any PLC With Modbus」​を​参照​し​て​くだ​さい。

NI OPC Servers With OPC I/​O Servers or OPC UA

異なる​プロトコル​で​多く​の​スレーブ​と​通信​する​複雑​な​アプリケーション​では、​標準​的​な​Modbus I/​O​では​不十分​な​場合​が​あり​ます。 一般​的​な​解決​策​は、​OPC​サーバ​を​使用​し​て​全​システム​の​データ​を​集約​し​て​から、​LabVIEW DSC​モジュール​に​含​まれ​て​いる​OPC I/​O​サーバ​を​使用​し​て​その​OPC​サーバ​と​通信​する​こと​です。

図​8​は、​NI OPC​サーバ​が​Modbus​を​使用​し​て​センサ​と​直接​通信​し、​OPC UA​が​NI CompactRIO PAC​と​通信​する​この​アーキテクチャ​の​例​を​示し​てい​ます。 NI OPC​サーバ​に​データ​が​集約​さ​れ​た​後、​OPC I/​O​サーバ​は​データ​を​取り込み、​LabVIEW​アプリケーション​と​共有​する​こと​が​でき​ます。

図​8. Modbus、​NI OPC​サーバ、​OPC I/​O​サーバ​を​使用​した​SCADA​アプリケーション

OPC I/​O​サーバ​の​代わり​に​LabVIEW DSC​に​含​まれ​て​いる​OPC UA​ドライバ​を​使用​する​類似​の​アーキテクチャ​を​開発​する​こと​も​でき​ます。 しかし、​OPC UA​ドライバ​は​下位​レベルドライバ​で​あり、​OPC I/​O​サーバ​の​よう​に​使い​や​すく​は​ありま​せん。

この​よう​な​アプリケーション​を​開発​する​に​は、​まず、​NI OPC​サーバ​が​スレーブ​デバイス​と​通信​する​ため​の​有効​な​構成​を​生成​する​必要​が​あり​ます。 これ​は、​ドライバ​構成​を​定義​する​チャンネル​群​と、​その​ドライバ​の​個々​の​エンド​ポイント​を​定義​する​デバイス​群​を​生成​する​こと​で​実現​し​ます。 デバイス​を​構成​したら、​次に​タグ​を​生成​でき​ます。

図​9. 上の​アーキテクチャ​用​の​NI OPC​サーバ​の​サンプル​構成

NI OPC​サーバ​を​構成​した​後、​OPC I/​O​を​これらの​タグ​と​通信​する​よう​に​構成​でき​ます。 Modbus I/​O​サーバ​は、​レジスタ​に​アクセス​する​よう​に​構成​し​ます​が、​OPC I/​O​サーバ​は​OPC​サーバ​内​の​タグ​に​アクセス​する​よう​に​構成​し​ます。

図​10. OPC I/​O​サーバ​を​構成​する

この​バイ​ン​ド​プロセス​により​生成​さ​れる​変数​を​アプリケーション​の​中​で​使用​する​こと​が​でき​ます。

図​11. OPC I/​O​サーバ​を​使用​した​シンプル​な​アプリケーション

この​プロセス​の​実行​手順​は、「Connect LabVIEW to Any PLC Using OPC」​を​参照​し​て​くだ​さい。

アプリケーション​の​ニーズ​に​応える

Modbus​は、​強力​な​アプリケーション​を​実装​する​ため​に​さまざま​な​方法​で​使用​できる​シンプル​な​プロトコル​です。

Modbus​通信​に関して、​NI​は​アプリケーション​の​ニーズ​に​応える​ため​に​幅広い​機能​を​提供​する​3​つ​の​主​な​オプション​を​提供​し​てい​ます。 1​つ​目​の​低​レベル​API​は、​使い​や​すく​は​ない​ものの、​プロトコル​を​細部​まで​高性能​に​制御​する​こと​が​でき​ます。 低​レベル​API​を​使用​する​場合​は、​すべて​を​手作業​で​行う​必要​が​あり​ます。 シンプル​な​監視​アプリケーション​に​は、​Modbus I/​O​サーバ​が、​Modbus​データ​に​アクセス​し​て​提供​する​ため​の​シンプル​で​使い​やすい​API​を​提供​し​てい​ます。 使い​やす​さ​と​引き換え​に、​I/​O​サーバ​では、​プロトコル​に関して​一部​の​アプリケーション​で​必要​な​場合​の​ある​細かい​制御​は​でき​ま​せん。 最後​に、​大規模​で​複雑​な​システム​では、​データ​集約​用​に​フル​装備​の​OPC​サーバ​を​検討​する​こと​が​効果​的​な​場合​が​あり​ます。 その後、​LabVIEW OPC UA​ドライバ​または​OPC I/​O​サーバ​の​よう​な​ツール​を​使用​する​こと​で、​アプリケーション​から​この​データ​に​アクセス​する​こと​を​可能​にし​ます。