Qt实现使用TCP与RS485串口设备通信————附带详细实践方法

文章目录

  • 0 背景
  • 1 协议介绍
    • 1.1 modbusRTU协议
      • 1.1.1 简介
      • 1.1.2 RS485和modbusRTU的关系
      • 1.1.3 modbusRTU 协议格式
        • 1.1.3.1 0x10写多个保持寄存器
        • 1.1.3.2 0x02读多个离散输入寄存器
        • 1.1.3.3 0x03读多个保持寄存器
        • 1.1.3.4 0x04读多个输入寄存器
    • 1.2 ModbusTCP协议
      • 1.2.1 ModbusTCP协议介绍
      • 1.2.2 ModbusTCP协议和 modbusRTU 协议区别
      • 1.2.3 ModbusTCP协议格式
  • 2 实践
    • 2.1 使用modbus RTU协议
    • 2.2 使用modbus TCP协议
    • 2.1 计算CRC校验(modbus TCP不需要计算)
  • 参考

0 背景

因为需要使用TCP与RS485串口的仪表设备进行通信,所以查阅相关资料,进行实验测试通过后,记录通信过程。

1 协议介绍

1,上位机电脑与RS485串口的设备硬件仪表设备直接通信,使用的是modbusRTU协议。

2,上位机电脑如果使用TCP协议,与RS485串口的设备硬件仪表设备间接通信,则需要借助ModbusTCP协议。然后中间设备把ModbusTCP协议协议中的包体拆解为ModbusRTU协议的内容,传递给硬件仪表设备。

1.1 modbusRTU协议

使用的如下设备,使用四路PWM信号输出的波形信号来驱动仪表。
在这里插入图片描述

1.1.1 简介

Modbus是一种串行通信协议,是Modicon公司(现在的施耐德电气 Schneider
Electric)于 1979 年为使用可编程逻辑控制器(PLC)通信而发表。Modbus已经成为工
业领域通信协议的业界标准(De facto),并且现在是工业电子设备之间常用的连接方式。

Modbus-RTU协议是一种总线协议,采用一主多从的结构。即同一个总线网络中,只能一
个主机(主站),多个从机(从站)。

通讯时采用一问一答的方式,主动发送请求帧的是主机,被动回复响应帧的是从机,从机
不会主动发送数据。

1.1.2 RS485和modbusRTU的关系

RS485 是一种传输数据的通讯方式,modbusRTU是一种通讯协议。

两者的关系类似声音和语言的关系,RS485是声音,ModbusRTU是其中一种语言,两个人说话,能听到对方的声音,但是听不懂对方的语言,是无法交流理解的。

1.1.3 modbusRTU 协议格式

设备地址:设备的通讯地址、站号。
功能码:对数据帧的功能编号。
寄存器:存放某类数据的内存区域。一个设备可能有多种寄存器,不同的寄存器存
放不同类别的数据。
寄存器地址:某个数据在寄存器里的编号。不同的设备定义不同。

1.1.3.1 0x10写多个保持寄存器

在这里插入图片描述

在这里插入图片描述

1.1.3.2 0x02读多个离散输入寄存器

在这里插入图片描述

在这里插入图片描述

1.1.3.3 0x03读多个保持寄存器

在这里插入图片描述
在这里插入图片描述

1.1.3.4 0x04读多个输入寄存器

在这里插入图片描述
举例:读取设备地址0x01,从输入寄存器0x0000开始,连续读0x0002个寄
存器
请求帧:01 04 00 00 00 02 71 CB
响应帧: 01 04 04 01 60 01 61 3A 1E

数据长度0x04个字节,因为一个寄存器2个字节
第1个寄存器 = 0x0160 = 352
第2个寄存器 = 0x0161 = 353

1.2 ModbusTCP协议

使用如下设备(有人物联网),通过设置做服务器,设置ip和通信方式。

在这里插入图片描述

设置ip、端口和协议相关信息。
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

1.2.1 ModbusTCP协议介绍

