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

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日

悬赏问题

  • ¥30 STM32 INMP441无法读取数据
  • ¥100 求汇川机器人IRCB300控制器和示教器同版本升级固件文件升级包
  • ¥15 用visualstudio2022创建vue项目后无法启动
  • ¥15 x趋于0时tanx-sinx极限可以拆开算吗
  • ¥500 把面具戴到人脸上,请大家贡献智慧
  • ¥15 任意一个散点图自己下载其js脚本文件并做成独立的案例页面,不要作在线的,要离线状态。
  • ¥15 各位 帮我看看如何写代码,打出来的图形要和如下图呈现的一样,急
  • ¥30 c#打开word开启修订并实时显示批注
  • ¥15 如何解决ldsc的这条报错/index error
  • ¥15 VS2022+WDK驱动开发环境