1. modbus的基本概念
Modbus是一种串行通信协议,是Modicon公司(现在的施耐德电气 Schneider Electric)于1979年为使用可编程逻辑控制器(PLC)通信而发表。Modbus已经成为工业领域通信协议的业界标准,并且现在是工业电子设备之间常用的连接方式。标准的Modbus协议物理层接口有RS232、RS422、RS485和以太网接口,采用master/slave方式通信。1996年施耐德公司推出基于以太网TCP/IP的Modbus协议:ModbusTCP。
2. modbus的寄存器类型的介绍
[tr]寄存器读写权限说明[/tr]线圈bool类型变量 可读写
离散输入bool类型变量只读
保持寄存器长度为16bit的变量 可读写可以多可16bit 拼成浮点或者双精度数据
输入寄存器长度为16bit的变量 只读可以多可16bit 拼成浮点或者双精度数据
为啥叫线圈? 我猜测是因为最早是用来控制继电器的,继电器在电气图里面就是个线圈
离散输入 其实还有个名字叫触点 就是开关的触点的意思,所以他也是只能获取状态而不能去改写状态
2 。 modbus常用的功能码
功能码就是表明这一个数据帧的作用的,常用功能码如下
0x01: 读线圈寄存器
0x02: 读离散输入寄存器
0x03: 读保持寄存器
0x04: 读输入寄存器
0x05: 写单个线圈寄存器
0x06: 写单个保持寄存器
0x0f: 写多个线圈寄存器
0x10: 写多个保持寄存器
线圈寄存器:实际上就可以类比为开关量,每个bit都对应一个信号的开关状态。
离散输入寄存器:也可以叫做触点。只能去读取状态不能去写入状态。
保持寄存器:长度是16个bit 的寄存器,可以被读取和写入,用于保存一定的信息
输入寄存器:和保持寄存器比较相似,但是只能被读取不能写入。
注意上面提到的不能写入是指不能被主机端写入,从机自己是可以修改自己的离散输入和输入寄存器的!
3. modbus报文类型
Modbus协议是一项应用层报文传输协议,包括ASCII、RTU、TCP三种报文类型。
Modbus-RTU :一种紧凑的,采用二进制表示数据的方式,一般使用的是 RS485 或者RS232
Modbus-ASCII :一种人类可读的形式。一般使用的是 RS485 或者RS232 (不详细展开)
Modbus-TCP :基于TCP/IP的数据形式。由 报文头和帧结构构成。
3.1 Modbus-RTU 数据帧分析
modbus-RTU 帧包含 1字节的从站号+1字节的功能码+n字节的数据+2字节的CRC16校验
主机发送数据帧如下:
000010-Rx:01 03 00 00 00 0A C5 CD
01: 从设备ID
03: 功能号。读取保持寄存器值。
00 00: 读取的起始地址 0x0012
00 0A: 主机的读取数量 0x0003个寄存器
C5 CD: CRC16 校验的结果
接收的数据帧如下:
000011-Tx:01 03 14 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 A3 67
01: 从设备ID
03: 功能号。读取保持寄存器值。
14: 数据帧长度 0x14。 也就是十进制的20字节,代表10个寄存器值
… 连续20个参数
A3 67 : CRC16 校验结果
3.2 Modbus-TCP 数据帧分析
以下引自 https://www.cnblogs.com/ioufev/articles/10830028.html
ModbusTCP的数据帧可分为两部分:MBAP+PDU。
MBAP为报文头,长度为7字节,组成如下:
[tr]事务处理标识协议标识长度单元标识符[/tr]2字节2字节2字节1字节
[tr]内容解释[/tr]事务处理标识可以理解为报文的序列号,一般每次通信之后就要加1以区别不同的通信数据报文。
协议标识符00 00表示ModbusTCP协议。
长度表示接下来的数据长度,单位为字节。
单元标识符可以理解为设备地址。
以下字段截取字 modbus poll 的commucition 用于读取从设备id为1的设备的前十个保持寄存器
Tx:000054-19 B9 00 00 00 06 01 03 00 00 00 0A
Rx:000055-19 B9 00 00 00 17 01 03 14 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
Tx:000056-19 BA 00 00 00 06 01 03 00 00 00 0A
Rx:000057-19 BA 00 00 00 17 01 03 14 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
分析Tx:000054 字段:
第0~1位 19 B9 : 代表事务处理标志头。 用于和 返回信息一一对应。(事务处理标识)
第2~3位 00 00 : 00 00 代表是 TCP-IP协议
第4~5位 00 06 : 是后面的数据帧的长度
第6位 01 : 从站的ID
第7位 03 : 03 是功能码 读取保持线圈 (多个连续读取模式,参考之前的功能码)
第8~9位 00 00 : 连续读取的起始地址
第10~11位00 0A: 连续读取的数量
上面的Tx:000054 数据帧的意思就是 使用modbus tcp的方式去从站1的 从0x0000 开始的
连续0x000A(十进制10)个保持寄存器。
分析Rx:000055:00 17 01 03 14 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
第0~1位 19 B9 : 代表事务处理标志头。 用于和发送的信息对应。
第2~3位 00 00 : 00 00 代表是 TCP-IP协议
第4~5位 00 17 : 是后面的数据帧的长度0x0017 = 23
第6位 01 : 从站ID
第7位 03 :功能号 读取保持线圈 (多个连续读取模式)
第8位 14 : 代表返回的数据长度 0x14 = 20 字节,对应于 10个modbus保持寄存器
第9~10 位 00 00 : 第一个寄存器的值为 0x0000
3.3 两种数据帧的对比与分析
modbus-RTU相较于modbus-TCP 少了处理头,多了CRC
少了处理头是因为串口的协议硬件上保证了数据帧的到达的时序。
多了校验是因为没有TCP的校验功能,数据的可靠性需要在应用层进行保证。
上面提到的两种modbus的报文形式都包含以下信息
ID 。 这个是发送给哪一个从机以及哪一个从机返回的重要判断依据。所有协议都需要有这个参数。 该参数的长度为一个字节,理论上一条总线上最多支持247 个modbus从设备。
功能码。 这个参数决定了这个数据帧对应的功能,主机发送一个功能码之后从机的返回数据中也会包含这个功能码。
有效数据。使用modbus的目的肯定是传输数据的。主机发送给从机的有效数据一般是四个字节。前两个代表起始地址,后两个代表长度。 从机返回的数据 前两个字节一般代表后面的数据的长度紧接着的就是寄存器的数值。
4. modbus通讯的物理层设置
物理层的设置主要就是保证通讯的双方能正常的进行通讯。
4.1 modbus-RTU的配置
关于这一部分的配置其实就是物理层的配置,主要包括波特率,数据位,奇偶校验 ,停止位。
4.2 modbus-TCP的配置
这一部分就是TCP通讯所需要的参数,主要就是IP和端口 。
5. 一些问题的解释
问1: 为什么 modbus-TCP不需要校验?
modbus-TCP是基于TCP协议的,tcp 是可靠的, 就是有重传, 校验, 有序等措施。 问2:为什么 modbus-TCP需要处理头信息
主要是为了解决 先发后至 问题。保证处理的时序。 问3:modbus 在RS-485 和RS-232的区别
区别主要在232 和485 协议本身,232 是一对一全双工,485 是一对多半双工,所以485 上可以挂载很多的modbus 从站设备。
1. modbus的基本概念
Modbus是一种串行通信协议,是Modicon公司(现在的施耐德电气 Schneider Electric)于1979年为使用可编程逻辑控制器(PLC)通信而发表。Modbus已经成为工业领域通信协议的业界标准,并且现在是工业电子设备之间常用的连接方式。标准的Modbus协议物理层接口有RS232、RS422、RS485和以太网接口,采用master/slave方式通信。1996年施耐德公司推出基于以太网TCP/IP的Modbus协议:ModbusTCP。
2. modbus的寄存器类型的介绍
[tr]寄存器读写权限说明[/tr]线圈bool类型变量 可读写
离散输入bool类型变量只读
保持寄存器长度为16bit的变量 可读写可以多可16bit 拼成浮点或者双精度数据
输入寄存器长度为16bit的变量 只读可以多可16bit 拼成浮点或者双精度数据
为啥叫线圈? 我猜测是因为最早是用来控制继电器的,继电器在电气图里面就是个线圈
离散输入 其实还有个名字叫触点 就是开关的触点的意思,所以他也是只能获取状态而不能去改写状态
2 。 modbus常用的功能码
功能码就是表明这一个数据帧的作用的,常用功能码如下
0x01: 读线圈寄存器
0x02: 读离散输入寄存器
0x03: 读保持寄存器
0x04: 读输入寄存器
0x05: 写单个线圈寄存器
0x06: 写单个保持寄存器
0x0f: 写多个线圈寄存器
0x10: 写多个保持寄存器
线圈寄存器:实际上就可以类比为开关量,每个bit都对应一个信号的开关状态。
离散输入寄存器:也可以叫做触点。只能去读取状态不能去写入状态。
保持寄存器:长度是16个bit 的寄存器,可以被读取和写入,用于保存一定的信息
输入寄存器:和保持寄存器比较相似,但是只能被读取不能写入。
注意上面提到的不能写入是指不能被主机端写入,从机自己是可以修改自己的离散输入和输入寄存器的!
3. modbus报文类型
Modbus协议是一项应用层报文传输协议,包括ASCII、RTU、TCP三种报文类型。
Modbus-RTU :一种紧凑的,采用二进制表示数据的方式,一般使用的是 RS485 或者RS232
Modbus-ASCII :一种人类可读的形式。一般使用的是 RS485 或者RS232 (不详细展开)
Modbus-TCP :基于TCP/IP的数据形式。由 报文头和帧结构构成。
3.1 Modbus-RTU 数据帧分析
modbus-RTU 帧包含 1字节的从站号+1字节的功能码+n字节的数据+2字节的CRC16校验
主机发送数据帧如下:
000010-Rx:01 03 00 00 00 0A C5 CD
01: 从设备ID
03: 功能号。读取保持寄存器值。
00 00: 读取的起始地址 0x0012
00 0A: 主机的读取数量 0x0003个寄存器
C5 CD: CRC16 校验的结果
接收的数据帧如下:
000011-Tx:01 03 14 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 A3 67
01: 从设备ID
03: 功能号。读取保持寄存器值。
14: 数据帧长度 0x14。 也就是十进制的20字节,代表10个寄存器值
… 连续20个参数
A3 67 : CRC16 校验结果
3.2 Modbus-TCP 数据帧分析
以下引自 https://www.cnblogs.com/ioufev/articles/10830028.html
ModbusTCP的数据帧可分为两部分:MBAP+PDU。
MBAP为报文头,长度为7字节,组成如下:
[tr]事务处理标识协议标识长度单元标识符[/tr]2字节2字节2字节1字节
[tr]内容解释[/tr]事务处理标识可以理解为报文的序列号,一般每次通信之后就要加1以区别不同的通信数据报文。
协议标识符00 00表示ModbusTCP协议。
长度表示接下来的数据长度,单位为字节。
单元标识符可以理解为设备地址。
以下字段截取字 modbus poll 的commucition 用于读取从设备id为1的设备的前十个保持寄存器
Tx:000054-19 B9 00 00 00 06 01 03 00 00 00 0A
Rx:000055-19 B9 00 00 00 17 01 03 14 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
Tx:000056-19 BA 00 00 00 06 01 03 00 00 00 0A
Rx:000057-19 BA 00 00 00 17 01 03 14 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
分析Tx:000054 字段:
第0~1位 19 B9 : 代表事务处理标志头。 用于和 返回信息一一对应。(事务处理标识)
第2~3位 00 00 : 00 00 代表是 TCP-IP协议
第4~5位 00 06 : 是后面的数据帧的长度
第6位 01 : 从站的ID
第7位 03 : 03 是功能码 读取保持线圈 (多个连续读取模式,参考之前的功能码)
第8~9位 00 00 : 连续读取的起始地址
第10~11位00 0A: 连续读取的数量
上面的Tx:000054 数据帧的意思就是 使用modbus tcp的方式去从站1的 从0x0000 开始的
连续0x000A(十进制10)个保持寄存器。
分析Rx:000055:00 17 01 03 14 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
第0~1位 19 B9 : 代表事务处理标志头。 用于和发送的信息对应。
第2~3位 00 00 : 00 00 代表是 TCP-IP协议
第4~5位 00 17 : 是后面的数据帧的长度0x0017 = 23
第6位 01 : 从站ID
第7位 03 :功能号 读取保持线圈 (多个连续读取模式)
第8位 14 : 代表返回的数据长度 0x14 = 20 字节,对应于 10个modbus保持寄存器
第9~10 位 00 00 : 第一个寄存器的值为 0x0000
3.3 两种数据帧的对比与分析
modbus-RTU相较于modbus-TCP 少了处理头,多了CRC
少了处理头是因为串口的协议硬件上保证了数据帧的到达的时序。
多了校验是因为没有TCP的校验功能,数据的可靠性需要在应用层进行保证。
上面提到的两种modbus的报文形式都包含以下信息
ID 。 这个是发送给哪一个从机以及哪一个从机返回的重要判断依据。所有协议都需要有这个参数。 该参数的长度为一个字节,理论上一条总线上最多支持247 个modbus从设备。
功能码。 这个参数决定了这个数据帧对应的功能,主机发送一个功能码之后从机的返回数据中也会包含这个功能码。
有效数据。使用modbus的目的肯定是传输数据的。主机发送给从机的有效数据一般是四个字节。前两个代表起始地址,后两个代表长度。 从机返回的数据 前两个字节一般代表后面的数据的长度紧接着的就是寄存器的数值。
4. modbus通讯的物理层设置
物理层的设置主要就是保证通讯的双方能正常的进行通讯。
4.1 modbus-RTU的配置
关于这一部分的配置其实就是物理层的配置,主要包括波特率,数据位,奇偶校验 ,停止位。
4.2 modbus-TCP的配置
这一部分就是TCP通讯所需要的参数,主要就是IP和端口 。
5. 一些问题的解释
问1: 为什么 modbus-TCP不需要校验?
modbus-TCP是基于TCP协议的,tcp 是可靠的, 就是有重传, 校验, 有序等措施。 问2:为什么 modbus-TCP需要处理头信息
主要是为了解决 先发后至 问题。保证处理的时序。 问3:modbus 在RS-485 和RS-232的区别
区别主要在232 和485 协议本身,232 是一对一全双工,485 是一对多半双工,所以485 上可以挂载很多的modbus 从站设备。
举报