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