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在报文数据发送格式上几乎一样,但也存在一些区别,具体体现在:
- 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。
-
两者校验方式不同,ModbusRTU是CRC循环冗余校验,ModbusASCII是LCR纵向冗余校验。
-
在Modbus标准中,RTU是必须要求的,而ASCII是可选项,即作为一个Modbus通信设备可以只支持RTU,也可以同时支持RTU和ASCII,但不能只支持ASCII。
ModbusRTU\\ASCII报文格式:
从站地址(设备编号)(一个byte)+ 功能码(一个byte)+数据(n个byte)+校验(2个byte)
从站地址 | 功能码 | 数据 | CRC/LRC |
---|---|---|---|
1 byte | 1 byte | N bytes | 2 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通信协议的主要内容,如果未能解决你的问题,请参考以下文章