1. TOP
  2. OMRON
  3. 上位アプリケーション
  4. Modbus

概略

Modbusとは通信プロトコルのひとつで産業用電子機器を接続するときに使われます
ここではModbusのフレームについて簡単な説明をします
このページの最後に通信テスト用のアプリケーションへのリンクがあります

種類

  • Modbus-ASCII
  • Modbus-RTU
  • Modbus-TCP

アドレスについて

Modbusで扱うアドレスは4つの種類があります
種類アドレス範囲データ種別
コイル(coil)1-99991bit
入力ステータス(Input Status)10001-199991bit
入力レジスタ(Input Register)30001-3999916bit
保持レジスタ(Holding Register)40001-4999916bit

メッセージフレーム

Modbus-ASCII

Modbus-ASCIIはRS-422,RS-485で通信する文字列のメッセージです

送信メッセージ

保持レジスタの40001から2個のデータを読み出すメッセージフレーム
ヘッダスレーブアドレスファンクションデータLRCフッタ
アドレス個数
":""01""03""0000""0002""FA"CR+LF
1文字2文字2文字4文字4文字2文字2文字

受信メッセージ

ヘッダスレーブアドレスファンクション受信バイト数 データ1データ2LRCフッタ
上位下位上位下位
":""01""03""06""00""01""00""02""F3"CR+LF
1文字2文字2文字2文字2文字2文字2文字2文字2文字2文字

LRCの計算

スレーブアドレス~データの文字を数値(16進)にして合計して下2桁の2の補数+1とします
上の例だと 0+1+0+3+0+0+0+0+0+0+0+2=6 を2の補数+1にして"FA"になると思います

アドレス40017から2個読み出すときの例
アドレスは4017-40001=16 (0x0010)となって 個数は2(0x0002)なので
0+1+0+3+0+0+1+0+0+0+0+2=7(0x07) を2の補数+1にして"F9" になると思います
(16進では 0x00+0x01+0x00+0x03+0x00+0x00+0x01+0x00+0x00+0x00+0x00+0x02)

アドレス40201から20個読み出すときの例
アドレスは40201-40001=200 (0x00C8)となって 個数は20(0x0014)なので
0+1+0+3+0+0+12+8+0+0+1+4=29(0x1D) を2の補数+1にして"E3" になると思います
(16進では 0x00+0x01+0x00+0x03+0x00+0x00+0x0C+0x08+0x00+0x00+0x01+0x04)

Modbus-RTU

Modbus-RTUはRS-422,RS-485で通信するバイナリのメッセージです

送信メッセージ

ヘッダスレーブアドレスファンクションデータCRCフッタ
アドレス個数
(*1)0x010x030x00 0x000x00 0x020xC4 0x0B(*1)
1byte1byte2byte2byte2byte (*2)

受信メッセージ

ヘッダスレーブアドレスファンクション受信バイト数データ1 データ2CRCフッタ
上位下位上位下位
(*1)0x010x030x060x000x010x000x020x53 0xF2(*1)
1byte1111112
*1) 3.5文字分のサイレントインターバル(無通信時間)
*2) 下位バイトから先に送信

CRCの計算

CRC16の右シフト 初期値=0xFFFF 反転なしでよさそう・・・
計算はこのアプリで計算できます

Modbus-TCP

Modbus-TCPはEthernetで通信するバイナリのメッセージです

送信メッセージ

転送IDプロトコルID転送バイト数ユニットIDファンクションデータ
アドレス個数
0x00 0x000x00 0x000x00 0x060x010x030x00 0x000x00 0x02
2byte2byte2byte1byte1byte2byte2byte

受信メッセージ

転送IDプロトコルID転送バイト数ユニットIDファンクション
 
0x00 0x000x00 0x000x00 0x070x010x03
2byte 2byte2byte1byte1byte

受信バイト数データ1データ2
上位下位上位下位
0x040x000x010x000x02
1byte1byte1byte1byte1byte

ファンクション

一覧

ファンクション名称機能
01Read Coil Statusコイルの読出し
02Read Input Status入力ステータスの読出し
03Read Holding Register保持レジスタの読出し
04Read Input Register入力レジスタの読出し
05Force Single Coilコイルの書込み
06Preset Single Register保持レジスタの書込み
08Diagnostics通信の診断
11(0x0B)Fetch Communication Event Counter通信イベントカウンタ読出し
12(0x0C)Fetch Communication Event Log通信イベントログ読出し
15(0x0F)Force Multiple Coils連続した複数のコイルの書込み
16(0x10)Force Multiple Registers連続した複数のレジスタの書込み
17(0x11)Report Slave IDスレーブ情報読出し

アドレスについて
コイルのアドレスを指定するときに20番地を指定したい場合は20から1引いた19(0x13)を指定します
同様に入力ステータス、保持レジスタ、入力レジスタの指定も-1した数値で指定します

(01) Read Coil Status

コイル1から20個を読み出す例

送信メッセージ

ファンクションアドレス個数
0x010x00 0x000x00 0x14

受信メッセージ

