Modbus协议介绍

Modbus存储区

从机存储数据,那么肯定要有一个存储区,那就需要文件操作,我们都知道这文件可以分为只读(-r)和读写(-wr)两种类型
并且存储的数据类型可以分为 :布尔量 和 16位寄存器

布尔量比如IO口的电平高低,灯的开关状态等。
16位寄存器比如 传感器的温度数据,存储的密码等。

Modbus协议规定了4个存储区 分别是0 1 3 4区 其中1区和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的值。

详细的发送和接收数据

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: 要修改的数据值为00170x98 0x04: 循环冗余校验 CRC

从机回复报文格式如下:
在这里插入图片描述含义:

 0x01:从机的地址0x06:修改功能,修改从机寄存器的数据0x00 0x01: 代表修改的起始寄存器地址.说明是0x00000x00 0x17:修改的值为00170x98 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码格式有了解即可。
在这里插入图片描述

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

注意:针对3.5个字符周期,其实是一个具体时间,但是这个时间跟波特率相关。
在串口通信中,1个字符包括1位起始位、8位数据位(一般情况)、1位校验位(或者没有)、1位停止位(一般情况下),因此1个字符包括11个位,那么3.5个字符就是38.5个位,波特率表示的含义是每秒传输的二进制位的个位,因此如果是9600波特率,3.5个字符周期=/960038.5=0.00401s1000=4.01ms
Modbus-TCP协议

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

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

并且不需要差错校验,因为TCP本身就具有校验差错的能力
在这里插入图片描述MBAP报文头格式如下:
在这里插入图片描述其中事务处理表示符合协议标识符我们正常使用设置为0即可 长度为6个字节 0x0006

简单来说,也就是Modbus-TCP是在Modbus-ACSII的基础上,去掉校验,然后加上五个字节的0和一个06

https://cloud.tencent.com/developer/article/1540241
https://cloud.tencent.com/developer/article/2153911?areaId=106001

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

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

相关文章

如何实现对节点尺寸动态变化的有效监测与检测

前言 近来有需求要做分页,听起来可能有点Low。 所以我要把Low的事情做得有点逼格。 分页本身没啥,但是数据量起来了,比如十万。 要是不做点处理, 那你的页面估计爽得很,机器也爽得很。 放心,我不会让你这么…

金仓方案 | 全国高速联网收费系统国产化升级进行时

近年来,国家提出了交通强国建设战略,鼓励在交通领域加强自主创新,推动产业转型升级。高速公路收费系统作为高速公路行业的核心,也是交通领域信息技术应用创新的重中之重,自主可控问题成为系统建设和运营的关键难点。 2…

[机器学习]练习闵可斯基距离

闵可斯基距离(Minkowski distance)是一种用于衡量向量空间中两点之间距离的方法。它是曼哈顿距离和欧几里得距离的一般化形式。闵可斯基距离使用一个参数 p 来调整计算方法,其中 p 是一个大于 0 的实数值。 在二维空间中,闵可斯基…

可控占比闪烁电路

1启动Q0.0 亮一秒歇一秒循环执行 定时器设置为2秒 使用指令LD> T0 k10 控制亮和灭时间

[已解决]Unable to find a valid cUDNN algorithm to run convolution

问题描述:Unable to find a valid cUDNN algorithm to run convolution 可能原因: 1、cuDNN库的配置问题。 2、未指定训练使用的显卡或显卡占用率已满。 3、确定性算法。 解决方案:(从下往上试) 1、更新GPU驱动、cuD…

大数据面试英文自我介绍参考(万字长文)

发现有一个怪圈,如果码农年龄35+,除非非常匹配,不然在国内企业筛选可能就筛选不过。国外码农可以干到40+、50+。一些外企,对年龄35+的码农依然青睐。这些外企对英文是有要求,通常是要英文自我介绍,下面提供一些英文自我介绍参考。 参考1: Good morning/afternoon, I a…

mysql 用户管理-权限管理

学习了用户管理,再学习下权限管理。 3,权限管理 权限管理主要是对登录到MySQL的用户进行权限验证。所有用户的权限都存储在MySQL的权限表中,不合理的权限规划会给MySQL服务器带来安全隐患。数据库管理员要对所有用户的权限进行合理规…

腾讯2024实习生在线笔试-0331

