嵌入式系统中详解 Modbus 通信协议(清晰易懂)

news2024/11/24 19:53:11

本文总结关于 Modbus 相关的知识,浅显易懂,旨在对 Modbus 有一个很直观的了解。如有错误,欢迎修改意见和建议。

什么是协议

在了解什么是Modbus之前,我们先来看下什么是协议。

协议是一个汉语词汇,读音为xié yì,意思是共同计议,协商;经过谈判、协商而制定的共同承认、共同遵守的文件。

简单地说,在我们的单片机之间互相通信,以及单片机和上位机通信中,规定了不同的内容规范,这个规范是通信的双方都需要遵守的,这样就可以实现两者的通信。

而这个协议规范可以有很多种,来适应不同的设备以及通信要求等,我们常见的就有 IIC SPI UART 串口通信协议等等。而 Modbus 也是一个串行通信协议。

什么是 RS-485 RS-232

我们在看Modbus的时候,经常会看到485串口,232串口,这些是什么呢?

RS232,RS485是一种电平标准。

数据在通信双方之间传输,本质是传输物理的电平,比方说传输5V的电压 -1V的电压信号,这些物理信号在传输过程中会受到很多干扰,比方说你传输一个5V的电压,到了接收端可能就变成了4.8V,并且通信的双方高低电平的参考电压可能不同。

那么这个时候就需要一个电平标准,来判断多少V的电压是高电平 1,多少V的电压是低电平 0,这就诞生了 RS-485 RS-232

RS232:是电子工业协会(Electronic Industries Association,EIA) 制定的异步传输标准接口,同时对应着电平标准和通信协议(时序),其电平标准:+3V~+15V对应0,-3V~-15V对应1。

  • 全双工

  • 逻辑1:-15V–5V

  • 逻辑0:+3V–+15V

RS485:RS485是一种串口接口标准,为了长距离传输采用差分方式传输,传输的是差分信号,抗干扰能力比RS232强很多。两线压差为-2~-6V表示0,两线压差为+2~+6V表示1。

  • 半双工

  • 逻辑1:+2V~+6V

  • 逻辑0:-2V~ -6V

  • 注意485的电平指的是485-A和485-B两根传输线,两线间的电压差。而不是传输线上的电压。

也就是 RS-485 电平标准确定传输过来的数据是 0 还是 1,在此基础上,这些字节数据根据 modbus 通信协议来进行数据的交互传输。

  • 硬件层协议:解决0和1的可靠传输,常有RS232、RS485、CAN、IIC、SPI …

  • 软件层协议:解决传输目的,常有Modbus、TCP/IP、CANopen …

Modbus 协议说明

Modbus诞生于1979年 莫迪康公司 后来被施耐德电气公司收购。Modbus提供通用语言用于彼此通信的设备和设备。

Modbus已经成为工业领域通信协议的业界标准,并且现在是工业电子设备之间常用的连接方式。Modbus作为目前工业领域应用最广泛的协议。

最简单的说,Modbus 就是一个总线通信协议,像IIC SPI这种,但是他不依赖于硬件总线。

Modbus之所以使用广泛,是有他的优点的:

  • Modbus协议标准开放、公开发表且无版权要求

  • Modbus协议支持多种电气接口,包括RS232、RS485、TCP/IP等,还可以在各种介质上传输,如双绞线、光纤、红外、无线等

  • Modbus协议消息帧格式简单、紧凑、通俗易懂。用户理解和使用简单,厂商容易开发和集成,方便形成工业控制网络

举一个简单的例子,我们常用的IIC通信协议,需要在物理上连接iic总线,然后加上拉电阻,规定好物理层的高低电平。

而 Modbus协议是一种应用层报文传输协议,协议本身并没有定义物理层,定义了控制器能够认识和使用的消息结构,不管它们是经过何种网络进行通信的。所以能够适应多种电气接口,因此使用非常广泛。

Modebus 通信过程

注意,Modbus 是一主多从的通信协议。

Modbus通信中只有一个设备可以发送请求。其他从设备接收主机发送的数据来进行响应,从机是任何外围设备,如I/O传感器,阀门,网络驱动器,或其他测量类型的设备。从机处理信息后用 Modbus 将其数据发送给主站。

