STM32H库Modbus-RTU程序

STM32H库Modbus-RTU程序

  • 简介
    • Modbus ASCII协议
    • Modbus RTU协议
    • Modbus TCP协议
    • Modbus/UDP协议
  • Modbus RTU 数据帧结构
  • Modbus 支持的功能码
    • 功能码 0x03:读取寄存器
    • 功能码0x06:写单个寄存器
    • 功能码0x10:写多个寄存器
  • Modbus RTU 接线
  • Modbus RTU 程序
  • Modbus RTU 调试

参考博主 STM32移植modbus通讯协议简明教程

简介

Modbus通讯协议最早由Modicon公司开发,是一种采用主从通信模式,即只有主机可以发起请求,从站设备通过向主机提供请求的数据或执行查询中请求的操作作为响应,广泛应用于工业现场的总线协议。主从查询——响应机制如下图所示。

STM32H库Modbus-RTU程序_第1张图片
主机可以通过指定节点地址的方式访问从设备,也可以通过发送广播消息访问所有从设备;从设备只响应针对自己的查询,不会响应广播查询。Modbus通信协议是一项应用层报文传输协议,包括RTU、ASCII和TCP,标准的Modbus协议物理层接口包括RS232、RS485和以太网。

主要的Modbus协议有四种,分别是:

Modbus ASCII协议

该协议使用ASCII字符编码传输数据,每个字节被表示为两个ASCII字符。由于采用了ASCII编码,该协议的传输速率相对较慢,但可以通过普通的串口进行通信。

Modbus RTU协议

该协议使用二进制编码传输数据,每个字节用8个二进制位表示。相比于Modbus ASCII协议,Modbus RTU协议的传输速率更快。通常使用串口进行通信,但也可以使用其他物理介质。

Modbus TCP协议

该协议基于TCP/IP协议栈,通过以太网进行通信。Modbus TCP协议将Modbus RTU协议的数据帧封装在TCP/IP协议的数据包中进行传输,具有更高的传输速率和可靠性。由于基于以太网,该协议可以支持更长的通信距离和更多的设备。

Modbus/UDP协议

该协议类似于Modbus TCP协议,但是使用UDP协议进行传输。与TCP协议相比,UDP协议不保证数据的可靠性和顺序,但传输速率更快。因此,Modbus/UDP协议适用于实时性要求较高的应用场景。

Modbus RTU与Modbus ASCII均为串行传输方式。其中,Modbus RTU采用二进制表现形式以及紧凑数据结构,通信效率较高,应用比较广泛。而Modbus ASCII采用ASCII码传输,并且利用特殊字符作为其字节的开始与结束标识,其传输效率要远远低于Modbus RTU协议。
Modbus TCP是通过工业以太网TCP/IP网络传输的Modbus通信。Modbus数据传输提供了连接在以太网TCP/IP网络上的客户机与服务器之间的实时通讯。

Modbus RTU 数据帧结构

Modbus RTU协议通过将从站设备地址(或广播)、定义请求操作的功能码、要发送的数据和CRC校验放入主机查询中来建立查询报文;从站设备的响应消息也是使用Modbus RTU报文结构,包括从站设备地址、请求操作的功能码、要发送的数据和CRC校验;如果在接收消息时发生错误、或者从站设备无法执行请求的操作,从站设备将发送一个异常消息作为响应。Modbus RTU数据帧结构如下:

STM32H库Modbus-RTU程序_第2张图片

帧结构 = 地址 + 功能码 + 数据 + CRC校验。地址就是相当于哪个从机,功能码就是要干的事情,数据就是要具体怎么做,最后来个CRC校验确保数据是对的。值得注意的是地址: 地址的有效范围是1-247,其他有特殊用途,比如255是广播地址(广播地址就是应答所有地址,正常的需要两个设备的地址一样才能进行查询和回复),而且RTU没有帧头和帧尾,所以协议里明确两帧之间要大于3.5个字节时间间隔,作为一帧结束的判断依据。

