0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

简单介绍Modbus RTU协议

小麦大叔 来源:小麦大叔 2024-05-09 09:13 次阅读

背景

介绍modbus rtu之前,我们可以了解到,Modbus是施耐德电气公司,于1979年发明的,是全球第一个真正用于工业现场的总线协议。四十多年过去了,现在仍然被广泛使用在各个工业控制领域。除了这个协议很稳定的原因之外:

免费;

方便部署和维护;

对供应商来说,修改移动本地的比特或字节没有很多限制;

modbus 是OSI模型第七层上的应用层报文传输协议,OSI定义了开放系统的层次结构、层次之间的相互关系以及各层所包括的可能的任务,作为一个框架来协调和组织各层所提供的服务。

OSI参考模型并没有提供一个可以实现的方法,而是描述了一些概念,用来协调进程间通信标准的制定。即OSI参考模型并不是一个标准,而是一个在制定标准时所使用的概念性框架。

modbus在OSI模型中,可以描述为下图;

5716f730-0d58-11ef-a297-92fbcf53809c.png

modbus osi模型中的位置

EIA485/TIA485就是RS485,随着技术不断发展,485标准目前是电信行业协会(TIA)维护,所以名称为TIA-485,当然工程师及应用指南仍继续用RS-485来称呼也是没问题的;

下面我们来介绍一些串行链路协议。

Modbus 串行链路协议

Modbus串行链路协议是一个主从模式(主机和从机),半双工的数据传输协议,485标准通常需要两条线,在某一个确定时刻,有一个主机和从机进行通讯。

主从模式:通常总线上有一个主机和多个从机,每个从机有唯一的ID,主机通过ID进行寻址从机,然后进行数据传输;

半双工传输:相对应半双工的是全双工,全双工运行发送数据接收数据同时发生,所以半双工就不难理解了,同一时刻只能进行发送数据,或者只能接收数据;

整体的结构图如下所示;

5756c9f0-0d58-11ef-a297-92fbcf53809c.png

一个485总线的主从模式

这里我们还要明确几点:

从机无法主动向从机发送数据,只有在主机发送数据给从机(发送请求),然后从机接收到主机发送的数据之后,再回传数据给主机;具体如下所示;

578eadf2-0d58-11ef-a297-92fbcf53809c.png

主从模式

正如前面所提到的,modbus是半双工传输的,即主机发送数据的时候,是不能接收数据的,所以这里总共分为两步来进行。

主机发送数据的方式有两种,一个是 1对1,一个是1对多,也就是我们常说的广播形式,所有从机都可以收到主机发送的数据;

1对1 只需要发送数据给特定地址的从机即可,广播只需要把发送地址设置为0即可,所以广播地址为0;

这里我们已经大致了解了主机和从机之间的数据传输的情况,下面我们就再来介绍一下数据传输的具体格式;

传输模式

57c55366-0d58-11ef-a297-92fbcf53809c.png

先来说说Modbus有两种传输模式,RTU传输模式和ASCII传输模式;

RTU传输:Remote Terminal Unit模式在Modbus中消息由十六进制组成,数据密度高,吞吐率高;

ASCII传输:消息由ASCII 字符发送效率不及RTU模式,无法使用RTU模式的定时管理时,使用ASCII模式;

比如:0x12会被整合成两个字符发送:0x31和0x32发送,

因为 0x31等于字符1;0x32等于字符2

下面我们会主要介绍modbus RTU。

帧格式

在讲帧格式之前,首先我们想象一下,人与人之间的对话,最基本单元是汉字,然后相互交流就用汉字组成的句子,比如下面的对话;

老板问:中午吃什么?

小樟说:吃饭吧!

所以机器之间的通信也是类似的,我们可以把字节当作最基本的数据单元,然后由字节组成句子,也就是通信帧;

但是现在情况出现了变化,对话的人里,除了小樟,还有一个小红,这时候,为了明确和谁说话,就需要在对话前面加上名字:

老板:小樟,中午吃面吗?

小樟:老板,吃饭去吧。

小红,没有叫他,语言柚子;

所以我们继续回到modbus的数据帧格式,这里的协议定义了一个基础通信层的简单协议数据单元(PDU),具体如下图所示;

59137eaa-0d58-11ef-a297-92fbcf53809c.png

所以这里基本分为四个部分,地址域功能码数据差错校验(CRC/LRC),统称为ADU (Application Data Unit),基本上进行传输的数据都要满足这个格式,作为一个完整的帧,对照前面老板的对话内容,我们这里可以简单的理解一下:

地址域:可以理解成 具体和谁说话

功能码:可以理解成 具体动作,比如 去做,来拿,去吃 等等;

