通过上一篇《Modbus协议概述及实例详解(一)》相信大家已经了解到Modbus的相关原理以及应用,也了解到了Modbus中在RTU/ASCII/TCP三种协中必不可少协议RTU协议。本章将详细讲解关于Modbus RTU协议的相关内容并附带源码一份,以帮助有需要的读者朋友可以快速开发迭代自己的软件。
1、Modbus RTU帧结构是什么样的?
解:
帧结构 = 地址 + 功能码 + 数据 + 校验;
地址:占用一个字节(0~255),其中有效范围是1~247,其他地址有特殊用途,如:255是广播地址;
功能码:占用一个字节,其意义就是表明该指令的意义;
数据:根据不同的功能码,其数据也有不同的意义及结构;
校验:为确保数据的安全性,增加相关的校验对校验码前的数据进行计算,接收方根据其值以及帧内容确定接收的数据是否一致。如:一致,就执行相关功能,反之则忽略其数据并舍弃。
2、功能码有什么用?
解:功能码是Modbus定义其数据的作用,现在在这里简单举例常见的功能码进行讲解,感兴趣的朋友可以看看附件的源码就行查阅。
3、查询功能码0x03
解:
主机发送 01 03 00 00 00 01 FF FA
01:地址;
03:功能码,查询功能;
00 00:寄存器地址,其表示从00 00的寄存器地址开始查询。可能大家有疑惑,这里说明一下,Modbus是把数据存放在寄存器中,通过查询寄存器获取不同变量的值,一个寄存器地址对应2Byte数据;
00 01:查询寄存器的数量,表示查询一个寄存器;
FF FA:循环冗余校验,是Modbus的校验公式(不唯一),从首个字节开始到FF前面的数据为止。
从机回复:01 03 02 19 98 FF 48
01:地址;
03:功能码;
02:表示后面数据的字节数;
19 98:表示所查询寄存器的值为19 98;
FF 48:循环冗余校验。
即:
发送:从机地址+我要干嘛+我要查的寄存器的地址+我要查的寄存器地址的个数+校验码
回复:从机地址+主机回复我的功能码+发送给主机数据的字节数+数据+校验码
4、修改功能码0x06
解:
主机发送:01 06 00 00 00 01 FF 0A
01:要查询的地址;
06:功能吗,修改单个寄存器;
00 00:表要修改的起始寄存器地址,00 00;
00 01:修改寄存器的值为 00 01;
FF 0A:循环冗余校验。
从机回复:01 06 00 00 00 01 FF 0A
01:返会自己的地址,即当前从机地址为01;
06:功能吗,主机发什么就回什么;
00 00:表示修改的寄存器起始地址;
00 01:表示修改的值为00 01;
FF 0A:循环冗余校验。
即:从机回复的数据与主机一致,表明修改成功。
5、修改功能码0x10
解:前面讲了修改功能码0x06,那么在我们实际应用,若涉及多个寄存器修改,那是不是意味着要发送多次关于0x06功能码?当然不是啦,Modbus协议不会这么傻,Modbus有一个功能码0x10,可以修改连续寄存器。其方法与0x06类似。有不明白的朋友可以私信作者或评论区留言。
6、结论
作者想说的是,Modbus协议只需要看懂0x03、0x06与0x10基本就足够使用了。
标签:00,01,Modbus,地址,源码,FF,寄存器,详解 From: https://blog.csdn.net/qq_40939768/article/details/143110064