前言
Modbus 是属于工业上常用的通讯协议,包括RTU、ASCII、TCP,其中MODBUS-RTU协议最常用,比较简单,在32上很容易实现。就目前来说,作者在实际应用中只接触到了这种,所以以下的讲解也是根据MODBUS-RTU协议来说的,下面我会附上介绍及代码供有需要的伙伴们参考。
一、RS485
1.介绍
要想了解MODBUS协议,需要先接触一下RS485硬件电路。
首先了解什么是单工通讯,单工通讯是指数据只能朝着一个方向传输的通讯方式。而半双工通讯则是指对于通讯两端,不能同时对对方发送数据,必须错开时间段发送。 RS-485的通讯线只有2条,且这两条通讯线在一次传输中都需要用到,因此485只可实现半双工通讯。
485通讯实际上是把MCU出来的TTL电平通过硬件层的一个转换器芯片进行转换,这个芯片通常是MAX485芯片。
把MCU出来的一条的TTL信号经过芯片转换为两根线(线A、线B)上的信号。当MCU给转换器输入低TTL电平时,转换器会使得B的电压比A的电压高,反之,A的电压比B的电压高(通过AB线之间的电压差来判断是高低电平)

2.两者之间的联系
RS485实现半双工通讯,会遇到一个问题,MCU1向MCU2发数据时,并不知道线上是否正传来MCU2数据,因为没有其他线可用来判断对方的收发状态,那么可能也会导致数据冲突。因此,RS-485要实现半双工通讯,就需要上层的软件协议加以规约,也就是做到”不能你想发数据就发数据”。可以理解,软件层协议就好像交通规则,它能让数据有序传输。而RS-485对应的软件层协议最多使用的是MODBUS协议,只有软件和硬件相互配合,才能让数据有序的传输。可以这样进行比喻,RS485相当于一条马路,可以让好多车经过,但是为了不出现交通事故,就需要制定一下交通规则,而MODBUS协议就是针对于在RS485这条马路上保证车辆正常行驶的交通规则。网上有许多关于RS485协议的说法,其实是不准确的,RS485只是硬件电路,需要上层的软件协议来支持,而软件协议就是MODBUS协议,这就是我所理解的两者之间的联系。
二、通信格式
1.MODBUS协议
接触了RS485之后,现在可以了解MODBUS协议。RS-485上的软件层协议ModBus主要依赖于主从模式。主从模式是指在半双工通讯方式上,2个或者2个以上的设备组成的通讯系统中,支持多从机的方式:
(1) 至少且只有一个主机,其他的都是从机
(2) 不管任何时候,从机都不能主动向主机发送数据
(3) 主机具有访问从机的权限,从机不可以主动访问从机,任何一次数据交换,都要由主机发起
(4)不管是主机还是从机,系统一旦上电,都要把自己置于接收状态(或者称为监听状态)
主从机的数据交互,需要:
a. 主机将自己转为发送状态
b. 主机按照预先约定的格式发出寻址数据帧。
数据帧是由我们买的适用于MODBUS协议的模块所提供的,不同的模块对应的功能码不太一样,但是格式都是一样的,功能码有许多,这里我不再进行介绍,具体格式如下:例如我使用功能码04,进行数据查询
主机发送命令帧

不同的模块对应不同的功能码,CRC高字节和CRC低字节也是通过CRC校验的算法求解出来的。
说明:从机地址是厂家生产的模块就给定的,不过有修改地址的功能码,寄存器地址是厂家规定好的地址,寄存器数量是你需要采集几项数据,例如我这里需要采集温度和湿度两项数据,会用到两个寄存器,所以寄存器数量为02,CRC是计算出来的,下面会给出代码。
从机响应的数据帧

说明:这里写了两个数据,每个数据两个字节,所以字节数是04,数据1和数据2就是支持MODBUS协议的模块所给你的主机返回的数据,CRC校验会根据前面的数据得出校验值。
这里给出CRC校验的算法,CRC校验也分为好几种,由于MODBUS协议规定的格式最后面校验值时两个字节,所以用CRC16算法。
CRC校验代码如下:
#ifdef _CRC16
u8 _flash chCRCHTalbe[]={
0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41,
0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40,
0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41,
0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,
0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41,
0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40,
0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40,
0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1,

本文介绍了MODBUS协议及其在RS485硬件电路中的应用,详细解析了半双工通讯原理、MODBUS协议的主从模式及通信格式,并提供了CRC校验算法和示例代码。

3321

被折叠的 条评论
为什么被折叠?



