Qt Modbus初识

项目场景:

项目中,需要用modbus与温控器通信,控制面板的加热温度,Qt框架下已经提供了modbus模块
在这里插入图片描述


初识Modbus

Modbus 协议是一种通信协议,而且是一种开放协议,因此广泛地用于在工业自动化系统中实现设备之间的数据交换。它是最常用的串行通信协议之一,广泛应用于监控和控制设备之间的通信。简而言之,它是用于在电子设备之间的串行线路上传输信息的方法。请求信息的设备被称为 Modbus 客户端,提供信息的设备是 Modbus 服务器。Modbus 支持单主机,多个从机,在标准 Modbus 网络中,有一个客户端和多达 247个服务器,每个服务器都有从 1 到 247 的唯一服务器地址。客户端还可以向服务器写入信息。

Modbus 通常用于从仪器和控制设备传输信号到主控制器或数据采集系统,例如用于测量温度和湿度并将结果传输到计算机的系统。Modbus 通常用于将监控计算机与远程终端单元(RTU)连接在一起,这在监控和数据采集(SCADA)系统中使用。

Modbus 协议简单易于实现,传输效率高,因此在工业自动化领域得到广泛应用。它支持多个设备之间的并行通信,可以实现分布式控制系统的互联互通。同时,Modbus 协议还具有跨平台、跨厂商的特点,使得不同厂商的设备可以进行互操作。

作为初学者,阅读Modbus协议时会发现它的概念别扭、重复、不易区分,比如线圈状态(Coil Status)、离散输入状态(Discrete Input Status)、保持寄存器(Holding Register)、输入寄存器(Input Register)。

回到事情的本质,在工业控制PLC领域,涉及数字信号的输入、输出,模拟信号的输入、输出,如下图所示:
在这里插入图片描述
在上图中,“数字量输入DI”是只读的,“数字量输出DO”是可读可写的,“模拟量输入AI”是只读的,“模拟量输出AO”是可读可写的。

上图里的“模拟量输入AI”、“模拟量输出AO”都表示“多位数值”,这些“多位数值”无需局限于只表示“模拟量”,也可以表示“多位数字量”。把AI、AO的含义扩展后,如下图所示:
在这里插入图片描述
对于软件开发而言:

  • 想得到按键输入状态时,读取到的是一位数据;
  • 想控制LED时,需要输出一位数据,想读取LED当前状态时,也可以读取到一位数据
  • 想读取参数时,读取到的“输入寄存器”,得到多位数据,比如16位数据
  • 想设置参数时,写的是“保存寄存器”,写入的是多位数据,比如16位数据;也可以读“保存寄存器”

寄存器

前面介绍 Modbus 的内容中多次提到线圈(coil)和寄存器(register)的概念,尤其是 Modbus 功能码 中,操作的对象基本上都是线圈和寄存器。

在 Modbus 协议中之所以仍然称为线圈和寄存器,完全是历史原因。在 PLC 应用领域,一个线圈就代表一个 PLC 输出点,也称为输出继电器。通过控制线圈导通与否来改变继电器输出状态,实现弱电控制强电。
在这里插入图片描述
但实际上,在如今的 Modbus 设备中,它们都只是对应一块内存区域而已。其中,线圈代表位操作(bit),表示一个布尔变量;寄存器代表字操作(word),表示一个整型变量(当然也可以通过多个字的组合,表示浮点数以及其他复合数据结构)。在 Modbus 协议中,字(word)的长度是 16 位,即 2 个字节。

Modbus协议规定,进行读写操作的数据类型,按照读写属性和类型可分为以下4种:

1. 寄存器种类

● 离散量输入(Discretes Input):1位,只读
● 线圈(Coils):1位,读写
● 输入寄存器(Input Registers):16位,只读
● 保持寄存器(Holding Registers):16位,读写

内存区块数据类型主设备访问从设备访问内容
离散量输入布尔只读读写I/O 系统提供这种类型数据
线圈布尔读写读写通过应用程序改变这种类型数据
输入寄存器无符号双字节整型只读读写I/O 系统提供这种类型数据
保持寄存器无符号双字节整型读写读写通过应用程序改变这种类型数据
寄存器种类说明与PLC类比举例说明
线圈状态(Coil Status)输出端口。可设定端口输出状态,也可以读取该位的输出状态。可分为两种不同的执行状态,例如保持型或边沿触发型。DO(数字量输出)电磁阀输出、 MOSFEF输出、LED显示等
离散输入状态(Discrete Input Status)输入端口。通过外部设定改变输入状态,可读但不可以写。DI(数字量输入)拨码开关、接近开关等
保持寄存器(HoldingRegister)输出参数或保持参数,控制器运行时被设定的某些参数,可读可写。AO(模拟量输出)模拟量输出设定值,PID运行参数,变量阀输出大小,传感器报警上限下限
输入寄存器(Input Register)输入参数。控制器运行时从外部设备获得的参数,但可读不可写。AI(模拟量输入)模拟量输入

