云计算百科
云计算领域专业知识百科平台

通讯协议(三)——Modbus(应用层通讯协议)

目录

一、Modbus协议简介

二、Modbus协议详解

1、Modbus RTU

(1)存储区及其地址介绍

(2)功能码及其作用

(3)报文格式

(4)相对地址与绝对地址

2、Modbus ASCII

3、Modbus TCP/IP

(1)Modbus TCP/IP与RTU区别

(2)Modbus TCP/IP报文格式

报文结构详解

三、如何选择协议

ModbusPoll安装包


Modbus协议中文版: https://pan.baidu.com/s/1oxqQy9n8tVG-Go1asIHqhg 提取码: 8cyb

Modbus协议:https://pan.baidu.com/s/1MF1oIgo_b8XZoZseo-CkPA 提取码: bwe8

ModbusPoll是调试Modbus通讯最常用的软件,其使用方法以后会给出,其实读懂本文对Modbus协议的解析之后,此软件便会用了,若使用有问题,欢迎留言询问,软件安装包已在文末给出。

一、Modbus协议简介

        Modbus通讯协议是工业自动化领域应用最广泛的通信协议之一,由美国Modicon公司(现属施耐德电气)于1979年为其PLC产品设计。最初目的是为工业设备提供一种简单、通用的通信方式,以实现控制器与现场设备之间的数据交换。

        核心架构是主从模式,即一主多从,在同一时间总线上只能 有一个主设备,但可以有一个或者多个(最多 247 个)从设备。这与之前介绍的几种协议有所区别。主要变种:Modbus RTU, Modbus ASCII, Modbus TCP/IP。 主要常见RS-485, RS-232,也可基于以太网(Modbus TCP)。最大的特点是标准、开放、简单,可免费使用,帧格式紧凑易懂。

Modbus RTU、Modbus ASCII和Modbus TCP/IP

特性 Modbus RTU Modbus ASCII Modbus TCP/IP
运行环境 串行通信(如RS-485, RS-232) 串行通信(如RS-485, RS-232) 以太网(TCP/IP网络)
数据编码

​二进制

ASCII字符 二进制
校验方式 CRC(循环冗余校验) LRC(纵向冗余校验) 由TCP/IP协议栈确保数据完整性
特点 效率高、紧凑,最常用的串行模式 可读性强、易于调试,但效率较低 传输速度快,可利用现有以太网设施
典型应用 PLC、传感器、变频器等工业设备现场通信 需人工读取调试的慢速数据交换场景 车间级监控、SCADA系统、设备联网

二、Modbus协议详解

1、Modbus RTU

        Modbus RTU:这是工业现场总线中最主流的形式。它采用二进制编码,数据帧非常紧凑,传输效率高。每个数据帧都以一段沉默间隔开始和结束,并通过CRC校验来保证数据的准确性,非常适应工业环境下的抗干扰需求。

(1)存储区及其地址介绍

        Modbus RTU协议将设备的数据组织在四个核心存储区中,每个区有特定的功能和地址范围。下面这个表格汇总了它们的核心特性:

存储区名称 读写特性 数据类型 功能码举例 5位标准地址范围 6位扩展地址范围
线圈寄存器 (Coils) 读/写 位 (1 bit) 0x01 (读), 0x05 (写单个), 0x0F (写多个) 00001 – 09999 000001 – 065536
离散输入寄存器 (Discrete Inputs) 只读 位 (1 bit) 0x02 (读) 10001 – 19999 100001 – 165536
保持寄存器 (Holding Registers) 读/写

字 (16 bits)

0x03 (读), 0x06 (写单个), 0x10 (写多个) 40001 – 49999

400001 – 465536

输入寄存器 (Input Registers) 只读

字 (16 bits)

0x04 (读) 30001 – 39999 300001 – 365536

   存储区详解与使用要点

线圈寄存器 (0区):通常用来控制开关量设备,比如继电器的通断、指示灯的亮灭。每个线圈的状态就是一个布尔值(0或1)。

离散输入寄存器 (1区):用于表示只能读取的开关量状态,例如按钮是否被按下、限位开关是否触发等。

保持寄存器 (4区):最常见的用于存储数据的区域,可读可写。常用来存放设备参数(如设定温度、速度)、计数器值等。每个寄存器可以存储一个16位的整数,或多个寄存器组合存储浮点数等复杂数据。

输入寄存器 (3区):用于存储从外部采集的、只读的数据,例如温度传感器的读数、电压电流值等。

