首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何处理Modbus异常0x5

如何处理Modbus异常0x5
EN

Stack Overflow用户
提问于 2018-11-02 14:38:08
回答 1查看 498关注 0票数 1

我正在使用Qt5和QModbusTcpClient类编写一个Modbus客户端程序。在这里,我使用的代码打开一个连接并读取一些内容:

代码语言:javascript
复制
QModbusClient *_modbus;

bool ModbusMaster::open(QString host, int port)
{
    // Disconnect and delete any existing instance
    if (_modbus)
    {
        _modbus->disconnectDevice();
        delete _modbus;
    }

    // Create and open the new connection
    _modbus = new QModbusTcpClient(this);
    _modbus->setConnectionParameter(QModbusDevice::NetworkPortParameter, port);
    _modbus->setConnectionParameter(QModbusDevice::NetworkAddressParameter, host);    

    _modbus->setTimeout(250);
    _modbus->setNumberOfRetries(1);

    return _modbus->connectDevice();
}
bool ModbusMaster::read(QModbusDataUnit::RegisterType type, int startAddress, quint16 count)
{
    if (!_modbus) return false;
    if (_modbus->state() != QModbusDevice::ConnectedState) return false;

    QModbusDataUnit req(type, startAddress, count);
    if (auto *reply = _modbus->sendReadRequest(req, _id))
    {
        if (!reply->isFinished()) connect(reply, &QModbusReply::finished, this, &ModbusMaster::readReady);
        else delete reply;
        return true;
    }
    return false;
}

void ModbusMaster::readReady()
{
    auto reply = qobject_cast<QModbusReply *>(sender());
    if (!reply) return;
    reply->deleteLater();

    if (reply->error() == QModbusDevice::NoError)
    {
        // do something
    }
    else if (reply->error() == QModbusDevice::ProtocolError)
    {
        qDebug() << QString("Read response error: %1 (Mobus exception: 0x%2)").
                                    arg(reply->errorString()).
                                    arg(reply->rawResult().exceptionCode(), -1, 16);
    } else {
        qDebug() << QString("Read response error: %1 (code: 0x%2)").
                                    arg(reply->errorString()).
                                    arg(reply->error(), -1, 16);
    }
}

有时,当我从远程设备读取某些内容时,设备会返回异常0x5。阅读Modbus官方文件,在第48页我读到:

与编程命令结合使用。服务器已经接受并正在处理请求,但这需要很长时间才能完成。返回此响应以防止客户端发生超时错误。客户端可以下一次发出Program消息,以确定处理是否完成。

大胆是我的

我找不到这个"Poll程序完整消息“的描述,似乎我必须使用它来处理0x5异常。

我找错了吗?还有其他方法来处理这个异常吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-11-22 12:44:57

这取决于您正在使用的设备的类型。您只需遵循逻辑,在设备手册中描述了这个特殊的例外情况。

一般来说,没有特别的“程序完成”事件。这意味着,它是为0x5编写的--“与编程命令结合使用”。因此,您只需从设备中轮询(读取)一些标志,这意味着设备中导致此异常的内部进程已经完成。

举个例子,我在继电保护装置上遇到了这样的例外,它是在写扰动记录的过程中发出的。我只需要在一段时间内检查一下记录就绪情况。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53120597

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档