数据:可以理解成 具体内容,比如 面,饭 等等,也可以是其他,这里配合上下文,所以是吃的东西;

差错校验:可以理解成,说出来的话必须可以让人理解,不然别人听不懂啊;实际上在协议中通常使用CRC或LRC保证传输的数据没有错误;

下面我们再深入分析一下;

PDU

Modbus PDU(protocol data unit)格式被定义为一个功能代码,后面跟着一组关联的数据。

该数据的大小和内容由功能代码定义,整个PDU(功能代码和数据)的大小不能超过253个字节。

每个功能代码都有一个特定的行为,从设备可以根据所需的应用程序行为灵活地实现这些行为。

PDU规范定义了数据访问和操作的核心概念;但是,从设备可能会以规范中未明确定义的方式处理数据。

地址域

地址域占用一个字节,所以一般来说寻址范围是0~255,一般在系统中用1~147,其他地址暂时保留,另外,同一个总线上的从机,每个地址必须唯一。

其中0是广播地址;

下面是Freemodbus的一个从机初始化代码,0x02就是这个从机的地址,

eMBInit(MB_RTU,0x02,3,115200,MB_PAR_NONE);

功能码

功能码占一个字节,所以范围是 0~255,协议中规定了功能码分为三类:公共功能码,用户自定义功能码,保留功能码。整体如下所示;

59483050-0d58-11ef-a297-92fbcf53809c.png

公共功能码必须保证它的唯一性,这是由Modbus组织已经规定好,并且具有一致性测试的功能码,所以在一定程度上,它保证了协议的可复用性。

由上表可知,公共功能码分为四种,分别是:

离散量输入:只读类型,单位:bit;

线圈:读写类型,单位:bit;

输入寄存器:只读类型,单位:字节;

保持寄存器:读写类型,单位:字节;

下面是移植Freemodbus协议,从机上需要对这四个公共功能码处理的回调函数:

//输入寄存器量
eMBErrorCodeeMBRegInputCB(UCHAR*pucRegBuffer,USHORTusAddress,USHORTusNRegs)
{
eMBErrorCodeeStatus=MB_ENOERR;
returneStatus;
}
//保持寄存器量
eMBErrorCode
eMBRegHoldingCB(UCHAR*pucRegBuffer,USHORTusAddress,USHORTusNRegs,
eMBRegisterModeeMode)
{
eMBErrorCodeeStatus=MB_ENOERR;
returneStatus;
}

//线圈数量
eMBErrorCode
eMBRegCoilsCB(UCHAR*pucRegBuffer,USHORTusAddress,USHORTusNCoils,
eMBRegisterModeeMode)
{
eMBErrorCodeeStatus=MB_ENOERR;
returneStatus;
}

//离散输入数量
eMBErrorCode
eMBRegDiscreteCB(UCHAR*pucRegBuffer,USHORTusAddress,USHORTusNDiscrete)
{
eMBErrorCodeeStatus=MB_ENOERR;
returneStatus;
}

底层如何传输

我们先看一下最底层modbus数据是如何发送的,没错,看到RS485和232,那我们自然想到了串口。

所以最根本的数据格式可以参考一下串口数据的定义,也就是我们说的起始位,数据位,校验位,数据位;具体如下所示;

5996e36c-0d58-11ef-a297-92fbcf53809c.png

所以这里我们可以规定一下:

起始位+数据位+校验位(可选)+ 停止位 等于一个字符;因此这里可以通过串口的波特率去计算出单个字符所需要的时间。

然后我们再看一下,modbus帧是如何发送的?

在RTU模式中,帧之间的间隔至少为3.5个字符的空闲时间间隔,以便于表示帧的开始和帧的结束,所以如果想自己整一个modbus rtu就需要一个定时器去结算空闲时间的长度。

59d1ea98-0d58-11ef-a297-92fbcf53809c.png

3.5字符时间

整个数据必须以连续的字符流进行发送,如果两个字符之间的长度等于1.5个字符时间,则认为帧消息不完整,则认为设备不该接收该消息,具体如下所示;

5a1ec142-0d58-11ef-a297-92fbcf53809c.png

1.5字符时间

这里需要注意的是RTU需要定时器中断的参与,所以,1.5字符时间和3.5字符时间的检测,在串口通讯速率很高的时候,需要高频率得进入中断,这就会增加系统开销。

所以通常在波特率低于19200的时候,可以严格遵守1.5和3.5字符时间的规定。

如果波特率大于19200的时候,需要满足两个固定时间即可:

1.5字符时间:750 us;

3.5字符时间:1.75ms;

总结

本文简单介绍了modbus rtu协议,包括串行链路通信,帧格式以及硬件链路层的消息格式。



