MODBUS通信协议,功能码,RCR校验

MODBUS通信模式最主要有两种:

RTU模式和ASCII模式。

RTU模式:

地址码 功能码 数据 校验码
一字节 一字节 n字节 两字节(CRC)

从机都有相应的地址码,便于主机识别。其中数据已帧为单位进行数据传输,每帧最长为252字节,最短为0。如果一byte数据的传输时间为T,那么每两帧之间的间隔最小应该要大于3.5T,否则从机不能分辨这是两帧。第二,同一帧连续的两个数据之间的间隔时间不能超过1.5T,否则节点会认为这一帧数据不完整,这说明我们在modbus传输的时候要使能一个定时器的工作。

ASCII模式:

起始 地址码 功能码 数据 校验 回车换行
字符  ':'(冒号) 两字节 两字节 0到2 * 252字节 两字节(LRC校验) 两字节(CR,LF)

帧的起始一字符 ' : '冒号开始,结束为回车换行,其对应的16进制可以到ASCII表中进行查询。字节间传输的间隔时间不能大于1s,大于1s认为这一帧数据丢失.同样我们可以计算出来ASCII帧的最大长度是513字节。

RTU使用CRC校验ASCII使用LRC校验。

正确的应答格式:

地址码 功能码 数据码 校验
从机自己的 与发送的保持一致(范围:0x00-0x7f) 根据功能需求 校验码

错误应答:

功能码加0x80,原本功能码最高位不会为1,加0x80最高位为1,判断出错,数据位的异常码可以知道大概是什么错误。

地址码 功能码 数据码 校验
从机自己的 与发送的保持一致(范围:0x00-0x7f) + 0x80 异常码 校验码

异常码:

功能码:

0x01: 读线圈寄存器(可读可写线圈)
0x02: 读离散输入寄存器(可读不可写线圈)
0x03: 读保持寄存器(可读可写寄存器)
0x04: 读输入寄存器(可读不可写寄存器)
0x05: 写单个线圈寄存器(可写单个线圈不可读)
0x06: 写单个保持寄存器(可写单个寄存器不可读)
0x0f: 写多个线圈寄存器(可写多个线圈不可读)
0x10: 写多个保持寄存器(可写多个寄存器不可读)

01H-->读线圈寄存器

  地址码 功能码 数据 校验
发送 01 01 00 20 00 05 FD C3
响应 01 01 01 15 90 47

发送数据:读取地址:00 20,从0x20处开始读取,00 05 读取5个寄存器。

响应数据:01,只有5个寄存器,小于8,5/8=0,加1,所以为1,假设有9个,则为02,以此类推。15,二进制:00010101,在5个寄存器中有3个处于开的状态,在此功能下只能读取从机状态。

02H--->读离散输入寄存器

  地址码 功能码 数据 校验
发送 01 02 00 20 00 05 B9 C3
响应 01 02 01 02 20 49

发送数据:读取地址:00 20,从0x20处开始读取,00 05 读取5个寄存器。

响应数据:01,只有5个寄存器,小于8,5/8=0,加1,所以为1,假设有9个,则为02,以此类推。02,二进制:00000010,在5个寄存器中有1个处于开的状态,在此功能下只能读取从机状态。

03-->读保持寄存器

  地址码 功能码 数据 校验
发送 01 03 00 14 00 03 45 CF
响应 01 03 06 00 14 00 1E 00 00 71 70

发送数据:读取地址:00 20,从0x20处开始读取,00 05 读取3个寄存器。

响应数据:06,后面有6位,00 14,发送的数据0x14,00 1E发送的数据0x1E,00 00发送的数据0X00。

04--> 读输入寄存器

  地址码 功能码 数据 校验
发送 01 04 00 14 00 03 F0 0F
响应 01 04 06 00 14 00 1E 00 00 30 96

发送数据:读取地址:00 20,从0x20处开始读取,00 05 读取3个寄存器。

响应数据:06,后面有6位,00 14,发送的数据0x14,00 1E发送的数据0x1E,00 00发送的数据0X00。

05-->写单个线圈寄存器

  地址码 功能码 数据 校验
发送 01 05 00 20 00 00 CC 00
响应 01 05 00 20 00 00 CC 00

发送数据:读取地址:00 20,从0x20处开始写入,00 00 写入值。

响应数据:跟发送的一样。

06-->写单个保持寄存器

  地址码 功能码 数据 校验
发送 01 06 00 01 00 03 XX XX
响应 01 06 00 01 00 03 XX XX

发送数据:读取地址:00 20,从0x20处开始写入,00 03 写入值。

响应数据:跟发送的一样。

0F-->写多个线圈寄存器

  地址码 功能码 数据 校验
发送 01 0F 00 14 00 03 01 00 CC 00
响应 01 0F 00 14 00 03 CC 00

发送数据:读取地址:00 20,从0x20处开始写入,00 03 写入3个值,01,3小于8,00,写入的3个数据都为0。

响应数据:00 14,写入地址,00 03,3个数据。

10-->写多个保持寄存器

  地址码 功能码 数据 校验
发送 01 10 00 34 00 02 04 0C 02 12 45 XX XX
响应 01 10 00 34 00 02 XX XX

发送数据:读取地址:00 34,从0x34处开始写入,00 02 写入2个值,04后面有4位,0C 02和12 45都为数据。

响应数据:00 14,写入地址,00 02,2个数据。

CRC校验:

猜你喜欢

转载自blog.csdn.net/qq_38531460/article/details/109244940