嵌入式通信协议【Modbus】Modbus功能码的详细描述

news2024/11/24 17:32:31

一、读功能码

1、 01 (0x01)读线圈

在一个远程设备中,使用该功能码读取线圈的 1 至 2000 连续状态。请求 PDU 详细说明了起始地址,即指定的第一个线圈地址和线圈编号。从零开始寻址线圈。因此寻址线圈 1-16 为 0-15。

根据数据域的每个比特将响应报文中的线圈分成为一个线圈。指示状态为 1= ON 和 0= OFF。第一个数据字节的 LSB(最低有效位)包括在询问中寻址的输出。其它线圈依次类推,一直到这个字节的高位端为止,并在后续字节中从低位到高位的顺序。

如果返回的输出数量不是八的倍数,将用零填充最后数据字节中的剩余比特(一直到字节的高位端)。字节数量域说明了数据的完整字节数。

format,png

将输出 27-20 的状态表示为十六进制字节值 CD,或二进制 1100 1101。输出 27 是这个字节的MSB,输出 20 是 LSB。

通常,将一个字节内的比特表示为 MSB 位于左侧,LSB 位于右侧。第一字节的输出从左至右27 至 20。下一个字节的输出从左到右为 35 至 28。当串行发射比特时,从 LSB 向 MSB 传输:20 . . .27、28 . . . 35 等等。

在最后的数据字节中,将输出状态 38-36 表示为十六进制字节值 05,或二进制 0000 0101。输出 38 是左侧第六个比特位置,输出 36 是这个字节的 LSB。用零填充五个剩余高位比特。

注:用零填充五个剩余比特(一直到高位端)。

format,png

图 10:读取线圈状态图

2、02 (0x02)读离散量输入

在一个远程设备中,使用该功能码读取离散量输入的 1 至 2000 连续状态。请求 PDU 详细说明了起始地址,即指定的第一个输入地址和输入编号。从零开始寻址输入。因此寻址输入 1-16 为 0-15。

根据数据域的每个比特将响应报文中的离散量输入分成为一个输入。指示状态为 1= ON 和 0= OFF。第一个数据字节的 LSB(最低有效位)包括在询问中寻址的输入。其它输入依次类推,一直到这个字节的高位端为止,并在后续字节中从低位到高位的顺序。

如果返回的输入数量不是八的倍数,将用零填充最后数据字节中的剩余比特(一直到字节的高位端)。字节数量域说明了数据的完整字节数。

format,png

将离散量输入状态 204-197 表示为十六进制字节值 AC,或二进制 1010 1100。输入 204 是这个字节的 MSB,输入 197 是这个字节的 LSB。

将离散量输入状态 218-213 表示为十六进制字节值 35,或二进制 0011 0101。输入 218 位于左侧第3 比特,输入 213 是 LSB。

注:用零填充 2 个剩余比特(一直到高位端)。

format,png

图 11:读离散量输入的状态图

3、 03 (0x03)读保持寄存器

在一个远程设备中,使用该功能码读取保持寄存器连续块的内容。请求 PDU 说明了起始寄存器地址和寄存器数量。从零开始寻址寄存器。因此,寻址寄存器 1-16 为 0-15。

将响应报文中的寄存器数据分成每个寄存器有两字节,在每个字节中直接地调整二进制内容。

对于每个寄存器,第一个字节包括高位比特,并且第二个字节包括低位比特。

format,png

将寄存器 108 的内容表示为两个十六进制字节值 02 2B,或十进制 555。将寄存器 109-110 的内容分别表示为十六进制 00 00 和 00 64,或十进制 0 和 100。

 

图 12:读保持寄存器的状态图

4、 04(0x04)读输入寄存器

在一个远程设备中,使用该功能码读取 1 至大约 125 的连续输入寄存器。请求 PDU 说明了起始地址和寄存器数量。从零开始寻址寄存器。因此,寻址输入寄存器 1-16 为 0-15。

将响应报文中的寄存器数据分成每个寄存器为两字节,在每个字节中直接地调整二进制内容。

对于每个寄存器,第一个字节包括高位比特,并且第二个字节包括低位比特。

format,png

将输入寄存器 09 的内容表示为两个十六进制字节值 00 0A,或十进制 10。

