modbus协议详解modbus-rtu、modbus-tcp协议实例介绍

  综科智控MODBUS-RTU/TCP

                                                               目录

一、         MODBUS协议简介... 4

1.      什么是MODBUS协议... 4

2.      MODBUS协议格式... 5

2.1       MODBUS-RTU报文模型(用于串口通讯). 5

2.2       MODBUS-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协议简介

1.   什么是MODBUS协议

Modbus协议是一种已广泛应用于当今工业控制领域的通用通讯协议,按其格式可分为MODBUS-RTU,MODBUS-ASCII,MODBUS-TCP,其中前两者适用于串行通信控制网络中,例如RS485,RS232,MODBUS-TCP主要应用于基于以太网TCP/IP通信的控制网络中。

通过此协议,控制器相互之间、或控制器经由网络(如以太网)可以和其它设备之间进行通信。Modbus协议使用的是主从通讯技术,即由主设备主动查询和操作从设备。一般将主控设备方所使用的协议称为Modbus Master,从设备方使用的协议称为Modbus Slave。典型的主设备包括工控机和工业控制器等;典型的从设备如PLC可编程控制器等。Modbus通讯物理接口可以选用串口(包括RS232RS485),也可以选择以太网口。其通信遵循以下的过程:

   ● 主设备向从设备发送请求

  ● 从设备分析并处理主设备的请求,然后向主设备发送结果

  ● 如果出现任何差错,从设备将返回一个异常功能码

   Modbus协议具有以下几个特点:

   (1)标准、开放,用户可以免费、放心地使用Modbus协议,不需要交纳许可证费,也不会侵犯知识产权。

   (2)Modbus可以支持多种电气接口,如RS-232RS-485等,还可以在各种介质上传送,如双绞线、光纤、无线等。

   (3)Modbus的帧格式简单、紧凑,通俗易懂。用户使用容易,厂商开发简单。

 2.   MODBUS协议格式

1.   

2.   

2.1  MODBUS-RTU报文模型(用于串口通讯)

设备地址

功能码

数据

CRC校验L

CRC校验H

1BYTE

1BYTE

N*BYTE

1BYTE

1BYTE

2.2  MODBUS-TCP报文模型(用于网络TCP/IP通信)

传输标识符TID

协议标识符PID

后面要传输的字节数

设备地址

功能码

数据

2BYTE

2BYTE

2BYTE

1BYTE

1BYTE

N*BYTE

注意:

Modbus-RTU一般用于串口RS232/RS485/RS422通讯

Modbus-TCP一般用于网口、WIFITCP/UDP通讯

 3.   MODBUS的功能码及寄存器介绍

3.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

字操作

单个/多个

 3.2     寄存器分类说明

寄存器种类

说明

DI寄存器

只读,主要用于读模块的DI离散量输入信号的 ON/OFF状态。

DO寄存器

可读/可写,主要用于控制相应DO输出,例如:Y点的开关状态。也可以用于控制某些功能的启动或停止、打开或关闭,例如:PWM的输出/停止,计数的清空等。

AI寄存器

只度,主要用于读取模块中的输入型数据,例如AD模拟采集到的电压值,电流值,压力值等,或者X输入脉冲计数值等。

AO寄存器

可读/可写,主要用于存放的用户下发的参数,例如AO模拟量输出值、PWM输出频率、占空比等。

3.3     寄存器地址说明

n  寄存器信息地址(PLC地址):

寄存器信息地址指的是存放于控制器中的地址,这些控制器可以是 PLC,也可以使触

摸屏,或是文本显示器。例如 4x00013x0002等,这些地址一般使用十进制描述。

 n  寄存器寻址地址(协议地址):

寄存器寻址地址指的是通信时使用的寄存器地址,例如信息地址 40001对应寻址地址

0x000040002对应寻址地址  0x0001,寄存器寻址地址一般使用 16进制描述。再如,信息寄存器 40003对应寻址地址  0002,信息寄存器 30003对应寻址地址  0002,虽然两个信息寄存器通信时使用相同的地址,但是需要使用不同的命令才可以访问,所以访问时不存在冲突。

二、 MODBUS-RTU协议详解

1.   X输入口开关量状态读取 (读取:DI寄存器,命令号:0x02)

n  描述

读模块的X输入口输入信号的 ON/OFF状态。

n  例子:读X1当前输入状态的请求&响应报文

