2024最新版零基础学习Modbus通信协议(保姆级教程)

news2024/9/26 16:43:51

合集 - 上位机开发(2)

1.零基础学习Modbus通信协议09-13

2.RS485与ModbusRTU09-10

收起

大家好!我是付工。

2012年开始接触Modbus协议,至今已经有10多年了,从开始的懵懂,到后来的顿悟,再到现在的开悟,它始终岿然不动,变化的是我对它的认知和理解。

今天跟大家聊聊关于Modbus协议的那些事。

发展历史

Modbus于1979年诞生,已经历经了40多年。

Modbus诞生在一个特定的时期。1969年,第一台PLC的发明,解决了数字电路代替传统继电器控制的问题,10年之后,Modbus的发明,主要用于解决PLC之间通信的问题。

这些年,它凭借了免费开放、简单易懂等特点,广泛应用在工业自动化领域的各种产品中。

莫迪康当初发明Modbus时,主要针对的是串口设备,即ModbusRTU和ModbusASCII协议,后来施耐德在其基础上发明了针对以太网设备的ModbusTCP。

Modbus协议的诞生与发展,是工业自动化领域技术进步的必然结果,各种工业设备之间的数据交互,必然需要一个高效可靠的协议来支持。

即使1979年莫迪康没有发明Modbus,也许1989年恩迪康也会发明一个Nodbus出来。

协议基础

Modbus协议可以说是所有协议的基础,学习上位机开发自然也离不开它。

我认为,学习Modbus有两个层面,第一个是应用层面,第二个是报文层面。

应用层面可以让我们借助开源通信库很轻松实现设备通信;而报文层面,可以让我们自己写通信库。

可能有人会这么问,既然有开源通信库了,我们是不是就可以不用学Modbus协议报文,直接用现成的通信库?

初期也许可以,但是从长远角度来看,既然选择了上位机这条路,未来必然还会遇到各种各样的协议,而Modbus协议恰恰是一个非常好的学习和练手的机会。

我们把它当作一个跳板,我们学习它,不仅仅是为了使用它,也为理解其他协议奠定一个扎实的基础。所以初学时,一定不要错过这个机会,否则,你会折返跑的。

存储区分类

我喜欢站在协议制定者角度,并结合身边的一些事物来介绍Modbus协议。

首先我们要明确,协议的目的是为了实现数据交互。

么,我们先从【数据】入手,数据必然需要一个载体,自然就有了存储区的概念,这个存储区类似于我们电脑的硬盘。

硬件要分区,存储区也要分类。

至于如何分类,首先我们想到根据数据类型来分,但是不可能每个数据类型分一个,那样太多了,我们将布尔和非布尔分开,因此就有了线圈和寄存器的概念。

在电气回路中,接触器和中继都是靠线圈得电和失电来控制,因此用线圈来表示布尔,而寄存器在PLC中也是用来存储数据的,因此用寄存器来表示非布尔,一个寄存器就表示一个Word。

Modbus更类似于日系和国产PLC,线圈存储区类似于X、Y、M存储区,寄存器存储区类似于D、W、H存储区。

X和Y同样是线圈存储区,X表示的是输入,Y表示的是输出,输入意味着该存储区数据由外部设备接入,是只读的,输出表示输出给外部设备,是可读可写的。

因此,Modbus的线圈和寄存器存储区,还需要按照读写特性,进一步细分,因此形成了Modbus的4个存储区,如下表所示:

序号读写存储类型存储区名称
1只读线圈输入线圈
2读写线圈输出线圈
3只读寄存器输入寄存器
4读写寄存器保持型寄存器

存储区代号

存储区名称是一个完整称呼,实际应用的时候会比较麻烦,因此我们会给这些存储区取一个代号,这个和PLC是一样的,PLC我们只说X区、Y区、D区,只不过PLC使用的是字母作为代号,而Modbus使用的是数字,于是便有了存储区代号表:

存储区名称存储区代号
输入线圈1区
输出线圈0区
输入寄存器3区
保持型寄存器4区
这个存储区代号中是没有2区的,这个其实没有理由,也许就是莫迪康单纯的不喜欢2这个数字,这一点和我们国人一样。

Modbus地址

任何一个存储区都是有范围的,比如西门子的M区只有8192个字节,三菱的D区有8000个字,高端系列有18000个字,我们电脑硬盘也是,以前500G很大了,现在动辄1T、2T,都终究有个范围,因此Modbus的存储区也是有范围的,不可能无限大。