format,png

图 13:读输入寄存器的状态图

 

二、写功能码 

1、 05 (0x05)写单个线圈

在一个远程设备上,使用该功能码写单个输出为 ON 或 OFF。

请求数据域中的常量说明请求的 ON/OFF 状态。十六进制值 FF 00 请求输出为 ON。十六进制值 00 00 请求输出为 OFF。其它所有值均是非法的,并且对输出不起作用。

请求 PDU 说明了强制的线圈地址。从零开始寻址线圈。因此,寻址线圈 1 为 0。线圈值域的常量说明请求的 ON/OFF 状态。十六进制值 0XFF00 请求线圈为 ON。十六进制值 0X0000 请求线圈为OFF。其它所有值均为非法的,并且对线圈不起作用。

正常响应是请求的应答,在写入线圈状态之后返回这个正常响应。

format,png

format,png

图 14:写单个输出状态图

2、06 (0x06)写单个寄存器

在一个远程设备中,使用该功能码写单个保持寄存器。

请求 PDU 说明了被写入寄存器的地址。从零开始寻址寄存器。因此,寻址寄存器 1 为 0。

正常响应是请求的应答,在写入寄存器内容之后返回这个正常响应。

format,png

format,png

图 15:写单个寄存器状态图

3、 15 (0x0F) 写多个线圈

在一个远程设备中,使用该功能码强制线圈序列中的每个线圈为 ON 或 OFF。请求 PDU 说明了强制的线圈参考。从零开始寻址线圈。因此,寻址线圈 1 为 0。

请求数据域的内容说明了被请求的 ON/OFF 状态。域比特位置中的逻辑“1”请求相应输出为ON。域比特位置中的逻辑“0”请求相应输出为 OFF。

正常响应返回功能码、起始地址和强制的线圈数量。

format,png

这是一个请求从线圈 20 开始写入 10 个线圈的实例:

请求的数据内容为两个字节:十六进制 CD 01 (二进制 1100 1101 0000 0001)。使用下列方法,二进制比特对应输出。

比特:1 1 0 0 1 1 0 1 0 0 0 0 0 0 0 1

输出:27 26 25 24 23 22 21 20 _ _ _ _ _ _ 29 28

传输的第一字节(十六进制 CD)寻址为输出 27-20,在这种设置中,最低有效比特寻址为最低输出(20)。

传输的下一字节(十六进制 01)寻址为输出 29-28,在这种设置中,最低有效比特寻址为最低输出(28)。

应该用零填充最后数据字节中的未使用比特。

 

0e9eb27db2f64daf9cf7139274db7008.png

 

format,png

图 16:写多个输出的状态图

4、 16 (0x10) 写多个寄存器

在一个远程设备中,使用该功能码写连续寄存器块(1 至约 120 个寄存器)。

在请求数据域中说明了请求写入的值。每个寄存器将数据分成两字节。

正常响应返回功能码、起始地址和被写入寄存器的数量。

format,png

format,png

图 17:写多个寄存器状态图

三、文件相关

1、 20 (0x14) 读文件记录

使用该功能码进行文件记录读取。根据字节数量提供所有请求数据长度,并且根据寄存器提供所有记录长度。

文件是记录的结构。每个文件包括 10000 个记录,寻址这些记录为十进制 0000 至 9999 或十六进制 0X0000 至 0X270F,例如寻址记录 12 为 12。

该功能可以读取多个参考组。这些组可以是分散的(不连续的),但每组中的参考必须是连续的。

用含有 7 个字节的独立“子请求”域定义每个组:

参考类型:1 个字节(必须规定为 6)

文件号:2 个字节

文件中的起始记录号:2 个字节

被读出的记录长度:2 个字节

被读取的寄存器数量不能超过 MODBUS 报文允许的长度:256 个字节,这个寄存器数量与预期响应中的所有其它域组合。

正常响应是一系列“子响应”,与“子请求”一一对应。字节数域是所有“子响应”中的全部组合字节数。另外,每个“子响应”都包括一个表示自身字节数的域。

format,png

这是一个请求从远程设备读取两个参考组的实例:

组1 包括文件 4 中的 2 个寄存器,以寄存器 1 开始(地址 0001)。

