先来讲些直白的东西:
1. modbus是一个通信协议簇,包括modbus-RTU,modbus-ASCII,modbus-TCP
2. modbus是一个主/从通信协议,即主机发送请求后,从机响应相应数据;modbus网络上只能有一个主机存在,主机在网络上没有地址,而从机的设备地址从0-247,其中0为广播地址,即从机的设备地址范围为1-247
3. modbus协议可以以多种方式传播,如RS232,RS485,无线电,光纤等
4. modbus协议的不足之处,在于它的主从结构。为了解决这个问题,其它现场总线系统采取令牌传递的措施,谁拿到令牌,谁就可以作为主站,继而可以主动发送信息。
5. modbus协议曾经是莫迪康公司的协议,它的特点是公开透明,并且不收费,很快就为全世界所接受,后来莫迪康公司经营不善被施耐德公司收购,但施耐德继承了莫迪康公司的初衷,对于modbus-RTU依然不收费
什么是通信协议
通信协议包含两层意思:
1. 数据双方交换的接口(如DB9)、数据交换线路(如485)、字节格式、消息帧格式等
2. 数据点表,即数据在存储区中的保存格式和定义(如)
modbus-RTU的字节格式
每个字节由2个十六进制组成(即8位二进制),格式如下:
1个起始位
8个数据位,最小的有效位先发送
1个校验位,如不需要校验时取消
1个停止位(有校验时),2个停止位(无校验时)
即,对于每个8bit的数据位前后进行了封装
modbus-RTU的消息帧格式
START |
ADDRESS (设备地址) |
FUNCTION (功能码) |
DATA | CRC | END |
至少3.5个字符间隔的时间 | 8bits | 8bits | N_8bits | 16bits | 至少3.5个字符间隔的时间 |
消息帧格式中的每个模块中,每8bits都被上面的字节格式所封装,例如传输ADDRESS时,在8bits前面加起始位,后面加校验位、停止位;传输DATA时,每8bits数据进行同样的封装;
3.5个字符间隔的时间如何计算?
以波特率=9600来计算,3.5*11/9600=4ms,即接收方以4ms的时间停顿来区分每一组消息帧,之所以是11,是因为1位起始位,8位数据位,1位校验位,1位停止位
modbus-ASCII的消息帧格式
START | ADDRESS(设备地址) | FUNCTION(功能码) | DATA | CRC | END |
: | 8bits | 8bits | N_8bits | 8bits?/16bit? | chr(10)+chr(13) |
备注:
chr(13)表示回车,即 ,光标回到当前行的开头却不下移一行
chr(10)表示换行,即 ,光标垂直下移一行,却不会移到该行开头
chr(10) + chr(13),即 ,相当于Enter键的作用
modbus的设备地址
设备地址范围1 - 247,其中0表示广播地址,所有设备都能接收
modbus的功能码
功能码表示执行什么操作
功能码 | 作用 | 备注 |
01(0x01) | 读线圈状态 | 读1bit变量 |
02(0x02) | 读离散输入 | 读1bit变量 |
03(0x03) | 读保持寄存器 | 读16bit变量 |
04(0x04) | 读输入寄存器 | 读16bit变量 |
05(0x05) | 写单个线圈 | 写单个1bit变量 |
06(0x06) | 写单个寄存器 | 写单个16bit变量 |
15(0x0F) | 写多个线圈 | 写多个1bit变量 |
16(0x10) | 写多个寄存器 | 写多个16bit变量 |
22-64 | 保留作扩展用 | |
65-72 | 用户功能扩展 | |
128-255 | 保留用作异常应答 |
这里需要提一下modbus标准中定义的4个数据块,基于数据块的长度,可以将4种数据块分为两类:位(BIT)数据和寄存器(REG)数据
在使用过程中需要用户配置的参数(物理层的设备参数)
1. 串口通信参数(通信接口、波特率、校验方式、数据位【通常为8位】、停止位【通常为1-2位】等)
2. 传输模式(RTU、ASCII、TCP)
通信参数的作用是规范收发双方传输格式,如果双方传输格式不一样,接收方就不可能正确判断发送方发来的数据是什么
举例
1. 某modbus控制器,以ASCII的方式发送了一串数据:“: 01031000000FDD”+ Chr(13)+Chr(10)
报文分析:
01:从机地址(设备地址);
03:功能码,表示读保持寄存器
1000:DATA,表示要读取的起始寄存器的地址
000F:DATA,表示要读取的寄存器的个数
DD:CRC校验和
Chr(13)+Chr(10):结束符
该报文含义:从地址是01的从机的地址为0x1000的寄存器开始,连续读取15个寄存器的数据
2. 某modbus控制器,以RTU的方式发送了一串数据:“01 06 00 01 00 17 98 04”
01:从机地址(设备地址);
06:功能码,表示写单个寄存器
0001:DATA,表示要写入的起始寄存器的地址
0017:DATA,表示要写入寄存器的数据
9804:CRC校验和
该报文含义:向地址是01的从机的地址为0x0001的寄存器开始,写入数据0x0017
最后,可以搭配 MThings软件,实战学习
参考博客:
https://blog.csdn.net/liboxiu/article/details/79030776
https://blog.csdn.net/zhoutanliang/article/details/108791796
https://blog.csdn.net/weixin_33759269/article/details/93344453
https://www.zhihu.com/question/334573419/answer/752045857