首页 > 编程知识 正文

modbus rtu协议示例(Modbus协议解析--小白一看就懂的协议)

时间:2023-05-06 09:07:31 阅读:122705 作者:3105

文章目录问题三联Modbus是什么? 2.Modbus有什么用? 3.Modbus内容是什么? 3.1 Modbus-RTU Modbus-ascii3.1.1Modbus-RTU协议概述1 .框架2.1查询2.2修改1 .修改-0x06功能码2 .修改-0x10功能码3.1

问题三联是什么是Modbus? Modbus有什么用? 怎么用Modbus? 什么是Modbus?

yxdhb,他是bus,如果你接触到总线协议.这个协议,我相信你的行业是工业方面的,或者你的产品用于工业。

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

那么,现在明白的事情大概明白了。 这是总线协议,是mod或者什么公司发布的通信协议.那么为什么要用这个呢? 答案是他们在用,你得学,哈哈!

认真地说,在工业领域被接受的理由是具备以下三个优点:

公开,无版权要求

易于部署和维护

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

简要概括如下:免费+简单+方便修改! 不仅喜欢外国人,也喜欢中国人! )

总结: Modbus就是一种用在工业上的简单协议!

2.Modbus有什么用? 通信!

是的,所有协议都是用于通信的,协议的制定是让两个人了解根据这个协议传来的一系列数据。

例如,给你1234。 你如果没有协议,就知道这是1234。 如果有协议的话,我知道这是在问我是不是单身狗。 (哈哈,举个例子)当然,也可以表示其他意思。 具体是什么意思取决于你的协议是怎么制定的。

总结:

Modbus被用于通信呢。 我个人知道!

3.Modbus内容是什么? 我先给你官方文档。 https://download.csdn.net/download/panda5_ csdn/10534090

要了解Modbus的内容,您必须知道有多种类型:

大致分为以下:

Modbus-RTU Modbus-ASCII

Modbus-TCP

Modbus-Plus

在以上三个协议中,一个设备只有一个协议。 如果您的设备使用Modbus-RTU,则只需查看以下相应部分,而不需要查看其他部分: 因为看太多的话会混乱的,哈哈。 当然,学习的话就能全部读完。

通讯过程:

Modbus是主从方式的通信。 也就是说,无法同步通信。 一次只能向总线传输一个数据。 即主机发送,从机应答,主机不发送,总线上就没有数据通信.

3358www.Sina.com/一条总线上有一个主机,多个从机。 大师查一个从机。 首先,需要获得这些从站3358www.Sina.com/,以知道是哪个从站。 然后,给各3358www.Sina.com/分配地址,从动装置获得主机发送的数据,与地址对应的从动装置返回,主机获得从动装置的数据,就是从动装置的通信过程很简单吧?

就像打举例1:电话一样。 你必须知道对方的电话(这是唯一的地址)后再打电话。 相当于主机找从机打电话,对方打电话回答(返回数据)。 一般是这样的。

此时,如果对方在打电话,你应该问的是“sorry,you…”这一系列英语,表示对方很忙,但分配地址,也没有相应的仲裁机制。 好了,你知道另一个缺点。 但是你可以用软件的方法妥善处理数据!

3.1名为Modbus-RTU Modbus-ascii的协议基于地址必须唯一,常见介质有: 举例2:以上,这也是工业上使用最多的

在串行连接中,存在数值数据的表现差异和协议的详细情况稍有不同的两个变种。

Modbus RTU结构紧凑,采用Modbus总线不能判断对方是否忙方式,Modbus ASCII为3358www.Sina.com/

ng>表示方式。
RTU格式后续的命令/数据带有循环冗余校验的校验和,而ASCII格式采用纵向冗余校验的校验和。

3.1.1 Modbus-RTU协议

这是本人目前使用的协议,所以对这个协议比较了解.

概述

