RS485、MODBUS通信协议详解

news2024/11/17 1:48:31

前言

        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值比较,相等即为校验通过,传输的数据无误。

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

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

相关文章

java-JVM内存区域JVM运行时内存

一. JVM 内存区域 JVM 内存区域主要分为线程私有区域【程序计数器、虚拟机栈、本地方法区】、线程共享区域【JAVA 堆、方法区】、直接内存。线程私有数据区域生命周期与线程相同, 依赖用户线程的启动/结束 而 创建/销毁(在 HotspotVM 内, 每个线程都与操作系统的本地线程直接映…

Beats:安装及配置 Metricbeat (一)- 8.x

在我之前的文章: Beats:Beats 入门教程 (一)Beats:Beats 入门教程 (二) 我详细描述了如何在 Elastic Stack 7.x 安装及配置 Beats。在那里的安装,它通常不带有安全及 Elasticsearc…

机器视觉基础实验-Panorama Stitching

文章目录 1、实验内容2、实验设计(略)3、实验环境及实验数据集四、实验过程及结果4.1 Harris角点检测器寻找关键点4.2 构建描述算子来描述图中的每个关键点,比较两幅图像的两组描述子,并进行匹配。4.3 根据一组匹配关键点&#xf…

Nginx的安装及负载均衡搭建

一.Nginx的安装 1)准备安装环境 yum install -y make gcc gcc-c pcre-devel pcre zlib zlib-devel openssl openssl-develPERE PCRE(Perl Compatible Regular Expressions)是一个Perl库,包括 perl 兼容的正则表达式库。 nginx的http模块使用pcre来解…

每天一练:SpringBoot连接mq

目录 每天一练:Springboot连接rabbitmq 每天一练:Springboot连接rabbitmq 目录一、部署Rabbitmq?二、增加maven依赖三、连接RabbitMq四、发布和订阅消息总结 一、部署Rabbitmq? 这里rabbitmq采用docker安装部署。 拉取docker镜像 [root192 ~]# docker…

349. 两个数组的交集 题解

题目描述:349. 两个数组的交集 - 力扣(LeetCode) 给定两个数组 nums1 和 nums2 ,返回 它们的交集 。输出结果中的每个元素一定是 唯一 的。我们可以 不考虑输出结果的顺序 。 方法一: 解题思路: 我们可以…

《零基础7天入门Arduino物联网-04》电路基础知识上

配套视频课程:《零基础学Arduino物联网,入门到进阶》 配套课件资料获取:微联实验室 配套学习套件购买:淘宝搜索店铺【微联实验室】 直流电与交流电 直流电(DC) 是指电流的方向始终保持不变的电流。这意味着…

Hyperledger Fabric的使用及开发

Hyperledger Fabric是Linux基金会发起的一种跨行业的区块链技术,目前在多家大型公司有着应用,这里就不多做HF本身的介绍了,有兴趣可关注其官网。 1. 准备工作: 开始前需要一定的准备工作,安装各类中间件:…

JVM——HotSpot的算法细节实现

一、根节点枚举 固定可作为GC Roots的节点主要在全局性的引用(如常量或类静态属性)与执行上下文(如栈帧中的本地变量表)中,尽管目标明确,但查找要做到高效很难。现在java应用越来越庞大,光方法区…

啥是虚拟机

虚拟机这个概念第一次听到还是在我大二学计算机网络做实验的时候听说过,第二次算比较熟练地使用应该是在大三下学期的大数据课程,做实验的时候也算是学到了许多Linux的命令。但到底什么是虚拟机,我还是搞不清楚的,所以&#xff0c…

【八股】2023秋招八股复习笔记1(CSBase+部分WXG题)

文章目录 MYSQL & redis网络 & 系统安全 & C招聘要求(x3)部分面经和题目(WXG-后端)(x5) MYSQL & redis redis:memcached/mysql,线程模型(6.0多线程&…

css实现div内文字自动滚动

网上找了好久&#xff0c;终于找到了个能实现的&#xff0c;把它整理一下。 需求&#xff1a;表格内字体过长实现自动滚动 实现思路如下&#xff1a; html&#xff1a; <div class"item-column" style"background: rgb(12, 87, 154); width: 18%; height: 6…

Msvcr120.dll文件缺失怎么办.msvcr120.dll错误的解决方法

在使用某些软件时你是否有遇到过Msvcr120.dll文件缺失&#xff0c;msvcr120.dll是 Microsoft Visual C Redistributable 中的一个重要文件&#xff0c;所以它的缺失会导致应用程序无法正常使用或崩溃。那么出现这种情况应该怎么办呢&#xff1f;以下教大家几种解决方法。 一.导…

线性代数(四) 特征值相似矩阵

前言 前面主要讲述的是方程组和矩阵的关系&#xff0c;现在了解下矩阵和矩阵的关系 方阵的特征值与特征向量 假设A为n阶方阵&#xff0c;对于一个数 λ \lambda λ 若存在&#xff1a;非零列向量 α \alpha α&#xff0c;使得&#xff1a; A α ⃗ λ α ⃗ A\vec{\alp…

轮腿机器人的PID控制

1 PID介绍 PID&#xff08;Proportional Integral Derivative&#xff09;控制系统。其实质是根据输入的偏差值&#xff0c;按比例、积分、微分的函数关系进行运算&#xff0c;运算结果用以输出进行控制。它是在长期的工程实践中总结出来的一套控制方法&#xff0c;实际运行经…

在CentOS 7上使用kubeadm部署Kubernetes集群

如有错误&#xff0c;敬请谅解&#xff01; 此文章仅为本人学习笔记&#xff0c;仅供参考&#xff0c;如有冒犯&#xff0c;请联系作者删除&#xff01;&#xff01; 前言&#xff1a; Kubernetes是一个开源的容器编排平台&#xff0c;用于管理和自动化部署容器化的应用程序。…

C#8.0本质论第三章--更多数据类型

C#8.0本质论第三章–更多数据类型 3.1类型的划分 一个类型要么是值类型&#xff0c;要么是引用类型。区别在于拷贝方式&#xff1a;值类型数据总是拷贝值&#xff1b;引用类型的数据总是拷贝引用。 3.1.1值类型 3.1.2引用类型 引用类型的变量存储对数据存储位置的引用。 3.…

Datawhale Django入门组队学习Task02

Task02 首先启动虚拟环境&#xff08;复习一下之前的&#xff09; 先退出conda的&#xff0c; conda deactivate然后cd到我的venv下面 &#xff0c;然后cd 到 scripts&#xff0c;再 activate &#xff08;powershell里面&#xff09; 创建admin管理员 首先cd到项目路径下&a…

笨办法学python3进阶篇pdf,笨方法学 python3怎么样

本篇文章给大家谈谈《“笨办法”学python(第3版)》&#xff0c;以及笨办法学python3进阶篇pdf下载&#xff0c;希望对各位有所帮助&#xff0c;不要忘了收藏本站喔。 接着前天的总结 习题21&#xff1a;函数可以返回某些东西 定义函数的加减乘除&#xff0c;以及嵌套使用 习题2…

PHP实现轻量级WEB服务器接收HTTP提交的RFID刷卡信息并回应驱动读卡器显示播报语音

本示例使用的读卡器&#xff1a;RFID网络WIFI无线TCP/UDP/HTTP可编程二次开发读卡器POE供电语音-淘宝网 (taobao.com) <?php mb_http_output(utf-8); $port88; $socket socket_create(AF_INET, SOCK_STREAM, SOL_TCP); $bool socket_bind($socket, "0.0.0.0",…