Merge PR #88: Add a parameter to write registers to the cli

pull/90/head
jenkins 2022-10-27 12:03:49 +02:00
commit 3e71df5d90
1 changed files with 79 additions and 28 deletions

View File

@ -74,6 +74,9 @@ int main(int argc, char *argv[])
lengthOption.setDefaultValue("1");
parser.addOption(lengthOption);
QCommandLineOption writeOption(QStringList() << "w" << "write", QString("The data to be written to the given register."), "data");
parser.addOption(writeOption);
QCommandLineOption debugOption(QStringList() << "d" << "debug", QString("Print more information."));
parser.addOption(debugOption);
@ -121,6 +124,12 @@ int main(int argc, char *argv[])
exit(EXIT_FAILURE);
}
QByteArray writeData;
if (parser.isSet(writeOption)) {
writeData = parser.value(writeOption).toLocal8Bit();
qDebug() << "Write data:" << writeData;
}
// TCP connection
QHostAddress address = QHostAddress(parser.value(addressOption));
if (address.isNull()) {
@ -142,40 +151,82 @@ int main(int argc, char *argv[])
if (state == QModbusDevice::ConnectedState) {
qDebug() << "Connected successfully to" << QString("%1:%2").arg(address.toString()).arg(port);
qDebug() << "Start reading from modbus server address" << modbusServerAddress << registerTypeString << "register:" << registerAddress << "Length:" << length;
QModbusDataUnit request = QModbusDataUnit(registerType, registerAddress, length);
QModbusReply *reply = client->sendReadRequest(request, modbusServerAddress);
if (!reply) {
qCritical() << "Failed to read register" << client->errorString();
exit(EXIT_FAILURE);
}
if (reply->isFinished()) {
reply->deleteLater(); // broadcast replies return immediately
qCritical() << "Reply finished immediatly. Something might have gone wrong:" << reply->errorString();
exit(EXIT_FAILURE);
}
QObject::connect(reply, &QModbusReply::finished, reply, &QModbusReply::deleteLater);
QObject::connect(reply, &QModbusReply::finished, client, [=]() {
if (reply->error() != QModbusDevice::NoError) {
qCritical() << "Reply finished with error:" << reply->errorString();
if (writeData.isEmpty()) {
qDebug() << "Reading from modbus server address" << modbusServerAddress << registerTypeString << "register:" << registerAddress << "Length:" << length;
QModbusDataUnit request = QModbusDataUnit(registerType, registerAddress, length);
QModbusReply *reply = client->sendReadRequest(request, modbusServerAddress);
if (!reply) {
qCritical() << "Failed to read register" << client->errorString();
exit(EXIT_FAILURE);
}
const QModbusDataUnit unit = reply->result();
for (uint i = 0; i < unit.valueCount(); i++) {
quint16 registerValue = unit.values().at(i);
quint16 registerNumber = unit.startAddress() + i;
qInfo() << "-->" << registerNumber << ":" << QString("0x%1").arg(registerValue, 4, 16, QLatin1Char('0')) << registerValue;
if (reply->isFinished()) {
reply->deleteLater(); // broadcast replies return immediately
qCritical() << "Reply finished immediatly. Something might have gone wrong:" << reply->errorString();
exit(EXIT_FAILURE);
}
exit(EXIT_SUCCESS);
});
QObject::connect(reply, &QModbusReply::finished, reply, &QModbusReply::deleteLater);
QObject::connect(reply, &QModbusReply::finished, client, [=]() {
if (reply->error() != QModbusDevice::NoError) {
qCritical() << "Reply finished with error:" << reply->errorString();
exit(EXIT_FAILURE);
}
QObject::connect(reply, &QModbusReply::errorOccurred, client, [=] (QModbusDevice::Error error){
qCritical() << "Modbus reply error occurred:" << error << reply->errorString();
});
const QModbusDataUnit unit = reply->result();
for (uint i = 0; i < unit.valueCount(); i++) {
quint16 registerValue = unit.values().at(i);
quint16 registerNumber = unit.startAddress() + i;
qInfo() << "-->" << registerNumber << ":" << QString("0x%1").arg(registerValue, 4, 16, QLatin1Char('0')) << registerValue;
}
exit(EXIT_SUCCESS);
});
QObject::connect(reply, &QModbusReply::errorOccurred, client, [=] (QModbusDevice::Error error){
qCritical() << "Modbus reply error occurred:" << error << reply->errorString();
});
} else {
QModbusDataUnit request = QModbusDataUnit(registerType, registerAddress, length);
QDataStream stream(writeData);
qDebug() << "Reading write data" << writeData;
quint16 data = writeData.toUInt();
request.setValues({data});
qDebug() << "Writing" << request.values();
QModbusReply *reply = client->sendWriteRequest(request, modbusServerAddress);
if (!reply) {
qCritical() << "Failed to read register" << client->errorString();
exit(EXIT_FAILURE);
}
if (reply->isFinished()) {
reply->deleteLater(); // broadcast replies return immediately
qCritical() << "Reply finished immediatly. Something might have gone wrong:" << reply->errorString();
exit(EXIT_FAILURE);
}
QObject::connect(reply, &QModbusReply::finished, reply, &QModbusReply::deleteLater);
QObject::connect(reply, &QModbusReply::finished, client, [=]() {
if (reply->error() != QModbusDevice::NoError) {
qCritical() << "Reply finished with error:" << reply->errorString();
exit(EXIT_FAILURE);
}
const QModbusDataUnit unit = reply->result();
for (uint i = 0; i < unit.valueCount(); i++) {
quint16 registerValue = unit.values().at(i);
quint16 registerNumber = unit.startAddress() + i;
qInfo() << "-->" << registerNumber << ":" << QString("0x%1").arg(registerValue, 4, 16, QLatin1Char('0')) << registerValue;
}
exit(EXIT_SUCCESS);
});
QObject::connect(reply, &QModbusReply::errorOccurred, client, [=] (QModbusDevice::Error error){
qCritical() << "Modbus reply error occurred:" << error << reply->errorString();
});
}
}
});