组2 包括文件 3 中的 2 个寄存器,以寄存器 9 开始(地址 0009)。

format,png

format,png

图 18:读文件记录状态图

2、 21 (0x15) 写文件记录

使用该功能码进行文件记录写入。根据字节数量提供所有请求数据长度,并且根据 16 比特字的数量提供所有记录长度。

文件是记录的结构。每个文件包括 10000 个记录,寻址这些记录为十进制 0000 至 9999 或十六进制 0X0000 至 0X270F,例如寻址记录 12 为 12。

该功能可以写多个参考组。这些组可以是分散的,即不连续的,但每组内的参考必须是连续的。

用含有 7 个字节和数据的独立“子请求”域定义每个组:

参考类型:1 个字节(必须规定为 6)

文件号:2 个字节

文件中的起始记录号:2 个字节

被写入的记录长度:2 个字节

被写入的数据:每个寄存器为 2 字节。

被写入的寄存器数量不能超过 MODBUS 报文允许的长度:256 个字节,这个寄存器数量与询问中的所有其它域组合。

正常响应是请求的应答。

format,png

这是一个请求将一个参考组写入远程设备的实例:

组包括文件4 中的3 个寄存器,以寄存器7 开始(地址0007)。

format,png

format,png

图 19:写文件记录状态图

3、 22 (0x16) 屏蔽写寄存器

该功能码用于通过利用 AND 屏蔽、OR 屏蔽以及寄存器内容的组合来修改特定保持寄存器的内容。使用这个功能设置或清除寄存器中的单个比特。

请求说明了被写入的保持寄存器、AND屏蔽使用的数据以及 OR 屏蔽使用的数据。

从0 开始寻址寄存器。因此,寻址寄存器 1-16为0-15。功能的算法为:

结果= (当前内容 AND And_Mask) OR (Or_Mask AND And_Mask)

例如:

a7106708e4da98a4853b39a6aca48fd5.png

注:如果Or_Mask 值为零,那么结果是当前内容和 And_Mask的简单逻辑 AND(与)。如果 And_Mask 值为零,结果等于 Or_Mask值。可以使用读保持寄存器功能(功能码03)读出寄存器的内容。于是,当控制器扫描它的用户逻辑程序时,随后可以改变寄存器的内容。

正常的响应是请求的应答。在已经写入寄存器之后,返回响应。

format,png

format,png

图 20:屏蔽写保持寄存器状态图

四、其他功能码

1、 23 (0x17) 读/写多个寄存器

在一个单独 MODBUS 事务中,这个功能码实现了一个读操作和一个写操作的组合。从零开始寻址保持寄存器。因此,寻址保持寄存器 1-16为0-15。

请求说明了起始地址、被读取的保持寄存器号和起始地址、保持寄存器号以及被写入的数据。在写数据域中,字节数说明随后的字节号。

正常响应包括被读出的寄存器组的数据。在读数据域中,字节数域说明随后的字节数量。

format,png

 

 

这是一个请求从寄存器4开始读六个寄存器并且从寄存器15开始读三个寄存器的实例:

format,png

format,png

图 21:读/写多个寄存器状态图

2 、43 (0x2B)读设备识别码

这个功能码允许读取与远程设备的物理描述和功能描述相关的识别码和附加报文。

将读设备识别码接口模拟为一个地址空间,这个地址空间由一组可寻址数据元素组成。数据元素是被叫对象,并且对象Id确定这个数据元素。

接口由 3 种对象组成:

  • 基本设备识别码。所有此种对象都是必备的:厂商名称、产品代码和修订本号。
  • 正常设备识别码。除基本数据对象以外,设备提供了附加的和可选择的识别码以及数据对象描述。按标准定义所有种类的对象,但是这种对象的执行是可选的。
  • 扩展设备识别码。除正常数据对象以外,设备提供了附加的和可选的识别码以及专用数据描述。所有这些数据都是与设备有关的。

format,png

format,png

请求参数描述:

指配号为14的MODBUS封装接口识别读识别码请求。定义四种访问类型:

01:请求获得基本设备识别码(流访问)

02:请求获得正常设备识别码(流访问)

03:请求获得扩展设备识别码(流访问)

