QT modbustcp同步读异步写

https://blog.csdn.net/u010058695/article/details/116701572

同步读:

QVector<quint16>
MainWindow::readModbusTcpUnit(QModbusDataUnit::RegisterType type, int startAddr, int numbers, int serverID, bool *isOK)
{
    QVector<quint16> results;
    results.clear();
 
    if (mModbusClient->state() != QModbusDevice::ConnectedState) {
        *isOK = false;
        return results;
    }
 
    QModbusDataUnit readUnit(type, startAddr, static_cast<quint16>(numbers));
 
    auto *reply = mModbusClient->sendReadRequest(readUnit, serverID);
 
    if (!reply->isFinished()) {
        QEventLoop loop;
        connect(reply, &QModbusReply::finished,&loop,&QEventLoop::quit);
        eventLoop.exec();
    }
 
    if (reply->error() == QModbusDevice::NoError) {
 
        const QModbusDataUnit unit = reply->result();
 
        QString strType;
        switch (type){
            case QModbusDataUnit::Coils: strType = "Coils"; break;
            case QModbusDataUnit::DiscreteInputs: strType = "DiscreteInputs"; break;
            case QModbusDataUnit::HoldingRegisters: strType = "HoldingRegisters"; break;
            case QModbusDataUnit::InputRegisters: strType = "InputRegisters"; break;
        }
 
        qDebug()<<"read "<<strType<< " startAddr = "<<startAddr<<" numbers = "<<numbers<<" values = " <<unit.values();
 
        *isOK = true;
        results = unit.values();
    } else {
        *isOK = false;
    }
 
    delete reply;
    return results;
}
调用:
/*
* bool isOK; * QVector<quint16> readUnit = readModbusTcpUnit(QModbusDataUnit::Coils, 0, 10, SERVER_ID, &isOK); * QVector<quint16> readUnit = readModbusTcpUnit(QModbusDataUnit::DiscreteInputs, 0, 10, SERVER_ID, &isOK); * QVector<quint16> readUnit = readModbusTcpUnit(QModbusDataUnit::HoldingRegisters, 0, 10, SERVER_ID, &isOK); * QVector<quint16> readUnit = readModbusTcpUnit(QModbusDataUnit::InputRegisters, 0, 10, SERVER_ID, &isOK); */

 

异步写:

//modbusDevice 异步写线圈
void TcpClientModbus::writeModbusTcpCoils(QVector<quint16>  coilsValues, int startAddr, int numbers, int serverID)
{
    if (coilsValues.size() < numbers) {
        qDebug() << "error : coilsValue size < numbers";
        return;
    }

    if (modbusDevice->state() != QModbusDevice::ConnectedState) {
        qDebug() << "error : disConnectedState";
        return;
    }

    QModbusDataUnit writeUnit(QModbusDataUnit::Coils, startAddr, static_cast<quint16>(numbers));

    for (int valueIdx = 0; valueIdx < writeUnit.valueCount(); ++valueIdx) {
        writeUnit.setValue(valueIdx, coilsValues.at(valueIdx));
    }

    auto* reply = modbusDevice->sendWriteRequest(writeUnit, serverID);

    if (!reply->isFinished()) {
        connect(reply, &QModbusReply::finished, this, [this, reply]() {
            if (reply->error() == QModbusDevice::ProtocolError) {
                qDebug() << "ProtocolError";

            }
            else if (reply->error() != QModbusDevice::NoError) {
                qDebug() << "Error";
            }
            });
    }

    reply->deleteLater();
}
 

 

void
MainWindow::writeModbusTcpCoils(QVector<quint16>  coilsValues, int startAddr, int numbers, int serverID)
{
    if (coilsValues.size() < numbers){
        qDebug()<<"error : coilsValue size < numbers";
        return;
    }
 
    if (mModbusClient->state() != QModbusDevice::ConnectedState) {
        qDebug()<<"error : disConnectedState";
        return;
    }
 
    QModbusDataUnit writeUnit(QModbusDataUnit::Coils, startAddr, static_cast<quint16>(numbers));
 
    for (int valueIdx = 0; valueIdx < writeUnit.valueCount(); ++valueIdx) {
        writeUnit.setValue(valueIdx, coilsValues.at(valueIdx));
    }
 
    auto *reply = mModbusClient->sendWriteRequest(writeUnit, serverID);
 
    if (!reply->isFinished()) {
        connect(reply, &QModbusReply::finished, this, [this, reply]() {
            if (reply->error() == QModbusDevice::ProtocolError) {
                qDebug() << “ProtocolError”;
 
            } else if (reply->error() != QModbusDevice::NoError) {
                qDebug() << “Error”;
            }
        });
    }
 
    reply->deleteLater();
}

调用:

/*
 * QVector<quint16> values;
 * values.push_back(1);
 * values.push_back(0);
 * values.push_back(1);
 * writeModbusTcpCoils(values, 0, 3, SERVER_ID);
 * writeModbusTcpCoils(values, 3, 2, SERVER_ID);
*/

 

posted @ 2025-04-11 21:27  txwtech  阅读(131)  评论(0)    收藏  举报