【通信协议】Modbus通信协议
摘要:
Modbus是一种广泛应用于工业领域的串行通信协议,由施耐德电气于1979年提出。它解决了传统串口通信(如RS232)在复杂工业环境中的局限性,并成为工业设备间连接的标准协议。Modbus支持多种通信方式(如RS485、UART等),并提供应用层协议(如Modbus-RTU)以实现设备间的通用数据交换。其中,Modbus-RTU通过帧结构实现高效通信,而Modbus-ASCII和Modbus-TCP则分别适用于不同场景(如效率较低的ASCII编码和基于TCP/IP的应用)。这些协议统一了设备间的通信格式和数据结构,使不同厂商的产品能够兼容连接到同一网络中进行集中监控与管理。
目录
一、Modbus概述
二、Modbus用来干什么?
三、Modbus的内容是什么?
3.1 Modbus通讯过程
3.2 Modbus-RTU
3.3 Modbus- ASCII
3.4 Modbus-TCP
一、Modbus概述
Modbus是一种专为串行传输设计的数据传输协议,在1979年施耐德电气(Schneider Electric)之前由Modicon公司(现Schneider Electric旗下SCADA Systems Inc.)推出。该协议已被公认为工业自动化领域的基础协议,并在工业设备间建立了广泛的应用连接方案。
二、Modbus用来干什么?
在工业控制、电力通讯及智能仪表等相关领域中,在常规情况下数据交换多采用串口通信方式。早期主要采用的是RS232接口,在工业现场环境较为复杂的情况下,各种电气设备往往会在周围产生较多的电磁干扰现象,并导致信号传输出现错误问题。此外,在这种通信接口下实现的仅限于点对点的数据传输功能无法满足网络化需求,并且其最大传输距离仅为数十米左右的技术限制也不适应大规模远距离通信的实际需求。而针对这些问题,在此基础之上发展出了RS485接口技术方案,在这种新型接口下数据信号采用了差分传输方式从而能够有效抑制共模干扰的影响并显著提升了最大可传输距离达到数百米甚至上千米的能力同时实现了多设备共享同一总线上的连接功能
UART、I2C和SPI这些典型的底层通信协议各自基于'位'级别进行操作,在工业领域中这类技术已逐渐成为主流。然而由于多种设备间的兼容性问题导致无法直接连接至同一总线系统随着这一关键问题愈发突出起来专家们开始寻求更为合理的解决方案最终催生了一些标准化接口这些规范不仅提升了系统的互操作性还为后续的技术开发奠定了基础其中一类新的标准化接口属于'字节级别'范畴这类协议通常被归类于应用层通信方案目前国际上较为认可的标准之一即Modbus协议于1979年由Modicon公司正式推出标志着首个适用于工业现场总线系统的现代通信规范诞生
Modbus协议是一种在工业设备间通用的数据传输协议。借助该协议体系,设备间的通信实现了互联互通。该协议被广泛认定为工业自动化领域的重要通信标准之一,并且成为众多厂商实现设备互联的基础架构。基于这一规范性体系,在不同网络架构下(如以太网等),控制设备均能实现统一管理与监控功能。该框架阐述了一套完整的通信流程机制,并规定了标准化的数据格式与传输规范。在此框架下,在线请求、远程响应以及错误记录检测等核心功能均得到了明确定义与操作指导。
三、Modbus的内容是什么?
大致分为以下几种:
- Modbus-RTU
- Modbus-ASCII
- Modbus-TCP
下面介绍的三种协议中,每个设备仅支持一种通信协议。如果您的设备采用了Modbus-RTU,则可以直接参考相关部分。通常情况下,默认情况下或大多数情况下,默认选择Modbus-RTU作为默认通信协议。
3.1Modbus通讯过程
采用主从型通信机制的Modbus系统,在设计上存在一定的局限性:具体来说,在同一通讯线路(总线)上无法实现同时进行的数据传输操作。每次只能传递单个数据单位,在这种情况下即使当主机向系统发送指令时(设备会接收响应信号),当主机停止发送操作指令时(通讯线路将暂时断开),则此时通讯线路将暂时断开。这一特点也构成了一定的局限性
一条总线上布置了一个主机和多个From-Hosts。当该Hostname连接至任一From-Host时,在配置完成后(为了识别这些From-Hosts并确保每个设备都有唯一的IP地址),系统会自动完成以下流程:首先将请求发送至目标From-Host;随后响应该请求的数据包将由对应的From-Host返回;最终该主站将收到完整的响应数据包。整个流程看似简单易懂
3.2 Modbus-RTU
帧结构 = 地址 + 功能吗 + 数据 + 校验
表示为 : 表示为一个字节,并覆盖从0到255的数值范围;其中有效的IP数值范围为1到247;其余数值通常具有特殊用途;例如...被指定为广播地址;其作用是向所有主机发送响应;而常规情况下;仅当两个不同的设备拥有相同的IP...时才能实现通信。
功能码 : 功能码占用一个字节其意义在于帮助识别指令的作用。例如在操作过程中你可以查询从机的数据以及对数据进行修改因此每个不同的功能代码都对应特定的功能。
数据: 根据功能码不同,有不同结构,在后续的实例中有说明;
校验流程如下:首先确保数据准确性后加入一项。接着对之前的数据进行核对以确认一致性。若核对无误,则确认该帧的数据是完整的,并随后发送反馈信息。若发现不一致,则检查传输过程中的问题并排除异常数据。