ファンクション受信バイト数データ1-8データ9-16データ17-24
0x010x030x010x000x08

ビットの並び
データにはLSB(0ビット)から入り端数は0で埋められます
例)コイル0と20がONの場合 データ1-8は0x01 データ17-24は0x08

(02) Read Input Status

入力ステータス20から20個を読み出す例

送信メッセージ

ファンクションアドレス個数
0x020x00 0x130x00 0x14

受信メッセージ

ファンクション受信バイト数データ1-8データ9-16データ17-24
0x020x030x010x000x08

(03) Read Holding Register

保持レジスタ20から3個を読み出す例

送信メッセージ

ファンクションアドレス個数
0x030x00 0x130x00 0x03

受信メッセージ

ファンクション受信バイト数データ1データ2データ3
0x030x060x00 0x000x00 0x010x00 0x02

(04) Read Input Register

入力レジスタ20から3個を読み出す例

送信メッセージ

ファンクションアドレス個数
0x040x00 0x130x00 0x03

受信メッセージ

ファンクション受信バイト数データ1データ2データ3
0x040x060x00 0x000x00 0x010x00 0x02

(05) Force Single Coil

コイル20をONにする例

送信メッセージ

ファンクションアドレス個数
0x050x00 0x130xFF 0x00

受信メッセージ

ファンクションアドレスデータ
0x050x00 0x130xFF 0x00

データの指定方法
0x00 0x00 = OFF, 0xFF 0x00 = ON

(06) Preset Single Register

保持レジスタ20を0x1234にする例

送信メッセージ

ファンクションアドレスデータ
0x060x00 0x130x12 0x34

受信メッセージ

ファンクションアドレスデータ
0x060x00 0x130x12 0x34

(08) Diagnostics

エコーを返す例

送信メッセージ

ファンクション診断サブコードデータ
0x080x00 0x000x12 0x34

受信メッセージ

ファンクション診断サブコードデータ
0x080x00 0x000x12 0x34

診断サブコード

診断サブコードデータ機能
0x00 0x000x?? 0x??エコー
0x00 0x010x00 0x00初期化
0xFF 0x00イベントログも初期化
0x00 0x020x00 0x00診断レジスタの読出し
0x00 0x040x00 0x00リードオンリーモード
0x00 0x0A0x00 0x00カウンタと診断レジスタクリア
0x00 0x0B0x00 0x00メッセージ合計読出し
0x00 0x0C0x00 0x00CRCエラー数読出し
0x00 0x0D0x00 0x00例外レスポンス数読出し
0x00 0x0E0x00 0x00受信メッセージ数読出し
0x00 0x0F0x00 0x00レスポンスを返さなかったメッセージ数
0x00 0x110x00 0x00スレーブビジー例外レスポンス数
0x00 0x120x00 0x00キャラクタオーバーランカウンタ数

(11) Fetch Communication Event Counter

ステータスワードとイベントカウンタを読み出す例

送信メッセージ

ファンクション
0x0B

受信メッセージ

ファンクションステータスイベントカウンタ
0x0B0x00 0x000x12 0x34

(12) Fetch Communication Event Log

エコーを返す例

ファンクション
0x0C

受信メッセージ

ファンクションバイトカウントステータス
0x0C0x080x00 0x00
イベントカウンタメッセージカウンタイベント0イベント1
0x12 0x340x12 0x340x200x00

(15) Force Multiple Coils

コイル20から10個のコイルの値を変更する例
書込みデータ(20-29) = 1100 0000 01

ファンクションアドレス個数バイト数データ
0x0F0x00 0x130x00 0x0A0x020x03 0x02

データ部分のビットの並び
(20番)1100 0000 01(29番) → データ1byte目(27)0000 0011(20) 2byte目 (36)---- --10(28)

受信メッセージ

ファンクションアドレス個数
0x0F0x00 0x130x00 0x0A

(16) Preset Multiple Registers

保持レジスタ20から3個の値を変更する例
書込みデータ(20-22) = 0x0001 0x0002 0x0003

ファンクションアドレス個数バイト数データ1データ2データ3
0x100x00 0x130x00 0x030x060x00 0x010x00 0x020x00 0x03

受信メッセージ

ファンクションアドレス個数
0x100x00 0x130x00 0x03

(17) Report Slave ID

スレーブ情報を読み出す例

ファンクション
0x11

受信メッセージ

ファンクション以下はデバイスにより変わります
0x11...

異常レスポンス

受信メッセージ

(03) Read Holding Register実行時にアドレスが無かったとき
ファンクション異常コード
0x830x02

ファンクションの最上位ビット
異常時の受信データではファンクションの最上位ビットがONした値で返信されます

異常コード

異常コード名称
01不正ファンクション
02不正データアドレス
03不正データ

アプリケーション

comcom
comcom EtherntのSocket通信を使ってメッセージを送信するアプリケーションです

ModbusTcpMes
modbustcpmes64 ModbusTCPコマンドの作成支援と対応機器にコマンドを送信するアプリケーションです

この記事へのコメント