地址编号规则

Modbus设备通常支持两种地址编号方式:5位标准地址和6位扩展地址。

5位标准地址:这是最传统的格式,地址范围如上表所示。地址的第一位数字(前缀)用于区分不同的存储区。

6位扩展地址:为了支持更大的数据容量,许多现代设备采用了6位地址格式,将每个存储区的寻址范围扩展到了最多65536个单元。

绝对地址与 相对地址

理解这两种地址的区别对正确进行通信至关重要:

绝对地址:这是在设备手册、组态软件或HMI界面上看到的地址编号,例如40001。它是一个便于人类识别的“标签”。

相对地址:这是在实际通信报文中使用的地址。它是从每个存储区的起始位置开始计算的偏移量。例如,绝对地址40001对应的相对地址是0000;绝对地址40002对应的相对地址是0001,以此类推。

当你在编程或配置主站设备(如PLC、SCADA系统)时,需要根据设备的说明书,将手册中给出的绝对地址转换为相应的相对地址填入通信指令中。

(2)功能码及其作用

Modbus协议主要通过功能码(Function Code)​ 来约定不同设备的行为。下表列举了一些最常用的功能码:

功能码(十六进制) 名称 作用
01H 读线圈状态 读取一组开关量输出(DO)的状态(ON/OFF)
02H 读输入状态 读取一组开关量输入(DI)的状态(ON/OFF)
03H 读保持寄存器 非常常用。读取从设备保持寄存器(如PLC的数据块)中的内容
04H 读输入寄存器 读取从设备输入寄存器中的内容(如模拟量输入值)
05H 写单个线圈 强制一个线圈为ON或OFF(实现单个开关控制)
06H 写单个寄存器 向一个保持寄存器写入预设值(如修改一个设定参数)
0FH 写多个线圈 向多个连续的线圈写入数据
10H 写多个寄存器 非常常用。向多个连续的保持寄存器写入数据(如批量下发改定值)

(3)报文格式

Modbus 协议 RTU 报文格式如下所示:

组成部分 长度 (字节) 描述与要点
设备地址 1 标识总线上的从站设备,范围通常为 1-247。地址0为广播地址。
功能码 1 定义请求的操作类型,如 0x03为读保持寄存器,0x10为写多个寄存器。
数据域 N 变长字段,内容取决于功能码。例如,读寄存器请求中包含起始地址和数量;响应中则包含读取到的数据。
CRC校验 2 循环冗余校验码,用于检测传输错误。采用CRC-16算法,多项式为 0xA001。传输时低字节在前。

分析一段监控到的报文来加深理解:

(主)发送:01 03 00 00 00 02 C4 0B

 01 从站地址;03 读输出寄存器;00 00 起始寄存器;00 02 寄存器长度;C4 0B CRC校验。

(主)接收:01 03 04 01 46 01 3B 5A 59

01 从站地址;03 读输出寄存器;04 字节计数;01 46 01 3B 具体4个字节;5A 59 CRC校验。

(4)相对地址与绝对地址

理解Modbus协议中的相对地址与绝对地址,是确保通信成功的关键。

特性 绝对地址 (Absolute Address) 相对地址 (Relative Address)
定义 包含存储区代号的完整地址,是给人看的“门牌号” 不包含存储区代号,仅表示在某个存储区内的偏移量,是协议实际传输的“房间号”
表现形式 通常为5位或6位数字,如 40001, 300001 从0开始的整数,如 0, 9, 99

功能码依赖​

独立,通过地址本身即可确定存储区 高度依赖,必须结合功能码才能确定操作哪个存储区
主要应用场景 设备手册、工程师沟通、软件配置界面 Modbus协议数据帧内部
示例 手册注明“温度值在40010地址” 功能码03的报文中,地址字段填写 0009(十六进制)来读取40010地址的数据

2、Modbus ASCII

Modbus ASCII:这种模式使用可打印的ASCII字符来编码数据。虽然传输效率较低,但优点是发送的数据可以直接被终端软件显示或人工解读,非常便于调试和诊断。它使用LRC进行校验。消息以冒号(:)开始,以回车换行符(CR, LF)结束。

报文格式与Modbus RTU一样:设备地址+功能码+数据域+CRC校验。

可读的文本格式:这是最本质的区别。Modbus ASCII 将每个数据字节(如 0x4F)用两个对应的ASCII字符(即 '4'和 'F')来表示。因此,用普通的串口调试助手捕获到的报文是像 :010300000001FB\\r\\n这样的可读字符串,非常便于人工阅读和调试。