请求:

发送数据(HEX): 01 02 00 00 00 01 B9 CA

解释:

01:子站地址

02:指令号,02DI

00 00:从哪一路开始读,0x0000=X1开始读

00 01:要读多少路,十六进制0x0001=十进制1,读取1

B9 CA:CRC校验

响应:

//X1 输入ON(1)时的回复

01 02 01 01 60 48

解释:

01:子站地址

02:指令号,02DI

01:后面跟的数据字节数

01:换成二进制就是 0000 0001 =X8-X7-X6-X5-X4-X3-X2-X1输入口的当前状态0=OFF1=ON

60 48:CRC校验

//X1 输入OFF(0)时的回复

01 02 01 00 A1 88

解释:

01:子站地址

02:指令号,02DI

01:后面跟的数据字节数

00:换成二进制就是 0000 0000 =X8-X7-X6-X5-X4-X3-X2-X1输入口的当前状态0=OFF1=ON

A1 88:CRC校验

n  例子:读X1-X8当前输入状态的请求&响应报文

请求:

发送数据(HEX): 01 02 00 00 00 08 79CC

解释:

01:子站地址

02:指令号,02DI

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:指令号,02DI

01:后面跟的数据字节数

81:换成二进制就是1000 0001 =X8-X7-X6-X5-X4-X3-X2-X1输入口的当前状态0=OFF1=ON

61 E8:CRC校验

n  例子:读X1-X24当前输入状态的请求&响应报文

请求:

发送数据(HEX): 01 02 00 00 00 18 78 00

解释:

01:子站地址

02:指令号,02DI

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:指令号,02DI

03:后面跟的数据字节数

03:换成二进制就是 0000 0011 =X8-X7-X6-X5-X4-X3-X2-X1输入口的当前状态0=OFF1=ON

01:换成二进制就是 0000 0001 =X16-X15-X14-X13-X12-X11-X10-X9输入口的当前状态0=OFF1=ON

80:换成二进制就是 1000 0000 =X24-X23-X22-X21-X20-X19-X18-X17输入口的当前状态0=OFF1=ON

88 7E:CRC校验

2.   X输入口脉冲计数读取 (读取:AI寄存器,命令号:0x04)

n  描述

读模块的X输入口的脉冲计数值。

n  例子:读当前X1输入点脉冲计数值的请求&响应报文

请求:

发送数据(HEX): 01 04 00 18 00 02 F1 CC

解释:

01:子站地址

04:指令号,04AI

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:指令号,04AI

04:后面跟的数据字节数,0x04=十进制4,后面数据区有4字节数据

00002710:换成十进制就是 0x00002710 =10000,即读取到X1输入口当前脉冲计数值为10000

E1 B8:CRC校验

n  例子:读当前X1-X4输入点脉冲计数值的请求&响应报文

请求:

发送数据(HEX): 01 04 00 18 00 08 71 CB

解释:

01:子站地址

04:指令号,04AI

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:指令号,04AI

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校验

n  例子:读当前X1-X8输入点脉冲计数值的请求&响应报文

请求:

发送数据(HEX): 01 04 00 18 00 10 71 C1

解释:

01:子站地址

04:指令号,04AI

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:指令号,04AI

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校验

n  例子:读当前X1-X12输入点脉冲计数值的请求&响应报文

请求:

发送数据(HEX): 01 04 00 18 00 18 70 07

解释:

01:子站地址

04:指令号,04AI

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:指令号,04AI

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校验

3.   X输入口脉冲计数清空 (写入:DO寄存器,命令号:0x0F)

n  描述

清空模块的X输入口的脉冲计数值。

n  例子:清空X1输入计数值的请求&响应报文

请求:

发送数据(HEX): 01 0f 00 40 00 01 01 01 ee 98

解释:

01:子站地址

0f:指令号,0x0f=十进制15,写多路DO

00 40:从哪一路开始清空,0x00 40X1计数清空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 40X1计数清空DO寄存器起始地址

00 01:要清空多少路计数,十六进制0x0001=十进制1

95 df:CRC校验

n  例子:清空X1-X12输入计数值的请求&响应报文

请求:

发送数据(HEX): 01 0f 00 40 00 0C 02 ff 0f ea 84

解释:

01:子站地址

0f:指令号,0x0f=十进制15,写多路DO

