MODBUS RTU协议原理及功能码解析

这篇具有很好参考价值的文章主要介绍了MODBUS RTU协议原理及功能码解析。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

                        第一部分 MODBUS RTU协议原理

1.1 简介

1.2 RTU传输模式

1.3 MODBUS报文帧

1.4 CRC校验

                第二部分 MODBUS RTU模式下功能码解析

2.1 Modbus-RTU协议简介

2.2 部分功能码名词解释

2.3 部分功能码解析

01功能码 –读线圈状态

03功能码 –-读保持寄存器的值

06 功能码 –写单个保持寄存器

15 功能码 –写多个线圈状态

16功能码 -- 写多个保持寄存器


                        第一部分 MODBUS RTU协议原理

1.1 简介

modbus是OSI模型第七层上的应用层报文传输协议。

modbus是一个请求/应答协议。并规定了相关的功能码。

modbus功能码是modbus请求应答PDU的元素。(PDU:协议数据单元)

modbus通信栈:

modbus rtu功能码,工业总线,自动化,网络协议,1024程序员节

        ·                                                                 

 modbus网络体系结构示例 :

        MODBUS 协议允许在各种网络体系结构内进行简单通信。

modbus rtu功能码,工业总线,自动化,网络协议,1024程序员节

         每种设备(PLC、HMI、控制面板、驱动程序、动作控制、输入/输出设备)都能使用MODBUS协议来启动远程操作。
        在基于串行链路和以太TCP/IP 网络的MODBUS上可以进行相同通信。

modbus帧:

        modbus rtu功能码,工业总线,自动化,网络协议,1024程序员节

主/从站通信时序图:

 modbus rtu功能码,工业总线,自动化,网络协议,1024程序员节

1.2 RTU传输模式

有两种串行传输模式被定义: RTU 模式和 ASCII 模式。 

所有设备必须必须实现RTU 模式。

当设备使用RTU (Remote Terminal Unit) 模式在Modbus 串行链路通信, 报文中每个8位字节含
有两个4 位十六进制字符。这种模式的主要优点是较高的数据密度,在相同的波特率下比ASCII 模
式有更高的吞吐率。每个报文必须以连续的字符流传送。

RTU 模式每个字节( 11 位 ) 的格式为 :
        编码系统:         8–位二进制
                                报文中每个8 位字节含有两个4 位十六进制字符(0–9, A–F)
        Bits per Byte: 1 起始位
                                8 数据位, 首先发送最低有效位
                               1 位作为奇偶校验
                                1 停止位

默认校验位模式必须位偶校验

RTU模式位序列:

        modbus rtu功能码,工业总线,自动化,网络协议,1024程序员节

 RTU模式位序列(无校验的特殊情况):

        modbus rtu功能码,工业总线,自动化,网络协议,1024程序员节

RTU帧描述:

         modbus rtu功能码,工业总线,自动化,网络协议,1024程序员节

         CRC(循环冗余校验)

        modbus RTU帧最大256个字节。

1.3 MODBUS报文帧

        由发送设备将Modbus 报文构造为带有已知起始和结束标记的帧。这使设备可以在报文的开始接收新帧,并且知道何时报文结束。不完整的报文必须能够被检测到而错误标志必须作为结果被设置。在 RTU 模式,报文帧由时长至少为3.5 个字符时间的空闲间隔区分。在后续的部分,这个时间区间被称作t3.5。

        modbus rtu功能码,工业总线,自动化,网络协议,1024程序员节

modbus rtu功能码,工业总线,自动化,网络协议,1024程序员节

 整个报文帧必须以连续的字符流发送。

如果两个字符之间的空闲间隔大于1.5 个字符时间,则报文帧被认为不完整应该被接收节点丢弃。

modbus rtu功能码,工业总线,自动化,网络协议,1024程序员节

 RTU传输状态图:

        modbus rtu功能码,工业总线,自动化,网络协议,1024程序员节

 上面状态图的一些解释:
§  从 "初始" 态到 “空闲” 态转换需要t3.5 定时超时: 这保证帧间延迟
§  “空闲” 态是没有发送和接收报文要处理的正常状态。
§  在RTU 模式, 当没有活动的传输的时间间隔达3.5 个字符长时,通信链路被认为在“空闲”
态。
§ 当链路空闲时, 在链路上检测到的任何传输的字符被识别为帧起始。链路变为 "活动" 状态。
然后, 当链路上没有字符传输的时间间个达到t3.5 后,被识别为帧结束。
§ 检测到帧结束后,完成CRC 计算和检验。然后,分析地址域以确定帧是否发往此设备,如果不
是,则丢弃此帧。为了减少接收处理时间,地址域可以在一接到就分析,而不需要等到整个帧
结束。这样,CRC 计算只需要在帧寻址到该节点(包括广播帧) 时进行。

