Bonjour tous le monde,
Je suis nouveau sur le framework Qt Creator, et j'aimerais savoir comment lire les valeurs Modbus TCP (InputRegister) en 32 bits avec la classe QModbusDataUnit qui est en 16 bits ? ou comment combiner deux registres 16 bits pour construire un registre 32 bits avec la classe QModbusDataUnit ?
Sachant actuellement que j'essaye d'adapter l'exemple de code Qt Master 16 bits, pour lire des valeurs 32 bits mais sans succès, ci-joint les méthode qui permet de construire et lire des valeurs Modbus en 16 bits :


Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
void MainWindow::onReadButtonClicked() {
    if (!modbusDevice)
        return;
    ui->readValue->clear();
    statusBar()->clearMessage();
 
    if (auto *reply = modbusDevice->sendReadRequest(readRequest(), ui->serverEdit->value())) {
        if (!reply->isFinished())
            connect(reply, &QModbusReply::finished, this, &MainWindow::onReadReady);
        else
            delete reply; 
    } else {
        statusBar()->showMessage(tr("Read error: ") + modbusDevice->errorString(), 5000);
    }
}
 
 
 
void MainWindow::onReadReady() {
    auto reply = qobject_cast<QModbusReply *>(sender());
    if (!reply)
        return;
 
    if (reply->error() == QModbusDevice::NoError) {
        const QModbusDataUnit unit = reply->result();
        for (int i = 0, total = int(unit.valueCount()); i < total; ++i) {
            const QString entry = tr("Address: %1, Value: %2").arg(unit.startAddress() + i)
                                     .arg(QString::number(unit.value(i),
                                       unit.registerType() <= QModbusDataUnit::Coils ? 10 : 16));
            ui->readValue->addItem(entry);
        }
    } else if (reply->error() == QModbusDevice::ProtocolError) {
        statusBar()->showMessage(tr("Read response error: %1 (Mobus exception: 0x%2)").
                                    arg(reply->errorString()).
                                    arg(reply->rawResult().exceptionCode(), -1, 16), 5000);
    } else {
        statusBar()->showMessage(tr("Read response error: %1 (code: 0x%2)").
                                    arg(reply->errorString()).
                                    arg(reply->error(), -1, 16), 5000);
    }
 
 
 
 
 QModbusDataUnit MainWindow::readRequest() const {
    const auto table =
        static_cast<QModbusDataUnit::RegisterType>(ui->writeTable->currentData().toInt());
 
    int startAddress = ui->readAddress->value();
    Q_ASSERT(startAddress >= 0 && startAddress < 10);
 
    quint16 numberOfEntries = qMin(ui->readSize->currentText().toUShort(), quint16(10 - startAddress));
    return QModbusDataUnit(table, startAddress, numberOfEntries);
}

ci-joint le lien au code complet de l'application (16 bits)

https://code.qt.io/cgit/qt/qtserialb.../master?h=5.15

Merci de votre aide.