也就是说, Modbus 不能同步进行通信,主机在同一时间内只能向一个从机发送请求,总线上每次只有一个数据进行传输。即主机发送,从机应答,主机不发送,总线上就没有数据通信。

从机不会自己发送消息给主机,只能回复主机发送的消息请求。

并且,Modbus并没有忙机制判断,比方说主机给从机发送命令,从机没有收到或者正在处理其他东西,这时候就不能响应主机,因为 modbus 的总线只是传输数据,没有其他仲裁机制,所以需要通过软件的方式来判断是否正常接收。

举例

现在,我们来探讨 Modbus 数据传输的方式,可以简单地理解成打电话。并且是单向通信的打电话。

主机发送数据,首先需要从机的电话号码(区分每个从机,每个地址必须唯一),告诉从机打电话要干什么事情,然后是需要发送的内容,最后再问问从机,我说的话你都听清楚了没有呀,没有听错吧?

然后从机这里,得到了主机打过来的电话,从机回复主机需要的内容,主机得到从机数据。这样就是一个主机到从机的通信过程。

就好比老师和你打电话,老师拨通了你的电话号,然后老师跟你说,小王呀,我这里需要你给我发东西,发的内容是上周的一周总结,你说好的,然后打开你电脑的文件夹,把你的周报发给老师,这就是一个通信过程。

Modbus存储区

既然从机存储数据,那么肯定要有一个存储区,那就需要文件操作,我们都知道这文件可以分为只读(-r)和读写(-wr)两种类型。

并且存储的数据类型可以分为 :布尔量 和 16位寄存器。

  • 布尔量,比如IO口的电平高低,灯的开关状态等。

  • 16位寄存器,比如 传感器的温度数据,存储的密码等。

Modbus协议规定了4个存储区 分别是 0 1 3 4 区,其中0区和4区是可读可写,1区和3区是只读。

Modbus 还给每个区都划分了地址范围。主机向从机获取数据时,只需要告诉从机数据的起始地址,还有获取多少字节的数据,从机就可以发送数据给主机。

Modbus数据模型规定了具体的地址范围,每一个从机,都有实际的物理存储,跟modbus的存储区相对应,主机读写从机的存储区,实际上就是对从机设备对应的实际存储空间进行读写。

Modbus 协议类型

在上面我们已经说明了 Modbus 可以在各种介质上传输,那么他的传输模式也分为三种:包括ASCII、RTU(远程终端控制系统)、TCP三种报文类型。

串行端口存在多个版本的Modbus协议,而最常见的是下面四种:

  • Modbus-Rtu

  • Modbus-Ascii

  • Modbus-Tcp

  • ModbusPlus

Modbus RTU是一种紧凑的,十六进制表示数据的方式,Modbus ASCII是一种采用Ascii码表示数据,并且每个8Bit 字节都作为两个ASCII字符发送的表示方式。

RTU格式后续的命令/数据带有循环冗余校验的校验和,而ASCII格式采用纵向冗余校验的校验和。

Modbus协议使用串口传输时可以选择RTU或ASCII模式,并规定了消息、数据结构、命令和应答方式并需要对数据进行校验。ASCII 模式采用LRC校验,RTU模式采用16 位CRC校验。通过以太网传输时使用TCP,这种模式不使用校验,因为TCP协议是一个面向连接的可靠协议。

当然常用的就是RTU模式,ASCII一般很少

举一个简单的例子,如果我们需要发送一个数字 10 那么RTU模式下,只需要发送0x0A 总线上传输数据形式为:0000 1010

而ASCII码模式则将数据1和0转为’1’和’0’,需要发送0x31(1) 0x30(0)两个字节数据。总线上传输数据形式为:0011 0001 0011 0000

详细的我们等下再阐述

Modbus-RTU协议

Modbus报文帧结构

一个报文就是一帧数据,一个数据帧就一个报文:指的是一串完整的指令数据,本质就是一串数据。

Modbus报文是指主机发送给从机的一帧数据,其中包含着从机的地址,主机想执行的操作,校验码等内容。

Modbus协议在串行链路上的报文格式如下所示:

帧结构 = 从机地址 + 功能码 + 数据 + 校验

从机地址: 每个从机都有唯一地址,占用一个字节,范围0-255,其中有效范围是1-247,其中255是广播地址(广播就是对所有从机发送应答)

