Modbus通讯协议详解及与Modbus TCP通讯协议之间的区别

Modbus通信协议由Modicon公司(现已经为施耐德公司并购,成为其旗下的子品牌)于1979年发明的,是全球最早用于工业现场的总线规约。由于其免费公开发行,使用该协议的厂家无需缴纳任何费用,Modbus通信协议采用的是主从通信模式(即Master/Slave通信模式),其在分散控制方面应用极其广泛,从而使得Modbus协议在全球得到了广泛的应用。

Modbus通信协议具有多个变种,其具有支持串口(主要是RS-485总线),以太网多个版本,其中最著名的是Modbus RTU,Modbus ASCII和Modbus TCP三种。其中Modbus RTU与Modbus ASCII均为支持RS-485总线的通信协议,其中Modbus RTU由于其采用二进制表现形式以及紧凑数据结构,通信效率较高,应用比较广泛。而Modbus ASCII由于采用ASCII码传输,并且利用特殊字符作为其字节的开始与结束标识,其传输效率要远远低于Modbus RTU协议,一般只有在通信数据量较小的情况下才考虑使用Modbus ASCII通信协议,在工业现场一般都是采用Modbus RTU协议,一般而言,大家说的基于串口通信的Modbus通信协议都是指Modbus RTU通信协议。

在此我们着重讨论Modbus RTU协议,而Modbus TCP协议则是在RTU协议上加一个MBAP报文头,由于TCP是基于可靠连接的服务,RTU协议中的CRC校验码就不再需要,所以在Modbus TCP协议中是没有CRC校验码,用一句比较通俗的话说就是:Modbus TCP协议就是Modbus RTU协议在前面加上五个0以及一个6,然后去掉两个CRC校验码字节就OK.虽然这句话说得不是特别准确,但是也基本上把RTU与TCP之间的区别说得比较清楚了。

RTU协议中的指令由地址码(一个字节),功能码(一个字节),起始地址(两个字节),数据(N个字节),校验码(两个字节)五个部分组成,其中数据又由数据长度(两个字节,表示的是寄存器个数,假定内容为M)和数据正文(M乘以2个字节)组成,而RTU协议是采用3.5个字节的空闲时间作为指令的起始和结束,一般而言,只有当从机返回数据或者主机写操作的时候,才会有数据正文,而其他时候比如主机读操作指令的时候,没有数据正文,只需要数据长度即可。(本章的讨论只涉及寄存器的读写,其他比如线圈的读写指令我们暂时不涉及)。在此我们通过两个指令(0x03H:读多个寄存器指令以及0x10H:写多个寄存器指令)来解释Modbus RTU协议。在此我们使用的RTU设备是深圳市国科伟业通信技术有限公司的ND-1084型485总线I/O模块

ND-1084型485总线I/O模块采用RS-485总线通信,支持四路开关量输出以及八路开关量输入,我们只讲述读取开关量输出的状态以及通过写指令控制开关量的输出。其中储存开关量输出状态的四个寄存器分别:0x18E,0x18F,0x190,0x191。在此我们假设模块的地址为默认的0x01,当我们要去读取开关量输出对应的四个寄存器的状态的时候,我们下发的十六进制的指令为:“01 03 01 8E 00 04 25 DE”,其中“01”为模块的地址码,“03”为功能码,即表示读寄存器,“01 8E”为寄存器地址,即从该寄存器地址开始读取数据,“00 04”则表示读取4个寄存器,而“25 DE”则为前面“01 03 01 8E 00 04”的CRC校验码,该数值通过CRC16校验算法计算出来的,我们会在其他文章中阐述。该指令的完整解读就是,在地址码为“01”的模块中,从“01 8E”寄存器开始,读取4个寄存器的数据返回至主机。在此,我们可以看到,读取指令中并没有什么数据正文,因为它只是读取相应数量的寄存器,并不需要数据正文,而写操作指令则相反,我们会在后面讲到。