2. 寄存器地址

在这里插入图片描述
简单记忆方法:

  • 偶数类的寄存器”是可读可写的,比如“0x”和“4x”;
  • “奇数类的寄存器”是只读的,比如“1x”和“3x”;
  • “0x”和“1x”是bit寄存器;
  • “3x”和“4x”是16bit寄存器。

Modbus 的工作原理

Modbus 是一主多从的协议,如下图所示:
在这里插入图片描述

主控发出的数据里,必定含有如下信息:

  1. 设备地址:你要访问从设备 1,还是访问从设备 2。
  2. 访问哪类寄存器,是读还是写,只访问 1 个寄存器,还是多个寄存器:这被称为功能码。
  3. 起始寄存器地址、寄存器数量:这在数据里定义。
  4. 为了保证数据传输的可靠,还附带有 CRC 检验码。

在这里插入图片描述

功能码

Modbus 协议定义了一系列功能码,用于读取和写入设备的寄存器。常用的功能码包括读取保持寄存器、读取输入寄存器、写单个保持寄存器等。通过组合使用功能码和寄存器地址,可以实现对设备的读取和控制操作。

Modbus 主要包括 3 类功能码:公共功能码、用户定义功能码和保留功能码。

功能代码有哪些?常用的功能码如下:

  • 读线圈状态(01)
  • 读离散输入状态(02)
  • 写单个线圈(05)、写多个线圈(15)
  • 读保持寄存器(03)
  • 读输入寄存器(04)
  • 写单个保存寄存器(06)、
  • 写多个保存寄存器(16)

1.1 0类代码

0 类代码通常被认为是有效 Modbus 设备的最低配置,因为此类代码可使主设备能够读取或写入数据模型。

代码说明
3读取多寄存器
16写入多寄存器

1.2 1类代码

1 类功能码由访问所有类型的数据模型所需的其他代码组成。在原始定义中,此列表包含功能码 7(读取异常)。但是,当前规范规定此代码为仅限于串行的代码。

代码说明
1读取线圈
2读取离散量输入
4读取输入寄存器
5写入单个线圈
6写入单个寄存器
7读取异常状态(仅限串行)
### 1.3 2类代码 2 类功能码表示不太常用但更为专业化的功能。例如,读取/写入多个寄存器可能有助于减少请求-响应周期的总数,但该行为仍可用 0 类代码实现。
代码说明
15写入多个线圈
20读取文件记录
21写入文件记录
22屏蔽写入寄存器
23读取/写入多个寄存器
24读取

1.4 异常

从设备使用异常来指示各种不良状况,比如错误请求或不正确输入。但是,异常也可以作为对无效请求的应用程序级响应。从设备不会响应发出异常的请求,而是忽略不完整或损坏的请求,并开始等待新的消息传入。

异常以定义好的数据包格式报告给用户。首先,将功能码返回给等同于原始功能码的请求主设备,设置最高有效位的情况除外。这等同于为原始功能码的值加上 0x80。异常响应包括一个异常码,用于代替与给定功能响应相关的正常数据。

根据标准,四个最常见的异常码是 01、02、03 和 04。下表中显示了这些代码,并附有每个功能的标准含义。

异常码含义
01不支持接收的功能码。要确认原始功能码,请从返回值中减去0x80。
02请求尝试访问的地址无效。根据标准,只有在起始地址和所请求值的编号超过216时才会发生这种情况。但是,有些设备可能会限制其
03请求包含不正确的数据。在某些情况下,这意味着参数不匹配,例如所发送寄存器的数量与“字节总数”字段之间的参数不匹配。更常见的情况是,主设备请求的数据高于从设备或协议所允许的上限。例如,主设备一次只能读取 125 个保持寄存器,而资源受限的设备可能会将此值限制为更少的寄存器。
04尝试处理请求时发生不可恢复的错误。这是一个常见异常码,表示请求有效,但从设备无法执行该请求。

三种工作模式

Modbus 协议主要有三种形式:Modbus ASCII、Modbus RTU 和 Modbus TCP/IP。Modbus ASCII 和 Modbus RTU 是基于串行通信的协议,而 Modbus TCP/IP 则是基于以太网的协议。

