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); */
欢迎讨论,相互学习。
cdtxw@foxmail.com

浙公网安备 33010602011771号