Modbusはメーカー毎に仕様に差異がある

目次

はじめに

Modbus(モドバス)は、Modicon社が同社のPLC(ピーエルシー:Programmable Logic Controller)向けに策定した通信プロトコルです。仕様が公開されていてかつ無料利用できることから、産業向け機器で幅広く使われるようになりました。特にRS-485上の通信プロトコルとしてよく利用されています。

ModbusにはRS-485などのシリアル通信向けと、TCP/IP向けがあります。本ページではシリアル通信向けについてのみ紹介します。

  • Modbusは規格として組織的な運用をされていません。このためModbus対応と謳われている機器同士を接続しても、すんなりとは動かない恐れがあります。世の中のほとんどの機器はModbus準拠なのです。
  • そんなこともありModbus仕様の詳細を掴みきれておらず、本ページ内の一部項目は空欄となっています。

用語・表記

項目内容
**h16進数表記を表します。
クライアントメッセージを送信する機器です。
サーバークライアントからのメッセージを受け、対応する処理を行う機器です。
メッセージクライアントからサーバーに、サーバーからクライアントに返信する通信データです。
コイルOn/Off制御により、状態やモードを切り替えるスイッチのようなものを表します。
入力レジスター読み出し専用のレジスターです。
保持レジスター読み書き可能なレジスターです。
FIFO先入れ先出し(First In, First Out)を表します。キューの動作原理を表す言葉で、キューにデータを入れることをエンキュー、データを取り出すことをデキューといいます。
受信専用モードListen Only Modeです。受信のみを行い、クライアントへの返信を行いません。

通信プロトコル

Modbusにはシリアル通信向けのModbus RTU、Modbus ASCIIと、TCP/IP向けのModbus TCPがあります。

Modbus RTU

RTUはRemote Telemetry Unitの略で、訳すと遠隔監視制御装置などになります。RTUモードと呼ぶのはいま一つパッとしない、むしろバイナリーモードというべきModbusの基本的な通信モードです。
1バイトのバイナリーデータを、そのまま送受信します。シリアル通信向けとして幅広く使用されています。

Modbus ASCII

バイナリー通信が困難な場合に用いられる通信モードで、1バイトのデータを上位ビットと下位ビットに分け、2文字のASCIIとして送受信します。
RTUモードと比較してデータ量が2倍になるのがデメリットですが、通信データを確認しやすいことや、他の通信プロトコルと競合を起こしにくいというメリットはあります。

Modbus TCP/IP

TCP/IP上でModbus通信を行うためのプロトコルです。本ページではこれ以上紹介しません。

ASCIIモード

ASCIIモードの送信データは次のとおりです。

スクロールできます
StartAddressFunctionDataLRCEnd
‘:’<CR><LF>
1バイト2バイト2バイト2×Nバイト(※1)2バイト2バイト

※1:Nの最大は252です。

ASCIIモードでは「: (3Ah)」で始まり、「<CR><LF> (0D0Ah)」で終わります。その間に許されるのは「’0’~’9′ (30h~39h)」と「’A’~’F’ (41h~46h)」のみです。

通信設定

ASCIIモードでの通信設定は下記が基本です。

  1. データ長:7ビット
  2. パリティー:偶数パリティー
  3. ストップビット長:1ビット

ただし、すべてのModbus対応機器がこの通信設定であるとは限りません。このため下記の範囲から選択できるようにしておくべきです。

  1. データ長:7ビット / 8ビット
  2. パリティー:なし / 偶数 / 奇数
  3. ストップビット長:1ビット / 2ビット
  • データ長7ビット、パリティーなしの場合、ストップビット長は2ビットにすべきです。
  • データ長8ビットまたはパリティーありの場合、ストップビット長は1ビットにすべきです。

LRC

LRC(Longitudinal Redundancy Check)は水平パリティーチェックと呼ばれるもので、メッセージが正しくやりとりされているかを簡易的に確認するために使用します。AddressからDataまでのデータを1バイトずつ加算していき、最後に2の補数を取った値となります。

