Allow creating multiple connections on one ModbusTcpMaster

This commit is contained in:
Simon Stürz 2023-08-09 14:23:15 +02:00
parent ba922c7e7e
commit 1b423186bb
27 changed files with 249 additions and 190 deletions

View File

@ -110,13 +110,13 @@ void IntegrationPluginAlphaInnotec::setupThing(ThingSetupInfo *info)
quint16 slaveId = thing->paramValue(alphaConnectThingSlaveIdParamTypeId).toUInt();
AlphaInnotecModbusTcpConnection *alphaConnectTcpConnection = new AlphaInnotecModbusTcpConnection(hostAddress, port, slaveId, this);
connect(alphaConnectTcpConnection, &AlphaInnotecModbusTcpConnection::connectionStateChanged, this, [thing, alphaConnectTcpConnection](bool status){
qCDebug(dcAlphaInnotec()) << "Connected changed to" << status << "for" << thing;
if (status) {
connect(alphaConnectTcpConnection, &AlphaInnotecModbusTcpConnection::reachableChanged, this, [thing, alphaConnectTcpConnection](bool reachable){
qCDebug(dcAlphaInnotec()) << "Reachable changed to" << reachable << "for" << thing;
if (reachable) {
alphaConnectTcpConnection->update();
}
thing->setStateValue(alphaConnectConnectedStateTypeId, status);
thing->setStateValue(alphaConnectConnectedStateTypeId, reachable);
});
@ -311,7 +311,7 @@ void IntegrationPluginAlphaInnotec::postSetupThing(Thing *thing)
m_pluginTimer = hardwareManager()->pluginTimerManager()->registerTimer(10);
connect(m_pluginTimer, &PluginTimer::timeout, this, [this] {
foreach (AlphaInnotecModbusTcpConnection *connection, m_connections) {
if (connection->connected()) {
if (connection->reachable()) {
connection->update();
}
}
@ -340,7 +340,7 @@ void IntegrationPluginAlphaInnotec::executeAction(ThingActionInfo *info)
Thing *thing = info->thing();
AlphaInnotecModbusTcpConnection *connection = m_connections.value(thing);
if (!connection->connected()) {
if (!connection->reachable()) {
qCWarning(dcAlphaInnotec()) << "Could not execute action. The modbus connection is currently not available.";
info->finish(Thing::ThingErrorHardwareNotAvailable);
return;

View File

@ -169,7 +169,7 @@ void IntegrationPluginAmperfied::postSetupThing(Thing *thing)
connection->update();
}
foreach(AmperfiedModbusTcpConnection *connection, m_tcpConnections) {
qCDebug(dcAmperfied()) << "Updating connection" << connection->hostAddress();
qCDebug(dcAmperfied()) << "Updating connection" << connection->modbusTcpMaster()->hostAddress();
connection->update();
}
});

Binary file not shown.

View File

@ -42,7 +42,7 @@ HuaweiFusionSolar::HuaweiFusionSolar(const QHostAddress &hostAddress, uint port,
// this is a very slow or busy device since it returns quiet often that error. Don't faile with the first busy error...
setCheckReachableRetries(3);
connect(this, &HuaweiFusionModbusTcpConnection::connectionStateChanged, this, [=](bool connected){
connect(modbusTcpMaster(), &ModbusTcpMaster::connectionStateChanged, this, [=](bool connected){
if (!connected) {
m_registersQueue.clear();
}
@ -114,7 +114,7 @@ void HuaweiFusionSolar::readNextRegister()
qCDebug(dcHuaweiFusionSolar()) << "--> Read \"Inverter active power\" register:" << 32080 << "size:" << 2;
QModbusReply *reply = readInverterActivePower();
if (!reply) {
qCWarning(dcHuaweiFusionSolar()) << "Error occurred while reading \"Inverter active power\" registers from" << hostAddress().toString() << errorString();
qCWarning(dcHuaweiFusionSolar()) << "Error occurred while reading \"Inverter active power\" registers from" << modbusTcpMaster()->hostAddress().toString() << modbusTcpMaster()->errorString();
finishRequest();
return;
}
@ -145,10 +145,10 @@ void HuaweiFusionSolar::readNextRegister()
if (reply->error() == QModbusDevice::ProtocolError) {
QModbusResponse response = reply->rawResult();
if (response.isException()) {
qCDebug(dcHuaweiFusionSolar()) << "Modbus reply error occurred while updating \"Inverter active power\" registers from" << hostAddress().toString() << exceptionToString(response.exceptionCode());
qCDebug(dcHuaweiFusionSolar()) << "Modbus reply error occurred while updating \"Inverter active power\" registers from" << modbusTcpMaster()->hostAddress().toString() << exceptionToString(response.exceptionCode());
}
} else {
qCWarning(dcHuaweiFusionSolar()) << "Modbus reply error occurred while updating \"Inverter active power\" registers from" << hostAddress().toString() << error << reply->errorString();
qCWarning(dcHuaweiFusionSolar()) << "Modbus reply error occurred while updating \"Inverter active power\" registers from" << modbusTcpMaster()->hostAddress().toString() << error << reply->errorString();
}
});
@ -159,7 +159,7 @@ void HuaweiFusionSolar::readNextRegister()
qCDebug(dcHuaweiFusionSolar()) << "--> Read \"Inverter input power\" register:" << 32064 << "size:" << 2;
QModbusReply *reply = readInverterInputPower();
if (!reply) {
qCWarning(dcHuaweiFusionSolar()) << "Error occurred while reading \"Inverter input power\" registers from" << hostAddress().toString() << errorString();
qCWarning(dcHuaweiFusionSolar()) << "Error occurred while reading \"Inverter input power\" registers from" << modbusTcpMaster()->hostAddress().toString() << modbusTcpMaster()->errorString();
finishRequest();
return;
}
@ -190,10 +190,10 @@ void HuaweiFusionSolar::readNextRegister()
if (reply->error() == QModbusDevice::ProtocolError) {
QModbusResponse response = reply->rawResult();
if (response.isException()) {
qCDebug(dcHuaweiFusionSolar()) << "Modbus reply error occurred while updating \"Inverter input power\" registers from" << hostAddress().toString() << exceptionToString(response.exceptionCode());
qCDebug(dcHuaweiFusionSolar()) << "Modbus reply error occurred while updating \"Inverter input power\" registers from" << modbusTcpMaster()->hostAddress().toString() << exceptionToString(response.exceptionCode());
}
} else {
qCWarning(dcHuaweiFusionSolar()) << "Modbus reply error occurred while updating \"Inverter input power\" registers from" << hostAddress().toString() << error << reply->errorString();
qCWarning(dcHuaweiFusionSolar()) << "Modbus reply error occurred while updating \"Inverter input power\" registers from" << modbusTcpMaster()->hostAddress().toString() << error << reply->errorString();
}
});
@ -204,7 +204,7 @@ void HuaweiFusionSolar::readNextRegister()
qCDebug(dcHuaweiFusionSolar()) << "--> Read \"Inverter device status\" register:" << 32089 << "size:" << 1;
QModbusReply *reply = readInverterDeviceStatus();
if (!reply) {
qCWarning(dcHuaweiFusionSolar()) << "Error occurred while reading \"Inverter device status\" registers from" << hostAddress().toString() << errorString();
qCWarning(dcHuaweiFusionSolar()) << "Error occurred while reading \"Inverter device status\" registers from" << modbusTcpMaster()->hostAddress().toString() << modbusTcpMaster()->errorString();
finishRequest();
return;
}
@ -234,10 +234,10 @@ void HuaweiFusionSolar::readNextRegister()
if (reply->error() == QModbusDevice::ProtocolError) {
QModbusResponse response = reply->rawResult();
if (response.isException()) {
qCDebug(dcHuaweiFusionSolar()) << "Modbus reply error occurred while updating \"Inverter device status\" registers from" << hostAddress().toString() << exceptionToString(response.exceptionCode());
qCDebug(dcHuaweiFusionSolar()) << "Modbus reply error occurred while updating \"Inverter device status\" registers from" << modbusTcpMaster()->hostAddress().toString() << exceptionToString(response.exceptionCode());
}
} else {
qCWarning(dcHuaweiFusionSolar()) << "Modbus reply error occurred while updating \"Inverter device status\" registers from" << hostAddress().toString() << error << reply->errorString();
qCWarning(dcHuaweiFusionSolar()) << "Modbus reply error occurred while updating \"Inverter device status\" registers from" << modbusTcpMaster()->hostAddress().toString() << error << reply->errorString();
}
});
@ -248,7 +248,7 @@ void HuaweiFusionSolar::readNextRegister()
qCDebug(dcHuaweiFusionSolar()) << "--> Read \"Inverter energy produced\" register:" << 32106 << "size:" << 2;
QModbusReply *reply = readInverterEnergyProduced();
if (!reply) {
qCWarning(dcHuaweiFusionSolar()) << "Error occurred while reading \"Inverter energy produced\" registers from" << hostAddress().toString() << errorString();
qCWarning(dcHuaweiFusionSolar()) << "Error occurred while reading \"Inverter energy produced\" registers from" << modbusTcpMaster()->hostAddress().toString() << modbusTcpMaster()->errorString();
finishRequest();
return;
}
@ -278,10 +278,10 @@ void HuaweiFusionSolar::readNextRegister()
if (reply->error() == QModbusDevice::ProtocolError) {
QModbusResponse response = reply->rawResult();
if (response.isException()) {
qCDebug(dcHuaweiFusionSolar()) << "Modbus reply error occurred while updating \"Inverter energy produced\" registers from" << hostAddress().toString() << exceptionToString(response.exceptionCode());
qCDebug(dcHuaweiFusionSolar()) << "Modbus reply error occurred while updating \"Inverter energy produced\" registers from" << modbusTcpMaster()->hostAddress().toString() << exceptionToString(response.exceptionCode());
}
} else {
qCWarning(dcHuaweiFusionSolar()) << "Modbus reply error occurred while updating \"Inverter energy produced\" registers from" << hostAddress().toString() << error << reply->errorString();
qCWarning(dcHuaweiFusionSolar()) << "Modbus reply error occurred while updating \"Inverter energy produced\" registers from" << modbusTcpMaster()->hostAddress().toString() << error << reply->errorString();
}
});
break;
@ -291,7 +291,7 @@ void HuaweiFusionSolar::readNextRegister()
qCDebug(dcHuaweiFusionSolar()) << "--> Read \"Power meter active power\" register:" << 37113 << "size:" << 2;
QModbusReply *reply = readPowerMeterActivePower();
if (!reply) {
qCWarning(dcHuaweiFusionSolar()) << "Error occurred while reading \"Power meter active power\" registers from" << hostAddress().toString() << errorString();
qCWarning(dcHuaweiFusionSolar()) << "Error occurred while reading \"Power meter active power\" registers from" << modbusTcpMaster()->hostAddress().toString() << modbusTcpMaster()->errorString();
finishRequest();
return;
}
@ -321,10 +321,10 @@ void HuaweiFusionSolar::readNextRegister()
if (reply->error() == QModbusDevice::ProtocolError) {
QModbusResponse response = reply->rawResult();
if (response.isException()) {
qCDebug(dcHuaweiFusionSolar()) << "Modbus reply error occurred while updating \"Power meter active power\" registers from" << hostAddress().toString() << exceptionToString(response.exceptionCode());
qCDebug(dcHuaweiFusionSolar()) << "Modbus reply error occurred while updating \"Power meter active power\" registers from" << modbusTcpMaster()->hostAddress().toString() << exceptionToString(response.exceptionCode());
}
} else {
qCWarning(dcHuaweiFusionSolar()) << "Modbus reply error occurred while updating \"Power meter active power\" registers from" << hostAddress().toString() << error << reply->errorString();
qCWarning(dcHuaweiFusionSolar()) << "Modbus reply error occurred while updating \"Power meter active power\" registers from" << modbusTcpMaster()->hostAddress().toString() << error << reply->errorString();
}
});
@ -335,7 +335,7 @@ void HuaweiFusionSolar::readNextRegister()
qCDebug(dcHuaweiFusionSolar()) << "--> Read \"Luna 2000 Battery 1 status\" register:" << 37000 << "size:" << 1;
QModbusReply *reply = readLunaBattery1Status();
if (!reply) {
qCWarning(dcHuaweiFusionSolar()) << "Error occurred while reading \"Luna 2000 Battery 1 status\" registers from" << hostAddress().toString() << errorString();
qCWarning(dcHuaweiFusionSolar()) << "Error occurred while reading \"Luna 2000 Battery 1 status\" registers from" << modbusTcpMaster()->hostAddress().toString() << modbusTcpMaster()->errorString();
finishRequest();
return;
}
@ -365,10 +365,10 @@ void HuaweiFusionSolar::readNextRegister()
if (reply->error() == QModbusDevice::ProtocolError) {
QModbusResponse response = reply->rawResult();
if (response.isException()) {
qCDebug(dcHuaweiFusionSolar()) << "Modbus reply error occurred while updating \"Luna 2000 Battery 1 status\" registers from" << hostAddress().toString() << exceptionToString(response.exceptionCode());
qCDebug(dcHuaweiFusionSolar()) << "Modbus reply error occurred while updating \"Luna 2000 Battery 1 status\" registers from" << modbusTcpMaster()->hostAddress().toString() << exceptionToString(response.exceptionCode());
}
} else {
qCWarning(dcHuaweiFusionSolar()) << "Modbus reply error occurred while updating \"Luna 2000 Battery 1 status\" registers from" << hostAddress().toString() << error << reply->errorString();
qCWarning(dcHuaweiFusionSolar()) << "Modbus reply error occurred while updating \"Luna 2000 Battery 1 status\" registers from" << modbusTcpMaster()->hostAddress().toString() << error << reply->errorString();
}
});
break;
@ -378,7 +378,7 @@ void HuaweiFusionSolar::readNextRegister()
qCDebug(dcHuaweiFusionSolar()) << "--> Read \"Luna 2000 Battery 1 power\" register:" << 37001 << "size:" << 2;
QModbusReply *reply = readLunaBattery1Power();
if (!reply) {
qCWarning(dcHuaweiFusionSolar()) << "Error occurred while reading \"Luna 2000 Battery 1 power\" registers from" << hostAddress().toString() << errorString();
qCWarning(dcHuaweiFusionSolar()) << "Error occurred while reading \"Luna 2000 Battery 1 power\" registers from" << modbusTcpMaster()->hostAddress().toString() << modbusTcpMaster()->errorString();
finishRequest();
return;
}
@ -408,10 +408,10 @@ void HuaweiFusionSolar::readNextRegister()
if (reply->error() == QModbusDevice::ProtocolError) {
QModbusResponse response = reply->rawResult();
if (response.isException()) {
qCDebug(dcHuaweiFusionSolar()) << "Modbus reply error occurred while updating \"Luna 2000 Battery 1 power\" registers from" << hostAddress().toString() << exceptionToString(response.exceptionCode());
qCDebug(dcHuaweiFusionSolar()) << "Modbus reply error occurred while updating \"Luna 2000 Battery 1 power\" registers from" << modbusTcpMaster()->hostAddress().toString() << exceptionToString(response.exceptionCode());
}
} else {
qCWarning(dcHuaweiFusionSolar()) << "Modbus reply error occurred while updating \"Luna 2000 Battery 1 power\" registers from" << hostAddress().toString() << error << reply->errorString();
qCWarning(dcHuaweiFusionSolar()) << "Modbus reply error occurred while updating \"Luna 2000 Battery 1 power\" registers from" << modbusTcpMaster()->hostAddress().toString() << error << reply->errorString();
}
});
break;
@ -421,7 +421,7 @@ void HuaweiFusionSolar::readNextRegister()
qCDebug(dcHuaweiFusionSolar()) << "--> Read \"Luna 2000 Battery 1 state of charge\" register:" << 37004 << "size:" << 1;
QModbusReply *reply = readLunaBattery1Soc();
if (!reply) {
qCWarning(dcHuaweiFusionSolar()) << "Error occurred while reading \"Luna 2000 Battery 1 state of charge\" registers from" << hostAddress().toString() << errorString();
qCWarning(dcHuaweiFusionSolar()) << "Error occurred while reading \"Luna 2000 Battery 1 state of charge\" registers from" << modbusTcpMaster()->hostAddress().toString() << modbusTcpMaster()->errorString();
finishRequest();
return;
}
@ -451,10 +451,10 @@ void HuaweiFusionSolar::readNextRegister()
if (reply->error() == QModbusDevice::ProtocolError) {
QModbusResponse response = reply->rawResult();
if (response.isException()) {
qCDebug(dcHuaweiFusionSolar()) << "Modbus reply error occurred while updating \"Luna 2000 Battery 1 state of charge\" registers from" << hostAddress().toString() << exceptionToString(response.exceptionCode());
qCDebug(dcHuaweiFusionSolar()) << "Modbus reply error occurred while updating \"Luna 2000 Battery 1 state of charge\" registers from" << modbusTcpMaster()->hostAddress().toString() << exceptionToString(response.exceptionCode());
}
} else {
qCWarning(dcHuaweiFusionSolar()) << "Modbus reply error occurred while updating \"Luna 2000 Battery 1 state of charge\" registers from" << hostAddress().toString() << error << reply->errorString();
qCWarning(dcHuaweiFusionSolar()) << "Modbus reply error occurred while updating \"Luna 2000 Battery 1 state of charge\" registers from" << modbusTcpMaster()->hostAddress().toString() << error << reply->errorString();
}
});
break;
@ -465,7 +465,7 @@ void HuaweiFusionSolar::readNextRegister()
qCDebug(dcHuaweiFusionSolar()) << "--> Read \"Luna 2000 Battery 2 status\" register:" << 37741 << "size:" << 1;
QModbusReply *reply = readLunaBattery2Status();
if (!reply) {
qCWarning(dcHuaweiFusionSolar()) << "Error occurred while reading \"Luna 2000 Battery 2 status\" registers from" << hostAddress().toString() << errorString();
qCWarning(dcHuaweiFusionSolar()) << "Error occurred while reading \"Luna 2000 Battery 2 status\" registers from" << modbusTcpMaster()->hostAddress().toString() << modbusTcpMaster()->errorString();
finishRequest();
return;
}
@ -495,10 +495,10 @@ void HuaweiFusionSolar::readNextRegister()
if (reply->error() == QModbusDevice::ProtocolError) {
QModbusResponse response = reply->rawResult();
if (response.isException()) {
qCDebug(dcHuaweiFusionSolar()) << "Modbus reply error occurred while updating \"Luna 2000 Battery 2 status\" registers from" << hostAddress().toString() << exceptionToString(response.exceptionCode());
qCDebug(dcHuaweiFusionSolar()) << "Modbus reply error occurred while updating \"Luna 2000 Battery 2 status\" registers from" << modbusTcpMaster()->hostAddress().toString() << exceptionToString(response.exceptionCode());
}
} else {
qCWarning(dcHuaweiFusionSolar()) << "Modbus reply error occurred while updating \"Luna 2000 Battery 2 status\" registers from" << hostAddress().toString() << error << reply->errorString();
qCWarning(dcHuaweiFusionSolar()) << "Modbus reply error occurred while updating \"Luna 2000 Battery 2 status\" registers from" << modbusTcpMaster()->hostAddress().toString() << error << reply->errorString();
}
});
break;
@ -508,7 +508,7 @@ void HuaweiFusionSolar::readNextRegister()
qCDebug(dcHuaweiFusionSolar()) << "--> Read \"Luna 2000 Battery 2 power\" register:" << 37743 << "size:" << 2;
QModbusReply *reply = readLunaBattery2Power();
if (!reply) {
qCWarning(dcHuaweiFusionSolar()) << "Error occurred while reading \"Luna 2000 Battery 2 power\" registers from" << hostAddress().toString() << errorString();
qCWarning(dcHuaweiFusionSolar()) << "Error occurred while reading \"Luna 2000 Battery 2 power\" registers from" << modbusTcpMaster()->hostAddress().toString() << modbusTcpMaster()->errorString();
finishRequest();
return;
}
@ -538,10 +538,10 @@ void HuaweiFusionSolar::readNextRegister()
if (reply->error() == QModbusDevice::ProtocolError) {
QModbusResponse response = reply->rawResult();
if (response.isException()) {
qCDebug(dcHuaweiFusionSolar()) << "Modbus reply error occurred while updating \"Luna 2000 Battery 2 power\" registers from" << hostAddress().toString() << exceptionToString(response.exceptionCode());
qCDebug(dcHuaweiFusionSolar()) << "Modbus reply error occurred while updating \"Luna 2000 Battery 2 power\" registers from" << modbusTcpMaster()->hostAddress().toString() << exceptionToString(response.exceptionCode());
}
} else {
qCWarning(dcHuaweiFusionSolar()) << "Modbus reply error occurred while updating \"Luna 2000 Battery 2 power\" registers from" << hostAddress().toString() << error << reply->errorString();
qCWarning(dcHuaweiFusionSolar()) << "Modbus reply error occurred while updating \"Luna 2000 Battery 2 power\" registers from" << modbusTcpMaster()->hostAddress().toString() << error << reply->errorString();
}
});
break;
@ -551,7 +551,7 @@ void HuaweiFusionSolar::readNextRegister()
qCDebug(dcHuaweiFusionSolar()) << "--> Read \"Luna 2000 Battery 2 state of charge\" register:" << 37738 << "size:" << 1;
QModbusReply *reply = readLunaBattery2Soc();
if (!reply) {
qCWarning(dcHuaweiFusionSolar()) << "Error occurred while reading \"Luna 2000 Battery 2 state of charge\" registers from" << hostAddress().toString() << errorString();
qCWarning(dcHuaweiFusionSolar()) << "Error occurred while reading \"Luna 2000 Battery 2 state of charge\" registers from" << modbusTcpMaster()->hostAddress().toString() << modbusTcpMaster()->errorString();
finishRequest();
return;
}
@ -581,10 +581,10 @@ void HuaweiFusionSolar::readNextRegister()
if (reply->error() == QModbusDevice::ProtocolError) {
QModbusResponse response = reply->rawResult();
if (response.isException()) {
qCDebug(dcHuaweiFusionSolar()) << "Modbus reply error occurred while updating \"Luna 2000 Battery 2 state of charge\" registers from" << hostAddress().toString() << exceptionToString(response.exceptionCode());
qCDebug(dcHuaweiFusionSolar()) << "Modbus reply error occurred while updating \"Luna 2000 Battery 2 state of charge\" registers from" << modbusTcpMaster()->hostAddress().toString() << exceptionToString(response.exceptionCode());
}
} else {
qCWarning(dcHuaweiFusionSolar()) << "Modbus reply error occurred while updating \"Luna 2000 Battery 2 state of charge\" registers from" << hostAddress().toString() << error << reply->errorString();
qCWarning(dcHuaweiFusionSolar()) << "Modbus reply error occurred while updating \"Luna 2000 Battery 2 state of charge\" registers from" << modbusTcpMaster()->hostAddress().toString() << error << reply->errorString();
}
});
break;