00 40:从哪一路开始清空,0x00 40X1计数清空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 40X1计数清空DO寄存器起始地址

00 0C:要清空多少路计数,十六进制0x000C=十进制12

54 1A:CRC校验

n  例子:指定清空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 40X1计数清空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 40X1计数清空DO寄存器起始地址

00 18:操作了多少路计数,十六进制0x0018=十进制24

54 15:CRC校验

4.   Y输出口ON/OFF写入 (写入:DO寄存器,命令号:0x0F)

n  描述

用于控制模块Y输出点的开关状态。

n  例子:控制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=0OFF=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校验

n  例子:控制Y1-Y8当前输出ON/OFF的请求&响应报文

//Y1Y2Y8输出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=0OFF=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校验

n  例子:控制Y1-Y24当前输出ON/OFF的请求&响应报文

//Y1Y2Y9Y24输出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=0OFF=1

01:写入的数据,0x01换算成二进制00000001 = Y16-Y15-Y14-Y13-Y12-Y11-Y10-Y9输出状态,ON=0OFF=1

80:写入的数据,0x80换算成二进制10000000 = Y24-Y23-Y22-Y21-Y20-Y19-Y18-Y17输出状态,ON=0OFF=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校验

5.   Y输出口ON/OFF读取 (读取:DO寄存器,命令号:0x01)

n  描述

用于读取当前Y输出口的开关状态。

n  例子:读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校验

n  例子:读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校验

n  例子:读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校验

6.   AI模拟量采集读取(读取:AI寄存器,命令号:0x04)

n  描述

读模块中的输入型数据,例如AD模拟采集到的电压值,电流值,压力值等。

n  例子:读当前AI通道AI1模拟量输入值的请求&响应报文

请求:

发送数据(HEX): 01 04 00 00 00 02 71CB

解释:

01:子站地址

04:指令号,04AI

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:指令号,04AI

04:后面跟的数据字节数,0x04=十进制4,后面数据区有4字节数据

0000BF11:换成十进制就是 0x0000BF11 =48913,即读取到AI1模拟量输入口当前值为48913

4B B8:CRC校验

n  例子:读当前AI通道AI1-AI4模拟量输入值的请求&响应报文

请求:

发送数据(HEX): 01 04 00 00 00 08 F1 CC

解释:

01:子站地址

04:指令号,04AI

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:指令号,04AI

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校验

n  例子:读当前AI通道AI1-AI8模拟量输入值的请求&响应报文

请求:

发送数据(HEX): 01 04 00 00 00 10 F1 C6

解释:

01:子站地址

04:指令号,04AI

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:指令号,04AI

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校验

7.   AO模拟量输出写入(写入:AO寄存器,命令号:0x10)

n  描述

         用于设定DA模拟量输出值。

n  例子:写当前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校验

n  例子:写当前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校验

n  例子:写当前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=十进制1616个字节

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校验

8.   AO模拟量输出读取(读取:AO寄存器,命令号:0x03)

n  描述

用于读取当前DA模拟量输出值。

n  例子:读当前AO通道AO1模拟量输出值的请求&响应报文

请求:

发送数据(HEX): 01 03 00 00 00 01 84 0A

解释:

01:子站地址

03:指令号,03AO

00 00:从哪一路开始读,0x0000=AIO1开始读

00 01:要读多少路,十六进制0x0001=十进制1,读取1

84 0A:CRC校验

响应:

接收数据(HEX): 01 03 02 10 D2 35 D9

解释:

01:子站地址

03:指令号,03AO

02:后面跟的数据字节数

10 D2:换成十进制就是0x10D2 =十进制4306,即读取到AO1输出模拟量当前输出值为4306

35 D9:CRC校验

n  例子:读当前AO通道AO1-AO4模拟量输出值的请求&响应报文

请求:

发送数据(HEX): 01 03 00 00 00 04 44 09

解释:

01:子站地址

03:指令号,03AO

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:指令号,03AO

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校验

n  例子:读当前AO通道AO1-AO8模拟量输出值的请求&响应报文

请求:

发送数据(HEX): 01 03 00 00 00 08 44 0C

解释:

01:子站地址

03:指令号,03AO

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:指令号,03AO

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协议详解

1.   X输入口开关量状态读取 (读取:DI寄存器,命令号:0x02)

n  描述

读模块X输入点的ON/OFF状态等。

n  例子:读X1当前输入状态的请求&响应报文

