Modbus 中的功能码和异常码

可视化 Modbus 设备中的数据

Modbus 从设备可以想象为具有一个内部电子表格,其中填满了数字。Modbus 主设备将向从设备询问其在给定行和列中找到的数据值或数字,从设备将通过将该数据发送回主设备来响应。当然,这个过程可以逆转,Modbus 主设备告诉从设备在给定行和列处将什么数字放入其数据表中。

Modbus 设备“电子表格”中的“列”更正式地称为寄存器类型。寄存器类型可能是线圈、离散输入(又称状态输入)、输入寄存器或保持寄存器。

Modbus 设备“电子表格”中的“行”只是寄存器编号。通常,这些行从 1 开始并按顺序递增。某些设备可能没有寄存器 1,例如,它们的第一个寄存器可能是 100。如果从设备中不存在寄存器编号,它将发回一个异常消息。该异常提供了一个错误代码,提示“没有这样的寄存器”(异常代码 2,非法数据地址)。

什么是 Modbus TCP?

Modbus TCP 将 Modbus RTU 请求和响应数据包封装在通过标准以太网网络传输的 TCP 数据包中。单元号仍包含在内,其解释因应用程序而异 – 单元或从站地址不是 TCP 中的主要寻址方式。这里最重要的地址是 IP 地址,例如 192.168.1.100。Modbus TCP 的标准端口是 502,但如果需要,通常可以重新分配端口号。

TCP 数据包中省略了通常位于 RTU 数据包末尾的校验和字段。对于 Modbus TCP,校验和和错误处理由以太网处理。

Modbus 的 TCP 版本遵循 OSI 网络参考模型。Modbus TCP 定义了 OSI 模型中的表示层和应用层。

Modbus TCP 使主设备和从设备的定义不那么明显,因为以太网允许对等通信。客户端和服务器的定义在基于以太网的网络中更为人所知。在这种情况下,从设备成为服务器,主设备成为客户端。可以有多个客户端从服务器获取数据。在 Modbus 术语中,这意味着可以有多个主设备和多个从设备。现在,系统设计人员的责任是创建主设备和从设备功能之间的逻辑关联,而不是逐个物理设备地定义主设备和从设备。

什么是 Modbus ASCII?

Modbus ASCII 是一种较旧的实现,它包含 RTU 数据包的所有元素,但完全以可打印的 ASCII 字符表示。Modbus ASCII 被认为已弃用,很少再使用,并且未包含在正式的 Modbus 协议规范中。

Modbus 寄存器类型回顾

Modbus 设备中引用的寄存器类型包括:

  • 线圈(离散输出)
  • 离散输入(或状态输入)
  • 输入寄存器
  • 保持寄存器

特定设备是否包含所有这些寄存器类型取决于制造商。所有 I/O 都仅映射到保持寄存器的情况非常常见。线圈是 1 位寄存器,用于控制离散输出,可以读取或写入。离散输入是用作输入的 1 位寄存器,只能读取。输入寄存器是用于输入的 16 位寄存器,只能读取。保持寄存器是最通用的 16 位寄存器,可以读取或写入,可用于各种用途,包括输入、输出、配置数据或任何“保持”数据的要求。

当网关为主控或以直接模式(Babel Buster SP-GW)运行时,网关将支持所有寄存器类型。将非 Modbus 设备连接到 Modbus 网络的控制解决方案网关在某些情况下将仅使用保持寄存器来表示非 Modbus 设备数据。

大多数控制解决方案 I/O 设备都使用保持寄存器来表示所有类型的输入和输出。在大多数情况下,相同的 I/O 也可以像其他寄存器类型一样访问,并且 I/O 状态或值在多个寄存器中镜像。

Modbus 功能码

Modbus 协议定义了几个用于访问 Modbus 寄存器的功能代码。Modbus 定义了四个不同的数据块,每个数据块中的地址或寄存器编号重叠。因此,要完整定义在何处查找数据,需要地址(或寄存器编号)和功能代码(或寄存器类型)。

下表列出了 Modbus 设备最常识别的功能代码。这只是可用代码的一个子集 – 其中一些代码具有通常不适用的特殊应用。

功能码 寄存器类型
1 读取线圈
2 读取离散输入
3 读取保持寄存器
4 读取输入寄存器
5 写入单个线圈
6 写入单个保持寄存器
15 写入多个线圈
16 写入多个保持寄存器

Modbus 异常(错误)代码

