Modbus通信协议详解
Modbus RTU通信协议在数据通信中采用主从式响应。仅主机(PC、HMI等。)可以通过唯一的从机地址发起请求,从机(终端设备)可以根据主机请求做出响应,即半双工通信。这个协议只允许主设备发起请求,从设备被动响应,所以从设备不会主动占用通信线路造成数据冲突。
类似Modbus RTU协议的主从响应协议有西门子的PPI和电表常用的DL/T645-2007。
一、modbus协议格式信息传输是异步的,通信使用十六进制。信息框格式:
地址代码
操作码
数据区
CRC校验码
1字节
1字节
n字节
2字节
地址码地址码是每个通信信息帧的第一个字节,一般支持1到247。有些设备还支持0地址,用来接收主机的广播数据。每个从机在总线上必须有唯一的地址,只有与主机发送的地址码匹配的从机才能响应返回的数据。
功能码功能码是每个通信信息帧的第二个字节。主机发送,通过功能代码告诉从机应该执行什么操作。
八个常用功能代码:
操作码
定义
操作
01H
阅读线圈
读取一个或多个连续线圈状态
05H
写一个单线圈
指定操作位置的线圈状态
0FH
写入多个线圈
操作多个连续线圈状态
02H
读取离散输入
读取一个或多个连续离散输入状态
04H
读取输入寄存器
读取一个或多个连续输入寄存器的数据
03H
读取和保持寄存器
读取一个或多个保持寄存器的数据
06H
写一个单保持寄存器。
将两个十六进制数据写入相应的位置。
10小时
写保持寄存器
将4*N个十六进制数据写入N个连续保持寄存器
数据区数据区因功能代码和数据方向不同而不同。这些数据可以是不同的组合,例如“在寄存器地址头部读取的寄存器数量”、“寄存器地址的操作数据”和“在寄存器地址头部注册的寄存器数量的数据长度数据”。不同功能代码的数据区在“功能代码分析”中有详细说明。
Modbus CRC校验Modbus RTU协议是常用的,工业现场对数据传输的稳定性和正确性有较高的要求,所以CRC校验保证了数据传输的正确性和完整性。
二、错误反馈地址和CRC校验错误不会从从机接收数据反馈,其他错误会向主机返回错误代码。将0X80加到数据的第二位表示请求有错误(非法功能代码、非法数据值等。).错误数据帧如下:
地址代码
操作码
错误代码
CRC校验码
1字节
1字节
1字节
2字节
常见错误代码如下:
价值
名字
解释
01H
的非法功能代码
不支持此功能代码操作寄存器。
02H
的非法注册地址
器件访问禁止访问的寄存器。
03H
的非法数据值
写入不支持的参数值。
04H
从属故障
设备运转不正常。
三、当通信命令从主机发送到从机时,匹配主机发送的地址码的从机接收通信命令。如果CRC校验正确,它将执行相应的操作,然后将执行结果(数据)返回给主机。返回的信息包含地址码、功能码、执行数据和CRC校验码。如果地址不匹配或CRC校验错误,将不会返回任何信息。
四、功能代码分析功能代码01H:读取线圈例如,如果主机想要读取从机地址为01H、起始线圈地址为00H的线圈的状态,主机发送:
主机发送
发送数据(十六进制)
地址代码
01
操作码
01
起始线圈地址
高位字节
00
低位字节
00
弹簧圈数
高位字节
00
低位字节
01
CRC校验
低位字节
软驱
高位字节
加拿大
如果从寄存器00H线圈闭合,从寄存器返回:
奴隶回归
发送数据(十六进制)
地址代码
01
操作码
01
字节数
01
线圈状态
01
CRC校验码
低位字节
90
高位字节
48
模拟演示:
代码0FH:写多个线圈。例如,如果主机想要控制四个线圈状态,从机地址为01H,起始线圈地址为00H,主机发送:
主机发送
发送数据(十六进制)
地址代码
01
操作码
0F
起始线圈地址
高位字节
00
瞧
弹簧圈数
高位字节
00
低位字节
04
写入的字节数
01
控制方式
00(全部打开),0F(全部关闭)
CRC校验
低位字节
xx
高位字节
xx
代码0FH运行,从机返回:
奴隶回归
发送数据(十六进制)
地址代码
01
操作码
0F
起始线圈地址
高位字节
00
低位字节
00
弹簧圈数
高位字节
00
低位字节
04
CRC校验
低位字节
54
高位字节
08
模拟演示:
代码02H:读取离散输入。例如,主机希望读取四个输入状态,从机地址为01H,初始离散地址为00H。主发送:
主机发送
发送数据(十六进制)
地址代码
01
操作码
02
起始离散数量地址
高位字节
00
低位字节
00
读取数量
高位字节
00
低位字节
04
CRC校验
低位字节
79
高位字节
补体第九成分
如果从机头地址00H的所有4个离散输入检测到输入,从机返回:
奴隶回归
发送数据(十六进制)
地址代码
01
操作码
02
字节数
01
离散输入状态
0F
CRC校验码
低位字节
E1
高位字节
8C
模拟演示:
代码04H:读取输入寄存器。例如,如果主机想要读取从机地址为01H、起始寄存器地址为02H的输入寄存器的数据,主机发送:
主机发送
发送数据(十六进制)
地址代码
01
操作码
04
起始寄存器地址
高位字节
00
低位字节
02
寄存器数量
高位字节
00
低位字节
01
CRC校验
低位字节
90
高位字节
得一个例子
如果从机输入寄存器02H中的数据为3344H,从机返回:
奴隶回归
发送数据(十六进制)
地址代码
01
操作码
04
字节数
02
05H寄存器数据
高位字节
33
低位字节
四十四
CRC校验码
低位字节
广告
高位字节
第三子代
模拟演示:
代码03H:读取保持寄存器。例如,主机想要读取两个保持寄存器数据,从机地址为01H,起始寄存器地址为05H,主机发送:
主机发送
发送数据(十六进制)
地址代码
01
操作码
03
起始寄存器地址
高位字节
00
低位字节
05
寄存器数量
高位字节
00
低位字节
02
CRC校验
低位字节
D4
高位字节
得一个例子
如果从机将寄存器05H和06H的数据保存为1122H和3344H,则从机返回:
奴隶回归
发送数据(十六进制)
地址代码
01
操作码
03
字节数
04
05H寄存器数据
高位字节
11
低位字节
22
06H寄存器数据
高位字节
33
低位字节
四十四
CRC校验码
低位字节
4B
高位字节
溴化六烃季胺
模拟演示:
代码06H:写入单个保持寄存器。例如,主机将9988H数据写入从机地址为01H、寄存器地址为0050H的寄存器,主机发送:
主机发送
发送数据(十六进制)
地址代码
01
操作码
06
寄存器地址
高位字节
00
低位字节
50
写入值
高位字节
99
低位字节
88
CRC校验
低位字节
E3
高位字节
急诊科
从机返回与主机请求相同的内容;
功能代码10H:写入多个保持寄存器。例如,主机希望将数据0005H和2233H保存到两个寄存器中,从机地址为01H,起始寄存器地址为0020H。主发送:
主机发送
发送数据(十六进制)
地址代码
01
操作码
10
起始寄存器地址
高位字节
00
低位字节
20
寄存器数量
高位字节
00
低位字节
02
写入的字节数
04
0000小时
要写入的寄存器
高位字节
00
低位字节
05
0001H
要写入的寄存器
高位字节
22
低位字节
33
CRC校验
低位字节
B9
高位字节
03
功能代码10H操作,从机返回:
奴隶回归
发送数据(十六进制)
地址代码
01
操作码
10
起始寄存器地址
高位字节
00
低位字节
20
寄存器数量
高位字节
00
低位字节
02
CRC校验
低位字节
40
高位字节
02
模拟演示:
审计唐子红
标签:数据主机地址