Modbus通讯协议常用功能码解释

 Modbus是一种单主站的主/从通讯模式。Modbus网络上只有一个主站,主站在Modbus网络上没有地址,从站的地址范围为0-247,其中0为广播地址,从站的实际地址范围为1-247。

代码名称作用
01读取线圈状态

取得一组逻辑线圈的当前状态(ON/OFF)

02读取输入状态取得一组开关输入的当前状态(ON/OFF)
03读取保持寄存器在一个或多个保持寄存器中取得当前的二进制值
04读取输入寄存器在一个或多个输入寄存器中取得当前的二进制值
05强制单线圈强置一个逻辑线圈的通断状态
06预置单寄存器放置一个热定特定的二进制值到一个单寄存器中
07读取异常状态取得8个内部线圈的通断状态
15强置多线圈强置一串连续逻辑线圈的通断
16预置多寄存器放置一系列特定的二进制值到一系列多寄存器中
17报告从机标识可使主机判断编址从机的类型及该从机运行指示灯的状态

1.读取线圈状态(功能码01)

        读取从机离散量输出口的(ON/OFF)状态,不支持广播。

        查询:查询信息规定了要起始线圈线圈量,线圈的起始地址为0000H,1-16个线圈的寻址地址分为0000H-0015H(DO1=0000H,DO2=0001H,以此类推)。

        例子:从地址为17的从机读取D01至D06的状态。

读取线圈状态----查询
addrFunD0 start reg hiD0 start reg loD0 #of regs hiD0 #of regs loCRC16 hiCRC16 lo
地址功能码起始线圈地址高8位起始线圈地址低8位线圈量高8位线圈量低8位校验高8位校验低8位
11H01H00H00H00H

06H

XXHXXH

        响应:响应信息中的各线圈的状态与数据区的每一位的值相对应,即每个D0占用一位(1=ON,0=OFF),第一个数据字节的LSB为查询中的寻址地址,其他的线圈按顺序在该字节中由低位向高位排序,直至8个为止,下一个字节也是从低位向高位排列。若返回的线圈数不是8的倍数,则在最后的数据字节中的剩余位至字节的最高位全部填0,字节数区说明全部的字节数。

读取线圈状态----响应
addrFunByte countDataCRC16 hiCRC16 lo
地址功能码字节数数据位校验高8位校验低8位
11H01H01H

2AH

XXHXXH

                                                                                        数据:

000000D02D01
MSB765432LSB

2.读取输入状态(功能码02)

        读取从机离散量输入信号(ON/OFF)的状态,不支持广播。

        查询:查询信息规定了要输入起始地址,以及输入信号的数量。输入的起始地址为0000H,1-16个输入口的地址分别为0-15(DO1=0000H,DO2=0001H,以此类推)。

        例子:从地址为17的从机读取D01至D16的状态。

读取输入状态----查询
addrFunD0 start reg hiD0 start reg loD0 #of regs hiD0 #of regs loCRC16 hiCRC16 lo
地址功能码起始线圈地址高8位起始线圈地址低8位线圈量高8位线圈量低8位校验高8位校验低8位
11H02H00H00H00H

10H

XXHXXH

        响应:响应信息中的各输入口的状态,分别对应于数据区中的每一位值,1=ON,0=OFF,第一个数据字节的LSB为查询中的寻址地址,其他输入口按顺序在该字节中由低位向高位排序,直至8个为止,下一个字节中的8个输入位也是从低位向高位排列。若返回的输入位数不是8的倍数,则在最后的数据字节中的剩余位直至字节的最高位全部填0,字节数区说明了全部数据的字节数。

读取输入状态----响应
addrFunByte countData1Data2CRC16 hiCRC16 lo
地址功能码字节数数据位数据位校验高8位校验低8位
11H02H02H

33H

CCHXXHXXH

                                                                                         数据1:

DI8DI7DI6DI5DI4DI3DI2DI1
MSBLSB

                                                                                         数据2:

DI16DI15DI14DI13DI12DI11DI10DI9
MSBLSB

3.读取保持寄存器(功能码03)

        读取从机保持寄存器的二进制数据,不支持广播。

        查询:查询信息规定了要的保持寄存器起始地址及保持寄存器的数量,保持寄存器寻址其实地址为0000H,寄存器1-16所对应的地址分别为0000H-0015H。

        例子:从17号从机读3个采集到的基本数据U1、U2、U3,U1的地址为0000H,U2的地址为0001H,U3的地址为0002H。

读取保持寄存器----查询
addrFunData start addr hiData start addr loD0 #of regs hiD0 #of regs loCRC16 hiCRC16 lo
地址功能码寄存器起始地址高8位寄存器起始地址低8位寄存器数量高8位寄存器数量低8位校验高8位校验低8位
11H03H00H00H00H

03H

XXHXXH

        响应:响应信息中的寄存器数据位二进制数据,每个寄存器分别对应2个字节,第一个字节为高位值数据,第二个字节为低位数据。

        读取U1、U2、U3(U1=03E8H,U2=03E7H,U3=03E9H)的响应。

