Mod Bus


お問合せ
 更新 Administrator Takeshi Hirabayashi

1.はじめに

 ModBusプロトコルは、Modicon Inc.(AEG Schneider Automational S.A.S)がPLC用に開発した通信プロトコルでModbus Protocol Reference Guideがある。
 なおModBusプロトコルで定義しているのは通信のプロトコルのみで、通信媒体などの物理レイヤは規程さていない。
 このModBusを調べるきっかけとなった電力などのマルチメータの情報通信については物理レイヤをRS485としています。
 あとでRS485も調査してみます。
 以下では、このきっかけとなった電力マルチメータを重点的に解説します。



2.概要

 ModBusの通信方式は,シングルマスタ/マルチスレーブ方式※1です。
 マスターだけがクリエ(通信の開始)を発光する事が出来ます。スレーブは、このクリエを受信して指定された事を実行し応答メッセージを送信します。
 マスターは指定のスレーブに対するクエリまたはブロードキャスト(全てのスレーブに対し)クエリのいずれかを送信する事ができます。
 ブロードキャストクエリの場合は、スレーブは指定の事を実行するだけで応答メッセージの送信はしません。
 応答メッセージはスレーブ個体に対するクエリのときだけに応答メッセージを送信します。

 マスタからのクエリフォーマットは
  ・スレーブのアドレスまたはブロードキャスト番号 8bit
  ・実行項目番号のファンクションコード 8bit
  ・実行引き渡しデータのクエリデータ 8bit×n(今回のマルチメータの場合はn=4)
  ・エラーチェックコード 16bit
  から構成されています。

  スレーブからの応答は
  ・スレーブのアドレス 8bit
  ・ファンクションコード 8bit
  ・応答データ 8bit×n(今回のマルチメータの場合はn=3)
  ・エラーチェックコード 16bit

なお通信信号伝送モードにはASCII(American Standard Code for Infomation interchange)コードとRTU(Remote Terminal Unit)コードの2種類のコードが使用できます。
またエラーチェックコードはASCIIコードの場合はLRC(Longitudinal Redundancy Check)法が、RTUコードの場合はCRC(Cyclic Redundancy Check)法が使用されます。

※1今回の電力マルチメータはKWS-AC301Lと言うもので郵送費含みで約1,900円と非常に安価な物でしたが、ModBusのディバイスアドレスが固定されおり、複数では使用出来ないのが残念です。



3.modBusのフレーム構造

通信信号伝送モード別に説明になるが、今回のマルチメータはRTUコードを使用しているのでRTUコード使用時のフレームを先に説明する。
RTUコードのフレーム 概要で説明した内容に前後にサイレントインターバル(無通信時間)が3.5文字分入ります。
Start Address Function Data CRC Check End
null+null+null+nul 8bit 8bit 8bit×n 16bit null+null+null+null
a.アドレス(Address)・フィールド
コードは0~247(0xF7)です。
 (ただし今回の電力マルチメータは0x02に固定されています。:チョット残念)
ブロードキャストクリエのアドレスは0です

b.ファンクション・フィールド
コードは1~255(0xFF)です。
確認はしてませんが例外の応答メッセージはコードのMBS(最上位のbit)を1にしてスレーブから送信されます。

c.データ・フィールド
nは規定がありません。
今回の電力マルチメータの場合はマスターが4で、スレーブは3です。

d.CRCチェック
CRCは16bit=2Byte(2バイト)のバイナリ値で構成されています。
CRCは送信側が計算し、受信側が受信データのCRCを計算し受信データのCRCと比較して違っていればエラーになります。

CRCについては説明を終わります。

e.ASCIIコードについて
ASCIIコードの場合はRTUコードで使用している16進数をASCIIコードに直すためRTUコードの約2倍のデータ長となる。
例えばRTUコード0x02は 0x30、0x32のとなるため、8bit×2の2byte(バイト)が必要となる。 フレーム構造は下表の様になる。
Start Address Function Data LRC Check End
(0x3A)8bitl 2byte 2byte 2byte×n 16bit (0c0D)+(0x0A)



4.ModBusのメッセージ構成

今回は電力マルチメータに関するメッセージ構成を説明する。
メッセージにはマスターからのものとスレーブからのものがある。
a.マスターからのメッセージ構成例
以下は電力マルチメータの電圧値の要求をしたものです。
フィールド名 コード例
スレーブアドレス 0x02
ファンクションコード 0x03


開始アドレス(上位) 0x00
開始アドレス(下位) 0x0E
レジスタの数(上位) 0x00
レジスタの数(下位) 0x01
CRC Check 0xE5,0xFA
下記はRS485の実際のマスター側の受信情報です。
※ただしデータの送信情報でアドレス指定は0x0001です。
信号の詳細はRS485で説明する。


b.スレーブ側のメッセージ構成例
マスターから電圧値要求が有ったのでその答えの電圧値のメッセージが下表です。
フィールド名 コード例
スレーブアドレス 0x02
ファンクションコード 0x03


データバイト数 0x02
データ1 0x04
データ2 0x15
CRC Check 0x3F,0x4B
下記はRS485の実際のマスター側の受信情報です。
※ただしデータのアドレス指定は0x0001です。




5.ファンクションコード

今回は購入した電力マルチメータを中心に説明をしたが、以下にファンクションコードを一覧に示す。
その他についてはMSYSTEMのModbusプロトコル概説書を参考にされたい。
項     目 コード ※B 概         要
Read Coil Status 0x01 × スレーブの DO(Discrete Output)の ON / OFF 状態を読出します。
Read Input Status 0x02 × スレーブの DI(Discrete Input)の ON / OFF 状態を読出します。
Read Holding Register 0x03 × スレーブの保持レジスタの内容を読出します。
Read Input Register 0x04 × スレーブの入力レジスタの内容を読出します。
Force Single Coil 0x05 スレーブの DO(Discrete Output)の状態を ON / OFF のいずれかに変更(書込み)します。
Preset Single Register 0x06 スレーブの保持レジスタの内容を変更(書込み)します。
Diagnostics 0x08 × マスターとスレーブ間の通信の診断やスレーブの機器の診断ファンクションです。
Fetch Communication Event Counter 0x0B × スレーブの通信イベントカウンタからステータスワードとイベントカウンタを読出します。
Fetch Communication Event Log 0x0C × スレーブの通信イベントログ(ステータスワード、イベントカウンタ、メッセージカウントおよびイ ベント)を読出します。
Force Multiple Coils 0x0F スレーブの連続した複数の DO(Discrete Output)の状態を、ON / OFF のいずれかに変更(書込み) します。
Preset Multiple Registers 0x10 スレーブの連続した複数の保持レジスタの内容を変更(書込み)します。
Report Slave ID 0x11 × スレーブのコントローラタイプや動作モードなどスレーブの情報を読出します。
※Bはブロードキャストに対応しているかを示す。