资讯详情

详解Modbus通信协议---清晰易懂

本文旨在让你对Modbus有一个非常直观的理解,总结关于Modbus相关知识非常适合初学生。同时,如有错误,欢迎修改意见和建议,并在第一时间修改

      • 什么是协议
      • 什么是RS-485 RS-232
    • Modbus协议说明
      • Modebus通信过程
      • 举例
      • Modbus存储区
    • Modbus协议类型
    • Modbus-RTU协议
        • Modbus报文帧结构
        • Modbus功能码
        • CRC校验
      • Modbus-ACSII协议
      • Modbus-TCP协议

什么是协议

知道什么是什么Modbus先来看看

协议是汉语词汇,发音是xié yì,意思是

简单来说,我们的单片机之间的相互通信,以及单片机和上位机之间的通信,都规定了不同的内容规范。

这个协议可以有很多规范来适应不同的设备和通信要求,这是我们常见的IIC SPI UART串口通信协议等。Modbus也是串行通信协议。

在这里插入图片描述

什么是RS-485 RS-232

我们在看Modbus经常看到485串口,232串口,这些是什么?

通信双方之间传输数据, 比方说传输5V的电压 -1V这些物理信号在传输过程中会受到很多干扰,比如你传输一个5V接收端的电压可能变为4.8V,通信双方的参考电压可能会有所不同。

RS232:电子工业协会(Electronic Industries Association,EIA) 与电平标准和通信协议(时序)相对应的异步传输标准接口,其电平标准: 3V~ 15V对应0,-3V~-15V对应1。

  • 全双工
  • 逻辑1:-15V–5V
  • 逻辑0: 3V– 15V

RS485:RS485是串口接口标准,用于长距离传输传输,传输差分信号,抗干扰比RS232强很多。

  • 半双工
  • 逻辑1: 2V~ 6V
  • 逻辑0: -2V~ -6V

如果想继续了解,可以看博主的博文:

USB转串口 TTL RS-232 RS-485 COM口 UART区别

硬件层协议:

Modbus协议说明

Modbus诞生于1979年 莫迪康公司 后来被施耐德电气公司收购。Modbus为彼此通信提供通用语言的设备和设备。 Modbus已成为工业通信协议的行业标准,是工业电子设备之间常用的连接方式。Modbus作为工业领域应用最广泛的协议

最简单的说,Modbus就像总线通信协议一样IIC SPI这种,但是

Modbus广泛使用的原因有它的优点

举个简单的例子,我们常用IIC通信协议需要物理连接iic总线,再加上拉电阻,规定物理层的高低电平。 因此能适应多种电气接口,因此应用广泛。

Modebus通信过程

注意Modbus是的通信协议

Modbus通信中只有一个设备可以发送请求。从设备接收主机发送的其他数据进行响应,从机是任何外围设备,如I/O传感器、阀门、网络驱动器或其他测量设备。从站处理信息和使用Modbus将数据发送到主站。

不会自己给主站发消息,只能回复主机发的消息请求。

并且,,比方说主机给从机发送命令, 从机没有收到或者正在处理其他东西,这时候就不能响应主机,因为modbus的总线只是传输数据,没有其他仲裁机制,所以需要通过软件的方式来判断是否正常接收。

举例

现在,我们来探讨Modbus数据传输的方式,可以简单地理解成打电话。并且是单向通信的打电话

就好比老师和你打电话,老师拨通了你的,然后老师跟你说,小王呀,我这里,你说好的,然后打开你电脑的文件夹,,这就是一个通信过程。

Modbus存储区

既然从机存储数据,那么肯定要有一个存储区,那就需要文件操作,我们都知道这文件可以分为只读(-r)和读写(-wr)两种类型

并且存储的数据类型可以分为 :布尔量 和 16位寄存器

区号 名称 读写 地址范围
0区 输出线圈 可读可写布尔量 00001-09999
1区 输入线圈 只读布尔量 10001-19999
3区 输入寄存器 只读寄存器 30001-39999
4区 保持寄存器 可读可写寄存器 40001-49999

并且Modbus还给每个区都划分了

Modbus数据模型规定了具体的地址范围,每一个从机,都有实际的物理存储,跟modbus的存储区相对应,

Modbus协议类型

在上面我们已经说明了Modbus可以在各种介质上传输,那么他的传输模式也分为三种。包括ASCII、RTU(远程终端控制系统)、TCP三种报文类型

串行端口存在多个版本的Modbus协议,而最常见的是下面四种:

  • Modbus-Rtu
  • Modbus-Ascii
  • Modbus-Tcp
  • ModbusPlus

Modbus RTU是一种紧凑的,,Modbus ASCII是一种采用,并且每个8Bit 字节都作为两个ASCII字符发送的表示方式。 RTU格式后续的命令/数据带有循环冗余校验的校验和,而ASCII格式采用纵向冗余校验的校验和。

当然常用的就是RTU模式,ASCII一般很少

详细的我们等下再阐述

Modbus-RTU协议

Modbus报文帧结构

一个报文就是一帧数据,一个数据帧就一个报文: 指的是一串完整的指令数据,本质就是一串数据。

Modbus协议在串行链路上的报文格式如下所示:

