当前位置:网站首页 > Haskell函数式编程 > 正文

modbus RTU报文格式(modbus RTU报文格式详解)




Modbus协议概述

Modbus RTU(Remote Terminal Unit)是Modbus通信协议的一种变种,用于串行通信。它是一种常见的工业控制系统通信协议,通常用于采集传感器数据、控制执行器和监控设备状态。

从站地址 功能码 数据部分 CRC检验 1 byte 1 byte n bytes 2 bytes
  • 地址:取值范围是0-247,如果是0,就是主站广播报文;如果是1-247,则有可能是主站请求或者从站应答。
  • 功能码:也就是报文命令,代表主站对从站的操作,读或者写
  • 数据:数据字段,主请求报文,从应答报文会有所差异。也就是说假设抓取总线报文,如何区分是主站请求还是从站应答,则需要通过数据字段进行区分了。
  • CRC校验:采用CRC16,16位循环冗余校验。

Modbus RTU 帧总长度最大为 256 字节(即数据部分最多252字节)。

  • RS-485:半双工收发接口,这是最为常用的modbus物理层,信号采用差分电平编码,用一对双绞线现场布线,抗干扰性能也不错
  • RS-422:全双工收发接口,这种物理层也有比较多的应用,信号采用差分电平编码,需要两对双绞线现场布线,抗干扰性能也不错。与RS-485相比,其优势在于可以实现全双工,通信的效率高些,所需要的代价就是现场布线需要两对双绞线,增加了一定的成本。
  • RS-232:全双工收发接口,这个基本用在点对点通信场景下,不适合多点拓扑连接,采用共模电平编码,一般需要Rxd/Txd/Gnd三根线连接。

Modbus-RTU和Modbus-TCP的区别

  • Modbus RTU通过串行线(如RS-485、RS-232)进行数据传输,其传输速度相对较慢。

    Modbus
    RTU采用紧凑的二进制格式对数据帧进行封装,包括地址域、功能码、数据和校验和等字段。这种格式以二进制形式进行高效传输,因此则更适合实时或本地控制应用,尤其是在没有现成网络基础设施的环境中,如:工业自动化现场、嵌入式系统、传感器网络以及小型控制系统等场景

  • Modbus TCP利用TCP/IP协议栈在网络上进行数据传输,它依赖于以太网等网络基础设施,可以实现高速、大规模的数据传输

    而Modbus
    TCP则是将每字节二进制数据转换为固定两位十六进制字符串,再依次串联在一起,以TCP码形式进行数据传送。因其简单、可靠和成本效益高的特点,广泛应用于大型自动化系统、数据中心、楼宇自动化以及工业物联网等对通信距离较远,且对数据传输的实时性和稳定性要求较高的场景

链路层一个最最重要的职责就是对通讯介质的管理,如果没有介质的管理,就不能称其为总线。

Modbus从链路控制的角度属于主站(Master)/从站(Slave)模式,比较简单。对介质的访问控制相当于时分复用。通讯总是由主站发起,但可分为单播和广播两种方式,单播就是主站向特定的从站发出通讯请求,广播是向总线所有的设备发起通讯请求。

  • 广播(Broadcast):主站向总线所有设备发出广播报文,所有从设备处理广播报文但不做应答,报文中地址为0则为广播请求:
  • 单播(Unicast): 报文中的地址字段指定所需要访问的设备,该设备收到请求后作出对应的应答。单播地址指的是从设备地址,主设备是没有地址的。
广播地址 单播地址 预留地址 0 1-247 248-255

从链路管理的角度来看,总线介质上发送报文的有两种设备,一种是主设备,另一种是从设备。对于主设备来说,它会有两种报文会向总线介质发送:一种是广播报文,另一种是单播报文。下图状态机描述了Modbus的介质管理:
在这里插入图片描述
图中的事件的产生,将会触发主设备链路状态机从一个状态迁移到另一个状态,在事件触发后,还伴随动作需要执行。

  • 空闲:主设备处于空闲态。如果此时应用程序需要发送一个从设备请求,就会切换到等待应答状态;如果此时应用需要发送总线广播,此时,主设备就切换到广播延时。
  • 等待应答:在等待应答状态时,主设备将等待来自从设备的应答报文,如果接收到从站的报文,则进入应答处理。如果等待超时则进入错误处理状态机;在等待过程中,状态机不发生迁移。
  • 广播延时:如果主设备需要发送广播报文,则发送完就进入广播延时状态。这里为什么要延时呢?延时的设计目的就是留给从设备一点时间去处理接收到的广播请求。如果主设备没有这个延时,那么如果应用马上在发一个请求,则从设备有可能来不及处理。但是从设备只做接收处理,任何从设备都不可以对广播报文进行应答。

