Modbus协议定义了一系列的错误码(也称异常码),用来指示在执行Modbus请求时可能发生的错误情况。这些错误码可以帮助诊断通信问题,并且在接收到异常响应时进行适当的错误处理。
错误码
错误码 | 描述 |
0x01 | 非法功能 (Illegal Function) |
0x02 | 非法数据地址 (Illegal Data Address) |
0x03 | 非法数据值 (Illegal Data Value) |
0x04 | 设备故障 (Slave Device Failure) |
0x05 | 设备忙 (Acknowledge) |
0x06 | 负号应答 (Negative Acknowledge) |
0x07 | 内存区保留 (Memory Parity Error) |
0x08 | Gateway路径不存在 (Gateway Path Not Available) |
0x0A | Gateway目标失败 (Target Device Failed to Respond) |
0x01 (1) - 非法功能,请求的功能未被从设备识别或不支持。
0x02 (2) - 非法数据地址,数据地址不在设备的可访问范围内。
0x03 (3) - 非法数据值,请求的操作尝试设置一个无效或非法的值。
0x04 (4) - 从设备故障,未知的设备故障。
0x05 (5) - 从设备繁忙,设备正在执行另一个任务,无法立即响应请求。
0x06 (6) - 负号应答,请求的操作不能被执行,因为它是非法的(例如试图清除一个只读存储区)。
0x08 (8) - 内存溢出,执行请求时内存溢出。
0x0A (10) - 通讯超时,请求超出了允许的时间限制。
0x0B (11) - 从设备内部操作失败,设备内部发生了一个错误。
0x0C (12) - 从设备不支持此功能,设备不支持请求的功能。
0x0D (13) - 从设备不支持此数据类型,设备不支持请求的数据类型。
0x0E (14) - 从设备不支持此数据地址,设备不支持请求的数据地址。
0x0F (15) - 从设备不支持此数据长度,设备不支持请求的数据长度。
处理措施
1.验证功能码
检查发送的功能码是否正确,是否与设备上安装的Modbus协议版本匹配。如果不匹配,可以尝试升级或降级Modbus协议版本,以使功能码与设备上安装的Modbus协议版本匹配。
序号 | 功能码 | 描述 | 请求数据 | 预期响应 | 实际响应 | 测试结果 |
1 | 0x01 | 读取线圈状态 | 地址: 0x0000, 数量: 10 | 状态: [0x01, 0x00, ...] | - | 成功/失败 |
2 | 0x02 | 读取离散输入 | 地址: 0x0000, 数量: 10 | 状态: [0x01, 0x00, ...] | - | 成功/失败 |
3 | 0x03 | 读取保持寄存器 | 地址: 0x0000, 数量: 10 | 数据: [0x1234, 0x5678, ...] | - | 成功/失败 |
4 | 0x04 | 读取输入寄存器 | 地址: 0x0000, 数量: 10 | 数据: [0x1234, 0x5678, ...] | - | 成功/失败 |
5 | 0x05 | 写单个线圈 | 地址: 0x0000, 状态: 0x01 | - | - | 成功/失败 |
6 | 0x06 | 写单个保持寄存器 | 地址: 0x0000, 数据: 0x1234 | - | - | 成功/失败 |
7 | 0x0F | 写多个线圈 | 地址: 0x0000, 数据: [0x01, 0x01, ...] | - | - | 成功/失败 |
8 | 0x10 | 写多个保持寄存器 | 地址: 0x0000, 数据: [0x1234, 0x5678, ...] | - | - | 成功/失败 |
2.检查地址码
检查发送的地址码是否正确,是否与设备上安装的地址码匹配。如果不匹配,可以尝试重新设置地址码,以使地址码与设备上安装的地址码匹配。
序号 | 功能码 | 地址范围 | 预期值 | 实际值 | 结果 |
1 | 0x01 | 00001-00010 | 状态1, 状态2, ... | 状态1, 状态2, ... | 符合/不符合 |
2 | 0x02 | 00011-00020 | 状态3, 状态4, ... | 状态3, 状态4, ... | 符合/不符合 |
3 | 0x03 | 00031-00040 | 数据1, 数据2, ... | 数据1, 数据2, ... | 符合/不符合 |
4 | 0x04 | 00041-00050 | 数据3, 数据4, ... | 数据3, 数据4, ... | 符合/不符合 |
5 | 0x05 | 00061-00070 | 写入状态1, 写入状态2, ... | 状态1, 状态2, ... | 符合/不符合 |
6 | 0x06 | 00071-00080 | 写入数据1, 写入数据2, ... | 数据1, 数据2, ... | 符合/不符合 |
7 | 0x0F | 00091-00100 | 写入状态3, 写入状态4, ... | 状态3, 状态4, ... | 符合/不符合 |
8 | 0x10 | 00111-00120 | 写入数据3, 写入数据4, ... | 数据3, 数据4, ... | 符合/不符合 |
3.检查数据
检查发送的数据是否正确,是否与设备上安装的数据匹配。如果不匹配,可以尝试重新编辑数据,以使数据与设备上安装的数据匹配。
序号 | 功能码 | 设备地址 | 寄存器地址 | 预期值 | 实际值 | 测试结果 |
1 | 0x01 | 0x01 | 0x0000 | ON/OFF | “”通过”、“失败”、“待定” | |
2 | 0x02 | 0x01 | 0x0001 | ON/OFF | “”通过”、“失败”、“待定” | |
3 | 0x03 | 0x01 | 0x0002 | 100 | “”通过”、“失败”、“待定” | |
4 | 0x04 | 0x01 | 0x0003 | 200 | “”通过”、“失败”、“待定” | |
5 | 0x05 | 0x01 | 0x0004 | ON | “”通过”、“失败”、“待定” | |
6 | 0x06 | 0x01 | 0x0005 | 300 | “”通过”、“失败”、“待定” | |
7 | 0x0F | 0x01 | 0x0006 | [ON, OFF, ON] | “”通过”、“失败”、“待定” | |
8 | 0x10 | 0x01 | 0x0007 | [400, 500, 600] | “”通过”、“失败”、“待定” |
- 序号:每一行代表一个测试项。
- 功能码:使用的Modbus功能码。
- 设备地址:Modbus设备的地址。
- 寄存器地址:要访问的寄存器或线圈的地址。
- 预期值:期望从设备获取的数据值或期望设置的数据值。
- 实际值:通过Modbus读取的实际数据值。
- 测试结果:根据实际值和预期值对比后的结果,可以标记为“通过”、“失败”或“待定”。
4.检查通讯接口
检查物理层连接,确保连接线缆没有损坏,连接端口正确无误,且电源正常。
5.检查通讯参数
确认波特率、数据位、停止位和校验方式等通讯参数与设备设置一致。
序号 | 参数名称 | 参数值 | 备注 |
1 | 设备地址 | 1 | 通常为1-247 |
2 | 波特率 | 9600 | 如9600, 19200等 |
3 | 数据位 | 8 | 通常为8位 |
4 | 停止位 | 1 | 通常为1位或2位 |
5 | 校验方式 | N | 如无校验(N), 奇校验(O), 偶校验(E) |
6 | 超时时间 | 1秒 | 如1秒 |
7 | 连接类型 | RTU | RTU, ASCII, TCP |
8 | 功能码 | 0x03 | 如0x01, 0x03等 |
9 | 寄存器地址 | 100 | |
10 | 寄存器数量 | 10 | 如果读取多个寄存器 |
11 | 写入值 | 1234 | 如果写入操作 |
12 | CRC校验值 | 0x1234 | 如果使用RTU/ASCII |
13 | MBAP头部 | 0x00000006 | 如果使用TCP |
6.检查报文内容
确保报文中的功能码、数据地址和数据值正确,同时确保报文格式符合Modbus协议的要求。
7.使用调试工具
利用Modbus调试工具如modscan、modbus poll等工具进行诊断。这些工具可以帮助确认通讯是否成功,以及是否收到了预期的响应。
8.重试机制
对于某些类型的错误(如设备繁忙、通讯超时等),可以实施重试策略,设置合理的重试次数和重试间隔时间。
9.错误日志记录
记录接收到的异常码及其上下文信息,以便后续分析和调试。