从站地址 功能码 数据 CRC/LRC
1 byte 1 byte N bytes 2 bytes
  • ,范围0-255,其中有效范围是1-247,其中255是广播地址(广播就是对所有从机发送应答)

  • 占用一个字节,,所以不同功能码对应不同功能.

  • 根据功能码不同,有不同功能,比方说功能码是查询从机的数据,这里就是查询数据的地址和查询字节数等。

Modbus功能码

Modbus协议同时规定了二十几种功能码,但是常用的只有8种,用于对存储区的读写,如下表所示:

功能码 功能说明
01H 读取输出线圈
02H 读取输入线圈
03H 读取保持寄存器
04H 读取输入寄存器
05H 写入单线圈
06H 写入单寄存器
0FH 写入多线圈
10H 写入多寄存器

当然我们用的最多的就是03和06 一个是读取数据,一个是修改数据。

CRC校验

比如主机发出01 06 00 01 00 17 98 04, 98 04 两个字节是校验位,那么从机接收到后要根据01 06 00 01 00 17 再计算CRC校验值,从机判断自己计算出来的CRC校验是否与接收的CRC校验(98 04主机计算的)相等,如果不相等那么说明数据传输有错误,这些数据就不能要。

1、预置一个16位寄存器为0FFFFH(全1),称之为CRC寄存器。

2 、把数据帧中的第一个字节的8位与CRC寄存器中的低字节进行异或运算,结果存回CRC寄存器。

3、将CRC寄存器向右移一位,最高位填以0,最低位移出并检测。

4 、如果最低位为0:重复第三步(下一次移位);如果最低位为1:将CRC寄存器与一个预设的固定值(0A001H)进行异或运算。

5、重复第三步和第四步直到8次移位。这样处理完了一个完整的八位。

6 、重复第2步到第5步来处理下一个八位,直到所有的字节处理结束。

7、最终CRC寄存器的值就是CRC的值。

此外还有一种利用预设的表格计算CRC的方法,它的主要特点是计算速度快,但是表格需要较大的存储空间,该方法此处不在阐述

下面我们来看详细的发送和接收数据:

主机发送报文格式如下:

从站地址 功能码 起始(高) 起始(低) 数量(高) 数量(低) 校验
0x01 0x03 0x00 0x01 0x00 0x01 0xD5 0xCA

含义:

0x01:从机的地址 0x03:查询功能,读取从机寄存器的数据 0x00 0x01: 代表读取的起始寄存器地址.说明从0x0001开始读取. 0x00 0x01: 查询的寄存器数量为0x0001个 Modbus把数据存放在寄存器中,通过查询寄存器来得到不同变量的值,一个寄存器地址对应2字节数据; 寄存器地址对应着从机实际的存储地址 0xD5 0xCA: 循环冗余校验 CRC

从机回复报文格式如下:

从站地址 功能码 字节计数 字节1 字节2 校验
0x01 0x03 0x02 0x01 0x00 0x17

含义:

0x01:从机的地址 0x03:查询功能,读取从机寄存器的数据 0x02: 返回字节数为2个 一个寄存器2个字节 0x00 0x17:寄存器的值是0017 0xF8 0x4A: 循环冗余校验 CRC

主机发送报文格式如下:

从站地址 功能码 数据地址(高) 数据地址(低) 数据(高) 数据(低) 校验
0x01 0x06 0x00 0x01 0x00 0x17 0x98 0x04

含义:

0x01:从机的地址 0x06:修改功能,修改从机寄存器的数据 0x00 0x01: 代表修改的起始寄存器地址.说明修改0x0001-0x0003的存储内容 0x00 0x17: 要修改的数据值为0017 0x98 0x04: 循环冗余校验 CRC

从机回复报文格式如下:

从站地址 功能码 数据地址(高) 数据地址(低) 数据(高) 数据(低) 校验
0x01 0x06 0x00 0x01 0x00 0x17 0x98 0x04

含义:

0x01:从机的地址 0x06:修改功能,修改从机寄存器的数据 0x00 0x01: 代表修改的起始寄存器地址.说明是0x0000 0x00 0x17:修改的值为0017 0x98 0x04: 循环冗余校验 CRC

Modbus-ACSII协议

在消息中的每个字节都作为两个ASCII字符发送

下方是ascii的报文帧

  • 1个字节起始位

  • 2个字节地址位

  • 2个字节功能位

  • n个数据位,最小的有效位先发送

  • 结束符 \r \n

可以看到数据部分更加繁琐,正常我们使用都是用RTU格式,ASCII码格式有了解即可。

总结:

注意:

Modbus-TCP协议

我们首先看下Modbus-TCP和Modbus-ACSII的区别

,因为TCP本身就具有校验差错的能力

MBAP报文头格式如下:

其中事务处理表示符合协议标识符我们正常使用设置为0即可 长度为6个字节 0x0006

简单来说,

最后附上 Modbus标准协议手册链接 Modbus标准协议手册

标签: 2lrc4传感器electronic光纤传感器

锐单商城拥有海量元器件数据手册IC替代型号,打造 电子元器件IC百科大全!

锐单商城 - 一站式电子元器件采购平台