RS485、MODBUS通信协议浅显易懂篇

2023-11-13

前言

        MODBUS协议是Modicon公司发表的一种串行通信协议,属于OSI模型中应用层的协议,现广泛应用于工业控制领域,它的主要特点是免费开放、支持多种电气接口(如RS-232、RS-485),传输介质可以是双绞线、光纤、无线等。

        RS485(即TIA485)处于OSI模型的物理层,作为上层协议的通信接口,它是针对RS232的不足而诞生的新的接口,主要特点是传输距离远、传输速率高、抗干扰性强、可以实现多机通信(一主多从)

1、RS485通信接口

1.1、RS485物理特性

RS485电气特性通常为2线(A、B线)、半双工通信;(4线可实现全双工)

利用A、B线两端的电压差值来表示传递数据信号,接口电平低,不易损坏芯片,

逻辑“1”以AB两线间的电压差为+(2~6)V表示;逻辑“0”以AB两线间的电压差为-(2~6)V表示;

采用平衡驱动器和差分接收器的组合,抗共模干扰能力强;

理论通讯距离可达1200米(100Kbps)。

1.2 、RS485一主多从连线

通常情况下RS485需要接2个匹配电阻,其阻值要求等于传输电缆的特性阻抗(一般为120Ω)。

1.3、RS485自动收发实现原理

A、B接口用于连接485总线,

RO是接收输出端,DI是发送数据端,

RE是接收使能信号(低电平有效),DE是发送使能信号(高电平有效)。

实现原理如下:

        RE和DE通过一个IO口控制,当USART_TX输出低电平时,三极管Q1截止未导通,RE和DE由于R6上拉为高电平,DE为高电平有效,所以此时处于发送数据模式,DI为数据发送端接地,因此TX输出低电平时485处于发送模式,DI接地发送低电平信号

当USART_TX输出高电平时,三极管Q1导通接地,RE和DE为低电平,处于接收模式,由于A端接了上拉电阻R3,B端接了下拉电阻R2,因此,TX输出高电平时485处于接收模式,AB的电压差值为逻辑“1”

综上所述,当数据发送完成后,将TX配置为高电平,使485通常情况下处于接收模式。

2、MODBUS协议

2.1 MODBUS协议概述

Modbus协议属于OSI模型-应用层的传输协议,分为客户机和服务器(即C/S架构);

Modbus串行链路协议属于OSI模型-数据链路层,分为主机和从机

客户机的功能由主机提供,服务器的功能由从机提供;

 同一时刻只能有一个主机(客户机)连接到总线上,一个或者多个从机(服务器)连接到总线上;

通信的发起端只能是主机,从机负责响应主机的请求,也就是说从机的通信都是被动的,它不会主动对主机发起通信;(主机没有地址)

主机对从机发起通信的模式有两种:

单播模式:主机指定特定的子机地址(1~247),子机接到主机的请求后,向主机返回一个报文作为响应;

广播模式:主机向所有子机发送请求,广播地址为0,当主机向0号地址发数据包的时候,每一个从机设备都会收到数据包,子机接收到主机的广播命令后不需要返回报文作为响应。

单播模式
单播模式

广播模式

2.2 MODBUS通信方式

Modbus的通信方式可以分为三种:

①基于串口的Modbus-ASCII :ASCII模式使用文本格式的数据,其中每个字节都表示一个字符。在ASCII模式下,Modbus协议使用ASCII码来表示数据。ASCII模式通常用于短距离的串行通信,例如在同一个局域网内的设备之间进行通信。

基于串口的Modbus-RTU :每个 8 位字节含有两个 4 位十六进制字符,这种模式的主要优点是较高的数据密度,在相同的波特率下比 ASCII 模式有更高的吞吐率,每个报文必须以连续的字符流传送通常采用CRC-16_Modbus校验算法。

③基于网口的Modbus-TCP: Modbus-TCP基于TCP/IP协议。