04:请求获得特定识别码对象(专用访问)

在识别码数据不适合单独响应的情况下,可以需要几个请求/响应事务处理。对象id字节给出了获得的第一个对象识别码。对于第一个事物处理来说,客户机必须设置对象id为0,以便获得设备识别码数据的开始。对于下列事务来说,客户机必须设置对象id为前面响应中服务器的返回值。

如果对象id不符合任何已知对象,那么服务器象指向对象0那样响应(从头开始)。

在单个访问的情况下:ReadDevId代码04,请求中的对象id给出了获得的对象识别码。

如果对象id不符合任何已知对象,那么服务器返回一个异常码=02(非法数据地址)的异常响应。

响应参数描述:

功能码: 功能码 43(十进制)0x2B (十六进制)

MEI 类型: 为设备识别码接口指配号的 14 (0x0E) MEI 类型

ReadDevId 码: 与请求 ReadDevId 码相同:01、02、03 或 04

一致性等级: 设备的识别码一致性等级和支持访问的类型

01:基本识别码(仅流访问)

02:正常识别码(仅流访问)

03:扩展识别码(仅流访问)

81:基本识别码(流访问和单个访问)

82:正常识别码(流访问和单个访问)

83:扩展识别码(流访问和单个访问)

随后更多: 在 ReadDevId 码 01、02或03(流访问)的情况下,

如果识别码数据不符合单个响应,那么需要几个请求/响应事务处理。

00:对象不再是可利用的

FF:其它识别码对象是可利用的,并且需要更多 MODBUS 事务处理

在 ReadDevId码04(单个访问)的情况下,

必须设置这个域为00。

下一个对象 Id: 如果“随后更多=FF”,那么请求下一个对象的识别码

如果“随后更多=00”,那么必须设置为00(无用的)对象号

在响应中返回的对象识别码号

(对于单个访问,对象号码= 1)

对象 0.id: PDU 中返回的第一个对象识别码(流访问)或请求对象的识别码(单个访问)

Object0.长度: 第一个对象的字节长度

Object0.值: 第一个对象的值(对象0.长度字节)

ObjectN.id: 最后对象的识别码(在响应中)

ObjectN.长度: 最后对象的字节长度

ObjectN.值: 最后对象的值(对象N.长度字节)

“基本设备识别码”的读设备识别码请求的实例:在这个实例中,一个响应PDU中发送所有的报文。

format,png

 

 

如果一个设备需要几个事务处理发送响应,那么启动下列事务处理。

format,png

format,png

图 22:读设备识别码状态图

五、MODBUS 异常响应

当客户机设备向服务器设备发送请求时,客户机希望一个正常响应。从主站询问中出现下列四种可能事件之一:

  • 如果服务器设备接收到无通信错误的请求,并且可以正常地处理询问,那么服务器设备将返回一个正常响应。
  • 如果由于通信错误,服务器没有接收到请求,那么不能返回响应。客户机程序将最终处理请求的超时状态。
  • 如果服务器接收到请求,但是检测到一个通信错误(奇偶校验、LRC、CRC、...),那么不能返回响应。客户机程序将最终处理请求的超时状态。
  • 如果服务器接收到无通信错误的请求,但不能处理这个请求(例如,如果请求读一个不存在的输出或寄存器),服务器将返回一个异常响应,通知用户错误的本质特性。

异常响应报文有两个与正常响应不同的域:

功能码域:在正常响应中,服务器利用响应功能码域来应答最初请求的功能码。所有功能码的最高有效位(MSB)都为0(它们的值都低于十六进制 80)。在异常响应中,服务器设置功能码的MSB为1。这使得异常响应中的功能码值比正常响应中的功能码值高十六进制80。

通过设置功能码的MSB,客户机的应用程序能够识别异常响应,并且能够检测异常码的数据域。

数据域:在正常响应中,服务器可以返回数据域中数据或统计表(请求中要求的任何报文)。在异常响应中,服务器返回数据域中的异常码。这就定义了产生异常的服务器状态。

客户机请求和服务器异常响应的实例:

1ef6a3e2a437b90c5d21711aa165e7b7.png