**3.3 Modbus-**ASCII
通常只需掌握RTU协议的基础知识,在之前的介绍中提到必须要有这一协议的支持方。因此熟悉这一协议就足够了。对于ACSII协议,则需要大致了解一下。
在RTU协议中使用单字节编码传输字符'0x12'(如通信设备通常采用的一种简捷方式)。而ASCII协议则需要使用双字节编码:每个字符由两个连续的字节表示(第一个为1FH, 第二个为2FH)。因此,在信息传输效率方面, 该方案较之于ASCII编码方案而言相对较低。

通过对比图示内容可知:
- 相较于RTU系统,在本方案中增加了起始分段标记,并引入了多个结束标识符分别为CR和LF。
- 地址字段和功能字段都被定义为两个字节长。
- 数据部分的组织更为复杂一些,但这种设计使得其更适合直观浏览。
遵循232和485总线协议运行的Modbus-RTU与Modbus-ACSII协议系统,在通信上均采用半双工通信模式。它们的主要区别在于数据编码方式的不同:前者采用16位十六进制数据编码方式(Modbus-RTU),后者则使用标准ASCII字符编码(Modbus-ACSII)。
ASCII增加了相应的前导字节和末尾标记字节;即可以通过这一系列的前导字节和末尾标记字节来识别单个数据包的结束。另一方面,在协议中明确规定任意两个连续数据包之间必须至少间隔超过3.5个字节的时间差。
3.4 Modbus-TCP
协议数据单元 Modbus 的通用数据结构是一种不受底层物理架构影响的基础构建模块。该构建模块被 Modbus RTU、Modbus ASCII 和 Modbus TCP 共享使用以实现统一的数据传输需求。然而,在实际通信操作中,Modbus 必须借助特定的物理介质来完成信息传递任务。因此,在建立应用层面的数据关联时,必须将协议数据单元与对应的物理网络参数建立映射关系。值得注意的是不同类型的底层网络架构会导致 Modbus TCP 协议所支持的应用数据单元与 Modbus RTU 和 Modbus ASCII 有所区别。具体来说,在 Modbus RTU 和 Modbus ASCII 中的应用数据单元架构如图所示

Modbus TCP的应用数据单元结构如下图所示

可以看出,在协议数据单元基础上应用的数据单元中添加了一个称为MBAP头结构的部分,请参考下表。

