不香不帅的个人主页

最后更新:2026-01-21
原创 最简单的语言描述什么是Modbus
浏览: 44

Modbus是一种串行通信协议,是Modicon公司(现在的施耐德电气Schneider Electric)于1979年为使用可编程逻辑控制器(PLC)通信而发表。Modbus已经成为工业领域通信协议的业界标准,并且现在是工业电子设备之间常用的连接方式。

上面这句话是官方对Modbus的解释。本人从事软件行业很多年。不太喜欢官方的语言去描述一件事物,喜欢直接翻译成自己能听懂的语言。我的理解就是:Modbus就是一个串行通讯协议。它是用于通讯的,这不用解释,另外就是“串行”和“协议”两个关键词。对于软件层面上来说,你管他“串行”还是“并行”,对你来讲没区别,那是通讯硬件实现的任务。“协议”说白了,你就得按照这个规定去实现,不按照这个来,人家不就给你干活。现在Modbus也有其分类,包括:Mobus-RTU、Modbus-ASCII、Modbus-TCP。既然通讯,就肯定得有RTU,如果没有RTU你和谁去玩(RTU是啥要是不知道,我只能非常简单的告诉你,就是远程通讯单元,也就是你要和它通讯的那个目标小模块)。Modbus-RTU是紧凑型的通讯方式,Modbus-ASCII是一种冗余的便于阅读的通讯方式。既然玩通讯,怕就怕速度上不来,还玩什么冗余。所以,我玩了这么多年,采用Modbus-ASCII的基本上没见过。大部分都是Modbus-RTU。至于Modbus-TCP是后来的变种,是以太网或者互联网发展起来以后得产物,你要搞懂了Modbus-RTU的话,Modbus-TCP就看一下区别点,注意一下就行了。

另外,还有一个很重要得点就是,Modbus是主从通讯模式。也就是说,所有指令是由主机发起,从机响应。主机不发起指令时,从机是不会自己上传数据的。

开始上干货(以Modbus-RTU为例讲解):

Modbus的协议组成:

发送协议(主机向从机发送):

【设备地址( 1字节)】+【功能码(1字节)】+【起始地址(2字节)】+【寄存器个数(2字节)】+【校验位(2字节)】


  • 设备地址:1个字节,从0~255,实际使用的时候是1~247,其他的预留其他用,例如:255(0xFF)作为广播地址;

  • 功能码:1个字节,0~255,这是用户程序级定义的,双方约定这条指令过来时干啥的,就通过功能码来识别。标准Modbus中,用的最多的就是:0x03、0x06、0x10这个三个,后面详细讲;

  • 起始地址:两个字节,告诉对方当前指令操作的起始寄存器地址;

  • 寄存器个数:两个字节,告诉对方从起始地址连续操作多少个寄存器;

  • 校验位:crc16的校验位。前面的所有数据进行CRC16校验。具体怎么生成,网上一堆的Modbus校验码函数,自行查阅。


响应协议(从机回复主机)

【设备地址( 1字节)】+【功能码(1字节)】+【响应字节数(1字节)】+【响应数据(N字节)】+【校验位(2字节)】


  • 设备地址:1个字节,返回本RTU的地址码。(RTU是以地址区分的,只有主机发送指令的地址是本机地址,才会做出响应,否则RTU是不搭理的。广播地址除外)

  • 功能码:1个字节,返回主机发送指令相同的功能码;

  • 响应字节数:1个字节,告诉主机,这次一共带回来了多少数据。也就是后面【响应数据】的长度;

  • 响应数据:N字节,实际读取到的数据,长度等于【响应字节数】;

  • 校验位:crc16的校验位。前面的所有数据进行CRC16校验。


举例说明:

前面说到了功能字:0x03、0x06、0x10 。这是标准通讯里面最常用的几个功能字。

  • 0x03:读取协议

  • 0x06:单个写入协议

  • 0x10:多个写入协议


读取协议,例如:

发送:01 03 00 05 00 01 94 0B

其中:01表示给1号机发送数据,03表示读取,00 05表示从第5个寄存器开始读取,00 01表示读取1个寄存器。也就是只读了05寄存器的数据;94 0B为校验码。

响应:01 03 02 FF FE 78 34

其中:01表示1号机响应,03表示读取返回,02表示返回内容有两个字节,FF FE表示读到的数据。


单个写入协议,例如:

发送:01 06 00 01 00 02 59 CB

其中:01表示给1号机发送数据,06表示写入单个寄存器,00 01表示从第1个寄存器开始读取,00 02表示写入的数据。也就是只读了05寄存器的数据;59 CB为校验码。

响应:01 06 00 01 00 02 59 CB

其中:01表示1号机响应,06表示写入返回,00 01表示写入的寄存器,00 02表示写入的数据。


多个写入协议,例如:

发送:01 10 00 02 04 01 02 03 04 57 41

其中:01表示1号机,10表示写入多个值,00 02表示写入2个寄存器,04表示写入字节长度(也就是后面数据的长度,1个寄存器两个字节),01 02 03 04表示实际写入的数据。

提醒:原创不易,如果您需要转载本文。为表对本人的尊重烦请标注出本文的出处。内容包括:作者和本文链接。可直接复制以下内容:

原文作者:<a href='http://www.hn-lxm.com' target="_blank">不香不帅</a>

原文链接: <a href='http://www.hn-lxm.com/article/V2lsbGlhbTMwTGVl.html' title='最简单的语言描述什么是Modbus' target="_blank">最简单的语言描述什么是Modbus</a>

评论