电子开发网

电子开发网电子设计 | 电子开发网Rss 2.0 会员中心 会员注册
搜索: 您现在的位置: 电子开发网 >> 电子开发 >> PLC基础入门教程 >> 正文

modbus协议实例讲解,功能码和报文详解

作者:佚名    文章来源:本站原创    点击数:    更新时间:2023/3/31

本文以综科智控品牌的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

Tags:modbus,功能码,报文,寄存器地址  
责任编辑:admin
相关文章列表
Modbus 的RTU、ASCII、TCP傻傻搞不清楚?一文全解读
Modbus测试工具与控件介绍
西门子PLC 200smartPLC与第三方进行Modbus TCP通讯
MODBUS--变频器\PLC\仪表连不上怎么办?送最简单的软件搞定问题
西门子plc Smart 200主从站之间RS485通讯实例_从站主站读写程序
西门子plc之间的通讯_两台西门子S7-200 SMART PLC如何通过Modbus
西门子S7-200 Smart plc的Modbus RTU库通讯轮询实例
学习s7-200之间的Modbus通讯_两个PLC互相通信,主站从站通讯
西门子PLC S7-200Smart实现Modbus-RTU通信实例 多功能电表 温控表
西门子plc S7-200 SMART与丹佛斯变频器之间Modbus通信
西门子plc S7-200 SMART与变频器MODBUS-RTU通信例程
RS232、RS485标准以及在DB9公头、母头上的接线定义_Modbus通讯接
PLC控制伺服电机运动的完整案例(PLC设置伺服驱动参数)_ 丝杠运
MODBUS常用功能码
Modbus寄存器分类及地址分配表 寄存器分类及说明 寄存器的地址
西门子plc S7-200smart 与台达变频器通讯Modbus梯形图编程实例
Modbus调试软件--ModbusPoll、ModbusSlave使用详解
modbus poll 使用教程  Modbus通讯
20种PLC对应Modbus地址表
西门子plc S7-200SMART通过MODBUS通信控制变频器启停如何看电流频
西门子plc梯形图编程实例 西门子200smart与电流表Modbus RTU通讯
使用西门子plc的Modbus通讯 串口调试助手与S7-200SMART PLC从站通
Modbus 调试助手的使用(一) Modsim32使用详解Modbus Poll
【工具使用】Modsim32软件使用详解 串口调试软件
什么是Modbus网关?modbus网关有什么作用?
西门子S7-200PLC ModbusTCP通讯,ModScan32使用
Modbus协议详解 科普Modbus通讯协议
Modbus通讯简单测试—Modscan32使用简介
Modbus Scan32模拟软件使用,Modscan32使用教程
Modbus协议的数据模型和地址模型
请文明参与讨论,禁止漫骂攻击,不要恶意评论、违禁词语。 昵称:
1分 2分 3分 4分 5分

还可以输入 200 个字
[ 查看全部 ] 网友评论
推荐文章
最新推荐
关于我们 - 联系我们 - 广告服务 - 友情链接 - 网站地图 - 版权声明 - 在线帮助 - 文章列表
返回顶部
刷新页面
下到页底
晶体管查询