当 Modbus 从站识别出数据包,但确定请求中存在错误时,它将返回异常代码回复,而不是数据回复。异常回复由从站地址或单元号、设置了高位的功能代码副本和异常代码组成。例如,如果功能代码为 3,则异常回复中的功能代码将为 0x83。异常代码将是以下之一:

异常码 说明 详细说明
1 非法的功能码 查询中收到的功能代码不被从站识别或不被从站允许。
2 非法的数据地址 查询中收到的数据地址(寄存器编号)不是从站允许的地址,即寄存器不存在。如果请求多个寄存器,则至少有一个寄存器不被允许。
3 非法的数据值 查询数据字段中包含的值对于从站来说是不可接受的。
4 从设备故障 从站尝试执行请求的操作时发生不可恢复的错误
6 从设备忙 从属设备正在处理一个长持续时间的命令。主设备应稍后重试。
10 网关路径不可用 与网关结合使用的专门用途,通常意味着网关配置错误或超载
11 网关目标设备无法响应 专门与网关结合使用,表示未从目标设备收到响应。

Modbus消息帧格式

Modbus ASCII 或 RTU 模式仅适用于标准的 Modbus 协议串行网络,它定义了在这些网络上连续传输的消息段的每一个字节,以及决定怎样将信息打包成消息域和如何解码等功能。

RTU消息帧格式

RTU模式通过二进制格式传输数据,具有高效、可靠的特点

ASCII消息帧格式

当控制器设为在Modbus 网络上以ASCII模式通信时,在消息中每个8位(bit)的字节都将作为两个ASCII字符发送。这种方式的主要优点是字符发送的时间间隔可达到1秒而不产生错误。

在ASCII模式下,消息以冒号(:)字符(ASCII码0x3A)开始,以回车换行符结束(ASCI码0x0D,0x0A)。消息帧的其他字段(域)可以使用的传输字符是十六进制的0··9,A··F。处于网络上的Modbus设备不断侦测“:”字符,当有一个冒号接收到时,每个设备进入解码阶段,并解码下一个字段(地址域)来判断是否是发给自己的。消息帧中的字符间发送的时间间隔最长不能超过1秒,否则接收的设备将认为发生传输错误。

地址域

所谓地址域,指的是Modbus 通信帧中的地址字段,其内容为从设备地址。Modbus消息帧的地址域包含2个字符(ASCII模式)或者1个字节(RTU模式)。

消息帧中可能的从设备地址是0~247(十进制),单个设备的实际地址范围是1~247。主设备通过将要联络的从设备的地址放入消息中的地址域来选通从设备。当从设备发送回应消息时,它把自己的地址放入回应的地址域中,以便主设备知道是哪一个设备做出回应。

地址0用作广播地址,以使所有的从设备都能认识。当Modbus协议用于更高级别的网络时,广播方式可能不被允许或以其他方式代替。

功能码域

功能码在Modbus协议中用于表示消息帧的功能。

功能码域由1个字节构成,因此其取值范围为1~255(十进制)。例如,常用的功能码有03、04、06、16等,其中03功能码的作用是读保持寄存器内容,04功能码的作用是读输入寄存器内容(输入寄存器和保持寄存器的区别可参考上一节的内容),06功能码的内容是预置单个保持寄存器,16功能码的内容则是预置多个保持寄存器。

从设备根据功能码执行对应的功能,执行完成后,正常情况下则在返回的响应消息帧中设置同样的功能码;如果出现异常,则在返回的消息帧中将功能码最高位(MSB)设置为1。据此,主设备可获知对应从设备的执行情况。

另外,对于主设备发送的功能码,则从设备根据具体配置来决定是否支持此功能码。如果不支持,则返回异常响应。

数据域

数据域与功能码紧密相关,存放功能码需要操作的具体数据。数据域以字节为单位,长度是可变的,对于有些功能码,数据域可以为空。

具体的功能码和数据域的构成及意义,可参考后续章节的内容,下面给出一个简单的例子。

RTU消息帧示例

以下是一个Modbus RTU请求消息帧的示例,假设主机请求从设备地址为1的设备读取保持寄存器(功能码03),起始地址为0,读取数量为2:

  • 设备地址:0x01
  • 功能码:0x03
  • 起始地址:0x0000(高字节0x00,低字节0x00)
  • 数量:0x0002(高字节0x00,低字节0x02)
  • CRC:假设计算得出的CRC为0xC40B

组成的RTU请求消息帧如下:

01 03 00 00 00 02 C4 0B

Modbus寄存器说明

