如何看懂Modbus数据帧?Modbus RTU数据帧格式

在介绍Modbus RTU数据帧格式之前,首先让我们先了解一下Modbus的通讯模式。

Modbus通讯模式

Modbus协议是典型的主-从通讯结构,链路中只能有一台主设备,可以有多台从设备。主设备向从设备发送请求指令,从设备对该指令进行响应。从设备不能主动向主设备发送指令,并且从设备之间也不能进行通信。

Modbus协议通过这些请求、响应指令,实现了主设备对从设备中数字量或模拟量数据的访问和控制。通常,主设备是人机界面、监控或数据采集系统,从设备是传感器、可编程自动化控制器、智能仪器仪表等。

Modbus数据帧格式

知道了Modbus是典型的主-从式通讯方式后,我们再来看Modbus RTU数据帧格式。

Modbus RTU数据帧由四部分组成,设备地址,功能码,数据和校验。

设备地址

功能码

数据

校验

1个字节

1个字节

0~252字节

2个字节

设备地址占1个字节,范围是0~255之间。0是广播地址,1~247是从站设备地址,248~255保留不用。

功能码占1个字节,由协议明确规定,表中列出了一些常用的功能码。譬如03功能码是读保持寄存器,16功能码是写多个寄存器。

功能码

名称

作用

02

读离散量输入

读取离散量输入的状态

05

写单个线圈

强置一个逻辑线圈的通断状态

03

读取保持寄存器

读取多个保持寄存器的当前值

04

读输入寄存器

读取输入寄存器的当前值

16

写多个寄存器

将数值写入一连串寄存器中

...

_

_

数据部分0~252字节,其长度和内容由功能码决定。功能码不同,数据部分的定义不尽相同。

校验2个字节,由发送设备计算,将校验码之前的数据按照CRC16算法进行计算,生成2个字节的数据,放置于发送信息的尾部。接受信息的设备再重新计算接收到的信息的CRC码,比较计算得到的CRC码是否与接收到的相符,如果不相符,则表明数据在传输过程中出错。通过数据校验增加了系统的安全与效率。

常用功能码数据帧格式

1)  功能码-0x04(读输入寄存器)

举例:读取2号站,30008~30009 2个输入寄存器的数值。

Modbus RTU主站设备请求帧格式:

设备

地址
[1字节]

功能码
[1字节]

起始地址
[2字节]

寄存器数量
[2字节]

校验[2字节]

高8位

低8位

高8位

低8位

高8位

低8位

0x02

0x04

0x00

0x07

0x00

0x02

0xC0

0x39

2号站设备响应帧格式:

设备

地址

(1字节)

功能码
(1字节)

字节数
(1字节)

寄存器值
[寄存器数量*2字节]

校验[2字节]

寄存器1
 [高8位]

寄存器1
[低8位]

...

寄存器N
[高8位]

寄存器N
[低8位]

高8位

低8位

0x02

0x04

0x04

0x08

0x20

0x1A

0x43

0x81

0xBF

_

_

_

寄存器

30008数值

_

寄存器

30009数值

_

_

2)  功能码-0x10(写多个寄存器)

举例:向2号站,40002~40003 2个保持寄存器分别写入0x000A,0x0102数值

Modbus RTU主站设备请求帧格式[点击下图可放大查看]

如何看懂Modbus数据帧?Modbus RTU数据帧格式_第1张图片

2号站设备响应帧格式:

设备

地址
[1字节]

功能码
[1字节]

起始地址
[2字节]

寄存器数量
[2字节]

校验[2字节]

高8位

低8位

高8位

低8位

高8位

低8位

0x02

0x10

0x00

0x01

0x00

0x02

0x10

0x3B

3)  功能码-0x02(读离散量输入)

举例:读取2号站,10197~10218 22个离散量的状态。

Modbus RTU主站设备请求帧格式:

设备

地址
[1字节]

功能码
[1字节]

起始地址
[2字节]

离散输入数量
[2字节]

校验[2字节]

高8位

低8位

高8位

低8位

高8位

低8位

0x02

0x02

0x00

0xC4

0x00

0x16

0xB8

0x0A

2号站设备响应帧格式:

设备

地址
[1字节]

功能码
[1字节]

字节数

[1字节]

离散量输入状态

校验[2字节]

离散量

1-8

离散量

9-16

...

离散量

N~N+7

高8位

低8位

0x02

0x02

0x03

0xAC

0xDB

_

0x35

0x22

0xBB

数据传输模式

    通过前面的介绍,可以看到Modbus RTU协议数据帧是没有起始符和结束符,所以两个数据帧之间需要靠时间间隔来区分。协议中规定信息帧发送至少要有3.5个字符时间的停顿间隔。即在一个数据帧的最后一个字符传输完成之后,需要至少3.5个字符时间的停顿标定数据帧的结束,一个新的数据帧可在此停顿之后开始。如果一个新消息在小于3.5个字符时间内接着前个消息开始,接受的设备将认为它是前一数据帧的延续,这将导致CRC校验出错。同时整个数据帧必须作为一连续的流传输。如果在帧完成之前有超过1.5字符时间的停顿时间,接受设备将刷新不完整的数据帧从而认为存在丢包现象。

如何看懂Modbus数据帧?Modbus RTU数据帧格式_第2张图片

如何看懂Modbus数据帧?Modbus RTU数据帧格式_第3张图片

那么一个字符是什么呢,他由1个bit起始位,8bit数据位,1个bit奇偶校验位,1个bit停止位组成,在发送时从起始位开始。

我们是专注于工业通信技术的HMS,更多工业物联网洞察和技术知识可关注公众号:

HMS工业网络,我们会深入浅出为您讲解Modbus,PROFIBUS,OPC UA, CANopen等网络协议,业内专家都在看!

【未经许可,禁止转载】

你可能感兴趣的:(网络协议)