MODBUS总线的学习笔记

news2024/11/13 9:04:14

MODBUS学习记录

下面所有资料均copy于安富莱电子和博客中,仅作为个人学习笔记记录,写的不好请见谅。

1.modbus简介介绍

Modbus 是由 Modicon(现为施耐德电气公司的一个品牌)在 1979 年发明的,是全球第一个真正 用于工业现场的总线协议。 ModBus 网络是一个工业通信系统,由带智能终端的可编程序控制器和计算机通过公用线路或局部专
用线路连接而成。其系统结构既包括硬件、亦包括软件。它可应用于各种数据采集和过程监控。 为更好地普及和推动Modbus 在基于以太网上的分布式应用,目前施耐德公司已将Modbus 协议的
所有权移交给 IDA(Interface for Distributed Automation,分布式自动化接口)组织,并成立了 Modbus-IDA组织,为Modbus 今后的发展奠定了基础。 在中国,Modbus 已经成为国家标准。 标准编号:GB/T19582-2008 标准名称:《基于Modbus 协议的工业自动化网络规范》 分 3 个部分:

  • 《GB/T 19582.1-2008 第 1 部分:Modbus 应用协议》
  • 《GB/T 19582.2-2008 第 2 部分:Modbus 协议在串行链路上的实现指南》
  • 《GB/T 19582.3-2008 第 3 部分: Modbus 协议在 TCP/IP 上的实现指南》

modbus协议层模型

modbus的7层osi模型中,只有物理层和数据链路层和应用层。

Modbus 串行链路协议是一个主/从协议。该协议位于OSI 模型的第二层。

一个主从类型的系统有一个向某个“子”节点发出显式命令并处理响应的节点(主节点)。典型的子节 点在没有收到主节点的请求时并不主动发送数据,也不与其它子节点通信。 在物理层,Modbus 串行链路系统可以使用不同的物理接口(RS485、RS232)。最常用的是
TIA/EIA-485 (RS485) 两线制接口。

image-20211008092937631

modbus主/从协议的原理

Modbus 串行链路协议是一个主-从协议。在同一时刻,只有一个主节点连接于总线,一个或多个子 节点 (最大编号为 247 ) 连接于同一个串行总线。通信时,总是由主站发起,在从站没有收到来着主站的请求时,不会发送数据,并且从站之间不会互相通信。

主站可以对从站发起下面两种请求:

  • 单播模式

    主节点以特定地址访问某个子节点,子节点接到并处理完请求后,子节点向主节点返回一个报文(一个 ‘应答’)。在这种模式,一个 Modbus 事务处理包含 2 个报文:一个来自主节点的请求,一个来自子节 点的应答。
    每个子节点必须有唯一的地址 (1 到 247),这样才能区别于其它节点被独立的寻址。

  • 广播模式

    主节点向所有的子节点发送请求。对于主节点广播的请求没有应答返回。广播请求一般用于写命令。 所有设备必须接受广播模式的写功能。地址 0 是专门用于表示广播数据的。

modbus地址规则

Modbus 寻址空间有 256 个不同地址。

地址 0 为广播地址。所有的子节点必须识别广播地址。 Modbus 主节点没有地址,只有子节点必须有一个地址。 该地址必须在 Modbus 串行总线上唯一。

modbus的帧概述

image-20211013191821174

在modbus串行链路中,地址域只有子节点的地址,合法的子节点地址为十进制0-247,每个子设备被赋予1-247范围中的地址,地址0用来广播。

RTU传输模式

有两种串行传输模式被定义: RTU 模式 和 ASCII 模式。(常用RTU模式)

它定义了报文域的位内容在线路上串行的传送。它确定了信息如何打包为报文和解码。

尽管在特定的领域 ASCII 模式是要求的,但达到 Modbus 设备之间的互操作性只有每个设备都有 相同的模式: 所有设备必须实现 RTU 模式。ASCII 传输模式是选项。

这种模式的主要优点是较高的数据密度,在相同的波特率下比ASCII 模式有更 高的吞吐率。

RTU模式每个字节 ( 11 位 ) 的格式为 :

编码系统: 8–位二进制,报文中每个 8 位字节含有两个 4 位十六进制字符(0–9, A–F)

1个起始位,8个数据位,1个奇偶校验位,一个停止位。