请求:

发送数据(HEX): 00 00 00 00 00 06 01 02 00 00 00 01

解释:

00 00TID 传输标识符(用于上位机传输报文序列号),也可为0

00 00PID 协议标识符,默认0

00 06:后面要发送的字节数

01:子站地址

02:指令号,02DI

00 00:从哪一路开始读,0x0000=X1开始读

00 01:要读多少路,十六进制0x0001=十进制1,读取1

响应:

//X1 输入ON(1)时的回复

00 00 00 00 00 04 01 02 01 01

解释:

00 00TID 传输标识符(用于模块回送报文序列号),也可为0

00 00PID 协议标识符,默认0

00 04:后面要发送的字节数

01:子站地址

02:指令号,02DI

01:后面跟的数据字节数

01:换成二进制就是 0000 0001 =X8-X7-X6-X5-X4-X3-X2-X1输入口的当前状态0=OFF1=ON

//X1 输入OFF(0)时的回复

00 00 00 00 00 04 01 02 01 00

解释:

00 00TID 传输标识符(用于模块回送报文序列号),也可为0

00 00PID 协议标识符,默认0

00 04:后面要发送的字节数

01:子站地址

02:指令号,02DI

01:后面跟的数据字节数

00:换成二进制就是 0000 0000 =X8-X7-X6-X5-X4-X3-X2-X1输入口的当前状态0=OFF1=ON

n  例子:读X1-X8当前输入状态的请求&响应报文

请求:

发送数据(HEX): 00 00 00 00 00 06 01 02 00 00 00 08

解释:

00 00TID 传输标识符(用于上位机传输报文序列号),也可为0

00 00PID 协议标识符,默认0

00 06:后面要发送的字节数

01:子站地址

02:指令号,02DI

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 00TID 传输标识符(用于模块回送报文序列号),也可为0

00 00PID 协议标识符,默认0

00 04:后面要发送的字节数

01:子站地址

02:指令号,02DI

01:后面跟的数据字节数

81:换成二进制就是1000 0001 =X8-X7-X6-X5-X4-X3-X2-X1输入口的当前状态0=OFF1=ON

n  例子:读X1-X24当前输入状态的请求&响应报文

请求:

发送数据(HEX):00 00 00 00 00 06 01 02 00 00 00 18

解释:

00 00TID 传输标识符(用于上位机传输报文序列号),也可为0

00 00PID 协议标识符,默认0

00 06:后面要发送的字节数

01:子站地址

02:指令号,02DI

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 00TID 传输标识符(用于模块回送报文序列号),也可为0

00 00PID 协议标识符,默认0

00 06:后面要发送的字节数

01:子站地址

02:指令号,02DI

03:后面跟的数据字节数

03:换成二进制就是 0000 0011 =X8-X7-X6-X5-X4-X3-X2-X1输入口的当前状态0=OFF1=ON

01:换成二进制就是 0000 0001 =X16-X15-X14-X13-X12-X11-X10-X9输入口的当前状态0=OFF1=ON

80:换成二进制就是 1000 0000 =X24-X23-X22-X21-X20-X19-X18-X17输入口的当前状态0=OFF1=ON

2.   X输入口脉冲计数读取 (读取:AI寄存器,命令号:0x04)

n  描述

读模块的X输入口的脉冲计数值。

n  例子:读当前X1输入点脉冲计数值的请求&响应报文

请求:

发送数据(HEX): 00 00 00 00 00 06 01 04 00 18 00 02

解释:

00 00TID 传输标识符(用于上位机传输报文序列号),也可为0

00 00PID 协议标识符,默认0

00 06:后面要发送的字节数

01:子站地址

04:指令号,04AI

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 00TID 传输标识符(用于上位机传输报文序列号),也可为0

00 00PID 协议标识符,默认0

00 07:后面要发送的字节数

01:子站地址

04:指令号,04AI

04:后面跟的数据字节数,0x04=十进制4,后面数据区有4字节数据

00002710:换成十进制就是 0x00002710 =10000,即读取到X1输入口当前脉冲计数值为10000

n  例子:读当前X1-X4输入点脉冲计数值的请求&响应报文

请求:

发送数据(HEX): 00 00 00 00 00 06 01 04 00 18 00 08

解释:

00 00TID 传输标识符(用于上位机传输报文序列号),也可为0

00 00PID 协议标识符,默认0

