账号密码登录
微信安全登录
微信扫描二维码登录

登录后绑定QQ、微信即可实现信息互通

手机验证码登录
找回密码返回
邮箱找回 手机找回
注册账号返回
其他登录方式
分享
  • 收藏
    X
    QtModbusrtu 读取数据时偶现Request timeout 错误
    52
    0
    基于QtModbus模块实现 用于读取modbusrtu 协议的硬件485保持寄存器数据问题相关代码,主要运行work进行作业,代码方法所属一个子线程中QModbusResponse MyThread::send(const QModbusRequest &request){ qDebug() << this << "send:" << "threadId:" << QThread::currentThreadId(); QModbusResponse response; if(!this->m_comConnected || request.data().size() < 2){ emit m_modbus_fail(errorFail.value("ConnectionClosed")); return response; } if(m_functionCode == QModbusRequest::WriteSingleRegister){ QCoreApplication::processEvents(QEventLoop::ExcludeUserInputEvents,30); QThread::msleep(30); } if(!request.isValid()){ emit m_modbus_fail("发送数据发生错误:" + QString::number(request.exceptionCode())); qDebug() << this << "requestFail:" << request.data(); return response; } m_functionCode = request.functionCode(); int optionCode = request.data().left(2).toHex().toInt(0,16); qDebug() << this << "optionCode:" << m_optionCode; m_optionCode = optionCode; QModbusReply* reply = modbusUtil->sendSyncModbusRawRequest(request,m_channelAddr); return converReply(reply);}QModbusResponse MyThread::converReply(QModbusReply *reply){ QModbusResponse response; if(reply){ qDebug() << this << "waitStartTime" << getNowDataFormat("yyyyMMddhhmmss.zzz"); if (!reply->isFinished()) { QCoreApplication::processEvents(QEventLoop::ExcludeUserInputEvents,30); QEventLoop eventLoop; connect(reply, &QModbusReply::finished,&eventLoop,&QEventLoop::quit); eventLoop.exec();// eventLoop.deleteLater(); } if(reply->error() == QModbusDevice::NoError){ qDebug() << this << "afterTime" << getNowDataFormat("yyyyMMddhhmmss.zzz"); response = reply->rawResult(); qDebug() << this << "hex:" << response.data().toHex(' '); m_modbusResponse = response; if(m_functionCode == QModbusRequest::ReadHoldingRegisters){ emit m_modbus_finished(m_optionCode,response.data()); } }else if(reply->error() == QModbusDevice::ProtocolError){ emit m_modbus_fail(errorFail.value("SendMessageCodeFail") + reply->errorString()); }else if(reply->error() == QModbusDevice::TimeoutError){ emit m_modbus_fail(errorFail.value("SendMessageTimeout")); qDebug() << this << "errorMessage:" << reply->errorString(); }else{ emit m_modbus_fail(errorFail.value("SendMessageFail")); qDebug() << this << "fail"; } reply->deleteLater(); delete reply; reply = Q_NULLPTR; } return response;}void MyThread::work(){// QModbusDataUnit read(QModbusDataUnit::HoldingRegisters,0,quint16(0x0002)); QModbusRequest read(QModbusRequest::ReadHoldingRegisters,quint16(0x0000),quint16(0x0002)); m_frequency_time_text = getNowDataFormat("yyyyMMddhhmmss"); m_second_frequency_num = 0; while(m_is_start){ qDebug() << "------start-------" << getNowDataFormat("yyyyMMddhhmmss.zzz"); QModbusResponse response = send(read); m_post_num++; if(response.isValid() && m_optionCode == 0){ m_get_num ++; // 计算频率 if(m_frequency_time_text == getNowDataFormat("yyyyMMddhhmmss")){ m_second_frequency_num ++; }else{ emit m_second_frequency_call(m_second_frequency_num); m_second_frequency_num = 1; m_frequency_time_text = getNowDataFormat("yyyyMMddhhmmss"); } // 计算重量值 m_real_val = formatWeight(response.data(),false); m_real_data_str = getNowDataFormat("yyyy年MM月dd日hh时mm分ss秒zzz毫秒"); if(m_max_val < m_real_val){ m_max_val = m_real_val; } if(m_min_val > m_real_val){ m_min_val = m_real_val; } qDebug() << "m_frequency_time:" << m_frequency_time; emit m_work_success(getNowDataFormat("yyyy年MM月dd日hh时mm分ss秒zzz毫秒"),0,response.data()); } if(m_frequency_time > 0){ QThread::msleep(m_frequency_time); } qDebug() << "------end-------" << getNowDataFormat("yyyyMMddhhmmss.zzz"); }}运行结果及报错内容// 正常情况返回------start------- "20211127111941.271"MyThread(0x1eba45f8) send: threadId: 0x1df8MyThread(0x1eba45f8) optionCode: 0ModbusUtil(0x1ec907d8) instance: threadId: 0x1df8ModbusUtil(0x1ec907d8) sendSyncModbusRawRequest: threadId: 0x1df8MyThread(0x1eba45f8) waitStartTime "20211127111941.272"MyThread(0x1eba45f8) send: threadId: 0x1df8MyThread(0x1eba45f8) optionCode: 0ModbusUtil(0x1ec907d8) instance: threadId: 0x1df8ModbusUtil(0x1ec907d8) sendSyncModbusRawRequest: threadId: 0x1df8MyThread(0x1eba45f8) waitStartTime "20211127111941.274"// 异常情况返回------start------- "20211127111941.275"MyThread(0x1eba45f8) send: threadId: 0x1df8MyThread(0x1eba45f8) optionCode: 17ModbusUtil(0x1ec907d8) instance: threadId: 0x1df8ModbusUtil(0x1ec907d8) sendSyncModbusRawRequest: threadId: 0x1df8MyThread(0x1eba45f8) waitStartTime "20211127111941.307"ModbusUtil(0x1ec907d8) instance: threadId: 0x1df8commit Success 60MyThread(0x1eba45f8) errorMessage: "Request timeout."commit Success 0------end------- "20211127111941.459" 我的解答思路和尝试过的方法目前无法判断时哪个流程出问题了,最主要是这个问题时偶现,如果是硬件不回复的话应该是 response timeout吧我想要达到的结果能够知道是什么问题导致 request timeout 这个看起来很像服务端电脑出现的问题因为他立马就返回了这个错误
    0
    打赏
    收藏
    点击回答
        全部回答
    • 0
    • 深情迎风散 普通会员 1楼

      Request timeout错误通常是因为在尝试从Modbus服务器读取数据时,请求超时了。这可能是由于Modbus服务器的响应时间过长,或者是Modbus服务器本身的性能问题。

      以下是一些可能的解决方案:

      1. 清除内存缓存:有时候,Modbus服务器可能会因为内存溢出而引发错误。你可以尝试清空Modbus服务器的内存缓存。

      2. 更改服务器地址:尝试更改Modbus服务器的地址,确保服务器能够正常运行。

      3. 检查 Modbus 系统:确保你的 Modbus 系统是最新版本的,并且没有错误。

      4. 调整波特率:如果 Modbus 服务器的波特率设置过高,可能会导致读取数据时请求超时。你可以尝试调整波特率,使其适中。

      5. 检查 Modbus 软件:确保你的 Modbus 软件是最新版本的,并且没有错误。

      如果以上方法都无法解决问题,你可能需要联系 Modbus 服务器的提供商,寻求专业的技术支持。

    更多回答
    扫一扫访问手机版
    • 回到顶部
    • 回到顶部