10 年工程师分享:Modbus 协议实用教程,轻松上手工业自动化通信

151 阅读6分钟

前言

作者与Modbus协议相伴的第十年。从最初接触时的懵懂,到如今深入理解其原理与应用,这十年里,Modbus本身没有变,变的是我对它的认知与掌握。它就像一位老朋友,始终如一地在工业通信领域默默发挥作用。

一直认为,Modbus的存在有其深刻的历史意义。即便没有Modbus,也一定会出现类似"ABUS"或"DBUS"这样的标准协议。

因为在工业自动化领域,控制器之间的通信亟需一个统一、开放的规范来提升开发效率和系统兼容性。正因如此,如今市面上绝大多数国产PLC——如台达、汇川、信捷等——都原生支持Modbus协议。掌握它,就等于掌握了与这些设备通信的"通用语言"。

本文将从一个从业者的视角,带大家系统理解Modbus的核心概念。虽然文章较长,但相信耐心读完后,你会对这个"老朋友"有全新的认识。

存储区分类:从现实控制逻辑出发

讲解Modbus时,喜欢从协议设计者的角度去思考。假设我们要制定一个新的通信协议,首要目标是实现数据传输。那么,如何组织这些数据?自然要区分不同类型。

在电气控制系统中,我们常用继电器、接触器来控制电路通断,它们的核心是"线圈"的得电与失电。

因此,用"线圈"来表示布尔量(0/1)非常贴切。而"寄存器"在计算机中本就是存储数据的单元,所以非布尔型数据(如整数、浮点数)自然归入"寄存器"。

这也可以和主流PLC的存储区对应起来:

序号读写存储类型存储区名称
1只读线圈输入线圈
2读写线圈输出线圈
3只读寄存器输入寄存器
4读写寄存器保持寄存器

以西门子为例,I(输入)和Q(输出)虽然都是线圈,但I是只读(来自外部信号),Q是可读可写(输出控制信号)。因此,Modbus也应按读写权限细分存储区。

存储区代号:简化称呼

全称在开发中使用太繁琐,就像西门子用I、Q代替"输入""输出",Modbus也给每个存储区起了代号:

存储区名称存储区代号
输入线圈1区
输出线圈0区
输入寄存器3区
保持寄存器4区

这就像姓名和小名,正式场合用全称,日常交流用代号更高效。

存储区范围:地址的构成

任何存储区都有容量限制。Modbus规定每个区最大可有65536个地址,足够应对绝大多数场景。

我们以三菱X0-X2047为例,这里的"X"是存储区代号,"0"或"2047"是相对地址。组合起来就是绝对地址。

Modbus的绝对地址命名有其规则:

  • 保持寄存器第一个地址是 400001(不是400000)
  • 输入寄存器是 300001
  • 输出线圈是 000001
  • 输入线圈是 100001

如下图所示:

实际使用中,10000以内的地址通常已足够。为简化,也常用短地址模型:

功能码:操作的"快捷指令"

协议的核心是读写数据。我们有4个存储区,读写行为组合起来本应有6种(输入类只读,不可写)。

但Modbus进一步将写操作分为"单个"和"多个",于是形成了8种核心操作:

行为序号具体行为
1读取输入线圈
2读取输出线圈
3读取输入寄存器
4读取保持寄存器
5写入输出线圈
6写入保持寄存器

对应的功能码如下:

功能码功能说明
0x01读取输出线圈
0x02读取输入线圈
0x03读取保持寄存器
0x04读取输入寄存器
0x05写入单个线圈
0x06写入单个寄存器
0x0F写入多个线圈
0x10写入多个寄存器

功能码是Modbus的核心,这8个最常用,其余多用于诊断,较少使用。

协议分类:不止一种"方言"

Modbus本质是应用层规约,可在不同物理层上传输。常见的三种"方言"是:

  • Modbus RTU:常用于串口(RS-485/232),二进制格式,高效紧凑。
  • Modbus ASCII:同样用于串口,ASCII字符格式,便于调试。
  • Modbus TCP:基于以太网,使用TCP/IP协议栈,适合现代网络环境。

注意:虽然通常RTU/ASCII走串口,TCP走以太网,但这并非绝对。协议本身不限制传输介质。

报文格式:通信的"语法"

不同协议的报文结构也不同:

1、Modbus RTU 报文格式

从站地址(1字节)

功能码(1字节)

数据部分(N字节)

CRC校验(2字节)

2、Modbus ASCII 报文格式

开始字符(:)

从站地址(2字节)

功能码(2字节)

数据部分(N字节)

LRC校验(2字节)

结束字符(CR LF)

3、Modbus TCP 报文格式

事务处理标识符(2字节)

协议标识符(2字节)

长度(2字节)

单元标识符(1字节)

功能码(1字节)

数据部分(N字节)

调试软件:学习的"加速器"

Modbus学习成本低,因为协议完全公开。我们可以通过调试软件在无硬件的情况下进行仿真学习。

三大必备工具:

工具名称功能描述
ModbusPoll模拟主站(客户端),发送请求。
ModbusSlave模拟从站(服务器),响应请求。
VSPD创建虚拟串口,用于串口协议调试。

另外,大量支持Modbus的设备(PLC、仪表、传感器等)也为实践提供了便利。

总结

Modbus之所以成为工业通信的"常青树",在于它的免费、简单、灵活。它不依赖特定硬件或网络,上手容易,应用广泛。通过理解其存储区划分、功能码、报文结构等核心概念,我们不仅能与各类PLC通信,还能快速构建自己的工业通信系统。

十年相伴,Modbus教会不仅是协议本身,更是一种"化繁为简"的工程思维。希望这篇文章能帮助大家少走弯路,真正掌握这一工业通信的基石。

最后

如果你觉得这篇文章对你有帮助,不妨点个赞支持一下!你的支持是我继续分享知识的动力。如果有任何疑问或需要进一步的帮助,欢迎随时留言。

也可以加入微信公众号 [DotNet技术匠] 社区,与其他热爱技术的同行一起交流心得,共同成长!

优秀是一种习惯,欢迎大家留言学习!

作者:dotNet工控上位机

出处:zhuanlan.zhihu.com/p/543148533

声明:网络内容,仅供学习,尊重版权,侵权速删,歉意致谢!