Modbus协议中一个重要的概念是寄存器,所有的数据均存放于寄存器中。Modbus寄存器是指一块内存区域。Modbus寄存器根据存放的数据类型以及各自读写特性,将寄存器分为4个部分,这4个部分可以连续也可以不连续,由开发者决定。寄存器的意义如下表所示。

Modbus协议定义了设备间的数据传输方式,包括数据格式和通信规则。Modbus寄存器是协议中用于存储数据和状态信息的基本单元。

寄存器种类 说明 与PLC类比 举例说明
线圈状态(Coil Status) 输出端☐。可设定端☐的输出状态,也可以读取该位的输出状态。 DO(数字量输出) 电磁阀输出、MOSFET输 出、LED显示等
离散输入状态(Input Status) 输入端☐。 通过外部设定改变输入状态, 可读但不可写。 DI(数字量输入) 拨码开关、接近开关等
保持寄存器(Holding Register) 输出参数或保持参数,控制器运行时被设定的某些参数,可读可写 AO(模拟量输出) 模拟量输出设定值, PID 运行参数,变量阀输出大小,传感器报警上限、下限
输入寄存器(Input Register) 输入参数。 控制器运行时从外部设备获得的参数,可读但不可写 AI(模拟量输入) 模拟量输入

Modbus寄存器广泛应用于工业控制系统中,用于监控和控制各种设备和传感器。例如:

  • 读取传感器数据:温度、压力、湿度等传感器的数据可以存储在输入寄存器中,通过读取这些寄存器获取传感器数据。
  • 控制输出设备:通过写入线圈或保持寄存器,可以控制电机、阀门和其他执行设备的状态。

Modbus协议使用功能码来指定要执行的操作。常用的功能码包括(这些功能码将在后续章节详细介绍):

  • 01 (0x01):读线圈状态。
  • 02 (0x02):读离散输入状态。
  • 03 (0x03):读保持寄存器。
  • 04 (0x04):读输入寄存器。
  • 05 (0x05):写单个线圈。
  • 06 (0x06):写单个保持寄存器。
  • 15 (0x0F):写多个线圈。
  • 16 (0x10):写多个保持寄存器。

寄存器地址分配

Modbus寄存器的地址分配如下表所示:

寄存器种类 modbus地址 简称 读写状态
线圈状态 0x0000-0xFFFF 0x 可读可写
离散输入状态 0x0000-0xFFFF 1x 只读
保持寄存器 0x0000-0xFFFF 4x 可读可写
输入寄存器 0x0000-0xFFFF 3x 只读

Modbus开发环境搭建

为了搭建开发环境,我们需要准备三款软件:

如下图所示,为了便于理解和调试Modbus,首推两个工具软件 Modbus从站模拟器 和 Modbus主站模拟器 ,分别代表 Modbus 主站设备 和从站设备;为了在一台PC上通信和调试,另外需要安装虚拟串口软件 Visual Serial Port Driver(即VSPD),用于连接主站设备和从站。借助此3种软件的帮助,可以先在PC上做一些基础实验,直观地观察通信数据,这是个很好的入门方法。

1754964670-2191-2-1

以上软件仅用于学习和评估,安装测试完毕后请删除或者购买正版软件。

Virtual Serial Port Driver 是一款虚拟串口软件,允许用户去模拟多串口,支持所有的设置和信号线,仿佛操作真正的COM端口。通过操作虚拟串口对,写入到一个虚拟COM端口的数据可以从另外一个COM端口读取,可以通过此种方式实现在两个串口程序之间交换数据,如下图所示;而且可以随时创建多个虚拟端口对,所以不会有串行端口短缺的困扰,不需要额外的硬件挤占用户的办公桌。

1754964670-9543-2-2

虚拟串口软件使用

打开软件后,点击右侧的“Add pair”即可添加一对串口,只有主站和从站即可使用这一对串口进行通信。创建完成后,可以在左侧的Virtual ports看到这一对刚刚创建的窗口。之后就可以把软件关闭了。

1754964670-5843-2-3

Modbus从站模拟器使用

主要功能介绍

Modbus Slave Emulator 支持多种 Modbus 协议(RTU、ASCII、TCP/IP、UDP/IP、RUT Over TCP、RUT Over UDP);您可以同时创建多个连接,并将多个从站设备加入网络,快速搭建您的测试平台。