审核编辑:刘清

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 寄存器
    +关注

    关注

    30

    文章

    5141

    浏览量

    118043
  • RS-485
    +关注

    关注

    9

    文章

    592

    浏览量

    83461
  • ModBus协议
    +关注

    关注

    3

    文章

    153

    浏览量

    33219
  • CRC校验
    +关注

    关注

    0

    文章

    84

    浏览量

    15057
  • RTU
    RTU
    +关注

    关注

    0

    文章

    353

    浏览量

    28394

原文标题:一文搞懂 Modbus RTU 协议

文章出处:【微信号:knifewheat,微信公众号:小麦大叔】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    使用协议栈实现Modbus RTU从站应用

    自从开源了我们自己开发的Modbus协议栈之后,有很多朋友建议我针对性的做几个示例。所以我们就基于平时我们的应用整理了几个简单但可以说明基本的应用方法的示例,这一篇中我们将使用协议栈实现一个M
    的头像 发表于 12-13 16:14 1577次阅读
    使用<b class='flag-5'>协议</b>栈实现<b class='flag-5'>Modbus</b> <b class='flag-5'>RTU</b>从站应用

    【新手上路】Labview与modbus RTU协议的问题

    传感器是modbus RTU协议 怎么用Labview采集信号?
    发表于 05-17 09:54

    Modbus TCP转Modbus RTU的实现

    使用ZLSN2040、NETCOM2040实现Modbus TCP到Modbus RTU的转化。1.Modbus TCP与Modbus
    发表于 08-10 10:04

    基于Modbus RTU的串口调试软件的实现

    摘 要:文中介绍Modbus RTU通讯协议的特点,阐述了该协议在VC2005编程环境下串口调试软件的具体实现方法。并编制了相关的程序,该
    发表于 12-18 19:18

    modbus协议讲解modbus-rtu以及modbus-tcp协议详解

    modbus协议讲解modbus-rtu以及modbus-tcp协议详解,见附件。
    发表于 03-01 10:14

    Modbus-RTU协议模式学习下载

    1.Modbus定义: 是一种串行通信协议,一开始是为使用PLC(即可编程逻辑控制器)设备通信而发表,已成为工业上通信协议的标准,是工业电子设备间常用连接方式。2.Modbus协议组成
    发表于 07-02 06:12

    Modbus RTU通讯协议相关资料下载

    Modbus RTU通讯协议中OSI模型,数据链路层和应用层是通讯关键部分。
    发表于 11-30 08:29

    Modbus-RTU协议包括哪些呢

    Modbus-RTUModbus 一个工业上常用的通讯协议、一种通讯约定。Modbus协议包括RTU、ASCII、TCP。其中MODBUS-RTU
    发表于 02-16 07:43

    如何快速实现Modbus RTUModbus TCP协议转换?

    Modbus协议是工业现场串口设备之间常用的连接方式,其中最常见的就是Modbus RTUModbus TCP两种。许多工厂需要将现场各种不同型号设备的数据都能够通过一个上位机软件或
    发表于 08-18 18:36

    Modbus_RTU协议在S7-200中的应用

    介绍Modbus_RTU协议在S7-200中的应用
    发表于 03-28 18:03 21次下载

    Modbus-RTU协议

    Modbus-RTUModbus 一个工业上常用的通讯协议、一种通讯约定。Modbus协议包括RTU、ASCII、TCP。其中MODBUS-RTU
    发表于 12-20 18:48 37次下载
    <b class='flag-5'>Modbus-RTU</b><b class='flag-5'>协议</b>

    ModBus RTUModBus TCP

    一、两个密切相关的协议RTU 与 TCP ModBus RTUModBus TCP作为ModBus协
    的头像 发表于 02-07 10:05 2452次阅读

    MODBUS RTU传输模式介绍

    上期我们学习了,第一篇MODBUS协议基本介绍,今天我们来研究第二篇MODBUS RTU传输模式介绍
    的头像 发表于 07-19 15:58 3531次阅读
    <b class='flag-5'>MODBUS</b> <b class='flag-5'>RTU</b>传输模式<b class='flag-5'>介绍</b>

    MODBUS RTU详细解释

    Modbus 一个工业上常用的通讯协议、一种通讯约定。Modbus 协议包括 RTU、ASCII、TCP。其中
    发表于 01-12 16:39 4次下载

    Modbus-RTU通讯协议是什么?

    Modbus-RTU通讯协议是一种串行通讯协议,它可以用于连接不同类型的设备,以实现远程监控和控制。Modbus协议包括RTU、ASCII、
    的头像 发表于 05-23 15:06 94次阅读