在这个实例中,客户机对服务器设备寻址请求。功能码(01)用于读输出状态操作。它将请求地址1245(十六进制04A1)的输出状态。值得注意的是,象输出域(0001)号码说明的那样,只读出一个输出。

如果在服务器设备中不存在输出地址,那么服务器将返回异常码(02)的异常响应。这就说明从站的非法数据地址。

异常码的列表:

format,png

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/530250.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

vs 推送代码 之 gitee

我们常常想将自己的代码放入到代码管理工具中,接下来我们将讲解如何去将vs中的代码放入到代码管理工具中 目的:将vs中的项目代码放入到gitee中 首先: 我们需要注册一下gitee的账号,官网:gitee官网 辅助工具&#xff…

做网络那么多年,连以太网接口和串口都分不清?本文值得一看!

路由器是一种网络设备,它的主要功能是在不同的网络之间转发数据包,实现网络互联。路由器根据数据包的目的地址,选择最佳的路径,将数据包发送到下一跳。路由器可以连接不同的网络类型,如以太网、帧中继、PPP等。 路由器…

JavaWeb_Mysql_多表设计与查询

JavaWeb_Mysql_多表设计与查询 多表设计外键约束物理外键 -- 不推荐逻辑外键 多表关系实现 多表查询数据准备内连接外连接子查询标量子查询列子查询行子查询表子查询 案例数据准备案例需求 来源 多表设计 外键约束 物理外键 – 不推荐 概念: 使用foreign key定义外键关联另外…

关于网络命令 ping 你了解多少

1、介绍 Ping(Packet Internet Groper)是 Windows、Unix 和 Linux系统下的一个命令。ping 也属于一个通信协议,是 TCP/IP 协议的一部分。   Ping的运作原理是向目标主机传出一个 ICMP(Internet Control Messages Protocol)即因特网信报控制…

Linux内核的源码目录结构和配置体系

1.linux内核源码目录结构1 1.1、源码从哪里来 (1)我们使用2.6.35.7版本的内核。这个版本的内核有三种:第一种是kernel.org上的官方版本,第二种是三星移植过的,第三种是九鼎X210的移植版本。这里使用第三个。 (2)进入源码目录下&#xff0c…

《QT+PCL》点云配准进阶——GROR配准

《QT+PCL》点云配准进阶——GROR配准 一、展示效果二、ui设计三、代码3.1添加代码一、展示效果 根据之前的文章GROR复现,今天将其集成到QT软件中 二、ui设计 三、代码 3.1添加代码 qt的头文件、源文件依旧添加相关代码 其中,如果有函数冲突,改成内联函数,添加inline<…

【系统移植】开发板的启动过程

目录 1、开发板启动相关部件 2、开发板启动过程&#xff08;以 EMMC 启动为例&#xff09; (1) 运行 BL0&#xff08;初始化&#xff09; (2) 加载 uboot 引导程序 (3) 加载 linux 镜像、设备树、根文件系统 3、SD卡的存储结构 1、开发板启动相关部件 下面是一个简单的开…

非常有用的Linux网络诊断命令:traceroute

简介 traceroute 是一个网络诊断工具&#xff0c;用于检测数据包从本机到目标主机经过的路由路径。它可以帮助我们分析出网络连接的瓶颈&#xff0c;定位网络问题&#xff0c;并帮助我们优化网络连接。在 Linux 系统中&#xff0c;traceroute 命令是一个非常常用的工具。 安装…

java语法(二)线程并发、Juit单元测试、注解、反射机制、JVM

文章目录 线程并发多线程多线程的创建Thread常用API 线程同步与通信线程同步&#xff1a;单例模式的三种写法同步代码块同步方法Lock锁 线程通信 线程池获取线程池对象ThreadPoolExecutor线程池处理runnable任务线程池处理callable任务 Executors定时器Timer调度可重复执行任务…

【连续介质力学】张量的谱表示和Cayley-Hamilton定理

张量的谱表示 基于特征多项式&#xff1a; 如果 T T T 是对称二阶张量&#xff0c;那么有三个实数特征值&#xff1a; T 1 , T 2 , T 3 T_1, T_2, T_3 T1​,T2​,T3​, 对应有特征向量&#xff1a; 主空间由特征向量构成的正交基 n ^ ( 1 ) , n ^ ( 2 ) , n ^ ( 3 ) \hat n^…