在应用当中首先要确认的就是使用哪个通信方式工作,主从机必须工作在同一种模式下,且其它串行参数也要设置为相同,如波特率等;在嵌入式工业领域中最常用的还是RTU模式,下面就着重以RTU来解析。

2.3 Modbus-RTU通信模式

2.3.1 RTU报文帧格式

子节点地址对应子机地址,功能代码下文会解释,简单理解为配置读寄存器还是写寄存器。

帧最大为256字节,每个字节为11位,传输顺序为从最低有效位开始(即起始位开始)

如果设置为奇/偶校验则为起始位1bit+8bit数据+1bit奇偶校验位+1bit停止位);

如果设置为无校验则为起始位1bit+8bit数据+2bit停止位)。

2.3.2 RTU报文帧时序要求

报文帧间至少为 3.5 个字符时间的空闲间隔;

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

2.3.3 RTU功能码

下图为公共功能码定义:

Modbus-RTU协议不支持Modbus协议中的功能码01和02,因为它们使用了不同的数据结构来表示输入和线圈状态。此外,Modbus-RTU协议还支持一些额外的功能码,用于读取和写入保持寄存器,以便在通信过程中保持某些状态信息。这里仅介绍0x03、0x06、0x10。

2.3.3.1  读多个寄存器功能码0x03

使用该功能码读取保持寄存器连续块的内容

寄存器地址由2个字节表示(范围为0x0000~0xFFFF);

寄存器数量也由2个字节表示(范围为0~0x7d)

示例:

主机读取子机地址为01,寄存器地址为0x0001为起始的连续10个寄存器值(以下为十六进制数)

主机请求帧:01  03  00  01  00  0A  CRC_L  CRC_H(即为子机地址+功能码+寄存器地址高字节+寄存器地址低字节+寄存器数量高字节+寄存器数量低字节+CRC低字节+CRC高字节);

子机响应帧01 03  06  00  02  00  04  00  06(即为子机地址+功能码+读取的字节数+DATA1_H+DATA1_L+DATA2_H+DATA2_L+DATA3_H+DATA3_L+CRC低字节+CRC高字节)。

2.3.3.2 写单个寄存器功能码0x06

使用该功能码向单个寄存器写入值;

寄存器地址由2个字节表示(范围为0x0000~0xFFFF);

寄存器数量也由2个字节表示(范围为0x0000~0xFFFF)

示例:

主机向子机地址为01,寄存器地址为0x0001写入0x03值(以下为十六进制数)

主机请求帧01  06  00  01  00 03  CRC_L  CRC_H(即为子机地址+功能码+寄存器地址高字节+寄存器地址低字节+写入值高字节+写入值低字节+CRC_L_CRC_H);

子机响应帧01  06  00  01  00 03  CRC_L  CRC_H(即为子机地址+功能码+输出寄存器地址高字节+输出寄存器地址低字节+输出写入值高字节+输出写入值低字节+CRC_L_CRC_H)。

2.3.3.3 写多个寄存器值0x10

使用该功能码写连续寄存器块(1 至约 120 个寄存器)

同上面两个功能码同理,就不一一介绍了;

2.3.3.4  其它功能码

错误码:0x86

异常码:01、02、03、04

等等

2.3.4 CRC校验

基于循环冗余校验 (CRC - Cyclical RedundancyChecking) 算法的错误检验域;

CRC 检验是对整个报文帧内容的校验,即使没有奇偶校验位,也要执行此检验;

CRC 的值由主机端根据算法计算而来,它由两个字节组成,低字节在前,高字节为报文发送的最后一个字节;从机接受到报文后也会去计算CRC值,计算结果与主机发送过来的CRC值比较,相等即为校验通过,传输的数据无误。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