メッセージを受けた機器は、受けたLRCと自身で計算したLRCが一致することを確認してからメッセージを処理してください。

LRCの計算例

「010203040506」の場合

合計は「01h + 02h + 03h + 04h + 05h + 06h = 15h」であり、この2の補数としてLRCは「(FFh – 15h) + 1 = EBh」です。結果、送信メッセージは「:010203040506EB<CR><LF>」となります。

RTUモード

RTUモードの送信データは次のとおりです。

スクロールできます
無通信時間AddressFunctionDataCRC無通信時間
3.5バイト1バイト1バイトNバイト(※1)2バイト3.5バイト

※1:Nの最大は252です。

ASCIIモードと違い、開始文字や終了文字はありません。一定時間(3.5バイト分)無通信状態が続くと、そこでメッセージの終わりを表します。また一定時間無通信状態が続いたあとに受けた1バイト目のデータが、Addressとなります。なお無通信時間のことを「T1-T2-T3-T4」と表すこともよくありますが、この意味は調べてもわかりませんでした。

またRTUモードの全データは、一気に送信しきる必要があります。バイト間に1.5バイト分の無通信状態が続くと、そこで受信側は異常を検知してそれまで受信したデータを破棄します。

無通信時間の計算例

19200bpsの場合の無通信時間

(スタートビット + データ長 + パリティー + ストップビット長) / 伝送速度×3.5
= (1+8+1+1)/19200×3.5 = 2ms

通信設定

RTUモードでの通信設定は下記が基本です。

  1. データ長:8ビット
  2. パリティー:偶数パリティー
  3. ストップビット長:1ビット

ただし、すべてのModbus対応機器がこの通信設定であるとは限りません。このため下記の範囲から選択できるようにしておくべきです。

  1. パリティー:なし / 偶数 / 奇数
  2. ストップビット長:1ビット / 2ビット
  • パリティーなしの場合は、ストップビット長を2ビットにすべきです。
  • パリティーありの場合は、ストップビット長を1ビットにすべきです。

CRC

巡回冗長検査(じゅんかいじょうちょうけんさ、Cyclic Redundancy Check:CRC)は、メッセージが正しくやりとりされているかを確認するために使用します。確認精度はLRCより強固で、USBやBluetoothなどでも用いられています。計算条件は次のとおりです。

  1. 多項式:8005h
  2. 初期値:ffffh
  3. 出力XOR:0000h
  4. シフト方向:左
  5. 入力反転:あり
  6. 出力反転:あり

CRCの演算方法については、下記ページを参照ください。

メッセージを受けた機器は、受けたCRCと自身で計算したCRCが一致することを確認してからメッセージを処理してください。

CRCの計算例

「010203040506h」の場合

CRCはDDBAhです。CRCは下位バイトから送信するため、送信メッセージは「01h 02h 03h 04h 05h 06h BAh DDh」となります。

共通項目

Address

通信を行うサーバー機器のアドレスを1~247で指定します。つまりModbusの通信網に接続できるサーバー台数は、247台が上限であることを表しています。(なぜ247という中途半端な値なのかはわからず…)

なおアドレス0はブロードキャストの用途に使用します。ブロードキャストとは通信網に接続している、すべてのサーバーに対してメッセージを送信するものです。この場合、サーバー側はメッセージを受けて処理を実行するのみで、クライアントに対して返信は行いません。したがって、サーバーからの返信を必要とする読み出し系のファンクションには、ブロードキャスト通信は使えません。

Function

サーバー機器に対して行う指令(ファンクションコード)です。クライアントからサーバーに送信するファンクションコードは1~127(7Fh)です。MSB(80h)はサーバーからの例外返信に使用されます。詳細は次項の「ファンクションコード」を参照ください。

Data

ファンクションコードに対応したデータを送信します。データは可変長で、データがないということもあります。なおデータについてはビッグエンディアンで送信します。

