当前位置: 首页 > news >正文

这个Qt通讯组件库有点东西。咱们先从底层通讯开始盘——TCP、UDP、Serial三大件全齐活。拿UDP举个栗子,发送报文简单到像发短信

纯qt编写的通讯组件,包含tcp,udp,serial;plc客户端有mudbustcp,modbusrtu,finstcp,finsudp;plc服务端有modbustcp和modbusrtu。 实现其他的plc通信可集成原有基类,已封装成pri组件,可直接接入工程。 qt5.14.2可直接编译。

QUdpSocket* sender = new QUdpSocket(this); QByteArray datagram = "0x01 0x02 0xA3"; sender->writeDatagram(datagram, QHostAddress("192.168.1.100"), 9600);

但别以为只是简单封装socket,接收处理才是重头戏。看看这个异步处理设计:

connect(udpSocket, &QUdpSocket::readyRead, [=](){ while(udpSocket->hasPendingDatagrams()) { QByteArray buffer; buffer.resize(udpSocket->pendingDatagramSize()); QHostAddress sender; quint16 senderPort; udpSocket->readDatagram(buffer.data(), buffer.size(), &sender, &senderPort); emit newMessage(sender.toString(), buffer); } });

用Qt的信号槽机制把网络层脏活都包圆了,上层业务只管接数据就行。

PLC协议这块玩得挺野,Modbus和欧姆龙FINS双修。来看个Modbus TCP客户端的典型用法:

ModbusTCPClient client; client.setConnectionParams("192.168.1.10", 502); if(client.connectDevice()){ QVector<quint16> coilValues; if(client.readCoils(0x00, 10, coilValues)){ qDebug() << "线圈状态:" << coilValues; } }

底层实现其实是个状态机模式,看看请求封装的关键片段:

void ModbusTCPClient::sendReadRequest(int functionCode, int startAddr, int quantity) { QByteArray frame; QDataStream stream(&frame, QIODevice::WriteOnly); stream.setByteOrder(QDataStream::BigEndian); stream << transactionId++ << QByteArray::fromHex("0006") // 协议标识+单元号 << static_cast<quint8>(functionCode) << static_cast<quint16>(startAddr) << static_cast<quint16>(quantity); tcpClient->write(frame); // 复用基础TCP连接 }

注意这里用大端序处理字节,直接关系到能否跟PLC正常对话。协议栈实现时各种字节序转换坑都踩过了,现在用着稳如老狗。

纯qt编写的通讯组件,包含tcp,udp,serial;plc客户端有mudbustcp,modbusrtu,finstcp,finsudp;plc服务端有modbustcp和modbusrtu。 实现其他的plc通信可集成原有基类,已封装成pri组件,可直接接入工程。 qt5.14.2可直接编译。

扩展性才是这个库的杀手锏。想加个三菱MC协议?继承PLCClientBase整就完事:

class MelsecClient : public PLCClientBase { Q_OBJECT public: explicit MelsecClient(QObject* parent=nullptr); protected: void processResponse(const QByteArray& data) override { // 解析二进制报文... emit dataUpdated(parsedValues); } void buildReadCommand(int address) override { // 构造三菱特有指令格式... sendRawData(cmdFrame); } };

这种设计让协议扩展成本直接打骨折,新协议实现只需要关注报文解析逻辑。

集成到项目更是傻瓜操作,把components.pri往工程里一扔,pro文件加句话:

include(components.pri)

然后该咋用咋用,连环境变量都不用配。实测Qt5.14.2编译一次过,Mingw和MSVC编译器都验证过。要是项目需要升级Qt版本?把QSerialPort的旧式信号槽写法改改基本就能跑。

库里的连接保活机制有点黑科技,TCP自动重连+心跳包双保险。看这段连接状态检测:

void TcpClient::checkConnection() { if(!socket->waitForConnected(500)){ reconnectTimer.start(3000); // 3秒后重试 emit connectionLost(); }else{ socket->write("\x01"); // 心跳包 if(!socket->waitForBytesWritten(1000)){ socket->abort(); } } }

这种组合拳下来,现场设备断网重连什么的根本虚。实测在产线环境掉线后10秒内自动恢复,数据流不带断的。

http://www.jsqmd.com/news/533124/

相关文章:

  • GLM-OCR惊艳效果展示:带艺术字体/装饰线的海报文字识别,风格不变形
  • 2026国内头部镁球粘合厂家推荐,靠谱粘合剂厂家在这里,生粉/型煤淀粉/食用面碱/小酥肉淀粉,粘合剂实力厂家推荐 - 品牌推荐师
  • YOLOv8模型压缩实战:减小体积不影响精度
  • [docker context]
  • Python-UIAutomation-for-Windows性能优化:减少搜索时间提升自动化效率
  • gh_mirrors/bb/bbs-go数据库索引设计:查询性能提升指南
  • Json字符串多了双引号兼容方案 解析
  • Buildroot系统屏蔽fbcon后如何正确显示内核启动Logo?
  • 双三相永磁同步电机矢量控制技术:基于双dq轴系与矢量SVPWM调制的优化研究
  • VFSForGit钩子机制终极指南:如何自定义企业级Git操作流程
  • Graffle生产环境终极部署指南:10个关键配置优化技巧
  • 基于AI+Dify构建自动化新闻摘要与标签系统
  • KLayout Python集成:突破DRC自动化的三大技术瓶颈
  • 像素时装锻造坊效果展示:同一人物在不同皮装款式下的风格迁移对比组图
  • Plasticity高级建模技巧:复杂曲面和实体建模完全指南
  • 【2026年最新600套毕设项目分享】springboot音乐推荐系统(14243)
  • LibRec数据模型详解:从文本到ARFF格式的完整转换教程 [特殊字符]
  • 从原理到实战:拆解WebRTC指纹,手把手教你为随机指纹浏览器‘打补丁’
  • Openblocks vs Retool:2023年开源与商业低代码平台的终极对比指南
  • Gocator2550相机与LMI加速器协同配置实战指南
  • 讲讲2026年电动搬运车多功能定制厂家,产品价格多少钱 - 工业推荐榜
  • Nunchaku-flux-1-dev环境部署:Ubuntu 22.04 + CUDA 11.8配置
  • LFM2.5-1.2B-Thinking-GGUF实战指南:单页Web界面快速上手
  • 必收藏!2026年普通人转大模型最落地指南(小白/程序员必看,避坑不踩雷)
  • 终极指南:Ractive.js项目架构的7个最佳实践,构建可维护的大型前端应用
  • Flot堆叠图表完全指南:5个步骤实现多层次数据可视化 [特殊字符]
  • 2026年阿金驾校这类收费透明一费制驾校如何选择 - 工业品牌热点
  • 如何高效使用LeagueAkari:5个提升英雄联盟游戏体验的完整秘诀
  • 终极NPOI扩展开发指南:从零开始自定义Office格式支持
  • Textures.js未来发展方向:SVG图案生成的创新趋势与终极指南