MCプロトコルのエラーコード(終了コード)の読み方と対処:C059・C056・4031 など
MCプロトコル(SLMP)で PLC が返す終了コードの位置と読み方、よく出るエラーコード(C051、C056、C059、C05E、4031 など)の意味と対処を三菱電機のマニュアルをもとにまとめます。
更新
PLC からの応答電文には、応答データ長のすぐ後ろに2バイトの終了コードが入っています。0 なら正常終了です。0 以外ならエラーで、その値がエラーコードになります。
終了コードは応答データ長の直後にある
3E フレームの記事で見たとおり、応答電文はサブヘッダ、あて先の4項目、応答データ長、終了コードの順に並びます。バイナリでは下位バイトが先なので、エラーコード C051 は 51 C0 として届きます。ASCII では C051 の4文字です。
エラーのとき、終了コードの後ろには正常時のデータではなく、次の情報が続きます。
- エラーを返した局の情報(ネットワーク番号、PC 番号、要求先ユニット I/O 番号、要求先ユニット局番号)
- エラーになった要求のコマンドとサブコマンド
たとえば一括読出し(0401)の点数が多すぎて C051 が返った場合、応答電文は次のような形になります(バイナリ、自局あての例)。
D0 00 サブヘッダ 3E 応答00 ネットワーク番号 自局FF PC 番号 自局FF 03 I/O 番号 03FF00 局番号 0B 00 応答データ長 = 11 バイト51 C0 終了コード C05100 ネットワーク番号 FF PC 番号 FF 03 I/O 番号 00 局番号 01 04 コマンド 040100 00 サブコマンド エラー応答局の情報は、要求電文のあて先と違うことがあります。他局を経由してアクセスしたときに、途中の局がエラーを返した場合です。複数のエラーが同時に起きたときは、最初に検出したものが返ります。
よく出るエラーコード
MELSEC iQ-R の Ethernet ユーザーズマニュアルのエラーコード一覧から、電文を自作したりライブラリを使ったりするときによく出会うものを抜き出しました。
| コード | 意味 | 対処 |
|---|---|---|
C050 | ASCII 設定のときに、バイナリに変換できない文字を受け取った | 送信している文字を確認する |
C051 | ワード単位の読み書き点数が範囲外 | 点数を直す(一括読出しは 960 ワードまで) |
C052 | ビット単位の読み書き点数が範囲外 | 点数を直す |
C054 | ワード・ダブルワード単位のランダム読み書き点数が範囲外 | 点数を直す |
C056 | 最大アドレスを超える読み書き要求 | 先頭アドレスか点数を直す |
C058 | ASCII→バイナリ変換後の要求データ長がデータ数と合わない | 要求データ長を見直す |
C059 | コマンドやサブコマンドの誤り、または接続先が対応していない機能 | コマンドと、接続先が対応しているかを確認する |
C05C | 要求データの内容に誤り | 要求データを見直す |
C05E | 監視タイマの時間内に、アクセス先から応答がなかった | 監視タイマを長くする。アクセス先やネットワーク設定を確認する |
C061 | 要求データ長がデータ数と合わない | 要求データ長を見直す |
C0B2 | 受信・送信バッファに空きがない | 応答を待ってから次の要求を送る |
4031 | 指定したデバイス番号が範囲外、または CPU が対応していないデバイス | デバイス番号と、CPU のデバイス割付を確認する |
4031 は CPU ユニット側のエラーで、MELSEC iQ-R CPU ユニットのマニュアルに載っています。ここに挙げた C0xx の説明は iQ-R の Ethernet 搭載ユニットのものです。Q/L シリーズの Ethernet ユニットでは、コードの範囲や説明が異なる場合があるので、使っているユニットのマニュアルもあわせて確認してください。
迷ったときの切り分け
一覧を眺めても原因がわからないときは、コードの種類ごとに疑う場所が決まっています。
C059 が出たら、接続先がそのコマンドに対応しているかを疑います。 電文が正しくても、接続先が対応していなければこのエラーになります。たとえば複数ブロック一括読出し(0406)は、CPU ユニットの内蔵 Ethernet ポートでは使えないことがあります。サブコマンドの誤りでも出るので、iQ-R 用の 0002/0003 を Q シリーズに送っていないかも確認します。
C051〜C054 は点数、C056 と 4031 はアドレスの問題です。 一度に読める点数の上限を超えていないか、存在しないデバイス番号を指定していないかを見ます。PLC のパラメータでデバイスの点数を減らしている場合、既定の範囲内でも 4031 になります。
C05E は PLC が遅いか、あて先に届いていません。 監視タイマを延ばして直るなら、処理時間の問題です。直らなければ、ネットワーク番号や局番、ルーチングの設定を見直します。
長さ系(C058、C061)は電文の組み立てミスです。 要求データ長の数え始めが監視タイマからになっているか、ASCII なら文字数で数えているかを確認します。
リモートパスワードのエラー
PLC にリモートパスワードを設定している場合は、C2xx のエラーが返ることがあります。
| コード | 意味 | 対処 |
|---|---|---|
C200 | リモートパスワードが違う | パスワードを見直して、アンロック/ロックをやり直す |
C201 | 交信に使ったポートがロック状態 | アンロックしてから交信する |
C204 | アンロックを要求した機器と違う機器からロックを要求した | アンロックした機器からロックを要求する |
パスワードを設定したポートでは、交信を始める前にアンロック(コマンド 1630)、終わったらロック(1631)を送ります。
McpX でエラーコードを受け取る
McpX では、PLC がエラーコードを返すと McProtocolException が発生します。v0.11 からは ErrorCode プロパティでコードの値を取り出せるので、コードごとに処理を分けられます。
try
{
short[] d = mcpx.BatchRead<short>(Prefix.D, "0", 100);
}
catch (McProtocolException ex) when (ex.ErrorCode == 0x4031)
{
// デバイス番号が範囲外。PLC のデバイス割付を確認する
}
catch (McProtocolException ex) when (ex.ErrorCode == 0xC059)
{
// 接続先が未対応のコマンド
}出典
- MELSEC iQ-R Ethernetユーザーズマニュアル(応用編)(SH-081253)p.436〜443「エラーコード一覧」
- MELSEC iQ-R CPUユニットユーザーズマニュアル(応用編)(SH-081224)付1 p.841
- MELSECコミュニケーションプロトコルリファレンスマニュアル(SH-080003)p.41, 44
- SLMPリファレンスマニュアル(SH-080931)p.28