しかしデータフォーマットについても、メーカーによるところがあります。特に問題になりがちなのは32ビット以上のデータの取り扱いです。Modbusでは特に規定がないことから、メーカー毎に仕様が異なる可能性がとても高いものとなります。このためもしModbus機器を開発する側に立つときは、下図のようにフォーマットを図で示すと良いでしょう。

  • 上図は上位バイトから順にアドレスに配置していますが、逆順も想定しておくべきです。

ファンクションコード

スクロールできます
ファンクションタイプファンクション名コード
(Hex)
データ
アクセス
ビット
アクセス
デジタル信号入力Read Discrete Inputs02
内部ビット
または
コイル
Read Coils01
Write Single Coil05
Write Multiple Coils0F
16ビット
アクセス
入力レジスターRead Input Register04
内部レジスター
または
出力レジスター
Read Holding Registers03
Write Single Register06
Write Multiple Registers10
Read/Write Multiple Registers17
Mask Write Register16
Read FIFO queue18
ファイルレコードアクセスRead File record14
Write File record15
診断Read Exception status07
Diagnostic08
Get Com event counter0B
Get Com Event Log0C
Report Server ID11
Read device Identification2B
その他Encapsulated Interface Transport2B
ファンクションリスト
  • Modbusで扱えるのは16ビットデータまでです。32ビット以上のデータを扱うためには、2つ以上のレジスター枠を用いる必要があります。
  • メッセージでやり取りする開始アドレスは、実「アドレス – 1」となります。

Read Coils (01h)

サーバーの連続したデジタル出力(On/Off)情報を読み出します。

返信のコイル情報はLSBから順に並びます。アドレス0から10ビット分のコイル情報を取得するとします。このときコイル情報が順に「0 1 1 1 0 0 1 0 1 1」とすると、返信データは「4Eh 03h」となります。

スクロールできます
フィールド名サイズ範囲
ファンクションコード1バイト01h
読み出し開始アドレス2バイト0~65535
読み出し数2バイト1~2000
クライアントからサーバーへの送信データ
スクロールできます
フィールド名サイズ範囲
ファンクションコード1バイト01h
データ数1バイトN(※1)
コイル情報Nバイトビット毎:1=On / 0=Off
サーバーからクライアントへの返信データ

※1:N=読み出し数/8。余りが0でないとき、N=N+1。

スクロールできます
フィールド名サイズ範囲
ファンクションコード1バイト81h
例外コード1バイト1 or 2 or 3 or 4
サーバーからのエラー応答
スクロールできます
送信返信
フィールド名(Hex)フィールド名(Hex)
ファンクションコード01ファンクションコード01
読み出し開始アドレス (H)00データ数03
読み出し開始アドレス (L)13コイル情報 [27 – 20]CD
読み出し数 (H)00コイル情報 [35 – 28]6B
読み出し数 (L)13コイル情報 [38 – 36]05
通信例

Read Discrete Inputs (02h)

サーバーのデジタル入力(On/Off)情報を読み出します。使用方法は「Read Coils (01h)」と同じです。

Read Holding Registers (03h)

サーバーの保持レジスターの値を読み出します。

スクロールできます
フィールド名サイズ範囲
ファンクションコード1バイト03h
読み出し開始アドレス2バイト0~65535
読み出し数2バイト1~125
クライアントからサーバーへの送信データ
スクロールできます
フィールド名サイズ範囲
ファンクションコード1バイト03h
データ数1バイト2×N(※1)
レジスター値2×Nバイト0000h~FFFFh
サーバーからクライアントへの返信データ

※1:N=読み出し数。

スクロールできます
フィールド名サイズ範囲
ファンクションコード1バイト83h
例外コード1バイト1 or 2 or 3 or 4
サーバーからのエラー応答
スクロールできます
送信返信
フィールド名(Hex)フィールド名(Hex)
ファンクションコード03ファンクションコード03
読み出し開始アドレス (H)00データ数06
読み出し開始アドレス (L)6Bレジスター値 [108 (H)]02
読み出し数 (H)00レジスター値 [108 (L)]2B
読み出し数 (L)03レジスター値 [109 (H)]00
レジスター値 [109 (L)]00
レジスター値 [110 (H)]00
レジスター値 [110 (L)]64
通信例