Modbus协议是这么规定的,每个存储区最多可能存放65536个线圈或寄存器,这个范围已经很大了。存储区地址是从0开始的,那么对于每个存储区来说,地址范围则从0到65535。

存储区名称存储区地址
输入线圈0-65535
输出线圈0-65535
输入寄存器0-65535
保持型寄存器0-65535

这时候会遇到一个问题,比如你跟别人说地址100,别人是不知道是哪个存储区的100,因为每个存储区都有100,那么如何解决这个问题呢?

我们来看下PLC是如何定义的,首先看一个PLC的变量地址,比如D100,这个D100是由D+100组合而成,D是存储区代号,100是地址偏移量,这样的地址模型就直接包含了存储区,这里的D100我们可以理解为绝对地址,而后面的地址偏移量100可以理解为相对地址。

所谓绝对地址,就是通过地址名称,就能明确知道是什么存储区的第几个位置的数据,而相对地址就是地址偏移量,因此绝对地址是唯一的,而相对地址,每个存储区都有。

Modbus仍然遵守这个公式:绝对地址=存储区代号+相对地址。

Modbus和PLC有两个地方不同:

1、PLC的存储区代号是字母,所以可以直接拼接,但是Modbus的存储区代号是数字,如果直接拼接,会导致地址混乱,比如4区的第10个地址,叫410,而0区的410地址也是410,因此必须要保证总长度固定,相对地址始终占5位,不足补0,于是便有了下面的表格,该表格只是当前理解下的表格,并不是最终正确的表格:

2、Modbus协议规定:以保持型寄存器存储区为例,第一个地址不是400000,而是400001,这个是由Modbus规约决定的,其他存储区也是同样的道理。因此正确的Modbus存储区范围如下表所示:

前面提到过,65536是一个非常大的范围,在实际使用中,我们可能根本用不到这么多地址。于是为了使用方便,还有一种短地址模型,即5位地址模型,前面的称为长地址模型,即6位地址模型,短地址模型存储区范围如下表所示:

 直到这里,我们才看到了熟悉的40001,40001这个地址是这样逐步演变出来的。

功能码

我们回到原点,协议的目的是为了实现数据交互。

前面一直在围绕【数据】,下面围绕【交互】说明。

交互即读写。

我们已经有了4个不同的存储区,那么我们对这些存储区的读写,必然会产生很多不同的行为,比如读取输出线圈和写入输出线圈,即为2种不同的行为。我们给这些行为取个代号,即为功能码。

功能码就是Modbus读写行为的代号。

那么会有多少种不同的行为呢?

读取和写入是2种不同的动作,而对象即为4个存储区,排列组合即为2*4=8个,但是输入线圈和输入寄存器是不能写入的,因此8-2=6,如下图所示:

序号具体行为
1读取输入线圈
2读取输出线圈
3读取输入寄存器
4读取保持寄存器
5写入输出线圈
6写入保持型寄存器

Modbus协议规定:对写入输出线圈和写入保持型寄存器进行细分,分为单个写入和多个连续写入,因此前面的6种行为又变成了8种形成,同时给每个行为取个代号,即形成了我们常说的8大功能码,如下图所示:

功能码功能说明
0x01读取输出线圈
0x02读取输入线圈
0x03读取保持寄存器
0x04读取输入寄存器
0x05写入单个线圈
0x06写入单个寄存器
0x0F写入多个线圈
0x10写入多个寄存器
Modbus协议除了这8种常用的读写功能码,还有一些用于诊断异常的功能码,但是一般很少使用,了解即可。

协议分类

Modbus协议是一个统称,有三个协议家族,分别是ModbusRTU、ModbusASCII和ModbusTCP。

我们常说A和B之间进行Modbus通信,这句话是不严谨的,应当明确指出具体使用哪种通信协议。

一般情况下,ModbusRTU和ModbusASCII用于串行通信,ModbusTCP用于以太网通信,但是这并不是绝对的,因为Modbus协议只是一种应用层的协议,并没有指定物理层,比如,ModbusRTU协议也可以使用在以太网中进行数据传输。

如果准确划分,应该有7种不同的通信方式,我们实际主要使用ModbusRTU和ModbusTCP,其他的使用较少。