设备必须要有RTU协议!这是modbus协议上规定的,且默认模式必须是RTU,Ascii作为选项。(也就是说,一般的设备只有RTU这个协议,ascii一般很少)所以说,一般学习Modbus协议,只需要了解RTU的协议,acsii作为学习的了解就足够了。

1. 帧结构

帧结构 = 地址 + 功能吗 + 数据 + 校验

地址: 占用一个字节,范围0-255,其中有效范围是1-247,其他有特殊用途,比如255是广播地址(广播地址就是应答所有地址,正常的需要两个设备的地址一样才能进行查询和回复)

功能码:" 占用一个字节,功能码的意义就是,知道这个指令是干啥的,比如你可以查询从机的数据,也可以修改数据,所以不同功能码对应不同功能.

数据: 根据功能码不同,有不同结构,在后续的实例中有说明;

校验: 为了保证数据不错误,增加这个,然后再把前面的数据进行计算看数据是否一致,如果一致,就说明这帧数据是正确的,我再回复;如果不一样,说明你这个数据在传输的时候出了问题,数据不对的,所以就抛弃了;

2.实战

直接进实战了,是不是感觉有点虚?淡定,直接在实战中联系,更加有效!其实前面的都是废话,让你知道所以然而已,实际中用的就这些,看了就懂了!

2.1 查询