Read Input Registers (04h)

サーバーの入力レジスターの値を読み出します。使用方法は「Read Holding Registers (03h)」と同じです。

Write Single Coil (05h)

サーバーのデジタル出力(On/Off)情報に書き込みます。

スクロールできます
フィールド名サイズ範囲
ファンクションコード1バイト05h
書き込み開始アドレス2バイト0~65535
書き込み数2バイトFF00h = On / 0000h = Off
クライアントからサーバーへの送信データ
スクロールできます
フィールド名サイズ範囲
ファンクションコード1バイト05h
書き込み開始アドレス2バイト受けた値
コイル情報2バイト受けた値
サーバーからクライアントへの返信データ
スクロールできます
フィールド名サイズ範囲
ファンクションコード1バイト85h
例外コード1バイト1 or 2 or 3 or 4
サーバーからのエラー応答
スクロールできます
送信返信
フィールド名(Hex)フィールド名(Hex)
ファンクションコード05ファンクションコード05
書き込み開始アドレス (H)00書き込み開始アドレス (H)00
書き込み開始アドレス (L)AC書き込み開始アドレス (L)AC
コイル情報 (H)FFコイル情報 (H)FF
コイル情報 (L)00コイル情報 (L)00
通信例

Write Single Register (06h)

サーバーの保持レジスターに書き込みます。

スクロールできます
フィールド名サイズ範囲
ファンクションコード1バイト06h
書き込み開始アドレス2バイト0~65535
書き込み数2バイト0000h~FFFFh
クライアントからサーバーへの送信データ
スクロールできます
フィールド名サイズ範囲
ファンクションコード1バイト06h
書き込み開始アドレス2バイト受けた値
レジスター値2バイト受けた値
サーバーからクライアントへの返信データ
スクロールできます
フィールド名サイズ範囲
ファンクションコード1バイト86h
例外コード1バイト1 or 2 or 3 or 4
サーバーからのエラー応答
スクロールできます
送信返信
フィールド名(Hex)フィールド名(Hex)
ファンクションコード06ファンクションコード06
書き込み開始アドレス (H)00書き込み開始アドレス (H)00
書き込み開始アドレス (L)01書き込み開始アドレス (L)01
レジスター値 (H)00レジスター値 (H)00
レジスター値 (L)03レジスター値 (L)03
通信例

Read Exception Status (07h)

8個の例外ステータスの内容を読み出します。詳細な用途は不明です。

スクロールできます
フィールド名サイズ範囲
ファンクションコード1バイト07h
クライアントからサーバーへの送信データ
スクロールできます
フィールド名サイズ範囲
ファンクションコード1バイト07h
例外ステータス1バイト00h~FFh
サーバーからクライアントへの返信データ
スクロールできます
フィールド名サイズ範囲
ファンクションコード1バイト87h
例外コード1バイト1 or 4
サーバーからのエラー応答
スクロールできます
送信返信
フィールド名(Hex)フィールド名(Hex)
ファンクションコード07ファンクションコード07
例外ステータス6D
通信例

Diagnostics (08h)

クライアントとサーバー間の通信状態や、サーバーのエラー状態を確認します。本ファンクションにはさらにサブファンクションがあり、実行するテストの内容を指定します。