RS485、MODBUS通信协议浅显易懂篇 的相关文章

  • 安装 mysqlclient==1.3.12 报错:OSError: mysql_config not found

    安装 mysqlclient 1 3 12 报错 OSError mysql config not found Collecting mysqlclient 1 3 12 Using cached mysqlclient 1 3 12 ta
  • 【Mo 人工智能技术博客】时间序列预测——DA-RNN模型

    时间序列预测 DA RNN模型 作者 梅昊铭 1 背景介绍 传统的用于时间序列预测的非线性自回归模型 NRAX 很难捕捉到一段较长的时间内的数据间的时间相关性并选择相应的驱动数据来进行预测 本文将介绍一种基于 Seq2Seq 模型 Enco
  • 在centos7安装anaconda3操作手册

    一 Anaconda下载 进入anaconda官方网站下载个人免费版本 网站链接 点击download 选择Linux平台的安装包 二 Anaconda安装 1 执行如下指令 安装anaconda 进入当保存文件的目录 执行此指令 后期由于
  • Jina AI‘2021

    2022 农历新年进入倒数阶段 回望 2021 因为有了社区和开发者们的支持和助力 Jina AI 从产品 社区 到用户案例及团队 都取得了一些相当哇塞的成就 接下来 我们就一起来重温一下 2021 年 Jina AI 的惊喜变化 领取 J
  • 第十一天栈与队列

    20 有效的括号 力扣题目链接 opens new window 给定一个只包括 的字符串 判断字符串是否有效 有效字符串需满足 左括号必须用相同类型的右括号闭合 左括号必须以正确的顺序闭合 注意空字符串可被认为是有效字符串 题外话 括号匹

