news 2026/4/26 17:12:06

qt开发的modbus-tcp远程控制主机上位机和stm32从机源码,实现了modbus 01...

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
qt开发的modbus-tcp远程控制主机上位机和stm32从机源码,实现了modbus 01...

qt开发的modbus-tcp远程控制主机上位机和stm32从机源码,实现了modbus 01 02 03 04 05 06 10 F功能码(modbus不是使用第三方库包括qmodbus,都是是自己写的),并在此基础上结合stm32从机实现了四遥功能:遥测遥控遥信遥调 stm32端采用野火指南者开发板和w5500以太网模块。 从机程序不限于野火板子只是四遥功能采用了板子的led灯按键和adc引脚,如换其他板子改一下引脚就可以。 后面有资料提供,四遥功能包括:远程采集adc数据实时刷新标准浮点数转换,感知远程按键信号,按键按上位机信号灯点亮,按键关闭信号灯关闭,点击三个自定义按钮控制三路led灯点亮(实时),遥调下发保持寄存器数值,通过自定义仪表盘读取设定值。

手搓Modbus-TCP协议的实战记录来咯!这次用Qt5撸了个上位机,搭配STM32F103+W5500搞定了工业控制领域常用的四遥功能。不用qmodbus库不靠现成轮子,从TCP报文解析到功能码实现全流程硬核开发,摸鱼时间都搭进去了(笑)


上位机核心:暴力拆解Modbus报文

自己实现协议栈最爽的就是完全掌控数据流。举个读取保持寄存器的03功能码处理:

QByteArray ModbusRequest::buildReadHoldingRegisters(int slaveID, int startAddr, int count) { QByteArray frame; QDataStream stream(&frame, QIODevice::WriteOnly); stream.setByteOrder(QDataStream::BigEndian); stream << quint8(slaveID) << quint8(0x03) // 功能码 << quint16(startAddr) << quint16(count); appendCRC16(frame); return frame; }

这段代码生成的报文结构绝对标准:设备地址+功能码+起始地址+寄存器数量+CRC校验。注意字节序必须用Big-Endian,否则设备端会直接丢包。当年在这里踩坑导致三天没收到正确响应...


从机端骚操作:寄存器映射黑科技

STM32端采用寄存器地址映射策略,把硬件状态直接挂到modbus地址空间:

// 保持寄存器映射表 __IO uint16_t holdingRegs[HOLDING_REG_NUM] = { 0x0000, // 设备状态 0x1388, // 初始阈值 //...其他寄存器 }; // ADC值自动更新 void UpdateHoldingRegisters(void) { holdingRegs[REG_ADC1_VAL] = (uint16_t)(get_adc_value(ADC1) * 100); // 浮点转定点 }

这里把ADC原始值放大100倍转为整数存储,上位机收到后除以100还原浮点数。实测比直接传浮点更稳定,尤其在一些老版本PLC上兼容性更好。


四遥功能落地实操

  1. 遥测:ADC采集线程500ms轮询
// Qt端定时拉取数据 connect(&timer, &QTimer::timeout, [=](){ sendReadRequest(SLAVE_ID, REG_ADC_BASE, 3); }); // 收到响应后更新UI仪表盘 void updateDashBoard(const ModbusResponse& resp) { double voltage = resp.getRegister(0) / 100.0; ui->voltageGauge->setValue(voltage); }
  1. 遥控:LED控制直接挂钩线圈状态
// STM32端线圈状态监听 if(coils[COIL_LED1] != led1_status){ HAL_GPIO_WritePin(LED1_GPIO, coils[COIL_LED1]); led1_status = coils[COIL_LED1]; }
  1. 遥信:按键状态通过离散输入上报
// 按键中断服务函数里置位标志 void EXTI0_IRQHandler(){ discreteInputs[DI_KEY1] = 1; __HAL_GPIO_EXTI_CLEAR_IT(KEY1_PIN); }
  1. 遥调:写保持寄存器实现参数下发
// 上位机下发设定值 void sendAdjustment(float value) { uint16_t raw = static_cast<uint16_t>(value * 100); sendWriteRequest(SLAVE_ID, REG_SET_VALUE, raw); }

避坑指南

  1. W5500硬件流控必须使能,否则大数据量会丢包
  2. STM32的HAL库ETH驱动需要调整RxBuffer数量,默认值太小
  3. Qt的TCP粘包处理要加超时机制,推荐使用状态机解析
  4. 寄存器地址记得做越界检查,防止设备跑飞

源码里还有自定义仪表盘控件和工业风UI设计,需要完整工程的老铁可以私信。下期准备分享如何用这套框架对接西门子PLC,想看的评论区扣个1~

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/25 7:23:21

Qwen3-4B-SafeRL:安全智能双优的AI模型新体验

Qwen3-4B-SafeRL&#xff1a;安全智能双优的AI模型新体验 【免费下载链接】Qwen3-4B-SafeRL 项目地址: https://ai.gitcode.com/hf_mirrors/Qwen/Qwen3-4B-SafeRL 导语&#xff1a;Qwen3-4B-SafeRL模型正式发布&#xff0c;通过创新的混合奖励强化学习技术&#xff0c;…

作者头像 李华
网站建设 2026/4/23 14:22:25

LFM2-1.2B-Extract:9语文档智能提取新体验

LFM2-1.2B-Extract&#xff1a;9语文档智能提取新体验 【免费下载链接】LFM2-1.2B-Extract 项目地址: https://ai.gitcode.com/hf_mirrors/LiquidAI/LFM2-1.2B-Extract Liquid AI推出全新轻量级文档提取模型LFM2-1.2B-Extract&#xff0c;以12亿参数实现跨9种语言的非结…

作者头像 李华
网站建设 2026/4/22 10:07:56

Fusion_lora:AI溶图新方案,产品背景融合更自然

Fusion_lora&#xff1a;AI溶图新方案&#xff0c;产品背景融合更自然 【免费下载链接】Fusion_lora 项目地址: https://ai.gitcode.com/hf_mirrors/dx8152/Fusion_lora 导语&#xff1a;一款名为Fusion_lora的AI溶图方案近日受到关注&#xff0c;它基于Qwen-Image-Edi…

作者头像 李华
网站建设 2026/4/26 14:32:01

DC-DC转换器为何选用功率电感?对比分析完整指南

为什么所有DC-DC电源都离不开功率电感&#xff1f;一文讲透背后的硬核逻辑你有没有想过&#xff0c;为什么从手机充电器到服务器电源&#xff0c;几乎所有的开关电源里都有一个“小方块”状的黑色元件——功率电感&#xff1f;它不像MOSFET那样负责高速通断&#xff0c;也不像控…

作者头像 李华
网站建设 2026/4/25 11:21:40

135M小模型推理升级:trlm-135m三阶段训练详解

135M小模型推理升级&#xff1a;trlm-135m三阶段训练详解 【免费下载链接】trlm-135m 项目地址: https://ai.gitcode.com/hf_mirrors/Shekswess/trlm-135m 大语言模型领域再添新突破&#xff0c;研究人员推出参数量仅135M的Tiny Reasoning Language Model (trlm-135m)&…

作者头像 李华
网站建设 2026/4/25 11:13:32

Qwen2.5-7B培训材料:课程内容生成

Qwen2.5-7B培训材料&#xff1a;课程内容生成 1. 技术背景与核心价值 1.1 大模型演进中的Qwen2.5定位 随着大语言模型在自然语言理解、代码生成和多模态任务中的广泛应用&#xff0c;阿里巴巴通义实验室推出了 Qwen2.5 系列&#xff0c;作为 Qwen2 的全面升级版本。该系列覆…

作者头像 李华