modbus报文实例(modbus功能码对照表)

modbus报文实例(modbus功能码对照表)该功能码用于从远程设备中连续读取 1 到 2000 0xFFFF 个线圈的状态 使用方法是请求 PDU 指定起始地址 第一个指定线圈的地址 线圈的数量 在 PDU 中 线圈从零开始寻址 因此 编号为 1 16 的线圈被寻址为 0 15 响应消息中的线圈被打包为 N 个数据字段 字段中每个位代表一个线圈 1 打开 0 关闭 如果输出数量不是 8 的倍数 则增加一个字节

大家好,我是讯享网,很高兴认识大家。



该功能码用于从远程设备中连续读取1到2000(0xFFFF)个线圈的状态。使用方法是请求PDU指定起始地址(第一个指定线圈的地址)+线圈的数量。在PDU中,线圈从零开始寻址。因此,编号为1-16的线圈被寻址为0-15。
响应消息中的线圈被打包为N个数据字段,字段中每个位代表一个线圈,1=打开,0=关闭。如果输出数量不是8的倍数,则增加一个字节,最后一个数据字节中的剩余位将用零填充(向字节的高位填充)。

0x01功能码请求响应报文格式
讯享网

 在这里首先明确一个基本概念:字节序和位序

在前篇的数据结构中已经说明,modbus采用大端字节序,会将大数据分割成多个字节,优先传输高位。这里的顺序指的是字节发送的顺序而非位序。而在串行通信中,对于位的传输都是从低位到高位,该顺序与字节的顺序相反。,因此我们可以看到如下实例:

0x01功能码异常/错误码和实例

 如图实例,输出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)。剩下的五个高位位都是零。

0x02和0x01基本一致,唯一的区别就是离散输入是只读的。离散输入是只读的输入,线圈是可控的输出。

0x03功能码请求响应错误/异常报文格式

0x03功能码实例

实例如图,请求报文为03(功能码)+00(起始地址高位字节)+6B(起始地址低位字节)+00(寄存器地址高位字节)+03(寄存器地址低位字节)

响应报文为03(功能码响应)+06(接下来的数据大小,6个字节)+02(0x6B+1=0x6C,也就是十进制108,108号寄存器的高位)+2B(108号寄存器的低位)+00(109高位)+00(109低位)+00(110高位)+64(110低位)

由于此处寄存器都是对字节的操作,因此不需要考虑位序的问题。

和0x03一样,区别只在于输入寄存器是只读的。

简单来说就是把单个输出设置为打开或关闭状态。值为FF 00为打开状态。值为00 00则是关闭状态。其他任意值都为非法,都不改变输出状态。
依旧是请求PDU从0开始寻址,寻址方式都和之前如出一辙。正常的响应是在写入线圈状态后返回请求的回显。也就是请求啥响应啥。

0x05请求响应报文格式

0x05错误/异常报文格式以及实例

具体看实例就明白了了。如图,格式就是功能码+输出地址高位+低位+输出(写入)值高位+输出(写入)值低位,响应报文则和输入报文一模一样。

和0x05基本上一模一样,区别只有目标对象是寄存器而已

0x06请求响应错误/异常报文和实例

有的设备自带异常状态输出,该功能码用于读取远程设备中八个异常状态输出的内容。由于这8个状态是由设备预先定义,modbus协议本身也定义了0-7为异常状态输出,因此不需要额外的地址或者输出引用。
正常的响应包含了八个异常状态输出的状态。这些输出被打包到一个数据字节中,每个输出占用一个位。最低输出引用的状态包含在字节的最低有效位中。

0x07功能码请求应答错误和实例

如图,实例中返回6D,将其作为BCD码转化回二进制则为0。输出时从最高地址到最低地址的依次显示,也就是从右到左,从最高有效地址位到最低有效地址位。

功能码08用于测试客户端设备和服务器之间通信系统,或检查服务器内部的各种错误条件。

08功能码还需要一个大小为2Bytes的子功能码来定义要执行的测试类型。服务器会在正常响应中同时回显功能码和子功能码。某些诊断功能会导致设备的数据在正常响应的数据字段中返回。
通常情况下,向远程设备发出诊断功能不会影响远程设备中运行的用户程序。诊断功能不会访问用户逻辑单元,如离散和寄存器。某些功能可以选择性地重置远程设备中的计数器。
另外,服务器设备可以被强制进入“仅监听模式”,在该模式下,它将监视通信系统上的消息,但不对其进行响应。该模式可能会影响应用程序和设备间的数据交换。该模式的执行一般用于将有故障的设备在通信系统中移除。
对于“返回查询数据”请求的正常响应是将相同的数据回送。功能码和子功能码也会被回显。

0x08请求报文格式

0x08响应和错误/异常报文格式