报文格式

针对ModbusRTU、ModbusASCII、ModbusTCP这三种不同的协议,在学习时,并不需要学习三次,只要把某一种弄明白,其他两种很容易上手,一般我们以ModbusRTU作为入口,先学习ModbusRTU协议,ModbusASCII了解即可,再学习ModbusTCP协议,下面分别对这三种协议的报文格式进行说明:

1、ModbusRTU的通用报文格式如下:第一部分:从站地址,占1个字节

第二部分:功能码,占1个字节

第三部分:数据部分,占N个字节

第四部分:校验部分,CRC校验,占2个字节

2、ModbusASCII的通用报文格式如下:

第一部分:开始字符(:)

第二部分:从站地址,占2个字节

第三部分:功能码,占2个字节

第四部分:数据部分,占N个字节

第五部分:校验部分,LRC校验,占2个字节

第六部分:结束字符(CR LF)

3、ModbusTCP的通用报文格式如下:

第一部分:事务处理标识符,占2个字节

第二部分:协议标识符,占2个字节

第三部分:长度,占2个字节

第四部分:单元标识符,占1个字节

第五部分:功能码,占1个字节

第六部分:数据部分,占N个字节

具体报文内容通过后面的文章进行阐述。

Modbus学习成本很低,因为协议是公开免费的,而且有很丰富的调试工具,甚至可以在不购买任何硬件的情况下,把Modbus协议学得很透彻。

当然如果有条件,购买一些硬件配合学习,效果更佳。

https://blog.csdn.net/liwuqianhzc/article/details/141269671?spm=1001.2100.3001.7377&utm_medium=distribute.pc_feed_blog_category.none-task-blog-classify_tag-2-141269671-null-null.nonecase&depth_1-utm_source=distribute.pc_feed_blog_category.none-task-blog-classify_tag-2-141269671-null-null.nonecase

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2137679.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

STM32的寄存器深度解析

目录 一、STM32 寄存器概述 二、寄存器的定义与作用 三、寄存器分类 1.内核寄存器 2.外设寄存器 四、重要寄存器详解 1.GPIO 相关寄存器 2.定时器相关寄存器 3.中断相关寄存器 4.RCC 相关寄存器 五、寄存器操作方法 1.直接操作寄存器 2.使用库函数操作寄存器 六…

4个方法教你图片转PDF怎么弄。

我们有时候会接触了一些重要的图片文件或者资料,想要装换成可编辑的PDF格式,更方便自己管理。这时候就会需要转换的工具,我这里就有4款可以完成这种转换的高效工具可以分享给大家。 1、365PDF转换软件 直通车:www.pdf…

软件设计之JavaWeb(3)

软件设计之JavaWeb(3) 此篇应在MySQL之后进行学习: 路线图推荐: 【Java学习路线-极速版】【Java架构师技术图谱】 尚硅谷全新JavaWeb教程,企业主流javaweb技术栈 资料可以去尚硅谷官网免费领取 此章节最好学完JDBC观看 学习内容: 请求转发…

jenkins流水线+k8s部署springcloud微服务架构项目

文章目录 1.k8s安装2.jenkins安装3.k8s重要知识1.简介2.核心概念3.重要命令1.查看集群消息2.命名空间3.资源创建/更新4.资源查看5.描述某个资源的详细信息6.资源编辑7.资源删除8.资源重启9.查看资源日志10.资源标签 4.k8s控制台1.登录2.界面基本操作1.选择命名空间2.查看命名空…

损耗金属件检测系统源码分享

损耗金属件检测检测系统源码分享 [一条龙教学YOLOV8标注好的数据集一键训练_70全套改进创新点发刊_Web前端展示] 1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 项目来源AACV Association for the Advancement of Computer V…

全球和局部精细化:提升大模型推理能力的新方法

人工智能咨询培训老师叶梓 转载标明出处 尽管大模型在数学、科学或编程任务上表现出优异的推理精细化能力,但它们在没有外部反馈的情况下,很难识别何时何地需要精细化。为了解决这一问题,来自Meta的FAIR团队和佐治亚理工学院的研究者们提出了…

智能营销才是营销的未来

智能营销新纪元:大模型如何为运营与产品经理赋能 在数字化浪潮席卷全球的今天,营销行业正经历着一场前所未有的变革。随着人工智能技术的飞速发展,特别是大模型技术的兴起,为产品经理和运营人员提供了前所未有的工具与视野&#…