功能码: 占用一个字节,功能码的意义就是, 知道这个指令是干啥的,比如你可以查询从机的数据,也可以修改从机的数据,所以不同功能码对应不同功能.

数据: 根据功能码不同,有不同功能,比方说功能码是查询从机的数据,这里就是查询数据的地址和查询字节数等。

校验:在数据传输过程中可能数据会发生错误,CRC检验检测接收的数据是否正确。

Modbus功能码

Modbus 规定了多个功能,那么为了方便的使用这些功能,我们给每个功能都设定一个功能码,也就是指代码。

Modbus协议同时规定了二十几种功能码,但是常用的只有8种,用于对存储区的读写,如下表所示:

当然我们用的最多的就是 03 和 06  一个是读取数据,一个是修改数据。

CRC校验

错误校验(CRC)域占用两个字节包含了一个16位的二进制值。CRC值由传输设备计算出来,然后附加到数据帧上,接收设备在接收数据时重新计算CRC值,然后与接收到的CRC域中的值进行比较,如果这两个值不相等,就发生了错误。

比如主机发出 01 06 00 01 00 17 98 04, 98 04 两个字节是校验位,那么从机接收到后要根据 01 06 00 01 00 17 再计算CRC校验值,从机判断自己计算出来的CRC校验是否与接收的CRC校验(98 04主机计算的)相等,如果不相等那么说明数据传输有错误,这些数据就不能要。

CRC校验流程:

1、预置一个16位寄存器为0FFFFH(全1),称之为CRC寄存器。

2 、把数据帧中的第一个字节的8位与CRC寄存器中的低字节进行异或运算,结果存回CRC寄存器。

3、将CRC寄存器向右移一位,最高位填以0,最低位移出并检测。

4 、如果最低位为0:重复第三步(下一次移位);如果最低位为1:将CRC寄存器与一个预设的固定值(0A001H)进行异或运算。

5、重复第三步和第四步直到8次移位。这样处理完了一个完整的八位。

6 、重复第2步到第5步来处理下一个八位,直到所有的字节处理结束。

7、最终CRC寄存器的值就是CRC的值。

此外还有一种利用预设的表格计算CRC的方法,它的主要特点是计算速度快,但是表格需要较大的存储空间,该方法此处不再阐述。

下面我们来看详细的发送和接收数据:

1、主机对从机读数据操作

主机发送报文格式如下:

含义:

0x01:从机的地址

0x03:查询功能,读取从机寄存器的数据

0x00 0x01:代表读取的起始寄存器地址.说明从0x0001开始读取.

0x00 0x01:查询的寄存器数量为0x0001个 Modbus把数据存放在寄存器中,通过查询寄存器来得到不同变量的值,一个寄存器地址对应2字节数据; 寄存器地址对应着从机实际的存储地址

0xD5 0xCA:循环冗余校验 CRC

从机回复报文格式如下:

含义:

0x01:从机的地址

0x03:查询功能,读取从机寄存器的数据

0x02:返回字节数为2, 一个寄存器 2个字节

0x00 0x17:寄存器的值是0017

0xF8 0x4A:循环冗余校验 CRC

2、主机对从机写数据操作

主机发送报文格式如下:

含义:

0x01:从机的地址

0x06:修改功能,修改从机寄存器的数据

0x00 0x01:代表修改的起始寄存器地址.说明修改0x0001-0x0003的存储内容

0x00 0x17:要修改的数据值为0017

0x98 0x04:循环冗余校验 CRC

从机回复报文格式如下:

含义:

0x01:从机的地址

0x06:修改功能,修改从机寄存器的数据

0x00 0x01:代表修改的起始寄存器地址.说明是0x0000

0x00 0x17:修改的值为0017

0x98 0x04:循环冗余校验 CRC

从机的回复和主机的发送是一样的,如果不一样说明出现了错误。

Modbus-ACSII协议

在消息中的每个字节都作为两个ASCII字符发送。

十六进制的0-F 分别对应ASCII字符的0…9,A…F

也就是0x30~0x3A 0x41~0x46

下方是ascii的报文帧

  • 1个字节起始位

  • 2个字节地址位

  • 2个字节功能位

  • n个数据位,最小的有效位先发送

  • LRC(纵向冗长检测) 注意校验方式不同

  • 结束符 \r \n

