简介

Modbus 是一种串行通信协议,广泛应用于工业自动化领域,用于在不同设备之间进行数据交换和控制

  1. 主从架构:Modbus 采用主从通信模式,其中一个设备作为主设备,其他设备作为从设备,最多支持247个从机设备。主设备可以向从设备发送请求,从设备则响应请求并返回数据。
  2. 数据类型:Modbus 支持多种数据类型,包括位(布尔值)、整数、浮点数等。
  3. 功能码:Modbus 定义了一系列功能码,用于实现不同的操作,如读取输入/输出状态、读取寄存器数据、写入寄存器数据等。
  4. 传输介质:Modbus 可以通过串口(如 RS-232、RS-485)或以太网进行通信。
  5. 简单易用:Modbus 协议相对简单,易于实现和集成到各种工业设备中。

硬件层协议:解决0和1的可靠传输,常有RS232、RS485、CAN、IIC、SPI …
软件层协议:解决传输目的,常有Modbus、TCP/IP、CANopen …

Modebus-通信过程

注意Modbus是一主多从的通信协议

Modbus通信中只有一个设备可以发送请求。其他从设备接收主机发送的数据来进行响应,从机是任何外围设备,如I/O传感器,阀门,网络驱动器,或其他测量类型的设备。从站处理信息和使用Modbus将其数据发送给主站。

也就是说,不能Modbus同步进行通信,主机在同一时间内只能向一个从机发送请求,总线上每次只有一个数据进行传输,即主机发送,从机应答,主机不发送,总线上就没有数据通信。

从机不会自己发送消息给主站,只能回复从主机发送的消息请求。
image.png

Modbus-协议类型

  • 串行端口存在多个版本的Modbus协议,而最常见的是下面四种:

    • Modbus-Rtu
      • 使用二进制格式进行数据传输,通讯效率高。
    • Modbus-Ascii
      • 使用ASCII码进行数据传输,可读性好,但通讯效率低。
    • Modbus-Tcp
      • 基于以太网的一种通讯方式,它将Modbus协议封装在TCP/IP协议栈中,通过以太网传输数据。具有高速、稳定的特点。
    • ModbusPlus
  • Modbus RTU是一种紧凑的,十六进制表示数据的方式,RTU格式后续的命令/数据带有循环冗余校验的校验和

  • Modbus ASCII是一种采用Ascii码表示数据,并且每个8Bit 字节都作为两个ASCII字符发送的表示方式,ASCII格式采用纵向冗余校验的校验和。

Modbus-数据类型

  • 基础术语

    • 位:bit,是计算机中最小的信息单位。它有两种状态:0或1,对应了计算机中的二进制逻辑。比特是数据的最小组成单位,通过多个比特的组合可以表示更复杂的数据。

    • 字节:Byte,是计算机中最小的数据存储单位。通常1字节等于8个位。

    • 字:Word,是计算机系统处理数据的基本单位,它包含多个字节。字的长度取决于计算机架构:

      • 16位系统中1个字为16位(2字节)
      • 32位系统中1个字为32位(4字节)
      • 64位系统中1个字为64位(8字节)。
  • Modbus RTU数据类型

    • 存储的数据类型
      • 布尔量
        布尔量比如IO口的电平高低,灯的开关状态等。
      • 16位寄存器
        16位bit寄存器。比如 传感器的温度数据,存储的密码等。

    在Modbus RTU通信中,数据类型ABCD、BADC、CDAB、DCBA代表的是多字节数据的不同字节顺序,这些字节顺序通常用于32位或64位有符号整数、无符号整数以及浮点数的存储和传输。这些字节顺序的区分主要基于大端(Big-endian)和小端(Little-endian)的概念,并在此基础上进行了扩展。
    image.png

    • ABCD(大端模式)
      在大端模式下,高位字节存储在低位地址,低位字节存储在高位地址。
      例:存放二进制数:1011-0100-1111-0110-1000-1100-0001-0101
      image.png

    • DCBA(小端模式)
      在大端模式下,高位字节存储在高位地址,低位字节存储在低位地址。
      例:存放二进制数:1011-0100-1111-0110-1000-1100-0001-0101
      image.png

    • BADC(大端模式字节交换)
      BADC是在大端模式的基础上,对寄存器内的字节的单元进行了字节交换。也就是说,原本相邻的高位和低位字节单元的位置互换了。

    • CDAB(小端模式字节交换)
      BADC是在小端模式的基础上,对寄存器内的字节的单元进行了字节交换。也就是说,原本寄存器内相邻的高位和低位字节单元的位置互换了。

Modbus-功能码

  • 寄存器分类
存储区名称 区号 写入权限 内容形式 地址范围
线圈寄存器 01H、05H、0FH 读写 位(0 或 1) 00001-09999
离散输入寄存器 02H 只读 位(0 或 1) 10001-19999
保持寄存器 03H、06H、10H 读写 字(16 位整数) 40001-49999
输入寄存器 04H 只读 字(16 位整数) 30001-39999
  • 功能码