模块返回的指令是:“01 03 08 00 01 00 01 00 01 00 01 28 D7”,返回的指令内容解读就是:“01”表示模块的地址码,“03”表示该指令是读操作返回的指令,“08”表示数据长度,在此表示的是8个字节数据正文(即4个寄存器,每个寄存器两个字节表示),“00 01 00 01 00 01 00 01”是数据正文,表示四个寄存器的状态,“28 D7”就是CRC16校验码。

同样的当我们执行写操作的是,我们举例写第一个开关量输出,即寄存器“0x18E”,主机下发的指令为:“01 10 01 8e 00 01 02 00 00 A8 7E”,该指令的解读就是:“01”表示模块的地址,“10”表示该指令为写寄存器,“01 8E”表示从该寄存器地址开始执行写操作指令“00 01”表示写多少个寄存器,在此为写1个寄存器,“02”表示数据长度,表示数据长度为两个字节,“00 00”表示写入寄存器的数据,在此表示连通,“A8 7E”为CRC校验码。模块返回的指令和读取寄存器的返回的指令类似。

前文所述,Modbus TCP协议是在RTU协议前面添加MBAP报文头,共七个字节长度,其分别的意义是:1.传输标志,两个字节长度,标志Modbus询问/应答的传输,一般默认是00 00。2.协议标志,两个字节长度,0表示是Modbus,1表示UNI-TE协议,一般默认也是00 00。3.后续字节计数,两个字节长度,其实际意义就是后面的字节长度,具体情况详见下文。4.单元标志,一个字节长度,一般默认为00,单元标志对应于Modbus RTU协议中的地址码,当RTU与TCP之间进行协议转换的时候,特别是Modbus网关转换协议的时候,在TCP协议中,该数据就是对应RTU协议中的地址码,具体情况详见下文。

通过上面的描述我们差不多能够理解Modbus RTU协议,我们再说说Modbus TCP通信协议,前面就已经说过TCP协议就是在RTU协议的基础上去掉校验码以及加上五个0和一个6,当是读取相关寄存器的时候,该说法是没有错的,比如上文的“01 03 01 8E 00 04 25 DE”读取指令,用TCP协议来表述的话,指令是“00 00 00 00 00 06 00 03 01 8E 00 04”,由于TCP是基于TCP连接的,不存在所谓的地址码,所以06后面一般都是“00”(当其作为Modbus网关服务器挂接多个RTU设备的时候,数值从01-FF).即“00 03 01 8E 00 04”对应的是RTU中去掉校验码的指令,前面则是五个0以及一个6。其中6表示的是数据长度,即“00 03 01 8E 00 04”有6个字节长度。而当其为写操作指令的时候,其指令是“00 00 00 00 00 09 01 10 01 8e 00 01 02 00 00”,其中“00 09”表示后面有9个字节。

Modbus RTU与Modbus TCP读指令对比

 
MBAP报文头
地址码
功能码
寄存器地址
寄存器数量
CRC校验
Modbus RTU
01
03
01 8E
00 04
25 DE
Modbus TCP
00 00 00 00 00 06 00
03
01 8E
00 04

指令的涵义:从地址码为01(TCP协议单元标志为00)的模块0x18E(01 8E)寄存器地址开始读(03)四个(00 04)寄存器。

Modbus RTU与Modbus TCP写指令对比

 
MBAP报文头
地址码
功能码
寄存器地址
寄存器数量
数据长度
正文
CRC校验
RTU
01
10
01 8E
00 01
02
00 00
A8 7E
TCP
00 00 00 00 00 09 00
10
01 8E
00 01
02
00 00

