Modbus协议

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

1.Modbus 协议
1.1 Modbus协议简介
Modbus是由Modicon(现为施耐德电气公司的一个品牌)在1979年为使用可编程逻辑控制器(PLC)而发表的协议。

是全球第一个真正用于工业现场的总线协议。

现已经成为工业领域通信协议标准,并且成为工业电子设备之间最常用的连接方式。

控制器通过Modbus协议,经串行网络、以太网(或其它网络)和各设备之间进行通信。

Modbus协议主要包括Modbus RTU、Modbus ASCII、Modbus TCP。

Modbus协议是一个master/slave 架构的协议。

有一个节点是master 节点,其他使用Modbus协议参与通信的节点是slave 节点。

每一个slave 设备都有一个唯一的地址。

1.2 Modbus协议特点
开放、通用的工业标准;
可靠且免费;
兼容性好,支持多种物理接口,如:RS-232、RS-485、RS-422、以太网等;
支持多种传输介质,如普通线缆、双绞线、光纤、无线等;
报文格式简单、紧凑、易懂、容易开发和使用;
很容易支持不同接口的协议转换;
1.3 Modbus协议架构
Modbus协议包括Modbus RTU、Modbus ASCII、Modbus TCP协议。

1.4 Modbus主/从协议
在同一时刻,只有一个主节点,一个或多个子节点连接于同一个串行总线。

Modbus 通信总是由主节点发起,子节点在没有收到来自主节点的请求时,从不会发送数据,子节点之间从不会互相通信。

主节点在同一时刻只会发起一个Modbus事务处理。

主节点以特定地址访问某个子节点,子节点接到并处理完请求后,子节点向主节点返回一个报文。

一个Modbus 事务处理包含2个报文:一个来自主节点的请求,一个来自子节点的应答。

每个子节点必须有唯一的地址,这样才能区别于其它节点被独立的寻址。

2.Modbus RTU
2.1 Modbus RTU 帧格式
报文开始至少需要有3.5个字符的静止时间,根据使用的通讯参数,很容易计算这个静止时间。

报文帧(ADU: Application Data Unit 应用数据单元)由地址、功能码+ 数据(PDU: Protocol Data Unit 协议数据单元)和CRC校验构成,所有字符位必须是16进制的0-9,A-F。

网络上的设备连续监测网络上的信息,包括静止时间。

当接收第一个地址数据时,每台设备解码以判断是否自己被访问。

发送完最后一个字符后,也有一个3.5个字符的静止时间,然后才能发送一个新的报文。

整个报文帧必须连续发送,如果在发送帧信息期间,出现大于1.5个字符的静止时间,则接收设备将刷新未完成的报文,并假定下一个字节将是一个新报文的地址域。

同样,一个新报文若无3.5个字符的静止时间紧跟前一个报文开始,这将会使两个报文合并,最终CRC 校验失败而产生错误。

2.2 Modbus RTU 帧时序
发送端:发送一帧后至少延时3.5T再发送第二帧,保证一帧数据里各字节之间的延时不能超过1.5T。

接收端:接收一个字节,查询2T时间,看是否有接收到下一个字节,有则这帧数据未完,继续循环接收,没有则默认这帧已经接收完毕。

2.3 Modbus RTU 帧静止时间
帧静止时间和串口通讯参数有关;
例如:通讯参数:9600,N,8,1,
则:1位起始位+8位数据位+1位停止位=10位
波特率=9600bps,也就是说1秒钟传输9600位,则1秒钟传输9600/10=960字节。

显然3.5字符静止时间= (3.5 / 960) * 1000 = 3.65 ms
考虑CPU的负担,在通信速率小于等于19200 bps时,3.5T和1.5T这两个定时必须严格遵守;对于波
特率大于19200 bps的情形,应该使用2个固定的定时值:建议的字符间超时时间:1.5T = 750μs,帧间的超时时间:3.5T = 1.750ms。

2.4 CRC
CRC(Cyclical Redundancy Check):循环冗余码校验
CRC的本质是:模-2除法的余数,采用的除数不同,CRC的类型也就不一样。

