当前位置: 首页 > 网络知识

Qt 基于QTcpSocket的ModbusTCP协议

时间:2026-01-29 09:26:47

一、编写缘由
1.发现问题
  最近项目上要把之前的modbus RTU改为TCP形式,因此之前的modbus通讯线程得重构,一开始当然是使用Qt自带的QModbusTcpClient类,很快就重构好线程,读取数据没有问题,但是只要一发送写数据请求,整个tcp连接就会断开,做了很多尝试,排除了从站的问题,即使直接连modbusslave也是出现这种问题。

2.查找问题
  于是自己写了一个tcp server,抓取QModbusTcpClient写数据的报文,和modbuspoll上的对比,果然对不上,qt中的报文比modbuspoll上的多出来一截,想必是协议错误了。

3.解决策略
  QModbusTcpClient不就是在tcp通讯上添加了modbus协议嘛,既然它的协议都错了,那就没有使用的必要了,我们直接用QTcpSocket手搓一个ModbusTcp类就好了。

二、代码编写
1.协议解析
  通过modbuspoll上的通信日志和网络上的modbustcp协议分析文章对比,研究出协议的标准格式。ModbusTCP协议报文分析

2.封装函数

1 void writeCoil(quint16 address,bool value); 2 void writeCoils(quint16 address,QVector<bool> values); 3 void writeRegist(quint16 address,quint16 value); 4 void writeRegists(quint16 address,QVector<quint16> values);

我共封装了以上4个函数,分别是写单个线圈、写多个线圈、写单个保持寄存器、写多个保持寄存器。
具体实现如下:

1 void ModbusTcp::writeRegist(quint16 address,quint16 value) 2 23 24 void ModbusTcp::writeRegists(quint16 address, QVector<quint16> values) 25 53 client>write(request); 54 } 55 56 void ModbusTcp::writeCoil(quint16 address, bool value) 57 79 80 void ModbusTcp::writeCoils(quint16 address, QVector<bool> values) 81 110 bs.append(a); 111 for(uchar i=0;i<valuesount()/8;i++) 117 bs.append(a); 118 } 119 for(uchar k=0;k<bsount();k++) 122 client>write(request); 123 }

四个函数中除了写多个线圈还有问题外,其他都已验证,可以正确写入。
最后,我的tcp是作为一个子线程的,线程初始化函数如下:

1 void ModbusTcp::initModbus() 2 14 else 17 }



上一篇:Visual Leak Detector 安装 VLD
下一篇:Qt 解决PLC与QModbusTcpClient通信自动断开
Qt Modbus
  • 英特尔与 Vertiv 合作开发液冷 AI 处理器
  • 英特尔第五代 Xeon CPU 来了:详细信息和行业反应
  • 由于云计算放缓引发扩张担忧,甲骨文股价暴跌
  • Web开发状况报告详细介绍可组合架构的优点
  • 如何使用 PowerShell 的 Get-Date Cmdlet 创建时间戳
  • 美光在数据中心需求增长后给出了强有力的预测
  • 2027服务器市场价值将接近1960亿美元
  • 生成式人工智能的下一步是什么?
  • 分享在外部存储上安装Ubuntu的5种方法技巧
  • 全球数据中心发展的关键考虑因素
  • 英特尔与 Vertiv 合作开发液冷 AI 处理器

    英特尔第五代 Xeon CPU 来了:详细信息和行业反应

    由于云计算放缓引发扩张担忧,甲骨文股价暴跌

    Web开发状况报告详细介绍可组合架构的优点

    如何使用 PowerShell 的 Get-Date Cmdlet 创建时间戳

    美光在数据中心需求增长后给出了强有力的预测

    2027服务器市场价值将接近1960亿美元

    生成式人工智能的下一步是什么?

    分享在外部存储上安装Ubuntu的5种方法技巧

    全球数据中心发展的关键考虑因素