ModbusTCP是一种基于以太网的通信协议.ModbusTCP协议由施耐德公司在1996年推出,它继承了ModbusRTU协议的核心功能,但主要通过TCP/IP以太网进行数据传输,实现了设备之间的主从式通信。

对于ModbusTCP,我们通过使用服务器/客户端来定义双方的角色。

1.2.2 ModbusTCP协议和 modbusRTU 协议区别

在这里插入图片描述
从上图中,我们可以看到ModbusTCP在Modbus串行通信的基础上,去除了差错校验和附加地址(即从站地址),然后加上MBAP报文头(7 Bytes)。

因为

  • 1,ModbusTCP协议一般用 于TCP或UDP通信,而TCP和UDP本身就具备数据校验,因此不需要再加校验了;
  • 2,ModbusTCP主要用于以太网通信,因此,不再需要通过附加地址(即从站地址) 来区分不同的设备,因为以太网设备一般会使用IP地址来区分。

1.2.3 ModbusTCP协议格式

在这里插入图片描述

2 实践

2.1 使用modbus RTU协议

例如我们要给RS485硬件设备发送01 10 00 04 00 02 04 00 00 00 01 33 9C的数据(modbusRTU协议的硬件数据)。

01 10 00 04 00 02 04 00 00 00 01 33 9C数据中,按照modbusRTU协议解析可以得到:01为设备地址,10为功能码,00 04为修改寄存器的起始地址,00 02为修改的寄存器个数, 00 00 00 01为数据长度(一个寄存器,两个字节),33 9C为校验地址。

计算CRC校验的方法见后文。

测试工具:

1,RS485线,;
在这里插入图片描述
2,示波器;

在这里插入图片描述

2.2 使用modbus TCP协议

例如我们要给RS485硬件设备发送01 10 00 04 00 02 04 00 00 00 01 33 9C的数据(modbus RTU协议的硬件数据),但是我们使用modbus TCP协议(上位机做客户端,转发硬件左服务器)。需要对数据进行再次封装。在01 10 00 04 00 02 04 00 00 00 01 33 9C的基础上,去掉差错校验和附加地址,变为10 00 04 00 02 04 00 00 00 01(长度为10个字节),再加上modbus TCP协议的MBAP报文头(00 01 00 00 00 0B 01),得到TCP最终发送的数据为:00 01 00 00 00 0B 01 10 00 04 00 02 04 00 00 00 01

2.1 计算CRC校验(modbus TCP不需要计算)

uint16_t crc16Two(unsigned char *data) {

    unsigned char i,j;
    unsigned short crc = 0xffff;
    for(i = 0; i < 11; i++){
        crc = crc^*data;
        for(j = 0;j < 8;j++){
            if(crc&0x01){
                crc = (crc>>1)^0xa001;//多项式a001
            }else{
                crc= (crc>>1);
            }
        }
        data++;
    }
    return crc;
}

QByteArray calculateCrc(QByteArray data) {
    // 计算 CRC

    unsigned char *data2  = (unsigned char *)data.data();
    uint16_t crc = crc16Two(data2);

    return charExpressionToByteArray(QString::number(crc, 16).toUpper().rightJustified(4, '0')); // 转换为大写十六进制并补零
}

因为协议里,是按照大端字节序的顺序,因此还需要把计算出来的字节翻转一下。

     QByteArray frameTail = calculateCrc(resData);
     std::reverse(frameTail.begin(), frameTail.end());//翻转数据

在这里插入图片描述

参考

ModbusTCP通信协议分析

MODBUS TCP协议实例数据帧详细分析

ModbusTCPPC端测试工具

大端模式、小端模式、高字节序、低字节序、MSB、LSB

终于有人把Modbus说明白了

通透!终于把ModbusRTU弄明白了

终于有人把RS485说清楚了

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Mono里运行C#脚本21—mono_image_init_name_cache