主要功能包括:

  • 支持多种Modbus协议,包括:
    • Modbus RTU
    • Modbus ASCII
    • Modbus TCP/IP
    • Modbus UDP/IP
    • Modbus RTU Over TCP/IP
    • Modbus RTU Over UDP/IP
  • 监视串行线路或以太网上的通信数据
  • 支持按照业务类型对寄存器进行分组管理
  • 您可以在“测试中心”编写并发送您自己的测试字符串,并以十六进制数字检查从站返回的结果。
  • 支持多达 28 种数据格式,包括:Signed、Unsigned、Hex、Binary、Long、Float、Double、String等
  • 支持 Modbus 协议地址和 PLC 地址相互切换
  • 对任意数量寄存器中的数据绘制实时图表,监控数据的变化趋势
  • 支持同时创建多个连接网络和大量主站设备
  • 通过多个标签页进行管理,快速在主站设备之间进行切换
  • 通过表格的形式管理寄存器,支持添加变量名和注释,支持切换背景与前景颜色
  • 导出/导入从站设备寄存器数据到Excel
  • 内置字节转换工具,方便将Long、Float、Double类型数据转换为寄存器中的数据
  • 内置数据校验工具,支持 CRC、LRC 校验
  • 对从站进行压力测试,以了解系统如何处理负载
  • 支持丰富的 Modbus 功能码:
    • 01 (0x01) 读取线圈
    • 02 (0x02) 读取离散输入
    • 03 (0x03) 读取保持寄存器
    • 04 (0x04) 读取输入寄存器
    • 05 (0x05) 写单个线圈
    • 06 (0x06) 写单个寄存器
    • 08 (0x08) 诊断(仅限串口)
    • 11 (0x0B) 获取通讯事件计数器(仅限串口)
    • 15 (0x0F) 写入多个线圈
    • 16 (0x10) 写入多个寄存器
    • 17 (0x11) 报告服务器 ID(仅限串口)
    • 22 (0x16) 掩码写入寄存器
    • 23 (0x17) 读/写多个寄存器
    • 43 / 14 (0x2B / 0x0E) 读取设备标识

使用方法

打开软件后,点击上方的“新建连接”,在新建连接窗口中,连接模式选择“Serial Port”,并选择刚刚创建的虚拟串口COM1,然后点击确定。 1754964670-1229-2-4

每次新建连接,它会为我们自动创建一个从站,并配置一些寄存器。默认创建10个保持寄存器,并分到名为“RegisterGroup1”的寄存器组里。双击该寄存器组,我们就能看到这10个寄存器了。在这里我们可以为每个寄存器命名,每个寄存器相当于一个变量,我们可以为它自定义变量名。比如第一个寄存器代表电压值,第二个寄存器代表电流值。最后,我们选中连接并点击上方的“打开连接”按钮,现在从站处于启动状态,可以接收主站的命令了。

1754964670-1996-2-5

我们编辑前两个寄存器,给它们赋值12和3。一会主站即可读取到这两个值。

Modbus主站模拟器使用

主要功能介绍

和从站类似;Modbus Master Emulator 支持多种 Modbus 协议(RTU、ASCII、TCP/IP、UDP/IP、RUT Over TCP、RUT Over UDP);您可以同时创建多个连接,监控多个Modbus从站寄存器,快速调试您的从站设备。

使用方法

与从站类似,这次还是点击“新建连接”按钮,端口号那里选择“COM2”。然后点击确定,即可创建一个新的连接。

1754964670-3039-2-6

每次新建连接,它会为我们自动创建一个从站,并配置一些寄存器。默认创建10个保持寄存器,并分到名为“RegisterGroup1”的寄存器组里。双击该寄存器组,我们就能看到这10个寄存器了。点击上方的“打开连接”按钮,即可开始与从站进行通信,软件默认定期读取从站的所有寄存器。这里我们可以看到刚刚在从站那里配置的10个寄存器的值。

1754964673-1039-2-7

软件其他功能这这一章里就不一一介绍了,将放到后续章节讲解mdobus功能码时结合报文进行介绍。

Modbus协议背景介绍

Modbus 是一种用于工业自动化控制系统的通信协议,由 Modicon(现为施耐德电气的一部分)在 1979 年开发。它是一种主从架构的协议,广泛应用于连接电子设备以实现数据交换。以下是 Modbus 协议的背景和主要特点:

  • 起源与发展:Modbus 最初由 Modicon 为其可编程逻辑控制器 (PLC) 开发,目的是实现不同设备之间的互操作性。随着时间的推移,Modbus 成为工业领域中最广泛使用的通信协议之一。
  • 开放标准:Modbus 是一个开放的协议,任何人都可以免费使用和实现。这使得它在工业自动化领域中得到了广泛的接受和应用。
  • 多种变体:随着技术的发展,Modbus 也演变出了多个版本和变体,适应不同的通信需求和物理介质。