1. Modbus ASCII

Modbus ASCII 是一种文本协议,使用 ASCII 码表示数据。它使用起始字符(“:”)、从站地址、功能码、数据、结尾字符(换行符 CR/LF)等字段来定义通信内容,并采用的是 LRC 校验算法。数据以 ASCII 码的形式传输,通常是通过 RS-232 或 RS-485 等串行通信接口进行传输。

2. Modbus RTU

Modbus RTU 是一种二进制协议,使用二进制码表示数据。它采用起始字符、从站地址、功能码、数据等字段来定义通信内容,并使用 CRC 校验位来保证数据的完整性。Modbus RTU 通常通过 RS-232、RS-485 或 RS-422 等串行通信接口进行传输。

3. Modbus TCP/IP

Modbus TCP/IP 是一种基于以太网的协议,使用 TCP/IP 协议栈进行通信。它使用以太网帧作为数据传输的封装,通过 IP 地址和端口号来标识设备。其占用的是 502 端口,数据帧主要包括两部分:MBAP(报文头)+PDU(帧结构),数据块与串行链路是一致的。Modbus TCP/IP 可以通过以太网、无线局域网等网络介质实现设备之间的远程通信。

补充

RS-485:半双工收发接口,这是最为常用的 Modbus 物理层,信号采用差分电平编码,用一对双绞线现场布线,抗干扰性能也不错
RS-422:全双工收发接口,这种物理层也有比较多的应用,信号采用差分电平编码,需要两对双绞线现场布线,抗干扰性能也不错。与 RS-485
相比,其优势在于可以实现全双工,通信的效率高些,所需要的代价就是现场布线需要两对双绞线,增加了一定的成本。
RS-232:全双工收发接口,这个基本用在点对点通信场景下,不适合多点拓扑连接,采用共模电平编码,一般需要 Rxd/Txd/Gnd
三根线连接。

Modbus 协议

Modbus协议是一种已广泛应用于当今工业控制领域的通用通讯协议。通过此协议,控制器相互之间、或控制器经由网络(如以太网)可以和其它设备之间进行通信。Modbus协议使用的是主从通讯技术,即由主设备主动查询和操作从设备。一般将主控设备方所使用的协议称为Modbus Master,从设备方使用的协议称为Modbus Slave。

Modbus通讯物理接口可以选用串口(包括RS232、RS485和RS422等),也可以选择以太网口。其通信遵循以下的过程:

  • 主设备向从设备发送请求
  • 从设备分析并处理主设备的请求,然后向主设备发送结果
  • 如果出现任何差错,从设备将返回一个异常功能码

此协议定义了一个控制器能认识使用的消息结构,而不管它们是经过何种网络进行通信的。它描述了一控制器请求访问其它设备的过程,如何回应来自其它设备的请求,以及怎样侦测错误并记录。它制定了消息域格局和内容的公共格式。

当在Modbus网络上通信时,此协议决定了每个控制器须要知道它们的设备地址,识别按地址发来的消息,决定要产生何种行动。如果需要回应,控制器将生成反馈信息并用Modbus协议发出。在其它网络上,包含了Modbus协议的消息转换为在此网络上使用的帧或包结构。这种转换也扩展了根据具体的网络解决节地址、路由路径及错误检测的方法。

Modbus的工作方式是请求/应答,每次通讯都是主站先发送指令,可以是广播,或是向特定从站的单播;从站响应指令,并按要求应答,或者报告异常。当主站不发送请求时,从站不会自己发出数据,从站和从站之间不能直接通讯。

MODBUS 是一种应用层消息传递协议,位于 OSI 模型的第 7 层。它提供连接在不同类型总线或网络上的设备之间的客户端/服务器通信。

Modbus通信栈如下:
在这里插入图片描述
常用术语:
在这里插入图片描述
Modbus是一个请求、应答协议,并且提供统一的功能码用于数据传输服务。Modbus功能码是Modbus请求/应答PDU (Protocol Data Unit,协议数据单元)的元素之一,所谓的PDU其实就是Modbus协议定义的一个与基础通信层无关的简单协议数据单元。特定总线或网络上的Modbus协议映射能够在ADU (Application Data UInit ,应用数据单元)上引入一些附加域,从而实现完整而准确的数据传输。

为了寻求一种简洁的通信格式,Modbus协议定义了PDU模型,即功能码+数据的格式,而为了适应多种传输模式,又在PDU的基础上增加了必要的前缀 (如地址域)和后缀(如差错校验) ,形成了ADU模型(见下图)。

通用MODBUS帧如下:
在这里插入图片描述