1.4 CRC校验

       在RTU 模式包含一个对全部报文内容执行的,基于循环冗余校验 (CRC - Cyclical RedundancyChecking) 算法的错误检验域。CRC 域检验整个报文的内容。不管报文有无奇偶校验,均执行此检验。
        CRC 包含由两个8 位字节组成的一个16 位值。
        CRC 域作为报文的最后的域附加在报文之后。计算后,首先附加低字节,然后是高字节。CRC高字节为报文发送的最后一个子节。
        附加在报文后面的CRC 的值由发送设备计算。接收设备在接收报文时重新计算CRC 的值,
并将计算结果于实际接收到的CRC 值相比较。如果两个值不相等,则为错误。
        CRC 的计算, 开始对一个16 位寄存器预装全1。然后将报文中的连续的8 位子节对其进行后
续的计算。只有字符中的8个数据位参与生成CRC 的运算,起始位,停止位和校验位不参与CRC
计算。
        CRC 的生成过程中, 每个 8–位字符与寄存器中的值异或。然后结果向最低有效位(LSB)方向
移动(Shift) 1位,而最高有效位(MSB)位置充零。然后提取并检查LSB:如果LSB 为1, 则寄存
器中的值与一个固定的预置值异或;如果LSB 为 0, 则不进行异或操作。
        这个过程将重复直到执行完8 次移位。完成最后一次(第8 次)移位及相关操作后,下一个8
位字节与寄存器的当前值异或,然后又同上面描述过的一样重复8 次。当所有报文中子节都运算之
后得到的寄存器忠的最终值,就是CRC。 

                第二部分 MODBUS RTU模式下功能码解析

2.1 Modbus-RTU协议简介

帧结构 = 地址(设备ID) + 功能码 + 数据 + 校验

地址:占1个字节,范围0~255,有效范围1~247,其他特殊用途 如255为广播地址。

功能码:占1个字节。功能码是modbus协议定的。是modbus编程两个重要的概念之一(另一个是字符间隔1.5T—判断帧是否完整,字符间隔大于3.5T视为帧结束。),不同的功能码,后面数据格式也不同,从机返回的帧格式也不同。

数据:见后面示例。

校验:CRC校验值。

备注:读线圈返回数据时,1个字节表示8个线圈状态。

       比如线圈地址0001-0008这一部分的状态ON-ON-ON-OFF-ON-ON-OFF-OFF,等价11101100。二进制表示为0011011116进制为0x37.

2.2 部分功能码名词解释

Modbus常用功能码:

代码

名称

寄存器PLC地址

/字操作

操作数量

01

读线圈状态

00001~09999

位操作

单个或多个

02

读离散输入状态

10001~19999

位操作

单个或多个

03

读保持寄存器

40001~49999

字操作

单个或多个

04

读输入寄存器

30001~39999

字操作

单个或多个

05

写单个线圈

00001~09999

位操作

单个

06

写单个保持寄存器

40001~49999

字操作

单个

15

写多个线圈

00001~09999

位操作

多个

16

写多个保持寄存器

40001~49999

字操作

多个

线圈寄存器:实际上就可以类比为开关量(继电器状态),每一个bit对应一个信号的开关状态。所以一个byte就可以同时控制8路的信号。比如控制外部8路io的高低。 线圈寄存器支持读也支持写,写在功能码里面又分为写单个线圈寄存器和写多个线圈寄存器。对应上面的功能码也就是:0x01 0x05 0x0f

离散输入寄存器:如果线圈寄存器理解了这个自然也明白了。离散输入寄存器就相当于线圈寄存器的只读模式,他也是每个bit表示一个开关量,而他的开关量只能读取输入的开关信号,是不能够写的。比如我读取外部按键的按下还是松开。所以功能码也简单就一个读的 0x02

保持寄存器:这个寄存器的单位不再是bit而是两个byte,也就是可以存放具体的数据量的,并且是可读写的。一般对应参数设置,比如我我设置时间年月日,不但可以写也可以读出来现在的时间。写也分为单个写和多个写,所以功能码有对应的三个:0x03 0x06 0x10

