Modbus serial protocol decoding
https://www.picotech.com/library/oscilloscopes/modbus-serial-protocol-decoding
简介
Modbus 是一种低速串行数据协议,通常用于由一台监控计算机(主站)控制或监控多台远程设备(从站)的工业应用中。
该规范最初由 Modicon 公司(现施耐德电气公司)于 1979 年发布,用于其可编程逻辑控制器 (PLC)。
在一个标准的 Modbus 网络中,有一个主站和多达 247 个从站,每个从站都有一个从 1 到 247 的唯一地址。
Modbus 协议版本
根据所使用的传输介质,Modbus 开发了多个版本。最常见的有
Modbus RTU(远程终端设备)- 通常用于 RS-232 单端或 RS-485 差分线路,使用二进制编码和 CRC 错误检查。
Modbus ASCII - 同样用于 RS-232 或 RS-485 线路,使用 ASCII 字符而不是二进制,使其可读性更高,但效率较低,而且使用 LRC 错误检查的效果较差。ASCII 模式使用 ASCII 字符来开始和结束报文,而 RTU 则使用 3.5 个字符的时间间隔来成帧。传输相同内容的 Modbus ASCII 报文所需的字节数是 Modbus RTU 报文的两倍。
Modbus TCP - 用于 TCP/IP 网络,通常是以太网(目前 PicoScope 不支持)。
Modbus 帧结构
Modbus 协议定义了一个独立于底层通信层的协议数据单元(PDU)。根据采用的总线或网络类型,应用数据单元(ADU)中可能会引入其他字段。
协议数据单元(PDU)包含:
- 表示要执行的操作类型的功能代码
- 主站发送给从站设备的帧的数据字段,包含功能代码定义的操作的附加信息。这可能包括离散地址和寄存器地址、要处理的项目数量以及字段中实际数据字节数等项目。在某些类型的请求中,数据字段可能不存在(长度为零)。
应用数据单元(ADU)包含:
- 协议数据单元(PDU)
- 从站 ID
- CRC 错误校验
错误代码: 服务器响应客户端时,使用功能代码字段表示正常(无错误)响应或发生某种错误(称为异常响应)。对于正常响应,服务器只需回声原始功能代码并返回所请求的数据。
数据存储
数据存储在从属设备的四个不同表中。其中两个存储开关(1 位)值,称为 "线圈 "和 "离散输入",另外两个存储数值,为 16 位字,称为 "寄存器"。每个表都是只读表或读/写表。
每个表都有 9999 个位置。
功能代码
Modbus 功能代码分为三类:
公共功能代码 - 从 1 到 127(用户定义代码除外),由 Modbus.org 社区验证,公开记录并保证唯一。
用户自定义功能代码 - 分为 65 至 72 和 100 至 110 两个范围。
保留功能代码 - 某些公司用于传统产品,不对外公开使用。
常用功能代码示例见下表。
Modbus 的完整规范可从 www.modbus.org 免费获取。