Qt应用软件【协议篇】Modbus详细介绍

news2024/11/18 7:50:57

文章目录

  • 概述
    • Modbus 485协议概述
    • 在工业自动化中的应用
  • 通信模式
    • 数据模型
    • 功能码
  • Modbus RTU
    • 示例 1:读取保持寄存器
    • 示例 2:写入单个线圈
    • 示例 3:写入多个保持寄存器
    • 报文传输
  • Modbus ASCII
    • 报文示例
    • 报文传输
  • Modbus TCP
    • 报文示例
    • 报文传输

在这里插入图片描述

概述

在工业自动化领域,有效的通信协议是确保生产线顺畅运行的关键。其中,Modbus 485协议因其可靠性、灵活性和简单性,成为了众多自动化系统的首选。本文将深入探讨Modbus 485协议的核心特性、工作原理及其在工业环境中的应用。

Modbus 485协议概述

Modbus 485是一种基于Modbus协议运行在RS-485物理层的通信方式。Modbus协议本身是一个简单的应用层协议,设计用于客户端和服务器之间的通信。而RS-485则是一种差分式串行通信标准,特别适合于工业环境。

  • 差分信号传输

RS-485的核心在于其差分信号传输方式,能显著减少电磁干扰,提高长距离通信的可靠性。在Modbus 485网络中,所有的数据通信都是通过这种方式进行的。

  • 多点网络

与其他通信标准不同的是,RS-485支持多点网络。这意味着在一个Modbus 485网络中,可以有多达32个设备同时连接,从而形成一个复杂的自动化控制网络。

  • 网络拓扑

Modbus 485通常采用总线型拓扑结构,所有设备通过一根双绞线连接。这种结构简化了布线要求,降低了建立大型网络的成本。

在工业自动化中的应用

Modbus 485在工业自动化中的应用广泛。它被用于连接各种工业设备,如传感器、执行器、PLC(可编程逻辑控制器)和HMI(人机界面)。

  • 可靠性和灵活性

在嘈杂的工业环境中,Modbus 485的可靠性尤为重要。差分信号传输减少了干扰,确保了信号的准确传输。同时,Modbus协议的简单性使得它易于实现和维护,适用于各种不同的应用场景。

  • 易于扩展和集成

由于Modbus协议的开放性,许多制造商的设备都支持Modbus 485,这使得不同品牌和型号的设备能够轻松集成到同一个网络中。同时,网络的扩展也变得非常简单。

通信模式

  • Modbus RTU:在串行通信中最常用,基于二进制,使用CRC校验。
  • Modbus ASCII:同样用于串行通信,基于ASCII字符,使用LRC校验。
  • Modbus TCP:用于以太网通信,基于TCP/IP协议,更适合现代网络环

数据模型

Modbus协议使用一个简单的数据模型,包括四种基本的对象类型:

  1. 线圈(Coils):可读写的二进制值,通常用于表示开/关状态。
  2. 离散输入(Discrete Inputs):只读的二进制值,通常用于传感器或开关状态的读取。
  3. 输入寄存器(Input Registers):只读的16位寄存器,用于存储模拟输入如温度、压力等。
  4. 保持寄存器(Holding Registers):可读写的16位寄存器,用于设置模拟输出或存储变量。

功能码

Modbus协议定义了一系列功能码(Function Codes),用于执行不同的操作。以下是一些常见的功能码:

  1. 读线圈(Read Coils, 功能码 01):读取一个或多个线圈的状态。
  2. 读离散输入(Read Discrete Inputs, 功能码 02):读取一个或多个离散输入的状态。
  3. 读保持寄存器(Read Holding Registers, 功能码 03):读取一个或多个保持寄存器的内容。
  4. 读输入寄存器(Read Input Registers, 功能码 04):读取一个或多个输入寄存器的内容。
  5. 写单个线圈(Write Single Coil, 功能码 05):写入单个线圈的状态。
  6. 写单个寄存器(Write Single Register, 功能码 06):写入单个保持寄存器的内容。
  7. 写多个线圈(Write Multiple Coils, 功能码 15):写入多个线圈的状态。
  8. 写多个寄存器(Write Multiple Registers, 功能码 16):写入多个保持寄存器的内容。
  9. 诊断(Diagnostics, 功能码 08):包括子功能码,用于测试和诊断。
  10. 掩码写寄存器(Mask Write Register, 功能码 22):修改保持寄存器中特定位的内容,而不改变其他位。