输入寄存器:这个和保持寄存器类似,但是也是只支持读而不能写,一般是读取各种实时数据。一个寄存器也是占据两个byte的空间。类比我我通过读取输入寄存器获取现在的AD采集值。对应的功能码也就一个 0x04。

(名词解释来源:https://blog.csdn.net/lingshi75/article/details/105991450/)

2.3 部分功能码解析

01功能码 –读线圈状态

主机发送:01 01 00 01 00 08 6C 0C

从机回复:  01 01 01 2F 10 54

主机解析:01  地址(设备ID)

                 01  功能码;

                00 01  代表查询的起始线圈地址,即从0001线圈开始查询。

                00 08 查询线圈数量。

                6C 0C 循环冗余校验。

从机解析:01  地址(设备ID)

                01  功能码;

                01  代表后面数据的字节数。

                2F    读取以0001线圈开始的8个线圈的状态。0x2F二进制为00101111,对应状态为1111                         0100

                10 54 循环冗余校验。

02功能码 –-读离散输入寄存器

           功能:读离散输入寄存器,位操作,可读单个或多个,类似功能码0X01

03功能码 –-读保持寄存器的值

主机发送:01 03 00 01 00 01 D5 CA

从机回复:  01 03 02 00 01 79 84

主机解析:01  地址(设备ID)

                03  功能码;

                00 01  代表查询的起始寄存器地址,即从0001寄存器开始查询。

                00 01 查询寄存器数量。

                D5 CA 循环冗余校验。

从机解析:01  地址(设备ID)

                 03  功能码;

                02  代表后面数据的字节数。

                00 01 查询0001寄存器的值。

                79 84 循环冗余校验。

04 功能码 –-读输入寄存器

        功能:读输入寄存器,字节操作,可读单个或多个,类似功能码0X03

05 功能码 –-写单个保持寄存器

        功能:对单个线圈进行写操作,位操作,只能写一个。写入0xFF00表示将线圈置为ON,写入0x0000表示将线圈置为OFF,其它值无效;

        主机发送数据:从站地址+功能码+寄存器起始地址+数据值+校验码

        从站应答数据:从站地址+功能码+寄存器地址+写入值+校验码

06 功能码 –-写单个保持寄存器

主机发送:01 06 00 02 00 01 E9 CA

从机回复:  01 06 00 02 00 01 E9 CA

主机解析:01  地址(设备ID)

                06  功能码;

                00 02  代表待写入的起始寄存器地址,即从0002寄存器开始写数据。

                00 01 写入的寄存器的值。即给0002寄存器写入0001

                E9 CA 循环冗余校验。

从机解析:01  地址(设备ID)

                06  功能码;

                02  代表后面数据的字节数。

                00 01 查询0001寄存器的值。

                E9 CA 循环冗余校验。

15 功能码 –-写多个线圈状态

主机发送:01 0F 00 01 00 07 01 6B B2 B9

从机回复:  01 0F 00 01 00 07 45 C9

主机解析:01  地址(设备ID)

                0F  功能码;

                00 01  代表待写入的起始线圈地址,即从0001线圈开始写数据。

                00 07 待写入的线圈的数量。

                01 后面写入数据的字节数。

                6B写入寄存器的值,即11010110。二进制01101011

                B2 B9 循环冗余校验。

从机解析:01  地址(设备ID)

                0F  功能码;

                00 01  代表待写入的起始线圈地址,即从0001线圈开始写数据。

                00 07 待写入的线圈的数量。

                45 C9 循环冗余校验。

16功能码 -- 写多个保持寄存器

主机发送:01 10 00 04 00 03 06 00 01 00 00 00 01 5B 55

从机回复:  01 10 00 04 00 03 C1 C9

主机解析:01  地址(设备ID)

                10  功能码;

                00 04  代表待写入的起始寄存器地址,即从0004寄存器开始写数据。

                00 03 待写入的寄存器的数量。

                06 后面写入数据的字节数。

             0001,0000,0001写入寄存器的值。即给0004,0005,0006寄存器分别写入0001,0000,0001

                5B 55 循环冗余校验。

从机解析:01  地址(设备ID)

                10  功能码;

                00 04  代表待写入的起始寄存器地址,即从0004寄存器开始写数据。

                00 03 待写入的的寄存器的值。即给0004,0005,0006寄存器分别写入0001,0000,0001

                C1 C9 循环冗余校验。文章来源地址https://www.toymoban.com/news/detail-783258.html

到了这里,关于MODBUS RTU协议原理及功能码解析的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Modbus-RTU协议C#实现

    1、安装依赖包 System.IO.Ports 2、读协议 3、写协议 4、CRC16校验

    2024年02月15日
    浏览(58)
  • modbus-tcp-rtu协议图表

    MODBUS TCP 读寄存器 请求 序号 意义 所占字节 字节存放格式 1 事务处理标识 2个字节 高字节在前 2 协议标识 2个字节 高字节在前 3 长度 2个字节 高字节在前 4 单元标识 1个字节 0x00-0xff 5 功能码 1个字节 0x03 6 起始寄存器地址 2个字节 高字节在前 7 寄存器个数 2个字节 高字节在前

    2024年01月23日
    浏览(38)
  • STM32开发之Modbus协议(主站RTU)

    在单片机方面,针对于通讯常用的协议之一modbus,这里将modbus协议和硬件之间的关系完全独立出来,硬件和协议之间的联系采用的是回调的方式进行一个关联。 1、此协议可直接移植,并不需要关心硬件相关的。 2、modbus相关协议概念自行查找,本文只做代码的实现。 宏定义(

    2024年02月12日
    浏览(44)
  • STM32开发之Modbus协议(RTU从站)

    说明 1、本文不做协议格式的讲解,只做实现,如需了解协议格式,自行搜索 2、本文不依赖于硬件相关的资源,建立在硬件通讯之上,通过回调的形式和对应的硬件进行关联 3、相关协议内容参照,上一篇RTU主站 宏定义(modbus_core_define) crc校验(modbus_core_crc) 头文件 源文件

    2024年02月11日
    浏览(47)
  • MODBUS RTU 通信协议 CRC16校验算法

    CRC校验码是一个2个字节(16位二进制)的数。 发送端:发送的数据计算CRC校验码----发送:数据+CRC校验码 接收端:收到数据后重新计算CRC校验码,然后和接收到数据中的CRC校验码进行比较,判断是否相等。 如果不相等:数据传输过程中出错,给出错误应答。 CRC16 校验源码

    2024年02月16日
    浏览(51)
  • 树莓派4B与智能插排通过RS485(modbus RTU协议)通信

    目标:使用树莓派4B与CANHAT扩展板读取智能插排测量的各项数据(RS485+modbus RTU),获取的数据上传到Hyperledger Fabric框架。 之前学习过了modbus RTU协议,在智能涡轮流量计的实验中应用过一次,这次用这个带485模块的智能插座再复习一次~ 实验材料: 树莓派4B/8G:  CANHAT扩展板:

    2024年02月01日
    浏览(79)
  • 嵌入式 RS485 Modbus-RTU与TCP/IP协议详细介绍

    目录 TCP/IP协议 RS485 Modbus-RTU协议 TCP/IP是一种网络通信协议,它是互联网的基础。TCP/IP协议是由两个协议组成的,分别是TCP (传输控制协议)和IP (网络协议)。 TCP (Transmission Control Protocol) 传输控制协议 TCP是一种面向连接的协议,它提供可靠的、有序的数据传输服务。 TCP协议通过

    2024年02月13日
    浏览(48)
  • EthernetIP 转MODBUS RTU协议网关连接FANUC机器人作为EthernetIP通信从站

    远创智控YC-EIPM-RTU网关产品是一款高效的数据采集工具,它可以通过各种数据接口与工业领域的仪表、PLC、计量设备等产品连接,实时采集这些设备中的运行数据、状态数据等信息。采集到的数据经过整合和运算等操作后,可以被传输到其他设备或者云平台。网关可采集设备

    2024年02月08日
    浏览(58)
  • Modbus RTU(Remote Terminal Unit)与RS-485协议(rs485)介绍(主站设备(Master)、从站设备(Slave))Modbus TCP、Modbus ASCII

    参考文章:ModBus协议 参考文章:一篇文章了解 RS485 和 MODBUS 的区别,它们有什么不同? Modbus RTU和RS-485是工业通信中常用的两种协议。Modbus RTU 是一种数据表示协议,而 RS-485 则是物理传输标准。尽管这两者有时被并列讨论,但它们在通信系统中的角色却大不相同。以下内容将

    2024年02月05日
    浏览(68)
  • Modbus RTU通信应用

    1.1 概述         Modbus串行通信协议是Modicon公司在1970年开发的。         Modbus串行通信协议有Modbus ASCII和Modbus RTU两种模式,Modbus RTU协议通信效率较高,应用更加广泛。         Modbus RTU协议是基于RS232和RS485串行通信的一种协议,数据通信采用主从方式进行传送,主站

    2024年02月15日
    浏览(52)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包