Modbusとは
Modbus(モドバス)は、Modicon社が同社のPLC(ピーエルシー:Programmable Logic Controller)向けに策定した通信プロトコルです。仕様が公開されていてかつ無料利用できることから、産業向け機器で幅広く使われるようになりました。特にRS-485上の通信プロトコルとしてよく利用されています。
ModbusにはRS-485などのシリアル通信向けと、TCP/IP向けがあります。本ページではシリアル通信向けについてのみ紹介します。
- Modbusは規格として組織的な運用をされていません。このためModbus対応と謳われている機器同士を接続しても、すんなりとは動かない恐れがあります。世の中のほとんどの機器はModbus準拠なのです。
- そんなこともありModbus仕様の詳細を掴みきれておらず、本ページ内の一部項目は空欄となっています。
用語・表記
項目 | 内容 |
---|---|
**h | 16進数表記を表します。 |
クライアント | メッセージを送信する機器です。 |
サーバー | クライアントからのメッセージを受け、対応する処理を行う機器です。 |
メッセージ | クライアントからサーバーに、サーバーからクライアントに返信する通信データです。 |
コイル | 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モードの送信データは次のとおりです。
Start | Address | Function | Data | LRC | End |
‘:’ | <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モードでの通信設定は下記が基本です。
- データ長:7ビット
- パリティー:偶数パリティー
- ストップビット長:1ビット
ただし、すべてのModbus対応機器がこの通信設定であるとは限りません。このため下記の範囲から選択できるようにしておくべきです。
- データ長:7ビット / 8ビット
- パリティー:なし / 偶数 / 奇数
- ストップビット長:1ビット / 2ビット
- データ長7ビット、パリティーなしの場合、ストップビット長は2ビットにすべきです。
- データ長8ビットまたはパリティーありの場合、ストップビット長は1ビットにすべきです。
LRC
LRC(Longitudinal Redundancy Check)は水平パリティーチェックと呼ばれるもので、メッセージが正しくやりとりされているかを簡易的に確認するために使用します。AddressからDataまでのデータを1バイトずつ加算していき、最後に2の補数を取った値となります。
メッセージを受けた機器は、受けたLRCと自身で計算したLRCが一致することを確認してからメッセージを処理してください。
「010203040506」の場合
合計は「01h + 02h + 03h + 04h + 05h + 06h = 15h」であり、この2の補数としてLRCは「(FFh – 15h) + 1 = EBh」です。結果、送信メッセージは「:010203040506EB<CR><LF>」となります。
RTUモード
RTUモードの送信データは次のとおりです。
無通信時間 | Address | Function | Data | CRC | 無通信時間 |
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モードでの通信設定は下記が基本です。
- データ長:8ビット
- パリティー:偶数パリティー
- ストップビット長:1ビット
ただし、すべてのModbus対応機器がこの通信設定であるとは限りません。このため下記の範囲から選択できるようにしておくべきです。
- パリティー:なし / 偶数 / 奇数
- ストップビット長:1ビット / 2ビット
- パリティーなしの場合は、ストップビット長を2ビットにすべきです。
- パリティーありの場合は、ストップビット長を1ビットにすべきです。
CRC
巡回冗長検査(じゅんかいじょうちょうけんさ、Cyclic Redundancy Check:CRC)は、メッセージが正しくやりとりされているかを確認するために使用します。確認精度はLRCより強固で、USBやBluetoothなどでも用いられています。計算条件は次のとおりです。
- 多項式:8005h
- 初期値:ffffh
- 出力XOR:0000h
- シフト方向:左
- 入力反転:あり
- 出力反転:あり
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 Inputs | 02 |
内部ビット または コイル | Read Coils | 01 | ||
Write Single Coil | 05 | |||
Write Multiple Coils | 0F | |||
16ビット アクセス | 入力レジスター | Read Input Register | 04 | |
内部レジスター または 出力レジスター | Read Holding Registers | 03 | ||
Write Single Register | 06 | |||
Write Multiple Registers | 10 | |||
Read/Write Multiple Registers | 17 | |||
Mask Write Register | 16 | |||
Read FIFO queue | 18 | |||
ファイルレコードアクセス | Read File record | 14 | ||
Write File record | 15 | |||
診断 | Read Exception status | 07 | ||
Diagnostic | 08 | |||
Get Com event counter | 0B | |||
Get Com Event Log | 0C | |||
Report Server ID | 11 | |||
Read device Identification | 2B | |||
その他 | Encapsulated Interface Transport | 2B |
- 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) | サブファンクション名 | 内容 |
---|---|---|
00 | Return Query Data | 通信テストを行います。 |
01 | Restart Communications Option | 再起動します。 |
02 | Return Diagnostic Register | 診断レジスターを読み出します。 |
03 | Change ASCII Input Delimiter | メッセージ最後の区切り文字を変更します。 |
04 | Force Listen Only Mode | 受信専用モードに切り替えます。 |
0A | Clear Counters and Diagnostic Register | カウンターと診断レジスターをクリアーします。 |
0B | Return Bus Message Count | メッセージカウントを読み出します。 |
0C | Return Bus Communication Error Count | CRCエラーカウントを読み出します。 |
0D | Return Bus Exception Error Count | 例外カウントを読み出します。 |
0E | Return Server Message Count | 当該サーバー向けのメッセージカウントを読み出します。 |
0F | Return Server No Response Count | 返信しなかったメッセージカウントを読み出します。 |
10 | Return Server NAK Count | 否定応答の例外カウントを読み出します。 |
11 | Return Server Busy Count | ビジー応答の例外カウントを読み出します。 |
12 | Return Bus Character Overrun Count | オーバーランエラーカウントを読み出します。 |
14 | Clear 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 | ||
イベント0 | 20 | ||
イベント1 | 00 |
イベントについて
イベントには2種類あります。イベントはビットフィールドとなっており、7ビットの状態によって分かれます。また今後、6ビットの状態によってさらに分岐していく可能性があります。
ビット | 内容 |
---|---|
0 | |
1 | 通信エラー |
2 | |
3 | |
4 | オーバーランエラー |
5 | 受信専用モードへ切り替え |
6 | ブロードキャストを受信 |
7 | 1 |
ビット | 内容 |
---|---|
0 | 読み取り例外を送信(例外コード1~3) |
1 | 障害例外を送信(例外コード4) |
2 | ビジー例外を送信(例外コード5~6) |
3 | 否定応答例外を送信(例外コード7) |
4 | 書き込みタイムアウト |
5 | 受信専用モード中 |
6 | 1 |
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 | パリティーエラー | メモリー内でパリティーエラーを検出しました。 |
参考文献
本家本元のサイトです。サイドメニューのTechnical Resourcesから[Modbus Specifications > I ACCEPTボタン]に移動すると、各種仕様のPDFファイルをダウンロードできます。すべて英語ですが。
Modbusについて検索すると上位に出てくるのが、こちらの解説書です。安心の日本語です。
ファイルの中では社名がエムシステムとなっていますが、2024年1月1日に社名を変更してエムジーとなっています。
コメント