Modbus RTU

Modbus RTU(Remote Terminal Unit)是Modbus协议的一种实现,它是基于串行通信的,并使用二进制数据编码。在Modbus RTU模式下,数据包(报文)由一系列的二进制字节组成,每个字节由8位组成。Modbus RTU报文具有紧凑的结构,使得通信更加高效。以下是Modbus RTU报文的主要组成部分:

1. 设备地址(Slave Address)

  • 长度:1个字节
  • 描述:这是报文的第一个字节,用于指定目标设备(从站)的地址。在Modbus网络中,每个从站都有一个唯一的地址(1到247)。地址0用于广播消息,所有从站都会接收但不会响应。

2. 功能码(Function Code)

  • 长度:1个字节
  • 描述:功能码定义了请求的类型或要执行的操作,如读取或写入数据。常见的功能码包括读取线圈、读取输入寄存器、写入单个寄存器等。

3. 数据(Data)

  • 长度:可变
  • 描述:数据字段的长度和内容取决于功能码。它可能包含要读取或写入的寄存器的地址、要读取或写入的数据量,以及实际要写入的数据。

4. 校验和(Error Check)

  • 长度:2个字节
  • 描述:Modbus RTU报文使用循环冗余校验(CRC)作为错误检测机制。CRC字段位于报文的末尾,用于检测报文在传输过程中是否发生错误。

示例 1:读取保持寄存器

假设一个主站(Master)向地址为1的从站(Slave)发送一个请求,要求读取从地址30001开始的3个保持寄存器。

  • 设备地址: 0x01
  • 功能码: 0x03(读取保持寄存器)
  • 起始地址: 0x0000(寄存器地址从30001开始,但在Modbus中,地址从0开始计数,因此30001对应0x0000)
  • 数量: 0x0003(读取3个寄存器)
  • CRC: 假设为0xC40B

完整的请求报文为:01 03 00 00 00 03 C4 0B

假设从站的响应报文包含这3个寄存器的值,分别为0x000A, 0x000B和0x000C。

  • 设备地址: 0x01
  • 功能码: 0x03
  • 字节数: 0x06(因为返回3个寄存器,每个寄存器2字节)
  • 数据: 0x000A 0x000B 0x000C
  • CRC: 假设为0x9B4E

完整的响应报文为:01 03 06 00 0A 00 0B 00 0C 9B 4E

示例 2:写入单个线圈

假设主站要向地址为2的从站发送一个请求,以打开(设置为ON或True)地址20001处的单个线圈。

  • 设备地址: 0x02
  • 功能码: 0x05(写单个线圈)
  • 线圈地址: 0x0000(线圈20001在Modbus中对应地址0x0000)
  • 线圈值: 0xFF00(0xFF00表示ON,0x0000表示OFF)
  • CRC: 假设为0xF8 0x2B

完整的请求报文为:02 05 00 00 FF 00 F8 2B

从站的响应报文将会回显此请求。

  • 设备地址: 0x02
  • 功能码: 0x05
  • 线圈地址: 0x0000
  • 线圈值: 0xFF00
  • CRC: 假设为0xF8 0x2B

完整的响应报文为:02 05 00 00 FF 00 F8 2B

示例 3:写入多个保持寄存器

假设主站想向地址为3的从站写入两个保持寄存器,起始地址为40001。

  • 设备地址: 0x03
  • 功能码: 0x10(写多个寄存器)
  • 起始地址: 0x0000(40001对应0x0000)
  • 寄存器数量: 0x0002
  • 字节数: 0x04(写入2个寄存器,每个寄存器2字节)
  • 数据: 0x1234 0x5678(要写入的寄存器值)
  • CRC: 假设为0xC3F9

完整的请求报文为:03 10 00 00 00 02 04 12 34 56 78 C3 F9

从站的响应报文将会回显此请求,但不包含寄存器的实际值。

  • 设备地址: 0x03
  • 功能码: 0x10
  • 起始地址: 0x0000
  • 寄存器数量: 0x0002
  • CRC: 假设为0xD0FA

