文章目录

  • 提问三连
  • 1.什么是Modbus?
  • 2.Modbus用来干什么?
  • 3.Modbus的内容是什么?
    • 3.1 Modbus-RTU+Modbus-ASCII
      • 3.1.1 Modbus-RTU协议
        • 概述
        • 1. 帧结构
        • 2.实战
            • 2.1 查询
          • 2.2 修改
            • 1. 修改-0x06功能码
            • 2.修改-0x10功能码
      • 3.1.2 Modbus-ACSII协议
        • 概述
        • 1.帧形式
    • 3.2 Modbus-TCP
    • 3.3 Modbus-PLUS

提问三连

什么是Modbus?
Modbus用来干什么?
Modbus怎么用?

1.什么是Modbus?

顾名思义,他是一个bus,即总线协议.如果你接触到这种协议,相信你所处的行业是工业方面或者你的产品用于工业.

Modbus是一种串行通信协议,是Modicon公司(现在的施耐德电气 Schneider Electric)于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是主从方式通信,也就是说,不能同步进行通信,总线上每次只有一个数据进行传输,即主机发送,从机应答,主机不发送,总线上就没有数据通信.(所以说,这也算是一个缺点了)

举例1: 一个总线上有一个主机,多个从机,主机查询其中一个从机,首先你必须得这些从机分配地址(这样才能知道哪个从机,而且每个地址必须唯一),分配好地址后,主机要查询,然后数据下发(数据内容下面会介绍),从机得到主机发送的数据,然后对应地址的从机回复,主机得到从机数据,这样就是一个主机到从机的通信过程,是不是很简单呢?

举例2: 就像打电话,你得知道对方的电话(这就是唯一地址),然后你打电话过去,相当于主机查找从机,然后对方接通电话,给你回复(返回数据);正常是这样的.
如果这时候,对方正在打电话,你应该听到的是"sorry,you…"这一串英文,说明对方忙,但是Modbus总线不能判断对方是否忙,也没有对应的仲裁机制,好了你又知道了一个缺点了!但是,你可以在用软件的办法进行适当的处理数据!

3.1 Modbus-RTU+Modbus-ASCII

这种协议是基于异步串行通信上,一般的介质有:RS-232,RS485,RS-422上,这也是工业上使用的最多的;

对于串行连接,存在两个变种,它们在数值数据表示不同和协议细节上略有不同。
Modbus RTU是一种紧凑的,采用二进制表示数据的方式,Modbus ASCII是一种人类可读的,冗长的表示方式。
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 34
B5 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

高速令牌传递网络


归纳:

Modbus协议解析--小白一看就懂的协议相关推荐

  1. 小白一看就懂的前后端接口连接

    作为刚入职的小白,总是听前辈们说"连接口很简单的 ,一看就懂",由于鄙人实在是才疏学浅,实在是绕的头晕眼花,不知道怎么肥事.于是耐心用一下午仔细研究每一句代码,研究他们之间的联系, ...

  2. C语言--getchar()函数超详细解析(多维度分析,小白一看就懂!!!)

    目录 一.前言 二.什么是getchar()函数 三.getchar()函数的返回类型与机制 四.连续单个字符串 (代码演示) 五.getchar()函数其他用法,实战演练(重点) (1)按照题目写出 ...

  3. 动态内存分配:malloc、calloc、realloc(超详解析,多维度分析,小白一看就懂!!!!)

    目录 一.前言 二.动态内存的简单介绍

  4. Spring Framework框架起步,小白都看得懂(官翻版)!

    写在开头 本篇章介绍Spring框架的完整的全部技术.写这篇文章的目的是,一方面为了给初入后端开发的才子一篇入门指导,另一方面是为了自己对于基础知识的查阅. Spring不一定是最好的框架(虽然综合能 ...

  5. 小白都看得懂的使用Python生成随机验证码图片,以及后续优化方案

    环境:Anaconda3-2020.02 首先我们分解一下需要做什么: 生成随机的字母字符串 生成生成随机的背景色 生成随机的字体颜色 把随机的字符串用随机的颜色渲染,然后放到一块随机的背景色上面,基 ...

  6. Unity的AB包超详细+代码注释,小白一看就懂!

    基本概念 1.什么是资源? 在Unity的Assets目录下的文件,在游戏运行过程中需要从此目录加载并显示到屏幕上的都可以称之为Unity资源,例如模型.材质.纹理.预制体.脚本.声音.数据文档.动画 ...

  7. Arcgis: 利用xls文件绘制地图+细节参数调整(新手小白一看就懂)

    软件版本: 用到的地理数据库: 国家基础地理数据400万 常用链接: 地图底图(国家基础地理数据 / 在线底图 / BIGEMAP抠底图) 标准底图服务系统 全国地理信息资源目录服务系统 在线经纬度转 ...

  8. 微信提现——企业付款到零钱demo(超详细小白都看得懂的)

    一.p12证书下载 企业付款到零钱API (建议多看) apiclient_cert.p12证书:在微信商户平台–>账户设置–>API安全–>证书中下载的 . (自行下载) 二.开发 ...

  9. php - 超详细将 pdf 文档格式转换为图片格式,将 offce pdf 演示文稿转成图像 png / jpg(小白一看就懂的详细教程,附带完整示例源代码)

    效果图 其他教程都有点乱而且有bug,本文站在新手小白的角度比较靠谱,超详细的完整流程及详细注释代码. 本文实现了 php 将 pdf 文档转为图片(png / jpg),完整流程及示例源代码, 你可 ...

最新文章

  1. 【综述】MV3D-Net、AVOD-Net 用于自动驾驶的多视图3D目标检测网络
  2. cocos2dx 字体外发光_Ps教程:只需4个图层!即可制作出超炫酷的荧光字体
  3. jquery ajax中使用jsonp的限制[转]
  4. min-height最小高度的实现(兼容IE6、IE7、FF)
  5. Java UDP Demo
  6. python正则表达式函数match()和search()的区别详解
  7. .Net+MySQL组合开发(二) 数据访问篇
  8. 怎样制作滴滴截图_滴滴老了吗?
  9. Ubuntu Linux系统环境变量配置文件
  10. 华为v5服务器安装操作系统,v5服务器
  11. 在Updatepanel中使用Response.Redirect
  12. CSS3 box-shadow实现纸张的曲线投影效果
  13. 税收征管信息系统_聚焦湖北税收征管信息系统正式切换上线啦! 首日办理业务逾26万件...
  14. iOS_SN_深浅拷贝( 百度的)_转载
  15. CAD2020软件安装教程【搬运】
  16. HTML5 CSS3做的一个静态的苹果官网首页
  17. gsoap 的好网站 http://www.cs.fsu.edu/~engelen/soapexamples.html
  18. 网络交换机的主要作用是什么?
  19. VBA自定义函数TEXTJOIN CONCAT FILTER EVALUATE
  20. linux创建任务栏图标

热门文章

  1. 【高级篇 / FortiGate-VM】(6.4) ❀ 04. 虚拟 PC 通过 FortiGate VM 上网 ❀ FortiGate 防火墙
  2. Linux下黑白棋c语言程序,黑白棋(C语言源程序)
  3. 【论文阅读】Multi-Modal Sarcasm Detection 图文反讽识别
  4. 忍者必须死3突然服务器维修,忍者必须死3开服补偿内容介绍
  5. E18-D80NK红外避障传感器使用(附32单片机源码)
  6. 开箱即用的百度开放域信息抽取的统一框架UIE
  7. Matlab GUI编程技巧(十):ui figure函数创建可视化图窗
  8. 学习笔记整理:Photoshop软件应用-图层的应用和渐变工具
  9. 从国足1:5输泰国看项目管理之项目失败责任该有谁负
  10. 超全的 爬虫+反爬虫+加密数据破解+JS逆向 干货教程,建议收藏!