可以看到数据部分更加繁琐,正常我们使用都是用RTU格式,ASCII码格式有了解即可。

总结:

Modbus ASCII 有开始字符(和结束字符(CR LF),可以作为一帧数据开始和结束的标志。而Modbus RTU没有这样的标志,需要用时间间隔来判断一帧报文的开始和结束,协议规定的时间为3.5个字符周期,就是说一帧报文开始前,必须有大于3.5个字符周期的空闲时间,一帧报文结束后,也必须要有3.5个字符周期的空闲时间否则就会出现粘包的情况。

注意:针对3.5个字符周期,其实是一个具体时间,但是这个时间跟波特率相关。

在串口通信中,1个字符包括1位起始位、8位数据位(一般情况)、1位校验位(或者没有)、1位停止位(一般情况下),因此1个字符包括11个位,那么3.5个字符就是38.5个位,波特率表示的含义是每秒传输的二进制位的个位,因此如果是9600波特率,3.5个字符周期=38.5/9600 = 0.00401s = 4.01ms

Modbus-TCP 协议

我们首先看下Modbus-TCP和Modbus-ACSII的区别:

  • Modbus-TCP并不需要从从机地址,而是需要MBAP报文头

  • Modbus-TCP不需要差错校验,因为TCP本身就具有校验差错的能力。

MBAP报文头格式如下:

其中,事务处理表示符和协议标识符我们正常使用设置为0即可,长度为6个字节 0x0006。简单来说,也就是 Modbus-TCP 是在 Modbus-ACSII 的基础上,去掉校验,然后加上五个字节的 0 和一个 6。

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

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

相关文章

Nftables栈溢出漏洞(CVE-2022-1015)复现

背景介绍 Nftables Nftables 是一个基于内核的包过滤框架,用于 Linux 操作系统中的网络安全和防火墙功能。nftables 的设计目标是提供一种更简单、更灵活和更高效的方式来管理网络数据包的流量。 钩子点(Hook Point) 钩子点的作用是拦截数…

Linux环境下配置安装RocketMQ

1.下载 官网下载:下载链接 根据需要下载自己需要的版本、本文使用下载的是:4.7.0版本 2.安装 创建目录,使用ftp工具上传下载的包到上面创建的目录下。 cd /usr/local mkdir rocketmq-all-4.7.0注意:rocketmq 需要 Linux 上安装JDK&…

7、卷积神经网络:基础部件+LeNet

1、图像卷积 1. 互相关运算 严格来说,卷积层是个错误的叫法,因为它所表达的运算其实是互相关运算(cross-correlation),而不是卷积运算。在卷积层中,输入张量和核张量通过(互相关运算)产生输出张量。 首先…

【运维工程师学习】安装ubuntu20.04并配置SSH

【运维工程师学习】安装ubuntu20.04 1、镜像获取2、创建虚拟机3、开始安装4、配置SSH(1) 查看本地ssh版本(2) 安装ssh(3) 查看ssh运行状态(4) 设置开机自动启动(5) 重启(6) 安装net-tools(7) 查看ip5、SSH连接 1、镜像获取 https://next.itellyou.cn/Original/#cbpProduct?ID…

pdf如何导出为图片?分享三个方法PDF转图片!

将PDF文件转换为图片是在许多场景下都非常有用的操作,不仅能够保留原始文档的内容,还方便在各种平台上共享和展示。在本文中,我们将介绍三种简便的方法,帮助您将PDF文件快速转换为图片格式。 方法一:使用记灵在线工具…

黑客是这样的炼成的

---黑客的态度 黑客们解决问题,建设事物,信仰自由和双向的帮助,人人为我, 我为人人。 要想被认为是一名黑客,你的行为必须显示出你已经具备了这种态度。要想做的好象你具备这种态度,你就不得不真的具备这种态度。但…

物理人机交互Physical human-robot interaction (pHRI)

物理人机交互是指人与机器之间通过物理接触或力传递进行交互的过程。它可以通过各种感知和操控技术实现,包括传感器、执行器、机器人和人体接口等。这种交互方式可以在多个领域和应用中发挥重要作用,例如机器人操作、虚拟现实、协作机器人和康复医疗等。 在物理人机交互中,…

Neo4J 特性CQL语句,函数,Springboot集成

Neo4J Neo4J Neo4J一、Neo4J相关介绍1.为什么需要图数据库方案1:Google方案2:Facebook 2.特性和优势3.什么是Neo4j4.Neo4j数据模型图论基础属性图模型Neo4j的构建元素 5.软件安装 二、CQL语句1.CQL简介2.CREATE 命令3.MATCH 命令4.RETURN 子句5.MATCH和R…

node版本管理工具nvm手册

文章目录 下载使用命令node.js其他版本下载下载exe版解压改名放入到指定位置 下载 github下载 使用命令 查看当前版本 nvm -v 查看被管理的node nvm list 切换node版本 nvm use 14.21.3 node.js其他版本下载 下载链接 下载exe版 解压改名放入到指定位置

Echarts柱状图数据过多设置滚动条效果

未设置前: 可以看出数据全部挤压在一起了 设置后: 下面多出一个滚动条,并且鼠标可以拖动数据 dataZoom: [{show: true,height:8,bottom:0,startValue: 0, //起始值endValue: 5, //结束值showDetail: false,fillerColor: "rgba(1, 132, …

10 Web全栈 组件化设计

前端架构层次设计 前端技术体系庞大,层级也非常分明,在架构设计领域中不能一概而论,任何应用种类都有自己独立的架构体系。比如在前端开发领域,在框架基础上进行应用构建的开发者锁思考的问题,与在组件库设计方面的开…

科大讯飞狂撒钱,400 万助力 AI 大赛

大家好,我是二哥呀。 6 月 15 日,科大讯飞的星火认知大模型 APP 上线,我第一时间带大家体验了一把,当时可以说是好评如潮。 后续有很多读者,比如说下面这位,私下找到我,让我帮忙审核通过一下他…

SpringCloud入门实战(十)- SpringCloud Bus消息总线

📝 学技术、更要掌握学习的方法,一起学习,让进步发生 👩🏻 作者:一只IT攻城狮 ,关注我,不迷路 。 💐学习建议:1、养成习惯,学习java的任何一个技术…

MySQL表聚合函数

前言 哈喽,各位小伙伴大家好,本篇文章为大家介绍几个MySQL中常用的聚合函数,什么是聚合函数,相信第一次看到这个名词的小伙伴是比较懵的,举个例子,比如说统计表中数据的个数,就可以使用MySQL中提…

软件测试技术分享丨支付测试

支付测试 引言:如今,随着非现金支付手段的不断推广和应用,“非现金社会”正在形成。非现金支付已成为日常生活中不可或缺的伙伴。那么,对于互联网产品来说,支付也是涉及到公司收入的一个重大环节。对于我们测试人员&am…

JavaScript 处理字符串数组数据方法

前端三件套中 JavaScript 就是充电处理业务逻辑的一个角色,在很多情况之下,或像在做项目之中去发起一些数据请求之后待服务器响应回馈给到客户端的时候,对于返回的数据需要进行一个格式的处理,比如有JSON,字符串&#…

Python 集合探索:解密高效数据操作和快速算法的奇妙世界

前言 在 Python 的众多数据结构中,集合(Sets)是一个引人注目且实用的概念。集合提供了一种存储无顺序、唯一元素的数据结构,它们不仅可以帮助我们高效处理数据,还能应用于各种算法和问题。 本博客将带您踏上一段关于…

python 从一个文件夹里面复制 符合要求的文件

记事本格式 import os def copy(src_file, dst_file):import shutil# 执行复制操作shutil.copy2(src_file, dst_file)def main(parent,data,dest_path):_list []for line in open(data, encoding"utf-8"):line line.strip()_list.append(line.split("\t&quo…

渠道归因(二)基于马尔可夫链的渠道归因

渠道归因(二)基于马尔可夫链的渠道归因 在应用当中,序列中的每个点通常映射为一个广告触点,每个触点都有一定概率变成真正的转化。通过这种建模,可以选择最有效,概率最高的触点路径。这种方法需要较多的数…

你知道怎么通过ai绘画图片描述生成图片吗

汤姆: 嘿,听说了吗?有几个特别酷的方法可以通过ai绘画图片描述生成出上面这些惊艳的图像! 玛丽: 真的吗?那听起来好神奇啊!怎么做到的? 汤姆: 其实很简单!你只需要用文字描述你想要的图片&…