Modbus 例外コード(Exception Code)一覧と対処方法
Modbus TCP・Modbus RTUで返ってくる例外コード(Exception Code)の意味と、よくある原因・対処をまとめました。
応答のファンクションコードが 83 や 90 になって返ってきたときに確認してください。
例外応答の見方
相手の機器が要求を処理できないときは、例外応答が返ります。例外応答では、ファンクションコードに 80h を足した値(03 → 83、10 → 90)が返り、その後ろの1バイトが例外コードです。
例外コード一覧
| 例外コード | 名前 | 意味 | よくある原因と対処 |
|---|---|---|---|
| 01 | Illegal Function | 不正なファンクションコード | 相手の機器が対応していないファンクションコード。保持レジスタ(03)と入力レジスタ(04)の取り違えも多い原因です |
| 02 | Illegal Data Address | 不正なデータアドレス | アドレス、またはアドレス+個数が相手の範囲外。アドレスの1ずれ(40001番地=アドレス0)が最も多い原因です |
| 03 | Illegal Data Value | 不正なデータ値 | 個数が上限を超えている、値が許されない範囲。読出しの個数の上限(下表)を確認します |
| 04 | Server Device Failure | サーバー機器の異常 | 要求の処理中に、相手の機器で回復できない異常が起きた |
| 05 | Acknowledge | 受付済み(処理に時間がかかる) | 要求は受け付けたが、処理に時間がかかっている。後で完了を確認します |
| 06 | Server Device Busy | サーバー機器がビジー | 相手が別の処理中。時間をおいて再送します |
| 08 | Memory Parity Error | メモリのパリティエラー | ファイルレコードの読出し(20・21)で、相手のメモリにパリティエラーがあった |
| 0A | Gateway Path Unavailable | ゲートウェイの経路がない | ゲートウェイの設定誤りや過負荷で、転送先への経路を確保できない |
| 0B | Gateway Target Device Failed to Respond | ゲートウェイの先の機器が応答しない | ゲートウェイの先(RTU側)の機器が応答しない。ユニットIDや、RS-485側の配線・設定を確認します |
アドレスの1ずれに注意
機器のマニュアルで「40001」「30001」のように書かれている番地は、Modbusの電文ではアドレス 0 になります(40001 = 保持レジスタのアドレス0)。
マニュアルの番地をそのまま送ると1つずれて、範囲の最後で 02(Illegal Data Address)になったり、違うレジスタを読んだりします。
個数の上限
| ファンクションコード | 内容 | 上限 |
|---|---|---|
| 01 / 02 | コイル・入力ステータスの読出し | 2000点 |
| 03 / 04 | 保持レジスタ・入力レジスタの読出し | 125ワード |
| 0F(15) | 複数コイルの書込み | 1968点 |
| 10(16) | 複数レジスタの書込み | 123ワード |
機器によっては、これより少ない個数しか扱えないものもあります。上限を超えると 03(Illegal Data Value)が返ります。
ModbusTcpMes2026で応答の意味をすぐ確認
Modbus TCPの通信試験ツールです。Free版でModbusコマンドの送信と応答の確認ができます。
- Pro版は例外コードの意味とレジスタの値を自動で表示
- Pro版のサーバー機能で、PCを仮想メモリを持つModbus TCPサーバーにして試験
- コマンドリストの連続実行とOK/NG判定(Pro版)
応答が返ってこないとき
例外応答も返らずにタイムアウトになるときは、要求が相手に届いていないか、相手が処理できない電文になっています。
- ポート番号(通常は502)と、IPアドレスが合っているか
- ユニットID。ゲートウェイの先の機器では、RTU側のスレーブアドレスに合わせます。直接つなぐ機器では1や255(FFh)を指定するものが多いです
- MBAPヘッダの長さ(Length)が、ユニットID以降のバイト数と合っているか
- 相手の機器の同時接続数の上限を超えていないか(前の接続を閉じずに接続し直していないか)
よくある質問
Modbusの応答のファンクションコードが83になるのはなぜですか?
例外応答です。要求のファンクションコード(03)に80hを足した83が返り、その後ろの1バイトが例外コードです。例外コードで原因が分かります。
例外コード02(Illegal Data Address)の対処方法は?
アドレス、またはアドレス+個数が相手の範囲を超えています。最も多い原因はアドレスの1ずれで、マニュアルの40001番地は電文ではアドレス0になります。
Modbusで1回に読める保持レジスタの数は?
Modbusの仕様では、保持レジスタ・入力レジスタの読出しは1回125ワードまでです。機器によってはこれより少ないこともあります。
※例外コードの意味は、Modbus Organizationの「MODBUS Application Protocol Specification」に基づいています。実際に返る例外コードは機器によって異なる場合があります。
