首页 > 编程知识 正文

制定modbus通讯协议,modbus通讯协议怎么理解

时间:2023-05-05 12:57:02 阅读:125451 作者:597

摘要昨天,一群朋友在群里询问关于Modbus的通信协议,大家都给予了积极的回答,今天,果哥总结了Modbus的相关知识,适合正在入门的朋友“吃” 还是用理论实战的方式解答,大人物不要喷。

什么是Modbus? 甜蜜的夏天,那是巴士协议。 例如,串行协议、IIC协议和SPI都是通信协议。 你接触了这个协定,相信你的行业是工业方面的,或者你的产品被用于工业。

那么,我现在知道的恐怕是知道的。 这是总线协议,是mod或什么公司发布的通信协议。 那为什么要用这个呢? 答案是他们在用,你得学,哈哈!

认真地说,被产业领域接受的理由有以下三个优点

发布且无版权的要求对供应商来说,修改移动本地位或字节没有太大限制,简单概括为免费+简单+方便修改

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

2.Modbus有什么用? 通信

是的,所有协议都是用于通信的,协议的制定是让两个人了解根据这个协议传来的一系列数据。 例如,给你6666。 如果没有合同,我只知道这是6666。 如果有合同的话,我就知道这是问我是不是大人物。 当然,也可以表示其他意思。 具体是什么意思取决于你的协议是怎么制定的。

总结:Modbus用来通信喽,是个人都知道!

3.Modbus内容是什么? 大致分为以下:

Modbus-RTU Modbus-ascii Modbus-TCP以上三个协议中,一个设备只有一个协议。 如果使用Modbus-RTU,则只需查看以下相应部分,大多数设备通常都是Modbus-RTU协议:

4 .通信进程Modbus为主从方式通信。 也就是说,不能同步通信。 每次只向总线传输一个数据。 也就是说,如果主机发送,从机响应,主机不发送,则总线上没有数据通信。 (所以,这也是缺点)

举例1:一条总线上有一个主机、多个从机。 大师查一个从机。 首先必须给这些从机分配地址。 分配地址后,大师会查的。 然后数据分发(数据内容在后面叙述),获取主机发送的数据。

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

这个时候,如果对方在打电话,你应该问的是“sorry,you…”这样一系列的英语,说明对方很忙。 但是,Modbus总线无法判断对方是否忙,也没有相应的仲裁机制。 好了,你又知道一个缺点。 但是你可以用软件的方法妥善处理数据!

5 Modbus-RTU协议设备必须要有RTU协议!这是Modbus协议上规定的,且默认模式必须是RTU,ASCII作为选项(也就是说,常见的设备只有RTU协议,而ASCII通常很少),因此要学习Modbus协议,通常需要使用RTU协议

1、框架结构帧结构 = 地址 + 功能吗 + 数据 + 校验