View File

@ -74,10 +74,10 @@ void HuaweiFusionSolarDiscovery::testNextConnection(const QHostAddress &address)
// but retry only once to communicate with the device for reachability check...
connection->setCheckReachableRetries(1);
qCDebug(dcHuawei()) << "Discovery: Start searching on" << QString("%1:%2").arg(address.toString()).arg(connection->port()) << "slave ID:" << connection->slaveId();
qCDebug(dcHuawei()) << "Discovery: Start searching on" << QString("%1:%2").arg(address.toString()).arg(connection->modbusTcpMaster()->port()) << "slave ID:" << connection->slaveId();
// Try to connect, maybe it works, maybe not...
if (!connection->connectDevice()) {
qCDebug(dcHuawei()) << "Discovery: Failed to connect to" << QString("%1:%2").arg(address.toString()).arg(connection->port()) << "slave ID:" << connection->slaveId() << "Continue...";;
qCDebug(dcHuawei()) << "Discovery: Failed to connect to" << QString("%1:%2").arg(address.toString()).arg(connection->modbusTcpMaster()->port()) << "slave ID:" << connection->slaveId() << "Continue...";;
cleanupConnection(connection);
}
}
@ -117,7 +117,7 @@ void HuaweiFusionSolarDiscovery::checkNetworkDevice(const NetworkDeviceInfo &net
});
// If we get any error...skip this host...
connect(connection, &HuaweiFusionSolar::connectionErrorOccurred, this, [=](QModbusDevice::Error error){
connect(connection->modbusTcpMaster(), &ModbusTcpMaster::connectionErrorOccurred, this, [=](QModbusDevice::Error error){
if (error != QModbusDevice::NoError) {
qCDebug(dcHuawei()) << "Discovery: Connection error on" << networkDeviceInfo.address().toString() << "Continue...";;
cleanupConnection(connection);
@ -144,7 +144,7 @@ void HuaweiFusionSolarDiscovery::cleanupConnection(HuaweiFusionSolar *connection
connection->deleteLater();
}
testNextConnection(connection->hostAddress());
testNextConnection(connection->modbusTcpMaster()->hostAddress());
}
void HuaweiFusionSolarDiscovery::finishDiscovery()

View File

@ -431,7 +431,7 @@ void IntegrationPluginHuawei::setupFusionSolar(ThingSetupInfo *info)
connect(info, &ThingSetupInfo::aborted, connection, &HuaweiFusionSolar::deleteLater);
connect(connection, &HuaweiFusionSolar::reachableChanged, info, [=](bool reachable){
if (!reachable) {
qCWarning(dcHuawei()) << "Connection init finished with errors" << thing->name() << connection->hostAddress().toString();
qCWarning(dcHuawei()) << "Connection init finished with errors" << thing->name() << connection->modbusTcpMaster()->hostAddress().toString();
hardwareManager()->networkDeviceDiscovery()->unregisterMonitor(monitor);
connection->disconnectDevice();
connection->deleteLater();
@ -486,7 +486,7 @@ void IntegrationPluginHuawei::setupFusionSolar(ThingSetupInfo *info)
qCDebug(dcHuawei()) << "Network device monitor for" << thing->name() << (reachable ? "is now reachable" : "is not reachable any more" );
if (reachable && !thing->stateValue("connected").toBool()) {
connection->setHostAddress(monitor->networkDeviceInfo().address());
connection->modbusTcpMaster()->setHostAddress(monitor->networkDeviceInfo().address());
connection->connectDevice();
} else if (!reachable) {
// Note: We disable autoreconnect explicitly and we will

View File

@ -201,7 +201,7 @@ void IntegrationPluginIdm::executeAction(ThingActionInfo *info)
return;
}
if (!connection->connected())
if (!connection->reachable())
info->finish(Thing::ThingErrorHardwareNotAvailable);
@ -251,7 +251,7 @@ void IntegrationPluginIdm::setupConnection(ThingSetupInfo *info)
return;
if (reachable && !thing->stateValue("connected").toBool()) {
connection->setHostAddress(monitor->networkDeviceInfo().address());
connection->modbusTcpMaster()->setHostAddress(monitor->networkDeviceInfo().address());
connection->connectDevice();
} else if (!reachable) {
// Note: We disable autoreconnect explicitly and we will
@ -290,7 +290,7 @@ void IntegrationPluginIdm::setupConnection(ThingSetupInfo *info)
connect(connection, &IdmModbusTcpConnection::initializationFinished, info, [=](bool success){
if (!success) {
qCWarning(dcIdm()) << "Connection init finished with errors" << thing->name() << connection->hostAddress().toString();
qCWarning(dcIdm()) << "Connection init finished with errors" << thing->name() << connection->modbusTcpMaster()->hostAddress().toString();
hardwareManager()->networkDeviceDiscovery()->unregisterMonitor(monitor);
connection->deleteLater();
info->finish(Thing::ThingErrorHardwareFailure, QT_TR_NOOP("Could not initialize the communication with the device."));

View File

@ -195,7 +195,7 @@ void IntegrationPluginKostal::postSetupThing(Thing *thing)
m_pluginTimer = hardwareManager()->pluginTimerManager()->registerTimer(2);
connect(m_pluginTimer, &PluginTimer::timeout, this, [this] {
foreach(KostalModbusTcpConnection *connection, m_kostalConnections) {
qCDebug(dcKostal()) << "Update connection" << connection->hostAddress().toString();
qCDebug(dcKostal()) << "Update connection" << connection->modbusTcpMaster()->hostAddress().toString();
connection->update();
}
});
@ -319,7 +319,7 @@ void IntegrationPluginKostal::setupKostalConnection(ThingSetupInfo *info)
return;
if (reachable && !thing->stateValue("connected").toBool()) {
kostalConnection->setHostAddress(monitor->networkDeviceInfo().address());
kostalConnection->modbusTcpMaster()->setHostAddress(monitor->networkDeviceInfo().address());
kostalConnection->connectDevice();
} else if (!reachable) {
// Note: We disable autoreconnect explicitly and we will
@ -358,7 +358,7 @@ void IntegrationPluginKostal::setupKostalConnection(ThingSetupInfo *info)
connect(kostalConnection, &KostalModbusTcpConnection::initializationFinished, info, [=](bool success){
if (!success) {
qCWarning(dcKostal()) << "Connection init finished with errors" << thing->name() << kostalConnection->hostAddress().toString();
qCWarning(dcKostal()) << "Connection init finished with errors" << thing->name() << kostalConnection->modbusTcpMaster()->hostAddress().toString();
hardwareManager()->networkDeviceDiscovery()->unregisterMonitor(monitor);
kostalConnection->deleteLater();
info->finish(Thing::ThingErrorHardwareFailure, QT_TR_NOOP("Could not initialize the communication with the inverter."));

View File

@ -133,7 +133,7 @@ void KostalDiscovery::checkNetworkDevice(const NetworkDeviceInfo &networkDeviceI
});
// If we get any error...skip this host...
connect(connection, &KostalModbusTcpConnection::connectionErrorOccurred, this, [=](QModbusDevice::Error error){
connect(connection->modbusTcpMaster(), &ModbusTcpMaster::connectionErrorOccurred, this, [=](QModbusDevice::Error error){
if (error != QModbusDevice::NoError) {
qCDebug(dcKostal()) << "Discovery: Connection error on" << networkDeviceInfo.address().toString() << "Continue...";;
cleanupConnection(connection);

View File

@ -32,7 +32,7 @@
Q_LOGGING_CATEGORY(dcModbusTcpMaster, "ModbusTcpMaster")
ModbusTCPMaster::ModbusTCPMaster(const QHostAddress &hostAddress, uint port, QObject *parent) :
ModbusTcpMaster::ModbusTcpMaster(const QHostAddress &hostAddress, uint port, QObject *parent) :
QObject(parent),
m_hostAddress(hostAddress),
m_port(port)
@ -43,16 +43,16 @@ ModbusTCPMaster::ModbusTCPMaster(const QHostAddress &hostAddress, uint port, QOb
m_modbusTcpClient->setTimeout(m_timeout);
m_modbusTcpClient->setNumberOfRetries(m_numberOfRetries);
connect(m_modbusTcpClient, &QModbusTcpClient::stateChanged, this, &ModbusTCPMaster::onModbusStateChanged);
connect(m_modbusTcpClient, &QModbusRtuSerialMaster::errorOccurred, this, &ModbusTCPMaster::onModbusErrorOccurred);
connect(m_modbusTcpClient, &QModbusTcpClient::stateChanged, this, &ModbusTcpMaster::onModbusStateChanged);
connect(m_modbusTcpClient, &QModbusRtuSerialMaster::errorOccurred, this, &ModbusTcpMaster::onModbusErrorOccurred);
m_reconnectTimer = new QTimer(this);
m_reconnectTimer->setSingleShot(true);
m_reconnectTimer->setInterval(4000);
connect(m_reconnectTimer, &QTimer::timeout, this, &ModbusTCPMaster::connectDevice);
connect(m_reconnectTimer, &QTimer::timeout, this, &ModbusTcpMaster::connectDevice);
}
ModbusTCPMaster::~ModbusTCPMaster()
ModbusTcpMaster::~ModbusTcpMaster()
{
if (m_reconnectTimer) {
m_reconnectTimer->stop();
@ -63,27 +63,27 @@ ModbusTCPMaster::~ModbusTCPMaster()
}
}
QHostAddress ModbusTCPMaster::hostAddress() const
QHostAddress ModbusTcpMaster::hostAddress() const
{
return m_hostAddress;
}
uint ModbusTCPMaster::port() const
uint ModbusTcpMaster::port() const
{
return m_port;
}
void ModbusTCPMaster::setPort(uint port)
void ModbusTcpMaster::setPort(uint port)
{
m_port = port;
}
void ModbusTCPMaster::setHostAddress(const QHostAddress &hostAddress)
void ModbusTcpMaster::setHostAddress(const QHostAddress &hostAddress)
{
m_hostAddress = hostAddress;
}
bool ModbusTCPMaster::connectDevice() {
bool ModbusTcpMaster::connectDevice() {
// TCP connection to target device
if (!m_modbusTcpClient)
return false;
@ -106,7 +106,7 @@ bool ModbusTCPMaster::connectDevice() {
return false;
}
void ModbusTCPMaster::disconnectDevice()
void ModbusTcpMaster::disconnectDevice()
{
if (!m_modbusTcpClient)
return;
@ -116,7 +116,7 @@ void ModbusTCPMaster::disconnectDevice()
m_modbusTcpClient->disconnectDevice();
}
bool ModbusTCPMaster::reconnectDevice()
bool ModbusTcpMaster::reconnectDevice()
{
qCWarning(dcModbusTcpMaster()) << "Reconnecting modbus TCP device" << QString("%1:%2").arg(m_hostAddress.toString()).arg(m_port);
if (!m_modbusTcpClient)
@ -126,44 +126,44 @@ bool ModbusTCPMaster::reconnectDevice()
return connectDevice();
}
bool ModbusTCPMaster::connected() const
bool ModbusTcpMaster::connected() const
{
return m_connected;
}
int ModbusTCPMaster::numberOfRetries() const
int ModbusTcpMaster::numberOfRetries() const
{
return m_modbusTcpClient->numberOfRetries();
}
void ModbusTCPMaster::setNumberOfRetries(int number)
void ModbusTcpMaster::setNumberOfRetries(int number)
{
m_numberOfRetries = number;
m_modbusTcpClient->setNumberOfRetries(number);
}
int ModbusTCPMaster::timeout() const
int ModbusTcpMaster::timeout() const
{
return m_modbusTcpClient->timeout();
}
void ModbusTCPMaster::setTimeout(int timeout)
void ModbusTcpMaster::setTimeout(int timeout)
{
m_timeout = timeout;
m_modbusTcpClient->setTimeout(timeout);
}
QString ModbusTCPMaster::errorString() const
QString ModbusTcpMaster::errorString() const
{
return m_modbusTcpClient->errorString();
}
QModbusDevice::Error ModbusTCPMaster::error() const
QModbusDevice::Error ModbusTcpMaster::error() const
{
return m_modbusTcpClient->error();
}
QUuid ModbusTCPMaster::readCoil(uint slaveAddress, uint registerAddress, uint size)
QUuid ModbusTcpMaster::readCoil(uint slaveAddress, uint registerAddress, uint size)
{
if (!m_modbusTcpClient) {
return QUuid();
@ -204,7 +204,7 @@ QUuid ModbusTCPMaster::readCoil(uint slaveAddress, uint registerAddress, uint si
return requestId;
}
QUuid ModbusTCPMaster::writeHoldingRegisters(uint slaveAddress, uint registerAddress, const QVector<quint16> &values)
QUuid ModbusTcpMaster::writeHoldingRegisters(uint slaveAddress, uint registerAddress, const QVector<quint16> &values)
{
if (!m_modbusTcpClient) {
return QUuid();
@ -246,27 +246,27 @@ QUuid ModbusTCPMaster::writeHoldingRegisters(uint slaveAddress, uint registerAdd
return requestId;
}
QModbusReply *ModbusTCPMaster::sendRawRequest(const QModbusRequest &request, int serverAddress)
QModbusReply *ModbusTcpMaster::sendRawRequest(const QModbusRequest &request, int serverAddress)
{
return m_modbusTcpClient->sendRawRequest(request, serverAddress);
}
QModbusReply *ModbusTCPMaster::sendReadRequest(const QModbusDataUnit &read, int serverAddress)
QModbusReply *ModbusTcpMaster::sendReadRequest(const QModbusDataUnit &read, int serverAddress)
{
return m_modbusTcpClient->sendReadRequest(read, serverAddress);
}
QModbusReply *ModbusTCPMaster::sendReadWriteRequest(const QModbusDataUnit &read, const QModbusDataUnit &write, int serverAddress)
QModbusReply *ModbusTcpMaster::sendReadWriteRequest(const QModbusDataUnit &read, const QModbusDataUnit &write, int serverAddress)
{
return m_modbusTcpClient->sendReadWriteRequest(read, write, serverAddress);
}
QModbusReply *ModbusTCPMaster::sendWriteRequest(const QModbusDataUnit &write, int serverAddress)
QModbusReply *ModbusTcpMaster::sendWriteRequest(const QModbusDataUnit &write, int serverAddress)
{
return m_modbusTcpClient->sendWriteRequest(write, serverAddress);
}
QUuid ModbusTCPMaster::readDiscreteInput(uint slaveAddress, uint registerAddress, uint size)
QUuid ModbusTcpMaster::readDiscreteInput(uint slaveAddress, uint registerAddress, uint size)
{
if (!m_modbusTcpClient) {
return QUuid();
@ -307,7 +307,7 @@ QUuid ModbusTCPMaster::readDiscreteInput(uint slaveAddress, uint registerAddress
return requestId;
}
QUuid ModbusTCPMaster::readInputRegister(uint slaveAddress, uint registerAddress, uint size)
QUuid ModbusTcpMaster::readInputRegister(uint slaveAddress, uint registerAddress, uint size)
{
if (!m_modbusTcpClient) {
return QUuid();
@ -350,7 +350,7 @@ QUuid ModbusTCPMaster::readInputRegister(uint slaveAddress, uint registerAddress
return requestId;
}
QUuid ModbusTCPMaster::readHoldingRegister(uint slaveAddress, uint registerAddress, uint size)
QUuid ModbusTcpMaster::readHoldingRegister(uint slaveAddress, uint registerAddress, uint size)
{
if (!m_modbusTcpClient) {
return QUuid();
@ -396,12 +396,12 @@ QUuid ModbusTCPMaster::readHoldingRegister(uint slaveAddress, uint registerAddre
return requestId;
}
QUuid ModbusTCPMaster::writeCoil(uint slaveAddress, uint registerAddress, bool value)
QUuid ModbusTcpMaster::writeCoil(uint slaveAddress, uint registerAddress, bool value)
{
return writeCoils(slaveAddress, registerAddress, QVector<quint16>() << static_cast<quint16>(value));
}
QUuid ModbusTCPMaster::writeCoils(uint slaveAddress, uint registerAddress, const QVector<quint16> &values)
QUuid ModbusTcpMaster::writeCoils(uint slaveAddress, uint registerAddress, const QVector<quint16> &values)
{
if (!m_modbusTcpClient) {
return QUuid();
@ -446,18 +446,18 @@ QUuid ModbusTCPMaster::writeCoils(uint slaveAddress, uint registerAddress, const
return requestId;
}
QUuid ModbusTCPMaster::writeHoldingRegister(uint slaveAddress, uint registerAddress, quint16 value)
QUuid ModbusTcpMaster::writeHoldingRegister(uint slaveAddress, uint registerAddress, quint16 value)
{
return writeHoldingRegisters(slaveAddress, registerAddress, QVector<quint16>() << value);
}
void ModbusTCPMaster::onModbusErrorOccurred(QModbusDevice::Error error)
void ModbusTcpMaster::onModbusErrorOccurred(QModbusDevice::Error error)
{
qCWarning(dcModbusTcpMaster()) << "An error occurred for device" << m_hostAddress.toString() << ":" << error;
emit connectionErrorOccurred(error);
}
void ModbusTCPMaster::onModbusStateChanged(QModbusDevice::State state)
void ModbusTcpMaster::onModbusStateChanged(QModbusDevice::State state)
{
qCDebug(dcModbusTcpMaster()) << "Connection state changed for" << m_hostAddress << state;
bool connected = (state == QModbusDevice::ConnectedState);

View File

@ -40,12 +40,12 @@
Q_DECLARE_LOGGING_CATEGORY(dcModbusTcpMaster)
class ModbusTCPMaster : public QObject
class ModbusTcpMaster : public QObject
{
Q_OBJECT
public:
explicit ModbusTCPMaster(const QHostAddress &hostAddress, uint port, QObject *parent = nullptr);
~ModbusTCPMaster();
explicit ModbusTcpMaster(const QHostAddress &hostAddress, uint port, QObject *parent = nullptr);
~ModbusTcpMaster();
// If you change the hostaddress, make sure to reconnectDevice afterwards
QHostAddress hostAddress() const;

View File

@ -71,7 +71,7 @@ def writePropertyGetSetMethodImplementationsTcp(fileDescriptor, className, regis
exit(1)
writeLine(fileDescriptor, ' request.setValues(values);')
writeLine(fileDescriptor, ' return sendWriteRequest(request, m_slaveId);')
writeLine(fileDescriptor, ' return m_modbusTcpMaster->sendWriteRequest(request, m_slaveId);')
writeLine(fileDescriptor, '}')
writeLine(fileDescriptor)
@ -90,7 +90,7 @@ def writePropertyUpdateMethodImplementationsTcp(fileDescriptor, className, regis
writeLine(fileDescriptor, ' qCDebug(dc%s()) << "--> Read \\"%s\\" register:" << %s << "size:" << %s;' % (className, registerDefinition['description'], registerDefinition['address'], registerDefinition['size']))
writeLine(fileDescriptor, ' QModbusReply *reply = read%s();' % (propertyName[0].upper() + propertyName[1:]))
writeLine(fileDescriptor, ' if (!reply) {')
writeLine(fileDescriptor, ' qCWarning(dc%s()) << "Error occurred while reading \\"%s\\" registers from" << hostAddress().toString() << errorString();' % (className, registerDefinition['description']))
writeLine(fileDescriptor, ' qCWarning(dc%s()) << "Error occurred while reading \\"%s\\" registers from" << m_modbusTcpMaster->hostAddress().toString() << m_modbusTcpMaster->errorString();' % (className, registerDefinition['description']))
writeLine(fileDescriptor, ' return;')
writeLine(fileDescriptor, ' }')
writeLine(fileDescriptor)
@ -114,7 +114,7 @@ def writePropertyUpdateMethodImplementationsTcp(fileDescriptor, className, regis
writeLine(fileDescriptor, ' });')
writeLine(fileDescriptor)
writeLine(fileDescriptor, ' connect(reply, &QModbusReply::errorOccurred, this, [this, reply] (QModbusDevice::Error error){')
writeLine(fileDescriptor, ' qCWarning(dc%s()) << "Modbus reply error occurred while updating \\"%s\\" registers from" << hostAddress().toString() << error << reply->errorString();' % (className, registerDefinition['description']))
writeLine(fileDescriptor, ' qCWarning(dc%s()) << "Modbus reply error occurred while updating \\"%s\\" registers from" << m_modbusTcpMaster->hostAddress().toString() << error << reply->errorString();' % (className, registerDefinition['description']))
writeLine(fileDescriptor, ' });')
writeLine(fileDescriptor, '}')
writeLine(fileDescriptor)
@ -207,7 +207,7 @@ def writeInternalPropertyReadMethodImplementationsTcp(fileDescriptor, className,
#Default to holdingRegister
writeLine(fileDescriptor, ' QModbusDataUnit request = QModbusDataUnit(QModbusDataUnit::RegisterType::HoldingRegisters, %s, %s);' % (registerDefinition['address'], registerDefinition['size']))
writeLine(fileDescriptor, ' return sendReadRequest(request, m_slaveId);')
writeLine(fileDescriptor, ' return m_modbusTcpMaster->sendReadRequest(request, m_slaveId);')
writeLine(fileDescriptor, '}')
writeLine(fileDescriptor)
@ -274,7 +274,7 @@ def writeInternalBlockReadMethodImplementationsTcp(fileDescriptor, className, bl
#Default to holdingRegister
writeLine(fileDescriptor, ' QModbusDataUnit request = QModbusDataUnit(QModbusDataUnit::RegisterType::HoldingRegisters, %s, %s);' % (blockStartAddress, blockSize))
writeLine(fileDescriptor, ' return sendReadRequest(request, m_slaveId);')
writeLine(fileDescriptor, ' return m_modbusTcpMaster->sendReadRequest(request, m_slaveId);')
writeLine(fileDescriptor, '}')
writeLine(fileDescriptor)
@ -367,7 +367,7 @@ def writeInitMethodImplementationTcp(fileDescriptor, className, registerDefiniti
writeLine(fileDescriptor, ' qCDebug(dc%s()) << "--> Read init \\"%s\\" register:" << %s << "size:" << %s;' % (className, registerDefinition['description'], registerDefinition['address'], registerDefinition['size']))
writeLine(fileDescriptor, ' reply = read%s();' % (propertyName[0].upper() + propertyName[1:]))
writeLine(fileDescriptor, ' if (!reply) {')
writeLine(fileDescriptor, ' qCWarning(dc%s()) << "Error occurred while reading \\"%s\\" registers from" << hostAddress().toString() << errorString();' % (className, registerDefinition['description']))
writeLine(fileDescriptor, ' qCWarning(dc%s()) << "Error occurred while reading \\"%s\\" registers from" << m_modbusTcpMaster->hostAddress().toString() << m_modbusTcpMaster->errorString();' % (className, registerDefinition['description']))
writeLine(fileDescriptor, ' finishInitialization(false);')
writeLine(fileDescriptor, ' return false;')
writeLine(fileDescriptor, ' }')
@ -398,7 +398,7 @@ def writeInitMethodImplementationTcp(fileDescriptor, className, registerDefiniti
writeLine(fileDescriptor, ' });')
writeLine(fileDescriptor)
writeLine(fileDescriptor, ' connect(reply, &QModbusReply::errorOccurred, m_initObject, [this, reply] (QModbusDevice::Error error){')
writeLine(fileDescriptor, ' qCWarning(dc%s()) << "Modbus reply error occurred while reading \\"%s\\" registers from" << hostAddress().toString() << error << reply->errorString();' % (className, registerDefinition['description']))
writeLine(fileDescriptor, ' qCWarning(dc%s()) << "Modbus reply error occurred while reading \\"%s\\" registers from" << m_modbusTcpMaster->hostAddress().toString() << error << reply->errorString();' % (className, registerDefinition['description']))
writeLine(fileDescriptor, ' });')
# Read init blocks
@ -495,7 +495,7 @@ def writeUpdateMethodTcp(fileDescriptor, className, registerDefinitions, blockDe
break
if updateRequired:
writeLine(fileDescriptor, ' if (!connected())')
writeLine(fileDescriptor, ' if (!m_modbusTcpMaster->connected())')
writeLine(fileDescriptor, ' return false;')
writeLine(fileDescriptor)
writeLine(fileDescriptor, ' if (!m_pendingUpdateReplies.isEmpty()) {')
@ -516,7 +516,7 @@ def writeUpdateMethodTcp(fileDescriptor, className, registerDefinitions, blockDe
writeLine(fileDescriptor, ' qCDebug(dc%s()) << "--> Read \\"%s\\" register:" << %s << "size:" << %s;' % (className, registerDefinition['description'], registerDefinition['address'], registerDefinition['size']))
writeLine(fileDescriptor, ' reply = read%s();' % (propertyName[0].upper() + propertyName[1:]))
writeLine(fileDescriptor, ' if (!reply) {')
writeLine(fileDescriptor, ' qCWarning(dc%s()) << "Error occurred while reading \\"%s\\" registers from" << hostAddress().toString() << errorString();' % (className, registerDefinition['description']))
writeLine(fileDescriptor, ' qCWarning(dc%s()) << "Error occurred while reading \\"%s\\" registers from" << m_modbusTcpMaster->hostAddress().toString() << m_modbusTcpMaster->errorString();' % (className, registerDefinition['description']))
writeLine(fileDescriptor, ' return false;')
writeLine(fileDescriptor, ' }')
writeLine(fileDescriptor)
@ -546,7 +546,7 @@ def writeUpdateMethodTcp(fileDescriptor, className, registerDefinitions, blockDe
writeLine(fileDescriptor, ' });')
writeLine(fileDescriptor)
writeLine(fileDescriptor, ' connect(reply, &QModbusReply::errorOccurred, this, [this, reply] (QModbusDevice::Error error){')
writeLine(fileDescriptor, ' qCWarning(dc%s()) << "Modbus reply error occurred while reading \\"%s\\" registers from" << hostAddress().toString() << error << reply->errorString();' % (className, registerDefinition['description']))
writeLine(fileDescriptor, ' qCWarning(dc%s()) << "Modbus reply error occurred while reading \\"%s\\" registers from" << m_modbusTcpMaster->hostAddress().toString() << error << reply->errorString();' % (className, registerDefinition['description']))
writeLine(fileDescriptor, ' });')
# Read init blocks

View File

@ -484,8 +484,8 @@ def writePropertyProcessMethodImplementations(fileDescriptor, className, registe
if not 'R' in registerDefinition['access']:
continue
propertyName = registerDefinition['id']
propertyTyp = getCppDataType(registerDefinition)
propertyName = registerDefinition['id']
writeLine(fileDescriptor, 'void %s::process%sRegisterValues(const QVector<quint16> &values)' % (className, propertyName[0].upper() + propertyName[1:]))
writeLine(fileDescriptor, '{')

View File

@ -47,7 +47,7 @@ def writeTcpHeaderFile():
writeLine(headerFile)
# Begin of class
writeLine(headerFile, 'class %s : public ModbusTCPMaster' % className)
writeLine(headerFile, 'class %s : public QObject' % className)
writeLine(headerFile, '{')
writeLine(headerFile, ' Q_OBJECT')
@ -64,8 +64,12 @@ def writeTcpHeaderFile():
# Constructor
writeLine(headerFile, ' explicit %s(const QHostAddress &hostAddress, uint port, quint16 slaveId, QObject *parent = nullptr);' % className)
writeLine(headerFile, ' explicit %s(ModbusTcpMaster *modbusTcpMaster, quint16 slaveId, QObject *parent = nullptr);' % className)
writeLine(headerFile, ' ~%s() = default;' % className)
writeLine(headerFile)
writeLine(headerFile, ' ModbusTcpMaster *modbusTcpMaster() const;')
writeLine(headerFile, ' quint16 slaveId() const;')
writeLine(headerFile)
writeLine(headerFile, ' bool reachable() const;')
writeLine(headerFile)
writeLine(headerFile, ' ModbusDataUtils::ByteOrder endianness() const;')
@ -110,6 +114,12 @@ def writeTcpHeaderFile():
writeLine(headerFile, ' virtual bool update();')
writeLine(headerFile)
writeLine(headerFile, 'public slots:')
writeLine(headerFile, ' bool connectDevice();')
writeLine(headerFile, ' void disconnectDevice();')
writeLine(headerFile, ' bool reconnectDevice();')
writeLine(headerFile)
# Write registers value changed signals
writeLine(headerFile, 'signals:')
writeLine(headerFile, ' void reachableChanged(bool reachable);')
@ -151,6 +161,7 @@ def writeTcpHeaderFile():
# Private members
writeLine(headerFile, 'private:')
writeLine(headerFile, ' ModbusTcpMaster *m_modbusTcpMaster = nullptr;')
writeLine(headerFile, ' ModbusDataUtils::ByteOrder m_endianness = ModbusDataUtils::ByteOrder%s;' % endianness)
writeLine(headerFile, ' ModbusDataUtils::ByteOrder m_stringEndianness = ModbusDataUtils::ByteOrder%s;' % stringEndianness)
writeLine(headerFile, ' quint16 m_slaveId = 1;')
@ -170,6 +181,8 @@ def writeTcpHeaderFile():
writeLine(headerFile, ' void verifyInitFinished();')
writeLine(headerFile, ' void finishInitialization(bool success);')
writeLine(headerFile)
writeLine(headerFile, ' void setupConnection();')
writeLine(headerFile)
writeLine(headerFile, ' void verifyUpdateFinished();')
writeLine(headerFile)
writeLine(headerFile, ' void onReachabilityCheckFailed();')
@ -201,28 +214,32 @@ def writeTcpSourceFile():
# Constructor
writeLine(sourceFile, '%s::%s(const QHostAddress &hostAddress, uint port, quint16 slaveId, QObject *parent) :' % (className, className))
writeLine(sourceFile, ' ModbusTCPMaster(hostAddress, port, parent),')
writeLine(sourceFile, ' QObject(parent),')
writeLine(sourceFile, ' m_modbusTcpMaster(new ModbusTcpMaster(hostAddress, port, this)),')
writeLine(sourceFile, ' m_slaveId(slaveId)')
writeLine(sourceFile, '{')
writeLine(sourceFile, ' connect(this, &ModbusTCPMaster::connectionStateChanged, this, [this](bool status){')
writeLine(sourceFile, ' if (status) {')
writeLine(sourceFile, ' qCDebug(dc%s()) << "Modbus TCP connection" << m_hostAddress.toString() << "connected. Start testing if the connection is reachable...";' % (className))
writeLine(sourceFile, ' // Cleanup before starting to initialize')
writeLine(sourceFile, ' m_pendingInitReplies.clear();')
writeLine(sourceFile, ' m_pendingUpdateReplies.clear();')
writeLine(sourceFile, ' m_communicationWorking = false;')
writeLine(sourceFile, ' m_communicationFailedCounter = 0;')
writeLine(sourceFile, ' m_checkReachableRetriesCount = 0;')
writeLine(sourceFile, ' testReachability();')
writeLine(sourceFile, ' } else {')
writeLine(sourceFile, ' qCWarning(dc%s()) << "Modbus TCP connection diconnected from" << m_hostAddress.toString() << ". The connection is not reachable any more.";' % (className))
writeLine(sourceFile, ' m_communicationWorking = false;')
writeLine(sourceFile, ' m_communicationFailedCounter = 0;')
writeLine(sourceFile, ' m_checkReachableRetriesCount = 0;')
writeLine(sourceFile, ' }')
writeLine(sourceFile, ' setupConnection();')
writeLine(sourceFile, '}')
writeLine(sourceFile)
writeLine(sourceFile, ' evaluateReachableState();')
writeLine(sourceFile, ' });')
writeLine(sourceFile, '%s::%s(ModbusTcpMaster *modbusTcpMaster, quint16 slaveId, QObject *parent) :' % (className, className))
writeLine(sourceFile, ' QObject(parent),')
writeLine(sourceFile, ' m_modbusTcpMaster(modbusTcpMaster),')
writeLine(sourceFile, ' m_slaveId(slaveId)')
writeLine(sourceFile, '{')
writeLine(sourceFile, ' setupConnection();')
writeLine(sourceFile, '}')
writeLine(sourceFile)
writeLine(sourceFile, 'ModbusTcpMaster *%s::modbusTcpMaster() const' % (className))
writeLine(sourceFile, '{')
writeLine(sourceFile, ' return m_modbusTcpMaster;')
writeLine(sourceFile, '}')
writeLine(sourceFile)
writeLine(sourceFile, 'quint16 %s::slaveId() const' % (className))
writeLine(sourceFile, '{')
writeLine(sourceFile, ' return m_slaveId;')
writeLine(sourceFile, '}')
writeLine(sourceFile)
@ -294,6 +311,24 @@ def writeTcpSourceFile():
writeInitMethodImplementationTcp(sourceFile, className, registerJson['registers'], blocks)
writeUpdateMethodTcp(sourceFile, className, registerJson['registers'], blocks)
writeLine(sourceFile, 'bool %s::connectDevice()' % (className))
writeLine(sourceFile, '{')
writeLine(sourceFile, ' return m_modbusTcpMaster->connectDevice();')
writeLine(sourceFile, '}')
writeLine(sourceFile)
writeLine(sourceFile, 'void %s::disconnectDevice()' % (className))
writeLine(sourceFile, '{')
writeLine(sourceFile, ' m_modbusTcpMaster->disconnectDevice();')
writeLine(sourceFile, '}')
writeLine(sourceFile)
writeLine(sourceFile, 'bool %s::reconnectDevice()' % (className))
writeLine(sourceFile, '{')
writeLine(sourceFile, ' return m_modbusTcpMaster->reconnectDevice();')
writeLine(sourceFile, '}')
writeLine(sourceFile)
# Write update methods
writePropertyUpdateMethodImplementationsTcp(sourceFile, className, registerJson['registers'])
if 'blocks' in registerJson:
@ -351,9 +386,9 @@ def writeTcpSourceFile():
writeLine(sourceFile, 'void %s::finishInitialization(bool success)' % (className))
writeLine(sourceFile, '{')
writeLine(sourceFile, ' if (success) {')
writeLine(sourceFile, ' qCDebug(dc%s()) << "Initialization finished of %s" << hostAddress().toString() << "finished successfully";' % (className, className))
writeLine(sourceFile, ' qCDebug(dc%s()) << "Initialization finished of %s" << m_modbusTcpMaster->hostAddress().toString() << "finished successfully";' % (className, className))
writeLine(sourceFile, ' } else {')
writeLine(sourceFile, ' qCWarning(dc%s()) << "Initialization finished of %s" << hostAddress().toString() << "failed.";' % (className, className))
writeLine(sourceFile, ' qCWarning(dc%s()) << "Initialization finished of %s" << m_modbusTcpMaster->hostAddress().toString() << "failed.";' % (className, className))
writeLine(sourceFile, ' }')
writeLine(sourceFile)
writeLine(sourceFile, ' // Cleanup init')
@ -365,6 +400,30 @@ def writeTcpSourceFile():
writeLine(sourceFile, '}')
writeLine(sourceFile)
writeLine(sourceFile, 'void %s::setupConnection()' % (className))
writeLine(sourceFile, '{')
writeLine(sourceFile, ' connect(m_modbusTcpMaster, &ModbusTcpMaster::connectionStateChanged, this, [this](bool status){')
writeLine(sourceFile, ' if (status) {')
writeLine(sourceFile, ' qCDebug(dc%s()) << "Modbus TCP connection" << m_modbusTcpMaster->hostAddress().toString() << "connected. Start testing if the connection is reachable...";' % (className))
writeLine(sourceFile, ' // Cleanup before starting to initialize')
writeLine(sourceFile, ' m_pendingInitReplies.clear();')
writeLine(sourceFile, ' m_pendingUpdateReplies.clear();')
writeLine(sourceFile, ' m_communicationWorking = false;')
writeLine(sourceFile, ' m_communicationFailedCounter = 0;')
writeLine(sourceFile, ' m_checkReachableRetriesCount = 0;')
writeLine(sourceFile, ' testReachability();')
writeLine(sourceFile, ' } else {')
writeLine(sourceFile, ' qCWarning(dc%s()) << "Modbus TCP connection diconnected from" << m_modbusTcpMaster->hostAddress().toString() << ". The connection is not reachable any more.";' % (className))
writeLine(sourceFile, ' m_communicationWorking = false;')
writeLine(sourceFile, ' m_communicationFailedCounter = 0;')
writeLine(sourceFile, ' m_checkReachableRetriesCount = 0;')
writeLine(sourceFile, ' }')
writeLine(sourceFile)
writeLine(sourceFile, ' evaluateReachableState();')
writeLine(sourceFile, ' });')
writeLine(sourceFile, '}')
writeLine(sourceFile)
writeLine(sourceFile, 'void %s::verifyUpdateFinished()' % (className))
writeLine(sourceFile, '{')
writeLine(sourceFile, ' if (m_pendingUpdateReplies.isEmpty()) {')
@ -390,7 +449,7 @@ def writeTcpSourceFile():
writeLine(sourceFile, 'void %s::evaluateReachableState()' % (className))
writeLine(sourceFile, '{')
writeLine(sourceFile, ' bool reachable = m_communicationWorking && connected();')
writeLine(sourceFile, ' bool reachable = m_communicationWorking && m_modbusTcpMaster->connected();')
writeLine(sourceFile, ' if (m_reachable == reachable)')
writeLine(sourceFile, ' return;')
writeLine(sourceFile)
@ -406,7 +465,7 @@ def writeTcpSourceFile():
debugObjectParamName = className[0].lower() + className[1:]
writeLine(sourceFile, 'QDebug operator<<(QDebug debug, %s *%s)' % (className, debugObjectParamName))
writeLine(sourceFile, '{')
writeLine(sourceFile, ' debug.nospace().noquote() << "%s(" << %s->hostAddress().toString() << ":" << %s->port() << ")" << "\\n";' % (className, debugObjectParamName, debugObjectParamName))
writeLine(sourceFile, ' debug.nospace().noquote() << "%s(" << %s->modbusTcpMaster()->hostAddress().toString() << ":" << %s->modbusTcpMaster()->port() << ")" << "\\n";' % (className, debugObjectParamName, debugObjectParamName))
writeRegistersDebugLine(sourceFile, debugObjectParamName, registerJson['registers'])
if 'blocks' in registerJson:
for blockDefinition in registerJson['blocks']:

View File

@ -282,11 +282,11 @@ void IntegrationPluginMennekes::postSetupThing(Thing *thing)
m_pluginTimer = hardwareManager()->pluginTimerManager()->registerTimer(2);
connect(m_pluginTimer, &PluginTimer::timeout, this, [this] {
foreach(AmtronECUModbusTcpConnection *connection, m_amtronECUConnections) {
qCDebug(dcMennekes()) << "Updating connection" << connection->hostAddress().toString();
qCDebug(dcMennekes()) << "Updating connection" << connection->modbusTcpMaster()->hostAddress().toString();
connection->update();
}
foreach(AmtronHCC3ModbusTcpConnection *connection, m_amtronHCC3Connections) {
qCDebug(dcMennekes()) << "Updating connection" << connection->hostAddress().toString();
qCDebug(dcMennekes()) << "Updating connection" << connection->modbusTcpMaster()->hostAddress().toString();
connection->update();
}
foreach(AmtronCompact20ModbusRtuConnection *connection, m_amtronCompact20Connections) {
@ -517,7 +517,7 @@ void IntegrationPluginMennekes::setupAmtronECUConnection(ThingSetupInfo *info)
qCDebug(dcMennekes()) << "Setting up amtron wallbox on" << address.toString();
AmtronECUModbusTcpConnection *amtronECUConnection = new AmtronECUModbusTcpConnection(address, 502, 0xff, this);
connect(info, &ThingSetupInfo::aborted, amtronECUConnection, &ModbusTCPMaster::deleteLater);
connect(info, &ThingSetupInfo::aborted, amtronECUConnection, &ModbusTcpMaster::deleteLater);
// Reconnect on monitor reachable changed
NetworkDeviceMonitor *monitor = m_monitors.value(thing);
@ -527,7 +527,7 @@ void IntegrationPluginMennekes::setupAmtronECUConnection(ThingSetupInfo *info)
return;
if (reachable && !thing->stateValue("connected").toBool()) {
amtronECUConnection->setHostAddress(monitor->networkDeviceInfo().address());
amtronECUConnection->modbusTcpMaster()->setHostAddress(monitor->networkDeviceInfo().address());
amtronECUConnection->connectDevice();
} else if (!reachable) {
// Note: We disable autoreconnect explicitly and we will
@ -560,7 +560,7 @@ void IntegrationPluginMennekes::setupAmtronECUConnection(ThingSetupInfo *info)
connect(amtronECUConnection, &AmtronECUModbusTcpConnection::initializationFinished, info, [=](bool success){
if (!success) {
qCWarning(dcMennekes()) << "Connection init finished with errors" << thing->name() << amtronECUConnection->hostAddress().toString();
qCWarning(dcMennekes()) << "Connection init finished with errors" << thing->name() << amtronECUConnection->modbusTcpMaster()->hostAddress().toString();
hardwareManager()->networkDeviceDiscovery()->unregisterMonitor(monitor);
amtronECUConnection->deleteLater();
info->finish(Thing::ThingErrorHardwareFailure, QT_TR_NOOP("Error communicating with the wallbox."));
@ -649,7 +649,7 @@ void IntegrationPluginMennekes::setupAmtronHCC3Connection(ThingSetupInfo *info)
qCDebug(dcMennekes()) << "Setting up amtron wallbox on" << address.toString();
AmtronHCC3ModbusTcpConnection *amtronHCC3Connection = new AmtronHCC3ModbusTcpConnection(address, 502, 0xff, this);
connect(info, &ThingSetupInfo::aborted, amtronHCC3Connection, &ModbusTCPMaster::deleteLater);
connect(info, &ThingSetupInfo::aborted, amtronHCC3Connection, &ModbusTcpMaster::deleteLater);
// Reconnect on monitor reachable changed
NetworkDeviceMonitor *monitor = m_monitors.value(thing);
@ -659,7 +659,7 @@ void IntegrationPluginMennekes::setupAmtronHCC3Connection(ThingSetupInfo *info)
return;
if (reachable && !thing->stateValue("connected").toBool()) {
amtronHCC3Connection->setHostAddress(monitor->networkDeviceInfo().address());
amtronHCC3Connection->modbusTcpMaster()->setHostAddress(monitor->networkDeviceInfo().address());
amtronHCC3Connection->connectDevice();
} else if (!reachable) {
// Note: We disable autoreconnect explicitly and we will
@ -692,7 +692,7 @@ void IntegrationPluginMennekes::setupAmtronHCC3Connection(ThingSetupInfo *info)
connect(amtronHCC3Connection, &AmtronHCC3ModbusTcpConnection::initializationFinished, info, [=](bool success){
if (!success) {
qCWarning(dcMennekes()) << "Connection init finished with errors" << thing->name() << amtronHCC3Connection->hostAddress().toString();
qCWarning(dcMennekes()) << "Connection init finished with errors" << thing->name() << amtronHCC3Connection->modbusTcpMaster()->hostAddress().toString();
hardwareManager()->networkDeviceDiscovery()->unregisterMonitor(monitor);
amtronHCC3Connection->deleteLater();
info->finish(Thing::ThingErrorHardwareFailure, QT_TR_NOOP("Error communicating with the wallbox."));

View File

@ -236,7 +236,7 @@ void IntegrationPluginModbusCommander::setupThing(ThingSetupInfo *info)
m_modbusTCPMasters.take(thing)->deleteLater();
}
foreach (ModbusTCPMaster *modbusTCPMaster, m_modbusTCPMasters.values()) {
foreach (ModbusTcpMaster *modbusTCPMaster, m_modbusTCPMasters.values()) {
if ((modbusTCPMaster->hostAddress() == hostAddress) && (modbusTCPMaster->port() == port)) {
m_modbusTCPMasters.insert(thing, modbusTCPMaster);
return info->finish(Thing::ThingErrorNoError);
@ -249,15 +249,15 @@ void IntegrationPluginModbusCommander::setupThing(ThingSetupInfo *info)
qCDebug(dcModbusCommander()) << " number of retries:" << numberOfRetries;
qCDebug(dcModbusCommander()) << " timeout:" << timeout;
ModbusTCPMaster *modbusTCPMaster = new ModbusTCPMaster(hostAddress, port, this);
connect(modbusTCPMaster, &ModbusTCPMaster::connectionStateChanged, this, &IntegrationPluginModbusCommander::onConnectionStateChanged);
connect(modbusTCPMaster, &ModbusTCPMaster::writeRequestExecuted, this, &IntegrationPluginModbusCommander::onRequestExecuted);
connect(modbusTCPMaster, &ModbusTCPMaster::writeRequestError, this, &IntegrationPluginModbusCommander::onRequestError);
connect(modbusTCPMaster, &ModbusTCPMaster::receivedCoil, this, &IntegrationPluginModbusCommander::onReceivedCoil);
connect(modbusTCPMaster, &ModbusTCPMaster::receivedDiscreteInput, this, &IntegrationPluginModbusCommander::onReceivedDiscreteInput);
connect(modbusTCPMaster, &ModbusTCPMaster::receivedHoldingRegister, this, &IntegrationPluginModbusCommander::onReceivedHoldingRegister);
connect(modbusTCPMaster, &ModbusTCPMaster::receivedInputRegister, this, &IntegrationPluginModbusCommander::onReceivedInputRegister);
connect(modbusTCPMaster, &ModbusTCPMaster::connectionStateChanged, info, [info, modbusTCPMaster, this] (bool connected) {
ModbusTcpMaster *modbusTCPMaster = new ModbusTcpMaster(hostAddress, port, this);
connect(modbusTCPMaster, &ModbusTcpMaster::connectionStateChanged, this, &IntegrationPluginModbusCommander::onConnectionStateChanged);
connect(modbusTCPMaster, &ModbusTcpMaster::writeRequestExecuted, this, &IntegrationPluginModbusCommander::onRequestExecuted);
connect(modbusTCPMaster, &ModbusTcpMaster::writeRequestError, this, &IntegrationPluginModbusCommander::onRequestError);
connect(modbusTCPMaster, &ModbusTcpMaster::receivedCoil, this, &IntegrationPluginModbusCommander::onReceivedCoil);
connect(modbusTCPMaster, &ModbusTcpMaster::receivedDiscreteInput, this, &IntegrationPluginModbusCommander::onReceivedDiscreteInput);
connect(modbusTCPMaster, &ModbusTcpMaster::receivedHoldingRegister, this, &IntegrationPluginModbusCommander::onReceivedHoldingRegister);
connect(modbusTCPMaster, &ModbusTcpMaster::receivedInputRegister, this, &IntegrationPluginModbusCommander::onReceivedInputRegister);
connect(modbusTCPMaster, &ModbusTcpMaster::connectionStateChanged, info, [info, modbusTCPMaster, this] (bool connected) {
if (connected) {
info->finish(Thing::ThingErrorNoError);
m_modbusTCPMasters.insert(info->thing(), modbusTCPMaster);
@ -416,8 +416,8 @@ void IntegrationPluginModbusCommander::onPluginConfigurationChanged(const ParamT
void IntegrationPluginModbusCommander::onConnectionStateChanged(bool status)
{
auto modbus = sender();
if (m_modbusTCPMasters.values().contains(static_cast<ModbusTCPMaster *>(modbus))) {
Thing *thing = m_modbusTCPMasters.key(static_cast<ModbusTCPMaster *>(modbus));
if (m_modbusTCPMasters.values().contains(static_cast<ModbusTcpMaster *>(modbus))) {
Thing *thing = m_modbusTCPMasters.key(static_cast<ModbusTcpMaster *>(modbus));
qCDebug(dcModbusCommander()) << "Connections state changed" << thing->name() << status;
thing->setStateValue(modbusTCPClientConnectedStateTypeId, status);
}
@ -458,8 +458,8 @@ void IntegrationPluginModbusCommander::onRequestError(QUuid requestId, const QSt
void IntegrationPluginModbusCommander::onReceivedCoil(quint32 slaveAddress, quint32 modbusRegister, const QVector<quint16> &values)
{
auto modbus = sender();
if (m_modbusTCPMasters.values().contains(static_cast<ModbusTCPMaster *>(modbus))) {
Thing *parent = m_modbusTCPMasters.key(static_cast<ModbusTCPMaster *>(modbus));
if (m_modbusTCPMasters.values().contains(static_cast<ModbusTcpMaster *>(modbus))) {
Thing *parent = m_modbusTCPMasters.key(static_cast<ModbusTcpMaster *>(modbus));
foreach (Thing *thing, myThings().filterByParentId(parent->id())) {
if (thing->thingClassId() == coilThingClassId) {
if ((thing->paramValue(m_slaveAddressParamTypeId.value(thing->thingClassId())) == slaveAddress)
@ -477,8 +477,8 @@ void IntegrationPluginModbusCommander::onReceivedDiscreteInput(quint32 slaveAddr
{
auto modbus = sender();
if (m_modbusTCPMasters.values().contains(static_cast<ModbusTCPMaster *>(modbus))) {
Thing *parent = m_modbusTCPMasters.key(static_cast<ModbusTCPMaster *>(modbus));
if (m_modbusTCPMasters.values().contains(static_cast<ModbusTcpMaster *>(modbus))) {
Thing *parent = m_modbusTCPMasters.key(static_cast<ModbusTcpMaster *>(modbus));
foreach (Thing *thing, myThings().filterByParentId(parent->id())) {
if (thing->thingClassId() == discreteInputThingClassId) {
if ((thing->paramValue(m_slaveAddressParamTypeId.value(thing->thingClassId())) == slaveAddress)
@ -496,8 +496,8 @@ void IntegrationPluginModbusCommander::onReceivedHoldingRegister(uint slaveAddre
{
auto modbus = sender();
if (m_modbusTCPMasters.values().contains(static_cast<ModbusTCPMaster *>(modbus))) {
Thing *parent = m_modbusTCPMasters.key(static_cast<ModbusTCPMaster *>(modbus));
if (m_modbusTCPMasters.values().contains(static_cast<ModbusTcpMaster *>(modbus))) {
Thing *parent = m_modbusTCPMasters.key(static_cast<ModbusTcpMaster *>(modbus));
foreach (Thing *thing, myThings().filterByParentId(parent->id())) {
if (thing->thingClassId() == holdingRegisterThingClassId) {
if ((thing->paramValue(m_slaveAddressParamTypeId.value(thing->thingClassId())) == slaveAddress)
@ -515,8 +515,8 @@ void IntegrationPluginModbusCommander::onReceivedInputRegister(uint slaveAddress
{
auto modbus = sender();
if (m_modbusTCPMasters.values().contains(static_cast<ModbusTCPMaster *>(modbus))) {
Thing *parent = m_modbusTCPMasters.key(static_cast<ModbusTCPMaster *>(modbus));
if (m_modbusTCPMasters.values().contains(static_cast<ModbusTcpMaster *>(modbus))) {
Thing *parent = m_modbusTCPMasters.key(static_cast<ModbusTcpMaster *>(modbus));
foreach (Thing *thing, myThings().filterByParentId(parent->id())) {
if (thing->thingClassId() == inputRegisterThingClassId) {
if ((thing->paramValue(m_slaveAddressParamTypeId.value(thing->thingClassId())) == slaveAddress)
@ -544,7 +544,7 @@ void IntegrationPluginModbusCommander::readRegister(Thing *thing)
QUuid requestId;
if (parent->thingClassId() == modbusTCPClientThingClassId) {
ModbusTCPMaster *modbus = m_modbusTCPMasters.value(parent);
ModbusTcpMaster *modbus = m_modbusTCPMasters.value(parent);
if (!modbus)
return;
@ -657,7 +657,7 @@ void IntegrationPluginModbusCommander::writeRegister(Thing *thing, ThingActionIn
Action action = info->action();
if (parent->thingClassId() == modbusTCPClientThingClassId) {
ModbusTCPMaster *modbus = m_modbusTCPMasters.value(parent);
ModbusTcpMaster *modbus = m_modbusTCPMasters.value(parent);
if (!modbus) {
qCWarning(dcModbusCommander()) << "Could not find modbus TCP master for" << thing;
info->finish(Thing::ThingErrorHardwareNotAvailable);

View File

@ -61,7 +61,7 @@ public:
private:
PluginTimer *m_refreshTimer = nullptr;
QHash<Thing*, ModbusTCPMaster*> m_modbusTCPMasters;
QHash<Thing*, ModbusTcpMaster*> m_modbusTCPMasters;
QHash<Thing *, ModbusRtuMaster *> m_modbusRtuMasters;
QHash<QUuid, ThingActionInfo*> m_asyncActions;
QHash<QUuid, Thing*> m_readRequests;

View File

@ -35,15 +35,15 @@ MTec::MTec(const QHostAddress &address, QObject *parent) :
QObject(parent),
m_hostAddress(address)
{
m_modbusMaster = new ModbusTCPMaster(address, 502, this);
m_modbusMaster = new ModbusTcpMaster(address, 502, this);
m_modbusMaster->setTimeout(2000);
m_modbusMaster->setNumberOfRetries(5);
qCDebug(dcMTec()) << "Created ModbusTCPMaster for" << address.toString();
connect(m_modbusMaster, &ModbusTCPMaster::connectionStateChanged, this, &MTec::connectedChanged);
connect(m_modbusMaster, &ModbusTCPMaster::receivedHoldingRegister, this, &MTec::onReceivedHoldingRegister);
connect(m_modbusMaster, &ModbusTCPMaster::readRequestError, this, &MTec::onModbusError);
connect(m_modbusMaster, &ModbusTCPMaster::writeRequestError, this, &MTec::onModbusError);
qCDebug(dcMTec()) << "Created ModbusTcpMaster for" << address.toString();
connect(m_modbusMaster, &ModbusTcpMaster::connectionStateChanged, this, &MTec::connectedChanged);
connect(m_modbusMaster, &ModbusTcpMaster::receivedHoldingRegister, this, &MTec::onReceivedHoldingRegister);
connect(m_modbusMaster, &ModbusTcpMaster::readRequestError, this, &MTec::onModbusError);
connect(m_modbusMaster, &ModbusTcpMaster::writeRequestError, this, &MTec::onModbusError);
}
MTec::~MTec()

View File

@ -123,7 +123,7 @@ private:
};
QHostAddress m_hostAddress;
ModbusTCPMaster *m_modbusMaster = nullptr;
ModbusTcpMaster *m_modbusMaster = nullptr;
double m_roomTemperature = 0;
double m_targetRoomTemperature = 0;

View File

@ -120,11 +120,11 @@ void IntegrationPluginMyPv::setupThing(ThingSetupInfo *info)
if(thing->thingClassId() == elwaThingClassId) {
QHostAddress address = QHostAddress(thing->paramValue(elwaThingIpAddressParamTypeId).toString());
ModbusTCPMaster *modbusTcpMaster = new ModbusTCPMaster(address, 502, this);
connect(modbusTcpMaster, &ModbusTCPMaster::connectionStateChanged, this, &IntegrationPluginMyPv::onConnectionStateChanged);
connect(modbusTcpMaster, &ModbusTCPMaster::receivedHoldingRegister, this, &IntegrationPluginMyPv::onReceivedHoldingRegister);
connect(modbusTcpMaster, &ModbusTCPMaster::writeRequestExecuted, this, &IntegrationPluginMyPv::onWriteRequestExecuted);
connect(modbusTcpMaster, &ModbusTCPMaster::writeRequestError, this, &IntegrationPluginMyPv::onWriteRequestError);
ModbusTcpMaster *modbusTcpMaster = new ModbusTcpMaster(address, 502, this);
connect(modbusTcpMaster, &ModbusTcpMaster::connectionStateChanged, this, &IntegrationPluginMyPv::onConnectionStateChanged);
connect(modbusTcpMaster, &ModbusTcpMaster::receivedHoldingRegister, this, &IntegrationPluginMyPv::onReceivedHoldingRegister);
connect(modbusTcpMaster, &ModbusTcpMaster::writeRequestExecuted, this, &IntegrationPluginMyPv::onWriteRequestExecuted);
connect(modbusTcpMaster, &ModbusTcpMaster::writeRequestError, this, &IntegrationPluginMyPv::onWriteRequestError);
m_modbusTcpMasters.insert(thing, modbusTcpMaster);
} else {
@ -147,7 +147,7 @@ void IntegrationPluginMyPv::postSetupThing(Thing *thing)
void IntegrationPluginMyPv::thingRemoved(Thing *thing)
{
if (thing->thingClassId() == elwaThingClassId) {
ModbusTCPMaster *modbusTCPMaster = m_modbusTcpMasters.take(thing);
ModbusTcpMaster *modbusTCPMaster = m_modbusTcpMasters.take(thing);
modbusTCPMaster->deleteLater();
}
@ -164,7 +164,7 @@ void IntegrationPluginMyPv::executeAction(ThingActionInfo *info)
if (thing->thingClassId() == elwaThingClassId) {
ModbusTCPMaster *modbusTCPMaster = m_modbusTcpMasters.value(thing);
ModbusTcpMaster *modbusTCPMaster = m_modbusTcpMasters.value(thing);
if (action.actionTypeId() == elwaHeatingPowerActionTypeId) {
int heatingPower = action.param(elwaHeatingPowerActionHeatingPowerParamTypeId).value().toInt();
QUuid requestId = modbusTCPMaster->writeHoldingRegister(0xff, ElwaModbusRegisters::Power, heatingPower);
@ -202,7 +202,7 @@ void IntegrationPluginMyPv::onRefreshTimer()
void IntegrationPluginMyPv::onConnectionStateChanged(bool status)
{
ModbusTCPMaster *modbusTcpMaster = static_cast<ModbusTCPMaster *>(sender());
ModbusTcpMaster *modbusTcpMaster = static_cast<ModbusTcpMaster *>(sender());
Thing *thing = m_modbusTcpMasters.key(modbusTcpMaster);
if (!thing)
return;
@ -230,7 +230,7 @@ void IntegrationPluginMyPv::onWriteRequestError(QUuid requestId, const QString &
void IntegrationPluginMyPv::onReceivedHoldingRegister(quint32 slaveAddress, quint32 modbusRegister, const QVector<quint16> &value)
{
Q_UNUSED(slaveAddress)
ModbusTCPMaster *modbusTcpMaster = static_cast<ModbusTCPMaster *>(sender());
ModbusTcpMaster *modbusTcpMaster = static_cast<ModbusTcpMaster *>(sender());
Thing *thing = m_modbusTcpMasters.key(modbusTcpMaster);
if (!thing)
return;
@ -299,7 +299,7 @@ void IntegrationPluginMyPv::onReceivedHoldingRegister(quint32 slaveAddress, quin
void IntegrationPluginMyPv::update(Thing *thing)
{
if (thing->thingClassId() == elwaThingClassId) {
ModbusTCPMaster *modbusTCPMaster = m_modbusTcpMasters.value(thing);
ModbusTcpMaster *modbusTCPMaster = m_modbusTcpMasters.value(thing);
modbusTCPMaster->readHoldingRegister(0xff, ElwaModbusRegisters::Status);
modbusTCPMaster->readHoldingRegister(0xff, ElwaModbusRegisters::WaterTemperature);

View File

@ -80,7 +80,7 @@ private:
};
PluginTimer *m_refreshTimer = nullptr;
QHash<Thing *, ModbusTCPMaster *> m_modbusTcpMasters;
QHash<Thing *, ModbusTcpMaster *> m_modbusTcpMasters;
QHash<QUuid, ThingActionInfo *> m_asyncActions;
void update(Thing *thing);

View File

@ -115,7 +115,7 @@ void IntegrationPluginPhoenixConnect::setupThing(ThingSetupInfo *info)
});
connect(monitor, &NetworkDeviceMonitor::networkDeviceInfoChanged, this, [=](const NetworkDeviceInfo &networkDeviceInfo){
connection->setHostAddress(networkDeviceInfo.address());
connection->modbusTcpMaster()->setHostAddress(networkDeviceInfo.address());
});
connect(connection, &PhoenixModbusTcpConnection::reachableChanged, thing, [connection, thing](bool reachable){

View File

@ -705,7 +705,7 @@ void IntegrationPluginSma::setupModbusInverterConnection(ThingSetupInfo *info)
return;
if (reachable && !thing->stateValue("connected").toBool()) {
connection->setHostAddress(monitor->networkDeviceInfo().address());
connection->modbusTcpMaster()->setHostAddress(monitor->networkDeviceInfo().address());
connection->connectDevice();
} else if (!reachable) {
// Note: We disable autoreconnect explicitly and we will
@ -747,7 +747,7 @@ void IntegrationPluginSma::setupModbusInverterConnection(ThingSetupInfo *info)
connect(connection, &SmaInverterModbusTcpConnection::initializationFinished, info, [=](bool success){
if (!success) {
qCWarning(dcSma()) << "Connection init finished with errors" << thing->name() << connection->hostAddress().toString();
qCWarning(dcSma()) << "Connection init finished with errors" << thing->name() << connection->modbusTcpMaster()->hostAddress().toString();
hardwareManager()->networkDeviceDiscovery()->unregisterMonitor(monitor);
connection->deleteLater();
info->finish(Thing::ThingErrorHardwareFailure, QT_TR_NOOP("Could not initialize the communication with the inverter."));

View File

@ -139,7 +139,7 @@ void SmaModbusDiscovery::checkNetworkDevice(const NetworkDeviceInfo &networkDevi
});
// If we get any error...skip this host...
connect(connection, &SmaInverterModbusTcpConnection::connectionErrorOccurred, this, [=](QModbusDevice::Error error){
connect(connection->modbusTcpMaster(), &ModbusTcpMaster::connectionErrorOccurred, this, [=](QModbusDevice::Error error){
if (error != QModbusDevice::NoError) {
qCDebug(dcSma()) << "Discovery: Connection error on" << networkDeviceInfo.address().toString() << "Continue...";;
cleanupConnection(connection);

View File

@ -102,14 +102,14 @@ void IntegrationPluginStiebelEltron::setupThing(ThingSetupInfo *info) {
StiebelEltronModbusTcpConnection *connection =
new StiebelEltronModbusTcpConnection(address, port, slaveId, this);
connect(connection, &StiebelEltronModbusTcpConnection::connectionStateChanged, thing,
[thing, connection](bool status) {
qCDebug(dcStiebelEltron()) << "Connected changed to" << status << "for" << thing;
if (status) {
connect(connection, &StiebelEltronModbusTcpConnection::reachableChanged, thing,
[thing, connection](bool reachable) {
qCDebug(dcStiebelEltron()) << "Reachable changed to" << reachable << "for" << thing;
if (reachable) {
connection->update();
}
thing->setStateValue(stiebelEltronConnectedStateTypeId, status);
thing->setStateValue(stiebelEltronConnectedStateTypeId, reachable);
});
connect(connection, &StiebelEltronModbusTcpConnection::outdoorTemperatureChanged, thing,
@ -268,7 +268,7 @@ void IntegrationPluginStiebelEltron::postSetupThing(Thing *thing) {
m_pluginTimer = hardwareManager()->pluginTimerManager()->registerTimer(10);
connect(m_pluginTimer, &PluginTimer::timeout, this, [this] {
foreach (StiebelEltronModbusTcpConnection *connection, m_connections) {
if (connection->connected()) {
if (connection->reachable()) {
connection->update();
}
}
@ -294,7 +294,7 @@ void IntegrationPluginStiebelEltron::executeAction(ThingActionInfo *info) {
Thing *thing = info->thing();
StiebelEltronModbusTcpConnection *connection = m_connections.value(thing);
if (!connection->connected()) {
if (!connection->reachable()) {
qCWarning(dcStiebelEltron()) << "Could not execute action. The modbus connection is currently "
"not available.";
info->finish(Thing::ThingErrorHardwareNotAvailable);

View File

@ -35,13 +35,13 @@ Webasto::Webasto(const QHostAddress &address, uint port, QObject *parent) :
QObject(parent)
{
qCDebug(dcWebasto()) << "Webasto: Webasto connection created" << address.toString() << port;
m_modbusConnection = new ModbusTCPMaster(address, port, this);
m_modbusConnection = new ModbusTcpMaster(address, port, this);
m_modbusConnection->setNumberOfRetries(3);
m_modbusConnection->setTimeout(1000);
connect(m_modbusConnection, &ModbusTCPMaster::receivedHoldingRegister, this, &Webasto::onReceivedHoldingRegister);
connect(m_modbusConnection, &ModbusTCPMaster::writeRequestExecuted, this, &Webasto::writeRequestExecuted);
connect(m_modbusConnection, &ModbusTCPMaster::writeRequestError, this, &Webasto::writeRequestError);
connect(m_modbusConnection, &ModbusTcpMaster::receivedHoldingRegister, this, &Webasto::onReceivedHoldingRegister);
connect(m_modbusConnection, &ModbusTcpMaster::writeRequestExecuted, this, &Webasto::writeRequestExecuted);
connect(m_modbusConnection, &ModbusTcpMaster::writeRequestError, this, &Webasto::writeRequestError);
m_lifeBitTimer = new QTimer(this);
m_lifeBitTimer->start(10000);

View File

@ -131,7 +131,7 @@ public:
private:
ModbusTCPMaster *m_modbusConnection = nullptr;
ModbusTcpMaster *m_modbusConnection = nullptr;
QHostAddress m_address;
uint m_unitId = 255;