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

View File

@ -169,7 +169,7 @@ void IntegrationPluginAmperfied::postSetupThing(Thing *thing)
connection->update(); connection->update();
} }
foreach(AmperfiedModbusTcpConnection *connection, m_tcpConnections) { foreach(AmperfiedModbusTcpConnection *connection, m_tcpConnections) {
qCDebug(dcAmperfied()) << "Updating connection" << connection->hostAddress(); qCDebug(dcAmperfied()) << "Updating connection" << connection->modbusTcpMaster()->hostAddress();
connection->update(); 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... // 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); setCheckReachableRetries(3);
connect(this, &HuaweiFusionModbusTcpConnection::connectionStateChanged, this, [=](bool connected){ connect(modbusTcpMaster(), &ModbusTcpMaster::connectionStateChanged, this, [=](bool connected){
if (!connected) { if (!connected) {
m_registersQueue.clear(); m_registersQueue.clear();
} }
@ -114,7 +114,7 @@ void HuaweiFusionSolar::readNextRegister()
qCDebug(dcHuaweiFusionSolar()) << "--> Read \"Inverter active power\" register:" << 32080 << "size:" << 2; qCDebug(dcHuaweiFusionSolar()) << "--> Read \"Inverter active power\" register:" << 32080 << "size:" << 2;
QModbusReply *reply = readInverterActivePower(); QModbusReply *reply = readInverterActivePower();
if (!reply) { 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(); finishRequest();
return; return;
} }
@ -145,10 +145,10 @@ void HuaweiFusionSolar::readNextRegister()
if (reply->error() == QModbusDevice::ProtocolError) { if (reply->error() == QModbusDevice::ProtocolError) {
QModbusResponse response = reply->rawResult(); QModbusResponse response = reply->rawResult();
if (response.isException()) { 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 { } 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; qCDebug(dcHuaweiFusionSolar()) << "--> Read \"Inverter input power\" register:" << 32064 << "size:" << 2;
QModbusReply *reply = readInverterInputPower(); QModbusReply *reply = readInverterInputPower();
if (!reply) { 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(); finishRequest();
return; return;
} }
@ -190,10 +190,10 @@ void HuaweiFusionSolar::readNextRegister()
if (reply->error() == QModbusDevice::ProtocolError) { if (reply->error() == QModbusDevice::ProtocolError) {
QModbusResponse response = reply->rawResult(); QModbusResponse response = reply->rawResult();
if (response.isException()) { 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 { } 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; qCDebug(dcHuaweiFusionSolar()) << "--> Read \"Inverter device status\" register:" << 32089 << "size:" << 1;
QModbusReply *reply = readInverterDeviceStatus(); QModbusReply *reply = readInverterDeviceStatus();
if (!reply) { 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(); finishRequest();
return; return;
} }
@ -234,10 +234,10 @@ void HuaweiFusionSolar::readNextRegister()
if (reply->error() == QModbusDevice::ProtocolError) { if (reply->error() == QModbusDevice::ProtocolError) {
QModbusResponse response = reply->rawResult(); QModbusResponse response = reply->rawResult();
if (response.isException()) { 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 { } 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; qCDebug(dcHuaweiFusionSolar()) << "--> Read \"Inverter energy produced\" register:" << 32106 << "size:" << 2;
QModbusReply *reply = readInverterEnergyProduced(); QModbusReply *reply = readInverterEnergyProduced();
if (!reply) { 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(); finishRequest();
return; return;
} }
@ -278,10 +278,10 @@ void HuaweiFusionSolar::readNextRegister()
if (reply->error() == QModbusDevice::ProtocolError) { if (reply->error() == QModbusDevice::ProtocolError) {
QModbusResponse response = reply->rawResult(); QModbusResponse response = reply->rawResult();
if (response.isException()) { 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 { } 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; break;
@ -291,7 +291,7 @@ void HuaweiFusionSolar::readNextRegister()
qCDebug(dcHuaweiFusionSolar()) << "--> Read \"Power meter active power\" register:" << 37113 << "size:" << 2; qCDebug(dcHuaweiFusionSolar()) << "--> Read \"Power meter active power\" register:" << 37113 << "size:" << 2;
QModbusReply *reply = readPowerMeterActivePower(); QModbusReply *reply = readPowerMeterActivePower();
if (!reply) { 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(); finishRequest();
return; return;
} }
@ -321,10 +321,10 @@ void HuaweiFusionSolar::readNextRegister()
if (reply->error() == QModbusDevice::ProtocolError) { if (reply->error() == QModbusDevice::ProtocolError) {
QModbusResponse response = reply->rawResult(); QModbusResponse response = reply->rawResult();
if (response.isException()) { 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 { } 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; qCDebug(dcHuaweiFusionSolar()) << "--> Read \"Luna 2000 Battery 1 status\" register:" << 37000 << "size:" << 1;
QModbusReply *reply = readLunaBattery1Status(); QModbusReply *reply = readLunaBattery1Status();
if (!reply) { 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(); finishRequest();
return; return;
} }
@ -365,10 +365,10 @@ void HuaweiFusionSolar::readNextRegister()
if (reply->error() == QModbusDevice::ProtocolError) { if (reply->error() == QModbusDevice::ProtocolError) {
QModbusResponse response = reply->rawResult(); QModbusResponse response = reply->rawResult();
if (response.isException()) { 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 { } 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; break;
@ -378,7 +378,7 @@ void HuaweiFusionSolar::readNextRegister()
qCDebug(dcHuaweiFusionSolar()) << "--> Read \"Luna 2000 Battery 1 power\" register:" << 37001 << "size:" << 2; qCDebug(dcHuaweiFusionSolar()) << "--> Read \"Luna 2000 Battery 1 power\" register:" << 37001 << "size:" << 2;
QModbusReply *reply = readLunaBattery1Power(); QModbusReply *reply = readLunaBattery1Power();
if (!reply) { 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(); finishRequest();
return; return;
} }
@ -408,10 +408,10 @@ void HuaweiFusionSolar::readNextRegister()
if (reply->error() == QModbusDevice::ProtocolError) { if (reply->error() == QModbusDevice::ProtocolError) {
QModbusResponse response = reply->rawResult(); QModbusResponse response = reply->rawResult();
if (response.isException()) { 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 { } 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; break;
@ -421,7 +421,7 @@ void HuaweiFusionSolar::readNextRegister()
qCDebug(dcHuaweiFusionSolar()) << "--> Read \"Luna 2000 Battery 1 state of charge\" register:" << 37004 << "size:" << 1; qCDebug(dcHuaweiFusionSolar()) << "--> Read \"Luna 2000 Battery 1 state of charge\" register:" << 37004 << "size:" << 1;
QModbusReply *reply = readLunaBattery1Soc(); QModbusReply *reply = readLunaBattery1Soc();
if (!reply) { 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(); finishRequest();
return; return;
} }
@ -451,10 +451,10 @@ void HuaweiFusionSolar::readNextRegister()
if (reply->error() == QModbusDevice::ProtocolError) { if (reply->error() == QModbusDevice::ProtocolError) {
QModbusResponse response = reply->rawResult(); QModbusResponse response = reply->rawResult();
if (response.isException()) { 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 { } 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; break;
@ -465,7 +465,7 @@ void HuaweiFusionSolar::readNextRegister()
qCDebug(dcHuaweiFusionSolar()) << "--> Read \"Luna 2000 Battery 2 status\" register:" << 37741 << "size:" << 1; qCDebug(dcHuaweiFusionSolar()) << "--> Read \"Luna 2000 Battery 2 status\" register:" << 37741 << "size:" << 1;
QModbusReply *reply = readLunaBattery2Status(); QModbusReply *reply = readLunaBattery2Status();
if (!reply) { 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(); finishRequest();
return; return;
} }
@ -495,10 +495,10 @@ void HuaweiFusionSolar::readNextRegister()
if (reply->error() == QModbusDevice::ProtocolError) { if (reply->error() == QModbusDevice::ProtocolError) {
QModbusResponse response = reply->rawResult(); QModbusResponse response = reply->rawResult();
if (response.isException()) { 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 { } 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; break;
@ -508,7 +508,7 @@ void HuaweiFusionSolar::readNextRegister()
qCDebug(dcHuaweiFusionSolar()) << "--> Read \"Luna 2000 Battery 2 power\" register:" << 37743 << "size:" << 2; qCDebug(dcHuaweiFusionSolar()) << "--> Read \"Luna 2000 Battery 2 power\" register:" << 37743 << "size:" << 2;
QModbusReply *reply = readLunaBattery2Power(); QModbusReply *reply = readLunaBattery2Power();
if (!reply) { 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(); finishRequest();
return; return;
} }
@ -538,10 +538,10 @@ void HuaweiFusionSolar::readNextRegister()
if (reply->error() == QModbusDevice::ProtocolError) { if (reply->error() == QModbusDevice::ProtocolError) {
QModbusResponse response = reply->rawResult(); QModbusResponse response = reply->rawResult();
if (response.isException()) { 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 { } 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; break;
@ -551,7 +551,7 @@ void HuaweiFusionSolar::readNextRegister()
qCDebug(dcHuaweiFusionSolar()) << "--> Read \"Luna 2000 Battery 2 state of charge\" register:" << 37738 << "size:" << 1; qCDebug(dcHuaweiFusionSolar()) << "--> Read \"Luna 2000 Battery 2 state of charge\" register:" << 37738 << "size:" << 1;
QModbusReply *reply = readLunaBattery2Soc(); QModbusReply *reply = readLunaBattery2Soc();
if (!reply) { 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(); finishRequest();
return; return;
} }
@ -581,10 +581,10 @@ void HuaweiFusionSolar::readNextRegister()
if (reply->error() == QModbusDevice::ProtocolError) { if (reply->error() == QModbusDevice::ProtocolError) {
QModbusResponse response = reply->rawResult(); QModbusResponse response = reply->rawResult();
if (response.isException()) { 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 { } 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; 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... // but retry only once to communicate with the device for reachability check...
connection->setCheckReachableRetries(1); 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... // Try to connect, maybe it works, maybe not...
if (!connection->connectDevice()) { 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); cleanupConnection(connection);
} }
} }
@ -117,7 +117,7 @@ void HuaweiFusionSolarDiscovery::checkNetworkDevice(const NetworkDeviceInfo &net
}); });
// If we get any error...skip this host... // 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) { if (error != QModbusDevice::NoError) {
qCDebug(dcHuawei()) << "Discovery: Connection error on" << networkDeviceInfo.address().toString() << "Continue...";; qCDebug(dcHuawei()) << "Discovery: Connection error on" << networkDeviceInfo.address().toString() << "Continue...";;
cleanupConnection(connection); cleanupConnection(connection);
@ -144,7 +144,7 @@ void HuaweiFusionSolarDiscovery::cleanupConnection(HuaweiFusionSolar *connection
connection->deleteLater(); connection->deleteLater();
} }
testNextConnection(connection->hostAddress()); testNextConnection(connection->modbusTcpMaster()->hostAddress());
} }
void HuaweiFusionSolarDiscovery::finishDiscovery() void HuaweiFusionSolarDiscovery::finishDiscovery()

View File

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

View File

@ -201,7 +201,7 @@ void IntegrationPluginIdm::executeAction(ThingActionInfo *info)
return; return;
} }
if (!connection->connected()) if (!connection->reachable())
info->finish(Thing::ThingErrorHardwareNotAvailable); info->finish(Thing::ThingErrorHardwareNotAvailable);
@ -251,7 +251,7 @@ void IntegrationPluginIdm::setupConnection(ThingSetupInfo *info)
return; return;
if (reachable && !thing->stateValue("connected").toBool()) { if (reachable && !thing->stateValue("connected").toBool()) {
connection->setHostAddress(monitor->networkDeviceInfo().address()); connection->modbusTcpMaster()->setHostAddress(monitor->networkDeviceInfo().address());
connection->connectDevice(); connection->connectDevice();
} else if (!reachable) { } else if (!reachable) {
// Note: We disable autoreconnect explicitly and we will // Note: We disable autoreconnect explicitly and we will
@ -290,7 +290,7 @@ void IntegrationPluginIdm::setupConnection(ThingSetupInfo *info)
connect(connection, &IdmModbusTcpConnection::initializationFinished, info, [=](bool success){ connect(connection, &IdmModbusTcpConnection::initializationFinished, info, [=](bool success){
if (!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); hardwareManager()->networkDeviceDiscovery()->unregisterMonitor(monitor);
connection->deleteLater(); connection->deleteLater();
info->finish(Thing::ThingErrorHardwareFailure, QT_TR_NOOP("Could not initialize the communication with the device.")); 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); m_pluginTimer = hardwareManager()->pluginTimerManager()->registerTimer(2);
connect(m_pluginTimer, &PluginTimer::timeout, this, [this] { connect(m_pluginTimer, &PluginTimer::timeout, this, [this] {
foreach(KostalModbusTcpConnection *connection, m_kostalConnections) { foreach(KostalModbusTcpConnection *connection, m_kostalConnections) {
qCDebug(dcKostal()) << "Update connection" << connection->hostAddress().toString(); qCDebug(dcKostal()) << "Update connection" << connection->modbusTcpMaster()->hostAddress().toString();
connection->update(); connection->update();
} }
}); });
@ -319,7 +319,7 @@ void IntegrationPluginKostal::setupKostalConnection(ThingSetupInfo *info)
return; return;
if (reachable && !thing->stateValue("connected").toBool()) { if (reachable && !thing->stateValue("connected").toBool()) {
kostalConnection->setHostAddress(monitor->networkDeviceInfo().address()); kostalConnection->modbusTcpMaster()->setHostAddress(monitor->networkDeviceInfo().address());
kostalConnection->connectDevice(); kostalConnection->connectDevice();
} else if (!reachable) { } else if (!reachable) {
// Note: We disable autoreconnect explicitly and we will // Note: We disable autoreconnect explicitly and we will
@ -358,7 +358,7 @@ void IntegrationPluginKostal::setupKostalConnection(ThingSetupInfo *info)
connect(kostalConnection, &KostalModbusTcpConnection::initializationFinished, info, [=](bool success){ connect(kostalConnection, &KostalModbusTcpConnection::initializationFinished, info, [=](bool success){
if (!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); hardwareManager()->networkDeviceDiscovery()->unregisterMonitor(monitor);
kostalConnection->deleteLater(); kostalConnection->deleteLater();
info->finish(Thing::ThingErrorHardwareFailure, QT_TR_NOOP("Could not initialize the communication with the inverter.")); 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... // 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) { if (error != QModbusDevice::NoError) {
qCDebug(dcKostal()) << "Discovery: Connection error on" << networkDeviceInfo.address().toString() << "Continue...";; qCDebug(dcKostal()) << "Discovery: Connection error on" << networkDeviceInfo.address().toString() << "Continue...";;
cleanupConnection(connection); cleanupConnection(connection);

View File

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

View File

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

View File

@ -71,7 +71,7 @@ def writePropertyGetSetMethodImplementationsTcp(fileDescriptor, className, regis
exit(1) exit(1)
writeLine(fileDescriptor, ' request.setValues(values);') 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, '}')
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, ' 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, ' QModbusReply *reply = read%s();' % (propertyName[0].upper() + propertyName[1:]))
writeLine(fileDescriptor, ' if (!reply) {') 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, ' return;')
writeLine(fileDescriptor, ' }') writeLine(fileDescriptor, ' }')
writeLine(fileDescriptor) writeLine(fileDescriptor)
@ -114,7 +114,7 @@ def writePropertyUpdateMethodImplementationsTcp(fileDescriptor, className, regis
writeLine(fileDescriptor, ' });') writeLine(fileDescriptor, ' });')
writeLine(fileDescriptor) writeLine(fileDescriptor)
writeLine(fileDescriptor, ' connect(reply, &QModbusReply::errorOccurred, this, [this, reply] (QModbusDevice::Error error){') 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, '}') writeLine(fileDescriptor, '}')
writeLine(fileDescriptor) writeLine(fileDescriptor)
@ -207,7 +207,7 @@ def writeInternalPropertyReadMethodImplementationsTcp(fileDescriptor, className,
#Default to holdingRegister #Default to holdingRegister
writeLine(fileDescriptor, ' QModbusDataUnit request = QModbusDataUnit(QModbusDataUnit::RegisterType::HoldingRegisters, %s, %s);' % (registerDefinition['address'], registerDefinition['size'])) 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, '}')
writeLine(fileDescriptor) writeLine(fileDescriptor)
@ -274,7 +274,7 @@ def writeInternalBlockReadMethodImplementationsTcp(fileDescriptor, className, bl
#Default to holdingRegister #Default to holdingRegister
writeLine(fileDescriptor, ' QModbusDataUnit request = QModbusDataUnit(QModbusDataUnit::RegisterType::HoldingRegisters, %s, %s);' % (blockStartAddress, blockSize)) 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, '}')
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, ' 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, ' reply = read%s();' % (propertyName[0].upper() + propertyName[1:]))
writeLine(fileDescriptor, ' if (!reply) {') 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, ' finishInitialization(false);')
writeLine(fileDescriptor, ' return false;') writeLine(fileDescriptor, ' return false;')
writeLine(fileDescriptor, ' }') writeLine(fileDescriptor, ' }')
@ -398,7 +398,7 @@ def writeInitMethodImplementationTcp(fileDescriptor, className, registerDefiniti
writeLine(fileDescriptor, ' });') writeLine(fileDescriptor, ' });')
writeLine(fileDescriptor) writeLine(fileDescriptor)
writeLine(fileDescriptor, ' connect(reply, &QModbusReply::errorOccurred, m_initObject, [this, reply] (QModbusDevice::Error error){') 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, ' });') writeLine(fileDescriptor, ' });')
# Read init blocks # Read init blocks
@ -495,7 +495,7 @@ def writeUpdateMethodTcp(fileDescriptor, className, registerDefinitions, blockDe
break break
if updateRequired: if updateRequired:
writeLine(fileDescriptor, ' if (!connected())') writeLine(fileDescriptor, ' if (!m_modbusTcpMaster->connected())')
writeLine(fileDescriptor, ' return false;') writeLine(fileDescriptor, ' return false;')
writeLine(fileDescriptor) writeLine(fileDescriptor)
writeLine(fileDescriptor, ' if (!m_pendingUpdateReplies.isEmpty()) {') 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, ' 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, ' reply = read%s();' % (propertyName[0].upper() + propertyName[1:]))
writeLine(fileDescriptor, ' if (!reply) {') 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, ' return false;')
writeLine(fileDescriptor, ' }') writeLine(fileDescriptor, ' }')
writeLine(fileDescriptor) writeLine(fileDescriptor)
@ -546,7 +546,7 @@ def writeUpdateMethodTcp(fileDescriptor, className, registerDefinitions, blockDe
writeLine(fileDescriptor, ' });') writeLine(fileDescriptor, ' });')
writeLine(fileDescriptor) writeLine(fileDescriptor)
writeLine(fileDescriptor, ' connect(reply, &QModbusReply::errorOccurred, this, [this, reply] (QModbusDevice::Error error){') 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, ' });') writeLine(fileDescriptor, ' });')
# Read init blocks # Read init blocks

View File

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

View File

@ -47,7 +47,7 @@ def writeTcpHeaderFile():
writeLine(headerFile) writeLine(headerFile)
# Begin of class # Begin of class
writeLine(headerFile, 'class %s : public ModbusTCPMaster' % className) writeLine(headerFile, 'class %s : public QObject' % className)
writeLine(headerFile, '{') writeLine(headerFile, '{')
writeLine(headerFile, ' Q_OBJECT') writeLine(headerFile, ' Q_OBJECT')
@ -64,8 +64,12 @@ def writeTcpHeaderFile():
# Constructor # Constructor
writeLine(headerFile, ' explicit %s(const QHostAddress &hostAddress, uint port, quint16 slaveId, QObject *parent = nullptr);' % className) 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, ' ~%s() = default;' % className)
writeLine(headerFile) writeLine(headerFile)
writeLine(headerFile, ' ModbusTcpMaster *modbusTcpMaster() const;')
writeLine(headerFile, ' quint16 slaveId() const;')
writeLine(headerFile)
writeLine(headerFile, ' bool reachable() const;') writeLine(headerFile, ' bool reachable() const;')
writeLine(headerFile) writeLine(headerFile)
writeLine(headerFile, ' ModbusDataUtils::ByteOrder endianness() const;') writeLine(headerFile, ' ModbusDataUtils::ByteOrder endianness() const;')
@ -110,6 +114,12 @@ def writeTcpHeaderFile():
writeLine(headerFile, ' virtual bool update();') writeLine(headerFile, ' virtual bool update();')
writeLine(headerFile) 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 # Write registers value changed signals
writeLine(headerFile, 'signals:') writeLine(headerFile, 'signals:')
writeLine(headerFile, ' void reachableChanged(bool reachable);') writeLine(headerFile, ' void reachableChanged(bool reachable);')
@ -151,6 +161,7 @@ def writeTcpHeaderFile():
# Private members # Private members
writeLine(headerFile, 'private:') writeLine(headerFile, 'private:')
writeLine(headerFile, ' ModbusTcpMaster *m_modbusTcpMaster = nullptr;')
writeLine(headerFile, ' ModbusDataUtils::ByteOrder m_endianness = ModbusDataUtils::ByteOrder%s;' % endianness) writeLine(headerFile, ' ModbusDataUtils::ByteOrder m_endianness = ModbusDataUtils::ByteOrder%s;' % endianness)
writeLine(headerFile, ' ModbusDataUtils::ByteOrder m_stringEndianness = ModbusDataUtils::ByteOrder%s;' % stringEndianness) writeLine(headerFile, ' ModbusDataUtils::ByteOrder m_stringEndianness = ModbusDataUtils::ByteOrder%s;' % stringEndianness)
writeLine(headerFile, ' quint16 m_slaveId = 1;') writeLine(headerFile, ' quint16 m_slaveId = 1;')
@ -170,6 +181,8 @@ def writeTcpHeaderFile():
writeLine(headerFile, ' void verifyInitFinished();') writeLine(headerFile, ' void verifyInitFinished();')
writeLine(headerFile, ' void finishInitialization(bool success);') writeLine(headerFile, ' void finishInitialization(bool success);')
writeLine(headerFile) writeLine(headerFile)
writeLine(headerFile, ' void setupConnection();')
writeLine(headerFile)
writeLine(headerFile, ' void verifyUpdateFinished();') writeLine(headerFile, ' void verifyUpdateFinished();')
writeLine(headerFile) writeLine(headerFile)
writeLine(headerFile, ' void onReachabilityCheckFailed();') writeLine(headerFile, ' void onReachabilityCheckFailed();')
@ -201,28 +214,32 @@ def writeTcpSourceFile():
# Constructor # Constructor
writeLine(sourceFile, '%s::%s(const QHostAddress &hostAddress, uint port, quint16 slaveId, QObject *parent) :' % (className, className)) 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, ' m_slaveId(slaveId)')
writeLine(sourceFile, '{') writeLine(sourceFile, '{')
writeLine(sourceFile, ' connect(this, &ModbusTCPMaster::connectionStateChanged, this, [this](bool status){') writeLine(sourceFile, ' setupConnection();')
writeLine(sourceFile, ' if (status) {') writeLine(sourceFile, '}')
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) 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, '}')
writeLine(sourceFile) writeLine(sourceFile)
@ -294,6 +311,24 @@ def writeTcpSourceFile():
writeInitMethodImplementationTcp(sourceFile, className, registerJson['registers'], blocks) writeInitMethodImplementationTcp(sourceFile, className, registerJson['registers'], blocks)
writeUpdateMethodTcp(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 # Write update methods
writePropertyUpdateMethodImplementationsTcp(sourceFile, className, registerJson['registers']) writePropertyUpdateMethodImplementationsTcp(sourceFile, className, registerJson['registers'])
if 'blocks' in registerJson: if 'blocks' in registerJson:
@ -351,9 +386,9 @@ def writeTcpSourceFile():
writeLine(sourceFile, 'void %s::finishInitialization(bool success)' % (className)) writeLine(sourceFile, 'void %s::finishInitialization(bool success)' % (className))
writeLine(sourceFile, '{') writeLine(sourceFile, '{')
writeLine(sourceFile, ' if (success) {') 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, ' } 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) writeLine(sourceFile)
writeLine(sourceFile, ' // Cleanup init') writeLine(sourceFile, ' // Cleanup init')
@ -365,6 +400,30 @@ def writeTcpSourceFile():
writeLine(sourceFile, '}') writeLine(sourceFile, '}')
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, 'void %s::verifyUpdateFinished()' % (className))
writeLine(sourceFile, '{') writeLine(sourceFile, '{')
writeLine(sourceFile, ' if (m_pendingUpdateReplies.isEmpty()) {') writeLine(sourceFile, ' if (m_pendingUpdateReplies.isEmpty()) {')
@ -390,7 +449,7 @@ def writeTcpSourceFile():
writeLine(sourceFile, 'void %s::evaluateReachableState()' % (className)) writeLine(sourceFile, 'void %s::evaluateReachableState()' % (className))
writeLine(sourceFile, '{') 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, ' if (m_reachable == reachable)')
writeLine(sourceFile, ' return;') writeLine(sourceFile, ' return;')
writeLine(sourceFile) writeLine(sourceFile)
@ -406,7 +465,7 @@ def writeTcpSourceFile():
debugObjectParamName = className[0].lower() + className[1:] debugObjectParamName = className[0].lower() + className[1:]
writeLine(sourceFile, 'QDebug operator<<(QDebug debug, %s *%s)' % (className, debugObjectParamName)) writeLine(sourceFile, 'QDebug operator<<(QDebug debug, %s *%s)' % (className, debugObjectParamName))
writeLine(sourceFile, '{') 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']) writeRegistersDebugLine(sourceFile, debugObjectParamName, registerJson['registers'])
if 'blocks' in registerJson: if 'blocks' in registerJson:
for blockDefinition in registerJson['blocks']: for blockDefinition in registerJson['blocks']:

View File

@ -282,11 +282,11 @@ void IntegrationPluginMennekes::postSetupThing(Thing *thing)
m_pluginTimer = hardwareManager()->pluginTimerManager()->registerTimer(2); m_pluginTimer = hardwareManager()->pluginTimerManager()->registerTimer(2);
connect(m_pluginTimer, &PluginTimer::timeout, this, [this] { connect(m_pluginTimer, &PluginTimer::timeout, this, [this] {
foreach(AmtronECUModbusTcpConnection *connection, m_amtronECUConnections) { foreach(AmtronECUModbusTcpConnection *connection, m_amtronECUConnections) {
qCDebug(dcMennekes()) << "Updating connection" << connection->hostAddress().toString(); qCDebug(dcMennekes()) << "Updating connection" << connection->modbusTcpMaster()->hostAddress().toString();
connection->update(); connection->update();
} }
foreach(AmtronHCC3ModbusTcpConnection *connection, m_amtronHCC3Connections) { foreach(AmtronHCC3ModbusTcpConnection *connection, m_amtronHCC3Connections) {
qCDebug(dcMennekes()) << "Updating connection" << connection->hostAddress().toString(); qCDebug(dcMennekes()) << "Updating connection" << connection->modbusTcpMaster()->hostAddress().toString();
connection->update(); connection->update();
} }
foreach(AmtronCompact20ModbusRtuConnection *connection, m_amtronCompact20Connections) { foreach(AmtronCompact20ModbusRtuConnection *connection, m_amtronCompact20Connections) {
@ -517,7 +517,7 @@ void IntegrationPluginMennekes::setupAmtronECUConnection(ThingSetupInfo *info)
qCDebug(dcMennekes()) << "Setting up amtron wallbox on" << address.toString(); qCDebug(dcMennekes()) << "Setting up amtron wallbox on" << address.toString();
AmtronECUModbusTcpConnection *amtronECUConnection = new AmtronECUModbusTcpConnection(address, 502, 0xff, this); 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 // Reconnect on monitor reachable changed
NetworkDeviceMonitor *monitor = m_monitors.value(thing); NetworkDeviceMonitor *monitor = m_monitors.value(thing);
@ -527,7 +527,7 @@ void IntegrationPluginMennekes::setupAmtronECUConnection(ThingSetupInfo *info)
return; return;
if (reachable && !thing->stateValue("connected").toBool()) { if (reachable && !thing->stateValue("connected").toBool()) {
amtronECUConnection->setHostAddress(monitor->networkDeviceInfo().address()); amtronECUConnection->modbusTcpMaster()->setHostAddress(monitor->networkDeviceInfo().address());
amtronECUConnection->connectDevice(); amtronECUConnection->connectDevice();
} else if (!reachable) { } else if (!reachable) {
// Note: We disable autoreconnect explicitly and we will // Note: We disable autoreconnect explicitly and we will
@ -560,7 +560,7 @@ void IntegrationPluginMennekes::setupAmtronECUConnection(ThingSetupInfo *info)
connect(amtronECUConnection, &AmtronECUModbusTcpConnection::initializationFinished, info, [=](bool success){ connect(amtronECUConnection, &AmtronECUModbusTcpConnection::initializationFinished, info, [=](bool success){
if (!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); hardwareManager()->networkDeviceDiscovery()->unregisterMonitor(monitor);
amtronECUConnection->deleteLater(); amtronECUConnection->deleteLater();
info->finish(Thing::ThingErrorHardwareFailure, QT_TR_NOOP("Error communicating with the wallbox.")); 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(); qCDebug(dcMennekes()) << "Setting up amtron wallbox on" << address.toString();
AmtronHCC3ModbusTcpConnection *amtronHCC3Connection = new AmtronHCC3ModbusTcpConnection(address, 502, 0xff, this); 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 // Reconnect on monitor reachable changed
NetworkDeviceMonitor *monitor = m_monitors.value(thing); NetworkDeviceMonitor *monitor = m_monitors.value(thing);
@ -659,7 +659,7 @@ void IntegrationPluginMennekes::setupAmtronHCC3Connection(ThingSetupInfo *info)
return; return;
if (reachable && !thing->stateValue("connected").toBool()) { if (reachable && !thing->stateValue("connected").toBool()) {
amtronHCC3Connection->setHostAddress(monitor->networkDeviceInfo().address()); amtronHCC3Connection->modbusTcpMaster()->setHostAddress(monitor->networkDeviceInfo().address());
amtronHCC3Connection->connectDevice(); amtronHCC3Connection->connectDevice();
} else if (!reachable) { } else if (!reachable) {
// Note: We disable autoreconnect explicitly and we will // Note: We disable autoreconnect explicitly and we will
@ -692,7 +692,7 @@ void IntegrationPluginMennekes::setupAmtronHCC3Connection(ThingSetupInfo *info)
connect(amtronHCC3Connection, &AmtronHCC3ModbusTcpConnection::initializationFinished, info, [=](bool success){ connect(amtronHCC3Connection, &AmtronHCC3ModbusTcpConnection::initializationFinished, info, [=](bool success){
if (!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); hardwareManager()->networkDeviceDiscovery()->unregisterMonitor(monitor);
amtronHCC3Connection->deleteLater(); amtronHCC3Connection->deleteLater();
info->finish(Thing::ThingErrorHardwareFailure, QT_TR_NOOP("Error communicating with the wallbox.")); 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(); m_modbusTCPMasters.take(thing)->deleteLater();
} }
foreach (ModbusTCPMaster *modbusTCPMaster, m_modbusTCPMasters.values()) { foreach (ModbusTcpMaster *modbusTCPMaster, m_modbusTCPMasters.values()) {
if ((modbusTCPMaster->hostAddress() == hostAddress) && (modbusTCPMaster->port() == port)) { if ((modbusTCPMaster->hostAddress() == hostAddress) && (modbusTCPMaster->port() == port)) {
m_modbusTCPMasters.insert(thing, modbusTCPMaster); m_modbusTCPMasters.insert(thing, modbusTCPMaster);
return info->finish(Thing::ThingErrorNoError); return info->finish(Thing::ThingErrorNoError);
@ -249,15 +249,15 @@ void IntegrationPluginModbusCommander::setupThing(ThingSetupInfo *info)
qCDebug(dcModbusCommander()) << " number of retries:" << numberOfRetries; qCDebug(dcModbusCommander()) << " number of retries:" << numberOfRetries;
qCDebug(dcModbusCommander()) << " timeout:" << timeout; qCDebug(dcModbusCommander()) << " timeout:" << timeout;
ModbusTCPMaster *modbusTCPMaster = new ModbusTCPMaster(hostAddress, port, this); ModbusTcpMaster *modbusTCPMaster = new ModbusTcpMaster(hostAddress, port, this);
connect(modbusTCPMaster, &ModbusTCPMaster::connectionStateChanged, this, &IntegrationPluginModbusCommander::onConnectionStateChanged); connect(modbusTCPMaster, &ModbusTcpMaster::connectionStateChanged, this, &IntegrationPluginModbusCommander::onConnectionStateChanged);
connect(modbusTCPMaster, &ModbusTCPMaster::writeRequestExecuted, this, &IntegrationPluginModbusCommander::onRequestExecuted); connect(modbusTCPMaster, &ModbusTcpMaster::writeRequestExecuted, this, &IntegrationPluginModbusCommander::onRequestExecuted);
connect(modbusTCPMaster, &ModbusTCPMaster::writeRequestError, this, &IntegrationPluginModbusCommander::onRequestError); connect(modbusTCPMaster, &ModbusTcpMaster::writeRequestError, this, &IntegrationPluginModbusCommander::onRequestError);
connect(modbusTCPMaster, &ModbusTCPMaster::receivedCoil, this, &IntegrationPluginModbusCommander::onReceivedCoil); connect(modbusTCPMaster, &ModbusTcpMaster::receivedCoil, this, &IntegrationPluginModbusCommander::onReceivedCoil);
connect(modbusTCPMaster, &ModbusTCPMaster::receivedDiscreteInput, this, &IntegrationPluginModbusCommander::onReceivedDiscreteInput); connect(modbusTCPMaster, &ModbusTcpMaster::receivedDiscreteInput, this, &IntegrationPluginModbusCommander::onReceivedDiscreteInput);
connect(modbusTCPMaster, &ModbusTCPMaster::receivedHoldingRegister, this, &IntegrationPluginModbusCommander::onReceivedHoldingRegister); connect(modbusTCPMaster, &ModbusTcpMaster::receivedHoldingRegister, this, &IntegrationPluginModbusCommander::onReceivedHoldingRegister);
connect(modbusTCPMaster, &ModbusTCPMaster::receivedInputRegister, this, &IntegrationPluginModbusCommander::onReceivedInputRegister); connect(modbusTCPMaster, &ModbusTcpMaster::receivedInputRegister, this, &IntegrationPluginModbusCommander::onReceivedInputRegister);
connect(modbusTCPMaster, &ModbusTCPMaster::connectionStateChanged, info, [info, modbusTCPMaster, this] (bool connected) { connect(modbusTCPMaster, &ModbusTcpMaster::connectionStateChanged, info, [info, modbusTCPMaster, this] (bool connected) {
if (connected) { if (connected) {
info->finish(Thing::ThingErrorNoError); info->finish(Thing::ThingErrorNoError);
m_modbusTCPMasters.insert(info->thing(), modbusTCPMaster); m_modbusTCPMasters.insert(info->thing(), modbusTCPMaster);
@ -416,8 +416,8 @@ void IntegrationPluginModbusCommander::onPluginConfigurationChanged(const ParamT
void IntegrationPluginModbusCommander::onConnectionStateChanged(bool status) void IntegrationPluginModbusCommander::onConnectionStateChanged(bool status)
{ {
auto modbus = sender(); auto modbus = sender();
if (m_modbusTCPMasters.values().contains(static_cast<ModbusTCPMaster *>(modbus))) { if (m_modbusTCPMasters.values().contains(static_cast<ModbusTcpMaster *>(modbus))) {
Thing *thing = m_modbusTCPMasters.key(static_cast<ModbusTCPMaster *>(modbus)); Thing *thing = m_modbusTCPMasters.key(static_cast<ModbusTcpMaster *>(modbus));
qCDebug(dcModbusCommander()) << "Connections state changed" << thing->name() << status; qCDebug(dcModbusCommander()) << "Connections state changed" << thing->name() << status;
thing->setStateValue(modbusTCPClientConnectedStateTypeId, 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) void IntegrationPluginModbusCommander::onReceivedCoil(quint32 slaveAddress, quint32 modbusRegister, const QVector<quint16> &values)
{ {
auto modbus = sender(); auto modbus = sender();
if (m_modbusTCPMasters.values().contains(static_cast<ModbusTCPMaster *>(modbus))) { if (m_modbusTCPMasters.values().contains(static_cast<ModbusTcpMaster *>(modbus))) {
Thing *parent = m_modbusTCPMasters.key(static_cast<ModbusTCPMaster *>(modbus)); Thing *parent = m_modbusTCPMasters.key(static_cast<ModbusTcpMaster *>(modbus));
foreach (Thing *thing, myThings().filterByParentId(parent->id())) { foreach (Thing *thing, myThings().filterByParentId(parent->id())) {
if (thing->thingClassId() == coilThingClassId) { if (thing->thingClassId() == coilThingClassId) {
if ((thing->paramValue(m_slaveAddressParamTypeId.value(thing->thingClassId())) == slaveAddress) if ((thing->paramValue(m_slaveAddressParamTypeId.value(thing->thingClassId())) == slaveAddress)
@ -477,8 +477,8 @@ void IntegrationPluginModbusCommander::onReceivedDiscreteInput(quint32 slaveAddr
{ {
auto modbus = sender(); auto modbus = sender();
if (m_modbusTCPMasters.values().contains(static_cast<ModbusTCPMaster *>(modbus))) { if (m_modbusTCPMasters.values().contains(static_cast<ModbusTcpMaster *>(modbus))) {
Thing *parent = m_modbusTCPMasters.key(static_cast<ModbusTCPMaster *>(modbus)); Thing *parent = m_modbusTCPMasters.key(static_cast<ModbusTcpMaster *>(modbus));
foreach (Thing *thing, myThings().filterByParentId(parent->id())) { foreach (Thing *thing, myThings().filterByParentId(parent->id())) {
if (thing->thingClassId() == discreteInputThingClassId) { if (thing->thingClassId() == discreteInputThingClassId) {
if ((thing->paramValue(m_slaveAddressParamTypeId.value(thing->thingClassId())) == slaveAddress) if ((thing->paramValue(m_slaveAddressParamTypeId.value(thing->thingClassId())) == slaveAddress)
@ -496,8 +496,8 @@ void IntegrationPluginModbusCommander::onReceivedHoldingRegister(uint slaveAddre
{ {
auto modbus = sender(); auto modbus = sender();
if (m_modbusTCPMasters.values().contains(static_cast<ModbusTCPMaster *>(modbus))) { if (m_modbusTCPMasters.values().contains(static_cast<ModbusTcpMaster *>(modbus))) {
Thing *parent = m_modbusTCPMasters.key(static_cast<ModbusTCPMaster *>(modbus)); Thing *parent = m_modbusTCPMasters.key(static_cast<ModbusTcpMaster *>(modbus));
foreach (Thing *thing, myThings().filterByParentId(parent->id())) { foreach (Thing *thing, myThings().filterByParentId(parent->id())) {
if (thing->thingClassId() == holdingRegisterThingClassId) { if (thing->thingClassId() == holdingRegisterThingClassId) {
if ((thing->paramValue(m_slaveAddressParamTypeId.value(thing->thingClassId())) == slaveAddress) if ((thing->paramValue(m_slaveAddressParamTypeId.value(thing->thingClassId())) == slaveAddress)
@ -515,8 +515,8 @@ void IntegrationPluginModbusCommander::onReceivedInputRegister(uint slaveAddress
{ {
auto modbus = sender(); auto modbus = sender();
if (m_modbusTCPMasters.values().contains(static_cast<ModbusTCPMaster *>(modbus))) { if (m_modbusTCPMasters.values().contains(static_cast<ModbusTcpMaster *>(modbus))) {
Thing *parent = m_modbusTCPMasters.key(static_cast<ModbusTCPMaster *>(modbus)); Thing *parent = m_modbusTCPMasters.key(static_cast<ModbusTcpMaster *>(modbus));
foreach (Thing *thing, myThings().filterByParentId(parent->id())) { foreach (Thing *thing, myThings().filterByParentId(parent->id())) {
if (thing->thingClassId() == inputRegisterThingClassId) { if (thing->thingClassId() == inputRegisterThingClassId) {
if ((thing->paramValue(m_slaveAddressParamTypeId.value(thing->thingClassId())) == slaveAddress) if ((thing->paramValue(m_slaveAddressParamTypeId.value(thing->thingClassId())) == slaveAddress)
@ -544,7 +544,7 @@ void IntegrationPluginModbusCommander::readRegister(Thing *thing)
QUuid requestId; QUuid requestId;
if (parent->thingClassId() == modbusTCPClientThingClassId) { if (parent->thingClassId() == modbusTCPClientThingClassId) {
ModbusTCPMaster *modbus = m_modbusTCPMasters.value(parent); ModbusTcpMaster *modbus = m_modbusTCPMasters.value(parent);
if (!modbus) if (!modbus)
return; return;
@ -657,7 +657,7 @@ void IntegrationPluginModbusCommander::writeRegister(Thing *thing, ThingActionIn
Action action = info->action(); Action action = info->action();
if (parent->thingClassId() == modbusTCPClientThingClassId) { if (parent->thingClassId() == modbusTCPClientThingClassId) {
ModbusTCPMaster *modbus = m_modbusTCPMasters.value(parent); ModbusTcpMaster *modbus = m_modbusTCPMasters.value(parent);
if (!modbus) { if (!modbus) {
qCWarning(dcModbusCommander()) << "Could not find modbus TCP master for" << thing; qCWarning(dcModbusCommander()) << "Could not find modbus TCP master for" << thing;
info->finish(Thing::ThingErrorHardwareNotAvailable); info->finish(Thing::ThingErrorHardwareNotAvailable);

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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