打印
[其他ST产品]

HAL之modbus

[复制链接]
476|25
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
什么是modbus?

Modbus是一种串行通信协议,是Modicon公司(现在的施耐德电气 Schneider Electric)于1979年为使用可编程逻辑控制器(PLC)通信而发表。Modbus已经成为工业领域通信协议的业界标准(De facto),并且现在是工业电子设备之间常用的连接方式。

要注意的是::::::MODBUS协议是一种软件协议,是一种人为约定的协议,他和SPI,IIC,CAN总线协议还是有些不同的,SPI,IIC,CAN总线这些协议必须是设备在硬件上支持的,可以说SPI,IIC,CAN总线是一种软硬件的结合体,也就是常分为两层即物理层和协议层,MODBUS本身就是类似于协议层的东西。Modbus通信标准协议可以通过各种传输方式传播,如 RS232C、RS485、光纤、无线电等。

使用特权

评论回复
沙发
逢dududu必shu|  楼主 | 2022-11-30 19:41 | 只看该作者
Modbus比其他通信协议使用的更广泛的主要原因有:

公开发表并且无版权要求

易于部署和维护

对供应商来说,修改移动本地的比特或字节没有很多限制

使用特权

评论回复
板凳
逢dududu必shu|  楼主 | 2022-11-30 19:41 | 只看该作者
Modbus允许多个 (大约240个) 设备连接在同一个网络上进行通信,举个例子,一个测量温度和湿度的装置,并且将结果发送给计算机。在数据采集与监视控制系统(SCADA)中,Modbus通常用来连接监控计算机和远程终端控制系统(RTU)。

使用特权

评论回复
地板
逢dududu必shu|  楼主 | 2022-11-30 19:42 | 只看该作者
Modbus协议大致分为以下两种串行传输模式:

Modbus-RTU

Modbus-ASCII

一个设备只会使用一种协议,一般来说大部分的设备都是Modbus-RTU协议。

设备必须要有RTU协议!这是Modbus协议上规定的,且默认模式必须是RTU,ASCII作为可选项。一般学习Modbus协议,只需要了解RTU协议,ASCll了解即可。

使用特权

评论回复
5
逢dududu必shu|  楼主 | 2022-11-30 19:42 | 只看该作者
Modbus通讯过程
Modbus是一种单主站的主/从通信模式。,主机发送,从机应答,主机不发送,总线上就没有数据通信。

使用特权

评论回复
6
逢dududu必shu|  楼主 | 2022-11-30 19:43 | 只看该作者
举例: 一个总线上有一个主机,多个从机,主机查询其中一个从机,首先得给这些从机分配地址(每个地址必须唯一),分配好地址后,主机先查询,然后发数据,从机得到主机发送的数据,然后对应地址的从机回复,主机得到从机数据。

使用特权

评论回复
7
逢dududu必shu|  楼主 | 2022-11-30 19:45 | 只看该作者
注意:

Modbus不能判断从机是否忙,也没有对应的仲裁机制,我们只能通过软件对数据进行适当的处理!

使用特权

评论回复
8
逢dududu必shu|  楼主 | 2022-11-30 19:46 | 只看该作者
帧结构
帧结构 = 地址 + 功能码+ 数据 + 校验

使用特权

评论回复
9
逢dududu必shu|  楼主 | 2022-11-30 19:47 | 只看该作者
地址: 占用一个字节,范围0-255,其中有效范围是1-247,其他有特殊用途。Modbus网络上只能有一个主站存在,主站在 Modbus网络上没有地址,从站的地址范围为 0 - 247,其中 0 为广播地址,从站的实际地址范围为 1 - 247。

使用特权

评论回复
10
逢dududu必shu|  楼主 | 2022-11-30 19:48 | 只看该作者
功能码:占用一个字节,功能码的意义就是,知道这个指令是干啥的,比如你可以查询从机的数据,也可以修改数据,所以不同功能码对应不同功能。

使用特权