通常,CRC的除数用生成多项式来表示。

常用的CRC有:CRC-12、CRC-16、CRC-CCITT、CRC-32。

CRC校验检错能力很强,不能发现的错误的几率仅为0.0047% 以下。

Modbus RTU采用CRC-16做检验,多项式是:X16+X15+X2+1 (X16为(X+1)多项式因子,实际计算用X15+X2+1,Bit15,Bit2,bit0为1,即1000 0000 0000 0101,用右移计算,所以高低位颠倒为A001H)。

2.4.1 “直接计算法”计算CRC
1.预置1个16位的寄存器为十六进制FFFF(即全为1),称此寄存器为CRC寄存器;
2.把第一个8位二进制数据(既通讯信息帧的第一个字节)与16位的CRC寄存器的低8位相异或,把结果
放于CRC寄存器;
3.把CRC寄存器的内容右移一位(朝低位)用0填补最高位,并检查右移后的移出位;
4.如果移出位为0:重复第3步(再次右移一位),如果移出位为1,CRC寄存器与多项式A001(1010 0000 0000
0001)进行异或;
5.重复步骤3和4,直到右移8次,这样整个8位数据全部进行了处理;
6.重复步骤2到步骤5,进行通讯信息帧下一个字节的处理;
7.将该通讯信息帧所有字节按上述步骤计算完成后,得到16位CRC;
8.16位CRC添加在Modbus RTU最后2个字节,先填CRC低8位,再填CRC高8位;
直接计算法比较耗CPU资源,特别是当CPU不强且传输数据量较大的时候,因为每个字节的每个位都要进行一次计算。

2.4.2 “查表法”计算CRC
1.以一个字节为单位,每个字节共有256种情况,先通过计算法将256种状况分别计算出CRC,存在“CRC
表”中(16位CRC合计512字节)。

2.初始化CRC高低字节为RnH = RnL = 0xFF
3.读取信息的当前字节M,计算I = M + RnH
4.用I作为索引查表得出rnH 和rnL
5.计算新的CRC 校验码:RnH = RnL + rnH ; RnL= rnL
6.如果信息没有处理完毕则转入步骤3继续
7.CRC 码计算完毕,结果为RnH 和RnL
查表法计算简单,可以大大加快CRC计算速度,减轻CPU负担,但需要占用512字节内存。

2.5 功能码
01 Read Coil Status
读从站输出位(0X地址) ON/OFF 状态;
常用于读一个或多个输入/输出数字量点的值;
发送报文:
回复报文:
数据部分:
数据字节bits排列:
最后一个数据字节(0C)的最高3个bit无效。

02 Read Input Status
读从站输入位(1X地址)ON/OFF 状态;
不常用;
发送和回复报文同01功能码;
03 Read Holding Registers
读从站保持寄存器(4X地址)的二进制数据;
常用于读一个或多个输入/输出模拟量值(16位数、32位数、浮点数);发送报文:
04 Read Input Registers
读从站输入寄存器(3X 地址)的二进制数据; 不常用;
发送和回复报文同03功能码;
05 Force Single Coil
改变从站一个输出位(0X 地址) ON/OFF 状态; 常用于写入一个数字量输出点的值; 数据字 FF 00 写入“1”,00 00 写入“0”; 发送报文:
回复报文:
06 Preset Single Register
设置从站一个保持寄存器(4X 地址
)的数据; 常用于写入一个模拟量输出值(仅16位数); 发送报文:
回复报文:
15 Force Multiple Coils
改变从站一个或多个输出位(0X 地址) ON/OFF 状态; 常用于写入一个或多个数字量输出点的值;
发送报文:
回复报文:
16 Preset Multiple Registers
设置从站一个或多个保持寄存器(4X地址)的数据;
常用于写入一个或多个模拟量输出值(16位数、32位数、浮点数);
发送报文:
回复报文:
2.6 32位数读写
Modbus地址是奇数或偶数都可以;
占用两个连续的寄存器;
采用Little-endian方式发送数据;
写入32位整数249453(0x3CE6D)到40001、40002:
2.7 常见浮点数传递方法
1.IEEE 754标准的单精度浮点数
标准方法(Modscan)
2.公式法
用16位或32位整数传递工程量,然后根据公式计算出浮点数。

