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

 

Modbus协议初次了解

Modbus是一种广泛应用于工业自动化和控制系统中的通信协议,由Modicon(现属于施耐德电气)于1979年开发。它主要用于PLC(可编程逻辑控制器)之间,以及PLC与其他设备(如传感器、执行器、HMI、SCADA系统)之间的通信。Modbus由于其简单性和可靠性,成为工业领域最常用的协议之一。

Modbus的工作原理

Modbus遵循主从架构(Master-Slave Architecture),在通信网络中,通常有一个主设备(Master)和一个或多个从设备(Slave)。主设备负责发出请求,从设备接收并响应请求。

Modbus协议有多个版本,主要包括:

  1. Modbus RTU(Remote Terminal Unit):基于串行通信(如RS-232、RS-485)的协议。数据以二进制格式发送,传输效率高,通常用于串行链路。
  2. Modbus ASCII:与Modbus RTU类似,但数据以ASCII码格式发送,传输速率较低,但易于调试。
  3. Modbus TCP/IP:基于以太网的版本,采用TCP/IP协议栈来传输Modbus数据包,适用于局域网或广域网环境。它允许更灵活的网络拓扑,并支持更多设备接入。

通信帧结构

Modbus通信的基本单位是“帧”,一帧包括以下几个部分:

  • 地址域:用于标识目标设备的地址。
  • 功能码(Function Code):定义要执行的操作,如读取寄存器、写入数据等。
  • 数据域:根据功能码携带相应的数据(如寄存器地址、寄存器值等)。
  • 校验码:用于确保数据传输的完整性(在Modbus RTU和ASCII中使用)。

常用功能码

  • 01:读取线圈状态
  • 02:读取离散输入
  • 03:读取保持寄存器
  • 04:读取输入寄存器
  • 05:写单个线圈
  • 06:写单个寄存器
  • 15:写多个线圈
  • 16:写多个寄存器

Modbus的应用场景

Modbus协议广泛应用于工业控制系统中,尤其是在以下场景中:

  • 设备间数据采集和监控(如PLC与传感器、HMI的连接)。
  • 过程自动化中的数据传输。
  • 远程监控和控制系统(如SCADA系统)。

Modbus的开放性和简单性,使其成为工业物联网(IIoT)中广泛使用的协议之一。

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