程序员开发实例大全宝库

网站首页 > 编程文章 正文

综科智控Modbus-RTU/TCP协议详解---技术小分享

zazugpt 2024-10-16 18:23:09 编程文章 39 ℃ 0 评论


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

1.1 功能码

下表列出 MODBUS支持的部分功能代码:以十进制表示

功能码

(十进制)

作用

信息地址

位操作/字操作

操作数量

01

读单个/多个DO寄存器

00001-09999

位操作

单个/多个

02

读单个/多个DI寄存器

10001-19999

位操作

单个/多个

03

读单个/多个AO寄存器

40001-49999

字操作

单个/多个

04

读单个/多个AI寄存器

30001-39999

字操作

单个/多个

05

写单个DO寄存器

00001-09999

位操作

单个

06

写单个AO寄存器

40001-49999

字操作

单个

15

写单个/多个DO寄存器

00001-09999

位操作

单个/多个

16

写单个/多个AO寄存器

40001-49999

字操作

单个/多个


1.2 寄存器分类说明

寄存器种类

说明

DI寄存器

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

DO寄存器

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

AI寄存器

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

AO寄存器

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


1.3 寄存器地址说明

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

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

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

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

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

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

一、 MODBUS-RTU协议详解

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

描述

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

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

请求:

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

解释:

01:子站地址

02:指令号,02读DI

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

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

B9 CA:CRC校验

响应:

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

01 02 01 01 60 48

解释:

01:子站地址

02:指令号,02读DI

01:后面跟的数据字节数

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

60 48:CRC校验

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

01 02 01 00 A1 88

解释:

01:子站地址

02:指令号,02读DI

01:后面跟的数据字节数

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

A1 88:CRC校验

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

描述

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

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

请求:

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

解释:

01:子站地址

04:指令号,04读AI

00 18:从哪一路开始读,0x0018对应的是X1脉冲计数寄存器起始地址

00 02:要读多少个寄存器,因为一路X脉冲计数占用2个寄存器地址,所以这里寄存器数量要填2,十六进制0x0002=十进制2

F1 CC:CRC校验

响应:

接收数据(HEX): 01 04 04 00 00 27 10 E1 B8

解释:

01:子站地址

04:指令号,04读AI

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

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

E1 B8:CRC校验

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

描述

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

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

请求:

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

解释:

01:子站地址

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

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

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

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

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

ee 98:CRC校验

响应:

//模块回复

01 0F 00 40 00 01 95 df

解释:

01:子站地址

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

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

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

95 df:CRC校验

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

描述

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

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

请求:

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

解释:

01:子站地址

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

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

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

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

01:写入的数据,0x01换算成二进制00000001 = Y8-Y7-Y6-Y5-Y4-Y3-Y2-Y1输出状态,ON=0,OFF=1

ef 57:CRC校验

响应:

//模块回复

01 0F 00 00 00 01 94 0B

解释:

01:子站地址

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

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

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

94 0B:CRC校验

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

描述

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

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

请求:

发送数据(HEX): 01 01 00 00 00 01 FD CA

解释:

01:子站地址

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

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

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

FD CA:CRC校验

响应:

//Y1 输出ON(1)时的回复

01 01 01 01 90 48

解释:

01:子站地址

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

01:后面数据区字节数

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

90 48 :CRC校验

//Y1 输出OFF(0)的时回复

01 01 01 00 51 88

解释:

01:子站地址

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

01:后面数据区字节数

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

51 88 :CRC校验

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

描述

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

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

请求:

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

解释:

01:子站地址

04:指令号,04读AI

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

00 02:要多少个寄存器,因为一个AI通道占用2个寄存器地址,所以这里读1路模拟量的话,寄存器数量要填2,十六进制0x0002=十进制2

71CB:CRC校验

响应:

接收数据(HEX): 01 04 04 00 00 BF 11 4B B8

解释:

01:子站地址

04:指令号,04读AI

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

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

4B B8:CRC校验

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

描述

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

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

请求:

发送数据(HEX): 01 10 00 00 00 01 02 10 D2 2B CD

解释:

01:子站地址

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

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

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

02:后面要写入的数据字节数,0x02=十进制2,写2个字节

10 D2:要写入的AO输出值,0x10D2=十进制4306,即写入AO1输出口模拟量输出值为4306

2B CD:CRC校验

响应:

接收数据(HEX): 01 10 00 00 00 01 01 C9

解释:

01:子站地址

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

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

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

01 C9:CRC校验

二、 MODBUS-TCP协议详解

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

描述

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

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

请求:

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

解释:

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

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

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

01:子站地址

02:指令号,02读DI

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

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

响应:

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

00 00 00 00 00 04 01 02 01 01

解释:

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

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

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

01:子站地址

02:指令号,02读DI

01:后面跟的数据字节数

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

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

00 00 00 00 00 04 01 02 01 00

解释:

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

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

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

01:子站地址

02:指令号,02读DI

01:后面跟的数据字节数

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

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

描述

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

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

请求:

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

解释:

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

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

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

01:子站地址

04:指令号,04读AI

00 18:从哪一路开始读,0x0018对应的是X1脉冲计数寄存器起始地址

00 02:要读多少个寄存器,因为一路X脉冲计数占用2个寄存器地址,所以这里寄存器数量要填2,十六进制0x0002=十进制2

响应:

接收数据(HEX): 00 00 00 00 00 07 01 04 04 00 00 27 10

解释:

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

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

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

01:子站地址

04:指令号,04读AI

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

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

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

描述

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

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

请求:

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

解释:

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

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

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

01:子站地址

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

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

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

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

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

响应:

//模块回复

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

解释:

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

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

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

01:子站地址

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

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

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

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

描述

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

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

请求:

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

解释:

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

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

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

01:子站地址

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

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

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

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

01:写入的数据,0x01换算成二进制00000001 = Y8-Y7-Y6-Y5-Y4-Y3-Y2-Y1输出状态,ON=0,OFF=1

响应:

//模块回复

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

解释:

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

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

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

01:子站地址

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

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

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

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

描述

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

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

请求:

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

解释:

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

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

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

01:子站地址

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

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

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

响应:

//Y1 输出ON(1)时的回复

00 00 00 00 00 04 01 01 01 01

解释:

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

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

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

01:子站地址

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

01:后面数据区字节数

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

//Y1 输出OFF(0)的时回复

00 00 00 00 00 04 01 01 01 00

解释:

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

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

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

01:子站地址

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

01:后面数据区字节数

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

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

描述

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

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

请求:

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

解释:

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

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

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

01:子站地址

04:指令号,04读AI

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

00 02:要多少个寄存器,因为一个AI通道占用2个寄存器地址,所以这里读1路模拟量的话,寄存器数量要填2,十六进制0x0002=十进制2

响应:

接收数据(HEX): 00 00 00 00 00 07 01 04 04 00 00 BF 11

解释:

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

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

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

01:子站地址

04:指令号,04读AI

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

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

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

描述

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

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

请求:

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

解释:

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

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

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

01:子站地址

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

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

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

02:后面要写入的数据字节数,0x02=十进制2,写2个字节

10D2:要写入的AO输出值,0x10D2=十进制4306,即写入AO1输出口模拟量输出值为4306

响应:

接收数据(HEX): 00 00 00 00 00 06 01 10 00 00 00 01

解释:

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

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

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

01:子站地址

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

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

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

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

描述

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

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

请求:

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

解释:

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

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

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

01:子站地址

03:指令号,03读AO

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

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

响应:

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

解释:

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

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

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

01:子站地址

03:指令号,03读AO

02:后面跟的数据字节数

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




Tags:

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表