雷·达利欧(Ray Dalio)的20条《原则》

达利欧在《原则》(Principles)一书中总结了许多实用的原则。这些原则被广泛认同,并且适用于多种情景。以下是20条核心原则的英语原文以及中文翻译: 1. Embrace reality and deal with it. 翻译: 拥抱现实并应对它。适合场景: 适用…

c++中的继承和多态

目录 Linux中的管道通信 ​编辑派生类的默认成员函数 继承 派生类的构造 隐藏 如何设计一个不能被继承的类 菱形继承 virtual virtual是如何解决的 内存对象模型 继承和组合 继承 组合 多态 概念 多态的构成条件 虚函数的重写 Linux中的管道通信 派生类的默认成…

[数据集][目标检测]俯拍航拍森林火灾检测数据集VOC+YOLO格式6116张2类别

数据集格式:Pascal VOC格式YOLO格式(不包含分割路径的txt文件,仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数):6116 标注数量(xml文件个数):6116 标注数量(txt文件个数):6116 标注…

Lombok介绍

一、Lombok 1.1何为Lombok Lombok是Java的一个库,是一个工具,使用这个工具能够使得我们通过使用注解的方式减少Java中代码的开发。其简化主要是针对Java中的简单Java对象(就是无继承、无实现的)类。我们化简的就是这些类中重复冗余出现的构造函数&#…

运算符学习

ctrlaltL 自动格式化代码 原码反码补码 负数用反码去计算不会出错。跨零就会出错。补码解决了 字节-128到127

双指针的用法以及示例

当然可以!双指针(Two Pointers)是一种常用的算法技巧,特别适用于处理数组或链表等线性数据结构的问题。以下是双指针用法的总结: 双指针用法总结 基本概念: 双指针技术使用两个指针在数据结构上进行遍历&a…

SpringBoot集成Thymeleaf模板引擎,为什么使用(详细介绍)

学习本技术第一件事:你为什么要使用,解决什么问题的? 1.为什么使用(使用背景)? 首先应用场景是单体项目,如果是前后端分离就不用关注这个了,因为单体项目你前后端都是写在一个项目…

关于决策树的一些介绍(二)

我之前写过一篇关于决策树的文章,但在那篇文章里没有提及基尼系数,信息熵与信息增益等相关问题,所以我将在这篇文章中进行补充。 一、 决策树的一份python代码 首先,我先给出一份最基础的决策树代码,在这里&#xff…

在 Python 画图中同时设置中英文字体

前言 在使用matplotlib.pyplot画图时,默认情况下都是黑体字,很不美观。如果含有中文,可能无法显示;显示了中文之后英文字体就不能使用。本文针对这些问题逐一给出解决方案。 同时设置中英文字体 我们都知道,按照下面的…

00898 互联网软件应用与开发自考复习

资料来自互联网软件应用与开发大纲 南京航空航天大学 高纲4295和JSP 应用与开发技术(第 3 版) 马建红、李学相 清华大学出版社2019年 识记:要求考生能够识别和记忆本课程中有关互联网软件开发与应用的概念性内容,并能够根据考核的不同要求,做出正确的表述、选择和判断。领会…

合资油车断崖式崩盘,买车的千万慎重了

文 | AUTO芯球 作者 | 雷慢 合资车,燃油车全体大逃亡的时候来了, 你敢信吗,8月份,国内新能源汽车零售渗透率达到54%, 我给大家讲个冷笑话, 几个月前还有车企老总说什么, “只要传统车企一发…

linux 操作系统下的curl 命令介绍和使用案例

linux 操作系统下的curl 命令介绍和使用案例 1. curl 命令简介 curl 是一个利用 URL 规则在命令行下工作的文件传输工具。它支持文件的上传和下载,是综合传输工具,但传输的协议主要是 HTTP/HTTPS 和 FTP。curl 还支持很多种类型的服务器认证方式&#…

网络(三)——协议是什么???

文章目录 协议的概念结构化数据网络计算机服务端定制协议客户端代码 协议的概念 计算机之间的传输媒介是光信号和电信号。通过 “频率” 和 “强弱” 来表示 0 和 1 这样的信息。要想传递各种不同的信息,就需要约定好双方的数据格式。 结构化数据 我们知道TCP是面向…