Modbus通讯协议详细解释

Modbus通讯协议详细解释Modbus一个工业上常用的通讯协议、一种通讯约定。Modbus协议包括RTU、ASCII、TCP。其中MODBUS-RTU最常用,比较简单,在单片机上很容易实现。先来简单分析一条MODBUS-RTU报文,例如:0106000100179804010600010017

大家好,又见面了,我是你们的朋友全栈君。

Modbus一个工业上常用的通讯协议、一种通讯约定。Modbus协议包括RTU、ASCII、TCP。其中MODBUS-RTU最常用,比较简单,在单片机上很容易实现。

先来简单分析一条MODBUS-RTU报文,例如:01  06  00 01  00 17  98 04 
    01             06            00 01           00 17          98 04 
  从机地址        功能号          数据地址          数据         CRC校验

这一串数据的意思是:把数据 0x0017(十进制23) 写入 1号从机地址 0x0001数据地址。

1、报文
   一个报文就是一帧数据,一个数据帧就一个报文: 指的是一串完整的指令数据,就像上面的一串数据。

2、CRC校验
意义:例如上面的  98 04  是它前面的数据(01 06 00 01 00 17)通过一算法(见附录2,很简单的)计算出来的结果,其实就像是计算累加和那样。(累加和:就是010600010017加起来的值,然后它的算法就是加法)。
作用:在数据传输过程中可能数据会发生错误,CRC检验检测接收的数据是否正确。比如主机发出01 06 00 01 00 17 98 04,那么从机接收到后要根据01 06 00 01 00 17 再计算CRC校验值,从机判断自己计算出来的CRC校验是否与接收的CRC校验(98 04主机计算的)相等,如果不相等那么说明数据传输有错误这些数据不能要。

3、功能号
  意义:modbus 定义。见附录1。
  作用:指示具体的操作。

MODBUS-RTU
一、一个报文分析
先声明下我们的目的,我们是要两个设备通讯,用的是MODBUS协议。上面简单介绍了:“报文”“CRC校验”“功能号”。
在单片机中拿出一部分内存(RAM)进行两个设备通讯,例如:

Modbus通讯协议详细解释

 

数组后面的注释,说明
OX[20]   代表是输出线圈,用功能码 0x01,0x05,0x0F 访问, 开头地址是 0 (这个后续说明)
IX[20]    代表是输入线圈,用功能码 0x02 访问,             开头地址是 1 (这个后续说明)
另外两个一样的道理。
注意:所谓的“线圈”“寄存器”就是“位变量”“16位变量”,不要被迷惑。之所以称“线圈”我觉得应该是对于应用的设备,MODBUS协议是专门针对485总线设备(例PLC)开发的。

1、主机对从机写数据操作
如果单片机接收到一个报文那么就对报文进行解析执行相应的处理,如上面报文:
    01             06            00 01           00 17          98 04 
  从机地址        功能号          数据地址          数据         CRC校验

假如本机地址是 1 ,那么单片机接收到这串数据根据数据计算CRC校验判断数据是否正确,如果判断数据无误,则结果是:
            HoldDataReg[1]  =  0x0017;
MODBUS主机就完成了一次对从机数据的写操作,实现了通讯。

2、主机对从机读数据操作
主机进行读HoldDataReg[1] 操作,则报文是:
    01             03            00 01           00 01          D5 CA 
 从机地址        功能号          数据地址      读取数据个数       CRC校验
那么单片机接收到这串数据根据数据计算CRC校验判断数据是否正确,如果判断数据无误,则结果是:返回信息给主机,返回的信息也是有格式的:
返回内容:  
    01         03            02             0017          F8 4A
  从机地址   功能号     数据字节个数    两个字节数据    CRC校验
MODBUS主机就完成了一次对从机数据的读操作,实现了通讯。

二、MODBUS报文模型

以上了解到了MODBUS的一帧报文是如何通讯的,其实每个报文的格式都基本一样的。

Modbus通讯协议详细解释

                             
这里两个缩略词以前不知道,但是现在要明白指的是什么,“ADU”“PDU”
ADU: 应用数据单元
PDU: 协议数据单元

三、MODBUS数据模型

 

Modbus通讯协议详细解释

 

 

Modbus通讯协议详细解释

  

四、MODBUS事务处理
  下列状态图描述了在服务器侧MODBUS事务处理的一般处理过程。

Modbus通讯协议详细解释

