Qt C++实战:Modbus RTU协议详解及主站实现

Qt C++实战:Modbus RTU协议详解及主站实现

文章目录


Modbus 总线协议属于应用层协议,是一种常见的工业系统通讯协议,被广泛应用于工业领域。本篇将对 Modbus RTU 协议进行详细介绍,并实现一个基于Qt的 Modbus RTU 主站上位机。

一 Modbus RTU 协议

1.1 Modbus 协议分类及通信过程

Modbus 协议分为三类,包括:Modbus-RTUModbus-ASCIIModbus-TCP

Modbus 是主从方式通信,通信由主机发起,一问一答式,从机无法主动向主机发送数据。

《GB/T 19582.2》中规定:RTU 模式中每个字节为11位,格式为:8bit数据位(先发地位)、1bit起始位、1bit奇偶校验、1bit停止位。默认使用偶校验,也可以使用其他模式(奇校验、无校验)。使用无校验时要求2个停止位,以此来满足11bit的数据。

发送字符或字节的顺序为从左到右,如下图所示:

在这里插入图片描述

通过配置,设备可以接受奇校验,偶校验或无校验,如果无校验,那么传送一个附加的停止位来填充字符帧使其成为完整的11位异步字符,如下图所示:

在这里插入图片描述

1.2 Modbus-RTU 协议数据帧格式

Modbus-RTU 帧最大长度为256字节,帧描述如下:

在这里插入图片描述
  • 地址码:1个字节的从机地址码。0:广播地址;1-247:从机地址;248-255:保留;
  • 功能码:常用的就是01、02、03、04、05、06、15和16,具体描述见下表;
  • 数据区:数据区包括起始地址、数量和数据,这三项均是大端模式;
  • CRC校验:两个字节,小端模式,校验的数据范围为:地址码+功能码+数据区。

功能码的具体描述见下表:

功能码名称作用
01读取线圈状态取得一组逻辑线圈的当前状态(ON/OFF)
02读取输入状态取得一组开关输入的当前状态(ON/OFF)
03读取保持寄存器在一个或多个保持寄存器中取得当前的二进制值
04读取输入寄存器在一个或多个输入寄存器中取得当前的二进制值
05强置单线圈强置一个逻辑线圈的通断状态
06预置单寄存器把具体二进制装入一个保持寄存器
07读取异常状态取得8个内部线圈的通断状态,这8个线圈的地址由控制器决定,用户逻辑可以将这些线圈定义,以说明从机状态,短报文适宜于迅速读取状态
08会送诊断校验把诊断校验报文送从机,以对通信处理进行评鉴
09编程(只用于484)使主机模拟编程器作用,修改PC从机逻辑
10控询(只用于484)可使主机与一台正在执行长程序任务从机通信,探询该从机是否完成其操作任务,仅在含有功能码9的报文发送后,本功能码才能发送
11读取事件计数可使主机发出单询问,并随即判定操作是否成功,尤其是该命令或其他应答产生通信错误时。
12读取通信事件记录可使主机检索每台从机的Modbus事务处理通信事件记录。如果某项事务处理完成,记录会给出相关错误
13编程(184/384 484 584)可使主机模拟编程器功能修改PC从机逻辑
14探询(184/384 484 584)可使主机与正在执行任务的从机通信,定期控询该从机是否已完成其程序操作,仅在含有功能13的报文发送后,本功能码才得发送
15强置多线圈强置一串连续逻辑线圈的通断
16预置多寄存器把具体的二进制值装入一串连续的保持寄存器
17报告从机标识可使主机判断编址从机的类型及该从机运行指示灯的状态
18(884 和 MICRO 84)可使主机模拟编程功能,修改PC状态逻辑
19重置通信链路发生非可修改错误后,使从机复位

QModbusDataUnit 是 Qt Modbus 模块中的一个核心类,用于表示Modbus协议中一次读写操作所涉及的数据单元。如下表所示:

QModbusDataUnit::RegisterType 枚举值Modbus功能码寄存器类型(通俗名称)读写属性
Coils01,05,15线圈,位数据(1bit)读写
DiscreteInputs02离散输入,位数据(1bit)只读
InputRegisters04输入寄存器,字数据(16bits)只读
HodingRegister03,06,16保持寄存器,字数据(16bits)读写

二 Modbus RTU 主站上位机

2.1 界面设计

基于 Qt 设计上位机界面,包括通信方式选择,串口配置,读写配置,设备参数设置,发送/接收数据展示,发送数据和接收数据。具体界面设置如下图所示:

在这里插入图片描述

2.2 编码实现

上位机软件主要功能包括串口操作、从站操作以及信息显示三个部分。

2.2.1 串口操作

首先将通信方式设置为 Serial Port,然后配置串口参数,包括串口号、波特率、数据位、校验位、停止位、超时时间和重复次数。其中,串口号通过自动搜索获取当前可用的串口,实现方式如下:

foreach(const QSerialPortInfo& info, QSerialPortInfo::availablePorts()){  ui->comboBoxPort->addItem(info.portName());}

串口操作主要是打开串口和关闭串口,具体实现如下:

void MainWindow::on_pushButton_clicked(){ if(m_stop){ if(modbusDevice){  modbusDevice->disconnectDevice(); delete modbusDevice; modbusDevice = nullptr;}int index = ui->cboxConnectType->currentIndex();if(0== index){  modbusDevice = new QModbusRtuSerialMaster(this);//配置串口参数 modbusDevice->setConnectionParameter(QModbusDevice::SerialPortNameParameter,ui->comboBoxPort->currentText()

Read more

OpenClaw 完整部署指南:安装 + 三大 Coding Plan 配置 + CC Switch + 飞书机器人

OpenClaw 完整部署指南:安装 + 三大 Coding Plan 配置 + CC Switch + 飞书机器人

OpenClaw 完整部署指南:安装 + 三大 Coding Plan 配置 + CC Switch + 飞书机器人 * 📋 文章目录结构 * 1.3 一键安装 OpenClaw(推荐) * 1.4 通过 npm 手动安装 * 1.5 运行 Onboard 向导 * 1.6 验证安装 * 步骤二:配置 Coding Plan 模型 * 🅰️ 选项 A:阿里百炼 Coding Plan * A.1 订阅与获取凭证 * A.2 在 OpenClaw 中配置 * A.3 可用模型列表

By Ne0inhk
【花雕学编程】Arduino BLDC 之模糊动态任务调度机器人

【花雕学编程】Arduino BLDC 之模糊动态任务调度机器人

基于 Arduino 的 BLDC 模糊动态任务调度机器人,是一种将模糊逻辑控制理论应用于机器人多任务管理与执行机构(BLDC 电机)协同控制的智能系统。该方案的核心在于解决传统基于固定优先级或时间片轮转的调度算法在面对非结构化环境时,对“不确定性”和“实时性”处理能力不足的问题。 1、主要特点 模糊逻辑驱动的优先级动态仲裁 这是系统区别于传统实时操作系统的核心,它将离散的“任务优先级”转化为连续的“任务紧迫度”。 * 多输入变量融合: 系统不再仅依据任务注册的时间或预设的静态优先级来调度,而是将传感器数据(如障碍物距离、电池电量、目标接近度)作为模糊输入变量。 * 语言值描述与规则库: 通过定义“很近”、“较远”、“极低”、“正常”等模糊集合,将数值型数据转化为语言型描述。例如,规则库中可定义:“如果前方障碍物距离为‘很近’且电池电量为‘充足’,则避障任务的优先级为‘最高’,巡航任务的优先级为‘零’”。 * 平滑的优先级过渡: 相较于传统算法中任务优先级的“

By Ne0inhk
大模型+智能家居解决方案--小米MiLoco部署

大模型+智能家居解决方案--小米MiLoco部署

一、Miloco简介 小米推出了首个“大模型+智能家居”解决方案Xiaomi Miloco,全称为 Xiaomi Local Copilot(小米本地协同智能助手)。 https://gitee.com/xiaomi-miloco/xiaomi-miloco 1、GitHub地址 https://github.com/XiaoMi/xiaomi-miloco Miloco以米家摄像头为视觉信息源,以自研大语言模型MiMo-VL-Miloco-7B为核心,连接家中所有物联网(IoT)设备,框架面向所有人开源。MiMo-VL-Miloco-7B模型基于小米4月发布的MiMo模型调优而来,“天才少女”罗福莉最近加入的正是MiMo模型团队。 这很可能是智能家居的“ChatGPT时刻”,小米AIoT平台截至今年6月已连接的IoT设备数(不含智能手机、平板及笔记本计算机)达9.89亿台,数以亿计的米家摄像头、小爱音箱、台灯等设备都有望用上大模型。 从小米公布的Miloco页面来看,页面主视觉是一个类似于ChatGPT的聊天框,聊天框的左侧具有智能家居设备的导航栏,包括AI中心、模型管

By Ne0inhk

Stable-Diffusion-3.5提示词不生效?CLIP模块调优指南

Stable-Diffusion-3.5提示词不生效?CLIP模块调优指南 你是不是也遇到过这种情况:在Stable Diffusion 3.5里输入了精心构思的提示词,满怀期待地点击生成,结果出来的图片却和你的描述差了十万八千里?比如你想生成“一个穿着宇航服的小猫在月球上喝咖啡”,结果却得到了一只普通的猫,或者一个没有咖啡的宇航员。 别担心,这不是你的问题,也不是模型的问题。问题很可能出在连接你文字和生成图像的“翻译官”——CLIP文本编码模块上。今天,我就带你深入这个核心环节,通过几个简单的调优技巧,让你的提示词真正“生效”,精准控制SD3.5的输出。 1. 问题根源:为什么提示词会“失效”? 在深入调优之前,我们先得明白问题出在哪。SD3.5的生成过程,可以简单理解为两个关键步骤: 1. 理解文字(CLIP编码):模型首先需要读懂你的提示词,比如“宇航服”、“小猫”、“月球”、“咖啡”。这个理解过程,就是由CLIP(Contrastive Language-Image Pre-training)

By Ne0inhk