00 06:后面要发送的字节数

01:子站地址

04:指令号,04AI

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 00TID 传输标识符(用于上位机传输报文序列号),也可为0

00 00PID 协议标识符,默认0

00 13:后面要发送的字节数,0x13=十进制19

01:子站地址

04:指令号,04AI

10:后面跟的数据字节数,0x10=十进制16,后面数据区有16字节数据

00002710:换成十进制就是 0x00002710 =10000,即读取到X1输入口当前脉冲计数值为10000

00002710:换成十进制就是 0x00002710 =10000,即读取到X2输入口当前脉冲计数值为10000

00002710:换成十进制就是 0x00002710 =10000,即读取到X3输入口当前脉冲计数值为10000

00002710:换成十进制就是 0x00002710 =10000,即读取到X4输入口当前脉冲计数值为10000

n  例子:读当前X1-X8输入点脉冲计数值的请求&响应报文

请求:

发送数据(HEX): 00 00 00 00 00 06 01 04 00 18 00 10

解释:

00 00TID 传输标识符(用于上位机传输报文序列号),也可为0

00 00PID 协议标识符,默认0

00 06:后面要发送的字节数

01:子站地址

04:指令号,04AI

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 00TID 传输标识符(用于上位机传输报文序列号),也可为0

00 00PID 协议标识符,默认0

00 23:后面要发送的字节数,0x23=十进制35

01:子站地址

04:指令号,04AI

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

n  例子:读当前X1-X12输入点脉冲计数值的请求&响应报文

请求:

发送数据(HEX): 00 00 00 00 00 06 01 04 00 18 00 18

解释:

00 00TID 传输标识符(用于上位机传输报文序列号),也可为0

00 00PID 协议标识符,默认0

00 06:后面要发送的字节数

01:子站地址

04:指令号,04AI

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 00TID 传输标识符(用于上位机传输报文序列号),也可为0

00 00PID 协议标识符,默认0

00 33:后面要发送的字节数

01:子站地址

04:指令号,04AI

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

3.   X输入口脉冲计数清空 (写入:DO寄存器,命令号:0x0F)

n  描述

清空模块的X输入口的脉冲计数值。

n  例子:清空X1输入计数值的请求&响应报文

请求:

发送数据(HEX): 00 00 00 00 00 08 01 0f 00 40 00 01 01 01

解释:

00 00TID 传输标识符(用于上位机传输报文序列号),也可为0

00 00PID 协议标识符,默认0

00 08:后面要发送的字节数

01:子站地址

0f:指令号,0x0f=十进制15,写多路DO

00 40:从哪一路开始清空,0x00 40X1计数清空DO寄存器起始地址

00 01:要清空多少路计数,十六进制0x0001=十进制1

01:后面要写入的数据字节数,0x01=十进制1,写入1字节数据

01:写入的数据,写1清空

响应:

//模块回复

00 00 00 00 00 06 01 0F 00 40 00 01

解释:

00 00TID 传输标识符(用于上位机传输报文序列号),也可为0

00 00PID 协议标识符,默认0

00 06:后面要发送的字节数

01:子站地址

0f:指令号,0x0f=十进制15,写多路DO

00 40:从哪一路开始清空,0x00 40X1计数清空DO寄存器起始地址

00 01:要清空多少路计数,十六进制0x0001=十进制1

n  例子:清空X1-X12输入计数值的请求&响应报文

请求:

发送数据(HEX): 00 00 00 00 00 09 01 0f 00 40 00 0C 02 ff 0f

解释:

00 00TID 传输标识符(用于上位机传输报文序列号),也可为0

00 00PID 协议标识符,默认0

00 09:后面要发送的字节数

01:子站地址

0f:指令号,0x0f=十进制15,写多路DO

00 40:从哪一路开始清空,0x00 40X1计数清空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 00TID 传输标识符(用于上位机传输报文序列号),也可为0

00 00PID 协议标识符,默认0

00 06:后面要发送的字节数

01:子站地址

0f:指令号,0x0f=十进制15,写多路DO

00 40:从哪一路开始清空,0x00 40X1计数清空DO寄存器起始地址

00 0C:要清空多少路计数,十六进制0x000C=十进制12

n  例子:指定清空X1,X4,X8,X12,X24输入计数值的请求&响应报文

请求:

发送数据(HEX): 00 00 00 00 00 0A 01 0f 00 40 00 18 03 85 08 80

解释:

00 00TID 传输标识符(用于上位机传输报文序列号),也可为0

00 00PID 协议标识符,默认0

00 0A:后面要发送的字节数,0x0A=十进制10

01:子站地址

0f:指令号,0x0f=十进制15,写多路DO

00 40:从哪一路开始清空,0x00 40X1计数清空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 00TID 传输标识符(用于上位机传输报文序列号),也可为0

00 00PID 协议标识符,默认0

00 06:后面要发送的字节数

01:子站地址

0f:指令号,0x0f=十进制15,写多路DO

00 40:从哪一路开始清空,0x00 40X1计数清空DO寄存器起始地址

00 18:操作了多少路计数,十六进制0x0018=十进制24

4.   Y输出口ON/OFF写入 (写入:DO寄存器,命令号:0x0F)

n  描述

用于控制模块Y输出点的开关状态。

n  例子:控制Y1当前输出ON/OFF的请求&响应报文

请求:

发送数据(HEX): 00 00 00 00 00 08 01 0f 00 00 00 01 01 01

解释:

00 00TID 传输标识符(用于上位机传输报文序列号),也可为0

00 00PID 协议标识符,默认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=0OFF=1

响应:

//模块回复

00 00 00 00 00 06 01 0F 00 00 00 01

解释:

00 00TID 传输标识符(用于模块回送报文序列号),也可为0

00 00PID 协议标识符,默认0

00 06:后面要发送的字节数

01:子站地址

0f:指令号,0x0f=十进制15,写多路DO

00 00:从哪一路开始写,00 00=Y1开始写

00 01:写了多少路,十六进制0x0001=十进制1,写1

n  例子:控制Y1-Y8当前输出ON/OFF的请求&响应报文

//Y1Y2Y8输出ON,其他路输出OFF

请求:

发送数据(HEX): 00 00 00 00 00 08 01 0f 00 00 00 08 01 83

解释:

00 00TID 传输标识符(用于上位机传输报文序列号),也可为0

00 00PID 协议标识符,默认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=0OFF=1

响应:

//模块回复

00 00 00 00 00 06 01 0F 00 00 00 08

解释:

00 00TID 传输标识符(用于模块回送报文序列号),也可为0

00 00PID 协议标识符,默认0

00 06:后面要发送的字节数

01:子站地址

0f:指令号,0x0f=十进制15,写多路DO

00 00:从哪一路开始写,00 00=Y1开始写

00 08:写了多少路,十六进制0x0008=十进制8,写8

n  例子:控制Y1-Y24当前输出ON/OFF的请求&响应报文

//Y1Y2Y9Y24输出ON,其他路输出OFF

请求:

发送数据(HEX): 00 00 00 00 00 0a 01 0f 00 00 00 18 03 03 01 80

解释:

00 00TID 传输标识符(用于上位机传输报文序列号),也可为0

00 00PID 协议标识符,默认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=0OFF=1

01:写入的数据,0x01换算成二进制00000001 = Y16-Y15-Y14-Y13-Y12-Y11-Y10-Y9输出状态,ON=0OFF=1

80:写入的数据,0x80换算成二进制10000000 = Y24-Y23-Y22-Y21-Y20-Y19-Y18-Y17输出状态,ON=0OFF=1

响应:

//模块回复

00 00 00 00 00 06 01 0F 00 00 00 18

解释:

00 00TID 传输标识符(用于模块回送报文序列号),也可为0

00 00PID 协议标识符,默认0

00 06:后面要发送的字节数

01:子站地址

0f:指令号,0x0f=十进制15,写多路DO

00 00:从哪一路开始写,00 00=Y1开始写

00 18:写了多少路,十六进制0x0018=十进制24,写24

5.   Y输出口ON/OFF读取 (读取:DO寄存器,命令号:0x01)

n  描述

用于读取模块Y输出点的开关状态。

n  例子:读Y1当前输出状态的请求&响应报文

请求:

发送数据(HEX): 00 00 00 00 00 06 01 01 00 00 00 01

解释:

00 00TID 传输标识符(用于上位机传输报文序列号),也可为0

00 00PID 协议标识符,默认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 00TID 传输标识符(用于模块回送报文序列号),也可为0

00 00PID 协议标识符,默认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 00TID 传输标识符(用于模块回送报文序列号),也可为0

