// LEARN · MCプロトコル入門

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 が返った場合、応答電文は次のような形になります(バイナリ、自局あての例)。

エラー応答(バイナリ) 20 バイト
D0 00 サブヘッダ 3E 応答
あて先(要求と同じ)
00 ネットワーク番号 自局
FF PC 番号 自局
FF 03 I/O 番号 03FF
00 局番号
0B 00 応答データ長 = 11 バイト
51 C0 終了コード C051
エラー応答局
00 ネットワーク番号
FF PC 番号
FF 03 I/O 番号
00 局番号
エラーになった要求
01 04 コマンド 0401
00 00 サブコマンド

エラー応答局の情報は、要求電文のあて先と違うことがあります。他局を経由してアクセスしたときに、途中の局がエラーを返した場合です。複数のエラーが同時に起きたときは、最初に検出したものが返ります。

よく出るエラーコード

MELSEC iQ-R の Ethernet ユーザーズマニュアルのエラーコード一覧から、電文を自作したりライブラリを使ったりするときによく出会うものを抜き出しました。

コード意味対処
C050ASCII 設定のときに、バイナリに変換できない文字を受け取った送信している文字を確認する
C051ワード単位の読み書き点数が範囲外点数を直す(一括読出しは 960 ワードまで)
C052ビット単位の読み書き点数が範囲外点数を直す
C054ワード・ダブルワード単位のランダム読み書き点数が範囲外点数を直す
C056最大アドレスを超える読み書き要求先頭アドレスか点数を直す
C058ASCII→バイナリ変換後の要求データ長がデータ数と合わない要求データ長を見直す
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