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

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 matlab答疑 关于海上风电的爬坡事件检测
  • ¥88 python部署量化回测异常问题
  • ¥30 酬劳2w元求合作写文章
  • ¥15 在现有系统基础上增加功能
  • ¥15 远程桌面文档内容复制粘贴,格式会变化
  • ¥15 关于#java#的问题:找一份能快速看完mooc视频的代码
  • ¥15 这种微信登录授权 谁可以做啊
  • ¥15 请问我该如何添加自己的数据去运行蚁群算法代码
  • ¥20 用HslCommunication 连接欧姆龙 plc有时会连接失败。报异常为“未知错误”
  • ¥15 网络设备配置与管理这个该怎么弄