功能描述:
现在我是主机,我要查询从机地址为1的数据.
(这里我推荐使用modbus Pull这个软件,操作简单,功能强大,下载连接:https://download.csdn.net/download/panda5_csdn/10534894 如果没有积分下载,可以私信我)
于是,我需要发送以下数据:

主机发送: 01 03 00 00 00 01 84 0A
从机回复: 01 03 02 12 34 B5 33

那么这一组数据是什么意思呢?
从上面的结构图中,可以看出,大致是 地址+功能码+数据+校验;
所以解析如下:

/*发送数据解析*/01-地址03-功能码,代表查询功能,其他功能后面再说00 00-代表查询的起始寄存器地址.说明从0x0000开始查询.(这里需要说明以下,Modbus把数据存放在寄存器中,通过查询寄存器来得到不同变量的值,一个寄存器地址对应2字节数据;)00 01-代表查询了一个寄存器.结合前面的00 00,意思就是查询从0开始的1个寄存器值;84 0A-循环冗余校验,是modbus的校验公式,从首个字节开始到84前面为止;(这里新手可能不懂,这个校验就是保证数据传输过程没有错误的一种手段,不同的协议这种校验公式不一样,只需了解这个就足够了,具体怎么求的,可以直接在输出数据得到结果,地址如下:http://www.ip33.com/crc.html)/*回复解析*/01-地址03-功能码02-代表后面数据的字节数,因为上面说到,一个寄存器有2个字节,所以后面的字节数肯定是2*查询的寄存器个数;12 34-寄存器的值是12 34,结合发送的数据看出,01这个寄存器的值为12 34B5 33-循环冗余校验

好了,是不是很简单呢?基本流程就是:
发送:地址正确+我要查的寄存器个数+校验
回复:从机的地址+数据的字节数+数据+校验
就是这么简单!!!

2.2 修改

如果我要修改从机的数据呢?那么这个协议有吗,答案是Yes!

1. 修改-0x06功能码

主机发送: 01 06 00 00 00 01 48 0A
从机回复: 01 06 00 00 00 01 48 0A

诶,看上去怎么一样的啊?是不是错了?答案是这是正确的;

*发送数据解析*/01-主机要查的地址06-功能码,代表修改单个寄存器功能,修改有些不同,有修改一个寄存器和修改多个寄存器;00 00-代表修改的起始寄存器地址.说明从0x0000开始.00 01-代表修改的值为00 01.结合前面的00 00,意思就是修改0号寄存器值为00 01;48 0A-循环冗余校验,是modbus的校验公式,从首个字节开始到48前面为止;/*回复解析*/01-从机返回的地址,说明这就是主机查的从机06-功能码,代表修改单个寄存器功能;00 00-代表修改的起始寄存器地址.说明是0x0000.00 01-代表修改的值为00 01.结合前面的00 00,意思就是修改0号寄存器值为00 01;48 0A-循环冗余校验,是modbus的校验公式,从首个字节开始到48前面为止;

如果回复的一样,说明这个数据是修改成功的;如果功能码不是06,而是86,说明你发送的数据出错了;

2.修改-0x10功能码

如果我要修改多个寄存器,难道用06发好几次,这样不会太傻了吗?所以,modbus RTU协议包含了修改连续多个寄存器的方法,就是功能码为0x10;
下面先举例用0x10功能码进行一个字节的修改和0x06功能码有什么区别:

主机发送: 01 10 00 00 00 01 02 11 22 2A 19
从机回复: 01 10 00 00 00 01 01 C9

*发送数据解析*/01-主机要查的地址10-功能码,代表修改多个寄存器功能;00 00-代表修改的起始寄存器地址.说明从0x0000开始.00 01-代表修改的寄存器数量,这里开始于0x06的修改不同;02 -表示修改的总字节数,由于只修改了1个寄存器,所以数据要有两个字节;11 22-表示修改的值,结合上面,就是从第0000寄存器开始修改一个寄存器值为11 22,就是把0000寄存器改为11 22;2A 19-循环冗余校验,是modbus的校验公式,从首个字节开始到22前面为止;/*回复解析*/01-从机返回的地址,说明这就是主机查的从机10-功能码00 00-代表修改的起始寄存器地址.说明是0x0000.00 01-代表修改的寄存器数量,只需要回复这么多久足够了,从机告诉主机,你修改了哪几个寄存器就足够了;01 C9-循环冗余校验;

现在,修改多个寄存器:

主机发送: 01 10 00 00 00 02 04 11 22 33 44 42 5A
从机回复: 01 10 00 00 00 02 41 C8
(这个请读者自己解析内容,如果需要不懂之处,请评论)

归纳
modbus RTU协议只需要看懂功能码0x03,0x06,0x10这三个基本的就已经足够了;分别回想下其数据域部分:
03-主机需要发送起始地址+寄存器数量,从机回复总字节数+数据;
06-主机发送起始地址+数据内容(因为你只需要修改一个,所以起始地址就是所要修改的地址),从机返回起始地址+数据内容(发现居然一样!)
10-主机发送起始地址+寄存器个数+总字节数+数据,从机返回起始地址+寄存器数量

3.1.2 Modbus-ACSII协议 概述

一般只需要了解RTU协议,因为前面有说过,必须要有RTU协议的,所以只需要了解了RTU协议,就可以读出设备信息了,至于ACSII协议,做个大概了解

1.帧形式

对于RTU协议,比如RTU发送一个字节:0x12;
ASCII协议则需要发送2个字节:一个字节代表1,一个代表2,即31和32,才能代表0x12.
所以,acsii协议的效率比较低。

从上面的图中,看出:
1)比RTU多了起始段 :, 多个结束符CR,LF
2)地址和功能都变成了2个字节;
3)数据部分更加繁琐,但是更符合人们的查看;

归纳:
由于Modbus-RTU和modbus-ACSII都是基于232和485链路的,所以其通讯模式半双工,一般是主机和从机的模式。其差别就是其字节的格式不同,一个是16进制的数据,一个是acsii数据。
Ascii多了帧头和帧尾,也就是说可以有用这个头尾判断一帧字节来判断是否结束;而RTU没有帧头和帧尾,所以协议里明确两帧之间要大于3.5个字节时间间隔,作为一帧结束的判断依据。

对于RS485来说,总线上一般允许最大32个设备。

3.2 Modbus-TCP

以太网作为介质进行传输,

3.3 Modbus-PLUS

高速令牌传递网络

归纳:

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。