QModBusTcp + HoldingRegisters

217
24 марта 2018, 16:51

Добрый день! Прошу помощи, так как я не могу понять почему так. Проблема заключается в количестве считаных HoldingRegisters. Вот так выглядит код.

 if(!modbusDevice)
        return;
    statusBar()->clearMessage();
    QModbusDataUnit readUnit(QModbusDataUnit::HoldingRegisters, 0,  10);
    if(auto *reply = modbusDevice->sendReadRequest(readUnit, 1)){
        if(!reply->isFinished())
            connect(reply, &QModbusReply::finished, this, &MainWindow::ReadyRead);
        else
            delete reply;
    }else {
        statusBar()->showMessage(tr("Read error: " ) + modbusDevice->errorString(), 5000);
    }

В таком состоянии он считывает 10 регистров, можно считывать меньше 10. Но, у меня 18 регистров. Если я меняю 10 на 18, то ничего не происходит. Что я делаю не так? Как считать 18 регистров? Может проблема со слотом ReadyRead, вот его код:

 auto reply = qobject_cast<QModbusReply *>(sender());
    if(!reply)
        return;
    if(reply->error() == QModbusDevice::NoError){
        const QModbusDataUnit unit = reply->result();
        for(uint i = 0; i < unit.valueCount(); i++  ){
            const QString entry = tr("Addres:: %1, Value: %2").arg(unit.startAddress()).arg(QString::number(unit.value(i),
                                                                                                            unit.registerType() <= QModbusDataUnit::Coils ? 10 :16));
            ui->textEdit->append(entry);
        }
    } else if(reply->error() == QModbusDevice::ProtocolError) {
        statusBar()->showMessage(tr("Read error: %1, Modbus 0x%2 ").arg(reply->errorString()).arg(reply->error(), -1, 16), 5000);
    }  else {
        statusBar()->showMessage(tr("Read error: %1, code 0x%2").arg(reply->errorString().arg(reply->error(), -1, 16), 5000));
    }
    reply->deleteLater();
Answer 1

Разобрался с этой проблемой. В коде написано всё нормально, просто нужно было внимательно почитать Modbus и для чтения регистров использовать

QModbusDataUnit::QModbusDataUnit(RegisterType type, int address, const QVector<quint16> &data)
READ ALSO
QScopedPointer кастомный deleter

QScopedPointer кастомный deleter

Ничего не понимаю, каким образом мне передать в конструктор QScopedPointer функцию deleter'a, как я это делал в std::unique_ptr?

164
C++ Ошибка exception from hresult 0x80041fe2 visual studio

C++ Ошибка exception from hresult 0x80041fe2 visual studio

При создании любого проекта, консольного, классического, вылезает такая ошибка, может кто сталкивался с такой проблемой? C# работает прекрасно,...

416
Передать анонимную функцию из Delphi в C++

Передать анонимную функцию из Delphi в C++

Здравствуйте, как можно передать анонимную функцию из Delphi в C++? Delphi:

193