2、 Modbus RTU报文基本格式
起始应有 不小于3.5个字符的报文间隔 | 目标站号 | 功能码 | 数据 | CRC校验码 |
1字节 | 1字节 | N字节 | 2字节 |
2.1
注:下面对于各请求命令的“应答格式”的描述是指命令被正确执行时的应答格式。若CPU接收到错误的命令或者命令被执行错误,则返回的应答帧中“功能码”部分变为如下数据:功能码的最高位置1后得到的数据。比如功能码为01,若响应错误,则返回的功能码为0x81。
2.1.1 功能码01:读线圈(开关量输出)
请求格式:
目标站号 | 功能码 | 起始地址 高字节 | 起始地址 低字节 | 读取个数 高字节 | 读取个数 低字节 | CRC |
1字节 | 01 | 1字节 | 1字节 | 1字节 | 1字节 | 2字节 |
正确应答格式:
站号 | 功能码 | 返回数据字节数 | 返回数据字节1 | 返回数据字节2 | … | CRC |
1字节 | 01 | 1字节 | 1字节 | 1字节 | … | 2字节 |
2.1.2 功能码02:读输入状态(开关量输入)
请求格式:
目标站号 | 功能码 | 起始地址 高字节 | 起始地址 低字节 | 读取个数 高字节 | 读取个数 低字节 | CRC |
1字节 | 02 | 1字节 | 1字节 | 1字节 | 1字节 | 2字节 |
正确应答格式:
站号 | 功能码 | 返回数据字节数 | 返回数据字节1 | 返回数据字节2 | … | CRC |
1字节 | 02 | 1字节 | 1字节 | 1字节 | … | 2字节 |
2.1.3
请求格式:
目标站号 | 功能码 | 起始地址 高字节 | 起始地址 低字节 | 读取个数 高字节 | 读取个数 低字节 | CRC |
1字节 | 03 | 1字节 | 1字节 | 1字节 | 1字节 | 2字节 |
正确应答格式:
站号 | 功能码 | 返回数据字节数 | 寄存器1高字节 | 寄存器1低字节 | … | CRC |
1字节 | 03 | 1字节 | 1字节 | 1字节 | … | 2字节 |
2.1.4 功能码04:读输入寄存器(模拟量输入)
请求格式:
目标站号 | 功能码 | 起始地址 高字节 | 起始地址 低字节 | 读取个数 高字节 | 读取个数 低字节 | CRC |
1字节 | 04 | 1字节 | 1字节 | 1字节 | 1字节 | 2字节 |
正确应答格式:
站号 | 功能码 | 返回数据字节数 | 寄存器1高字节 | 寄存器1低字节 | … | CRC |
1字节 | 04 | 1字节 | 1字节 | 1字节 | … | 2字节 |
2.1.5 功能码05:写单线圈(开关量输出)
请求格式:
目标站号 | 功能码 | 线圈地址 高字节 | 线圈地址 低字节 | 强制值 高字节 | 强制值 低字节 | CRC校验码 |
1字节 | 05 | 1字节 | 1字节 | 1字节 | 1字节 | 2字节 |
注:强制值= 0xFF00,则置线圈为ON;强制值=0x0000,则置线圈为OFF。
应答格式:
若设置成功,原文返回
2.1.6 功能码06:写单保持寄存器(模拟量输出)
请求格式:
目标站号 | 功能码 | 寄存器地址 高字节 | 寄存器地址 低字节 | 强制值 高字节 | 强制值 低字节 | CRC校验码 |
1字节 | 06 | 1字节 | 1字节 | 1字节 | 1字节 | 2字节 |
应答格式:
若设置成功,原文返回
2.1.7 功能码15:写多线圈(开关量输出)
请求格式:
目标 站号 | 功能码 | 起始地址 高字节 | 起始地址低字节 | 数量 高字节 | 数量 低字节 | 强制值字节数 | 强制值 第1字节 | … | CRC |
1字节 | 15 | 1字节 | 1字节 | 1字节 | 1字节 | 1字节 | 1字节 | … | 2字节 |
正确应答格式:
目标站号 | 功能码 | 起始地址 高字节 | 起始地址低字节 | 数量 高字节 | 数量 低字节 | CRC校验码 |
1字节 | 15 | 1字节 | 1字节 | 1字节 | 1字节 | 2字节 |
2.1.8 功能码16:写多保持寄存器(模拟量输出)
请求格式:
目标 站号 | 功能码 | 起始地址 高字节 | 起始地址低字节 | 数量 高字节 | 数量 低字节 | 强制值字节数 | 强制值1 高字节 | 强制值1 低字节 | … | CRC |
1字节 | 16 | 1字节 | 1字节 | 1字节 | 1字节 | 1字节 | 1字节 | 1字节 | … | 2字节 |
正确应答格式:
目标站号 | 功能码 | 起始地址 高字节 | 起始地址低字节 | 数量 高字节 | 数量 低字节 | CRC 校验码 |
1字节 | 16 | 1字节 | 1字节 | 1字节 | 1字节 | 2字节 |
2.2 Modbus协议中的CRC校验算法
在Modbus RTU协议中,使用CRC作为帧的校验方式。
下面是用C编写的两种CRC算法:
2.2.1 直接计算CRC
WORD
{
}
2.2.2
const UCHAR auchCRCHi[] =
{
} ;
const UCHAR auchCRCLo[] =
{
} ;
WORD CKDNSerialCom::CalCrcFast(const BYTE* puchMsg , WORD usDataLen)
{
}