前面分析了怎么样加载mscorlib.dll文件,然后把文件数据读取到内存。 接着下来,就会遇到加载整个C#的类型系统,比如System. Object,大体类型如下图所示: 在对CIL编译之前,需要把这些类型全部加载到内存里,以便快捷地访问它们。 mono_image_init_name_cache函数就是完成…

Linux(14)——网络管理

目录 一、检测网络配置&#xff1a; 1、查看网络接口&#xff08;ip&#xff09;&#xff1a; 2、查看性能&#xff08;ip&#xff09;&#xff1a; 3、查看 IP 地址&#xff08;ip&#xff09;&#xff1a; 4、查看路由表&#xff08;ip&#xff09;&#xff1a; 5、追踪…

深度学习笔记(12)——深度学习概论

深度学习概论 深度学习关系&#xff1a; 为什么机器人有一部分不在人工智能里面&#xff1a;机器人技术是一个跨学科的领域&#xff0c;它结合了机械工程、电子工程、计算机科学以及人工智能&#xff08;AI&#xff09;等多个领域的知识。 并不是所有的机器人都依赖于人工智能…

基于Springboot + vue实现的高校办公室行政事务管理系统

&#x1f942;(❁◡❁)您的点赞&#x1f44d;➕评论&#x1f4dd;➕收藏⭐是作者创作的最大动力&#x1f91e; &#x1f496;&#x1f4d5;&#x1f389;&#x1f525; 支持我&#xff1a;点赞&#x1f44d;收藏⭐️留言&#x1f4dd;欢迎留言讨论 &#x1f525;&#x1f525;&…

欧科云链研究院:ChatGPT 眼中的 Web3

编辑&#xff5c;OKG Research 转眼间&#xff0c;2024年已经进入尾声&#xff0c;Web3 行业经历了热闹非凡的一年。今年注定也是属于AI的重要一年&#xff0c;OKG Research 决定拉上 ChatGPT 这位“最懂归纳的AI拍档”&#xff0c;尝试把一整年的研究内容浓缩成精华。我们一共…

急需升级,D-Link 路由器漏洞被僵尸网络广泛用于 DDoS 攻击

僵尸网络活动增加 &#xff1a;新的“FICORA”和“CAPSAICIN”僵尸网络&#xff08;Mirai 和 Kaiten 的变体&#xff09;的活动激增。 被利用的漏洞 &#xff1a;攻击者利用已知的 D-Link 路由器漏洞&#xff08;例如 CVE-2015-2051、CVE-2024-33112&#xff09;来执行恶意命…

df.replace({‘b‘: r‘\s*(\.)\s*‘}, {‘b‘: r‘\1ty‘}, regex=True)

这段代码 df.replace({b: r\s*(\.)\s*}, {b: r\1ty}, regexTrue) 用于在 DataFrame 中进行替换操作&#xff0c;具体来说是针对 b 列&#xff0c;匹配并替换符合正则表达式的值。 详细解析&#xff1a; df.replace()&#xff1a;这是 Pandas 中的 replace() 方法&#xff0c;用…

springboot原生socket通讯教程

需求背景 最近需要对接一些硬件设备,他们选择了socket通讯,并且使用的是私有化协议加密通讯。这种情况下适合原生的socket加解密解析,不适合NettySocket,这在开发中增加了难度。所有的代码都要手动去敲。如果你的只想通过socket传输一些数据,而且都是json的数据,例如聊天…

redis的学习(一)

1.环境搭建 1.1 在ubuntu上安装redis 1.2 reids客户端介绍 redis也是一个客户端-服务器结构的程序。redis客户端和服务器可以在同一份主机上&#xff0c;也可以在不同的主机上&#xff0c;因为二者是通过网络进行发送和接收请求的。 redis服务器是负责存储和管理数据的。 red…

UCAS 24秋网络认证技术 CH16 OAuth OIDC复习

