[西门子] Modbus RTU 串口通信协议概述

[复制链接]
查看105 | 回复0 | 2024-4-23 19:18:23 | 显示全部楼层 |阅读模式
Modbus RTU 串口通信协议概述
一、Modbus RTU 通信协议概述:
1、Modbus RTU 协议是Modicon公司首先推出的通信协议;
2、Modbus RTU 协议是一种主从式串行异步半双工通信协议;
3、Modbus RTU 协议是一种基于RS485\RS422\RS232物理层的通信协议;
4、Modbus RTU协议通信中每个字符通信格式规定为1个起始位、8个数据位、1个校验位、1\2个停止位
5、Modbus RTU协议传输过程中每1个字节都以16进制方式直接进行传输;
6、Modbus RTU 协议使用CRC校验作为错误检查。
二、Modbus RTU 通信协议数据格式:
起始符
地址码
功能码
数据区
校验码
结束符
大于等于3.5字符时间
8位
8位
N*8位
16位
大于等于3.5字符时间
1、起始符:以大于等于3.5个字符时间作为一帧数据的开始;
2、地址码:从站的地址,其理论范围为1~254;
3、功能码:主站发送,告诉从站执行的功能,其范围为1~255;
4、数据区:具体数据内容,不同功能码内容不同;
5、校验码:CRC校验码,检验码的范围由地址码开始到数据区结束;
6、结束符:以大于等于3.5个字符时间作为一帧数据的结束;
三、Modbus RTU 通信协议寄存器种类:
寄存器
种类


与PLC
比较
举例
说明
线圈状态
(Coil Status)
数字量输出、继电器输出
可读可写
DO数字量输出或
内部读写位变量
电磁阀输出、继电器
离散输入状态
(Input Status)
数字量输入
只读
DI数字量输入或
内部只读位变量
按钮输入、拨码开关
接近开关
保持寄存器
(Holding Register)
输出参数、保持参数
可读可写
AO模拟量输出或
内部读写寄存器
模拟量输出设定、
变量阀输出大小
输入寄存器
(Input Register)
输入参数
只读
AI模拟量输入或
内部只读寄存器
模拟量输入、
现场工程量信号采集
四、Modbus RTU 通信协议寄存器地址分配:
寄存器种类
寄存器编号
寄存器地址
支持功能码
读写状态
线圈状态
000001~065536
0000H~FFFFH
01、05、15
可读可写
离散输入状态
100001~165536
0000H~FFFFH
02
只读
保持寄存器
400001~465536
0000H~FFFFH
03、06、16、23
可读可写
输入寄存器
300001~365536
0000H~FFFFH
04
只读
五、Modbus RTU 通信协议功能码说明:
功能码
功能
寄存器编号
寄存器地址
位/字操作
操作数量
01
读线圈状态
000001~065536
0000H~FFFFH
位操作
读1~2000
02
读离散输入状态
100001~165536
0000H~FFFFH
位操作
读1~2000
03
读保持寄存器
400001~465536
0000H~FFFFH
字操作
读1~125
04
读输入寄存器
300001~365536
0000H~FFFFH
字操作
读1~125
05
写单个线圈
000001~065536
0000H~FFFFH
位操作
写1
06
写单个寄存器
400001~465536
0000H~FFFFH
字操作
写1
15
写单个或多个线圈
000001~065536
0000H~FFFFH
位操作
写1~1968
16
写单个或多个保持寄存器
400001~465536
0000H~FFFFH
字操作
写1~123
23
读写单个或多个保持寄存器
000001~065536
0000H~FFFFH
字操作
读1~125、写1~121
六、Modbus RTU 通信协议CRC校验:
生成CRC校验值的过程如下:
1、预置一个值为FFFFH的16位寄存器,此寄存器为CRC寄存器;
2、把通信数据帧的第1个8位二进制数据与CRC寄存器的低8位进行异或运算,
  异或的结果扔存放于该CRC寄存器中;
3、把CRC寄存器的内容右移1位,用0填补最高位,并检测移出的位是0还是1;
4、如果移出的位为0,则重复步骤3,如果移出的位为1,则CRC寄存器与A001A进行异或运算;
5、重复步骤3和4,直到右移8次,这样通信数据帧的第1个8位二进制数据就全部进行了处理;
6、重复步骤2、3、4、5,依次进行通信数据帧中的剩余字节;
7、将该通信数据帧中所有字节数据按上述步骤计算完成后,得到的16位CRC寄存器的高、低8位进行交换;
8、最后得到的CRC寄存器内容即为CRC校验码、
常用的CRC-16算法有查表和计数法,具体可查阅相关资料。
Modbus RTU 串口通信协议功能码格式
一、Modbus RTU通信协议01(0x01)功能码报文格式详解:
Modbus RTU主站发送:
名称
从站地址
功能码
寄存器地址
寄存器数量
CRC校验
数量
02
01
00
02
00
04
9C
3A