对于从设备来说,只接收主设备请求或者发送应答,因此从设备的状态机就更简单了。
在这里插入图片描述
从设备的状态机很简单,系统一上电就进入空闲状态,空闲态一直监听总线报文,当收到一个完整的报文时,首先校验报文的正确性,再检查报文是否是发给该设备的,如果是请求本设备的,则先完成请求的操作,然后准备好应答报文,如果出错则将出错信息发送给主站。如果收到的是主站广播请求,则仅仅处理相应请求,不做任何应答。

对于帧的时间管理,其实就是对介质的冲突管理,Modbus-RTU对于介质管理规定了2个重要的时间参数,以实现成帧、冲突管理等。
在 RTU 模式, 报文帧由时长至少为 3.5 个字符时间的空闲间隔区分。软件通过这个时间来判断数据是否发送完,当超过3.5 个字符时间没有收到数据,表示本次数据传输完成。
在这里插入图片描述
这个图可以用于断帧,也就时判断是否接收到一个完整的帧,因此只需要使用一个定时器在每次收到一个字节后,就重启一个3.5字节定时器,如果这个3.5字节定时器中断了,就证明收到了一个Modbus报文,至于这个报文是不是正确的报文,可以在进一步根据帧格式进行校验。另外还规定了报文需要连续发送,字节间隔不得超过1.5字节时间。


上面对于介质管理所规定得时分复用,可以用一个状态机来描述:
在这里插入图片描述

其实这里Client/Server是从应用层的角度描述得,Modbus-RTU中,主设备其应用层就是client侧,而slave从设备就是应用的server。

  • 无错误:Client(主站)向从站发出请求,Server(从站)执行命令请求的操作,然后发送应答给Client(主站),这里的操作,有可能是读取参数,设置参数,或者执行某个动作,具体取决于如何设计。
  • 有错误:Client(主站)向从站发出请求,Server(从站)检测到错误,然后发送异常应答给Client(主站)。这里的错误,有可能是读取失败,寄存器地址非法,写失败,执行动作失败等。

CRC校验原理

查表法实现CRC16校验

 
   

发送报文格式如下

从站地址 功能码 地址高位 地址低位 数量高位 数量低位 CRC校验 0x01 0x01 0x00 0x13 0x00 0x1B

发送报文含义:
读取1号从站输出线圈(R/W),寄存器起始地址为0x13=19,对应绝对地址为00020,线圈数量为0x1B=27。
即读取1号从站输出线圈,地址从00020-00046,共27个线圈的状态值。

协议中的起始地址指的是索引,后面的地址指的是具体地址,对于任意一个存储区,索引都是从0开始的,但是对应的具体地址,与存储区是相关的,比如输出线圈,0对应00001;输入线圈,0对应10001;输入寄存器,0对应30001;保持寄存器,0对应40001。

返回报文格式如下

从站地址 功能码 数据长度 字节1 字节2 字节3 字节4 CRC校验 0x01 0x01 0x04 0xCD 0x6B 0xB2 0x05

返回1号从站输出线圈00020-00046,共27个线圈的状态值,返回字节数为4个,分别为CD 6B B2 05。
CD=1100 1101 对应 00020-00027
6B=0110 1011 对应 00028-00035
B2=1011 0010 对应 00036-00043
05=0000 0101 对应 00044-00046



发送报文格式如下

从站地址 功能码 地址高位 地址低位 数量高位 数量低位 CRC校验 0x01 0x02 0x00 0xC4 0x00 0x1D

发送报文含义:
读取1号从站输入线圈(R),寄存器起始地址为0xC4=196,对应绝对地址为10197,线圈数量为0x1D=29。
即读取1号从站输入线圈,地址从10197-10225,共29个线圈的状态值。

返回报文格式如下

从站地址 功能码 数据长度 字节1 字节2 字节3 字节4 CRC校验 0x01 0x02 0x04 0xCD 0x6B 0xB2 0x05

返回1号从站输出线圈10197-10225,共29个线圈的状态值,返回字节数为4个,分别为CD 6B B2 05。
CD=1100 1101 对应 10197-10204
6B=0110 1011 对应 10205-10212
B2=1011 0010 对应 10213-10220
05=0000 0101 对应 10221-10225



发送报文格式如下

从站地址 功能码 地址高位 地址低位 数量高位 数量低位 CRC校验 0x01 0x03 0x00 0x6B 0x00 0x02

发送报文含义:
读取1号从站保持寄存器,起始地址为0x6B=107,对应地址为40108,寄存器数量为0x02=2,即读取1号从站保持寄存器,地址从40108-40109,共2个寄存器的数值。

返回报文格式如下

从站地址 功能码 数据长度 1高 2低 2高 2低 CRC校验 0x01 0x03 0x04 0x02 0x2B 0x01 0x06

