本文以综科智控品牌的IO控制器为例,直接以实际例子讲解modbus协议
目录
一、MODBUS协议简介4
1.什么是MODBUS协议4
2.MODBUS协议格式5
2.1MODBUS-RTU报文模型(用于串口通讯)5
2.2MODBUS-TCP报文模型(用于网络TCP/IP通信)5
3.MODBUS的功能码及寄存器介绍5
3.1功能码5
3.2寄存器分类说明6
3.3寄存器地址说明6
二、MODBUS-RTU协议详解7
1.X输入口开关量状态读取 (读取:DI寄存器,命令号:0x02)7
2.X输入口脉冲计数读取 (读取:AI寄存器,命令号:0x04)9
3.X输入口脉冲计数清空 (写入:DO寄存器,命令号:0x0F)12
4.Y输出口ON/OFF写入 (写入:DO寄存器,命令号:0x0F)14
5.Y输出口ON/OFF读取 (读取:DO寄存器,命令号:0x01)16
6.AI模拟量采集读取(读取:AI寄存器,命令号:0x04)18
7.AO模拟量输出写入(写入:AO寄存器,命令号:0x10)20
8.AO模拟量输出读取(读取:AO寄存器,命令号:0x03)22
三、MODBUS-TCP协议详解24
1.X输入口开关量状态读取 (读取:DI寄存器,命令号:0x02)24
2.X输入口脉冲计数读取 (读取:AI寄存器,命令号:0x04)27
3.X输入口脉冲计数清空 (写入:DO寄存器,命令号:0x0F)30
4.Y输出口ON/OFF写入 (写入:DO寄存器,命令号:0x0F)33
5.Y输出口ON/OFF读取 (读取:DO寄存器,命令号:0x01)36
6.AI模拟量采集读取(读取:AI寄存器,命令号:0x04)39
7.AO模拟量输出写入(写入:AO寄存器,命令号:0x10)42
8.AO模拟量输出读取(读取:AO寄存器,命令号:0x03)45
MODBUS协议简介
什么是MODBUS协议
Modbus协议是一种已广泛应用于当今工业控制领域的通用通讯协议,按其格式可分为MODBUS-RTU,MODBUS-ASCII,MODBUS-TCP,其中前两者适用于串行通信控制网络中,例如RS485,RS232等,而MODBUS-TCP主要应用于基于以太网TCP/IP通信的控制网络中。
通过此协议,控制器相互之间、或控制器经由网络(如以太网)可以和其它设备之间进行通信。Modbus协议使用的是主从通讯技术,即由主设备主动查询和操作从设备。一般将主控设备方所使用的协议称为Modbus Master,从设备方使用的协议称为Modbus Slave。典型的主设备包括工控机和工业控制器等;典型的从设备如PLC可编程控制器等。Modbus通讯物理接口可以选用串口(包括RS232和RS485),也可以选择以太网口。其通信遵循以下的过程:
● 主设备向从设备发送请求
● 从设备分析并处理主设备的请求,然后向主设备发送结果
● 如果出现任何差错,从设备将返回一个异常功能码
Modbus协议具有以下几个特点:
(1)标准、开放,用户可以免费、放心地使用Modbus协议,不需要交纳许可证费,也不会侵犯知识产权。
(2)Modbus可以支持多种电气接口,如RS-232、RS-485等,还可以在各种介质上传送,如双绞线、光纤、无线等。
(3)Modbus的帧格式简单、紧凑,通俗易懂。用户使用容易,厂商开发简单。
MODBUS-RTU报文模型(用于串口通讯)
设备地址 |
功能码 |
数据 |
CRC校验L |
CRC校验H |
1BYTE |
1BYTE |
N*BYTE |
1BYTE |
1BYTE |
MODBUS-TCP报文模型(用于网络TCP/IP通信)
传输标识符TID |
协议标识符PID |
后面要传输的字节数 |
设备地址 |
功能码 |
数据 |
2BYTE |
2BYTE |
2BYTE |
1BYTE |
1BYTE |
N*BYTE |
注意:
Modbus-RTU一般用于串口RS232/RS485/RS422通讯
Modbus-TCP一般用于网口、WIFI的TCP/UDP通讯
MODBUS的功能码及寄存器介绍
功能码
下表列出 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 |
字操作 |
单个/多个 |
寄存器分类说明
寄存器种类 |
说明 |
DI寄存器 |
只读,主要用于读模块的DI离散量输入信号的 ON/OFF状态。 |
DO寄存器 |
可读/可写,主要用于控制相应DO输出,例如:Y点的开关状态。也可以用于控制某些功能的启动或停止、打开或关闭,例如:PWM的输出/停止,计数的清空等。 |
AI寄存器 |
只度,主要用于读取模块中的输入型数据,例如AD模拟采集到的电压值,电流值,压力值等,或者X输入脉冲计数值等。 |
AO寄存器 |
可读/可写,主要用于存放的用户下发的参数,例如AO模拟量输出值、PWM输出频率、占空比等。 |
寄存器地址说明
- 寄存器信息地址(PLC地址):
寄存器信息地址指的是存放于控制器中的地址,这些控制器可以是 PLC,也可以使触
摸屏,或是文本显示器。例如 4x0001、3x0002等,这些地址一般使用十进制描述。
- 寄存器寻址地址(协议地址):
寄存器寻址地址指的是通信时使用的寄存器地址,例如信息地址 40001对应寻址地址
0x0000,40002对应寻址地址 0x0001,寄存器寻址地址一般使用 16进制描述。再如,信息寄存器 40003对应寻址地址 0002,信息寄存器 30003对应寻址地址 0002,虽然两个信息寄存器通信时使用相同的地址,但是需要使用不同的命令才可以访问,所以访问时不存在冲突。
MODBUS-RTU协议详解
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校验
- 例子:读X1-X8当前输入状态的请求&响应报文
请求:
发送数据(HEX): 01 02 00 00 00 08 79CC
解释:
01:子站地址
02:指令号,02读DI
00 00:从哪一路开始读,0x0000=X1开始读
00 08:要读多少路十六进制0x0008=十进制8,读取8路
79CC:CRC校验
响应:
//X1,X8输入ON(1)时,其他都输入OFF(0)时的回复
01 02 01 81 61 E8
解释:
01:子站地址
02:指令号,02读DI
01:后面跟的数据字节数
81:换成二进制就是1000 0001 =X8-X7-X6-X5-X4-X3-X2-X1输入口的当前状态0=OFF,1=ON
61 E8:CRC校验
- 例子:读X1-X24当前输入状态的请求&响应报文
请求:
发送数据(HEX): 01 02 00 00 00 18 78 00
解释:
01:子站地址
02:指令号,02读DI
00 00:从哪一路开始读,0x0000=X1开始读
00 18:要读多少路十六进制0x0018=十进制24,读取24路
78 00:CRC校验
响应:
//X1,X2,X9,X24 输入ON(1)时,其他都输入OFF(0)时的回复
01 02 03 03 01 80 88 7E
解释:
01:子站地址
02:指令号,02读DI
03:后面跟的数据字节数
03:换成二进制就是 0000 0011 =X8-X7-X6-X5-X4-X3-X2-X1输入口的当前状态0=OFF,1=ON
01:换成二进制就是 0000 0001 =X16-X15-X14-X13-X12-X11-X10-X9输入口的当前状态0=OFF,1=ON
80:换成二进制就是 1000 0000 =X24-X23-X22-X21-X20-X19-X18-X17输入口的当前状态0=OFF,1=ON
88 7E:CRC校验
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校验
- 例子:读当前X1-X4输入点脉冲计数值的请求&响应报文
请求:
发送数据(HEX): 01 04 00 18 00 08 71 CB
解释:
01:子站地址
04:指令号,04读AI
00 18:从哪一路开始读,0x0018对应的是X1脉冲计数寄存器起始地址
00 08:要读多少个寄存器,因为一路X脉冲计数占用2个寄存器地址,这里读4路,所以这里寄存器数量要填8,十六进制0x0008=十进制8
71 CB :CRC校验
响应:
接收数据(HEX): 01 04 10 00 00 27 10 00 00 27 10 00 00 27 10 00 00 27 10 EC C3
解释:
01:子站地址
04:指令号,04读AI
10:后面跟的数据字节数,0x10=十进制16,后面数据区有16字节数据
00002710:换成十进制就是 0x00002710 =10000,即读取到X1输入口当前脉冲计数值为10000
00002710:换成十进制就是 0x00002710 =10000,即读取到X2输入口当前脉冲计数值为10000
00002710:换成十进制就是 0x00002710 =10000,即读取到X3输入口当前脉冲计数值为10000
00002710:换成十进制就是 0x00002710 =10000,即读取到X4输入口当前脉冲计数值为10000
EC C3:CRC校验
- 例子:读当前X1-X8输入点脉冲计数值的请求&响应报文
请求:
发送数据(HEX): 01 04 00 18 00 10 71 C1
解释:
01:子站地址
04:指令号,04读AI
00 18:从哪一路开始读,0x0018对应的是X1脉冲计数寄存器起始地址
00 10:要读多少个寄存器,因为一路X脉冲计数占用2个寄存器地址,这里读8路,所以这里寄存器数量要填十六进制0x0010=十进制16
71 C1 :CRC校验
响应:
接收数据(HEX): 01 04 20 00 00 27 10 00 00 27 10 00 00 27 10 00 00 27 10 00 00 27 10 00 00 27 10 00 00 27 10 00 00 27 10 36 38
解释:
01:子站地址
04:指令号,04读AI
20:后面跟的数据字节数,0x20=十进制32,后面数据区有32字节数据
00002710:换成十进制就是 0x00002710 =10000,即读取到X1输入口当前脉冲计数值为10000
00002710:换成十进制就是 0x00002710 =10000,即读取到X2输入口当前脉冲计数值为10000
00002710:换成十进制就是 0x00002710 =10000,即读取到X3输入口当前脉冲计数值为10000
00002710:换成十进制就是 0x00002710 =10000,即读取到X4输入口当前脉冲计数值为10000
00002710:换成十进制就是 0x00002710 =10000,即读取到X5输入口当前脉冲计数值为10000
00002710:换成十进制就是 0x00002710 =10000,即读取到X6输入口当前脉冲计数值为10000
00002710:换成十进制就是 0x00002710 =10000,即读取到X7输入口当前脉冲计数值为10000
00002710:换成十进制就是 0x00002710 =10000,即读取到X8输入口当前脉冲计数值为10000
36 38:CRC校验
- 例子:读当前X1-X12输入点脉冲计数值的请求&响应报文
请求:
发送数据(HEX): 01 04 00 18 00 18 70 07
解释:
01:子站地址
04:指令号,04读AI
00 18:从哪一路开始读,0x0018对应的是X1脉冲计数寄存器起始地址
00 18:要读多少个寄存器,因为一路X脉冲计数占用2个寄存器地址,这里读12路,所以这里寄存器数量要填十六进制0x0018=十进制24
70 07 :CRC校验
响应:
接收数据(HEX): 01 04 30 00 00 27 10 00 00 27 10 00 00 27 10 00 00 27 10 00 00 27 10 00 00 27 10 00 00 27 10 00 00 27 10 00 00 27 10 00 00 27 10 00 00 27 10 00 00 27 10 C1 D9
解释:
01:子站地址
04:指令号,04读AI
30:后面跟的数据字节数,0x30=十进制48,后面数据区有48字节数据
00002710:换成十进制就是 0x00002710 =10000,即读取到X1输入口当前脉冲计数值为10000
00002710:换成十进制就是 0x00002710 =10000,即读取到X2输入口当前脉冲计数值为10000
00002710:换成十进制就是 0x00002710 =10000,即读取到X3输入口当前脉冲计数值为10000
00002710:换成十进制就是 0x00002710 =10000,即读取到X4输入口当前脉冲计数值为10000
00002710:换成十进制就是 0x00002710 =10000,即读取到X5输入口当前脉冲计数值为10000
00002710:换成十进制就是 0x00002710 =10000,即读取到X6输入口当前脉冲计数值为10000
00002710:换成十进制就是 0x00002710 =10000,即读取到X7输入口当前脉冲计数值为10000
00002710:换成十进制就是 0x00002710 =10000,即读取到X8输入口当前脉冲计数值为10000
00002710:换成十进制就是 0x00002710 =10000,即读取到X9输入口当前脉冲计数值为10000
00002710:换成十进制就是 0x00002710 =10000,即读到X10输入口当前脉冲计数值为10000
00002710:换成十进制就是 0x00002710 =10000,即读到X11输入口当前脉冲计数值为10000
00002710:换成十进制就是 0x00002710 =10000,即读到X12输入口当前脉冲计数值为10000
C1 D9:CRC校验
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校验
- 例子:清空X1-X12输入计数值的请求&响应报文
请求:
发送数据(HEX): 01 0f 00 40 00 0C 02 ff 0f ea 84
解释:
01:子站地址
0f:指令号,0x0f=十进制15,写多路DO
00 40:从哪一路开始清空,0x00 40是X1计数清空DO寄存器起始地址
00 0C:要清空多少路计数,十六进制0x000C=十进制12路
02:后面要写入的数据字节数,0x02=十进制2,写入2字节数据
ff:十六进制0xff=二进制1111 1111=X8计数清空-X7计数清空-X6计数清空-X5计数清空-X4计数清空-X3计数清空-X2计数清空-X1计数清空,对应的bit位写1清空,写0保持不变
0f: 十六进制0x0f=二进制0000 1111=X16计数清空-X15计数清空-X14计数清空-X13计数清空-X12计数清空-X11计数清空-X10计数清空-X9计数清空,对应的bit位写1清空,写0保持不变
ea 84:CRC校验
响应:
//模块回复
01 0F 00 40 00 0C 54 1A
解释:
01:子站地址
0f:指令号,0x0f=十进制15,写多路DO
00 40:从哪一路开始清空,0x00 40是X1计数清空DO寄存器起始地址
00 0C:要清空多少路计数,十六进制0x000C=十进制12路
54 1A:CRC校验
- 例子:指定清空X1,X4,X8,X12,X24输入计数值的请求&响应报文
请求:
发送数据(HEX): 01 0f 00 40 00 18 03 85 08 80 16 39
解释:
01:子站地址
0f:指令号,0x0f=十进制15,写多路DO
00 40:从哪一路开始清空,0x00 40是X1计数清空DO寄存器起始地址
00 18:要清空多少路计数,十六进制0x0018=十进制24路
03:后面要写入的数据字节数,0x03=十进制3,写入3字节数据
85:十六进制0x85=二进制1000 1001=X8计数清空-X7计数清空-X6计数清空-X5计数清空-X4计数清空-X3计数清空-X2计数清空-X1计数清空,对应的bit位写1清空,写0保持不变
08: 十六进制0x08=二进制0000 1000=X16计数清空-X15计数清空-X14计数清空-X13计数清空-X12计数清空-X11计数清空-X10计数清空-X9计数清空,对应的bit位写1清空,写0保持不变
80: 十六进制0x80=二进制1000 0000=X24计数清空-X23计数清空-X22计数清空-X21计数清空-X20计数清空-X19计数清空-X18计数清空-X17计数清空,对应的bit位写1清空,写0保持不变
16 39:CRC校验
响应:
//模块回复
01 0F 00 40 00 18 54 15
解释:
01:子站地址
0f:指令号,0x0f=十进制15,写多路DO
00 40:从哪一路开始清空,0x00 40是X1计数清空DO寄存器起始地址
00 18:操作了多少路计数,十六进制0x0018=十进制24路
54 15:CRC校验
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校验
- 例子:控制Y1-Y8当前输出ON/OFF的请求&响应报文
//将Y1,Y2,Y8输出ON,其他路输出OFF
请求:
发送数据(HEX): 01 0f 00 00 00 08 01 83 bf 34
解释:
01:子站地址
0f:指令号,0x0f=十进制15,写多路DO
00 00:从哪一路开始写,00 00=Y1开始写
00 08:要写多少路,十六进制0x0008=十进制8,写8路
01:后面要写入的数据字节数,0x01=十进制1,写入1字节数据
83:写入的数据,0x83换算成二进制10000011 = Y8-Y7-Y6-Y5-Y4-Y3-Y2-Y1输出状态,ON=0,OFF=1
bf 34:CRC校验
响应:
//模块回复
01 0F 00 00 00 08 54 0D
解释:
01:子站地址
0f:指令号,0x0f=十进制15,写多路DO
00 00:从哪一路开始写,00 00=Y1开始写
00 08:写了多少路,十六进制0x0008=十进制8,写8路
54 0D:CRC校验
- 例子:控制Y1-Y24当前输出ON/OFF的请求&响应报文
//将Y1,Y2,Y9,Y24输出ON,其他路输出OFF
请求:
发送数据(HEX): 01 0f 00 00 00 18 03 03 01 80 b0 44
解释:
01:子站地址
0f:指令号,0x0f=十进制15,写多路DO
00 00:从哪一路开始写,00 00=Y1开始写
00 18:要写多少路,十六进制0x0018=十进制24,写24路
03:后面要写入的数据字节数,0x01=十进制1,写入1字节数据
03:写入的数据,0x03换算成二进制00000011 = Y8-Y7-Y6-Y5-Y4-Y3-Y2-Y1输出状态,ON=0,OFF=1
01:写入的数据,0x01换算成二进制00000001 = Y16-Y15-Y14-Y13-Y12-Y11-Y10-Y9输出状态,ON=0,OFF=1
80:写入的数据,0x80换算成二进制10000000 = Y24-Y23-Y22-Y21-Y20-Y19-Y18-Y17输出状态,ON=0,OFF=1
b0 44:CRC校验
响应:
//模块回复
01 0F 00 00 00 18 55 C1
解释:
01:子站地址
0f:指令号,0x0f=十进制15,写多路DO
00 00:从哪一路开始写,00 00=Y1开始写
00 18:写了多少路,十六进制0x0018=十进制24,写24路
55 C1:CRC校验
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校验
- 例子:读Y1-Y8当前输出状态的请求&响应报文
请求:
发送数据(HEX): 01 01 00 00 00 08 3D CC
解释:
01:子站地址
01:指令号,01读取多路DO
00 00:从哪一路开始读,00 00=Y1开始读
00 08:要读多少路,十六进制0x0008=十进制8,读取8路
3D CC:CRC校验
响应:
//Y1,Y2,Y8输出ON(1),其他输出OFF(0)时的回复
01 01 01 83 10 29
解释:
01:子站地址
01:指令号,01读取多路DO
01:后面数据区字节数,0x01=十进制1,后面数据区有1字节数据
83:数据区,换算成二进制0x83=1000 0011,对应Y8-Y7-Y6-Y5-Y4-Y3-Y2-Y1的状态
10 29 :CRC校验
- 例子:读Y1-Y24当前输出状态的请求&响应报文
请求:
发送数据(HEX): 01 01 00 00 00 18 3C 00
解释:
01:子站地址
01:指令号,01读取多路DO
00 00:从哪一路开始读,00 00=Y1开始读
00 18:要读多少路,十六进制0x0018=十进制24,读取24路
3C00:CRC校验
响应:
//Y1,Y2,Y9,Y24输出ON(1),其他输出OFF(0)时的回复
01 01 03 03 01 80 CC 7E
解释:
01:子站地址
01:指令号,01读取多路DO
03:后面数据区字节数,0x03=十进制3,后面数据区有3字节数据
03:数据,换算成二进制0x03=0000 0011,对应Y8-Y7-Y6-Y5-Y4-Y3-Y2-Y1的状态
01:数据,换算成二进制0x01=0000 0001,对应Y16-Y15-Y14-Y13-Y12-Y11-Y10-Y9的状态
80:数据,换算成二进制0x80=1000 0000,对应Y24-Y23-Y22-Y21-Y20-Y19-Y18-Y17的状态
CC 7E :CRC校验
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校验
- 例子:读当前AI通道AI1-AI4模拟量输入值的请求&响应报文
请求:
发送数据(HEX): 01 04 00 00 00 08 F1 CC
解释:
01:子站地址
04:指令号,04读AI
00 00:从哪一路开始读,0x0000=AIO1开始读
00 08:要多少个寄存器,因为一个AI通道占用2个寄存器地址,所以这里读4路模拟量的话,寄存器数量要填8,十六进制0x0008=十进制8
F1 CC:CRC校验
响应:
接收数据(HEX): 01 04 10 00 00 BF 11 00 00 BF 11 00 00 BF 11 00 00 BF 11 76 C5
解释:
01:子站地址
04:指令号,04读AI
10:后面跟的数据字节数,0x10=十进制16,后面数据区有16字节数据
00 00 BF 11:数据区,换成十进制就是 0x0000BF11 =48913,即读取到AI1模拟量输入口当前值为48913
00 00 BF 11:数据区,换成十进制就是 0x0000BF11 =48913,即读取到AI2模拟量输入口当前值为48913
00 00 BF 11:数据区,换成十进制就是 0x0000BF11 =48913,即读取到AI3模拟量输入口当前值为48913
00 00 BF 11:数据区,换成十进制就是 0x0000BF11 =48913,即读取到AI4模拟量输入口当前值为48913
76 C5:CRC校验
- 例子:读当前AI通道AI1-AI8模拟量输入值的请求&响应报文
请求:
发送数据(HEX): 01 04 00 00 00 10 F1 C6
解释:
01:子站地址
04:指令号,04读AI
00 00:从哪一路开始读,0x0000=AIO1开始读
00 10:要多少个寄存器,因为一个AI通道占用2个寄存器地址,所以这里读8路模拟量的话,寄存器数量要填16,换算成十六进制就是0x0010
F1 C6:CRC校验
响应:
接收数据(HEX): 01 04 20 00 00 BF 11 00 00 BF 11 00 00 BF 11 00 00 BF 11 00 00 BF 11 00 00 BF 11 00 00 BF 11 00 00 BF 11 C0 F7
解释:
01:子站地址
04:指令号,04读AI
20:后面跟的数据字节数,0x20=十进制32,后面数据区有32字节数据
00 00 BF 11:数据区,换成十进制就是 0x0000BF11 =48913,即读取到AI1模拟量输入口当前值为48913
00 00 BF 11:数据区,换成十进制就是 0x0000BF11 =48913,即读取到AI2模拟量输入口当前值为48913
00 00 BF 11:数据区,换成十进制就是 0x0000BF11 =48913,即读取到AI3模拟量输入口当前值为48913
00 00 BF 11:数据区,换成十进制就是 0x0000BF11 =48913,即读取到AI4模拟量输入口当前值为48913
00 00 BF 11:数据区,换成十进制就是 0x0000BF11 =48913,即读取到AI5模拟量输入口当前值为48913
00 00 BF 11:数据区,换成十进制就是 0x0000BF11 =48913,即读取到AI6模拟量输入口当前值为48913
00 00 BF 11:数据区,换成十进制就是 0x0000BF11 =48913,即读取到AI7模拟量输入口当前值为48913
00 00 BF 11:数据区,换成十进制就是 0x0000BF11 =48913,即读取到AI8模拟量输入口当前值为48913
C0 F7:CRC校验
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校验
- 例子:写当前AO通道AO1-AO4模拟量输出值的请求&响应报文
请求:
发送数据(HEX): 01 10 00 00 00 04 08 10 D2 10 D2 10 D2 10 D2 D6 9D
解释:
01:子站地址
10:指令号,0x10=十进制16,写AO
00 00:从哪一路开始写,0x0000=AIO1开始写
00 04:要写多少路,十六进制0x0004=十进制4,写4路
08:后面要写入的数据字节数,0x08=十进制8,写8个字节
10D2:要写入的AO输出值,0x10D2=十进制4306,即写入AO1输出口模拟量输出值为4306
10D2:要写入的AO输出值,0x10D2=十进制4306,即写入AO2输出口模拟量输出值为4306
10D2:要写入的AO输出值,0x10D2=十进制4306,即写入AO3输出口模拟量输出值为4306
10D2:要写入的AO输出值,0x10D2=十进制4306,即写入AO4输出口模拟量输出值为4306
D6 9D:CRC校验
响应:
接收数据(HEX): 01 10 00 00 00 04 C1 CA
解释:
01:子站地址
10:指令号,0x10=十进制16,写AO
00 00:从哪一路开始写,0x0000=AIO1开始写
00 04:写了多少路,十六进制0x0004=十进制4,写4路
C1 CA:CRC校验
- 例子:写当前AO通道AO1-AO8模拟量输出值的请求&响应报文
请求:
发送数据(HEX): 01 10 00 00 00 08 10 10 D2 10 D2 10 D2 10 D2 10 D2 10 D2 10 D2 10 D2 E8 0C
解释:
01:子站地址
10:指令号,0x10=十进制16,写AO
00 00:从哪一路开始写,0x0000=AIO1开始写
00 08:要写多少路,十六进制0x0008=十进制8,写8路
10:后面要写入的数据字节数,0x10=十进制16,16个字节
10D2:要写入的AO输出值,0x10D2=十进制4306,即写入AO1输出口模拟量输出值为4306
10D2:要写入的AO输出值,0x10D2=十进制4306,即写入AO2输出口模拟量输出值为4306
10D2:要写入的AO输出值,0x10D2=十进制4306,即写入AO3输出口模拟量输出值为4306
10D2:要写入的AO输出值,0x10D2=十进制4306,即写入AO4输出口模拟量输出值为4306
10D2:要写入的AO输出值,0x10D2=十进制4306,即写入AO5输出口模拟量输出值为4306
10D2:要写入的AO输出值,0x10D2=十进制4306,即写入AO6输出口模拟量输出值为4306
10D2:要写入的AO输出值,0x10D2=十进制4306,即写入AO7输出口模拟量输出值为4306
10D2:要写入的AO输出值,0x10D2=十进制4306,即写入AO8输出口模拟量输出值为4306
E8 0C:CRC校验
响应:
接收数据(HEX): 01 10 00 00 00 08 C1 CF
解释:
01:子站地址
10:指令号,0x10=十进制16,写AO
00 00:从哪一路开始写,0x0000=AIO1开始写
00 08:写了多少路,十六进制0x0008=十进制8,写8路
C1 CF:CRC校验
AO模拟量输出读取(读取:AO寄存器,命令号:0x03)
- 描述
用于读取当前DA模拟量输出值。
- 例子:读当前AO通道AO1模拟量输出值的请求&响应报文
请求:
发送数据(HEX): 01 03 00 00 00 01 84 0A
解释:
01:子站地址
03:指令号,03读AO
00 00:从哪一路开始读,0x0000=AIO1开始读
00 01:要读多少路,十六进制0x0001=十进制1,读取1路
84 0A:CRC校验
响应:
接收数据(HEX): 01 03 02 10 D2 35 D9
解释:
01:子站地址
03:指令号,03读AO
02:后面跟的数据字节数
10 D2:换成十进制就是0x10D2 =十进制4306,即读取到AO1输出模拟量当前输出值为4306
35 D9:CRC校验
- 例子:读当前AO通道AO1-AO4模拟量输出值的请求&响应报文
请求:
发送数据(HEX): 01 03 00 00 00 04 44 09
解释:
01:子站地址
03:指令号,03读AO
00 00:从哪一路开始读,0x0000=AIO1开始读
00 04:要读多少路,十六进制0x0004=十进制4,读取4路
44 09:CRC校验
响应:
接收数据(HEX): 01 03 08 10 D2 10 D2 10 D2 10 D2 F5 30
解释:
01:子站地址
03:指令号,03读AO
08:后面跟的数据字节数
10 D2:换成十进制就是 0x10D2 =十进制4306,即读取到AO1输出模拟量当前输出值为4306
10 D2:换成十进制就是 0x10D2 =十进制4306,即读取到AO2输出模拟量当前输出值为4306
10 D2:换成十进制就是 0x10D2 =十进制4306,即读取到AO3输出模拟量当前输出值为4306
10 D2:换成十进制就是 0x10D2 =十进制4306,即读取到AO4输出模拟量当前输出值为4306
F5 30:CRC校验
- 例子:读当前AO通道AO1-AO8模拟量输出值的请求&响应报文
请求:
发送数据(HEX): 01 03 00 00 00 08 44 0C
解释:
01:子站地址
03:指令号,03读AO
00 00:从哪一路开始读,0x0000=AIO1开始读
00 08:要读多少路,十六进制0x0008=十进制8,读取8路
44 0C:CRC校验
响应:
接收数据(HEX): 01 03 10 10 D2 10 D2 10 D2 10 D2 10 D2 10 D2 10 D2 10 D2 15 98
解释:
01:子站地址
03:指令号,03读AO
10:后面跟的数据字节数,十六进制0x10=十进制16
10 D2:换成十进制就是 0x10D2 =十进制4306,即读取到AO1输出模拟量当前输出值为4306
10 D2:换成十进制就是 0x10D2 =十进制4306,即读取到AO2输出模拟量当前输出值为4306
10 D2:换成十进制就是 0x10D2 =十进制4306,即读取到AO3输出模拟量当前输出值为4306
10 D2:换成十进制就是 0x10D2 =十进制4306,即读取到AO4输出模拟量当前输出值为4306
10 D2:换成十进制就是 0x10D2 =十进制4306,即读取到AO5输出模拟量当前输出值为4306
10 D2:换成十进制就是 0x10D2 =十进制4306,即读取到AO6输出模拟量当前输出值为4306
10 D2:换成十进制就是 0x10D2 =十进制4306,即读取到AO7输出模拟量当前输出值为4306
10 D2:换成十进制就是 0x10D2 =十进制4306,即读取到AO8输出模拟量当前输出值为4306
15 98:CRC校验
MODBUS-TCP协议详解
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
- 例子:读X1-X8当前输入状态的请求&响应报文
请求:
发送数据(HEX): 00 00 00 00 00 06 01 02 00 00 00 08
解释:
00 00:TID 传输标识符(用于上位机传输报文序列号),也可为0
00 00:PID 协议标识符,默认0
00 06:后面要发送的字节数
01:子站地址
02:指令号,02读DI
00 00:从哪一路开始读,0x0000=X1开始读
00 08:要读多少路十六进制0x0008=十进制8,读取8路
响应:
//X1,X8输入ON(1)时,其他都输入OFF(0)时的回复
00 00 00 00 00 04 01 02 01 81
解释:
00 00:TID 传输标识符(用于模块回送报文序列号),也可为0
00 00:PID 协议标识符,默认0
00 04:后面要发送的字节数
01:子站地址
02:指令号,02读DI
01:后面跟的数据字节数
81:换成二进制就是1000 0001 =X8-X7-X6-X5-X4-X3-X2-X1输入口的当前状态0=OFF,1=ON
- 例子:读X1-X24当前输入状态的请求&响应报文
请求:
发送数据(HEX):00 00 00 00 00 06 01 02 00 00 00 18
解释:
00 00:TID 传输标识符(用于上位机传输报文序列号),也可为0
00 00:PID 协议标识符,默认0
00 06:后面要发送的字节数
01:子站地址
02:指令号,02读DI
00 00:从哪一路开始读,0x0000=X1开始读
00 18:要读多少路十六进制0x0018=十进制24,读取24路
响应:
//X1,X2,X9,X24 输入ON(1)时,其他都输入OFF(0)时的回复
00 00 00 00 00 06 01 02 03 03 01 80
解释:
00 00:TID 传输标识符(用于模块回送报文序列号),也可为0
00 00:PID 协议标识符,默认0
00 06:后面要发送的字节数
01:子站地址
02:指令号,02读DI
03:后面跟的数据字节数
03:换成二进制就是 0000 0011 =X8-X7-X6-X5-X4-X3-X2-X1输入口的当前状态0=OFF,1=ON
01:换成二进制就是 0000 0001 =X16-X15-X14-X13-X12-X11-X10-X9输入口的当前状态0=OFF,1=ON
80:换成二进制就是 1000 0000 =X24-X23-X22-X21-X20-X19-X18-X17输入口的当前状态0=OFF,1=ON
X输入口脉冲计数读取 (读取:AI寄存器,命令号:0x04)
- 描述
读模块的X输入口的脉冲计数值。
- 例子:读当前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
- 例子:读当前X1-X4输入点脉冲计数值的请求&响应报文
请求:
发送数据(HEX): 00 00 00 00 00 06 01 04 00 18 00 08
解释:
00 00:TID 传输标识符(用于上位机传输报文序列号),也可为0
00 00:PID 协议标识符,默认0
00 06:后面要发送的字节数
01:子站地址
04:指令号,04读AI
00 18:从哪一路开始读,0x0018对应的是X1脉冲计数寄存器起始地址
00 08:要读多少个寄存器,因为一路X脉冲计数占用2个寄存器地址,这里读4路,所以这里寄存器数量要填8,十六进制0x0008=十进制8
响应:
接收数据(HEX): 00 00 00 00 00 13 01 04 10 00 00 27 10 00 00 27 10 00 00 27 10 00 00 27 10
解释:
00 00:TID 传输标识符(用于上位机传输报文序列号),也可为0
00 00:PID 协议标识符,默认0
00 13:后面要发送的字节数,0x13=十进制19
01:子站地址
04:指令号,04读AI
10:后面跟的数据字节数,0x10=十进制16,后面数据区有16字节数据
00002710:换成十进制就是 0x00002710 =10000,即读取到X1输入口当前脉冲计数值为10000
00002710:换成十进制就是 0x00002710 =10000,即读取到X2输入口当前脉冲计数值为10000
00002710:换成十进制就是 0x00002710 =10000,即读取到X3输入口当前脉冲计数值为10000
00002710:换成十进制就是 0x00002710 =10000,即读取到X4输入口当前脉冲计数值为10000
- 例子:读当前X1-X8输入点脉冲计数值的请求&响应报文
请求:
发送数据(HEX): 00 00 00 00 00 06 01 04 00 18 00 10
解释:
00 00:TID 传输标识符(用于上位机传输报文序列号),也可为0
00 00:PID 协议标识符,默认0
00 06:后面要发送的字节数
01:子站地址
04:指令号,04读AI
00 18:从哪一路开始读,0x0018对应的是X1脉冲计数寄存器起始地址
00 10:要读多少个寄存器,因为一路X脉冲计数占用2个寄存器地址,这里读8路,所以这里寄存器数量要填十六进制0x0010=十进制16
响应:
接收数据(HEX): 00 00 00 00 00 23 01 04 20 00 00 27 10 00 00 27 10 00 00 27 10 00 00 27 10 00 00 27 10 00 00 27 10 00 00 27 10 00 00 27 10
解释:
00 00:TID 传输标识符(用于上位机传输报文序列号),也可为0
00 00:PID 协议标识符,默认0
00 23:后面要发送的字节数,0x23=十进制35
01:子站地址
04:指令号,04读AI
20:后面跟的数据字节数,0x20=十进制32,后面数据区有32字节数据
00002710:换成十进制就是 0x00002710 =10000,即读取到X1输入口当前脉冲计数值为10000
00002710:换成十进制就是 0x00002710 =10000,即读取到X2输入口当前脉冲计数值为10000
00002710:换成十进制就是 0x00002710 =10000,即读取到X3输入口当前脉冲计数值为10000
00002710:换成十进制就是 0x00002710 =10000,即读取到X4输入口当前脉冲计数值为10000
00002710:换成十进制就是 0x00002710 =10000,即读取到X5输入口当前脉冲计数值为10000
00002710:换成十进制就是 0x00002710 =10000,即读取到X6输入口当前脉冲计数值为10000
00002710:换成十进制就是 0x00002710 =10000,即读取到X7输入口当前脉冲计数值为10000
00002710:换成十进制就是 0x00002710 =10000,即读取到X8输入口当前脉冲计数值为10000
- 例子:读当前X1-X12输入点脉冲计数值的请求&响应报文
请求:
发送数据(HEX): 00 00 00 00 00 06 01 04 00 18 00 18
解释:
00 00:TID 传输标识符(用于上位机传输报文序列号),也可为0
00 00:PID 协议标识符,默认0
00 06:后面要发送的字节数
01:子站地址
04:指令号,04读AI
00 18:从哪一路开始读,0x0018对应的是X1脉冲计数寄存器起始地址
00 18:要读多少个寄存器,因为一路X脉冲计数占用2个寄存器地址,这里读12路,所以这里寄存器数量要填十六进制0x0018=十进制24
响应:
接收数据(HEX): 00 00 00 00 00 33 01 04 30 00 00 27 10 00 00 27 10 00 00 27 10 00 00 27 10 00 00 27 10 00 00 27 10 00 00 27 10 00 00 27 10 00 00 27 10 00 00 27 10 00 00 27 10 00 00 27 10
解释:
00 00:TID 传输标识符(用于上位机传输报文序列号),也可为0
00 00:PID 协议标识符,默认0
00 33:后面要发送的字节数
01:子站地址
04:指令号,04读AI
30:后面跟的数据字节数,0x30=十进制48,后面数据区有48字节数据
00002710:换成十进制就是 0x00002710 =10000,即读取到X1输入口当前脉冲计数值为10000
00002710:换成十进制就是 0x00002710 =10000,即读取到X2输入口当前脉冲计数值为10000
00002710:换成十进制就是 0x00002710 =10000,即读取到X3输入口当前脉冲计数值为10000
00002710:换成十进制就是 0x00002710 =10000,即读取到X4输入口当前脉冲计数值为10000
00002710:换成十进制就是 0x00002710 =10000,即读取到X5输入口当前脉冲计数值为10000
00002710:换成十进制就是 0x00002710 =10000,即读取到X6输入口当前脉冲计数值为10000
00002710:换成十进制就是 0x00002710 =10000,即读取到X7输入口当前脉冲计数值为10000
00002710:换成十进制就是 0x00002710 =10000,即读取到X8输入口当前脉冲计数值为10000
00002710:换成十进制就是 0x00002710 =10000,即读取到X9输入口当前脉冲计数值为10000
00002710:换成十进制就是 0x00002710 =10000,即读到X10输入口当前脉冲计数值为10000
00002710:换成十进制就是 0x00002710 =10000,即读到X11输入口当前脉冲计数值为10000
00002710:换成十进制就是 0x00002710 =10000,即读到X12输入口当前脉冲计数值为10000
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路
- 例子:清空X1-X12输入计数值的请求&响应报文
请求:
发送数据(HEX): 00 00 00 00 00 09 01 0f 00 40 00 0C 02 ff 0f
解释:
00 00:TID 传输标识符(用于上位机传输报文序列号),也可为0
00 00:PID 协议标识符,默认0
00 09:后面要发送的字节数
01:子站地址
0f:指令号,0x0f=十进制15,写多路DO
00 40:从哪一路开始清空,0x00 40是X1计数清空DO寄存器起始地址
00 0C:要清空多少路计数,十六进制0x000C=十进制12路
02:后面要写入的数据字节数,0x02=十进制2,写入2字节数据
ff:十六进制0xff=二进制1111 1111=X8计数清空-X7计数清空-X6计数清空-X5计数清空-X4计数清空-X3计数清空-X2计数清空-X1计数清空,对应的bit位写1清空,写0保持不变
0f: 十六进制0x0f=二进制0000 1111=X16计数清空-X15计数清空-X14计数清空-X13计数清空-X12计数清空-X11计数清空-X10计数清空-X9计数清空,对应的bit位写1清空,写0保持不变
响应:
//模块回复
00 00 00 00 00 06 01 0F 00 40 00 0C
解释:
00 00:TID 传输标识符(用于上位机传输报文序列号),也可为0
00 00:PID 协议标识符,默认0
00 06:后面要发送的字节数
01:子站地址
0f:指令号,0x0f=十进制15,写多路DO
00 40:从哪一路开始清空,0x00 40是X1计数清空DO寄存器起始地址
00 0C:要清空多少路计数,十六进制0x000C=十进制12路
- 例子:指定清空X1,X4,X8,X12,X24输入计数值的请求&响应报文
请求:
发送数据(HEX): 00 00 00 00 00 0A 01 0f 00 40 00 18 03 85 08 80
解释:
00 00:TID 传输标识符(用于上位机传输报文序列号),也可为0
00 00:PID 协议标识符,默认0
00 0A:后面要发送的字节数,0x0A=十进制10
01:子站地址
0f:指令号,0x0f=十进制15,写多路DO
00 40:从哪一路开始清空,0x00 40是X1计数清空DO寄存器起始地址
00 18:要清空多少路计数,十六进制0x0018=十进制24路
03:后面要写入的数据字节数,0x03=十进制3,写入3字节数据
85:十六进制0x85=二进制1000 1001=X8计数清空-X7计数清空-X6计数清空-X5计数清空-X4计数清空-X3计数清空-X2计数清空-X1计数清空,对应的bit位写1清空,写0保持不变
08: 十六进制0x08=二进制0000 1000=X16计数清空-X15计数清空-X14计数清空-X13计数清空-X12计数清空-X11计数清空-X10计数清空-X9计数清空,对应的bit位写1清空,写0保持不变
80: 十六进制0x80=二进制1000 0000=X24计数清空-X23计数清空-X22计数清空-X21计数清空-X20计数清空-X19计数清空-X18计数清空-X17计数清空,对应的bit位写1清空,写0保持不变
响应:
//模块回复
00 00 00 00 00 06 01 0F 00 40 00 18
解释:
00 00:TID 传输标识符(用于上位机传输报文序列号),也可为0
00 00:PID 协议标识符,默认0
00 06:后面要发送的字节数
01:子站地址
0f:指令号,0x0f=十进制15,写多路DO
00 40:从哪一路开始清空,0x00 40是X1计数清空DO寄存器起始地址
00 18:操作了多少路计数,十六进制0x0018=十进制24路
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路
- 例子:控制Y1-Y8当前输出ON/OFF的请求&响应报文
//将Y1,Y2,Y8输出ON,其他路输出OFF
请求:
发送数据(HEX): 00 00 00 00 00 08 01 0f 00 00 00 08 01 83
解释:
00 00:TID 传输标识符(用于上位机传输报文序列号),也可为0
00 00:PID 协议标识符,默认0
00 08:后面要发送的字节数
01:子站地址
0f:指令号,0x0f=十进制15,写多路DO
00 00:从哪一路开始写,00 00=Y1开始写
00 08:要写多少路,十六进制0x0008=十进制8,写8路
01:后面要写入的数据字节数,0x01=十进制1,写入1字节数据
83:写入的数据,0x83换算成二进制10000011 = Y8-Y7-Y6-Y5-Y4-Y3-Y2-Y1输出状态,ON=0,OFF=1
响应:
//模块回复
00 00 00 00 00 06 01 0F 00 00 00 08
解释:
00 00:TID 传输标识符(用于模块回送报文序列号),也可为0
00 00:PID 协议标识符,默认0
00 06:后面要发送的字节数
01:子站地址
0f:指令号,0x0f=十进制15,写多路DO
00 00:从哪一路开始写,00 00=Y1开始写
00 08:写了多少路,十六进制0x0008=十进制8,写8路
- 例子:控制Y1-Y24当前输出ON/OFF的请求&响应报文
//将Y1,Y2,Y9,Y24输出ON,其他路输出OFF
请求:
发送数据(HEX): 00 00 00 00 00 0a 01 0f 00 00 00 18 03 03 01 80
解释:
00 00:TID 传输标识符(用于上位机传输报文序列号),也可为0
00 00:PID 协议标识符,默认0
00 0a:后面要发送的字节数,0x0a=十进制10
01:子站地址
0f:指令号,0x0f=十进制15,写多路DO
00 00:从哪一路开始写,00 00=Y1开始写
00 18:要写多少路,十六进制0x0018=十进制24,写24路
03:后面要写入的数据字节数,0x01=十进制1,写入1字节数据
03:写入的数据,0x03换算成二进制00000011 = Y8-Y7-Y6-Y5-Y4-Y3-Y2-Y1输出状态,ON=0,OFF=1
01:写入的数据,0x01换算成二进制00000001 = Y16-Y15-Y14-Y13-Y12-Y11-Y10-Y9输出状态,ON=0,OFF=1
80:写入的数据,0x80换算成二进制10000000 = Y24-Y23-Y22-Y21-Y20-Y19-Y18-Y17输出状态,ON=0,OFF=1
响应:
//模块回复
00 00 00 00 00 06 01 0F 00 00 00 18
解释:
00 00:TID 传输标识符(用于模块回送报文序列号),也可为0
00 00:PID 协议标识符,默认0
00 06:后面要发送的字节数
01:子站地址
0f:指令号,0x0f=十进制15,写多路DO
00 00:从哪一路开始写,00 00=Y1开始写
00 18:写了多少路,十六进制0x0018=十进制24,写24路
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的状态
- 例子:读Y1-Y8当前输出状态的请求&响应报文
请求:
发送数据(HEX): 00 00 00 00 00 06 01 01 00 00 00 08
解释:
00 00:TID 传输标识符(用于上位机传输报文序列号),也可为0
00 00:PID 协议标识符,默认0
00 06:后面要发送的字节数
01:子站地址
01:指令号,01读取多路DO
00 00:从哪一路开始读,00 00=Y1开始读
00 08:要读多少路,十六进制0x0008=十进制8,读取8路
响应:
//Y1,Y2,Y8输出ON(1),其他输出OFF(0)时的回复
00 00 00 00 00 04 01 01 01 83
解释:
00 00:TID 传输标识符(用于模块回送报文序列号),也可为0
00 00:PID 协议标识符,默认0
00 04:后面要发送的字节数
01:子站地址
01:指令号,01读取多路DO
01:后面数据区字节数,0x01=十进制1,后面数据区有1字节数据
83:数据区,换算成二进制0x83=1000 0011,对应Y8-Y7-Y6-Y5-Y4-Y3-Y2-Y1的状态
- 例子:读Y1-Y24当前输出状态的请求&响应报文
请求:
发送数据(HEX): 00 00 00 00 00 06 01 01 00 00 00 18
解释:
00 00:TID 传输标识符(用于上位机传输报文序列号),也可为0
00 00:PID 协议标识符,默认0
00 06:后面要发送的字节数
01:子站地址
01:指令号,01读取多路DO
00 00:从哪一路开始读,00 00=Y1开始读
00 18:要读多少路,十六进制0x0018=十进制24,读取24路
响应:
//Y1,Y2,Y9,Y24输出ON(1),其他输出OFF(0)时的回复
00 00 00 00 00 06 01 01 03 03 01 80
解释:
00 00:TID 传输标识符(用于模块回送报文序列号),也可为0
00 00:PID 协议标识符,默认0
00 06:后面要发送的字节数
01:子站地址
01:指令号,01读取多路DO
03:后面数据区字节数,0x03=十进制3,后面数据区有3字节数据
03:数据,换算成二进制0x03=0000 0011,对应Y8-Y7-Y6-Y5-Y4-Y3-Y2-Y1的状态
01:数据,换算成二进制0x01=0000 0001,对应Y16-Y15-Y14-Y13-Y12-Y11-Y10-Y9的状态
80:数据,换算成二进制0x80=1000 0000,对应Y24-Y23-Y22-Y21-Y20-Y19-Y18-Y17的状态
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
- 例子:读当前AI通道AI1-AI4模拟量输入值的请求&响应报文
请求:
发送数据(HEX): 00 00 00 00 00 06 01 04 00 00 00 08
解释:
00 00:TID 传输标识符(用于上位机传输报文序列号),也可为0
00 00:PID 协议标识符,默认0
00 06:后面要发送的字节数
01:子站地址
04:指令号,04读AI
00 00:从哪一路开始读,0x0000=AIO1开始读
00 08:要多少个寄存器,因为一个AI通道占用2个寄存器地址,所以这里读4路模拟量的话,寄存器数量要填8,十六进制0x0008=十进制8
响应:
接收数据(HEX): 00 00 00 00 00 13 01 04 10 00 00 BF 11 00 00 BF 11 00 00 BF 11 00 00 BF 11
解释:
00 00:TID 传输标识符(用于模块回送报文序列号),也可为0
00 00:PID 协议标识符,默认0
00 13:后面要发送的字节数,0x13=十进制19
01:子站地址
04:指令号,04读AI
10:后面跟的数据字节数,0x10=十进制16,后面数据区有16字节数据
0000BF11:数据区,换成十进制就是 0x0000BF11 =48913,即读取到AI1模拟量输入口当前值为48913
0000BF11:数据区,换成十进制就是 0x0000BF11 =48913,即读取到AI2模拟量输入口当前值为48913
0000BF11:数据区,换成十进制就是 0x0000BF11 =48913,即读取到AI3模拟量输入口当前值为48913
0000BF11:数据区,换成十进制就是 0x0000BF11 =48913,即读取到AI4模拟量输入口当前值为48913
- 例子:读当前AI通道AI1-AI8模拟量输入值的请求&响应报文
请求:
发送数据(HEX): 00 00 00 00 00 06 01 04 00 00 00 10
解释:
00 00:TID 传输标识符(用于上位机传输报文序列号),也可为0
00 00:PID 协议标识符,默认0
00 06:后面要发送的字节数
01:子站地址
04:指令号,04读AI
00 00:从哪一路开始读,0x0000=AIO1开始读
00 10:要多少个寄存器,因为一个AI通道占用2个寄存器地址,所以这里读8路模拟量的话,寄存器数量要填16,换算成十六进制就是0x0010
响应:
接收数据(HEX): 00 00 00 00 00 23 01 04 20 00 00 BF 11 00 00 BF 11 00 00 BF 11 00 00 BF 11 00 00 BF 11 00 00 BF 11 00 00 BF 11 00 00 BF 11
解释:
00 00:TID 传输标识符(用于模块回送报文序列号),也可为0
00 00:PID 协议标识符,默认0
00 23:后面要发送的字节数,0x23=十进制35
01:子站地址
04:指令号,04读AI
20:后面跟的数据字节数,0x20=十进制32,后面数据区有32字节数据
0000BF11:数据区,换成十进制就是 0x0000BF11 =48913,即读取到AI1模拟量输入口当前值为48913
0000BF11:数据区,换成十进制就是 0x0000BF11 =48913,即读取到AI2模拟量输入口当前值为48913
0000BF11:数据区,换成十进制就是 0x0000BF11 =48913,即读取到AI3模拟量输入口当前值为48913
0000BF11:数据区,换成十进制就是 0x0000BF11 =48913,即读取到AI4模拟量输入口当前值为48913
0000BF11:数据区,换成十进制就是 0x0000BF11 =48913,即读取到AI5模拟量输入口当前值为48913
0000BF11:数据区,换成十进制就是 0x0000BF11 =48913,即读取到AI6模拟量输入口当前值为48913
0000BF11:数据区,换成十进制就是 0x0000BF11 =48913,即读取到AI7模拟量输入口当前值为48913
0000BF11:数据区,换成十进制就是 0x0000BF11 =48913,即读取到AI8模拟量输入口当前值为48913
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路
- 例子:写当前AO通道AO1-AO4模拟量输出值的请求&响应报文
请求:
发送数据(HEX): 00 00 00 00 00 0f 01 10 00 00 00 04 08 10 D2 10 D2 10 D2 10 D2
解释:
00 00:TID 传输标识符(用于上位机传输报文序列号),也可为0
00 00:PID 协议标识符,默认0
00 0f:后面要发送的字节数,0x0f=十进制15
01:子站地址
10:指令号,0x10=十进制16,写AO
00 00:从哪一路开始写,0x0000=AIO1开始写
00 04:要写多少路,十六进制0x0004=十进制4,写4路
08:后面要写入的数据字节数,0x08=十进制8,写8个字节
10D2:要写入的AO输出值,0x10D2=十进制4306,即写入AO1输出口模拟量输出值为4306
10D2:要写入的AO输出值,0x10D2=十进制4306,即写入AO2输出口模拟量输出值为4306
10D2:要写入的AO输出值,0x10D2=十进制4306,即写入AO3输出口模拟量输出值为4306
10D2:要写入的AO输出值,0x10D2=十进制4306,即写入AO4输出口模拟量输出值为4306
响应:
接收数据(HEX): 00 00 00 00 00 06 01 10 00 00 00 04
解释:
00 00:TID 传输标识符(用于模块回送报文序列号),也可为0
00 00:PID 协议标识符,默认0
00 06:后面要发送的字节数
01:子站地址
10:指令号,0x10=十进制16,写AO
00 00:从哪一路开始写,0x0000=AIO1开始写
00 04:写了多少路,十六进制0x0004=十进制4,写4路
- 例子:写当前AO通道AO1-AO8模拟量输出值的请求&响应报文
请求:
发送数据(HEX): 00 00 00 00 00 17 01 10 00 00 00 08 10 10 D2 10 D2 10 D2 10 D2 10 D2 10 D2 10 D2 10 D2
解释:
00 00:TID 传输标识符(用于上位机传输报文序列号),也可为0
00 00:PID 协议标识符,默认0
00 17:后面要发送的字节数,0x17=十进制23
01:子站地址
10:指令号,0x10=十进制16,写AO
00 00:从哪一路开始写,0x0000=AIO1开始写
00 08:要写多少路,十六进制0x0008=十进制8,写8路
10:后面要写入的数据字节数,0x10=十进制16,16个字节
10D2:要写入的AO输出值,0x10D2=十进制4306,即写入AO1输出口模拟量输出值为4306
10D2:要写入的AO输出值,0x10D2=十进制4306,即写入AO2输出口模拟量输出值为4306
10D2:要写入的AO输出值,0x10D2=十进制4306,即写入AO3输出口模拟量输出值为4306
10D2:要写入的AO输出值,0x10D2=十进制4306,即写入AO4输出口模拟量输出值为4306
10D2:要写入的AO输出值,0x10D2=十进制4306,即写入AO5输出口模拟量输出值为4306
10D2:要写入的AO输出值,0x10D2=十进制4306,即写入AO6输出口模拟量输出值为4306
10D2:要写入的AO输出值,0x10D2=十进制4306,即写入AO7输出口模拟量输出值为4306
10D2:要写入的AO输出值,0x10D2=十进制4306,即写入AO8输出口模拟量输出值为4306
响应:
接收数据(HEX): 00 00 00 00 00 06 01 10 00 00 00 08
解释:
00 00:TID 传输标识符(用于模块回送报文序列号),也可为0
00 00:PID 协议标识符,默认0
00 06:后面要发送的字节数
01:子站地址
10:指令号,0x10=十进制16,写AO
00 00:从哪一路开始写,0x0000=AIO1开始写
00 08:写了多少路,十六进制0x0008=十进制8,写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
- 例子:读当前AO通道AO1-AO4模拟量输出值的请求&响应报文
请求:
发送数据(HEX): 00 00 00 00 00 06 01 03 00 00 00 04
解释:
00 00:TID 传输标识符(用于上位机传输报文序列号),也可为0
00 00:PID 协议标识符,默认0
00 06:后面要发送的字节数
01:子站地址
03:指令号,03读AO
00 00:从哪一路开始读,0x0000=AIO1开始读
00 04:要读多少路,十六进制0x0004=十进制4,读取4路
响应:
接收数据(HEX): 00 00 00 00 00 0B 01 03 08 10 D2 10 D2 10 D2 10 D2
解释:
00 00:TID 传输标识符(用于模块回送报文序列号),也可为0
00 00:PID 协议标识符,默认0
00 0B:后面要发送的字节数,0x000B=十进制11
01:子站地址
03:指令号,03读AO
08:后面跟的数据字节数
10 D2:换成十进制就是 0x10D2 =十进制4306,即读取到AO1输出模拟量当前输出值为4306
10 D2:换成十进制就是 0x10D2 =十进制4306,即读取到AO2输出模拟量当前输出值为4306
10 D2:换成十进制就是 0x10D2 =十进制4306,即读取到AO3输出模拟量当前输出值为4306
10 D2:换成十进制就是 0x10D2 =十进制4306,即读取到AO4输出模拟量当前输出值为4306
- 例子:读当前AO通道AO1-AO8模拟量输出值的请求&响应报文
请求:
发送数据(HEX): 00 00 00 00 00 06 01 03 00 00 00 08
解释:
00 00:TID 传输标识符(用于上位机传输报文序列号),也可为0
00 00:PID 协议标识符,默认0
00 06:后面要发送的字节数
01:子站地址
03:指令号,03读AO
00 00:从哪一路开始读,0x0000=AIO1开始读
00 08:要读多少路,十六进制0x0008=十进制8,读取8路
响应:
接收数据(HEX): 00 00 00 00 00 13 01 03 10 10 D2 10 D2 10 D2 10 D2 10 D2 10 D2 10 D2 10 D2
解释:
00 00:TID 传输标识符(用于模块回送报文序列号),也可为0
00 00:PID 协议标识符,默认0
00 13:后面要发送的字节数,0x0013=十进制19
01:子站地址
03:指令号,03读AO
10:后面跟的数据字节数,十六进制0x10=十进制16
10 D2:换成十进制就是 0x10D2 =十进制4306,即读取到AO1输出模拟量当前输出值为4306
10 D2:换成十进制就是 0x10D2 =十进制4306,即读取到AO2输出模拟量当前输出值为4306
10 D2:换成十进制就是 0x10D2 =十进制4306,即读取到AO3输出模拟量当前输出值为4306
10 D2:换成十进制就是 0x10D2 =十进制4306,即读取到AO4输出模拟量当前输出值为4306
10 D2:换成十进制就是 0x10D2 =十进制4306,即读取到AO5输出模拟量当前输出值为4306
10 D2:换成十进制就是 0x10D2 =十进制4306,即读取到AO6输出模拟量当前输出值为4306
10 D2:换成十进制就是 0x10D2 =十进制4306,即读取到AO7输出模拟量当前输出值为4306
10 D2:换成十进制就是 0x10D2 =十进制4306,即读取到AO8输出模拟量当前输出值为4306