Modbus RTU从站正确返回:
名称
从站地址
功能码
字节计数
寄存器数据
CRC校验
数量
02
01
01
03
11
CD
Modbus RTU从站异常返回:
名称
从站地址
功能码
错误代码
CRC校验
数量
02
81
02
31
91
ModbusSlave作从站,串口助手作主站

读从站(地址为2)第3个位开始连续4个离散量输出,返回结果为03(H)二进制0011
二、Modbus RTU通信协议02(0x02)功能码报文格式详解:
Modbus RTU主站发送:
名称
从站地址
功能码
寄存器地址
寄存器数量
CRC校验
数量
03
02
00
03
00
04
88
2B









Modbus RTU从站正确返回:
名称
从站地址
功能码
字节计数
寄存器数据
CRC校验
数量
03
02
01
0F
E0
34
Modbus RTU从站异常返回:
名称
从站地址
功能码
错误代码
CRC校验
数量
03
82
02
60
A1
ModbusSlave作从站,串口助手作主站

读从站(地址为3)第4个位开始连续4个离散量输入,返回结果为0F(H)二进制1111
三、Modbus RTU通信协议03(0x03)功能码报文格式详解:
Modbus RTU主站发送:
名称
从站地址
功能码
寄存器地址
寄存器数量
CRC校验
数量
02
03
00
00
00
04
44
3A









Modbus RTU从站正确返回:
名称
从站地址
功能码
字节计数
寄存器数据
CRC校验
数量
02
03
08
00
7B
01
C8
03
15
03
F2
21
60














Modbus RTU从站异常返回:
名称
从站地址
功能码
错误代码
CRC校验
数量
02
83
02
30
F1
ModbusSlave作从站,串口助手作主站

读从站(地址为2)第1个字节开始连续4个保持寄存器数据,返回结果为00 7B 01 C8 03 15 03 F2 (H)十进制为 123、456、789、1010
四、Modbus RTU通信协议04(0x04)功能码报文格式详解:
Modbus RTU主站发送:
名称
从站地址
功能码
寄存器地址
寄存器数量
CRC校验
数量
02
04
00
00
00
04
F1
FA









Modbus RTU从站正确返回:
名称
从站地址
功能码
字节计数
寄存器数据
CRC校验
数量
02
04
08
03
F2
03
15
01
C8
00
7B
75
42














Modbus RTU从站异常返回:
名称
从站地址
功能码
错误代码
CRC校验
数量
02
84
02
32
C1

读从站(地址为2)第1个字节开始连续4个输入寄存器数据,返回结果为03 F2 03 15 01 C8 00 7B (H)十进制为 1010、789、456、123
五、Modbus RTU通信协议05(0x05)功能码报文格式详解:
Modbus RTU主站发送:
名称
从站地址
功能码
寄存器地址
寄存器数据
CRC校验
数量
02
05
00
03
FF
00
7C
09









Modbus RTU从站正确返回:
名称
从站地址
功能码
寄存器地址
寄存器数据
CRC校验
数量
02
05
00
03
FF
00
7C
09









Modbus RTU从站异常返回:
名称
从站地址
功能码
错误代码
CRC校验
数量
02
85
02
33
51
ModbusSlave作从站,串口助手作主站

写从站(地址为2)单个线圈第4个位为ON或OFF,(请求数据域中的常量说明请求的 ON/OFF 状态。
十六进制值 FF 00 请求输出为 ON。十六进制值00 00 请求输出为 OFF。其它所有值均是非法的,并且对输出不起作用。正常响应是请求的应答,在写入线圈状态之后返回这个正常响应。)
六、Modbus RTU通信协议06(0x06)功能码报文格式详解:
Modbus RTU主站发送:
名称
从站地址
功能码
寄存器地址
寄存器数据
CRC校验
数量
02
06
00
03
EF
AC
35
B4









Modbus RTU从站正确返回:
名称
从站地址
功能码
寄存器地址
寄存器数据
CRC校验
数量
02
06
00
03
EF
AC
35
B4