スクロールできます
コード
(Hex)
サブファンクション名内容
00Return Query Data通信テストを行います。
01Restart Communications Option再起動します。
02Return Diagnostic Register診断レジスターを読み出します。
03Change ASCII Input Delimiterメッセージ最後の区切り文字を変更します。
04Force Listen Only Mode受信専用モードに切り替えます。
0AClear Counters and Diagnostic Registerカウンターと診断レジスターをクリアーします。
0BReturn Bus Message Countメッセージカウントを読み出します。
0CReturn Bus Communication Error CountCRCエラーカウントを読み出します。
0DReturn Bus Exception Error Count例外カウントを読み出します。
0EReturn Server Message Count当該サーバー向けのメッセージカウントを読み出します。
0FReturn Server No Response Count返信しなかったメッセージカウントを読み出します。
10Return Server NAK Count否定応答の例外カウントを読み出します。
11Return Server Busy Countビジー応答の例外カウントを読み出します。
12Return Bus Character Overrun Countオーバーランエラーカウントを読み出します。
14Clear Overrun Counter and Flagオーバーランエラーカウントをクリアーします。
サブファンクションリスト

Return Query Data (00h)

サーバーから返信があるかを確認することで、通信に問題がないことを確認します。

スクロールできます
フィールド名サイズ範囲
ファンクションコード1バイト08h
サブファンクションコード2バイト0000h
データ2バイト0000h~FFFFh
クライアントからサーバーへの送信データ
スクロールできます
フィールド名サイズ範囲
ファンクションコード1バイト08h
サブファンクションコード2バイト0000h
データ2バイト受けた値
サーバーからクライアントへの返信データ

Restart Communications Option (01h)

サーバーのシリアルポートを初期化するため再起動します。受信専用モードの場合は返信しません。
本サブファンクションは受信専用モードを解除する唯一の方法です。

スクロールできます
フィールド名サイズ範囲
ファンクションコード1バイト08h
サブファンクションコード2バイト0001h
データ2バイトFF00h = ログをクリアーする
0000h = ログをクリアーしない
クライアントからサーバーへの送信データ
スクロールできます
フィールド名サイズ範囲
ファンクションコード1バイト08h
サブファンクションコード2バイト0001h
データ2バイト受けた値
サーバーからクライアントへの返信データ

Return Diagnostic Register (02h)

サーバーのもつ診断レジスターを読み出します。

スクロールできます
フィールド名サイズ範囲
ファンクションコード1バイト08h
サブファンクションコード2バイト0002h
データ2バイト0000h
クライアントからサーバーへの送信データ
スクロールできます
フィールド名サイズ範囲
ファンクションコード1バイト08h
サブファンクションコード2バイト0002h
データ2バイト診断レジスター値
サーバーからクライアントへの返信データ

Change ASCII Input Delimiter (03h)

ASCIIモードにおけるメッセージ最後の区切り文字「<LF>」を別の文字に置き換えます。

スクロールできます
フィールド名サイズ範囲
ファンクションコード1バイト08h
サブファンクションコード2バイト0003h
データ2バイトCHAR(※1) 00h
クライアントからサーバーへの送信データ

※1:CHARには0~127の文字データを格納します。

スクロールできます
フィールド名サイズ範囲
ファンクションコード1バイト08h
サブファンクションコード2バイト0003h
データ2バイト受けた値
サーバーからクライアントへの返信データ

Force Listen Only Mode (04h)

サーバーを受信専用モードに切り替えます。本サブファンクションにサーバーは返信しません。またこれ以降、すべてのメッセージに対してサーバーは返信しなくなります。受信専用モードを解除するには「Restart Communications Option (01h)」を実行してください。

スクロールできます
フィールド名サイズ範囲
ファンクションコード1バイト08h
サブファンクションコード2バイト0004h
データ2バイト0000h
クライアントからサーバーへの送信データ

Clear Counters and Diagnostic Register (0Ah)

カウンターと診断レジスターをクリアーします。なおカウンターは電源投入時もクリアーします。

スクロールできます
フィールド名サイズ範囲
ファンクションコード1バイト08h
サブファンクションコード2バイト000Ah
データ2バイト0000h
クライアントからサーバーへの送信データ
スクロールできます
フィールド名サイズ範囲
ファンクションコード1バイト08h
サブファンクションコード2バイト000Ah
データ2バイト0000h
サーバーからクライアントへの返信データ

Return Bus Message Count (0Bh)

