Modbus 协议学习笔记及常用功能码详解

下面的MODBUS 协议的相关知识 是自己在网上搬运的 以便以后自己查看

01. 寄存器分类

Modbus寄存器分为四种,如下表所示:
在这里插入图片描述

 

线圈寄存器:实际上可以表示一个开关量,线圈操作位(bit)一个bit对应一个开关信号,即(0/false,1/true),每个byte字节就能代表8个的位的开关信号,线圈寄存器支持读和写,Modbus的功能码又能对线圈的单个或多个进行一个读取写入操作,其实就是在操作字节的位。实对应上面的功能码也就是:0x01 0x05 0x0f

离散输入寄存器:离散输入寄存器就相当于线圈寄存器的只读模式,功能跟上面基本一致,除了不能写入。所以功能码也简单就一个读的 0x02

保持寄存器:保持寄存器是对字节进行的操作,每两个字节对应一个寄存器,支持读取和写入。功能码有对应的三个:0x03 0x06 0x10

输入寄存器:,这个和保持寄存器类似,但是也是只支持读而不能写。一个寄存器地址是占据两个byte的空间,也就是16个位。对应的功能码也就一个 0x04

言外之话:
当需要对保持寄存器操作时,不同的数据类型占据的字节长度其实是不一致的,一个寄存器地址占两个字节16位代表的只是一个单精度的数据。如C#的数据类型占据的长度如下

在这里插入图片描述

 

02. 常用功能码

Modbus中常用的功能码有8个,可以分为位操作和字操作两类,如下表所示:
在这里插入图片描述

 

03. 读线圈寄存器(01H)

功能码01H读取Modbus从机中线圈寄存器的状态,可以是单个寄存器,或者多个连续的寄存器。

发送

假设从机地址为01H,读取的线圈寄存器的起始地址为0017H,读取38个寄存器,指令如下所示:

读线圈寄存器指令
在这里插入图片描述


响应

各线圈的状态与数据内容的每个bit对应,1代表ON,0代表OFF。如果查询的线圈数量不是8的倍数,则在最后一个字节的高位补0。

读线圈状态的返回结果
在这里插入图片描述

 解读:其中,第一个字节CDH对应线圈0017H到001E的状态,转为二进制是11001101,其中bit0对应0017H,bit7对应001E,如下表所示:

线圈0017H到001EH的状态
在这里插入图片描述

最后一个字节为1BH,对应线圈0037H到003CH的状态,转为二进制是00011011,其中bit0对应0037H,bit5对应003CH,其余两位用0填充:

线圈0037H到003CH的状态
在这里插入图片描述

读线圈寄存器——01H

从站发送读取格式:

从站地址功能码起始地址高位起始地址低位读取数量高位读取数量低位CRC高位CRC低位
0x010x010x000x000x000x02BDCB

主站返回读取格式:

从站地址功能码返回字节数data1CRC高位CRC低位
0x010x010x010x005188

解读:
发送格式:
从站地址:01
功能码:01
起始地址: 00 00
读取数量: 00 02
CRC校验:BD CB
接收格式:
从站地址:01
功能码:01
返回字节数: 01
Data数据: 00(一个byte有8个bit,读取两个bit返回会补成字节用一个byte返回读取两个bit就行)
CRC校验:BD CB
 

例如:01 01 01 00 51 88 

            01 01 01 01 90 48

04. 读离散输入寄存器(02H)

功能码02H读取Modbus从机中离散输入寄存器的状态,可以是单个寄存器,或者多个连续的寄存器。

发送

假设从机地址为01H,读取的离散输入寄存器的起始地址为00C4H,读取22个寄存器,指令如下所示:

读离散输入寄存器指令:
在这里插入图片描述

 

响应

各个离散输入寄存器的状态与数据内容的每个bit对应,1代表ON,0代表OFF。如果查询的线圈数量不是8的倍数,则在最后一个字节的高位补0。

读离散输入寄存器的返回结果
在这里插入图片描述

 

其中,第一个字节ACH对应00C4H到00CBH寄存器的状态,转为二进制是10101100,其中bit0对应00C4H,bit7对应00CB,如下所示:

寄存器00C4H到00CBH的状态
在这里插入图片描述

 

最后一个字节为35H,对应寄存器00D4H到00D9H的状态,转为二进制是00110101,其中bit0对应00D4H,bit5对应00D9H,其余两位用0填充,

寄存器00D4H到00D9H的状态在这里插入图片描述

 

05. 读保持寄存器(03H)

功能码03H读取Modbus从机中保持寄存器的数据,可以是单个寄存器,或者多个连续的寄存器。

发送

假设从机地址为01H,读取的保持寄存器的起始地址为006BH,读取3个寄存器,指令如表5.1所示:

读保持寄存器指令:
在这里插入图片描述

 

响应