接下来列出其子功能码:

以下是翻译后的内容:

00 返回查询数据

请求数据字段中传递的数据将在响应中返回(回送)。整个响应消息应与请求完全相同。
子功能请求数据字段响应数据字段 0000 任意 回显

01 重新启动通信选项

初始化和重新启动远程设备的串行线端口,并清除所有通信事件计数器。如果端口当前处于仅监听模式,则不返回响应。此功能是唯一将端口从仅监听模式中退出的功能。如果端口当前不处于仅监听模式,则会在重启之前返回正常响应。
当远程设备接收到请求时,它会尝试重新启动和自检测试,成功完成测试将使端口上线。
请求数据字段为FF 00十六进制会导致端口的通信事件日志也被清除。请求数据字段为00 00将保留日志在重新启动之前的状态。
子功能请求数据字段响应数据字段 0001 00 00 00 01 00 00 0001 FF 00 00 01 FF 00

02 返回诊断寄存器

响应中返回远程设备的16位诊断寄存器的内容。

子功能请求数据字段响应数据字段 0002 00 00 诊断寄存器内容

03 更改ASCII输入分隔符

请求数据字段中传递的字符'CHAR'将成为未来消息的结束分隔符(替代默认的LF字符)。在ASCII消息末尾不需要换行符的情况下,此功能非常有用。
子功能请求数据字段响应数据字段 0003 CHAR 00 回显请求数据


04 强制进入仅监听模式

强制被寻址的远程设备进入仅监听模式,用于MODBUS通信。这将使其与网络上的其他设备隔离,允许它们在不受干扰的情况下继续通信。不返回响应。
当远程设备进入仅监听模式时,所有活动的通信控制都被关闭。准备就绪的看门狗定时器将被允许超时,关闭控制。在设备处于此模式时,将监视寻址到它或广播的任何MODBUS消息,但不会执行任何操作,也不会发送任何响应。
在进入该模式后,唯一会被处理的功能是重新启动通信选项功能(功能码8,子功能1)。
子功能请求数据字段响应数据字段 0004 00 00 无响应返回

10 (0A Hex) 清除计数器和诊断寄存器

目标是清除所有计数器和诊断寄存器。计数器也会在上电时被清除。
子功能请求数据字段响应数据字段 0010 00 00 回显请求数据

11 (0B Hex) 返回总线消息计数

响应数据字段返回远程设备自上次重新启动、清除计数器操作或上电以来在通信系统上检测到的消息数量。
子功能请求数据字段响应数据字段 0011 00 00 总消息计数

12 (0C Hex) 返回总线通信错误计数

响应数据字段返回远程设备自上次重新启动、清除计数器操作或上电以来遇到的CRC错误数量。
子功能请求数据字段响应数据字段 0012 00 00 CRC错误计数

13 (0D Hex) 返回总线异常错误计数

响应数据字段返回远程设备自上次重新启动、清除计数器操作或上电以来返回的MODBUS异常响应数量。
异常响应在第7节中有描述和列出。

子功能

请求数据字段

响应数据字段

0013

00 00

异常错误计数

14 (0E Hex) 返回服务器消息计数

响应数据字段返回自上次重新启动、清除计数器操作或上电以来远程设备处理的寻址到该远程设备或广播的消息数量。

子功能请求数据字段响应数据字段

0014 00 00 服务器消息计数

15 (0F Hex) 返回服务器无响应计数

响应数据字段返回自上次重新启动、清除计数器操作或上电以来寻址到远程设备但未返回任何响应(既不是正常响应也不是异常响应)的消息数量。

子功能请求数据字段响应数据字段

0015 00 00 服务器无响应计数

16 (10 Hex) 返回服务器NAK计数

响应数据字段返回自上次重新启动、清除计数器操作或上电以来寻址到远程设备并返回否定应答(NAK)异常响应的消息数量。异常响应在第7节中有描述和列出。

子功能请求数据字段响应数据字段

0016 00 00 服务器NAK计数

17 (11 Hex) 返回服务器忙计数

响应数据字段返回自上次重新启动、清除计数器操作或上电以来寻址到远程设备并返回服务器设备忙异常响应的消息数量。

子功能请求数据字段响应数据字段

0017 00 00 服务器设备忙计数

18 (12 Hex) 返回总线字符溢出计数

响应数据字段返回自上次重新启动、清除计数器操作或上电以来寻址到远程设备但由于字符溢出条件而无法处理的消息数量。字符溢出是由数据字符到达端口的速度超过存储速度,或由于硬件故障导致字符丢失引起的。

子功能请求数据字段响应数据字段

0018 00 00 服务器字符溢出计数

20 (14 Hex) 清除溢出计数器和标志

清除溢出错误计数器并重置错误标志。

子功能请求数据字段响应数据字段