一般会给出具体公式。

3.约定小数位
约定小数位是几位,用16位或32位整数传递有效数,直接移位得到浮点数。

4.寄存器传递小数位
2-3个寄存器传递一个浮点数,其中2个寄存器的16位或32位整数为有效数部分,另一个寄存器为小数位数。

2.8 IEEE 754标准浮点数
2.8.1 IEEE 754标准浮点数使用
Modbus地址是奇数或偶数都可以;
一个浮点数32位,必须要占用两个连续的寄存器;
比如:
读40001浮点数,就是读取40001和40002数据;
读40004浮点数,就是读取40004和40005数据;
颠倒这两个寄存器数据,得到的就是IEEE 754标准的单精度浮点数;
2.8.2 IEEE 754标准的单精度浮点数
计算机内存里二进制排列:
字节:+0+1+2+3
数据:S EEE EEEE E MMM MMMM MMMM MMMM MMMM MMMM
- S:代表符号位,1是负,0是正
- E:偏移127的幂,二进制阶码= (EEEEEEEE) - 127
- M:24位的尾数保存在23位中,只存储23位,最高位固定为1
从二进制到浮点数计算:
F = 1.M(二进制)
V = (-1)^S * 2^(E-127) * F
举例:
计算40001的浮点数:
请求:01 03 00 00 00 02 C4 0B
应答:01 03 04 90 21 C3 6A 57 E6
1.颠倒:C3 6A 90 21
2.展开:1100 0011 0110 1010 1001 0000 0010 0001
3.符号位:S = 1代表负数
幂: E = 1000 0110,十进制的134(0x86),134-127=7
尾数:M = 110 1010 1001 0000 0010 0001
4.尾数前面添加“1.”: F = 1.11010101001000000100001
5.移7位,加负号:V = -11101010.1001000000100001
6.浮点数的整数部分:1110 1010,十进制的234(0xEA)
7.浮点数的小数部分:1001000000100001,计算1*2-1 + 1*2-4 +1*2-11 +1*2-16 = 0.563
这个浮点数是:-234.563
3.Modbus ASCII
3.1 Modbus ASCII 帧格式
以冒号(:[3AH]) 表示信息开始,以回车符(CR[0DH]) 和换行符(LF[0AH]) 表示信息结束。

允许发送的字符为16进制字符0-9,A-F。

网络中设备连续检测并接收到一个冒号( : ) 时,每台设备对地址解码以查明自己是否是被访问的设备。

由于有特定字符做间隔,所以字符之间的最大间隔可长达1s,若大于1s,则接收设备认为出现了一个错误。

典型的信息帧:
3.2 Modbus ASCII 报文分析
Modbus ASCII 发送报文:
3.3 LRC
LRC(Longitudinal Redundancy Check):纵向冗余校验
计算LRC校验:
1.将基本报文(不包括起始冒号和结尾CR、LF),按字节全部累加得到一个字节(丢弃进位);
2.将这个字节取二进制补码(取反并加一,丢弃进位)得到LRC校验字节;
3.将这个LRC校验字节添加到Modbus ASCII基本报文后;
举例:
从站1回复报文:3A 30 31 30 33 30 32 46 46 44 43 31 46 0D 0A
报文解码:: 01 03 02 FF DC 1F CR LF
LRC检验计算:
01+03+02+FF+DC=1E1,留下低字节E1,取反为1E,再加1为:1F
3.4 Modbus RTU报文转换为Modbus ASCII报文
1.Modbus RTU 报文去除最后2个CRC检验字节;
2.计算出剩余报文的LRC校验,并添加这个字节在报文最后;
3.把生成的报文转成连续的字符串,将每一个字符转化成对应的十六进制ASCII码;
4.在报文的开头加上一个字节的起始标记:0x3A(字符“:” );
5.在报文的尾部加上二个字节的结束标记:0x0D 0x0A(CR LF);
举例:
Modbus RTU 发送报文,请求40001值:
01 03 00 00 00 01 84 0A
去除CRC校验字节:84 0A
LRC检验码计算:
01+03+00+00+00+01=05,取反为FA,再加1,得到LRC校验为:FB Modbus ASCII 发送的报文格式:
: 01 03 00 00 00 01 FB CR LF
实际Modbus ASCII 通讯报文:
3A 30 31 30 33 30 30 30 30 30 30 30 31 46 42 0D 0A
4.Modbus TCP
4.1 Modbus TCP 帧格式
通常设备地址由IP地址决定,通过502端口发送数据。

