知识点1【 Modbus通信】
1、Modbus的概述
Modbus是OSI模型第七层的应用层报文传输协议
协议:说明有组包和解包的过程

2、通信机制
Modelbus是一个请求/应答协议
通信机制:主机轮询,从机应答 的机制。每个从设备有唯一的地址 ,主设备通过地址指定通信对象。

轮询:在通信或控制系统中,由主设备主动 发送,周期性 地向从设备发起请求并获取数据的机制。
特点
(1)系统中只有一个主机:主机通信
(2)系统中的从机不可以主动向主机发送数据
(3)系统上电 后,所有的主从设备都应该处于 监听总线的状态,也就是接收状态
(4)如果要发起一次通信,必须从主机的主动发起
通信流程
(1)主机首先切换成发送模式,发送数据包
(2)马上转成接收模式
3、Modbus报文格式
缩略语

报文介绍(重点)

地址域:从设备的ID号 1Byte
功能码:执行的具体操作 1Byte
数据域:发送或者接收的有效数据 252Byte
差错校验:判断数据传输是否正确 2Byte
异常响应

这段话,中我们可以看到异常响应,那什么是异常响应,如何区分异常响应和正确响应呢?
异常响应概述
服务器(从设备) 向 客户端(主设备) 返回的错误通知,用于指示请求无法撑场处理
异常响应的辨别
功能码为原功能码 + 0x80 (即最高位置1),范围为128-255(十进制)
通信的架构图
(1)正确的响应

(2)错误的相应

知识点2【功能码】
功能码分为三类
1、公共功能码

2、用户定义功能码:

3、保留功能吗:

其中最常用的也就是公共功能码
常用功能码介绍
1、0x01:可读可写 按照bit操作
-
请求格式:
从站地址 | 0x01 | 起始地址高位 | 起始地址低位 | 寄存器数量高位 | 寄存器数量低位 | CRC
-
响应格式:
从站地址 | 0x01 | 数据字节数 | 线圈状态(按位打包) | CRC
-
示例:
读取地址0x0000开始的5个线圈状态,返回值为
0x15
(二进制00010101
,表示线圈0-4的状态为ON、OFF、ON、OFF、ON)。
2、0x02:只读 按照bit操作
-
请求格式:
从站地址 | 0x02 | 起始地址高位 | 起始地址低位 | 输入数量高位 | 输入数量低位 | CRC
-
响应格式:
从站地址 | 0x02 | 数据字节数 | 离散输入状态(按位打包) | CRC
-
示例:
读取地址0x0002开始的3个离散输入,返回
0x05
(二进制00000101
,表示输入2-4的状态为ON、OFF、ON)。
3、0x03:读保持寄存器,按照寄存器读取
-
请求格式:
从站地址 | 0x03 | 起始地址高位 | 起始地址低位 | 寄存器数量高位 | 寄存器数量低位 | CRC
-
响应格式:
从站地址 | 0x03 | 数据字节数 | 寄存器值(每寄存器2字节) | CRC
-
示例:
读取地址0x000A开始的2个保持寄存器,返回值为
0x00FF
和0x1234
。
4、0x06:写 按照寄存器操作
-
请求格式:
从站地址 | 0x06 | 寄存器地址高位 | 寄存器地址低位 | 写入值高位 | 写入值低位 | CRC
-
响应格式:
从站地址 | 0x06 | 寄存器地址高位 | 寄存器地址低位 | 写入值高位 | 写入值低位 | CRC
(与请求相同,表示操作成功) -
示例:
向地址0x0001写入值
0xABCD
,请求与响应报文一致。
5、0x16:写入多个寄存器
-
请求格式:
从站地址 | 0x10 | 起始地址高位 | 起始地址低位 | 寄存器数量高位 | 寄存器数量低位 | 字节数 | 寄存器值列表(每值2字节) | CRC
-
响应格式:
从站地址 | 0x10 | 起始地址高位 | 起始地址低位 | 寄存器数量高位 | 寄存器数量低位 | CRC
-
示例:
向地址0x0000写入两个寄存器值
0x1234
和0x5678
,请求中包含字节数0x04
和值列表。
注意
请求和响应部分 手册中的图如下,我这里来说一下分析时候的注意事项


无论是请求还是响应都是 PDU部分,即 功能码和数据 部分
并且Modbus是大端存储,我们存数据的时候先存入 高地址
知识点3【Modbus在数据链路层的实现】
1、请求方式
(1)单播模式

(2)广播模式

2、地址的规则
寻址地址共256个

主节点没有地址,每个子节点必须有一个地址
3、传输过程中的注意事项
(1)间隔时间

由于没有起始位和停止位,Modbus使用的是以3.5个字符作为 两个报文 之间的最短间隔时间。
(2)相邻字符最大间隔

同一帧数据中相邻字符间隔时间大于1.5个字符
上面的时间单位都是字符,哪一个字符是多久呢?请看下面介绍
(3)RTU模式每个字节(11位)格式


奇偶校验位 是可以没有的,收发端保持一致即可
是不是很熟悉,和串口一摸一样。
因为Modbus是应用层协议,而串口 是物理层和数据链路层 的标准,因此到达数据链路层,他们的格式都是一样的。
串口 是一个广义概念,泛指异步串行通信接口。并不只局限于USART。RS485,RS232也都是串口。
因此这里的一个字符时间就是:
字符时间
以波特率9600为例

总结
- 帧间空闲时间 (Inter-Frame Delay)必须 ≥ 3.5个字符时间,以区分连续的数据帧。
- 帧内字符间隔 (Inter-Character Timeout)必须 ≤ 1.5个字符时间,否则视为帧结束。
4、RS485和Modbus 的关系
通信:硬件层,软件层组成
硬件层:
RS485------解决的是数据的传输问题,也就是如何将一个"0"或"1"传输到另外一端。
软件层:
Modbus------在硬件的基础上,解决数据传输的含义,传的数据代表什么。