SERB666 2022-07-29 09:50 采纳率: 87.5%
浏览 422
已结题

Qt Modbus主站程序,网络断开后重连时间过长的问题。

我写了QModbus主站的程序,下位机是别人的modbus从机设备,我用标志位实现定时重连。
每次从机重启后(相当于断网),我的程序过很久才能重连上,但是用modbus助手可以很快地连接,请问我的代码哪里有问题呢?

QString strText= ui->mConBtn->text();
   
    if(strText == QStringLiteral("连接"))//**若点击了连接按钮
    {
        //Modbus TCP    
        //new 主站对象
        master = new QModbusTcpClient();
        
        //走的网络,设置IP与端口
        master->setConnectionParameter(
                    QModbusDevice::NetworkAddressParameter, ui->mIP_COM->text() );
        master->setConnectionParameter(
                    QModbusDevice::NetworkPortParameter, ui->m_Port->text().toUInt() );
        
              
        //**设置连接超时时间50ms
        master->setTimeout(50);
        //失败后禁用重发
        master->setNumberOfRetries(0);
        
        //连接信号槽
        connect(master, &QModbusDevice::stateChanged ,this ,[this]()
        {
            //成连接状态了
            if(master->state() == QModbusDevice::ConnectedState)
            {
                ui->mConBtn->setText(QStringLiteral("断开"));
                ui->statusbar->showMessage("Connect Success!",3000);
                Flag_Connect=1;//已连接了
                qDebug()<<"设备已连接了";
            }
            else
            {
                ui->mConBtn->setText(QStringLiteral("连接"));
                Flag_Connect=0;//已断开了
                qDebug()<<"设备已断开了";
            }
        });
               
        // 设备发生错误时信号、槽
        connect(master, &QModbusClient::errorOccurred, [this](QModbusDevice::Error)
        {
            statusBar()->showMessage(master->errorString(), 3000);
            ui->mConBtn->setText(QStringLiteral("连接"));
            Flag_Connect=0;//已断开了
            qDebug()<<"设备已断开了";
        });
        
        //连接设备
        master->connectDevice();
        
        //打开定时轮询的定时器
        Timer->setTimerType(Qt::PreciseTimer);
        Timer->setInterval(500);
        Timer->start();
        connect(Timer, &QTimer::timeout, this, [=]()
        {
            qDebug()<<"MODBUS TCP定时器在运行";
            qDebug()<<"Flag_Connect"<<Flag_Connect;       
            //发现问题,大概要50s-60s才能重连上? 但是我用modbus助手,10s左右就能重连
            if(Flag_Connect==0)
            {master->connectDevice();qDebug()<<"触发一次MODBUS TCP重连";return;}
            else if(Flag_Connect==1)
            {}         
        });
    }
  
    else
    {
        if(master)
        {
            //断开连接
            master->disconnectDevice();
            delete master;
            master = nullptr;        
        }
    }

  • 写回答

2条回答 默认 最新

  • 源客V 2022-08-01 16:01
    关注

    bool ret = master->connectDevice();连接成功失败的状态可以直接获取,不需要用stateChanged去判断。你的connect(master, &QModbusClient::errorOccurred,少一个this参数

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 8月11日
  • 已采纳回答 8月3日
  • 修改了问题 7月29日
  • 创建了问题 7月29日

悬赏问题

  • ¥15 怎么把512还原为520格式
  • ¥15 MATLAB的动态模态分解出现错误,以CFX非定常模拟结果为快照
  • ¥15 求高通平台Softsim调试经验
  • ¥15 canal如何实现将mysql多张表(月表)采集入库到目标表中(一张表)?
  • ¥15 wpf ScrollViewer实现冻结左侧宽度w范围内的视图
  • ¥15 栅极驱动低侧烧毁MOSFET
  • ¥30 写segy数据时出错3
  • ¥100 linux下qt运行QCefView demo报错
  • ¥50 F1C100S下的红外解码IR_RX驱动问题
  • ¥20 基于matlab的航迹融合 航迹关联 航迹插补