サーバーが検出したメッセージカウントを読み出します。本カウントは電源投入、再起動、カウンタークリアーによってリセットされます。

スクロールできます
フィールド名サイズ範囲
ファンクションコード1バイト08h
サブファンクションコード2バイト000Bh
データ2バイト0000h
クライアントからサーバーへの送信データ
スクロールできます
フィールド名サイズ範囲
ファンクションコード1バイト08h
サブファンクションコード2バイト000Bh
データ2バイトカウント値
サーバーからクライアントへの返信データ

Return Bus Communication Error Count (0Ch)

サーバーが検出したCRCエラーカウントを読み出します。本カウントは電源投入、再起動、カウンタークリアーによってリセットされます。使用方法は「Return Bus Message Count (0Bh)」と同じです。

Return Bus Exception Error Count (0Dh)

サーバーが検出した例外カウントを読み出します。本カウントは電源投入、再起動、カウンタークリアーによってリセットされます。使用方法は「Return Bus Message Count (0Bh)」と同じです。

Return Server Message Count (0Eh)

サーバーが検出した、当該サーバー向けのメッセージカウントを読み出します。本カウントは電源投入、再起動、カウンタークリアーによってリセットされます。使用方法は「Return Bus Message Count (0Bh)」と同じです。

Return Server No Response Count (0Fh)

サーバーが検出した、当該サーバー向けのメッセージのうち、返信しなかったメッセージカウントを読み出します。本カウントは電源投入、再起動、カウンタークリアーによってリセットされます。使用方法は「Return Bus Message Count (0Bh)」と同じです。

Return Server NAK Count (10h)

サーバーが検出した否定応答の例外カウントを読み出します。本カウントは電源投入、再起動、カウンタークリアーによってリセットされます。使用方法は「Return Bus Message Count (0Bh)」と同じです。

Return Server Busy Count (11h)

サーバーが検出したビジー応答の例外カウントを読み出します。本カウントは電源投入、再起動、カウンタークリアーによってリセットされます。使用方法は「Return Bus Message Count (0Bh)」と同じです。

Return Bus Character Overrun Count (12h)

サーバーが検出したオーバーランエラーカウントを読み出します。本カウントは電源投入、再起動、カウンタークリアーによってリセットされます。使用方法は「Return Bus Message Count (0Bh)」と同じです。

Clear Overrun Counter and Flag (14h)

オーバーランエラーカウントをクリアーし、エラーフラグをリセットします。

スクロールできます
フィールド名サイズ範囲
ファンクションコード1バイト08h
サブファンクションコード2バイト0014h
データ2バイト0000h
クライアントからサーバーへの送信データ
スクロールできます
フィールド名サイズ範囲
ファンクションコード1バイト08h
サブファンクションコード2バイト0014h
データ2バイト0000h
サーバーからクライアントへの返信データ

Get Com Event Counter (0Bh)

サーバーからステータスとイベントカウントを読み出します。 一連のメッセージの前後で本カウントを読み出すことで、サーバーが正常にメッセージを処理したかを確認できます。本カウントは「Restart Communications Option (01h)」や「Clear Counters and Diagnostic Register (0Ah)」でリセットできます。

スクロールできます
フィールド名サイズ範囲
ファンクションコード1バイト0Bh
クライアントからサーバーへの送信データ
スクロールできます
フィールド名サイズ範囲
ファンクションコード1バイト0Bh
ステータス2バイト0000h~FFFFh
イベントカウント2バイト0~65535
サーバーからクライアントへの返信データ
スクロールできます
フィールド名サイズ範囲
ファンクションコード1バイト8Bh
例外コード1バイト1 or 4
サーバーからのエラー応答
スクロールできます
送信返信
フィールド名(Hex)フィールド名(Hex)
ファンクションコード0Bファンクションコード0B
ステータス (H)FF
ステータス (L)FF
イベントカウント (H)01
イベントカウント (L)08
通信例

Get Com Event Log (0Ch)

