Modbus通信协议

Posted 小吴吃肉啦~

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Modbus通信协议相关的知识,希望对你有一定的参考价值。

Modbus通信协议

通讯过程

使用串口通讯它对应的是modbus RTU或者 modbus ASCII协议
那么使用网口通讯的话,它对应的就是Modbus TCP协议

Modbus 通讯都遵循以下的过程:
主设备向从设备发送请求,从设备分析并处理主设备的请求,然后向主设备发送结果。那么如果出现任何的差错,从设备都会返回一个异常的功能码。

Modbus 的工作方式是请求和应答,每一次通讯都是主站先发送指令,可以是广播,或者是向特向转发,那么从站响应指令并按要求应答或者报告异常。
那么当主站他不发送请求的时候,从站他是不会自己发送数据的,从站只会响应主站的回应,只会响应主张的请求,
那么从站和从站之间,它是不能够直接通讯的,只能主张对从站发送请求,从站响应主张的请求。

那么Modbus 通讯它是以Modbus 报文的形式来进行的,及通讯双方它是使用Modbus 报文来通讯的,
它就像中国人和中国人之间,它是以中国人交流一样的道理,那么Modbus 报文就是他们之间沟通的语言。

Modbus协议是一种应用层的报文传输协议

Modbus分为三种:

  • RTU
  • ASCII
  • TCP

通讯过程:

Modbus是主从方式通信,也就是说,不能同步进行通信,总线上每次只有一个数据进行传输,即主机发送,从机应答,主机不发送,总线上就没有数据通信.

一个主机要给多个从机中的一个发信息,首先他要知道,那个从机的地址才能发送;就好比打电话,要在通讯录里,查找那个人的电话号码,才可以通讯。

Modbus RTU通讯协议

通信:读写

存储区

输出线圈、输入线圈、输出寄存器、输入寄存器

如果用布尔使用线圈存储区;如果存数据,使用寄存器存储区

存储区的范围

5位(标准地址)和6位(扩张地址)

  • 5位:x xxxx 第一位表示存储区,后面四位代表范围
  • 6位:x xxxxx 第一位表示存储区,后面五位代表范围

每个存储区的代号

  • 输出线圈 0 00001-09999、000001-065536
  • 输入线圈 1 10001-19999、100001-165536
  • 输出寄存器 4 40001-49999、400001-465536
  • 输入寄存器 3 30001-39999、300001-365536
区号名称读写范围
0区输出线圈可读可写00001-09999
1区输入线圈只读10001-19999
3区输入寄存器只读30001-39999
4区保持寄存器可读可写40001-49999

读和写 功能码

  • 读输出线圈 01

  • 读输入线圈 02

  • 读输出寄存器 03

  • 读输入寄存器 04

  • 写单个输出线圈 05

  • 写单个输出寄存器 06

  • 写多个输出线圈 15

  • 写多个输出寄存器 16

ModbusRTU/ASCII协议分析

ModbusRTU与ModbusASCII在报文数据发送格式上几乎一样,但也存在一些区别,具体体现在:

  1. ModbusASCII有开始字符和结束字符(CR LF),可以作为一帧数据开始和结束的标志,而ModbusRTU没有这样的标志,需要用时间间隔来判断一帧报文的开始和结束,协议规定的时间为3.5个字符周期,就是说一帧报文开始前,必须有大于3.5个字符周期的空闲时间,一帧报文结束后,也必须要有3.5个字符周期的空闲时间否则就会出现粘包的情况。

注意:针对3.5个字符周期,其实是一个具体时间,但是这个时间跟波特率相关。

在串口通信中,1个字符包括1位起始位、8位数据位(一般情况)、1位校验位(或者没有)、1位停止位(一般情况下),因此1个字符包括11个位,那么3.5个字符就是38.5个位,波特率表示的含义是每秒传输的二进制位的个位,因此如果是9600波特率,3.5个字符周期=1000/9600*38.5=4.01ms。

  1. 两者校验方式不同,ModbusRTU是CRC循环冗余校验,ModbusASCII是LCR纵向冗余校验。

  2. 在Modbus标准中,RTU是必须要求的,而ASCII是可选项,即作为一个Modbus通信设备可以只支持RTU,也可以同时支持RTU和ASCII,但不能只支持ASCII。

ModbusRTU\\ASCII报文格式:

从站地址(设备编号)(一个byte)+ 功能码(一个byte)+数据(n个byte)+校验(2个byte)

从站地址功能码数据CRC/LRC
1 byte1 byteN bytes2 bytes

对于读取的理解

从站地址(设备编号) 找谁?

功能码 干嘛

数据 具体干嘛的细节

校验 验证

对于写入的理解

从站地址(设备编号) 找谁?

功能码 干嘛

数据 具体干嘛的细节 (更多,多了个写入的具体数值)

校验 验证

eg:分析报文

发送的报文: 01 03 00 00 00 02 C4 0B

01 站地址

03 读输出寄存器

00 00 起始寄存器

00 02 寄存器长度

C4 0B CRC校验

接受到的报文: 01 03 04 01 46 01 3B 5A 59

01 站地址

03 读输出寄存器

04 字节计数 (就是我给你返回多少个字节)

01 46 01 3B 具体的四个字节 (这就是我们要的东西)

5A 59 校验

Modbus论坛

Modbus专题 - 工控上位机 - Powered by Discuz! (dotnetswj.com)

Modbus Poll 安装

链接:https://pan.baidu.com/s/1DThpgsmaUrDjR270oqw0uw?pwd=dq1y
提取码:dq1y

以上是关于Modbus通信协议的主要内容,如果未能解决你的问题,请参考以下文章

LabVIEW实现Modbus通信

LabVIEW实现Modbus通信

LabVIEW实现Modbus通信

ModbusRtu通信报文详解

STM32F103基于W5500实现Modbus简单TCP通信

Modbus通信协议