先来简单分析一条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)进行两个设备通讯,例如:

数组后面的注释,说明
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的一帧报文是如何通讯的,其实每个报文的格式都基本一样的。

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

三、MODBUS数据模型

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

五、MODBUS请求与响应
  看MODBUS协议手册,中文第 10 页开始,英文第 24 页开始。手册非常详细举例说明了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)        写多个寄存器

附录2:CRC GeneraTIon

modbus详细介绍(值得收藏)相关推荐

  1. timed_waiting线程是否占用cpu_程序CPU占用率飙升,如何定位线程的堆栈信息?超详细,值得收藏看不懂还有配套视频 第319篇...

    相关历史文章(阅读本文前,您可能需要先看下之前的系列?) 国内最全的Spring Boot系列之三 2020上半年发文汇总「值得收藏」 GraphQL的探索之路 – SpringBoot集成Graph ...

  2. labelimg如何调整框的颜色_PS学习之旅:如何更好调整画面明暗?明度、色阶详细介绍,收藏...

    ps中调色工作其实就是调整人对三要素的感受,调色是一门比较大的学问,那么调整好明暗程度对作品来说是相关重要的,本文详细介绍如何控制画面的明暗. 1工具/原料 Adobe Photoshop CS6软件 ...

  3. c 获取char*的长度_C/C++编程笔记:C语言字符串比较函数,超详细,值得收藏

    void *memset(void *dest, int c, size_t count); 将dest前面count个字符置为字符c. 返回dest的值. void *memmove(void *d ...

  4. 如何搭建socks5和ss节点_redis cluster搭建实践(非常详细,值得收藏)

    一.Redis Cluster(Redis集群)简介 redis是一个开源的key value存储系统,受到了广大互联网公司的青睐. redis集群采用P2P模式,是完全去中心化的,不存在中心节点或者 ...

  5. c 获取char*的长度_C/C++编程笔记:C语言字符串比较函数,超详细,值得收藏!...

    前方干货准备!!! void *memset(void *dest, int c, size_t count); 将dest前面count个字符置为字符c. 返回dest的值. void *memmo ...

  6. 值得收藏的十种常用的CSS框架,快码住!

    CSS框架是预先准备好的软件框架,允许使用层叠样式表语言更容易,更符合标准的进行网页设计.大多数这些框架包含至少一个栅格设计(grid). 功能更强大的框架,还配备了更多的功能和附加的基于JavaSc ...

  7. 值得收藏的十种常用的CSS框架-蛙课网

    CSS框架是预先准备好的软件框架,允许使用层叠样式表语言更容易,更符合标准的进行网页设计.大多数这些框架包含至少一个栅格设计(grid).功能更强大的框架,还配备了更多的功能和附加的基于JavaScr ...

  8. 不仅有史上最详细Docker 安装Minio Client,还附带解决如何设置永久访问和永久下载链接!!(详图)绝对值得收藏的哈!!!!

    背景: 这两天在整理知识点,然后在学习Minio,一开始遇到更新,整了我不少时间,之前用的太久了,改了不少东西.用了之后发现不知道怎么设置成永久访问,就出了这篇文章. 史上最详细Docker安装最新版 ...

  9. 史上最详细Docker安装最新版Minio 带详解 绝对值得收藏!!! 让我们一起学会使用minio搭建属于自己的文件服务器!!走上白嫖之路!解决启动了但是浏览器访问不了的原因

    让我们一起学会使用minio搭建属于自己的文件服务器!!走上白嫖之路! WARNING: Console endpoint is listening on a dynamic port (34451) ...

最新文章

  1. [译]Java 设计模式之命令
  2. java nio 阻塞_Java NIO和传统阻塞IO
  3. Sizzle系列之 选择元素
  4. java runnable 异常_JAVA 线程中的异常捕获
  5. android 音量键 广播,【Android 7.0 Audio】: 按键调节音量的调用过程
  6. 苹果的消息是从服务器接收数据,iOS 消息推送原理及简单实现
  7. 使用php发送Http请求,抓取网页数据
  8. c 字符串数组_C语言探索之旅 | 第二部分第四课:字符串
  9. 运维监控软件 wgcloud 更新,v3.2.7 重构告警模块
  10. BackTrack3(BT3破解wifi密码)
  11. 软件工程 超市库存管理系统 UML模型
  12. bootstrap批量删除操作!
  13. 有监督 VS 无监督
  14. 活性(Liveness)
  15. GEO数据库数据下载
  16. 怎么重置imac_[重置系统]如何重置Mac电脑到出厂状态
  17. 【pytorch EarlyStopping】深度学习之早停法入门·相信我,一篇就够。
  18. Angr-CTF学习笔记11-13
  19. Visual Basci中的几个函数split(),ubound(),lbound(),instr(),mid().
  20. Python-- error: [WinError 3] 系统找不到指定的路径。: 'C:\\Program Files (x86)\\Microsoft Visual Studio 14.0\\VC

热门文章

  1. 什么?有人整理了Kotlin 集合函数锦集!!
  2. Vue 教程(十八)template 标签
  3. Xcode14.3 打包ahoc闪退
  4. JAVA中StackOverflowError错误
  5. 字符串中的十六进制字符如何转换成十六进制数
  6. 我知道,我性格直爽、孤傲、执拗、任性
  7. AMD的CPU运行Matlab软件进行神经网络运算时总是出现闪退问题及解决方法
  8. 深度科技携手华为,生态共建行动第一
  9. 光耦的应用和工作原理
  10. 想要学习次世代3d建模,需要用到哪些软件,制作流程是什么?