Modbus/TCP中不需要“CRC-16”或“LRC”校验字段。

而是采用TCP/IP 和链路层(以太网)校验和机制来校验分组交换的准确性。

前端6个字节和地址一起共7个字节,称为MBAP报文头(MBAP:Modbus Application Protocol,Modbus 应用协议),MBAP与PDU一起组成了ModbusTCP报文。

事务符通常表示报文的次序,每多一条报文加一,协议符为00 00,表示Modbus应用层协议。

4.2 Modbus TCP 报文
发送报文:
4.3 Modbus RTU报文转换为Modbus TCP报文
1.Modbus RTU 报文去除最后2个CRC检验字节,计算剩下报文的总长度。

2.报文前端加6个字节。

3.如果是请求报文,1-2字节为一个常数(每次加一),3-4字节都为0x00,5-6字节就是上面Modbus基
本报文的总长度。

4.如果是回复报文,1-4字和请求报文的1-4字节一样,5,6字节仍是Modbus基本报文的总长度。

举例:
Modbus RTU 发送报文,请求40001值
01 03 00 00 00 01 84 0A
去除CRC校验字节:84 0A
基本报文前添加6个字节
00 01 00 00 00 06 01 03 00 00 00 01
5.Modbus 协议其它
5.1 异常回复报文
异常回复报文:
异常功能码= 请求功能码+ 80H
5.1.1 Modbus RTU/ASCII 协议异常代码
5.1.2 Modbus TCP协议异常代码
5.2 Modbus协议最大查询/响应数量
注:ModbusRTU报文长度最大不超过256字节(253字节+ 地址1字节+ CRC 2字节) ModbusTCP报文长度最大不超过260字节(253字节+ MBAP报文头7字节)
5.3 Modbus地址范围
Modbus地址X0001,在报文里地址字节对应0000H;
0X 支持65536个位,范围00001-065536;
查询最大可覆盖67535个位,范围00001-067535;
报文中地址范围:0-FFFFH,相当于00001-065536;
一次查询最大2000(7D0H)个位,065536+2000-1=067535;
写入最大可覆盖66335个位,范围00001-066335;
报文中地址范围:0-FFFFH,相当于00001-065536;
一次写入最大800(320H)个位,065536+800-1=066335;
4X 支持65536个字,范围40001-465536;
查询最大可覆盖65660个寄存器,范围40001-465660;
报文中地址范围:0-FFFFH,相当于40001-465536;
一次查询最大125(7DH)个寄存器,465536+125-1=465660;
写入最大可覆盖65635个寄存器,范围40001-465635;
报文中地址范围:0-FFFFH,相当于40001-465536;
一次写入最大100(64H)个寄存器,465536+100-1=465635;
5.4 Modbus通讯优化
PLC内相近数据地址尽量连续排列;
尽量用Modbus标准协议编写从站程序,提高兼容性;
尽量利用01,03,15,16功能码,减少通讯次数,批量读取和写入;
尽量使用Modbus RTU,少用Modbus ASCII;
可以用4X地址来存数字量(一个4X寄存器存16个位),进一步简化上下位软件、减少通讯时间;。

相关文档
最新文档