单点登录、OAuth、OIDC原理过程区别 文章目录 单点登录、OAuth、OIDC原理过程区别单点登录概念优点 什么是 OAuth&#xff1f;概述OAuth 2.0 中的角色客户端类型客户端注册抽象协议流程协议流程图 Authorization Grant (授权许可)Access Token (访问令牌)Refresh Token (刷新令…

PDF预览插件

PDF预览插件 可用于当前页面弹窗形式查看,可增加一些自定义功能 pdf预览插件 代码块: pdfobject.js <div class="pdfwrap"><div class="item"><h3>笑场</h3><div class="tags"><p>李诞</p><i&…

Echarts+vue电商平台数据可视化——webSocket改造项目

websocket的基本使用&#xff0c;用于测试前端能否正常获取到后台数据 后台代码编写&#xff1a; const path require("path"); const fileUtils require("../utils/file_utils"); const WebSocket require("ws"); // 创建WebSocket服务端的…

Transformer从零详细解读——DASOU讲AI

1. 从全局角度概括Transformer transformer的任务是什么&#xff1f; 进一步细化 进一步细化&#xff0c;注意&#xff1a;每个encoder结构相同&#xff0c;参数不同&#xff1b;decoder同理 原论文中的图如下&#xff1a; 2.Encoder 2.1 输入部分 &#xff08;1&#xff09…

696: Soldiers

曼哈顿距离&#xff08;Manhattan Distance&#xff09; 在二维空间中&#xff0c;两个点 (x1, y1) 和 (x2, y2) 的 曼哈顿距离 是&#xff1a; |x1 - x2| |y1 - y2| 曼哈顿距离描述了在网格上行走的距离&#xff0c;限制只能水平或垂直移动。 #include <iostream>…

自学记录鸿蒙API 13:实现多目标识别Object Detection

起步&#xff1a;什么叫多目标识别&#xff1f; 无论是生活中的动物识别、智能相册中的场景分类&#xff0c;还是工业领域的检测任务&#xff0c;都能看到多目标识别的身影。这次&#xff0c;我决定通过学习HarmonyOS最新的Object Detection API&#xff08;API 13&#xff09…

【Cesium】九、Cesium点击地图获取点击位置的坐标,并在地图上添加图标

文章目录 一、前言二、实现方法三、App.vue 一、前言 查找发现好几种方法可以获取到点击位置的坐标。这里我实现需求就不深究学习了。将几位大佬的方法学习过来稍微整合了一下。 本文参考文章&#xff1a; cesium 4种拾取坐标的方法 【Cesium基础学习】拾取坐标 cesium拾取当…

ts总结一下

ts基础应用 /*** 泛型工具类型*/ interface IProps {id: string;title: string;children: number[]; } type omita Omit<IProps, id | title>; const omitaA: omita {children: [1] }; type picka Pick<IProps, id | title>; const pickaA: picka {id: ,title…

人脑处理信息的速度与效率:超越计算机的直观判断能力

人脑处理信息的速度与效率&#xff1a;超越计算机的直观判断能力 关键词&#xff1a; #人脑信息处理 Human Brain Information Processing #并行处理 Parallel Processing #视觉信息分析 Visual Information Analysis #决策速度 Decision Speed #计算机与人脑比较 Computer v…

CentOS — 目录管理

文章目录 一、目录结构二、切换目录三、查看目录四、创建目录五、复制目录六、剪切目录七、删除目录 目录也是一种文件。 蓝色目录&#xff0c;绿色可执行文件&#xff0c;红色压缩文件&#xff0c;浅蓝色链接文件&#xff0c;灰色其它文件&#xff0c; 点开头的是隐藏文件&…

cursor设备ID修改器,你可以无限试用cursor了!

文章精选推荐 1 JetBrains Ai assistant 编程工具让你的工作效率翻倍 2 Extra Icons&#xff1a;JetBrains IDE的图标增强神器 3 IDEA插件推荐-SequenceDiagram&#xff0c;自动生成时序图 4 BashSupport Pro 这个ides插件主要是用来干嘛的 &#xff1f; 5 IDEA必装的插件&…