【自然语言处理】【大模型】BLOOM模型结构源码解析(单机版)

BLOOM模型结构源码解析(单机版) ​ 本文基于transformers中BLOOM模型代码来解析BLOOM的原理及实现。 相关博客 【自然语言处理】【大模型】BLOOM模型结构源码解析(单机版) 【自然语言处理】【大模型】极低资源微调大模型方法LoRA以及BLOOM-LORA实现代码 【深度学习】【分布式训…

Win32程序入口识别,定位回调函数,具体事件处理的定位,ESP寻址方式,压栈方式复习

本专栏上一篇文章带领大家编写了第一个Windows程序&#xff0c;并且带领大家了解了Windows消息机制&#xff0c;如果大家还是不了解的话&#xff0c;可以到我的另一篇专栏中深入学习一下windows消息&#xff0c;Windows消息循环的原理&#xff0c;点击这里就可以查看啦。 我们在…

Gateway网关详解及实践---SpringCloud组件(五)

Gateway网关详解及实践 一 简介1.1介绍1.2.GateWay核⼼概念1.3.GateWay核心功能 二Gateway入门案例2.1 gateway依赖2.2 gateway配置2.3 gateway测试 三Gateway面向服务的路由3.1.门案例问题3.2.gateway-server结合eureka步骤3.2.1.添加Eureka客户端依赖3.2.2.添加Eureka配置3.2…

MySQL进阶-MySQL体系结构和常见存储引擎的比较

本文介绍MySQL体系结构以及存储引擎&#xff08;InnoDB、MyISAM、Memory&#xff09;的比较 文章目录 MySQL 体系结构连接层服务层连接池系统管理和控制工具SQL接口解析器查询优化器缓存 引擎层存储层 存储引擎InnoDBMyISAMMemory区别 MySQL 体系结构 连接层 最上层是一些客户…

Rust 正式发布八周年纪念日 2023.5.15

图源&#xff1a;维基百科 目录 Rust 1. Rust的特点 1.1 安全性 1.2 并发性 1.3 性能 1.4 代码可读性 2. 使用场景 2.1 系统编程 2.2 Web开发 2.3 游戏开发 3. 与其他语言的对比 4. 代码示例 1. Hello, World! 2. 简单的函数 3. 变量绑定和变量类型推断 4. 结…

dayday60-120

目录 60 申论强化361 申论强化462 模考大赛错题63 言语真题164 言语真题65 言语真题366 判断真题1676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120 60 申论强化3 1.公文题的格式不允许丢…

Vector - CAPL - CAN消息自动化设置

目录 canGetDataLength -- 获取CAN消息有效负载长度 代码示例 canOutputErrorFrame -- 模拟发送错误帧消息 代码示例 isStdId & isExtId -- 判断报文是标准帧&扩展帧 代码示例 mkExtId -- 将标准帧转换为扩展帧 代码示例 valOfId -- CAN消息的长值标识符 代…

基于SpringBoot的原创歌曲平台的设计与实现

背景 原创歌曲分享平台&#xff0c;为了随时随地查看原创歌曲分享信息提供了便捷的方法&#xff0c;更重要的是大大的简化了管理员管理原创歌曲分享信息的方式方法&#xff0c;更提供了其他想要了解原创歌曲分享信息及运作情况以及挑选方便快捷的可靠渠道。相比于传统原创歌曲…

六级备考33天|CET-SET6|六级口语|备考手册|考试样题|热门话题

目录 样题 1 The benefits of college athletics 2 The adverse impact of cheating on examinations 3 My view on working part-time during ones college years 4 Should students take part in extracurricular activities 5 If you choose overseas studies 6 The…

基于stm32物联网开发板(3)--SYN6288语音模块

基于stm32物联网开发板(3)–SYN6288语音模块 1.SYN6288语音模块展示示例 SYN6288语音模块 2.概述 SYN6288-A语音合成模块是一款性价比更高&#xff0c;效果更自然的一款中高端语音合技术 。 SYN6288-A通过异步串口接收待合成的文本&#xff0c;实现文本到声音&#xff08;TTS&…