地址:占用1个字节,范围为0-255,其中有效范围为1-247,还有其他特殊用途。 例如,255是广播地址。 (广播地址是对所有地址的响应,通常需要像对两个设备的地址一样进行查询和回复。

33558www.Sina.com/:1:占用一个字节。 功能代码的意思是知道这个命令在做什么。 例如,可以调查从站的数据,修改数据,因此根据功能代码支持不同的功能。

功能码:结构因功能代码而异。 用后面的实例说明。

数据:为了确保数据没有错误,增加它,然后计算上一个数据以查看数据是否匹配,如果匹配,则表示该帧中的数据正确,并返回如果错了的话,你这个数据在传输中有问题,数据错了,所以扔了。

2、实战中只讲理论可能不太明白,举个例子吧。 记住modbus-RTU协议一般我们使用的功能代码是03和06。 大多数在Modbus中检查传感器上的信息,在03中检查功能代码。 需要修正传感器寄存器的值时,在06中修正功能代码。 其他的都不需要太在意。 学了很多也记不住。 哈哈哈!

2.1查询功能代码0x03功能说明:现在我是主机。 查询从站地址为1的数据。 我现在用电脑的modbus调试助手代替注意,用stm32代替从机。

需要发送以下数据:

主机发送: 01 03 00 00 00 01 84 0

A从机回复: 01 03 02 19 98 B2 7E

那么这一组数据是什么意思呢?

从上面的结构图中,可以看出,主机发送的数据大致是 地址+功能码+数据+校验;

所以解析如下:

发送数据解析

01-地址,也就是你传感器的地址03-功功能码,03代表查询功能,查询传感器的数据00 00-代表查询的起始寄存器地址.说明从0x0000开始查询。这里需要说明以下,Modbus把数据存放在寄存器中,通过查询寄存器来得到不同变量的值,一个寄存器地址对应2字节数据00 01-代表查询了一个寄存器.结合前面的00 00,意思就是查询从0开始的1个寄存器值84 0A-循环冗余校验,是modbus的校验公式,从首个字节开始到84前面为止; 回复数据解析

01-地址,也就是你传感器的地址03-功功能码,03代表查询功能,查询传感器的数据。这里要注意的是注意发给从机的功能码是啥,从机就要回复同样的功能码,如果不一样说明这一帧数据有错误02-代表后面数据的字节数,因为上面说到,一个寄存器有2个字节,所以后面的字节数肯定是2*查询的寄存器个数;19 98-寄存器的值是19 98,结合发送的数据看出,01这个寄存器的值为19 98B2 7E-循环冗余校验

好了,是不是很简单呢?基本流程就是:

发送:从机的地址+我要干嘛的功能码+我要查的寄存器的地址+我要查的寄存器地址的个数+校验码

回复:从机的地址+主机发我的功能码+要发送给主机数据的字节数+数据+校验码

就是这么简单!

2.2 修改功能码0x06

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

1、修改-0x06功能码

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

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

发送数据解析

01-主机要查询的从机地址06-功能码,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,而是别的,说明从机回复的数据有误,主机可以做相应的处理。

2、修改-0x10功能码

如果我要修改多个寄存器,难道用06发好几次,这样不会太傻了吗?所以modbus RTU协议包含了修改连续多个寄存器的方法,就是功能码为0x10;这个大家自己去查询,基本和上面的数据格式差不多。

归纳

Modbus-RTU协议只需要看懂功能码0x03、0x06、0x10这三个基本的就已经足够了;分别回想下其数据域部分:

0x03–主机需要发送起始地址+寄存器数量,从机回复总字节数+数据;

0x06–主机发送起始地址+数据内容(因为你只需要修改一个,所以起始地址就是所要修改的地址),从机返回起始地址+数据内容(发现居然一样!)

0x10–主机发送起始地址+寄存器个数+总字节数+数据,从机返回起始地址+寄存器数量

6 Modbus-ACSII协议

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

1.帧形式

对于RTU协议,比如RTU发送一个字节:0x12;ASCII协议则需要发送2个字节:一个字节代表ASCII码1,一个代表ASCII码2,即0x31和0x32,才能代表0x12。所以,ASCII协议的效率比较低。但是ASCII更符合串口打印查看,因为串口发送的数据一般都是文本模式(ASCII),比如用RTU协议,你发送06串口可以把06正常显示出来,但是用ACSII协议,你发送06串口是不能正常显示的,因为06是不可显示字符。

从上面的图中,看出:

1)比RTU多了起始段:,多个结束符CR,LF

2)地址和功能都变成了2个字节;

3)数据部分更加繁琐,但是更符合人们的查看;

2.归纳

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

备注

最后再补充点:Modbus从设备的回应数据格式是:1、回应的数据包与主机查询的数据包格式一致。从机正常回应时:功能码与主机发送的功能码一致(1-127)
如果异常回应时:功能码要在收的主机的功能码的基础上加128。不要问为啥加128,你去问造协议的那一帮人吧!

因为电脑只支持USB,所以我们需要把USB转TTL串口,再转成485接口之后与单片机相连,这是硬件最基本的,但是也需要注意。

最后修改了一下串口调试助手,加了一个CRC校验的功能,后台回复:Modbus-ly,就可以获取。

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