RS485 Modbus协议呢,非常的不出乎意料,还是基于最基本的串口收发写出来的。只是一种串口的应用,在串口的基础上增加了一点发送接收的规则与要求。按照一定的约定进行数据的收发。这一点类似于电力行业所使用的101规约,104规约有异曲同工之妙。
唯一一点要注意的就是,关于485接口,使用的485芯片一般而言都是准双向的。所以要进行发送接收的切换。默认我们认为485要处于接收的状态。
下面我们来对Modbus协议做一个简单的了解吧!
MODBUS-RTU协议
一、通讯格式
Address | Function | Data | CRC check |
8 bits | 8 bits | N x 8Bits | 16 bits |
1、Address
通讯地址: 1 - 247
2、Function
功能码 01/05/15 03/06/16
功能码 | 功能含义 | 寄存器地址 |
01 | 读单个或多个位状态 | 00001 - 09999 |
05 | 写单个位状态 | 00001 - 09999 |
15 | 写多个位状态 | 00001 - 09999 |
03 | 读单个或多个寄存器 | 40001 - 49999 |
06 | 写单个寄存器 | 40001 - 49999 |
16 | 写多个寄存器 | 40001 - 49999 |
3、CRC check
CRC校验:CRC-16,低位在前,高位在后(也有高位在前,低位在后面的)
二、报文格式
1、读单个或多个位状态
发送:Address 01 ADDRH ADDRL NUMH NUML CRC
返回:Address 01 BYTELENGTH DATA1...DATAN CRC
2、读单个或多个寄存器
发送:Address 03 ADDRH ADDRL NUMH NUML CRC
返回:Address 03 BYTELENGTH DATA1...DATAN CRC
3、写单个位状态
发送:Address 05 ADDRH ADDRL DATAH DATAL CRC
返回:Address 05 ADDRH ADDRL DATAH DATAL CRC
4、写单个寄存器
发送:Address 06 ADDRH ADDRL DATAH DATAL CRC
返回:Address 06 ADDRH ADDRL DATAH DATAL CRC
三、实战项目
1、通讯协议 :MODBUS-RTU
2、波特率 :9600(使用Modbus一般都是远距离的工业环境,需要一个不错的抗干扰的能力,所以多选用9600bps。)
3、数据位:8
4、停止位:1
5、校验位:无
6、地址:1
7、寄存器地址定义
序号 | 寄存器地址 | 名称 | 范围 | 功能号 | 描述 |
1 | 40001 | SHT30环境温度 | -45 ~ 125℃ | 03 | 解析1 |
2 | 40002 | SHT30环境湿度 | 0 - 100%RH | 03 | 解析2 |
3 | 40003 | 继电器 | 0/1 | 03/06 | 0:关,1开 |
4 | 40004 | 蜂鸣器 | 0/1 | 03/06 | 0:关,1开 |
解析1:
SHT30环境温度 -> -40 ~ 125℃,精度0.1℃
传输数据 = (SHT30环境温度+40)*10,传输数据范围为 0 - 1650
解析2:
SHT30环境湿度 -> 0 ~ 100%RH,精度1%RH
传输数据 = SHT30环境湿度,传输数据范围为 0 - 100
上面,我们重点的介绍了协议,简单的了解了一下Modbus协议,下面的重点我们放在如何去实现这样的功能上。来看看我们的关键代码部分是如何编写的。下面有请Auqin为我们来展示那模块化的面向对象的编程思想与逻辑。