每个保持寄存器的长度为2个字节。保持寄存器之间,低地址寄存器先传输,高地址寄存器后传输。单个保持寄存器,高字节数据先传输,低字节数据后传输。

读保持寄存器的返回结果
在这里插入图片描述

 

06. 读输入寄存器(04H)

功能码04H读取Modbus从机中输入寄存器的数据,可以是单个寄存器,或者多个连续的寄存器。

发送

假设从机地址为01H,读取的保持寄存器的起始地址为006BH,读取2个寄存器,指令如下所示:

读输入寄存器指令:
在这里插入图片描述

 

响应

每个输入寄存器的长度为2个字节。输入寄存器之间,低地址寄存器先传输,高地址寄存器后传输。单个输入寄存器,高字节数据先传输,低字节数据后传输。

读输入寄存器的返回结果
在这里插入图片描述

 

07. 写单个线圈寄存器(05H)

功能码05H写单个线圈寄存器,FF00H请求线圈处于ON状态,0000H请求线圈处于OFF状态。

发送

假设从机地址为01H,线圈寄存器的地址为00ACH,使其处于ON状态的指令如下所示:

写单个线圈指令:
在这里插入图片描述

 

响应

如果写入成功,返回发送的指令,即010500ACFF004C1B。

写入:01 05 00 00 FF 00 8C 3A  

返回:01 05 00 00 FF 00 8C 3A 

08. 写单个保持寄存器(06H)

功能码06H写单个保持寄存器。

发送

假设从机地址为01H,保持寄存器的地址为0001H,数据位0003H,指令如下所示:

写单个保持寄存器指令:
在这里插入图片描述

 

响应

如果写入成功,返回发送的指令,即010600010003980B。

09. 写多个线圈寄存器(0FH)
功能码0FH写多个线圈寄存器。如果对应的数据位为1,表示线圈状态为ON;如果对应的数据位为0,表示线圈状态为OFF。线圈寄存器之间,低地址寄存器先传输,高地址寄存器后传输。单个线圈寄存器,高字节数据先传输,低字节数据后传输。如果写入的线圈寄存器的个数不是8的倍数,则在最后一个字节的高位补0。

发送

假设从机地址为01H,线圈寄存器的起始地址为0013H,写入10个寄存器,指令如下所示:

写入多个线圈寄存器指令

在这里插入图片描述

其中,CDH对应线圈0013H到001AH的内容,01H对应线圈001B到001CH的内容,未使用位用0填充。

 

此时,线圈寄存器的内容如下所示:

线圈寄存器0013H到001CH的内容
在这里插入图片描述

 

响应

如果写入成功,返回写入的寄存器数量

写多个线圈寄存器的返回结果
在这里插入图片描述

 

10. 写多个保持寄存器(10H)

功能码10H写多个保持寄存器,其中每个保持寄存器的长度为两个字节。

发送

假设从机地址为01H,保持寄存器的起始地址为0001H,写入2个寄存器,指令如下所示:

写入多个保持寄存器指令
在这里插入图片描述

返回数据格式不返回Data数据

详情:写入数量为2的线圈,其中data1,data2,data3,data4数据两个代表一个单精度数据
0C 02表示一个3074 ,12 45代表一个4677

响应

如果写入成功,返回写入的寄存器数量,

写多个保持寄存器的返回结果
在这里插入图片描述

 

写多个线圈——0FH

从站地址功能码起始地址高位起始地址低位写入数量高位写入数据低位字节长度data1CRC高位CRC低位
0x010x0F0x000x000x000x020x010x039E96

主站返回读取格式:
响应:

从站地址功能码起始地址高位起始地址低位写入数量高位写入数据低位CRC高位CRC低位
0x010x0F0x000x000x000x029E96

返回数据格式不返回Data数据

详情:写入数量为2的线圈,其中data1数据0x03代表0000 0011 将连续两个线圈置为ON


版权声明:本文为CSDN博主「沧海一笑-dj」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/dengjin20104042056/article/details/116545046

1 简介

 

  1. modbus由MODICON公司于1979年开发,是一种工业现场总线协议标准。1996年施耐德公司推出基于以太网TCP/IP的modbus协议:modbusTCP。

Modbus协议是一项应用层报文传输协议,包括ASCII、RTU、TCP三种报文类型。

标准的Modbus协议物理层接口有RS232、RS422、RS485和以太网接口,采用master/slave方式通信。

帧结构PDU

PDU由功能码+数据组成。功能码为1字节,数据长度不定,由具体功能决定。

2.2.1 功能码
modbus的操作对象有四种:线圈、离散输入、输入寄存器、保持寄存器。

线圈:PLC的输出位,开关量,在MODBUS中可读可写
离散量:PLC的输入位,开关量,在MODBUS中只读
输入寄存器:PLC中只能从模拟量输入端改变的寄存器,在MODBUS中只读
保持寄存器:PLC中用于输出模拟量信号的寄存器,在MODBUS中可读可写
根据对象的不同,modbus的功能码有:

0x01:读线圈
0x05:写单个线圈
0x0F:写多个线圈
0x02:读离散量输入
0x04:读输入寄存器
0x03:读保持寄存器
0x06:写单个保持寄存器
0x10:写多个保持寄存器
2.2.2 PDU详细结构
0x01:读线圈
在从站中读1~2000个连续线圈状态,ON=1,OFF=0

请求:MBAP 功能码 起始地址H 起始地址L 数量H 数量L(共12字节)
响应:MBAP 功能码 数据长度 数据(一个地址的数据为1位)
如:在从站0x01中,读取开始地址为0x0002的线圈数据,读0x0008位
00 01 00 00 00 06 01 01 00 02 00 08
回:数据长度为0x01个字节,数据为0x01,第一个线圈为ON,其余为OFF
00 01 00 00 00 04 01 01 01 01
0x05:写单个线圈
将从站中的一个输出写成ON或OFF,0xFF00请求输出为ON,0x000请求输出为OFF

请求:MBAP 功能码 输出地址H 输出地址L 输出值H 输出值L(共12字节)
响应:MBAP 功能码 输出地址H 输出地址L 输出值H 输出值L(共12字节)
如:将地址为0x0003的线圈设为ON
00 01 00 00 00 06 01 05 00 03 FF 00
回:写入成功
00 01 00 00 00 06 01 05 00 03 FF 00
0x0F:写多个线圈
将一个从站中的一个线圈序列的每个线圈都强制为ON或OFF,数据域中置1的位请求相应输出位ON,置0的位请求响应输出为OFF

请求:MBAP 功能码 起始地址H 起始地址L 输出数量H 输出数量L 字节长度 输出值H 输出值L
响应:MBAP 功能码 起始地址H 起始地址L 输出数量H 输出数量L
0x02:读离散量输入
从一个从站中读1~2000个连续的离散量输入状态

请求:MBAP 功能码 起始地址H 起始地址L 数量H 数量L(共12字节)
响应:MBAP 功能码 数据长度 数据(长度:9+ceil(数量/8))
如:从地址0x0000开始读0x0012个离散量输入
00 01 00 00 00 06 01 02 00 00 00 12
回:数据长度为0x03个字节,数据为0x01 04 00,表示第一个离散量输入和第11个离散量输入为ON,其余为OFF
00 01 00 00 00 06 01 02 03 01 04 00
0x04:读输入寄存器
从一个远程设备中读1~2000个连续输入寄存器

请求:MBAP 功能码 起始地址H 起始地址L 寄存器数量H 寄存器数量L(共12字节)
响应:MBAP 功能码 数据长度 寄存器数据(长度:9+寄存器数量×2)
如:读起始地址为0x0002,数量为0x0005的寄存器数据
00 01 00 00 00 06 01 04 00 02 00 05
回:数据长度为0x0A,第一个寄存器的数据为0x0c,其余为0x00
00 01 00 00 00 0D 01 04 0A 00 0C 00 00 00 00 00 00 00 00
0x03:读保持寄存器
从远程设备中读保持寄存器连续块的内容

请求:MBAP 功能码 起始地址H 起始地址L 寄存器数量H 寄存器数量L(共12字节)
响应:MBAP 功能码 数据长度 寄存器数据(长度:9+寄存器数量×2)
如:起始地址是0x0000,寄存器数量是 0x0003
00 01 00 00 00 06 01 03 00 00 00 03
回:数据长度为0x06,第一个寄存器的数据为0x21,其余为0x00
00 01 00 00 00 09 01 03 06 00 21 00 00 00 00
0x06:写单个保持寄存器
在一个远程设备中写一个保持寄存器

请求:MBAP 功能码 寄存器地址H 寄存器地址L 寄存器值H 寄存器值L(共12字节)
响应:MBAP 功能码 寄存器地址H 寄存器地址L 寄存器值H 寄存器值L(共12字节)
如:向地址是0x0000的寄存器写入数据0x000A
00 01 00 00 00 06 01 06 00 00 00 0A
回:写入成功
00 01 00 00 00 06 01 06 00 00 00 0A
0x10:写多个保持寄存器
在一个远程设备中写连续寄存器块(1~123个寄存器)

请求:MBAP 功能码 起始地址H 起始地址L 寄存器数量H 寄存器数量L 字节长度 寄存器值(13+寄存器数量×2)
响应:MBAP 功能码 起始地址H 起始地址L 寄存器数量H 寄存器数量L(共12字节)
如:向起始地址为0x0000,数量为0x0001的寄存器写入数据,数据长度为0x02,数据为0x000F
00 01 00 00 00 09 01 10 00 00 00 01 02 00 0F
回:写入成功
00 01 00 00 00 06 01 10 00 00 00 01
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值