00 00PID 协议标识符,默认0

00 04:后面要发送的字节数

01:子站地址

01:指令号,01读取多路DO

01:后面数据区字节数

00:数据,换算成二进制0x00=0000 0000,对应Y8-Y7-Y6-Y5-Y4-Y3-Y2-Y1的状态

n  例子:读Y1-Y8当前输出状态的请求&响应报文

请求:

发送数据(HEX): 00 00 00 00 00 06 01 01 00 00 00 08

解释:

00 00TID 传输标识符(用于上位机传输报文序列号),也可为0

00 00PID 协议标识符,默认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 00TID 传输标识符(用于模块回送报文序列号),也可为0

00 00PID 协议标识符,默认0

00 04:后面要发送的字节数

01:子站地址

01:指令号,01读取多路DO

01:后面数据区字节数,0x01=十进制1,后面数据区有1字节数据

83:数据区,换算成二进制0x83=1000 0011,对应Y8-Y7-Y6-Y5-Y4-Y3-Y2-Y1的状态

n  例子:读Y1-Y24当前输出状态的请求&响应报文

请求:

发送数据(HEX): 00 00 00 00 00 06 01 01 00 00 00 18

解释:

00 00TID 传输标识符(用于上位机传输报文序列号),也可为0

00 00PID 协议标识符,默认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 00TID 传输标识符(用于模块回送报文序列号),也可为0

00 00PID 协议标识符,默认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的状态

6.   AI模拟量采集读取(读取:AI寄存器,命令号:0x04)

n  描述

读模块中的输入型数据,例如AD模拟采集到的电压值,电流值,压力值等。

n  例子:读当前AI通道AI1模拟量输入值的请求&响应报文

请求:

发送数据(HEX): 00 00 00 00 00 06 01 04 00 00 00 02

解释:

00 00TID 传输标识符(用于上位机传输报文序列号),也可为0

00 00PID 协议标识符,默认0

00 06:后面要发送的字节数

01:子站地址

04:指令号,04AI

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 00TID 传输标识符(用于模块回送报文序列号),也可为0

00 00PID 协议标识符,默认0

00 07:后面要发送的字节数

01:子站地址

04:指令号,04AI

04:后面跟的数据字节数,0x04=十进制4,后面数据区有4字节数据

0000BF11:换成十进制就是 0x0000BF11 =48913,即读取到AI1模拟量输入口当前值为48913

n  例子:读当前AI通道AI1-AI4模拟量输入值的请求&响应报文

请求:

发送数据(HEX): 00 00 00 00 00 06 01 04 00 00 00 08

解释:

00 00TID 传输标识符(用于上位机传输报文序列号),也可为0

00 00PID 协议标识符,默认0

00 06:后面要发送的字节数

01:子站地址

04:指令号,04AI

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 00TID 传输标识符(用于模块回送报文序列号),也可为0

00 00PID 协议标识符,默认0

00 13:后面要发送的字节数,0x13=十进制19

01:子站地址

04:指令号,04AI

10:后面跟的数据字节数,0x10=十进制16,后面数据区有16字节数据

0000BF11:数据区,换成十进制就是 0x0000BF11 =48913,即读取到AI1模拟量输入口当前值为48913

0000BF11:数据区,换成十进制就是 0x0000BF11 =48913,即读取到AI2模拟量输入口当前值为48913

0000BF11:数据区,换成十进制就是 0x0000BF11 =48913,即读取到AI3模拟量输入口当前值为48913

0000BF11:数据区,换成十进制就是 0x0000BF11 =48913,即读取到AI4模拟量输入口当前值为48913

n  例子:读当前AI通道AI1-AI8模拟量输入值的请求&响应报文

请求:

发送数据(HEX): 00 00 00 00 00 06 01 04 00 00 00 10

解释:

00 00TID 传输标识符(用于上位机传输报文序列号),也可为0

00 00PID 协议标识符,默认0

00 06:后面要发送的字节数

01:子站地址

04:指令号,04AI

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 00TID 传输标识符(用于模块回送报文序列号),也可为0

00 00PID 协议标识符,默认0

00 23:后面要发送的字节数,0x23=十进制35

01:子站地址

04:指令号,04AI

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

7.   AO模拟量输出写入(写入:AO寄存器,命令号:0x10)

n  描述

         用于设定DA模拟量输出值。

