Allow creating multiple connections on one ModbusTcpMaster
This commit is contained in:
parent
ba922c7e7e
commit
1b423186bb
@ -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;
|
||||||
|
|||||||
@ -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();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|||||||
BIN
debs_1.8.2+202308081314~dc23d1b~buster.tar
Normal file
BIN
debs_1.8.2+202308081314~dc23d1b~buster.tar
Normal file
Binary file not shown.
@ -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;
|
||||||
|
|||||||
@ -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()
|
||||||
|
|||||||
@ -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
|
||||||
|
|||||||
@ -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."));
|
||||||
|
|||||||
@ -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."));
|
||||||
|
|||||||
@ -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);
|
||||||
|
|||||||
@ -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);
|
||||||
|
|||||||
@ -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;
|
||||||
|
|||||||
@ -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
|
||||||
|
|||||||
@ -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, '{')
|
||||||
|
|||||||
@ -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']:
|
||||||
|
|||||||
@ -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."));
|
||||||
|
|||||||
@ -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);
|
||||||
|
|||||||
@ -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;
|
||||||
|
|||||||
@ -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()
|
||||||
|
|||||||
@ -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;
|
||||||
|
|||||||
@ -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);
|
||||||
|
|||||||
@ -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);
|
||||||
|
|||||||
@ -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){
|
||||||
|
|||||||
@ -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."));
|
||||||
|
|||||||
@ -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);
|
||||||
|
|||||||
@ -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);
|
||||||
|
|||||||
@ -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);
|
||||||
|
|||||||
@ -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;
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user