查看完整版本: [-- 关于modbus tcp通讯   QModbusReply  内存累计增加的问题 --]

QTCN开发网 -> Qt基础编程 -> 关于modbus tcp通讯   QModbusReply  内存累计增加的问题 [打印本页] 登录 -> 注册 -> 回复主题 -> 发表主题

飞翔梦幻 2020-12-16 14:49

关于modbus tcp通讯   QModbusReply  内存累计增加的问题

请教论坛大神,这是怎么回事, 我每隔100ms连续不断的往plc存储器里写值,都能够写入,但是内存会不断的累计增加,知道最后程序奔溃...
可能是QModbusReply没完全释放掉。

void CModbusTcpClientWorker::onWriteCoils(int iStartAddr, quint16 uValue, int iServerId)
{

QModbusDataUnit writeUnit(QModbusDataUnit::Coils, iStartAddr, 1);
    writeUnit.setValue(0, uValue);

    bool bWriteResult = false;
    QEventLoop loop;
    QModbusReply* pReply = m_pModbusDevice->sendWriteRequest(writeUnit, iServerId);
    if (NULL != pReply)
    {
        QMetaObject::Connection con = connect(pReply, &QModbusReply::finished, this, [&] {
            if (pReply->error() == QModbusDevice::NoError)
            {
                bWriteResult = true;
            }
            else if (pReply->error() == QModbusDevice::ProtocolError)
            {
                //QString strErrorMsg = QString("Write Coils response error: %1 (Modbus exception: 0x%2)")
                //    .arg(pReply->errorString())
                //    .arg(pReply->rawResult().exceptionCode(), -1, 16);
                //m_Savelog.writeLog(m_Savelog.path, strErrorMsg);
                //ErrorMessage(strErrorMsg);
            }
            else
            {
                //QString strErrorMsg = QString("Write Coils response error: %1 (code: 0x%2)").
                //    arg(pReply->errorString()).
                //    arg(pReply->error(), -1, 16);
                //m_Savelog.writeLog(m_Savelog.path, strErrorMsg);
            }

            loop.quit();
            connect(pReply, &QModbusReply::finished, pReply, &QModbusReply::deleteLater);
            }
        );
        connect(pReply, &QModbusReply::finished, pReply, &QModbusReply::deleteLater);

        QTimer timer;
        timer.setSingleShot(true);
        connect(&timer, SIGNAL(timeout()), &loop, SLOT(quit()));
        timer.start(RW_TIMEOUT_MS);
        loop.exec();

        QObject::disconnect(con);
        //pReply->deleteLater();
    }

    emit writeCoilsResult(bWriteResult, iStartAddr, uValue);
}

20091001753 2020-12-17 00:15
  1. auto reply = m_pModbusDevice->sendWriteRequest(writeUnit, iServerId);
    connect(reply,&QModbusReply::finished,this,[&,reply]{
        switch(reply->error()){
        case QModbusDevice::NoError:break;
        case QModbusDevice::ProtocolError:break;
        default:qDebug()<<reply->errorString();
        }
        reply->deleteLater();
    });


飞翔梦幻 2020-12-17 11:42
20091001753:
[code]auto reply = m_pModbusDevice->sendWriteRequest(writeUnit, iServerId);
connect(reply,&QModbusReply::finished,this,[&,reply]{
    switch(reply->error()){
    case QModbusDevice::NoError:break;
    case QModbusDevice::ProtocolError:break;
.......

有一个 异步转同步的过程,在这个地方很容易 stack Flowover  程序奔溃

QTimer timer;
        timer.setSingleShot(true);
        connect(&timer, SIGNAL(timeout()), &loop, SLOT(quit()));
        timer.start(RW_TIMEOUT_MS);
        loop.exec();

uidab 2020-12-17 13:48
飞翔梦幻:有一个 异步转同步的过程,在这个地方很容易 stack Flowover  程序奔溃
QTimer timer;
        timer.setSingleShot(true);
....... (2020-12-17 11:42) 

QTimer::singleShot(RW_TIMEOUT_MS,this,[=](){
                 pReply->deleteLater();
                  loop.quit();
                });
也写成lambda形式


飞翔梦幻 2020-12-17 19:16
uidab:QTimer::singleShot(RW_TIMEOUT_MS,this,[=](){
                 pReply->deleteLater();
               & .. (2020-12-17 13:48) 

这样可以 ,内存还是不断的增加

uidab 2020-12-18 08:25
飞翔梦幻:这样可以 ,内存还是不断的增加  (2020-12-17 19:16) 

那你改成智能指针试试

20091001753 2020-12-20 04:45
首先,QModbusClient 自带超时设置 setTimeout
所以,你只需要初始化时:
m_pModbusDevice->setTimeout(RW_TIMEOUT_MS);

你代码这么改就好:
  1. void CModbusTcpClientWorker::onWriteCoils(int iStartAddr, quint16 uValue, int iServerId){
        QModbusDataUnit writeUnit(QModbusDataUnit::Coils, iStartAddr, 1);
        writeUnit.setValue(0, uValue);
        auto reply = m_pModbusDevice->sendWriteRequest(writeUnit, iServerId);
        connect(reply,&QModbusReply::finished,this,[&,reply]{
            if(reply->error()){
                emit writeCoilsResult(false, iStartAddr, uValue);
                qDebug()<<reply->errorString();
            }else emit writeCoilsResult(true, iStartAddr, uValue);
            reply->deleteLater();
        });
    }


超时也会触发这个 finish 信号,error 是 QModbusDevice::TimeoutError

neeme 2021-04-16 16:28
你好, 我也有这个 modbus tcp 内存累计增加,用rs485串口就没这个问题 。 请问你解决了吗?


查看完整版本: [-- 关于modbus tcp通讯   QModbusReply  内存累计增加的问题 --] [-- top --]



Powered by phpwind v8.7 Code ©2003-2011 phpwind
Gzip disabled