サーバーからステータス、イベントカウント、メッセージカウントおよびイベントを読み出します。ステータスとイベントカウントは「Get Com Event Counter (0Bh)」と同じ値です。メッセージカウントは「Return Bus Message Count (0Bh)」と同じ値です。
イベントは0~64バイトで時系列順に格納しており、イベント0が最新となります。

スクロールできます
フィールド名サイズ範囲
ファンクションコード1バイト0Ch
クライアントからサーバーへの送信データ
スクロールできます
フィールド名サイズ範囲
ファンクションコード1バイト0Ch
データ数1バイトN(※1)
ステータス2バイト0000h~FFFFh
イベントカウント2バイト0~65535
メッセージカウント2バイト0~65535
イベント(N – 6)バイト(次の項を参照)
サーバーからクライアントへの返信データ

※1:N = イベント数+3×2

スクロールできます
フィールド名サイズ範囲
ファンクションコード1バイト8Ch
例外コード1バイト1 or 4
サーバーからのエラー応答
スクロールできます
送信返信
フィールド名(Hex)フィールド名(Hex)
ファンクションコード0Cファンクションコード0C
データ数08
ステータス (H)00
ステータス (L)00
イベントカウント (H)01
イベントカウント (L)08
メッセージカウント (H)01
メッセージカウント (L)21
イベント020
イベント100
通信例

イベントについて

イベントには2種類あります。イベントはビットフィールドとなっており、7ビットの状態によって分かれます。また今後、6ビットの状態によってさらに分岐していく可能性があります。

ビット内容
0
1通信エラー
2
3
4オーバーランエラー
5受信専用モードへ切り替え
6ブロードキャストを受信
71
受信イベント(7ビット = 1)
ビット内容
0読み取り例外を送信(例外コード1~3)
1障害例外を送信(例外コード4)
2ビジー例外を送信(例外コード5~6)
3否定応答例外を送信(例外コード7)
4書き込みタイムアウト
5受信専用モード中
61
70
送信イベント(7ビット = 0)

Write Multiple Coils (0Fh)

サーバーの連続したデジタル出力(On/Off)情報に書き込みます。 書き込むコイル情報はLSBから順に並びます。アドレス0から10ビット分のコイル情報を書き込みするとします。このときコイル情報が順に「0 1 1 1 0 0 1 0 1 1」とすると、「4Eh 03h」となります。

スクロールできます
フィールド名サイズ範囲
ファンクションコード1バイト0Fh
書き込み開始アドレス2バイト0~65535
書き込み数2バイト1~1968
データ数1バイトN(※1)
コイル情報Nバイトビット毎:1 = On / 0 = Off
クライアントからサーバーへの送信データ

※1:N=書き込み数/8。余りが0でないとき、N=N+1。

スクロールできます
フィールド名サイズ範囲
ファンクションコード1バイト0Fh
書き込み開始アドレス2バイト受けた値
書き込み数2バイト受けた値
サーバーからクライアントへの返信データ
スクロールできます
フィールド名サイズ範囲
ファンクションコード1バイト8Fh
例外コード1バイト1 or 2 or 3 or 4
サーバーからのエラー応答
スクロールできます
送信返信
フィールド名(Hex)フィールド名(Hex)
ファンクションコード0Fファンクションコード0F
書き込み開始アドレス (H)00書き込み開始アドレス (H)00
書き込み開始アドレス (L)13書き込み開始アドレス (L)13
書き込み数 (H)00書き込み数 (H)00
書き込み数 (L)0A書き込み数 (L)0A
データ数02
コイル情報 [27 – 20]CD
コイル情報 [29 – 28]01
通信例

Write Multiple registers (10h)

サーバーの連続したレジスターに書き込みます。

スクロールできます
フィールド名サイズ範囲
ファンクションコード1バイト10h
書き込み開始アドレス2バイト0~65535
書き込み数2バイト1~123
データ数1バイト2×N(※1)
レジスター値2×Nバイト0000h~FFFFh
クライアントからサーバーへの送信データ