指令的涵义:从地址码为01(TCP协议单元标志为00)的模块0x18E(01 8E)寄存器地址开始写(10)一个(00 01)寄存器,具体数据长度为2个字节(02),数据正文内容为00 00(00 00)。

  • 25
    点赞
  • 85
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: Modbus通讯协议是一种应用层协议,被广泛应用于工业自动化领域,用于在不同设备之间进行数据通信。 Modbus通讯协议分为两种模式:串行模式和以太网模式。在串行模式下,Modbus使用RS-232或RS-485接口进行通信,而在以太网模式下,则使用以太网协议进行通信。 Modbus通讯协议主要包括以下四种常见的消息类型:读取线圈状态、读取输入状态、读取保持寄存器和读取输入寄存器。通过这些消息类型,可以实现对不同类型数据的读取和写入。 Modbus通讯协议使用简单的数据结构来表示不同类型的数据。例如,线圈状态和输入状态使用位来表示,保持寄存器和输入寄存器使用16位字来表示。这种数据结构的使用使得通讯协议更为简洁。 Modbus通讯协议使用主/从架构,其中一个设备充当主节点,负责发送请求消息和接收响应消息,而其他设备充当从节点,负责接收请求消息和发送响应消息。 在Modbus通讯协议中,主节点通过从节点的地址进行通信,并使用功能码指定要执行的操作。每个从节点都有一个唯一的地址,所以主节点可以通过地址来区分和访问不同的从节点。 Modbus通讯协议还支持数据批量传输和广播通信。数据批量传输允许一次性读取或写入多个寄存器的数据,从而提高通讯效率。广播通信允许主节点向所有从节点发送命令,从而实现一次性向多台设备发送相同的指令。这些功能使得Modbus通讯协议更加灵活和高效。 综上所述,Modbus通讯协议是一种可靠、简单和高效的工业通讯协议,适用于各种自动化设备之间的数据通信,为工业自动化系统提供了可靠的数据交换手段。 ### 回答2: Modbus通讯协议是一种用于工业领域常见的通讯协议,用于在不同设备间实现数据传输和通讯的标准。下面我将详细解释Modbus通讯协议的相关内容。 Modbus协议采用了主从结构,其中主机负责发出请求,从机负责响应请求。协议定义了一系列的功能码,用于不同的数据交换操作。常见的功能码包括读写寄存器、读写输入寄存器、读写线圈等。 在Modbus通讯中,数据的传输是基于二进制形式进行的。通讯过程包括三个步骤:建立连接、数据交互和释放连接。建立连接阶段是主机向从机发送一个请求,从机响应确认连接。确认连接后,主机可以发送请求指令给从机,从机则根据指令进行相应的操作,并返回相应结果给主机。最后,当通讯结束时,可以释放连接。 Modbus协议支持不同的物理层,包括串口、以太网等。在串口通讯中,常用的物理层为RS485,而在以太网通讯中,常用的物理层为TCP/IP协议。 Modbus协议的应用非常广泛,在工业自动化领域、能源管理系统、楼宇自控系统等各种领域都有应用。它具有简单、开放、易于实现和跨平台等特点,因而深受工程师的喜爱。 总之,Modbus通讯协议是一种常见的工业领域通讯协议,通过主从结构和功能码,实现了不同设备之间的数据传输和通讯。它的简单与开放使得它在各个领域都有广泛的应用。 ### 回答3: Modbus通信协议是一种用于实现工业控制系统中设备之间数据交换的协议。它由Modicon公司于1979年首次引入,如今已成为工业领域中最为广泛应用的通信协议之一。 Modbus采用了一种主从结构的通信模式,主节点负责发起通信请求,从节点负责响应请求并提供数据。主节点可以是监控控制系统(如PLC)或上位机,而从节点则可以是传感器、执行器或其他可编程设备。 Modbus通信协议基于传统串行通信,通过串口实现数据传输。它定义了一种简单易懂的帧格式,包括起始符、地址、功能码、数据、校验和等字段。通过这些字段的组合,主从节点能够进行数据的读取和写入操作。 Modbus协议支持不同的功能码,其中最常用的包括读取保持寄存器、读取输入寄存器、写单个寄存器、写多个寄存器等。每个寄存器可以存储16位或32位的数据,如开关状态、温度值、电压等。 Modbus通信协议具有以下特点:首先,它是一种简单轻便的通信协议,不需要复杂的硬件和软件开发。其次,它具有良好的兼容性,可以与各种设备和系统进行无缝集成。第三,它支持多种通信介质,包括串口、以太网和无线电等。最后,Modbus协议具有广泛的应用领域,包括自动化控制、楼宇管理、能源监测等。 总的来说,Modbus通信协议是一种简单易用、高效可靠的工业通信协议,能够满足各种设备之间的数据交换需求。它的广泛应用和不断改进的发展将为工业控制系统的运行提供强有力的支持。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值