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

QModbus使用时出现内存增加的问题

背景

项目中需要跟PLC进行通信,使用的Qt作为开发的框架,语言使用的是C++
刚开始,因为与PLC通信的频率很低,所以,并未发现这个问题,当把整个软件模块都差不多写完的时候,做整体的性能测试时,发现内存出现整体趋势上的增长。遂一步步排查原因。

Qt使用modbus

代码举例:

void ModbusTCP::writeHoldingRegister(int slaveId, int startAddress, quint16 value)
{
	qDebug() << "modbus内:" << number++;
	
	int index = static_cast<int>(startAddress);
	//写入PLC数据
	QModbusDataUnit unit(QModbusDataUnit::HoldingRegisters, index, 1);
	double myDouble = 0;
	unit.setValue(0, value);
	QModbusReply* reply = m_modbusTcpClient->sendWriteRequest(unit, 1);
	if (reply)
	{
		if (!reply->isFinished())
		{
			//这里本来是写了完成信号对应的槽函数的,但是为了简单测试,先删掉。
			//connect(reply, &QModbusReply::finished, this, [=]() {
			//	
			//	});
			//connect(reply, &QModbusReply::finished, this, [this, reply]() {
			//	if (reply->error() == QModbusDevice::ProtocolError) {
			//		
			//	}
			//	else if (reply->error() != QModbusDevice::NoError) {
			//	}
			//	reply->deleteLater();
			//	});
			
			reply->deleteLater();
		}
		else
		{
			reply->deleteLater();
		}
	}
	else
	{
		delete reply;
	}
	
}

运行结果展示如下:

最开始的内存运行状况:


运行了三分钟左右的状况:


运行了十分钟左右的状况:


运行了不到20分钟左右的状况:


我测试了很多次,都会发现有一个规律:
先增加到一定的大小,然后降下来,再往上就一直涨。

又跑了十分左右:

又运行了一会的情况:

第二天轻轻松松跑了一上午

总结:

内存会一直增加,如果时间足够长,内存肯定会爆掉。

问题分析:

1、我前面找过博客,博客说,Qt官方BUG里面记录了5.15版本使用Modbus存在内存增加的问题,但是似乎没有被解决。

2、我的Qt版本是5.14所以,这个官方没有说。我后面从github上找了很多的方法,测试时候是我调用的问题,但是,发现,仍然还是这样。

3、有的博客说是因为里面添加了qDebug()打印的问题,但是,我发现我注释掉仍然会内存增加。

4、如果你们有什么想法,可以在评论区我们探讨一下。

开源库LibModbus

代码举例:

    //下面这些在初始化函数中完成    
    modbus_t* ctx = NULL;	
    ctx = modbus_new_tcp(ip.toLocal8Bit(), port);
	modbus_set_slave(ctx, 1);
	modbus_connect(ctx);
	modbus_set_response_timeout(ctx, 0, 100000);
    
    //下面这行是每次来了数据之后的写入
    modbus_write_register(ctx, startAddress, value);
    

运行状况:

刚开始运行:

十分钟以后运行状况:

没变化

二十分钟以后运行状况:

半个小时以后运行状况:

感觉有点离谱,会变少,但是,再运行好像也不会有太大变化了。

写博客前,我使用开源库运行了一下午,运行内存在6M以内浮动。

总结一下:

这个开源库还挺好用的。

下载

我简单封装了一下,放到资源里了,如果有需要,可以点击下载:

结尾

希望也能解决你的问题,有问题欢迎一起讨论!


http://www.kler.cn/a/372409.html

相关文章:

  • 机器学习之KNN算法预测数据和数据可视化
  • 嘉立创创建工程
  • 【C语言】深入探讨 C 语言 `int` 类型大小及其跨平台影响
  • Docker Compose 配置指南
  • 重温设计模式--代理、中介者、适配器模式的异同
  • 打造高效的 LaTeX 公式编辑器
  • 5G RAN
  • 跨平台实现实时通讯
  • SpringCloudAlibaba实战入门之Nacos注册中心(四)
  • 为什么STM32的HAL库那么难用,ST还是要硬推HAL库?
  • 方法+数组
  • 每天五分钟深度学习:逻辑回归和神经网络
  • 电子电气架构 --- 车载以太网的未来已经来临
  • 解决Eclipse中’Run As’菜单缺少’Run on Server’选项的问题
  • appium+mumu模拟器+python 嚼碎菜鸟教程
  • Flutter登录界面使用主题
  • 完全透彻了解一个asp.net core MVC项目模板2
  • 【WebDriver】浏览器驱动下载及其配置
  • ​​Linux已经走向分裂
  • 代码随想录:从中后/中前遍历序列构造二叉树
  • nascpolarssh
  • 【JavaEE初阶】网络原理(2)
  • 【分布式技术】分布式事务深入理解
  • 隨筆 20241024 Kafka 数据格式解析:批次头与数据体
  • Github 2024-10-24 Go开源项目日报 Top10
  • Spring Security 门神中的战斗机