完整的响应报文为:`03 10

报文传输

在Modbus RTU中,报文之间有一个时间间隔,用于区分连续的报文。如果在预定的时间内没有检测到新的报文开始,那么接收方将认为当前报文已经结束。

Modbus ASCII

Modbus ASCII是Modbus协议的另一种实现形式,主要用于串行通信。与Modbus RTU不同,Modbus ASCII以ASCII字符表示数据,而不是二进制格式。这种格式使得数据在传输过程中更易于阅读和调试,尽管它的数据传输效率略低于RTU模式。下面是Modbus ASCII报文的主要组成部分:

1. 起始字符(Start Character)

  • 字符:“:”
  • 描述:每个Modbus ASCII报文以冒号(“:”)开始,表示报文的开始。

2. 设备地址(Slave Address)

  • 长度:2个ASCII字符(1个字节的十六进制表示)
  • 描述:这部分指定目标设备(从站)的地址。地址是以两个ASCII字符表示的十六进制数。

3. 功能码(Function Code)

  • 长度:2个ASCII字符(1个字节的十六进制表示)
  • 描述:功能码定义了请求的类型或要执行的操作,如读取或写入数据。

4. 数据(Data)

  • 长度:可变,每个字节由2个ASCII字符表示
  • 描述:数据字段包含与功能码相关的额外信息,如寄存器地址、数量或要写入的值。

5. 校验和(Error Check)

  • 长度:2个ASCII字符(1个字节的LRC校验和的十六进制表示)
  • 描述:Modbus ASCII使用纵向冗余校验(LRC)作为错误检测机制。LRC字段位于报文的末尾,用于校验报文的完整性。

6. 结束字符(End Character)

  • 字符:CR LF(回车和换行)
  • 描述:每个Modbus ASCII报文以一对字符CR(回车,ASCII 0x0D)和LF(换行,ASCII 0x0A)结束,表示报文的结束。

报文示例

假设一个主站向地址为1的从站发送请求,要求读取从地址30001开始的3个保持寄存器。

  • 起始字符: “:”
  • 设备地址: “01”
  • 功能码: “03”(读取保持寄存器)
  • 数据:包含起始寄存器地址"0000"和要读取的寄存器数量"0003"
  • LRC校验和:假设为"0A"
  • 结束字符:CR LF

完整的请求报文为:“:0103000000030ACRLF”

报文传输

Modbus ASCII模式提供了一种以文本形式传输数据的方法,这在某些应用中可能更方便。由于其数据以ASCII字符形式表示,因此报文较易于阅读和调试,但由于每个数据字节需要两个字符来表示,其数据传输效率低于RTU模式。尽管如此,Modbus ASCII仍然是工业通信中一种重要的选项。

Modbus TCP

Modbus TCP是Modbus协议的一种实现,它运行在TCP/IP网络上,使Modbus协议能够在以太网环境中使用。与Modbus RTU和ASCII相比,Modbus TCP不依赖于串行通信,因此能够更好地适应现代网络基础设施。在Modbus TCP中,Modbus报文被封装在TCP/IP帧中进行传输。以下是Modbus TCP报文的主要组成部分:

1. 事务标识符(Transaction Identifier)

  • 长度:2个字节
  • 描述:事务标识符用于唯一标识主站的请求。这对于处理并发请求特别重要,因为它允许从站将响应正确地关联到相应的请求。

2. 协议标识符(Protocol Identifier)

  • 长度:2个字节
  • 描述:在Modbus TCP中,此字段始终为0x0000,用于标识Modbus协议。

3. 长度字段(Length Field)

  • 长度:2个字节
  • 描述:长度字段表示接下来的整个Modbus报文长度,包括单元标识符、功能码和数据字段的长度。

4. 单元标识符(Unit Identifier)

  • 长度:1个字节
  • 描述:单元标识符用于标识远程从站,类似于Modbus RTU和ASCII中的从站地址。在直接连接到以太网的设备中,通常设置为0xFF。

5. 功能码(Function Code)

  • 长度:1个字节
  • 描述:功能码定义了请求的类型或要执行的操作,如读取或写入数据。

6. 数据(Data)

  • 长度:可变
  • 描述:数据字段包含与功能码相关的附加信息,如寄存器地址、数量或要写入的值。

报文示例

假设一个主站发送一个请求到从站,要求读取从地址30001开始的3个保持寄存器。在Modbus TCP中,该请求的报文可能如下所示:

  • 事务标识符: 0x0001
  • 协议标识符: 0x0000
  • 长度: 0x0006
  • 单元标识符: 0xFF
  • 功能码: 0x03(读取保持寄存器)
  • 数据: 包括起始寄存器地址0x0000和要读取的寄存器数量0x0003

完整的请求报文为:0001 0000 0006 FF 03 0000 0003

从站的响应报文将包含所请求寄存器的值。

报文传输

Modbus TCP使Modbus协议能够适应现代网络环境,提供了基于TCP/IP的工业通信解决方案。它保留了Modbus协议的简单和灵活性,并通过以太网提高了通信速度和范围。随着工业互联网(IIoT)和工业4.0的发展,Modbus TCP在现代工业自动化系统中变得越来越重要。

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

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

相关文章

《HTML 简易速速上手小册》第7章:HTML 多媒体与嵌入内容(2024 最新版)

文章目录 7.1 在HTML中嵌入视频和音频7.1.1 基础知识7.1.2 案例 1&#xff1a;嵌入视频文件7.1.3 案例 2&#xff1a;嵌入音频文件7.1.4 案例 3&#xff1a;创建一个视频和音频混合的播放列表 7.2 使用 <iframe> 嵌入外部内容7.2.1 基础知识7.2.2 案例 1&#xff1a;嵌入…

如何使用保留可探测字段参数的方法解决视频监控管理平台EasyCVR无法启动的问题

安防视频监控/视频集中存储/云存储/磁盘阵列EasyCVR平台可拓展性强、视频能力灵活、部署轻快&#xff0c;可支持的主流标准协议有国标GB28181、RTSP/Onvif、RTMP等&#xff0c;以及支持厂家私有协议与SDK接入&#xff0c;包括海康Ehome、海大宇等设备的SDK等。平台既具备传统安…

MySQL原理(二)存储引擎(1)概述

一、存储引擎介绍 1、概念&#xff1a; &#xff08;1&#xff09;MySQL中的数据用各种不下同的技术存储在文件中&#xff0c;每一种技术都使用不同的存储机制、索引技巧、锁定水平并最终提供不同的功能和能力&#xff0c;这些不同的技术以及配套的功能在MySQL中称为存储引擎…

[GN] 设计模式——面向对象设计原则概述

文章目录 面向对象设计原则概述单一职责原则开闭原则里氏代换原则依赖倒转原则接口隔离原则合成复用原则迪米特法则 总结 提示&#xff1a;以下是本篇文章正文内容&#xff0c;下面案例可供参考 面向对象设计原则概述 单一职责原则 一个类只负责一个功能领域中的相应职责 类…

C# 使用WMI监听进程的启动和关闭

写在前面 Windows Management Instrumentation&#xff08;WMI&#xff09;是用于管理基于 Windows 操作系统的数据和操作的基础结构。具体的API可以查看 WMI编程手册。 WMIC 是WMI的命令行管理工具&#xff0c;使用 WMIC&#xff0c;不但可以管理本地计算机&#xff0c;还可…

知识宣传手册该怎么制作?

​制作知识宣传手册是一个很好的方式来传播知识&#xff0c;提高公众对特定主题的了解。它们不仅能帮助我们传播重要信息&#xff0c;还能激发人们的求知欲&#xff0c;推动社会的进步。那么&#xff0c;如何制作一份引人入胜的知识宣传手册呢&#xff1f; 今天教大家一个很简单…

【云原生】docker-compose单机容器集群编排工具

目录 一、docker-compose容器编排的简介 二、docker-compose的使用 1、docker-compose的安装 2、docker-compose的配置模板文件yaml文件的编写 &#xff08;1&#xff09;布尔值类型 &#xff08;2&#xff09;字符串类型 &#xff08;3&#xff09;一个key有多个值 &am…

[React源码解析] Fiber

在React15及以前, Reconciler采用递归的方式创建虚拟Dom, 但是递归过程不可以中断, 如果组件的层级比较深的话, 递归会占用线程很多时间, 那么会造成卡顿。 为了解决这个问题, React16将递归的无法中断的更新重构为异步的可中断更新, Fiber架构诞生。 文章目录 1.Fiber的结构2…

Matlab基础语法

基础语法 %% Matlab基本的小常识 % (1)在每一行的语句后面加上分号(一定要是英文的哦;中文的长这个样子&#xff1b;)表示不显示运行结果 a 3; a 5% (2)多行注释:选中要注释的若干语句,快捷键CtrlR % a 3; % a 5% (3)取消注释:选中要取消注释的语句,快捷键CtrlT % 我想要取…

python字典JSON 和csv文件

JSON与Python字典 Python中的字典与JSON非常类似而且支持嵌套结构。Json通过key取值的过程和python字典通过索引取值过程完全一致。JavaScript数据类型&#xff08;值&#xff09;对应的Python数据类型&#xff08;值&#xff09; JSONPythonobjectdictarraylist/tuplestring…

链表——超详细

一、无头单向非循环链表 1.结构&#xff08;两个部分&#xff09;&#xff1a; typedef int SLTDataType; typedef struct SListNode {SLTDataType data;//数据域struct SListNode* next;//指针域 }SLNode; 它只有一个数字域和一个指针域&#xff0c;里面数据域就是所存放的…

备战蓝桥杯---数据结构与STL应用(基础实战篇1)

话不多说&#xff0c;直接上题&#xff1a; 当然我们可以用队列&#xff0c;但是其插入复杂度为N,总的复杂度为n^2,肯定会超时&#xff0c;于是我们可以用链表来写&#xff0c;同时把其存在数组中&#xff0c;这样节点的访问复杂度也为o(1).下面是AC代码&#xff1a; 下面我们来…

Flutter 高级动画技术综合指南

在动画领域&#xff0c;Flutter 提供了一系列功能&#xff0c;包括基于物理的动画&#xff0c;可以模拟真实世界的动态&#xff0c;在应用程序中创建更逼真和自然的运动。 本文将深入研究 Flutter 动画&#xff0c;探索各种类型&#xff0c;并演示如何在项目中实现它们。 Flu…

Hana SQL+正则表达式

目录 一、Pre 前言 二、知识点拆解 1&#xff09;case when…then…else 2&#xff09;json_value 函数 拓展资料 3&#xff09;CAST 函数 拓展资料 4) ROUND 函数 5&#xff09;occurences_regexpr 函数 拓展资料 6&#xff09;正则表达式 拓展资料 三、整合分析…

【openGauss】openEuler 22.03 LTS 安装了openGauss数据库后yum不可用

问题描述 尝试使用yum时出现依赖包缺少依赖版本的问题&#xff0c;主要问题时在安装openGauss时&#xff0c;通过脚本创建omm用户和dbgrp组导致的&#xff0c;如果用户和组是提前创建好的就不会出现这样的问题 报错&#xff1a;version GLIBCXX_3.4.26’ not found 报错信息 …

计算机视觉:高级图像处理,满足您的所有需求。

一、说明 特征提取是机器学习管道中的关键步骤&#xff0c;可增强模型在不同数据集上的泛化和良好表现能力。特征提取方法的选择取决于数据的特征和机器学习任务的具体要求。本文揭示图像处理的数学原理&#xff0c;实现增强的计算机视觉 二、关于计算机视觉的普遍问题 在计算机…

DL/T645、IEC104转MQTT网关BE113

随着电力系统信息化建设和数字化转型的进程不断加速&#xff0c;对电力能源的智能化需求也日趋增强。健全稳定的智慧电力系统能够为工业生产、基础设施建设以及国防建设提供稳定的能源支持。在此背景下&#xff0c;高性能的工业电力数据传输解决方案——协议转换网关应运而生&a…

【动态规划】【图论】【C++算法】1575统计所有可行路径

作者推荐 【动态规划】【字符串】【行程码】1531. 压缩字符串 本文涉及知识点 动态规划汇总 图论 LeetCode1575统计所有可行路径 给你一个 互不相同 的整数数组&#xff0c;其中 locations[i] 表示第 i 个城市的位置。同时给你 start&#xff0c;finish 和 fuel 分别表示出…

github添加 SSH 密钥

1 打开终端 输入 ssh-keygen -t rsa -b 4096 -C "github邮箱地址"如果不需要密码可以一路回车 出现这个页面就是生存成功了 open ~/.ssh // 打开.ssh 找到id_rsa.pub复制出内容新建ssh密钥输入内容,保存即可

JavaWeb中的Filter(过滤器)和 Listener(监听器)

提示&#xff1a;这两个东西听起来似乎很难&#xff0c;实际上是非常简单的&#xff0c;按照要求写就行了&#xff0c;一定不要被新名词给吓到了。 JavaWeb中的Filter&#xff08;过滤器&#xff09; 一、Filter&#xff08;过滤器&#xff09;1.如何编写 Filter2.Filter 中的细…