Modbus RTU从站异常返回:
名称
从站地址
功能码
错误代码
CRC校验
数量
02
86
02
33
A1
ModbusSlave作从站串口,助手作主站写从站(地址为2)单个寄存器第4个字节为EF AC或为00 00

七、Modbus RTU通信协议15(0x0F)功能码报文格式详解:
Modbus RTU主站发送:
名称
从站地址
功能码
寄存器地址
寄存器数量
寄存器字节数
寄存器输出值
CRC校验
数量
02
0F
00
00
00
0F
02
CD
0C
A5
91












Modbus RTU从站正确返回:
名称
从站地址
功能码
寄存器地址
寄存器数量
CRC校验
数量
02
0F
00
00
00
0F
15
FC









Modbus RTU从站异常返回:
名称
从站地址
功能码
错误代码
CRC校验
数量
02
8F
02
35
F1
ModbusSlave作从站,串口助手作主站

写从站(地址为2)多个离散量输出数值,这是一个请求从线圈 00 开始写入 15 个线圈的实例:
请求的数据内容为两个字节:十六进制 CD 0C (二进制 1100 1101 0000 1100)。使用下列方法,
二进制位对应输出。
位: 1   1   0   0   1   1   0   1   0   0   0   0   1    1    0   0
输出:7 6   5   4   3   2   1   0   -   -   -   -   11   10   9   8
传输的第一字节(十六进制 CD)寻址为输出7-0,在这种设置中,最低有效比特寻址为最低输出(0).
传输的下一字节(十六进制0C)寻址为输出11-8,在这种设置中,最低有效比特寻址为最低输出(8).
用零填充最后数据字节中的未使用位。
八、Modbus RTU通信协议16(0x10)功能码报文格式详解:
Modbus RTU主站发送:
名称
从站地址
功能码
寄存器地址
寄存器数量
寄存器字节数
寄存器数据(N字节数)
CRC校验
数量
01
10
00
00
00
02
04
FB
AC
E0
21
8B
72














Modbus RTU从站正确返回:
名称
从站地址
功能码
寄存器地址
寄存器数量
CRC校验
数量
01
10
00
00
00
02
E0
34









Modbus RTU从站异常返回:
名称
从站地址
功能码
错误代码
CRC校验
数量
01
90
03
0C
01
ModbusSlave作从站,串口助手作主站
这是一个请求将十六进制FB AC 和 E0 21 (或请求将十六进制 00 00 和00 00)写入从 0 开始的两个寄存器的实例:

九、Modbus RTU通信协议23(0x17)功能码报文格式详解:
Modbus RTU主站发送:
名称
从站地址
功能码
读寄存器地址
读寄存器数量
写寄存器地址
写寄存器数量
写寄存器字节
写寄存器数据
(N*2个字节)
CRC校验
数量
02
17
00
00
00
03
00
05
00
01
02
E0
A2
18
98
















Modbus RTU从站正确返回:
名称
从站地址
功能码
字节计数
寄存器数据
CRC校验
数量
02
17
06
04
D2
11
D8
0E
72
8D
AE












Modbus RTU从站异常返回:
名称
从站地址
功能码
错误代码
CRC校验
数量
02
97
02
3F
F1
ModbusSlave作从站,串口助手作主站
名称(主站发送)
数量
名称(从站正确返回)
数量
从站地址
02
从站地址
02
功能码
17
功能码
17
读寄存器地址(Hi)
00
读寄存器字节数
06
读寄存器地址(Lo)
00
读寄存器值(Hi)
04
读寄存器数量(Hi)
00
读寄存器值(Lo)
D2
读寄存器数量(Lo)
03
读寄存器值(Hi)
11
写寄存器地址(Hi)
00
读寄存器值(Lo)
D8
写寄存器地址(Lo)
06
读寄存器值(Hi)
0E
写寄存器数量(Hi)
00
读寄存器值(Lo)
72
写寄存器数量(Lo)
03
CRC校验码Hi
8D
写寄存器字节数
06
CRC校验码Lo
AE
写寄存器的值Hi
AB


写寄存器的值Lo
CD


写寄存器的值Hi
12


写寄存器的值Lo
EA


写寄存器的值Hi
34


写寄存器的值Lo
AC


CRC校验码Hi
5A


CRC校验码Lo
DA








免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册哦

x
您需要登录后才可以回帖 登录 | 注册哦

本版积分规则