功能码 描述 PLC地址 寄存器地址 位/字操作 操作数量
01H 读线圈寄存器 00001-09999 0000H-FFFFH 位操作 单个或多个
02H 读离散输入寄存器 10001-19999 0000H-FFFFH 位操作 单个或多个
03H 读保持寄存器 40001-49999 0000H-FFFFH 字操作 单个或多个
04H 读输入寄存器 30001-39999 0000H-FFFFH 字操作 单个或多个
05H 写单个线圈寄存器 00001-09999 0000H-FFFFH 位操作 单个
06H 写单个保持寄存器 40001-49999 0000H-FFFFH 字操作 单个
0FH 写多个线圈寄存器 00001-09999 0000H-FFFFH 位操作 多个
10H 写多个保持寄存器 40001-49999 0000H-FFFFH 字操作 多个

Modbus数据模型规定了具体的地址范围,每一个从机,都有实际的物理存储,跟modbus的存储区相对应,主机读写从机的存储区,实际上就是对从机设备对应的实际存储空间进行读写。

  1. 客户端发送请求:客户端(如主站)向 Modbus 从站发送请求,请求中包含要读取或写入的数据地址和数据类型等信息。
  2. 从站处理请求:从站接收到请求后,根据请求中的地址和数据类型,在其内部的数据存储区中查找相应的数据。
  3. 从站返回响应:从站将找到的数据或执行结果返回给客户端,响应中包含数据值或错误代码等信息。
  4. 客户端处理响应:客户端接收到响应后,根据响应中的数据或错误代码进行相应的处理。

image.png

在 Modbus 数据模型中,数据的读写操作是基于寄存器的。客户端可以通过读取保持寄存器或输入寄存器中的数据来获取从站的状态或测量值,也可以通过写入保持寄存器中的数据来控制从站的行为。

Modbus-数据帧结构

  • Modbus报文帧结构
    一个报文就是一帧数据,一个数据帧就一个报文: 指的是一串完整的指令数据,本质就是一串数据。

  • Modbus报文是指主机发送给从机的一帧数据,其中包含着从机的地址,主机想执行的操作,校验码等内容

  • Modbus-RTU协议在串行链路上的报文格式如下所示:
    image.png

  • 地址:从站设备地址,1 字节,取值范围 0-247。

  • 功能码:表示操作类型,1 字节,常见的功能码有 01(读线圈状态)、02(读离散输入状态)、03(读保持寄存器)、04(读输入寄存器)、05(写单个线圈)、06(写单个保持寄存器)、15(写多个线圈)、16(写多个保持寄存器)等。

  • 数据:根据功能码的不同,数据的格式和长度也不同。例如,读线圈状态时,数据为 0 或 1;读保持寄存器时,数据为 2 字节的寄存器值;写单个线圈时,数据为 0 或 1;写单个保持寄存器时,数据为 2 字节的寄存器值。

  • 校验:采用 CRC16 校验,2 字节,用于检测报文的正确性。

Modbus-RTU报文结构

  • 01H 读线圈寄存器
    image.png
    示例指令:

    主站请求:01 01 00 00 00 0A BC 0D

    含义:从机设备地址(01)+ 功能码(01)+ 起始寄存器完整地址(00 00)+ 线圈数量(00 0A)+ CRC16校验码(BC 0D)
    解释:从地址为1的从机读取寄存器开始地址为1,连续读10个线圈。

    从站应答:01 01 02 FF 03 B8 0D

    含义:从机设备地址(01)+ 功能码(01)+ 数据字节数(02) + 读取到的数据内容(FF 03)+ CRC16校验码(B8 0D)
    解释:从地址为1的从机中读取到两个字节的数据,读出的内容是FF 03。

  • 04 读输入寄存器
    image.png
    示例指令:

    主站请求:01 04 00 00 00 02 71 CB

    含义:从机设备地址(01)+ 功能码(04)+ 起始地址(00 00 )+ 读取数量(00 02)+ CRC16校验码(71 CB)
    解释:从设备地址为1的起始地址为0中读取两个输入寄存器的值。

    从站应答:01 04 04 00 01 00 01 6B 84

    含义:从机设备地址(01)+ 功能码(04)+ 所占字节(04)+ 读出来的两个寄存器的值(00 01 00 01)+ CRC16校验码(6B 84)
    解释:从设备地址为1中成功读取4个字节,第一个寄存器的值是(00 01),第二个寄存器的值是(00 01)。

  • 03 读保持寄存器
    image.png

    示例指令:
    主站请求:01 03 00 00 00 03 05 CB

    含义:从机设备地址(01)+ 功能码(03)+ 起始地址(00 00 )+ 读取数量(00 03)+ CRC16校验码(05 CB )
    解释: 从从机设备地址为1,起始地址为0中读取3个寄存器。

    从站应答:01 03 06 00 1E 22 22 33 33 77 E0

    含义:从机设备地址(01)+ 功能码(03)+ 所占字节数(06) + 读取的数据( 00 1E 22 22 33 33)+ CRC16校验码(77 E0 )
    解释:成功读取到的数据是( 00 1E 22 22 33 33)