How to handle Modbus exception 0x5





.everyoneloves__top-leaderboard:empty,.everyoneloves__mid-leaderboard:empty,.everyoneloves__bot-mid-leaderboard:empty{ height:90px;width:728px;box-sizing:border-box;
}







1















I'm writing a Modbus client program using Qt5 and the QModbusTcpClient class. Here the code I'm using for open a connection and read something:



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);
}
}


Sometimes when I read something from the remote device it happens the device returns the exception 0x5. Reading the official Modbus documentation, at page 48 I read:




Specialized use in conjunction with programming
commands.
The server has accepted the request and is
processing it, but a long duration of time will be
required to do so. This response is returned to
prevent a timeout error from occurring in the
client. The client can next issue a Poll Program
Complete message to determine if processing is
completed.




[bold is mine]



I cannot find a description of this "Poll Program Complete message" that seems I must use to handle the exception 0x5.



Did I search wrong? Is there another way to handle this exception?










share|improve this question





























    1















    I'm writing a Modbus client program using Qt5 and the QModbusTcpClient class. Here the code I'm using for open a connection and read something:



    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);
    }
    }


    Sometimes when I read something from the remote device it happens the device returns the exception 0x5. Reading the official Modbus documentation, at page 48 I read:




    Specialized use in conjunction with programming
    commands.
    The server has accepted the request and is
    processing it, but a long duration of time will be
    required to do so. This response is returned to
    prevent a timeout error from occurring in the
    client. The client can next issue a Poll Program
    Complete message to determine if processing is
    completed.




    [bold is mine]



    I cannot find a description of this "Poll Program Complete message" that seems I must use to handle the exception 0x5.



    Did I search wrong? Is there another way to handle this exception?










    share|improve this question

























      1












      1








      1








      I'm writing a Modbus client program using Qt5 and the QModbusTcpClient class. Here the code I'm using for open a connection and read something:



      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);
      }
      }


      Sometimes when I read something from the remote device it happens the device returns the exception 0x5. Reading the official Modbus documentation, at page 48 I read:




      Specialized use in conjunction with programming
      commands.
      The server has accepted the request and is
      processing it, but a long duration of time will be
      required to do so. This response is returned to
      prevent a timeout error from occurring in the
      client. The client can next issue a Poll Program
      Complete message to determine if processing is
      completed.




      [bold is mine]



      I cannot find a description of this "Poll Program Complete message" that seems I must use to handle the exception 0x5.



      Did I search wrong? Is there another way to handle this exception?










      share|improve this question














      I'm writing a Modbus client program using Qt5 and the QModbusTcpClient class. Here the code I'm using for open a connection and read something:



      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);
      }
      }


      Sometimes when I read something from the remote device it happens the device returns the exception 0x5. Reading the official Modbus documentation, at page 48 I read:




      Specialized use in conjunction with programming
      commands.
      The server has accepted the request and is
      processing it, but a long duration of time will be
      required to do so. This response is returned to
      prevent a timeout error from occurring in the
      client. The client can next issue a Poll Program
      Complete message to determine if processing is
      completed.




      [bold is mine]



      I cannot find a description of this "Poll Program Complete message" that seems I must use to handle the exception 0x5.



      Did I search wrong? Is there another way to handle this exception?







      exception-handling qt5 modbus






      share|improve this question













      share|improve this question











      share|improve this question




      share|improve this question










      asked Nov 2 '18 at 14:38









      MarkMark

      1,14821443




      1,14821443
























          1 Answer
          1






          active

          oldest

          votes


















          1














          It depends on type of an equipment, you are working with. You just have to follow the logic, described in equipment mans for this particular exception.



          In general there is no special 'Program Complete' event. That means, as it is written for 0x5 - "Specialized use in conjunction with programming commands.". So you just have to poll (read) some flag from your device meaning the internal process in device, which caused this exception, is complete.



          Just as an example, I've met with such exception in relay protection device, which issued it when it has been in a process of writing a disturbance record. I had just to check for that record readiness in some time.






          share|improve this answer
























          • Got it. I think the doc is misleading then, because it writes "Poll Program Complete" with capital letters, like if it is a well-known message of the Modbus standard.

            – Mark
            Nov 23 '18 at 7:51












          Your Answer






          StackExchange.ifUsing("editor", function () {
          StackExchange.using("externalEditor", function () {
          StackExchange.using("snippets", function () {
          StackExchange.snippets.init();
          });
          });
          }, "code-snippets");

          StackExchange.ready(function() {
          var channelOptions = {
          tags: "".split(" "),
          id: "1"
          };
          initTagRenderer("".split(" "), "".split(" "), channelOptions);

          StackExchange.using("externalEditor", function() {
          // Have to fire editor after snippets, if snippets enabled
          if (StackExchange.settings.snippets.snippetsEnabled) {
          StackExchange.using("snippets", function() {
          createEditor();
          });
          }
          else {
          createEditor();
          }
          });

          function createEditor() {
          StackExchange.prepareEditor({
          heartbeatType: 'answer',
          autoActivateHeartbeat: false,
          convertImagesToLinks: true,
          noModals: true,
          showLowRepImageUploadWarning: true,
          reputationToPostImages: 10,
          bindNavPrevention: true,
          postfix: "",
          imageUploader: {
          brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
          contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
          allowUrls: true
          },
          onDemand: true,
          discardSelector: ".discard-answer"
          ,immediatelyShowMarkdownHelp:true
          });


          }
          });














          draft saved

          draft discarded


















          StackExchange.ready(
          function () {
          StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53120597%2fhow-to-handle-modbus-exception-0x5%23new-answer', 'question_page');
          }
          );

          Post as a guest















          Required, but never shown

























          1 Answer
          1






          active

          oldest

          votes








          1 Answer
          1






          active

          oldest

          votes









          active

          oldest

          votes






          active

          oldest

          votes









          1














          It depends on type of an equipment, you are working with. You just have to follow the logic, described in equipment mans for this particular exception.



          In general there is no special 'Program Complete' event. That means, as it is written for 0x5 - "Specialized use in conjunction with programming commands.". So you just have to poll (read) some flag from your device meaning the internal process in device, which caused this exception, is complete.



          Just as an example, I've met with such exception in relay protection device, which issued it when it has been in a process of writing a disturbance record. I had just to check for that record readiness in some time.






          share|improve this answer
























          • Got it. I think the doc is misleading then, because it writes "Poll Program Complete" with capital letters, like if it is a well-known message of the Modbus standard.

            – Mark
            Nov 23 '18 at 7:51
















          1














          It depends on type of an equipment, you are working with. You just have to follow the logic, described in equipment mans for this particular exception.



          In general there is no special 'Program Complete' event. That means, as it is written for 0x5 - "Specialized use in conjunction with programming commands.". So you just have to poll (read) some flag from your device meaning the internal process in device, which caused this exception, is complete.



          Just as an example, I've met with such exception in relay protection device, which issued it when it has been in a process of writing a disturbance record. I had just to check for that record readiness in some time.






          share|improve this answer
























          • Got it. I think the doc is misleading then, because it writes "Poll Program Complete" with capital letters, like if it is a well-known message of the Modbus standard.

            – Mark
            Nov 23 '18 at 7:51














          1












          1








          1







          It depends on type of an equipment, you are working with. You just have to follow the logic, described in equipment mans for this particular exception.



          In general there is no special 'Program Complete' event. That means, as it is written for 0x5 - "Specialized use in conjunction with programming commands.". So you just have to poll (read) some flag from your device meaning the internal process in device, which caused this exception, is complete.



          Just as an example, I've met with such exception in relay protection device, which issued it when it has been in a process of writing a disturbance record. I had just to check for that record readiness in some time.






          share|improve this answer













          It depends on type of an equipment, you are working with. You just have to follow the logic, described in equipment mans for this particular exception.



          In general there is no special 'Program Complete' event. That means, as it is written for 0x5 - "Specialized use in conjunction with programming commands.". So you just have to poll (read) some flag from your device meaning the internal process in device, which caused this exception, is complete.



          Just as an example, I've met with such exception in relay protection device, which issued it when it has been in a process of writing a disturbance record. I had just to check for that record readiness in some time.







          share|improve this answer












          share|improve this answer



          share|improve this answer










          answered Nov 22 '18 at 12:44









          grapesgrapes

          4,7081420




          4,7081420













          • Got it. I think the doc is misleading then, because it writes "Poll Program Complete" with capital letters, like if it is a well-known message of the Modbus standard.

            – Mark
            Nov 23 '18 at 7:51



















          • Got it. I think the doc is misleading then, because it writes "Poll Program Complete" with capital letters, like if it is a well-known message of the Modbus standard.

            – Mark
            Nov 23 '18 at 7:51

















          Got it. I think the doc is misleading then, because it writes "Poll Program Complete" with capital letters, like if it is a well-known message of the Modbus standard.

          – Mark
          Nov 23 '18 at 7:51





          Got it. I think the doc is misleading then, because it writes "Poll Program Complete" with capital letters, like if it is a well-known message of the Modbus standard.

          – Mark
          Nov 23 '18 at 7:51




















          draft saved

          draft discarded




















































          Thanks for contributing an answer to Stack Overflow!


          • Please be sure to answer the question. Provide details and share your research!

          But avoid



          • Asking for help, clarification, or responding to other answers.

          • Making statements based on opinion; back them up with references or personal experience.


          To learn more, see our tips on writing great answers.




          draft saved


          draft discarded














          StackExchange.ready(
          function () {
          StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53120597%2fhow-to-handle-modbus-exception-0x5%23new-answer', 'question_page');
          }
          );

          Post as a guest















          Required, but never shown





















































          Required, but never shown














          Required, but never shown












          Required, but never shown







          Required, but never shown

































          Required, but never shown














          Required, but never shown












          Required, but never shown







          Required, but never shown







          Popular posts from this blog

          Guess what letter conforming each word

          Port of Spain

          Run scheduled task as local user group (not BUILTIN)