※1:N=書き込み数。

スクロールできます
フィールド名サイズ範囲
ファンクションコード1バイト10h
書き込み開始アドレス2バイト受けた値
書き込み数2バイト受けた値
サーバーからクライアントへの返信データ
スクロールできます
フィールド名サイズ範囲
ファンクションコード1バイト90h
例外コード1バイト1 or 2 or 3 or 4
サーバーからのエラー応答
スクロールできます
送信返信
フィールド名(Hex)フィールド名(Hex)
ファンクションコード10ファンクションコード10
書き込み開始アドレス (H)00書き込み開始アドレス (H)00
書き込み開始アドレス (L)01書き込み開始アドレス (L)01
書き込み数 (H)00書き込み数 (H)00
書き込み数 (L)02書き込み数 (L)02
データ数04
レジスター値0 (H)00
レジスター値0 (L)0A
レジスター値1 (H)01
レジスター値1 (L)02
通信例

Report Server ID (11h)

Read File Record (14h)

Write File Record (15h)

Mask Write Register (16h)

Read/Write Multiple registers (17h)

サーバーから保持レスターの読み出しと書き込みを同時に行います。書き込み処理は読み出し処理の前に実行します。

スクロールできます
フィールド名サイズ範囲
ファンクションコード1バイト17h
読み出し開始アドレス2バイト0~65535
読み出し数2バイト1~125
書き込み開始アドレス2バイト0~65535
書き込み数2バイト1~121
データ数1バイト2×N(※1)
レジスター値2×Nバイト0000h~FFFFh
クライアントからサーバーへの送信データ

※1:N = 書き込み数

スクロールできます
フィールド名サイズ範囲
ファンクションコード1バイト17h
データ数2バイト2×n(※1)
レジスター値2×nバイト受けた値
サーバーからクライアントへの返信データ

※1:n = 読み出し数

スクロールできます
フィールド名サイズ範囲
ファンクションコード1バイト97h
例外コード1バイト1 or 2 or 3 or 4
サーバーからのエラー応答
スクロールできます
送信返信
フィールド名(Hex)フィールド名(Hex)
ファンクションコード17ファンクションコード17
読み出し開始アドレス (H)00データ数0C
読み出し開始アドレス (L)03レジスター値0 (H)00
読み出し数 (H)00レジスター値0 (L)FE
読み出し数 (L)06レジスター値1 (H)0A
書き込み開始アドレス (H)00レジスター値1 (L)CD
書き込み開始アドレス (L)0Eレジスター値2 (H)00
書き込み数 (H)00レジスター値2 (L)01
書き込み数 (L)03レジスター値3 (H)00
データ数06レジスター値3 (L)03
レジスター値0 (H)00レジスター値4 (H)00
レジスター値0 (L)FFレジスター値4 (L)0D
レジスター値1 (H)00レジスター値5 (H)00
レジスター値1 (L)FFレジスター値5 (L)FF
レジスター値2 (H)00
レジスター値2 (L)FF
通信例

Read FIFO Queue (18h)

例外コード

スクロールできます
コード内容詳細
1不正な機能サポートしていないファンクションコードです。
2不正なアドレスアドレスが範囲外です。
3不正な値データが範囲外です。
4障害読み出しや書き込みに失敗しました。
5肯定応答処理中です。
6ビジー処理中です。
7否定応答処理を実行できません。診断機能を使って状態を確認してください。
8パリティーエラーメモリー内でパリティーエラーを検出しました。

参考文献

Modbus

本家本元のサイトです。サイドメニューのTechnical Resourcesから[Modbus Specifications > I ACCEPTボタン]に移動すると、各種仕様のPDFファイルをダウンロードできます。すべて英語ですが。

株式会社エムジー

Modbusについて検索すると上位に出てくるのが、こちらの解説書です。安心の日本語です。

ファイルの中では社名がエムシステムとなっていますが、2024年1月1日に社名を変更してエムジーとなっています。

コメント

コメントする

CAPTCHA


目次