0020 00 00 回显请求数据

 

实例如下:

 如图,请求报文为功能码08+子功能码高位00+子功能码低位00(子功能码0000,实现返回查询数据)+数据高位A5+数据低位37

响应报文和返回报文一致,即实现了返回查询数据。

 

该功能码用于从远程设备的通信事件计数器中获取状态字和事件计数。每次成功完成消息事件(各种请求响应命令等,但不包括异常响应、轮询命令和获取事件计数器的命令),都会让设备的事件计数器在增加。通过通信系统诊断功能(功能码08)的子功能码0001(重启)或000A(清除计数器和诊断计数器)可以重置事件计数器。正常的响应包含一个两字节的状态字和一个两字节的事件计数。如果先前发出的程序命令仍在远程设备中处理中(存在繁忙状态),状态字将为全1(FF FF十六进制)。否则,状态字将为全0。

0x0B功能码请求响应异常

0x0B功能码实例

在该例中,状态字为FF FF,远程设备繁忙。事件计数显示设备已经计数了264个事件(01 08十六进制)

0x0C 获取串行通信事件日志 ( Get Comm Event Log (Serial Line only) )

功能如其名,使用方法和0x01读线圈状态基本一致、这个功能码用于强制远程设备中一系列线圈中的每个线圈为打开或关闭状态。请求PDU指定要强制的线圈引用。线圈的地址从零开始。因此,编号为1的线圈被视为地址0。
请求数据字段的内容指定了所请求的打开/关闭状态。字段中的逻辑“1”表示请求相应的输出为打开状态。逻辑“0”表示请求相应的输出为关闭状态。
正常的响应返回功能码、起始地址和强制线圈的数量。

0x0F请求响应异常报文

以下是一个写入从线圈20开始的一系列10个线圈的请求示例,在阅读该例子前,请先确保已经理解了我在0x01功能码中所写的有关位序和字节序的说明。

0x10 写多个寄存器(Write Multiple registers)

0x11功能码请求响应异常处理

0x11功能码实例

如图实例,请求报文为功能码11,响应报文为功能码11+设备数据大小(用一个字节表示)+设备ID+设备开关指示符(0x00或0xFF,前者表示关闭后者表示开启)+设备附加数据

该功能码用于执行文件记录读取。所有请求数据长度以字节为单位提供,而记录长度以寄存器为单位提供。
文件是记录的组织形式。每个文件包含10000个记录,地址为0000到9999十进制或0X0000到0X270F。例如,记录12的地址为12。
该函数可以读取多个引用组。这些组可以是分离的(非连续的),但是每个组内的引用必须是连续的。
每个组在一个单独的“子请求”字段中定义,该字段包含7个字节:
引用类型:1个字节(必须指定为6)
文件号:2个字节
文件中的起始记录号:2个字节
要读取的记录长度:2个字节
要读取的寄存器数量与预期响应中的所有其他字段相结合,不能超过MODBUS PDU的允许长度:253个字节。
正常响应是一系列“子响应”,每个“子请求”对应一个。字节计数字段是所有“子响应”中字节总数的组合计数。此外,每个“子响应”还包含一个显示自己字节计数的字段。

0x14功能码请求报文

0x14功能码请求、响应、异常处理报文

该功能码用于执行文件记录写入操作。和0x14读文件记录相似,所有请求数据长度以字节为单位提供,而记录长度以16位字(word)的数量为单位提供。
文件是记录的组织形式。每个文件包含10000个记录,地址为0000到9999十进制或0X0000到0X270F。例如,记录12的地址为12。
该函数可以写入多个引用组。这些组可以是分离的(非连续的),但是每个组内的引用必须是连续的。
每个组在一个单独的“子请求”字段中定义,该字段包含7个字节加上数据:
引用类型:1个字节(必须指定为6)
文件号:2个字节
文件中的起始记录号:2个字节
要写入的记录长度:2个字节
要写入的数据:每个寄存器2个字节
要写入的寄存器数量与请求中的所有其他字段相结合,不能超过MODBUS PDU的允许长度:253个字节。
正常响应是请求的回显。

0x15请求报文

0x15请求响应异常处理报文

该功能码使用“与字”(And_Mask)、“或字”(Or_Mask)以及寄存器当前内容进行运算来修改指定保持寄存器的内容。可用于设置或清除寄存器中的单个位。

其中,“AND_Mask”表示需要且的内容,“OR_Mask”表示需要或的内容,该功能码的算法为:

结果 = (寄存器当前内容 && 与字)||(或字 &&(与字按位取反))

实例如图:

 Current Contents为寄存器当前内容,Not And_mask为与码按位取反,Result为结果

小讯
上一篇 2025-05-15 20:10
下一篇 2025-05-08 20:34

相关推荐

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/191095.html