偶校验是要求的, 其它模式 ( 奇校验, 无校验 ) 也可以使用。 为了保证与其它产品的最大兼容性, 同时支持无校验模式是建议的。默认校验模式模式 必须为偶校验。
注 : 使用无校验要求2 个停止位。

在代码中看到串口的配置,是1个起始位,8个数据位,没有校验位,一个停止位,也没搞懂,应该来说是两个校验位。

image-20211013192329341

MODBUS DTU帧描述:

image-20211013193738320

在 RTU 模式,报文帧由时长至少为 3.5 个字符时间的空闲间隔区分。在后续的部分,这个时间区间 被称作 t3.5

image-20211013193909888

整个报文帧必须以连续的字符流发送。 如果两个字符之间的空闲间隔大于 1.5 个字符时间,则报文帧被认为不完整应该被接收节点丢弃。

image-20211013193930332

英语,t1.5和t3.5的定时,存在着大量的中断,在高速通信的情况下,增加cpu负担,因此在速率等于或者低于19200bps时,这两个定时必须严格遵守; 对于波特率大于 19200 bps 的情形,应该使用 2 个定时的固定值:

  • 建议的字符间超时时间(t1.5)为 750µs,
  • 帧间的超时时间 (t1.5) 为 1.750ms。

在代码中,没有看到t1,5的定时,只有看到了t3.5每个帧之间的间隔,也可能没看仔细…

更新:一般串口就已满足,不需要t1.5定时。

RTU传输模式状态图

image-20211013194326796

CRC 校验

在 RTU 模式包含一个对全部报文内容执行的,基于循环冗余校验 (CRC - Cyclical RedundancyChecking) 算法的错误检验域。CRC 域检验整个报文的内容。不管报文有无奇偶校验,均执行此检验。 CRC 包含由两个 8 位字节组成的一个 16 位值。 CRC 域作为报文的最后的域附加在报文之后。计算后,首先附加低字节,然后是高字节。CRC 高字
节为报文发送的最后一个子节。 附加在报文后面的 CRC 的值由发送设备计算。接收设备在接收报文时重新计算 CRC 的值,并将计
算结果于实际接收到的CRC 值相比较。如果两个值不相等,则为错误。 CRC 的计算, 开始对一个 16 位寄存器预装全1。 然后将报文中的连续的 8 位子节对其进行后续的计
算。只有字符中的 8 个数据位参与生成CRC 的运算,起始位,停止位和校验位不参与 CRC 计算。 CRC 的生成过程中, 每个 8–位字符与寄存器中的值异或。然后结果向最低有效位(LSB)方向移动
(Shift) 1 位,而最高有效位(MSB)位置充零。 然后提取并检查 LSB:如果 LSB 为 1, 则寄存器中的值与 一个固定的预置值异或;如果 LSB 为 0, 则不进行异或操作。 这个过程将重复直到执行完 8 次移位。完成最后一次(第 8 次)移位及相关操作后,下一个 8 位字节
与寄存器的当前值异或,然后又同上面描述过的一样重复 8 次。当所有报文中子节都运算之后得到的寄存
器忠的最终值,就是 CRC。

ASCII传输模式

当 Modbus 串行链路的设备被配置为使用 ASCII (American Standard Code for Information Interchange) 模式通信时, 报文中的每个 8 位子节以两个 ASCII 字符发送。当通信链路或者设备无法 符合 RTU 模式的定时管理时使用该模式。

注 : 由于一个子节需要两个字符,此模式比 RTU 效率低。
例 : 子节 0X5B 会被编码为两个字符 : 0x35 和 0x42 ( ASCII 编码0x35 =“5”, 0x42 =“B” )。

ASCII 模式每个字节 ( 10 位 ) 的格式为 : 编码系统: 十六进制,ASCII 字符 0-9, A-F。报文中每个ASCII 字符含有 1 个十六进制字符 Bits per Byte: 1起始位 7数据位(首先发送最低有效位) 1位作为奇偶校验 1停止位

偶校验是要求的, 其它模式 ( 奇校验, 无校验 ) 也可以使用。 为了保证与其它产品的最大兼容性, 同时支持无校验模式是建议的。默认校验模式模式 必须为偶校验。
注 : 使用无校验要求 2 个停止位。

image-20211013201051135

Modbus ASCII 报文帧