Modbus 支持的功能码

0x03:读取寄存器
0x06:写单个寄存器
0x10:写多个寄存器

功能码 0x03:读取寄存器

STM32H库Modbus-RTU程序_第3张图片
①功能码0x03实战:
STM32H库Modbus-RTU程序_第4张图片

解析:
 
/*主机发送解析*/
 
05-地址
 
03-功能码,代表查询功能,其他功能后面再说
 
01 64-代表查询的起始寄存器地址.说明从0x0164开始查询.
 
(这里需要说明以下,Modbus把数据存放在寄存器中,通过查询寄存器来得到不同变量的值,一个寄存器地址对应2字节数据;)
 
00 02-代表查询了一个寄存器.结合前面的00 00,意思就是查询从0开始的2个寄存器值;
 
85 AC-循环冗余校验,是modbus的校验公式,从首个字节开始到84前面为止;
 
(这里新手可能不懂,这个校验就是保证数据传输过程没有错误的一种手段,不同的协议这种校验公式不一样,只需了解这个就足够了,具体怎么求的,可以直接在输出数据得到结果,地址为:http://www.ip33.com/crc.html)
 
/*从机回复解析*/
 
05-地址
 
03-功能码
 
04-代表后面数据的字节数,因为上面说到,一个寄存器有4个字节,所以后面的字节数肯定是2*查询的寄存器个数;
 
13 88-寄存器的值是0x1388,结合发送的数据看出,01这个寄存器的值为0x1388

00 01-寄存器的值是0x0001,结合发送的数据看出,02这个寄存器的值为0x0001
 
35 15-循环冗余校验

功能码0x06:写单个寄存器

STM32H库Modbus-RTU程序_第5张图片

功能码0x10:写多个寄存器

STM32H库Modbus-RTU程序_第6张图片
③功能码0x10实战:
STM32H库Modbus-RTU程序_第7张图片

解析:
 
/*主机发送解析*/
 
05-主机要查的地址
 
10-功能码,0x10=16D代表修改多个寄存器功能;
 
01 6C-代表修改的起始寄存器地址.说明从0x016C开始.
 
00 02-代表修改的寄存器数量,这里开始于0x06的修改不同;
 
04 -表示修改的总字节数,由于修改了2个寄存器,所以数据要有4个字节;
 
00 F4-表示修改的值,结合上面,就是从第016C寄存器开始修改第一个寄存器值为0x01F4,就是把016C寄存器改为0x01F400 01-表示修改的值,结合上面,就是从第016C寄存器开始修改第二个寄存器值为0x0001,就是把016D寄存器改为0x00016C BC -循环冗余校验,是Modbus的校验公式
 
 
 
/*从机回复解析*/
 
05-从机返回的地址,说明这就是主机查的从机
 
10-功能码
 
01 6C-代表修改的起始寄存器地址.说明是0x016C.
 
00 02-代表修改的寄存器数量,只需要回复这么多久足够了,从机告诉主机,你修改了哪几个寄存器就足够了;
 
81 AD-循环冗余校验;

Modbus RTU 接线

Modbus RTU协议使用RS-232或RS-485物理层,使用RS-485物理层可以配置1~32个从站设备地址,构成RS-422/RS-485网络拓扑,通常在物理连接的末端设备并联120Ω的终端电阻。

RS485半双工两线制接线方式如图所示:
STM32H库Modbus-RTU程序_第8张图片

Modbus RTU 程序

可到他的微信公众号回复 “Modbus”可领取相关资料和程序,该程序经过简单验证可以正常使用。

STM32移植modbus通讯协议简明教程

Modbus RTU 调试

可以使用SSCOM串口工具来,省事的是可以不用自己添加CRC校验,工具可以直接带上去发送给通讯设备,至于硬件工具可以再某宝上直接买USB转485模块,这个模块相当于CH430串口芯片一样使用
STM32H库Modbus-RTU程序_第9张图片

你可能感兴趣的:(STM32开发,stm32,嵌入式硬件,Modbus)