Modbus常用功能码说明

Modbus常用功能码说明

1、 Modbus寄存器种类说明

MODBUS支持诸多功能码,但其中只涉及到四种寄存器:线圈寄存器、离散输入寄存器、保持寄存器、输入寄存器。

寄存器种类读写状态位操作字操作适用功能码
线圈寄存器读/写01H(读); 05H(写单个位); 0FH(写多个位)
离散输入寄存器只读02H
保持寄存器读/写03H(读); 06H(写单个字节); 0FH(写多个字节)
输入寄存器只读04H

**线圈寄存器:**可以类比为开关量,每个bit都对应一个信号的开关状态。所以一个字节可以同时控制8路的信号。比如控制外部8路io的高低。 线圈寄存器支持读也支持写。对应的功能码有:0x01 0x05 0x0f。

**离散输入寄存器:**离散输入寄存器相当于线圈寄存器的只读模式,每个bit表示一个开关量,而他的开关量只能读取,不能够写入。只能通过外部设定改变输入状态。对应的功能码有:0x02。

**保持寄存器:**寄存器的单位是两个byte,也就是可以存放具体的数据量的,并且是可读写的。对应的功能码有:0x03 0x06 0x10。

**输入寄存器:**输入寄存器相当于保持寄存器的只读模式,也是只支持读而不能写。一个寄存器也是占据两个字节的空间。对应的功能码有 0x04。

2、Modbus部分功能码说明

常用功能码说明,具体如下:

功能码名称数据类型作用
0x01读线圈寄存器取得一组逻辑线圈的当前状态(ON/OFF )
0x02读离散输入寄存器取得一组开关输入的当前状态(ON/OFF )
0x03读保持寄存器整型、浮点型、字符型在一个或多个保持寄存器中取得当前的二进制值
0x04读输入寄存器整型、浮点型在一个或多个输入寄存器中取得当前的二进制值
0x05写单个线圈寄存器强置一个逻辑线圈的通断状态
0x06写单个保持寄存器整型、浮点型、字符型把具体二进值装入一个保持寄存器
0x0f写多个线圈寄存器强置一串连续逻辑线圈的通断
0x10写多个保持寄存器整型、浮点型、字符型把具体的二进制值装入一串连续的保持寄存器
3、Modbus功能码实例
1.功能码:01H 读线圈寄存器

1)功能:读从站线圈寄存器,位操作,可读单个或者多个
2)主机发送指令:
主机发送数据包括:从站地址+功能码+寄存器起始地址+寄存器数量+校验码
假设从站地址为0x01,线圈寄存器开始地址0x0021,结束地址0x002c,即寄存器地址范围为:0x0021~0x002c,总共读取12个连续线圈的状态值,则主机发送指令如下图所示:

从站地址功能码寄存器起始地址高8位寄存器起始地址低8位寄存器数量高8位寄存器数低8位CRC校验低8位CRC校验高8位
0x010x010x000x210x000x0c0xXX0xXX

3)从站响应返回:
从站响应返回数据包括:从站地址+功能码+返回字节数+数据值+校验码
其中,返回数据值的每一位对应线圈状态,线圈状态为ON时,其值为1;状态为OFF时,其值为0;【数据以小端的形式进行存储,即最低有效位存放于内存最低位地址(位于二进制的右侧)。每8个位组成一个字节,当线圈的数量不是8的倍数时,剩余的位数添0补位。】

从站地址功能码返回字节数data1data2CRC校验低8位CRC校验高8位
0x010x010x020xCB0x0B0xXX0xXX

本例中读取12个线圈,12/8商1余4,因此需要2个字节存放应答数据,返回字节数为2。
字节1存放线圈编号0x21~0x28的数值(小端字节序,线圈28的值存放在bit7,线圈21的值存放在bit0);
字节2存放线圈编号0x29~0x2c的数值,剩余位数添0补位;