评论回复
11
逢dududu必shu|  楼主 | 2022-11-30 19:48 | 只看该作者
部分功能码:

使用特权

评论回复
12
逢dududu必shu|  楼主 | 2022-11-30 19:49 | 只看该作者
其中,功能码03和06是比较常用的。

●数据:占用一个或多个字节,根据功能码不同,有不同结构。

●校验:为了保证数据不错误,增加这个,然后再把前面的数据进行计算看数据是否一致,如果一致,就说明这帧数据是正确的,我再回复;如果不一样,说明你这个数据在传输的时候出了问题,数据不对的,所以就抛弃了。

使用特权

评论回复
13
逢dududu必shu|  楼主 | 2022-11-30 19:50 | 只看该作者
举例说明

我们大部分时候都是用modbus来和传感器通信。如果要查询传感器上的信息,用03查询功能码,如果需要修改传感器寄存器的值就用06修改功能码,其他的不需要过多关注,用到的时候再去了解。

使用特权

评论回复
14
逢dududu必shu|  楼主 | 2022-11-30 19:51 | 只看该作者
查询功能码

比如我们现在要使用STM32查询某传感器的数据,该传感器的地址为01。

主机发送: 01 03 00 00 00 01 84 0A
从机回复: 01 03 02 19 98 B2 7E

使用特权

评论回复
15
逢dududu必shu|  楼主 | 2022-11-30 19:51 | 只看该作者
什么意思?解析如下:

发送数据解析

使用特权

评论回复
16
逢dududu必shu|  楼主 | 2022-11-30 19:52 | 只看该作者
01-地址,也就是你传感器的地址
03-功功能码,03代表查询功能,查询传感器的数据
00 00-代表查询的起始寄存器地址.说明从0x0000开始查询。这里需要说明以下,Modbus把数据存放在寄存器中,通过查询寄存器来得到不同变量的值,一个寄存器地址对应2字节数据
00 01-代表查询了一个寄存器.结合前面的00 00,意思就是查询从0开始的1个寄存器值
84 0A-循环冗余校验,是modbus的校验公式,从首个字节开始到84前面为止。

使用特权

评论回复
17
逢dududu必shu|  楼主 | 2022-11-30 19:52 | 只看该作者
回复数据解析

使用特权

评论回复
18
逢dududu必shu|  楼主 | 2022-11-30 19:53 | 只看该作者
01-地址,也就是你传感器的地址
03-功功能码,03代表查询功能,查询传感器的数据。这里要注意的是注意发给从机的功能码是啥,从机就要回复同样的功能码,如果不一样说明这一帧数据有错误
02-代表后面数据的字节数,因为上面说到,一个寄存器有2个字节,所以后面的字节数肯定是2*查询的寄存器个数;
19 98-寄存器的值是19 98,结合发送的数据看出,01这个寄存器的值为19 98
B2 7E-循环冗余校验

总结就是:

发送:从机的地址+我要干嘛的功能码+我要查的寄存器的地址+我要查的寄存器地址的个数+校验码

回复:从机的地址+主机发我的功能码+要发送给主机数据的字节数+数据+校验码

使用特权

评论回复
19
逢dududu必shu|  楼主 | 2022-11-30 19:54 | 只看该作者
修改功能码

主机发送: 01 06 00 00 00 01 48 0A
从机回复: 01 06 00 00 00 01 48 0A

看上去怎么一样的啊?是不是错了?答案是这是正确的。

使用特权

评论回复
20
逢dududu必shu|  楼主 | 2022-11-30 19:54 | 只看该作者
发送数据解析

01-主机要查询的从机地址
06-功能码,06代表修改单个寄存器功能,修改有些不同,有修改一个寄存器和修改多个寄存器;
00 00-代表修改的起始寄存器地址.说明从0x0000开始.
00 01-代表修改的值为00 01.结合前面的00 00,意思就是修改0号寄存器值为00 01;
48 0A-循环冗余校验,是modbus的校验公式,从首个字节开始到48前面为止

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

62

主题

459

帖子

0

粉丝