主要特点

  • 主从架构:Modbus 采用主从(Master/Slave)架构。一个主设备可以与多个从设备通信,从设备之间不直接通信。主设备发出命令,从设备响应。
  • 简单易用:Modbus 协议相对简单,易于实现和理解,适用于资源有限的嵌入式系统。
  • 多种传输方式
    • Modbus RTU:基于串行通信的 Modbus 变体,通常使用 RS-232 或 RS-485 作为物理层。数据以二进制形式传输,具有较高的效率和较低的通信开销。
    • Modbus ASCII:另一种基于串行通信的变体,数据以 ASCII 字符形式传输,便于调试,但效率较低。
    • Modbus TCP/IP:基于以太网的 Modbus 变体,通过 TCP/IP 协议进行传输,适用于现代网络环境。
  • 数据模型:Modbus 定义了一种简单的数据模型,包含四种数据类型:
    • 离散输入:单个位,只读。
    • 线圈:单个位,读/写。
    • 输入寄存器:16 位寄存器,只读。
    • 保持寄存器:16 位寄存器,读/写。

应用领域

  • 工业自动化:如 PLC、SCADA 系统、传感器和执行器之间的通信。
  • 能源管理:如电表和能源管理系统的通信。
  • 楼宇自动化:如暖通空调 (HVAC) 系统、照明和安防系统的控制。

Modbus 因其开放性、简洁性和灵活性,成为工业控制和自动化领域中一种标准的通信协议。随着物联网 (IoT) 的发展,Modbus 也被广泛应用于各类智能设备和系统的互联。

Modbus协议版本

Modbus可用于串行链路或者TCP/IP以太网。

对于Modbus串行链路连接,存在两个变种,它们在协议细节上略有不同,主要区别是传输数据的字节表示上的不同。这两个变种包括RTU模式和ASCII模式。ModbusRTU模式是一种紧凑的,采用二进制表示数据的方式;而ModbusASCII模式是一种人类可读的、冗长的表示方式。这两个变种都使用串行链路通信(Serial Communication)方式,为了确保数据传输的完整性和准确性,RTU模式 下消息格式命令和数据带有循环冗余校验的校验和,而ASCII模式下消息格式采用纵向冗余校验的校验和,而且被配置为RTU模式的节点不能与配置为ASCII模式的节点通信,反之亦然。

对于通过TCP/IP(例如以太网)物理层的连接,存在多个Modbus/TCP变种,这种方式不需要校验和的计算。

Modbus通信流程概述

Modbus是一个请求/应答协议,并且提供统一的功能码用于数据传输服务。Modbus功能码是 Modbus 请求/应答 PDU(即 PROTOCOL DATA UNIT,协议 数据单元)的元素之一,所谓的PDU是Modbus协议定义的一个与基础通信层无关的简单协议数据单元。而在特定总线或网络上,Modbus协议则通过ADU(即APPLICATION DATA UNIT,应用数据单元)引入一些附加域,以实现完整而准确的数据传输。

为了寻求一种简洁的通信格式,Modbus 协议定义了PDU模型,即功能码+数据的格式;而为了适应多种传输模式,在PDU的基础上增加了必要的前缀(如地址域)和后缀(如差错校验),形成了ADU模型。

ADU与PDU之间的关系如下图所示。

1754964579-5426-1-1

主机设备(或客户端)创建Modbus应用数据单元形成查询报文,其中功能码标识了向从机设备(或服务器端)指示将执行哪种操作。功能码占用一个字节,有效的码字范围是十进制1~255(其中128~255为异常响应保留)。查询报文创建完毕,主机设备(或客户端)向从机设备(或服务器端)发送报文,从机设备(或服务器端)接收报文后,根据功能码做出相应的动作,并将响应报文返回给主机设备(或客户端),如下图所示。

1754964579-2803-1-2

如果在一个正确接收的Modbus ADU中,不出现与请求 Modbus功能有关的 差错,那么从机设备(或服务器端)将返回正常的响应报文。如果出现与请求Modbus功能有关的差错,那么响应报文的功能码域将包括一个异常码,主机设备(或客户端)能够根据异常码确定下一个执行的操作。

如下图所示,对于异常响应,从机设备(或服务器端)将返回一个与原始功能码等同的码值,但设置该原始功能码的最高有效位为逻辑1,用于通知主机设备(或客户端)。

1754964579-9135-1-3

 

1234118
 
Copyright © 2008-2021 lanxinbase.com Rights Reserved. | 粤ICP备14086738号-3 |