随机推荐

  • opencv项目实践一(答题卡识别)

    答题卡素材图片 思路 读入图片 做一些预处理工作 进行轮廓检测 然后找到该图片最大的轮廓 就是答题卡部分 进行透视变换 以去除除答题卡外的多于部分 并且可以对答题卡进行校正 再次检测轮廓 定位每个选项 对选项圆圈先按照竖坐标排序 再按照行坐
  • 十进制有符号小数转换成二进制数的实现_Matlab实现_归一化处理

    在一些数据处理过程中 需要将一组十进制小数转换成二进制数存储或者计算 这种操作在FPGA的使用中会经常遇到 本文分析了十进制小数转换成二进制数的方法 1 N位二进制数的取值范围 N位无符号型 unsigned 取值范围 2 N 1 0 可以
  • Java中守护线程的总结 thread.setDaemon(true)

    https www cnblogs com ziq711 p 8228255 html 在Java中有两类线程 User Thread 用户线程 Daemon Thread 守护线程 用个比较通俗的比如 任何一个守护线程都是整个JVM中所有
  • 服务器windows系统数据盘不显示不出来,解决云主机没有显示数据盘的问题

    随着网络的发展 越来越多的站长与企业都在使用云主机 但是目前由于云主机的尚未成熟 所有大家在使用过程中经常会遇到使用方面的问题 下面我们总结了下有关云主机重装或者初建时数据盘不见的问题做了解说 希望对大家有所帮助 经常会有用户询问 我们的云
  • R语言KERAS深度学习CNN卷积神经网络分类识别手写数字图像数据(MNIST)

    最近我们被客户要求撰写关于卷积神经网络的研究报告 包括一些图形和统计输出 在本文中 我们将学习如何使用keras 用手写数字图像数据集 即MNIST 进行深度学习 本文的目的是为了让大家亲身体验并熟悉培训课程中的神经网络部分 1 软件包的下
  • Vue-cli安装文档及使用(搭建vue-cli、nodejs、webpack架子)

    之前学习基础语法 todolist 所有的代码写在index html之中 大型项目不可维护 在真实vue项目开发过程中 会借助webpack打包工具帮助构建大型项目开发目录 再开发完成之后进行打包的操作 帮助生成线上可运行的代码 如果让每
  • 树莓派教程 - 1.5 树莓派GPIO库wiringPi 使用硬件串口ttyAMA0与ttyS0

    Git例程源码仓库 https github com ZhiliangMa raspberry git 上一篇介绍 ttyS0串口的用法 说到了此串口利弊 可能会出现乱码 但绝对能满足绝大部分的要求 本节使用 dev ttyAMA0 的方法
  • CentOS7 安装配置FTP服务器的问题

    C C 气象数据中心实战工业级项目系列 第三章 CentOS7 安装配置FTP服务器的问题 文章目录 C C 气象数据中心实战工业级项目系列 一 参考 二 设置 data ftp ftpuser upload目录 代表着只能在这个目录中上传
  • mysql in和exists性能比较和使用

    in 是把外表和内表作hash 连接 而exists是对外表作loop循环 每次loop循环再对内表进行查询 一直以来认为exists比in效率高的说法是不准确的 如果查询的两个表大小相当 那么用in和exists差别不大 如果两个表中一个
  • 【Redis入门】-浅谈redis事务

    说到事务大家都不陌生 在关系型数据库中 事务时并发控制的基本单位 他是一个操作的序列 可以包含多个指令 并且 对于一个事务 其内部的指令要么全部执行 要么都不执行 内部指令不可分割 关系型数据库的事务具有四个特性 1 原子性 2 一致性 3
  • 【大数据】Flink 详解(六):源码篇 Ⅰ

    本系列包含 大数据 Flink 详解 一 基础篇 大数据 Flink 详解 二 核心篇 大数据 Flink 详解 三 核心篇 大数据 Flink 详解 四 核心篇 大数据 Flink 详解 五 核心篇 大数据 Flink 详解 六 源码篇
  • 如何解决主机发送地址之后 从机没有发出ACK应答信号给主机

    1 iic总线从机没有返回应答给主机 我用的一个带有iic接口电量计和我的单片机通讯 我用逻辑分析仪分析数据发现主机写一个字节数据后从机并没有返回一个ack给主机 导致我后面读取从机的数据时全部是ff 请问各位iic大神 我该怎么去查问题呢
  • 给kali的Metasploit下添加一个新的exploit

    转载 https blog csdn net SilverMagic article details 40978081 首先在 usr share metasploit framework modules exploits 目录下新建一个自
  • SpringCloud01:认识微服务

    SpringCloud01 1 认识微服务 随着互联网行业的发展 对服务的要求也越来越高 服务架构也从单体架构逐渐演变为现在流行的微服务架构 这些架构之间有怎样的差别呢 1 0 学习目标 了解微服务架构的优缺点 1 1 单体架构 单体架构
  • 从服务器拿文件,怎么从远程服务器拿文件夹

    怎么从远程服务器拿文件夹 内容精选 换一换 添加节点时提示 添加节点失败 节点已存在 待添加节点的服务器上已安装系统性能分析或者添加过节点 如果待添加节点的服务器上已安装系统性能分析 需要登录服务器卸载系统性能分析 详细步骤请参见卸载 卸载
  • [一步一步学react系列] 04—计算器Demo

    前言 之前的例子都是写的计数器 加一减一的功能 我们大致弄懂了redux分层和store数据管理 下面我们将结合现有知识写一个终极版的计算器 以此巩固所学知识 知识点 redux分层 react router 一些算法及数据结构知识 栈 中
  • 调用ChatGpt openai官方node.js包Error: connect ETIMEDOUT问题

    原因是调用的axios库不走系统代理 需要额外配置 openai在文档中有说明增加axios配置的方法 只需请求时配置下proxy就ok了
  • Understand(代码分析工具)的安装教程

    前言 最近在学习嵌入式系统时 写的代码越来越多 一个文件里面函数的数量也越来越多 为方便查看写了哪些函数 以及文件总体架构 在网上找了半天 找到了Understand这款神器 相比于vscode 该软件占内较少 查看结构更直接 文章目录 前
  • JavaScript 获取数组的最后一个元素

    index取值 args args length 1 pop方法 args pop 注意 pop方法会删除args最后一个元素 并返回
  • RS485、MODBUS通信协议浅显易懂篇

    前言 MODBUS协议是Modicon公司发表的一种串行通信协议 属于OSI模型中应用层的协议 现广泛应用于工业控制领域 它的主要特点是免费开放 支持多种电气接口 如RS 232 RS 485 传输介质可以是双绞线 光纤 无线等 RS485