Q1 小红的图上染色 小红拿到了一个无向图,其中一些边被染成了红色。 小红定义一个点是“好点”,当且仅当这个点的所有邻边都是红边。 现在请你求出这个无向图“好点”的数量。 注:如果一个节点没有任何邻边,那么它也是好点。 …

2、Cocos Creator 下载安装

Cocos Creator 从 v2.3.2 开始接入了全新的 Dashboard 系统,能够同时对多版本引擎和项目进行统一升级和管理!Cocos Dashboard 将做为 Creator 各引擎统一的下载器和启动入口,方便升级和管理多个版本的 Creator。还集成了统一的项目管理及创建…

【MySQL】内外连接——内连接、外连接、左外连接、右外连接、内外连接的区别、左外连接和右外连接的区别

文章目录 MySQLMySQL表的内连接和外连接1. 内连接2. 外连接2.1 左外连接2.2 右外连接 3. 内外连接的区别4. 左外连接和右外连接的区别 MySQL MySQL表的内连接和外连接 MySQL 中的内连接(INNER JOIN)和外连接(包括左外连接 LEFT JOIN 和右外连…

Java研学-SpringBoot(五)

七 统一异常处理 1 框架自带方式 Spring Boot 默认会把所有错误都交给 BasicErrorController 类完成处理,错误的视图导向到 classpath:/static/error/ 和 classpath:/templates/error/路径上,HTTP 状态码就是默认视图的名称。如: // 出现 4…

JS中常用的几种事件

在js中分为多种事件,比如点击事件,焦点事件,加载事件,鼠标事件等等... ... 点击事件 onclick点击事件,ondblclick双击事件 焦点事件 onblur元素失去焦点,onfocus元素获取焦点 加载事件 onload一个页面…

windows本地访问局域网tensorboard

https://blog.csdn.net/m0_51268651/article/details/126524028 这个文章中说使用xshell配置ssh后可在windows访问 有一说一不太能理解为什么谷歌会做的那么麻烦 果然有更好的方案,如下: tensorboard --logdir/path/to/event --host 0.0.0.0 --port 6…

600条最强Linux命令总结

1. 基本命令 uname -m 显示机器的处理器架构 uname -r 显示正在使用的内核版本 dmidecode -q 显示硬件系统部件 (SMBIOS / DMI) hdparm -i /dev/hda 罗列一个磁盘的架构特性 hdparm -tT /dev/sda 在磁盘上执行测试性读取操作系统信息 arch 显示机器的处理器架构 uname -m 显示…

Linux 如何一键kill杀死某个被占用的端口

文章目录 一、例子:关闭8082端口二、查找被占用端口的PID三、 kill 掉这个进程总结 一、例子:关闭8082端口 [rootVM_0_59_centos root]# netstat -tln | grep 8082 tcp6 3 0 :::8082 :::* LISTEN二、查找…

考研数学|听完一遍汤家凤基础,1800都没思路,怎么办?

看了我这篇回答,保证你可以顺利的做1800题! 如果你听了汤家凤老师的课,但是做题没思路,请不要担心,也不要急着换老师,你很有可能是方法错了。 请你反思一下: 1、你是不是听完课立刻就去做题。…

配音虾助力视频文案提取,提升内容创作效率

配音虾作为一款智能语音技术产品,正逐渐在视频内容创作领域崭露头角。它以其独特的语音转文字功能,助力视频文案提取,极大地提升了内容创作的效率。对于广大内容创作者来说,这无疑是一项革命性的工具。目前上线的渠道只有微信小程…

[小程序开发] 设置request封装请求参数

一、在类中定义实例属性,用来设置默认请求参数 defaults{baseURL:,//请求基准地址url:,//接口的请求路径data:null,//请求参数method:GET,//默认的请求方法//请求头header:{Content-type:application/json//设置数据的交互格式},timeout:60000//默认的超时时长&…

wpf ContentPresenter

在WPF(Windows Presentation Foundation)中,ContentPresenter是一个关键组件,它负责在控件或模板中渲染和展示内容。以下是关于ContentPresenter在WPF中作用、特性和使用场景的详细说明: 目的 内容占位符&#xff1a…

MTMT 质押活动启动 ,坐享巨大BTCFi 市场红利

BTC是第一大加密货币,目前加密货币总市值为 2.6 万亿美元,BTC市值占比约为 51%。事实上,相对于开发程度更高的以太坊生态,BTC生态目前仍处于发展的极早期,这意味着仍旧巨大的BTC价值亟需释放,这也意味着 BT…