n  例子:写当前AO通道AO1模拟量输出值的请求&响应报文

请求:

发送数据(HEX): 00 00 00 00 00 09 01 10 00 00 00 01 02 10 D2

解释:

00 00TID 传输标识符(用于上位机传输报文序列号),也可为0

00 00PID 协议标识符,默认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 00TID 传输标识符(用于模块回送报文序列号),也可为0

00 00PID 协议标识符,默认0

00 06:后面要发送的字节数

01:子站地址

10:指令号,0x10=十进制16,写AO

00 00:从哪一路开始写,0x0000=AIO1开始写

00 01:写了多少路,十六进制0x0001=十进制1,写1

n  例子:写当前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 00TID 传输标识符(用于上位机传输报文序列号),也可为0

00 00PID 协议标识符,默认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 00TID 传输标识符(用于模块回送报文序列号),也可为0

00 00PID 协议标识符,默认0

00 06:后面要发送的字节数

01:子站地址

10:指令号,0x10=十进制16,写AO

00 00:从哪一路开始写,0x0000=AIO1开始写

00 04:写了多少路,十六进制0x0004=十进制4,写4

n  例子:写当前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 00TID 传输标识符(用于上位机传输报文序列号),也可为0

00 00PID 协议标识符,默认0

00 17:后面要发送的字节数,0x17=十进制23

01:子站地址

10:指令号,0x10=十进制16,写AO

00 00:从哪一路开始写,0x0000=AIO1开始写

00 08:要写多少路,十六进制0x0008=十进制8,写8

10:后面要写入的数据字节数,0x10=十进制1616个字节

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 00TID 传输标识符(用于模块回送报文序列号),也可为0

00 00PID 协议标识符,默认0

00 06:后面要发送的字节数

01:子站地址

10:指令号,0x10=十进制16,写AO

00 00:从哪一路开始写,0x0000=AIO1开始写

00 08:写了多少路,十六进制0x0008=十进制8,写8

8.   AO模拟量输出读取(读取:AO寄存器,命令号:0x03)

n  描述

用于读取当前DA模拟量输出值。

n  例子:读当前AO通道AO1模拟量输出值的请求&响应报文

请求:

发送数据(HEX): 00 00 00 00 00 06 01 03 00 00 00 01

解释:

00 00TID 传输标识符(用于上位机传输报文序列号),也可为0

00 00PID 协议标识符,默认0

00 06:后面要发送的字节数

01:子站地址

03:指令号,03AO

00 00:从哪一路开始读,0x0000=AIO1开始读

00 01:要读多少路,十六进制0x0001=十进制1,读取1

响应:

接收数据(HEX): 00 00 00 00 00 05 01 03 02 10 D2

解释:

00 00TID 传输标识符(用于模块回送报文序列号),也可为0

00 00PID 协议标识符,默认0

00 05:后面要发送的字节数

01:子站地址

03:指令号,03AO

02:后面跟的数据字节数

10 D2:换成十进制就是 0x10D2 =十进制4306,即读取到AO1输出模拟量当前输出值为4306

n  例子:读当前AO通道AO1-AO4模拟量输出值的请求&响应报文

请求:

发送数据(HEX): 00 00 00 00 00 06 01 03 00 00 00 04

解释:

00 00TID 传输标识符(用于上位机传输报文序列号),也可为0

00 00PID 协议标识符,默认0

00 06:后面要发送的字节数

01:子站地址

03:指令号,03AO

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 00TID 传输标识符(用于模块回送报文序列号),也可为0

00 00PID 协议标识符,默认0

00 0B:后面要发送的字节数,0x000B=十进制11

01:子站地址

03:指令号,03AO

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

n  例子:读当前AO通道AO1-AO8模拟量输出值的请求&响应报文

请求:

发送数据(HEX): 00 00 00 00 00 06 01 03 00 00 00 08

解释:

00 00TID 传输标识符(用于上位机传输报文序列号),也可为0

00 00PID 协议标识符,默认0

00 06:后面要发送的字节数

01:子站地址

03:指令号,03AO

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 00TID 传输标识符(用于模块回送报文序列号),也可为0

00 00PID 协议标识符,默认0

00 13:后面要发送的字节数,0x0013=十进制19

01:子站地址

03:指令号,03AO

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

 

 

谢!


猜你喜欢

转载自blog.51cto.com/15008164/2552298