一、ModBus介绍
Modbus由MODICON公司于1979年开发,是一种工业现场总线协议标准.1996年施耐德公司推出基于以太网TCP/IP的Modbus协议:ModbusTCP。
Modbus协议是一项**应用层
**报文传输协议,包括ASCII、RTU、TCP三种报文类型。标准的Modbus协议物理层接口有RS232、RS422、RS485和以太网接口,采用master/slave方式通信。
- Modbus RTU(Remote Terminal Unit 远程终端单元):这种方式常采用RS-485做为物理层,一般利用芯片的串口实现数据报文的收发,报文数据采用二进制数据进行通信。
- Modbus ASCII :报文使用 ASCII 字符。ASCII 格式使用纵向冗余校验和。Modbus ASCII 报文由冒号 (":")开始 和换行符 (CR/LF) 结尾构成。
- Modbus TCP/IP 或 Modbus TCP :这是一种 Modbus 变体版本,使用 TCP/IP 网络进行通信,通过 502 端口进行连接。报文不需要校验和计算,因为以太网底层已经实现了CRC32 数据完整性校验。
- Modbus over TCP/IP 或 Modbus over TCP 或 Modbus RTU/IP :这也是一种 Modbus 变体,与 Modbus TCP 的不同之处在于,与 Modbus RTU 一样,校验和包含在报文中。
- Modbus UDP:也有在UDP上传输Modbus报文的,不过需要做错误重传机制,这么干的应该不多。
**Modbus 使用“大端模式”(big-Endian) ,**当发送多个字节时,首先发送高字节,再发送低字节。
二、ModBus RTU协议
1.协议格式
暂时无法在飞书文档外展示此内容
- 地址****表示通信设备的地址,取值范围是0-247,如果是0,就是主站广播报文;如果是1-247,则有可能是主站请求或者从站应答
- 功能码**,也就是报文命令**,代表主站对从站的操作,例如读或者写
- 数据字段,根据实际应用场景来自定义数据格式,主请求报文,从应答报文会有所差异。也就是说假设抓取总线报文,如何区分是主站请求还是从站应答,则需要通过数据字段进行区分了。
- CRC校验,采样CRC16,16位循环冗余校验
2.单播通信
报文中的地址字段指定所需要访问的设备,该设备收到请求后作出对应的应答。
3.广播通信
主站向总线所有设备发出广播报文,所有从设备都不做应答,报文中地址为0则为广播请求
4.帧间隔
Modbus通信时规定主机发送完一组命令必须间隔3.5个字符的延时**,再发送下一组新命令**,这3.5个字符的延时主要用来告诉其他设备这次命令(数据)已经结束。
通常情况下在串行通信中,1个字符包括1位起始位、8位数据位、1位校验位(或者没有)、1位停止位(一般情况下)。这样一般情况下1个字符就包括11位,那么3.5个字符就是3.5x11=38.5位。
而串行通信中波特率的含义时每秒传输的二进制位的个数。例如波特率为9600bps,则意思就是说每1s(也就是1000ms)传输9600个位的数据;反过来说传输9600个二进制位的数据需要1000ms,那么传输38.5个二进制位的数据需要的时间就是: 38.5 x (1000 / 9600) = 4.0104167ms
Modbus RTU要求相邻两帧数据的起始和结束之间至少大于等于3.5个字符的时间间隔**,那么波特率为9600bps的情况下,只要大于4.0104167ms即可。**
另外还规定了报文需要连续发送,字节间隔不得超过1.5字节时间。