Modbus事务处理过程:

主机设备 (或客户端)创建Modbus应用数据单元形成查询报文,其中功能码标识了向从机设备 (或服务器端)指示将要执行的操作。其中功能码占用1字节,有效的码字范围是十进制1 ~ 255 (其中128 ~255为异常响应保留) 。查询报文创建完毕,主机设备 (或客户端) 向从机设备 (或服务器端)发送报文,从机设备 (或服务器端)接收报文后根据功能码做出相应的动作,并将响应报文返回给主机设备 (或客户端),如图下所示:

MouBus事务处理(无异常)

在这里插入图片描述
如果在一个正确接收的Modbus ADU中不出现与请求Modbus功能有关的差错,那么从机设备 (或服务器端) 将返回正常的响应报文。如果出现与请求Modbus功能有关的差错,那么响应报文的功能码域将包括一个异常码,主机设备(或客户端)能够根据异常码确定下一步执行的操作;对于异常响应,服务器返回一个与原始功能码等同的码,设置该原始功能码的最高有效位为逻辑1,用于通知主设备(客户端)。如下图所示:

MouBus事务处理(异常响应)

在这里插入图片描述

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

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

相关文章

jenkins搭建及流水线配置

1.安装docker curl https://mirrors.aliyun.com/repo/Centos-7.repo >> CentOS-Base-Aliyun.repomv CentOS-Base-Aliyun.repo /etc/yum.repos.d/yum -y install yum-utils device-mapper-persistent-data lvm2yum-config-manager --add-repo http://mirrors.aliyun.com/…

CSP/信奥赛C++刷题训练:经典前缀和例题(4):洛谷P3662:Why Did the Cow Cross the Road II S