由发送设备将 Modbus 报文构造为带有已知起始和结束标记的帧。这使设备可以在报文的开始接收 新帧,并且知道何时报文结束。不完整的报文必须能够被检测到而错误标志必须作为结果被设置。 报文帧的地址域含有两个字符。

在 ASCII 模式, 报文用特殊的字符区分帧起始和帧结束。一个报文必须以一个‘冒号’ ( : ) (ASCII
十六进制 3A )起始,以 ‘回车-换行’ (CR LF) 对 (ASCII 十六进制 0D 和 0A) 结束。

注 : LF 字符可以通过特定的Modbus 应用命令 (参见 Modbus 应用协议规范) 改变。

对于所有的域,允许传送的字符为十六进制 0–9, A–F (ASCII 编码)。 设备连续的监视总线上的 ‘冒
号’ 字符。 当收到这个字符后,每个设备解码后续的字符一直到帧结束。
报文中字符间的时间间隔可以达一秒。如果有更大的间隔,则接受设备认为发生了错误。

下图显示了一个典型的报文帧。

image-20211013201408419

注:每个字符子节需要用两个字符编码。因此,为了确保 ASCII 模式 和 RTU 模式在 Modbus 应 用级兼容,ASCII 数据域最大数据长度为 (2x252) 是 RTU 数据域 (252) 的两倍。
必然的, Modbus ASCII 帧的最大尺寸为513 个字符。

ASCII传输模式状态图

image-20211013201540078

LRC 校验

在 ASCII 模式,包含一个对全部报文内容执行的,基于纵向冗余校验 (LRC - Longitudinal Redundancy Checking) 算法的错误检验域。LRC 域检验不包括起始“冒号”和结尾 CRLF 对的整个报 文的内容。不管报文有无奇偶校验,均执行此检验。

LRC 域为一个子节,包含一个 8 位二进制值。LRC 值由发送设备计算,然后将 LRC 附在报文后面。
接收设备在接收报文时重新计算 LRC 的值,并将计算结果于实际接收到的LRC 值相比较。如果两个值不 相等,则为错误。

LRC 的计算, 对报文中的所有的连续 8 位字节相加,忽略任何进位,然后求出其二进制补码。执行检
验针对不包括起始“冒号”和结尾 CRLF 对的整个 ASCII 报文域的内容。在 ASCII 模式, LRC 的结果
被ASCII 编码为两个字节并放置于ASCII 模式报文帧的结尾, CRLF 之前。

modbus事物处理的流程

image-20211013202700159

异常码定义

下面是异常码的表格

image-20211013203309630

2.1功能码定义

功能码分类

有三类MODBUS 功能码。它们是:公共功能码用户定义功能码保留功能码

image-20211018091625524

公共功能码定义

  • 是较好地被定义的功能码,
  • 保证是唯一的,
  • MODBUS 组织可改变的,
  • 公开证明的,
  • 具有可用的一致性测试,
  • MB IETF RFC中证明的,
  • 包含已被定义的公共指配功能码和未来使用的未指配保留供功能码。

用户定义功能码

  • 有两个用户定义功能码的定义范围,即 65 至 72 和十进制 100 至 110。
  • 用户没有MODBUS 组织的任何批准就可以选择和实现一个功能码
  • 不能保证被选功能码的使用是唯一的。
  • 如果用户要重新设置功能作为一个公共功能码,那么用户必须启动 RFC,以便将改变引入公共分
    类中,并且指配一个新的公共功能码。

保留功能码

  • 一些公司对传统产品通常使用的功能码,并且对公共使用是无效的功能码。

2.2 公共功能码定义

实际上常用的功能码就:01, 02, 03, 04, 05, 15, 16.

image-20211018092014750

下面是01H的介绍,其他功能码用到时再看就行,实际也是对着产品的协议来的,没必要牢记。

image-20211018092324229

RTU主从协议栈实现

从机框架图

image-20230124103831773

image-20230124103909561

不管数据对错都要应答回复。

主要就是要实现串口的接收,并且硬件的微秒级定时器实现字符超时判断;然后再实现串口发送即可;然后就是数据解析部分;

然后采用RTU的硬件配置下,要对串口进行相对应的配置。

image-20230124104735796

采用无奇偶校验位如下

image-20230124104907136

这里要注意,数据部分是大端格式,需要进行转化,crc是小端,直接默认即可。因为arm类是小端格式

image-20230124183406979

软件部分