读取保持寄存器----响应
addrFunByte countData1 hiData1 loData2 hiData2 loData3 hiData3 loCRC16 hiCRC16 lo
地址功能码字节数数据1高8位数据1低8位数据2高8位数据2低8位数据3高8位数据3低8位校验高8位校验低8位
11H03H06H

03H

E8H03HE7H03HE6HXXHXXH

4.读取输入寄存器(功能码04)

        读取从机输入寄存器中的二进制数据,不支持广播。

        查询:查询信息规定了要寄存器起始地址及寄存器的数量,寻址起始地址为0,寄存器1-16所对应的地址分别为0000H-0015H。

        例子:请求17号从机的0009寄存器。

读取输入寄存器----查询
addrFunD0 addr hiD0 addr loD0 #of regs hiD0 #of regs loCRC16 hiCRC16 lo
地址功能码寄存器起始地址高8位寄存器起始地址低8位寄存器数量高8位寄存器数量低8位校验高8位校验低8位
11H04H00H08H00H

03H

XXHXXH

        响应:响应信息中的寄存器为每个寄存器分别对应2个字节,第一个字节为高位数据,第二个字节为低位数据。

读取输入寄存器----响应
addrFunByte countData hiData loCRC16 hiCRC16 lo
地址功能码字节数数据位数据位校验高8位校验低8位
11H04H02H

00H

0AHXXHXXH

5.强制单线圈(功能码05)

        强制单个线圈为ON或OFF状态,广播时,该功能可强制所有从机中同一类型的线圈均为ON或OFF状态。

        该功能可跨过控制器内存的保护状态和线圈的禁止状态。线圈强制状态一直保持有效直至下一个控制逻辑作用于线圈为止。控制逻辑中无线圈程序时,则线圈处于强制状态。

        查询:查询信息规定了需要强制一个单独线圈的类型,线圈的起始地址为0000H,1-16个线圈的寻址地址分为0000H-0015H(DO1=0000H,DO2=0001H,以此类推)。

        由查询数据区中的一个常量,规定请求线圈的ON/OFF状态,FF00H值请求线圈处于ON状态,0000H值请求线圈处于OFF状态,其他值对线圈无效,不起作用。

        例子:请求17号从机开D01的ON状态。

强制单线圈----查询
addrFunD0 addr hiD0 addr loValue hiValue loCRC16 hiCRC16 lo
地址功能码寄存器地址高8位寄存器地址低8位寄存器值高8位寄存器值低8位校验高8位校验低8位
11H05H00H00HFFH

00H

XXHXXH

          响应:对这个命令请求的正常响应是在D0状态改变后传送接收到的数据。

强制单线圈----响应
addrFunD0 addr hiD0 addr loValue hiValue loCRC16 hiCRC16 lo
地址功能码寄存器地址高8位寄存器地址低8位寄存器值高8位寄存器值低8位校验高8位校验低8位
11H05H00H00HFFH

00H

XXHXXH

6.预置单寄存器(功能码06) 

        把一个值预置到一个保持寄存器中,广播时,该功能把值预置到所有从机的相同类型的寄存器中。

        该功能可跨过控制器的内存保护。使寄存器中的预置值保持不变。只能由控制器的下一个逻辑信号来处理该预置值。若控制逻辑中无寄存器程序时,则寄存器中的值保持不变。

        查询:查询信息规定了要预置寄存器的类型,寄存器寻址起始地址为0000H,寄存器1所对应的地址为0000H。

        例子:请求17号从机0040H的值为2177.

预设单寄存器----查询
addrFunData start addr hiData start addr loValue hiValue loCRC16 hiCRC16 lo
地址功能码寄存器地址高8位寄存器地址低8位数据高8位数据低8位校验高8位校验低8位
11H06H00H40H0AH

9DH

XXHXXH

        响应:对于预置单寄存器请求的正常响应是在寄存器值改变以后 将接受到的数据传送回去。

预设单寄存器----响应
addrFunData start addr hiData start addr loValue hiValue loCRC16 hiCRC16 lo
地址功能码寄存器地址高8位寄存器地址低8位数据高8位数据低8位校验高8位校验低8位
11H06H00H40H0AH

9DH

XXHXXH

7.读取异常状态(功能码07) 

        读从机中8个不正常状态线圈的数据,某些线圈号已在不同型号的控制器中预定义,而其他的线圈由用户编程,作为有关控制器的状态信息,如“machien ON/OFF”,“heads retraced”,(缩回标题),“safeties satisfied”(安全性满意),“error conditions”(存在错误条件)或其它用户定义的标志等。该功能码不支持广播。

        该功能码为存取该类信息提供了一种简单的方法,不正常线圈的类型是已知的(在功能代码中不需要线圈类型)预定义的不正常线圈号如下:

控制器型号线圈设定
M84,184/384,584,9841-8用户定义
484257电池状态
258-264用户定义
884761电池状态
762内存保护状态
763R10工况状态
764-768用于预定义

          查询:请求读从机设备17中的不正常状态。

读取异常状态----查询
addrFunCRC16 hiCRC16 lo
地址功能码校验高8位校验低8位
11H06HXXHXXH

        响应:正常响应包含8个不正常的线圈状态,为一个数据字节,每个线圈一位。LSB对应为最低线圈类型的状态。

        按查询要求返回响应:

读取异常状态----响应
addrFunD0 DataCRC16 hiCRC16 lo
地址功能码数据校验高8位校验低8位
11H06H6DHXXHXXH

        该例子中,线圈数据为6DH(二进制0110,1101),从左到右(最高位至最低位)的线圈状态分别为:OFF-ON-ON-OFF-ON-ON-OFF-ON。若控制器型号为984,这些位表示线圈8至1的状态;若控制器型号为484则表示线圈264至257的状态。

8.强制多线圈(功能码15) 

        按线圈的顺序把各线圈强制成ON或OFF。广播时,该功能代码可对各从机中相同类型的线圈起强制作用。

        该功能代码可跨过内存能保护和线圈的进制状态线圈。保持强制状态有效,并只能由空、感知器的下一个逻辑来处理。若无线圈控制逻辑程序时,线圈将保持强制状态。

        查询:查询信息规定了被强制线圈的类型,线圈的起始地址为0000H,1-16个线圈的寻址地址分为0000H-0015H(DO1=0000H,DO2=0001H,以此类推)。

        查询数据区规定了被请求线圈的ON/OFF状态,如数据区的某位值为“1”表示请求的响应线圈状态为ON,位值为“0”,则为OFF状态。

        例子:请求从机设备17中一组10个线圈为强制状态,起始线圈为20(则寻址地址为19或13H),查询的数据为2个字节,CD01H(二进制1100 1101 0000 0001)响应线圈的二进制位排序如下:

Bit:1100110100000001
Coil:2726252423332120------2928

        传送的第一个字节CDH对应线圈为27-20,LSB对应线圈20,传送的第二个字节为01H,对应的线圈为29-28,LSB为对应线圈28,其余未使用的位均填“0”。

强制多线圈----查询
addrFunD0 addr hiD0 addr loD0 #of regs hiD0 #of regs loByte countValue hiValue loCRC16 hiCRC16 lo
地址功能码起始地址高8位起始地址低8位寄存器数量高8位寄存器数量低8位字节数数据高8位数据低8位校验高8位校验低8位
11H0FH00H13H00H

0AH

02HCDH01HXXHXXH

        响应:正常响应返回从机地址,功能码,起始地址以及强制线圈数。

强制多线圈----响应
addrFunD0 addr hiD0 addr loD0 #of regs hiD0 #of regs loCRC16 hiCRC16 lo
地址功能码寄存器地址高8位寄存器地址低8位寄存器值高8位寄存器值低8位校验高8位校验低8位
11H0FH00H13H00H

0AH

XXHXXH

9.预置多寄存器(功能码16) 

        把数据按顺序预置到各寄存器中,广播时该功能代码可把数据预置到全部从机中的相同类型King的寄存器中。

        该功能代码可跨过控制器的内存保护,在寄存器中的预置值一直保持有效,只能由控制器的下一个逻辑来处理寄存器的内容,控制逻辑中无该寄存器程序时,则寄存器中的值保持不变。

        查询:查询信息规定了要预置寄存器的类型,寄存器寻址起始地址为0000H,寄存器1所对应的地址为0000H。

        例子:请求17号从机0040H的值为178077833.(十六进制为 0A9D 4089)

预设多寄存器----查询
addrFunData start reg hiData start reg loD0 #of regs hiD0 #of regs loByte countValue hiValue loValue hiValue loCRC16 hiCRC16 lo
地址功能码寄存器起始地址高8位寄存器起始地址低8位寄存器数量高8位寄存器数量低8位字节数数据高8位数据低8位数据高8位数据低8位校验高8位校验低8位
11H10H00H40H00H

02H

04H40H89H0AH9DHXXHXXH

         响应:对于预置单寄存器请求的正常响应是在寄存器值改变以后将接受到的数据传送回去。

预设多寄存器----响应
addrFunData start reg hiData start reg loD0 #of regs hiD0 #of regs loCRC16 hiCRC16 lo
地址功能码寄存器起始地址高8位寄存器起始地址低8位寄存器数量高8位寄存器数量低8位校验高8位校验低8位
11H10H00H40H00H

02H

XXHXXH

10.报告从机标识(功能码17) 

        返回一个从机地址控制器的类型,从机的当前状态,以及有关从机的其他说明,不支持广播。

        查询:请求报告从机设备17的表示ID和状态。

报告从机标识----查询
addrFunCRC16 hiCRC16 lo
地址功能码校验高8位校验低8位
11H11HXXHXXH

        响应:正常响应格式,数据内容对应每台控制器的类型。

addrFunbyte CountSlave IDRun Indicator StatusAdditfional DataCRC16 hiCRC16 lo
地址功能码字节数校验高8位校验低8位
11H11HXXHXXHXXHXXHXXH

XXH

         从机ID总结

                数据区第一个字节为Modicon控制器返回的从机ID

Slave IDController
0Micro 84
1484
2184/384
3584
8884
9984

                特注:详细信息见Modbus协议英文版或中文版。

  • 16
    点赞
  • 115
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值