五、MODBUS请求与响应
  看MODBUS协议手册,中文第 10 页开始,英文第 24 页开始。手册非常详细举例说明了MODBUS协议各个功能号的请求与响应。 
modbus协议在单片机上实现过程

MODBUS 任务处理函数

Modbus通讯协议详细解释

函数中,RcvBuf 为串口接收缓冲区,如果接收了一个报文则,RcvBuf[0] 为从机地址,RcvBuf[0] 为MODBUS功能号。根据功能号做出响应,而具体的操作根据功能号在各自的函数中执行,相当于解析接收到的数据。

附录1:MODBUS-RTU功能码
 最常用功能码:
 下面“线圈”“寄存器”其实分别直的就是“位变量”“16位变量”
        01 (0x01)        读线圈 
        02 (0x02)        读离散量输入
        03 (0x03)        读保持寄存器
        04(0x04)         读输入寄存器
        05 (0x05)        写单个线圈 
        06 (0x06)        写单个寄存器
        15 (0x0F)        写多个线圈 
        16 (0x10)        写多个寄存器

Modbus通讯协议详细解释

附录2:CRC Generation

 

 

Modbus通讯协议详细解释

 

 

 

 

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/157940.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • 单链表的插入删除操作(c++实现)[通俗易懂]

    单链表的插入删除操作(c++实现)

  • js动画事件_JavaScript事件

    js动画事件_JavaScript事件js之动画事件首先,动画事件主要包括以下三个animationstart,animationiteration和animationend事件,下面做简单分别介绍。animationstart该事件在css动画开始播放时触发animationiteration该事件在css动画重新播放时触发animationend该事件在css动画结束播放时触发我们知道animation主要有6个属性,分别来设置动画呈现出来哦的效果,这个在我的另一篇文章中有介绍,我这边简单展示一下。

    2022年10月10日
  • 游戏建模学习经验分享

    游戏建模学习经验分享最近通过很多师弟的交流,我发现游戏建模初学者大多存在三个大问题,一是工具的使用不够熟练,甚至有些功能还不知道,二是对布线的规范没有太大的要求和了解,三是对游戏制作流程不清晰和板绘下的功力不够,对贴图制作用工少,甚至有些人还处于一直做白膜的阶段,那么对大多说想要要学游戏建模的学习者想要学什么:低模,高模制作,贴图材质,动作特效。毕竟很多人学的并没有那么快,建模实质就是孰能生巧,做的东西多了,遇到问题多了,解决之后就会学的更多。今天就跟大家聊一聊目前我遇到新手关于建模方面的问题。1:工具使用不熟练很多师

  • 列文伯格算法_最短路径matlab程序

    列文伯格算法_最短路径matlab程序  本系列文章主要介绍基于A*算法的路径规划的实现,并使用MATLAB进行仿真演示。  一、A*算法简介    A*(A-Star)算法是一种静态路网中求解最短路径最有效的直接搜索方法,也是解决许多搜索问题的有效算法。算法中的距离估算值与实际值越接近,最终搜索速度越快。    公式表示为:f(n)=g(n)+h(n),其中,f(n)是从初始状态经由状态n到目标状态的代价估计,g(n)是在状态空间中从初始状态到状态n的实际代价,h(n)是从状态n到目标状态的最佳路径的估计代价。

  • linux阻塞与非阻塞(connect连接超时)

    非阻塞connect详情介绍可以参见文章:https://blog.csdn.net/qq_41453285/article/details/89890429一、非阻塞connect概述man手册connect的man手册有如下一段内容:EINPROGRESSThesocketisnonblockingandtheconnectioncannotbe…

  • 520表白季,教你用matlab画动态心形曲线图,可自动保存GIF格式图片,送给女朋友,她们一定会惊讶,赶紧收藏!!!

    520表白季,教你用matlab画动态心形曲线图,可自动保存GIF格式图片,送给女朋友,她们一定会惊讶,赶紧收藏!!!昨天发表了一篇用python教你画心形图表白的文章:想要表白的看这里,教你用python画不同类型的心形图虏获芳心,值得收藏!!里面详细介绍了各种心形图的画法以及最终的表白神器,值得点赞收藏!!同样matlab也可以实现相同的功能并且还可以做得更好,今天就用教你用matlab画动态心形曲线图,不信请看下面:虏获芳心matlab画动态心形曲线图matlab画动态心形曲线图(基础版)matlab画3D心形图备注matlab画动态心形曲线图利用数学上的格式f(x)=x^2^/^3+e/3*(π-x^2

    2022年10月17日

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号