// 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