CSP/信奥赛C刷题训练:经典前缀和例题(4) [USACO17FEB] Why Did the Cow Cross the Road II S 题目描述 The long road through Farmer John’s farm has N N N crosswalks across it, conveniently numbered 1 … N 1 \ldots N 1…N ( 1 …

spring容器的启动流程

spring容器的启动流程是一个面试中比较难答的题目。这块内容比较复杂,回答的时候如果想到什么回答什么,很容易把面试官绕晕。因此比较好的回答方式就是,先理清一个大致的启动流程,再根据面试官的问题细说小点。 这里我们从Annota…

RHCE——DNS域名解析服务器、selinux、防火墙

1、DNS简介 DNS ( Domain Name System )是互联网上的一项服务,它作为将域名和 IP 地址相互映射的一个分布式 数据库,能够使人更方便的访问互联网。 DNS 系统使用的是网络的查询,那么自然需要有监听的 port 。 DNS 使…

使用和删除数据库

复习: 1. 查看所有的数据库 show databases; 2. 创建属于自己的数据库 create database 数据库名; create database if not exists 数据库名; create database if not exists 数据库名 character set utf8mb4 | collate utf8mb4_0900_ai_ci; 强烈建议在创建数…

Spring Boot集成iText实现电子签章

文章目录 一 电子签章1.1 什么是电子签章1.2 签名流程1.3 技术选型 二 实战2.1 生成数字证书2.2 生成印章图片2.3 PDF 签名 一 电子签章 1.1 什么是电子签章 基于《中华人民共和国电子签名法》等相关法规和技术规范,具有法律效力的电子签章一定是需要使用 CA 数字…

第5章 中级控件

第 5 章 中级控件 bilibili学习地址 github代码地址 本章介绍App开发常见的几类中级控件的用法,主要包括:如何定制几种简单的图形、如何使用几种选 择按钮、如何高效地输入文本、如何利用对话框获取交互信息等,然后结合本章所学的知识&…

Kubernetes:(四)kubectl命令

文章目录 一、kubectl命令1.查看版本信息 kubectl version2.列出 Kubernetes API 中所有可用的资源及其相关信息 kubectl api-resources3.配置kubectl自动补全 source <(kubectl completion bash)4.查看集群信息 kubectl cluster-info5.node节点查看日志 journalctl -u kube…

互联网人辞职的20条理由,你中了几条?

互联网行业压力大、内卷是众所周知的&#xff0c;想要辞职的念头往往只在一瞬间。 他们想要离职的理由虽然千奇百怪&#xff0c;但每一条都很扎心。 小码在网上搜集了互联网人想要辞职的20条理由&#xff0c;来看看你中了几条吧&#xff1f; 最能戳中你的“辞职理由”是什么呢…

https://huggingface.co/上的模型无法用linux服务器clone怎么办(只需要稍微改一下网址,就可以切换到镜像下载)

问题描述&#xff1a; 在ubuntu系统上&#xff0c;使用如下命令&#xff0c;克隆仓库&#xff0c;报无法访问错误&#xff1a; git clone https://huggingface.co/distilbert/distilroberta-base通用解决方案&#xff1a; 把下面部分更换&#xff1a; https://huggingface.…

使用传感器融合进行3D激光雷达点云运动补偿

此示例展示了如何通过融合来自全球定位系统 (GPS) 和惯性测量单元 (IMU) 传感器的数据来补偿由于自我车辆运动而导致的点云失真。此示例的目标是补偿点云数据中的失真并准确地重新创建周围环境。 文章目录 概述坐标系预处理激光雷达数据预处理 GPS 数据结合 GPS、IMU 和激光雷达…

请看,小白是如何三步速成ComfyUI?

前言 ComfyUI —三步速成秘籍— 嘿&#xff0c;小伙伴们&#xff01; 我是一个刚刚踏入GEO AI实验室的新鲜面孔&#xff0c; 一个对AI设计充满无限好奇的新手。 在这个充满创意和科技感的实验室里&#xff0c; 我只用了短短三个步骤&#xff0c; 就掌握了ComfyUI 。 你…

输电线路火灾隐患监测系统功能与应用是什么?

答&#xff1a;大家好&#xff01;今天我们来聊聊输电线路火灾隐患监测系统TLKS-PMG-DF。这款装置凭借其强大的功能和广泛的应用领域&#xff0c;正在成为电力巡检和山火防控的重要工具。下面&#xff0c;我们就来详细了解一下它的功能与应用吧&#xff01;这款装置配备了先进的…

《高频电子线路》 —— 高频谐振功放

文章内容来源于【中国大学MOOC 华中科技大学通信&#xff08;高频&#xff09;电子线路精品公开课】&#xff0c;此篇文章仅作为笔记分享。 高频谐振功放 主要目的就是功率放大以及高效率。 基本电路原理 高频谐振功放的基本电路&#xff0c;总体上也是由放大管和并联谐振回路…

Java阶段三01

第3章-第1节 一、知识点 maven的简介、安装和使用、仓库管理、项目构建、多模块项目、依赖管理 二、目标 学习了解什么是maven 能够配置maven 使用maven创建项目 掌握maven创建多模块项目的方式 掌握maven的依赖管理和项目构建 三、内容分析 重点 maven的安装和使用 …

【Docker】构建Linux云桌面环境

目录 一、说明 二、离线安装Docker 1&#xff09;将下载的包上传到服务器上去 2&#xff09;安装docker 3) 启动docker 4&#xff09;配置加速器 三、安装云桌面镜像 四、启动云桌面 方式一&#xff1a;docker命令直接运行 方式二&#xff1a;docker-compose方式 五…

【ArcGIS Pro实操第4期】绘制三维地图

【ArcGIS Pro实操第4期】绘制三维地图 ArcGIS Pro绘制三维地图-以DEM高程为例参考 如何使用ArcGIS Pro将栅格数据用三维的形式进行表达&#xff1f;在ArcGIS里可以使用ArcScene来实现&#xff0c;ArcGIS Pro实现原理跟ArcScene一致。由于Esri未来将不再对ArcGIS更新&#xff0c…

“震惊!消费满额即领高额返现,循环购物模式揭秘“

购物满额赠高额返现&#xff0c;每日还能领现金&#xff1f;资金还能提现&#xff1f;这听起来简直像天方夜谭。商家难道真的在无条件发放资金&#xff1f; 大家好&#xff0c;我是电商策略专家吴军。 今天&#xff0c;我要揭秘一种前沿的商业模式——循环消费回馈模式。 这种…

Leetcode 第 420 场周赛题解

Leetcode 第 420 场周赛题解 Leetcode 第 420 场周赛题解题目1&#xff1a;3324. 出现在屏幕上的字符串序列思路代码复杂度分析 题目2&#xff1a;3325. 字符至少出现 K 次的子字符串 I思路代码复杂度分析 题目3&#xff1a;3326. 使数组非递减的最少除法操作次数思路代码复杂度…

Unity3D学习FPS游戏(3)玩家第一人称视角转动和移动

前言&#xff1a;上一篇实现了角色简单的移动控制&#xff0c;但是实际游戏中玩家的视角是可以转动的&#xff0c;并根据转动后视角调整移动正前方。本篇实现玩家第一人称视角转动和移动&#xff0c;觉得有帮助的话可以点赞收藏支持一下&#xff01; 玩家第一人称视角 修复小问…