上表中data1表示0x0021-0x0028的线圈状态,data1的最低位代表最低地址的线圈状态;
data1:0xCB=1100 1011,则data1线圈状态如下表所示:

线圈地址0x280x270x260x250x240x230x220x21
数值11001011

data2表示地址0x0029~0x002c的线圈状态,不够8位,字节高位填充为0。
data2:0x0B=0000 1011,则data2线圈状态如下表所示:

线圈地址0x300x2f0x2e0x2d0x2c0x2b0x2a0x29
数值00001011
2.功能码:02H 读离散输入寄存器

1)功能:读离散输入寄存器,位操作,可读单个或多个,类似功能码0X01 。

3.功能码:03H 读保持寄存器

1)功能:读从站保持寄存器,字节操作,可读单个或者多个;每个保持寄存器占2个字节(16位);
2)主机发送指令:
主机发送数据包括:从站地址+功能码+寄存器起始地址+寄存器数量+校验码
假设从站地址为0x03,保持寄存器开始地址为0x003B,结束地址0x003D,即寄存器地址范围为:0x003B~0x003D,总共读取3个保持寄存器的数据,则主机发送指令如下图所示:

从站地址功能码寄存器起始地址高8位寄存器起始地址低8位寄存器数量高8位寄存器数量低8位CRC校验低8位CRC校验高8位
0x030x030x000x3B0x000x030xXX0xXX

3)从站响应返回:
从站响应返回数据包括:从站地址+功能码+返回字节数+数据值+校验码

从站地址功能码返回字节数data1Ldata1Hdata2Hdata2Ldata3Hdata3LCRC校验低8位CRC校验高8位
0x030x030x060x0B0x1B0x0A0x010xC20xDB0xXX0xXX

本例中读取3个保持寄存器,每个保持寄存器占2个字节,因此需要6个字节存放应答数据,返回字节数为6。
0x003B~0x003D保持寄存器的数值如下图所示:

寄存器地址0x003D0x003C0x003A
数值0xC2 DB0x0A 010x1B 0B
4.功能码:04H 读输入寄存器

1)功能:读输入寄存器,字节操作,可读单个或多个,类似功能码0X03;

5.功能码:05H 写单个线圈寄存器

1)功能:对单个线圈进行写操作,位操作,只能写一个。写入0xFF00表示将线圈置为ON,写入0x0000表示将线圈置为OFF,其它值无效;
2)主机发送指令:
主机发送数据包括:从站地址+功能码+寄存器起始地址+数据值+校验码
假设从站地址为0x03,线圈寄存器起始地址为0x0032,要将其设置为ON,则主机发送指令如下表所示:

从站地址功能码寄存器起始地址高8位寄存器起始地址低8位dataHdataLCRC校验低8位CRC校验高8位
0x030x050x000x320xff0x000xXX0xXX

3)从站响应返回:
从站应答数据包括:从站地址+功能码+寄存器地址+写入值+校验码
如果数据成功写入,则应答数据与请求数据一样,如下表所示:

从站地址功能码寄存器起始地址高8位寄存器起始地址低8位dataHdataLCRC校验低8位CRC校验高8位
0x030x050x000x320xff0x000xXX0xXX
6.功能码:06H 写单个保持寄存器|

​ 1)功能:对单个保持寄存器进行写操作,字节操作,只能写一个。
​ 2)主机发送指令:
​ 主机发送数据包括:从站地址+功能码+寄存器起始地址+数据值+校验码
​ 假设从站地址为0x01,线圈寄存器起始地址为0x0048,写入数值为0x1234,则主机发送指令如下表所示:

从站地址功能码寄存器起始地址高8位寄存器起始地址低8位dataHdataLCRC校验低8位CRC校验高8位
0x010x060x000x480x120x340xXX0xXX

3)从站响应返回:
从站应答数据包括:从站地址+功能码+寄存器地址+写入值+校验码
如果数据成功写入,则应答数据与请求数据一样。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值