网站首页 > 编程文章 正文
1. MODBUS的功能码及寄存器介绍
1.1 功能码
下表列出 MODBUS支持的部分功能代码:以十进制表示
功能码 (十进制) | 作用 | 信息地址 | 位操作/字操作 | 操作数量 |
01 | 读单个/多个DO寄存器 | 00001-09999 | 位操作 | 单个/多个 |
02 | 读单个/多个DI寄存器 | 10001-19999 | 位操作 | 单个/多个 |
03 | 读单个/多个AO寄存器 | 40001-49999 | 字操作 | 单个/多个 |
04 | 读单个/多个AI寄存器 | 30001-39999 | 字操作 | 单个/多个 |
05 | 写单个DO寄存器 | 00001-09999 | 位操作 | 单个 |
06 | 写单个AO寄存器 | 40001-49999 | 字操作 | 单个 |
15 | 写单个/多个DO寄存器 | 00001-09999 | 位操作 | 单个/多个 |
16 | 写单个/多个AO寄存器 | 40001-49999 | 字操作 | 单个/多个 |
1.2 寄存器分类说明
寄存器种类 | 说明 |
DI寄存器 | 只读,主要用于读模块的DI离散量输入信号的 ON/OFF状态。 |
DO寄存器 | 可读/可写,主要用于控制相应DO输出,例如:Y点的开关状态。也可以用于控制某些功能的启动或停止、打开或关闭,例如:PWM的输出/停止,计数的清空等。 |
AI寄存器 | 只度,主要用于读取模块中的输入型数据,例如AD模拟采集到的电压值,电流值,压力值等,或者X输入脉冲计数值等。 |
AO寄存器 | 可读/可写,主要用于存放的用户下发的参数,例如AO模拟量输出值、PWM输出频率、占空比等。 |
1.3 寄存器地址说明
寄存器信息地址(PLC地址):
寄存器信息地址指的是存放于控制器中的地址,这些控制器可以是 PLC,也可以使触
摸屏,或是文本显示器。例如 4x0001、3x0002等,这些地址一般使用十进制描述。
寄存器寻址地址(协议地址):
寄存器寻址地址指的是通信时使用的寄存器地址,例如信息地址 40001对应寻址地址
0x0000,40002对应寻址地址 0x0001,寄存器寻址地址一般使用 16进制描述。再如,信息寄存器 40003对应寻址地址 0002,信息寄存器 30003对应寻址地址 0002,虽然两个信息寄存器通信时使用相同的地址,但是需要使用不同的命令才可以访问,所以访问时不存在冲突。
一、 MODBUS-RTU协议详解
1. X输入口开关量状态读取 (读取:DI寄存器,命令号:0x02)
描述
读模块的X输入口输入信号的 ON/OFF状态。
例子:读X1当前输入状态的请求&响应报文
请求:
发送数据(HEX): 01 02 00 00 00 01 B9 CA
解释:
01:子站地址
02:指令号,02读DI
00 00:从哪一路开始读,0x0000=X1开始读
00 01:要读多少路,十六进制0x0001=十进制1,读取1路
B9 CA:CRC校验
响应:
//X1 输入ON(1)时的回复
01 02 01 01 60 48
解释:
01:子站地址
02:指令号,02读DI
01:后面跟的数据字节数
01:换成二进制就是 0000 0001 =X8-X7-X6-X5-X4-X3-X2-X1输入口的当前状态0=OFF,1=ON
60 48:CRC校验
//X1 输入OFF(0)时的回复
01 02 01 00 A1 88
解释:
01:子站地址
02:指令号,02读DI
01:后面跟的数据字节数
00:换成二进制就是 0000 0000 =X8-X7-X6-X5-X4-X3-X2-X1输入口的当前状态0=OFF,1=ON
A1 88:CRC校验
2. X输入口脉冲计数读取 (读取:AI寄存器,命令号:0x04)
描述
读模块的X输入口的脉冲计数值。
例子:读当前X1输入点脉冲计数值的请求&响应报文
请求:
发送数据(HEX): 01 04 00 18 00 02 F1 CC
解释:
01:子站地址
04:指令号,04读AI
00 18:从哪一路开始读,0x0018对应的是X1脉冲计数寄存器起始地址
00 02:要读多少个寄存器,因为一路X脉冲计数占用2个寄存器地址,所以这里寄存器数量要填2,十六进制0x0002=十进制2
F1 CC:CRC校验
响应:
接收数据(HEX): 01 04 04 00 00 27 10 E1 B8
解释:
01:子站地址
04:指令号,04读AI
04:后面跟的数据字节数,0x04=十进制4,后面数据区有4字节数据
00002710:换成十进制就是 0x00002710 =10000,即读取到X1输入口当前脉冲计数值为10000
E1 B8:CRC校验
3. X输入口脉冲计数清空 (写入:DO寄存器,命令号:0x0F)
描述
清空模块的X输入口的脉冲计数值。
例子:清空X1输入计数值的请求&响应报文
请求:
发送数据(HEX): 01 0f 00 40 00 01 01 01 ee 98
解释:
01:子站地址
0f:指令号,0x0f=十进制15,写多路DO
00 40:从哪一路开始清空,0x00 40是X1计数清空DO寄存器起始地址
00 01:要清空多少路计数,十六进制0x0001=十进制1路
01:后面要写入的数据字节数,0x01=十进制1,写入1字节数据
01:写入的数据,写1清空
ee 98:CRC校验
响应:
//模块回复
01 0F 00 40 00 01 95 df
解释:
01:子站地址
0f:指令号,0x0f=十进制15,写多路DO
00 40:从哪一路开始清空,0x00 40是X1计数清空DO寄存器起始地址
00 01:要清空多少路计数,十六进制0x0001=十进制1路
95 df:CRC校验
4. Y输出口ON/OFF写入 (写入:DO寄存器,命令号:0x0F)
描述
用于控制模块Y输出点的开关状态。
例子:控制Y1当前输出ON/OFF的请求&响应报文
请求:
发送数据(HEX): 01 0f 00 00 00 01 01 01 ef 57
解释:
01:子站地址
0f:指令号,0x0f=十进制15,写多路DO
00 00:从哪一路开始写,00 00=Y1开始写
00 01:要写多少路,十六进制0x0001=十进制1,写1路
01:后面要写入的数据字节数,0x01=十进制1,写入1字节数据
01:写入的数据,0x01换算成二进制00000001 = Y8-Y7-Y6-Y5-Y4-Y3-Y2-Y1输出状态,ON=0,OFF=1
ef 57:CRC校验
响应:
//模块回复
01 0F 00 00 00 01 94 0B
解释:
01:子站地址
0f:指令号,0x0f=十进制15,写多路DO
00 00:从哪一路开始写,00 00=Y1开始写
00 01:写了多少路,十六进制0x0001=十进制1,写1路
94 0B:CRC校验
5. Y输出口ON/OFF读取 (读取:DO寄存器,命令号:0x01)
描述
用于读取当前Y输出口的开关状态。
例子:读Y1当前输出状态的请求&响应报文
请求:
发送数据(HEX): 01 01 00 00 00 01 FD CA
解释:
01:子站地址
01:指令号,01读取多路DO
00 00:从哪一路开始读,00 00=Y1开始读
00 01:要读多少路,十六进制0x0001=十进制1,读取1路
FD CA:CRC校验
响应:
//Y1 输出ON(1)时的回复
01 01 01 01 90 48
解释:
01:子站地址
01:指令号,01读取多路DO
01:后面数据区字节数
01:数据,换算成二进制0x01=0000 0001,对应Y8-Y7-Y6-Y5-Y4-Y3-Y2-Y1的状态
90 48 :CRC校验
//Y1 输出OFF(0)的时回复
01 01 01 00 51 88
解释:
01:子站地址
01:指令号,01读取多路DO
01:后面数据区字节数
00:数据,换算成二进制0x00=0000 0000,对应Y8-Y7-Y6-Y5-Y4-Y3-Y2-Y1的状态
51 88 :CRC校验
6. AI模拟量采集读取(读取:AI寄存器,命令号:0x04)
描述
读模块中的输入型数据,例如AD模拟采集到的电压值,电流值,压力值等。
例子:读当前AI通道AI1模拟量输入值的请求&响应报文
请求:
发送数据(HEX): 01 04 00 00 00 02 71CB
解释:
01:子站地址
04:指令号,04读AI
00 00:从哪一路开始读,0x0000=AIO1开始读
00 02:要多少个寄存器,因为一个AI通道占用2个寄存器地址,所以这里读1路模拟量的话,寄存器数量要填2,十六进制0x0002=十进制2
71CB:CRC校验
响应:
接收数据(HEX): 01 04 04 00 00 BF 11 4B B8
解释:
01:子站地址
04:指令号,04读AI
04:后面跟的数据字节数,0x04=十进制4,后面数据区有4字节数据
0000BF11:换成十进制就是 0x0000BF11 =48913,即读取到AI1模拟量输入口当前值为48913
4B B8:CRC校验
7. AO模拟量输出写入(写入:AO寄存器,命令号:0x10)
描述
用于设定DA模拟量输出值。
例子:写当前AO通道AO1模拟量输出值的请求&响应报文
请求:
发送数据(HEX): 01 10 00 00 00 01 02 10 D2 2B CD
解释:
01:子站地址
10:指令号,0x10=十进制16,写AO
00 00:从哪一路开始写,0x0000=AIO1开始写
00 01:要写多少路,十六进制0x0001=十进制1,写1路
02:后面要写入的数据字节数,0x02=十进制2,写2个字节
10 D2:要写入的AO输出值,0x10D2=十进制4306,即写入AO1输出口模拟量输出值为4306
2B CD:CRC校验
响应:
接收数据(HEX): 01 10 00 00 00 01 01 C9
解释:
01:子站地址
10:指令号,0x10=十进制16,写AO
00 00:从哪一路开始写,0x0000=AIO1开始写
00 01:写了多少路,十六进制0x0001=十进制1,写1路
01 C9:CRC校验
二、 MODBUS-TCP协议详解
1. X输入口开关量状态读取 (读取:DI寄存器,命令号:0x02)
描述
读模块X输入点的ON/OFF状态等。
例子:读X1当前输入状态的请求&响应报文
请求:
发送数据(HEX): 00 00 00 00 00 06 01 02 00 00 00 01
解释:
00 00:TID 传输标识符(用于上位机传输报文序列号),也可为0
00 00:PID 协议标识符,默认0
00 06:后面要发送的字节数
01:子站地址
02:指令号,02读DI
00 00:从哪一路开始读,0x0000=X1开始读
00 01:要读多少路,十六进制0x0001=十进制1,读取1路
响应:
//X1 输入ON(1)时的回复
00 00 00 00 00 04 01 02 01 01
解释:
00 00:TID 传输标识符(用于模块回送报文序列号),也可为0
00 00:PID 协议标识符,默认0
00 04:后面要发送的字节数
01:子站地址
02:指令号,02读DI
01:后面跟的数据字节数
01:换成二进制就是 0000 0001 =X8-X7-X6-X5-X4-X3-X2-X1输入口的当前状态0=OFF,1=ON
//X1 输入OFF(0)时的回复
00 00 00 00 00 04 01 02 01 00
解释:
00 00:TID 传输标识符(用于模块回送报文序列号),也可为0
00 00:PID 协议标识符,默认0
00 04:后面要发送的字节数
01:子站地址
02:指令号,02读DI
01:后面跟的数据字节数
00:换成二进制就是 0000 0000 =X8-X7-X6-X5-X4-X3-X2-X1输入口的当前状态0=OFF,1=ON
2. X输入口脉冲计数读取 (读取:AI寄存器,命令号:0x04)
描述
读模块的X输入口的脉冲计数值。
n 例子:读当前X1输入点脉冲计数值的请求&响应报文
请求:
发送数据(HEX): 00 00 00 00 00 06 01 04 00 18 00 02
解释:
00 00:TID 传输标识符(用于上位机传输报文序列号),也可为0
00 00:PID 协议标识符,默认0
00 06:后面要发送的字节数
01:子站地址
04:指令号,04读AI
00 18:从哪一路开始读,0x0018对应的是X1脉冲计数寄存器起始地址
00 02:要读多少个寄存器,因为一路X脉冲计数占用2个寄存器地址,所以这里寄存器数量要填2,十六进制0x0002=十进制2
响应:
接收数据(HEX): 00 00 00 00 00 07 01 04 04 00 00 27 10
解释:
00 00:TID 传输标识符(用于上位机传输报文序列号),也可为0
00 00:PID 协议标识符,默认0
00 07:后面要发送的字节数
01:子站地址
04:指令号,04读AI
04:后面跟的数据字节数,0x04=十进制4,后面数据区有4字节数据
00002710:换成十进制就是 0x00002710 =10000,即读取到X1输入口当前脉冲计数值为10000
3. X输入口脉冲计数清空 (写入:DO寄存器,命令号:0x0F)
描述
清空模块的X输入口的脉冲计数值。
例子:清空X1输入计数值的请求&响应报文
请求:
发送数据(HEX): 00 00 00 00 00 08 01 0f 00 40 00 01 01 01
解释:
00 00:TID 传输标识符(用于上位机传输报文序列号),也可为0
00 00:PID 协议标识符,默认0
00 08:后面要发送的字节数
01:子站地址
0f:指令号,0x0f=十进制15,写多路DO
00 40:从哪一路开始清空,0x00 40是X1计数清空DO寄存器起始地址
00 01:要清空多少路计数,十六进制0x0001=十进制1路
01:后面要写入的数据字节数,0x01=十进制1,写入1字节数据
01:写入的数据,写1清空
响应:
//模块回复
00 00 00 00 00 06 01 0F 00 40 00 01
解释:
00 00:TID 传输标识符(用于上位机传输报文序列号),也可为0
00 00:PID 协议标识符,默认0
00 06:后面要发送的字节数
01:子站地址
0f:指令号,0x0f=十进制15,写多路DO
00 40:从哪一路开始清空,0x00 40是X1计数清空DO寄存器起始地址
00 01:要清空多少路计数,十六进制0x0001=十进制1路
4. Y输出口ON/OFF写入 (写入:DO寄存器,命令号:0x0F)
描述
用于控制模块Y输出点的开关状态。
例子:控制Y1当前输出ON/OFF的请求&响应报文
请求:
发送数据(HEX): 00 00 00 00 00 08 01 0f 00 00 00 01 01 01
解释:
00 00:TID 传输标识符(用于上位机传输报文序列号),也可为0
00 00:PID 协议标识符,默认0
00 08:后面要发送的字节数
01:子站地址
0f:指令号,0x0f=十进制15,写多路DO
00 00:从哪一路开始写,00 00=Y1开始写
00 01:要写多少路,十六进制0x0001=十进制1,写1路
01:后面要写入的数据字节数,0x01=十进制1,写入1字节数据
01:写入的数据,0x01换算成二进制00000001 = Y8-Y7-Y6-Y5-Y4-Y3-Y2-Y1输出状态,ON=0,OFF=1
响应:
//模块回复
00 00 00 00 00 06 01 0F 00 00 00 01
解释:
00 00:TID 传输标识符(用于模块回送报文序列号),也可为0
00 00:PID 协议标识符,默认0
00 06:后面要发送的字节数
01:子站地址
0f:指令号,0x0f=十进制15,写多路DO
00 00:从哪一路开始写,00 00=Y1开始写
00 01:写了多少路,十六进制0x0001=十进制1,写1路
5. Y输出口ON/OFF读取 (读取:DO寄存器,命令号:0x01)
描述
用于读取模块Y输出点的开关状态。
例子:读Y1当前输出状态的请求&响应报文
请求:
发送数据(HEX): 00 00 00 00 00 06 01 01 00 00 00 01
解释:
00 00:TID 传输标识符(用于上位机传输报文序列号),也可为0
00 00:PID 协议标识符,默认0
00 06:后面要发送的字节数
01:子站地址
01:指令号,01读取多路DO
00 00:从哪一路开始读,00 00=Y1开始读
00 01:要读多少路,十六进制0x0001=十进制1,读取1路
响应:
//Y1 输出ON(1)时的回复
00 00 00 00 00 04 01 01 01 01
解释:
00 00:TID 传输标识符(用于模块回送报文序列号),也可为0
00 00:PID 协议标识符,默认0
00 04:后面要发送的字节数
01:子站地址
01:指令号,01读取多路DO
01:后面数据区字节数
01:数据,换算成二进制0x01=0000 0001,对应Y8-Y7-Y6-Y5-Y4-Y3-Y2-Y1的状态
//Y1 输出OFF(0)的时回复
00 00 00 00 00 04 01 01 01 00
解释:
00 00:TID 传输标识符(用于模块回送报文序列号),也可为0
00 00:PID 协议标识符,默认0
00 04:后面要发送的字节数
01:子站地址
01:指令号,01读取多路DO
01:后面数据区字节数
00:数据,换算成二进制0x00=0000 0000,对应Y8-Y7-Y6-Y5-Y4-Y3-Y2-Y1的状态
6. AI模拟量采集读取(读取:AI寄存器,命令号:0x04)
描述
读模块中的输入型数据,例如AD模拟采集到的电压值,电流值,压力值等。
例子:读当前AI通道AI1模拟量输入值的请求&响应报文
请求:
发送数据(HEX): 00 00 00 00 00 06 01 04 00 00 00 02
解释:
00 00:TID 传输标识符(用于上位机传输报文序列号),也可为0
00 00:PID 协议标识符,默认0
00 06:后面要发送的字节数
01:子站地址
04:指令号,04读AI
00 00:从哪一路开始读,0x0000=AIO1开始读
00 02:要多少个寄存器,因为一个AI通道占用2个寄存器地址,所以这里读1路模拟量的话,寄存器数量要填2,十六进制0x0002=十进制2
响应:
接收数据(HEX): 00 00 00 00 00 07 01 04 04 00 00 BF 11
解释:
00 00:TID 传输标识符(用于模块回送报文序列号),也可为0
00 00:PID 协议标识符,默认0
00 07:后面要发送的字节数
01:子站地址
04:指令号,04读AI
04:后面跟的数据字节数,0x04=十进制4,后面数据区有4字节数据
0000BF11:换成十进制就是 0x0000BF11 =48913,即读取到AI1模拟量输入口当前值为48913
7. AO模拟量输出写入(写入:AO寄存器,命令号:0x10)
描述
用于设定DA模拟量输出值。
例子:写当前AO通道AO1模拟量输出值的请求&响应报文
请求:
发送数据(HEX): 00 00 00 00 00 09 01 10 00 00 00 01 02 10 D2
解释:
00 00:TID 传输标识符(用于上位机传输报文序列号),也可为0
00 00:PID 协议标识符,默认0
00 09:后面要发送的字节数
01:子站地址
10:指令号,0x10=十进制16,写AO
00 00:从哪一路开始写,0x0000=AIO1开始写
00 01:要写多少路,十六进制0x0001=十进制1,写1路
02:后面要写入的数据字节数,0x02=十进制2,写2个字节
10D2:要写入的AO输出值,0x10D2=十进制4306,即写入AO1输出口模拟量输出值为4306
响应:
接收数据(HEX): 00 00 00 00 00 06 01 10 00 00 00 01
解释:
00 00:TID 传输标识符(用于模块回送报文序列号),也可为0
00 00:PID 协议标识符,默认0
00 06:后面要发送的字节数
01:子站地址
10:指令号,0x10=十进制16,写AO
00 00:从哪一路开始写,0x0000=AIO1开始写
00 01:写了多少路,十六进制0x0001=十进制1,写1路
8. AO模拟量输出读取(读取:AO寄存器,命令号:0x03)
描述
用于读取当前DA模拟量输出值。
例子:读当前AO通道AO1模拟量输出值的请求&响应报文
请求:
发送数据(HEX): 00 00 00 00 00 06 01 03 00 00 00 01
解释:
00 00:TID 传输标识符(用于上位机传输报文序列号),也可为0
00 00:PID 协议标识符,默认0
00 06:后面要发送的字节数
01:子站地址
03:指令号,03读AO
00 00:从哪一路开始读,0x0000=AIO1开始读
00 01:要读多少路,十六进制0x0001=十进制1,读取1路
响应:
接收数据(HEX): 00 00 00 00 00 05 01 03 02 10 D2
解释:
00 00:TID 传输标识符(用于模块回送报文序列号),也可为0
00 00:PID 协议标识符,默认0
00 05:后面要发送的字节数
01:子站地址
03:指令号,03读AO
02:后面跟的数据字节数
10 D2:换成十进制就是 0x10D2 =十进制4306,即读取到AO1输出模拟量当前输出值为4306
猜你喜欢
- 2024-10-16 Modbus通讯协议格式简介(modbus通讯协议格式详解过程)
- 2024-10-16 1200PLC Modbus TCP 通讯(1200的modbus tcp)
- 2024-10-16 modbus协议实例讲解(modbus几种协议区别)
- 2024-10-16 FOXBORO fbm230 现场设备系统集成商(FDSI)Modbus 主站驱动程序
- 2024-10-16 虹科干货 | 教您如何解析MODBUS中的浮点型数据
- 2024-10-16 MODBUS通信异常?调试助手来帮忙(modbus调试软件)
- 2024-10-16 全面讲解Modbus RTU通信及指令,初学PLC必看!
- 2024-10-16 力控组态软件modbus-rtu、modbus-tcp的用法
- 2024-10-16 你好,我是Modbus TCP协议(modbus tcp master)
- 2024-10-16 西门子S7-1200 和CB1241 MODBUS RTU 通信
你 发表评论:
欢迎- 06-24一个老爸画了超级有爱的365幅画 | 父亲节献礼
- 06-24产品小白看魏则西事件——用产品思维审视百度推广
- 06-24某教程学习笔记(一):13、脚本木马原理
- 06-24十大常见web漏洞——命令执行漏洞
- 06-24初涉内网,提权那些事(内网渗透提权)
- 06-24黑客命令第16集:47种最常见的**网站方法2/2
- 06-24铭说 | 一句话木马的多种变形方式
- 06-24Java隐藏的10倍效率技巧!90%程序员不知道的魔法方法(附代码)
- 最近发表
- 标签列表
-
- spire.doc (70)
- instanceclient (62)
- solidworks (78)
- system.data.oracleclient (61)
- 按键小精灵源码提取 (66)
- pyqt5designer教程 (65)
- 联想刷bios工具 (66)
- c#源码 (64)
- graphics.h头文件 (62)
- mysqldump下载 (66)
- libmp3lame (60)
- maven3.3.9 (63)
- 二调符号库 (57)
- git.exe下载 (68)
- diskgenius_winpe (72)
- pythoncrc16 (57)
- solidworks宏文件下载 (59)
- qt帮助文档中文版 (73)
- satacontroller (66)
- hgcad (64)
- bootimg.exe (69)
- android-gif-drawable (62)
- axure9元件库免费下载 (57)
- libmysqlclient.so.18 (58)
- springbootdemo (64)
本文暂时没有评论,来添加一个吧(●'◡'●)