返回报文含义:
返回1号从站保持寄存器40108-40109,共2个寄存器的数值,返回字节数为4个,分别为02 2B 01 06。
40108对应数值为0x022B;
40109对应数值为0x0106;


发送报文格式如下

从站地址 功能码 地址高位 地址低位 数量高位 数量低位 CRC校验 0x01 0x04 0x00 0x6B 0x00 0x02

发送报文含义:
读取1号从站输入寄存器,起始地址为0x6B=107,对应地址为30108,寄存器数量为0x02=2,即读取1号从站输入寄存器,地址从30108-30109,共2个寄存器的数值。

返回报文格式如下

从站地址 功能码 数据长度 1高 2低 2高 2低 CRC校验 0x01 0x04 0x04 0x02 0x2B 0x01 0x06

返回报文含义:
返回1号从站输入寄存器30108-30109,共2个寄存器的数值,返回字节数为4个,分别为02 2B 01 06。
30108对应数值为0x022B;
30109对应数值为0x0106;


发送报文格式如下

从站地址 功能码 地址高位 地址低位 标志高位 标志低位 CRC校验 0x01 0x05 0x00 0xAC 0xFF 0x00

返回报文格式如下

从站地址 功能码 地址高位 地址低位 标志高位 标志低位 CRC校验 0x01 0x05 0x00 0xAC 0xFF 0x00

预置单输出线圈原报文返回。

发送报文格式如下

从站地址 功能码 地址高位 地址低位 数据高位 数据低位 CRC校验 0x01 0x06 0x00 0x87 0x03 0x9E

返回报文格式如下

从站地址 功能码 地址高位 地址低位 数据高位 数据低位 CRC校验 0x01 0x06 0x00 0x87 0x03 0x9E

预置单保持寄存器原报文返回。



寄存器地址 功能 设定范围 读写操作 0x01 原点寄存器 0 W 0x02 定位运动寄存器 0-512 W 0x05 当前位置寄存器 0-512 R

1. 回原点
0X01 寄存器位定义:【地址高位】写入 0,回原点操作使能。

主站发送写入命令:

从站地址 功能码 地址高位 地址低位 数据高位 数据低位 CRC低位 CRC高位 0x01 0x06 0x00 0x01 0x00 0x00 0x0A 0xD8

从机应答:

从站地址 功能码 地址高位 地址低位 数据高位 数据低位 CRC低位 CRC高位 0x01 0x06 0x00 0x01 0x00 0x00 0x0A 0xD8

2. 定位运动
运行到指定位置
0x02 寄存器位定义:【数据高低位】目标位置。只写,设置范围0-512。

主站发送写入命令:
0x0200 = 512

从站地址 功能码 地址高位 地址低位 数据高位 数据低位 CRC低位 CRC高位 0x01 0x06 0x00 0x02 0x02 0x00 0x6A 0x29

从机应答:

从站地址 功能码 地址高位 地址低位 数据高位 数据低位 CRC低位 CRC高位 0x01 0x06 0x00 0x02 0x02 0x00 0x6A 0x29

3. 当前位置
读取当前位置寄存器的值,回复当前位置的数据。运行中无反馈数据。
0X05 寄存器位定义:【长度高低位】当前位置的数据。只读,读取范围0-512。

主站发送读取命令:

从站地址 功能码 地址高位 地址低位 长度高位 长度低位 CRC低位 CRC高位 0x01 0x03 0x00 0x05 0x00 0x01 0x0B 0x94

从机应答:

从站地址 功能码 数据长度 数据高位 数据低位 CRC低位 CRC高位 0x01 0x03 0x02 0x02 0x00 0x6A 0x15
到此这篇modbus RTU报文格式(modbus RTU报文格式详解)的文章就介绍到这了,更多相关内容请继续浏览下面的相关推荐文章,希望大家都能在编程的领域有一番成就!

版权声明


相关文章:

  • 计算机零基础编程入门的书(零基础计算机编程培训)2025-10-16 12:09:05
  • redis哨兵模式连接命令(redis 哨兵模式配置)2025-10-16 12:09:05
  • ffmpeg查看视频格式(ffmpeg查看视频帧率)2025-10-16 12:09:05
  • hpm格式文件怎么打开(hpm是什么格式的文件)2025-10-16 12:09:05
  • max函数调用(如何调用max函数)2025-10-16 12:09:05
  • 多级列表样式怎么设置1.2变为2.1(多级列表样式怎么设置2016)2025-10-16 12:09:05
  • max函数是窗口函数(max函数是什么型函数)2025-10-16 12:09:05
  • pos机支付方式有哪些(pos机支付方式有哪些)2025-10-16 12:09:05
  • ffprobe查看视频信息(ffmpeg查看视频格式)2025-10-16 12:09:05
  • 富文本插件(富文本插件froala 导出样式)2025-10-16 12:09:05
  • 全屏图片