下面是串口的结构体抽象,后面几个就是与485相关的,其他的是跟串口FIFO实现有关。

如:SendOver和SendBefore函数指针,就是实现485芯片的接收和发送的使能。ReceiveNew实现新的字节数据的接收。

image-20230124105142432

如下就是485芯片的收发模式切换的函数。

image-20230124105516957

下面是在中断函数中用回调函数实现MODBUS数据的接收。

image-20230124105813809

后面就是数据接收和字符超时的判断。

image-20230124144258408

image-20230124144429079

超过间隔时间以后,开始判断,如果小于最基本的4个字节则判断错误,然后计算CRC校验和,如果接收正常则为0。然后判断数据的中的地址是否符合,最后开始应用层的数据解析即可。

image-20230124152618283

image-20230124152825116

从机框架图

和从机差不多,主要也是在接收部分,发送部分很简单。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fU8GZnKm-1674563529852)(http://os.zhengshijian.com//img/%E5%BE%AE%E4%BF%A1%E6%88%AA%E5%9B%BE_20230124191829.png)]

image-20230124190502365

image-20230124190533449

代码

下面给出例程代码,不管是跑裸机还上RTOS,只需把例程中的代码移植一下,非常简单。

链接:https://pan.baidu.com/s/1fwrP2Np5PnqytU3q_by1iw
提取码:u16s
–来自百度网盘超级会员V5的分享

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

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

相关文章

PowerShell 学习笔记:操作XML文件

XML文件是有一定格式要求的文本文件。百度百科可扩展标记语言 (Extensible Markup Language, XML) ,标准通用标记语言的子集,可以用来标记数据、定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言。 XML是标准通用标记语言 可扩展…

adversarial Learning and attacks 学习笔记

GANs大家是比较熟悉的网络结构,adversarial attacks 也不是很新的概念了。近期的工作有涉及到adversarial attacks,故整理一下学习的内容。 Adversarial Attacks 对抗攻击样本:一张正常的大熊猫图片(左图)在被加入噪…

Leetcode.1828 统计一个圆中点的数目

题目链接 Leetcode.1828 统计一个圆中点的数目 题目描述 给你一个数组 points,其中 points[i] [xi, yi] ,表示第 i个点在二维平面上的坐标。多个点可能会有 相同 的坐标。 同时给你一个数组 queries,其中 queries[j] [xj, yj, rj]&#x…

Feign入门

Feign入门Feign入门Feign代替RestTemplate自定义配置Feign使用优化最佳实践Feign入门 Feign代替RestTemplate RestTemplate方式调用存在的问题 先来看我们以前利用RestTemplate发起远程调用的代码: String url "http://userservice/user/" order.ge…

linux(Debian11)安装后安装无线网卡等驱动

在工作和生活中,我们经常会用到linux系统,debian作为一个老牌的程序员常用发行版,自然成为我们的首选。 下面记录一下,安装无线网卡的过程。 首先,可以通过命令查看自己所需要的驱动 lspci -vvv iwlwifi 就是我所需…

机器学习为什么使用归一化? 有哪些归一化算法?

一、归一化的基本介绍 1. Why 归一化? 一些分类器需要计算样本之间的距离(如欧氏距离),例如KNN。如果一个特征值域范围非常大,那么距离计算就主要取决于这个特征,从而与实际情况相悖(比如这时实际情况是值域范围小的特征更重要)。或者举一个更浅显的例子:对房子进行…

Java——组合总和(3)

题目链接 leetcode在线oj——组合总和(3) 题目描述 找出所有相加之和为 n 的 k 个数的组合,且满足下列条件: 只使用数字1到9 每个数字 最多使用一次 返回 所有可能的有效组合的列表 。该列表不能包含相同的组合两次&#xff…

计算机网络 —— TCP篇 TCP 重传、滑动窗口、流量控制、拥塞控制

计算机网络系列文章目录 TCP篇 TCP 重传、滑动窗口、流量控制、拥塞控制 文章目录计算机网络系列文章目录前言4.2 TCP 重传、滑动窗口、流量控制、拥塞控制4.2.1 重传机制超时重传什么情况会触发超时重传超时时间应该设置为多少呢?快速重传SACKD-SACK4.2.2 滑动窗…

【数据结构之二叉树系列】万字深剖数据结构---堆

目录前言一、堆二、堆的实现(重点)1. 数据类型重定义2. 堆结构的定义3. 堆结构的重定义三、堆中常见的基本操作(重点)1. 声明2. 定义(1)初始化(2)销毁(3)插入数据(4&…

macOS Monterey 12.6.3 (21G419) 正式版 ISO、IPSW、PKG 下载

macOS Monterey 12.6,皆为安全更新,不再赘述。 macOS Monterey 12.6,发布于 2022 年 9 月 12 日(北京时间今日凌晨),本次为安全更新。 今日(2022-07-21)凌晨,Apple 终于…

ATAC-seq分析:Peak Calling(8)

1. 寻找开发区域 ATACseq 的一个共同目标是识别转录因子结合和/或转录机制活跃的无核小体区域。该核小体游离信号对应于小于一个核小体的片段&#xff08;如 Greenleaf 论文中定义 < 100bp&#xff09;。 然而&#xff0c;为了识别开放的染色质&#xff0c;我们可以简单地使…

意想不到的结果:Foo(m)可能是在定义名为m的对象

文章目录例一&#xff1a;Foo(m); 是定义名为 m 的对象例二&#xff1a;Foo(m).i; 传入实参 m例三&#xff1a;func(Foo(m)); 传入实参 m例四&#xff1a;S(cout)(1) 定义名为 cout 的对象例五&#xff1a;S(std::cout)(1) 传入实参 std::cout你知道吗&#xff0c;如果 Foo 是…

vue3 watch 监听响应式数据变化

主要是用来监听ref 或者reactive 所包裹的数据才可以被监听到 <template><input type"text" v-model"message"> </template> <script setup lang"ts">import {ref, watch} from "vue";let message ref<s…

powerdesigner画UML组件图初步

组件图 组件图是用来描述组件与组件之间关系的一种UML图&#xff0c;组件图在宏观层面上显示了构成系统某一特定方面的实现结构。 组件图可以用来显示组件之间的依赖关系&#xff0c;以及组件的接口和调用关系。 组件图由组件&#xff0c;接口&#xff0c;组件图中的关系&…

20230124英语学习

Why Do We Still Procrastinate Despite It Causing So Much Stress? 明知道拖延不好&#xff0c;为何还会拖延&#xff1f; Are you procrastinating?I am.I have been delaying writing this article for the last few days even though I knew I had a deadline. I have …

从零到一:复现 DIR-815 栈溢出漏洞

从零到一&#xff1a;复现 DIR-815 栈溢出漏洞 实验环境 执行命令uname -a可以查看到当前系统版本 我这边采用桥接模式进行实验。 环境搭建 文章命令操作均在root下操作&#xff0c;且git clone xxxx.git下载所用到工具都均下载保存到/opt/tools/文件夹下&#xff0c;方便统…

OKC和802.11R的知识小科普

欢迎来到东用知识小课堂&#xff01;1.什么是漫游简单来说&#xff0c;就是设备从一个AP&#xff0c;连接到另一个AP。IP地址不需要重新申请。整个过程需要尽可能快的进行&#xff0c;否则对于用户而言&#xff0c;就会发现网络出现卡顿。而为了安全&#xff0c;网络的认证过程…

【Python】使用pyinstaller打包py程序为exe应用程序时,出现“Tcl报错闪退”的解决办法

问题概述 使用pyinstaller -F的命令进行py程序转为exe程序时&#xff0c;打包后的exe程序会出现闪退报错的情况&#xff1a; 解决办法 1. 检查“环境变量”tcl和tk是否配置好&#xff1a; 查看系统高级设置>>>环境变量>>>系统变量 博主使用anaconda进行p…

河道污染物识别系统 python

河道污染物识别系统通过pythonyolo深度学习技术&#xff0c;对现场画面中河道污染物以及漂浮物进行全天候实时监测&#xff0c;当监测到出现污染物漂浮物时&#xff0c;立即抓拍存档触发告警。与C / C等语言相比&#xff0c;Python速度较慢。也就是说&#xff0c;Python可以使用…

计算机组成原理 | 第一章:概论

文章目录&#x1f4da;冯诺依曼计算机的特点&#x1f4da;计算机硬件组成框图&#x1f4da;计算机硬件的主要技术指标&#x1f407;非时间指标&#x1f407;时间指标&#x1f511;计算技巧归纳&#x1f4da;小结&#x1f511;本章掌握要点&#x1f407;补充思考题&#x1f4da;…