宽松的时序要求:由于有明确的开始和结束标志,Modbus ASCII 对帧内字符之间的传输间隔要求很宽松(最长可达1秒),这使其在通信质量不佳或波特率不稳定的低速场景中更具适应性。

效率与适用场景:文本编码的代价是传输效率较低。同样一条指令,Modbus ASCII 帧的长度约为 RTU 帧的两倍。因此,它通常用于数据量小、速率低、或需要频繁人工介入调试的场合,例如连接一些老旧的工业设备或实验室仪器。而对于高速、大数据量的工业现场通信,Modbus RTU 是绝对的主流选择。

简单来说,您可以将 Modbus ASCII 理解为 RTU 的“文本版”,牺牲了效率,换来了更高的可读性和对通信条件的容忍度。总体来说与RTU差别不大。

3、Modbus TCP/IP

(1)Modbus TCP/IP与RTU区别

Modbus TCP/IP通过IP地址区分从机;TCP/IP数据包中已存在校验。

(2)Modbus TCP/IP报文格式

Modbus TCP/IP:这是Modbus协议运行在以太网上的版本。为了适应TCP/IP协议栈,它在标准的Modbus协议数据单元(PDU)前增加了一个MBAP报文头。这个报文头包含了事务标识符、协议标识符、长度和单元标识符等信息,用于在网络环境中管理通信会话。由于底层TCP协议已经提供了可靠的连接,因此不再需要CRC或LRC校验。它默认使用502端口。

Modbus TCP/IP的报文格式如下:

报文结构详解

整个报文可以理解为在标准的 Modbus 指令外面,套上了一个适应网络环境的“信封”。

1)MBAP 报文头(Modbus Application Protocol Header)

这是 Modbus TCP/IP 特有的部分,共 7 个字节,用于网络通信的管理。您可以将其理解为一个“快递面单”。

  • 事务处理标识符(2 字节):这是由客户端(主站)生成的唯一编号,用于匹配请求和响应。服务器(从站)在返回响应时必须原样返回此标识符。这解决了在网络中可能同时存在多个未完成请求时,如何正确配对的问题。

  • 协议标识符(2 字节):用于标识这是 Modbus 协议。固定为 0,其他值通常被视为非法。

  • 长度字段(2 字节):指示其后所有字节的数量。具体来说,是从下一个字节(即单元标识符)开始,到整个 PDU 结束的字节数。例如,一个典型的读寄存器请求(单元标识符1 + 功能码1 + 地址2 + 数量2 = 6字节),此字段值就是6。

  • 单元标识符(1 字节):这个字段的作用类似于 Modbus RTU 中的从站地址,但它是在TCP/IP网络内部使用的。当一个TCP连接(例如,通过网关)后端连接了多个串行设备时,此字段用于指定最终要访问的从站设备。如果只有一个设备,通常设为 1 或 255。

2) PDU 报文(协议数据单元)

这部分是标准的 Modbus 协议内容,与您在 RTU 或 ASCII 模式中看到的核心部分完全相同。它包含了具体的操作指令。

  • 功能码(1 字节):定义要执行的操作,例如 0x03是读保持寄存器,0x10是写多个寄存器。这与 Modbus RTU 中的功能码完全一致。

  • 数据区(N 字节):功能码所带的参数。例如,读请求 (0x03) 的数据区包含“起始地址”和“寄存器数量”;响应 (0x03) 的数据区则包含“字节数”和“寄存器的值”。

三、如何选择协议

在选择合适的Modbus协议时,可以遵循一个简单的原则:根据通信介质和速度需求来决策。

需要高速、远距离通信,或集成到现有企业网络:​ 优先选择 Modbus TCP/IP。它适合车间级的数据采集和监控系统(SCADA)。

在设备现场进行布线,追求高可靠性和实时性:​ 选择 Modbus RTU。它是工业控制柜内设备通信的绝对主力。

通信速率要求不高,但需要频繁查看数据内容进行调试:​ 可以考虑 Modbus ASCII。它在调试或需要高可读性的慢速场景中有其价值。

ModbusPoll安装包

https://pan.baidu.com/s/18-c1qmXULNfa7JxVXGk8Xw 提取码: c446

赞(0)
未经允许不得转载:网硕互联帮助中心 » 通讯协议(三)——Modbus(应用层通讯协议)
分享到: 更多 (0)

评论 抢沙发

评论前必须登录!