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以内浮动。
总结一下:
这个开源库还挺好用的。
下载
我简单封装了一下,放到资源里了,如果有需要,可以点击下载:
结尾
希望也能解决你的问题,有问题欢迎一起讨论!