diff --git a/fronius/froniusinverter.cpp b/fronius/froniusinverter.cpp index 46aef31..3f43aed 100644 --- a/fronius/froniusinverter.cpp +++ b/fronius/froniusinverter.cpp @@ -56,7 +56,7 @@ QUrl FroniusInverter::updateUrl() requestUrl.setHost(hostAddress()); requestUrl.setPath(baseUrl() + "GetInverterRealtimeData.cgi"); query.addQueryItem("Scope", "Device"); - query.addQueryItem("DeviceId", thingId()); + query.addQueryItem("DeviceId", deviceId()); query.addQueryItem("DataCollection", "CommonInverterData"); requestUrl.setQuery(query); diff --git a/fronius/froniusmeter.cpp b/fronius/froniusmeter.cpp index 1e35ef3..c87520f 100644 --- a/fronius/froniusmeter.cpp +++ b/fronius/froniusmeter.cpp @@ -57,7 +57,7 @@ QUrl FroniusMeter::updateUrl() requestUrl.setHost(hostAddress()); requestUrl.setPath(baseUrl() + "GetMeterRealtimeData.cgi"); query.addQueryItem("Scope", "Device"); - query.addQueryItem("DeviceId", thingId()); + query.addQueryItem("DeviceId", deviceId()); requestUrl.setQuery(query); return requestUrl; } diff --git a/fronius/froniusstorage.cpp b/fronius/froniusstorage.cpp index 3d55688..1567a46 100644 --- a/fronius/froniusstorage.cpp +++ b/fronius/froniusstorage.cpp @@ -66,7 +66,7 @@ QUrl FroniusStorage::updateUrl() requestUrl.setHost(hostAddress()); requestUrl.setPath(baseUrl() + "GetStorageRealtimeData.cgi"); query.addQueryItem("Scope", "Device"); - query.addQueryItem("DeviceId", thingId()); + query.addQueryItem("DeviceId", deviceId()); requestUrl.setQuery(query); return requestUrl; diff --git a/fronius/froniusthing.cpp b/fronius/froniusthing.cpp index fbfe087..af3903c 100644 --- a/fronius/froniusthing.cpp +++ b/fronius/froniusthing.cpp @@ -1,22 +1,32 @@ -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - * * - * Copyright (C) 2016 Christian Stachowitz * - * * - * This file is part of guh. * - * * - * Guh is free software: you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation, version 2 of the License. * - * * - * Guh is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * You should have received a copy of the GNU General Public License * - * along with guh. If not, see . * - * * - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * +* +* Copyright 2013 - 2020, nymea GmbH +* Contact: contact@nymea.io +* +* This file is part of nymea. +* This project including source code and documentation is protected by +* copyright law, and remains the property of nymea GmbH. All rights, including +* reproduction, publication, editing and translation, are reserved. The use of +* this project is subject to the terms of a license agreement to be concluded +* with nymea GmbH in accordance with the terms of use of nymea GmbH, available +* under https://nymea.io/license +* +* GNU Lesser General Public License Usage +* Alternatively, this project may be redistributed and/or modified under the +* terms of the GNU Lesser General Public License as published by the Free +* Software Foundation; version 3. This project is distributed in the hope that +* it will be useful, but WITHOUT ANY WARRANTY; without even the implied +* warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +* Lesser General Public License for more details. +* +* You should have received a copy of the GNU Lesser General Public License +* along with this project. If not, see . +* +* For any further details and any questions please contact us under +* contact@nymea.io or see our FAQ/Licensing Information on +* https://nymea.io/license/faq +* +* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ #include "froniusthing.h" @@ -76,12 +86,12 @@ void FroniusThing::setUniqueId(const QString &uniqueId) m_uniqueId = uniqueId; } -QString FroniusThing::thingId() const +QString FroniusThing::deviceId() const { return m_thingId; } -void FroniusThing::setThingId(const QString &thingId) +void FroniusThing::setDeviceId(const QString &thingId) { m_thingId = thingId; } diff --git a/fronius/froniusthing.h b/fronius/froniusthing.h index d277b07..9f7acbd 100644 --- a/fronius/froniusthing.h +++ b/fronius/froniusthing.h @@ -60,8 +60,8 @@ public: QString uniqueId() const; void setUniqueId(const QString &uniqueId); - QString thingId() const; - void setThingId(const QString &thingId); + QString deviceId() const; + void setDeviceId(const QString &deviceId); Thing* pluginThing() const; diff --git a/fronius/integrationpluginfronius.cpp b/fronius/integrationpluginfronius.cpp index a83f8b9..0c777c2 100644 --- a/fronius/integrationpluginfronius.cpp +++ b/fronius/integrationpluginfronius.cpp @@ -63,10 +63,14 @@ void IntegrationPluginFronius::setupThing(ThingSetupInfo *info) } // Perform a HTTP request on the given IPv4Address to find things - QUrl url(QString("http://%1/solar_api/GetAPIVersion.cgi").arg(thing->paramValue(dataloggerThingLoggerHostParamTypeId).toString())); - qCDebug(dcFronius()) << "Search at address" << url.toString(); + QUrl requestUrl; + requestUrl.setScheme("http"); + requestUrl.setHost(thing->paramValue(dataloggerThingLoggerHostParamTypeId).toString()); + requestUrl.setPath("/solar_api/GetAPIVersion.cgi"); - QNetworkReply *reply = hardwareManager()->networkManager()->get(QNetworkRequest(url)); + qCDebug(dcFronius()) << "Search at address" << requestUrl.toString(); + + QNetworkReply *reply = hardwareManager()->networkManager()->get(QNetworkRequest(requestUrl)); connect(reply, &QNetworkReply::finished, reply, &QNetworkReply::deleteLater); connect(reply, &QNetworkReply::finished, [this, info, thing, reply]() { QByteArray data = reply->readAll(); @@ -92,18 +96,14 @@ void IntegrationPluginFronius::setupThing(ThingSetupInfo *info) m_froniusLoggers.insert(newLogger, thing); info->finish(Thing::ThingErrorNoError); - // FIX ME: remove after testing - //searchNewThings(m_froniusLoggers.key(thing)); - //updateThingStates(thing); }); //Async Setup } else if (thing->thingClassId() == inverterThingClassId) { FroniusInverter *newInverter = new FroniusInverter(thing,this); - newInverter->setThingId(thing->paramValue(inverterThingIdParamTypeId).toString()); + newInverter->setDeviceId(thing->paramValue(inverterThingIdParamTypeId).toString()); newInverter->setName(thing->paramValue(inverterThingNameParamTypeId).toString()); newInverter->setBaseUrl(thing->paramValue(inverterThingBaseParamTypeId).toString()); - newInverter->setHostId(thing->paramValue(inverterThingHostIdParamTypeId).toString()); newInverter->setHostAddress(thing->paramValue(inverterThingHostParamTypeId).toString()); m_froniusInverters.insert(newInverter,thing); @@ -141,9 +141,9 @@ void IntegrationPluginFronius::setupThing(ThingSetupInfo *info) // Check reply information QVariantMap dataMap = jsonDoc.toVariant().toMap().value("Body").toMap().value("Data").toMap(); // check for thing id in reply - if (dataMap.contains(newInverter->thingId())) { - qCDebug(dcFronius()) << "Found Thing with unique:" << dataMap.value(newInverter->thingId()).toMap().value("UniqueID").toString(); - newInverter->setUniqueId(dataMap.value(newInverter->thingId()).toMap().value("UniqueID").toString()); + if (dataMap.contains(newInverter->deviceId())) { + qCDebug(dcFronius()) << "Found Thing with unique:" << dataMap.value(newInverter->deviceId()).toMap().value("UniqueID").toString(); + newInverter->setUniqueId(dataMap.value(newInverter->deviceId()).toMap().value("UniqueID").toString()); newInverter->pluginThing()->setParamValue(inverterThingUniqueIdParamTypeId,newInverter->uniqueId()); qCDebug(dcFronius()) << "Stored unique ID:" << newInverter->uniqueId(); } @@ -153,10 +153,9 @@ void IntegrationPluginFronius::setupThing(ThingSetupInfo *info) } else if (thing->thingClassId() == storageThingClassId) { FroniusStorage *newStorage = new FroniusStorage(thing, this); - newStorage->setThingId(thing->paramValue(storageThingIdParamTypeId).toString()); + newStorage->setDeviceId(thing->paramValue(storageThingIdParamTypeId).toString()); newStorage->setName(thing->paramValue(storageThingNameParamTypeId).toString()); newStorage->setBaseUrl(thing->paramValue(storageThingBaseParamTypeId).toString()); - newStorage->setHostId(thing->paramValue(storageThingHostIdParamTypeId).toString()); newStorage->setHostAddress(thing->paramValue(storageThingHostParamTypeId).toString()); m_froniusStorages.insert(newStorage,thing); @@ -170,8 +169,8 @@ void IntegrationPluginFronius::setupThing(ThingSetupInfo *info) requestUrl.setScheme("http"); requestUrl.setHost(newStorage->hostAddress()); requestUrl.setPath(newStorage->baseUrl() + "GetStorageRealtimeData.cgi"); - query.addQueryItem("Scope","Thing"); - query.addQueryItem("ThingId",newStorage->thingId()); + query.addQueryItem("Scope","Device"); + query.addQueryItem("DeviceId", newStorage->deviceId()); requestUrl.setQuery(query); qCDebug(dcFronius()) << "Get Storage Data at address" << requestUrl.toString(); QNetworkReply *reply = hardwareManager()->networkManager()->get(QNetworkRequest(requestUrl)); @@ -205,10 +204,9 @@ void IntegrationPluginFronius::setupThing(ThingSetupInfo *info) } else if (thing->thingClassId() == meterThingClassId) { FroniusMeter *newMeter = new FroniusMeter(thing, this);; - newMeter->setThingId(thing->paramValue(meterThingIdParamTypeId).toString()); + newMeter->setDeviceId(thing->paramValue(meterThingIdParamTypeId).toString()); newMeter->setName(thing->paramValue(meterThingNameParamTypeId).toString()); newMeter->setBaseUrl(thing->paramValue(meterThingBaseParamTypeId).toString()); - newMeter->setHostId(thing->paramValue(meterThingHostIdParamTypeId).toString()); newMeter->setHostAddress(thing->paramValue(meterThingHostParamTypeId).toString()); m_froniusMeters.insert(newMeter,thing); @@ -227,31 +225,30 @@ void IntegrationPluginFronius::setupThing(ThingSetupInfo *info) } } -void IntegrationPluginFronius::init() -{ - m_pluginTimer = hardwareManager()->pluginTimerManager()->registerTimer(30); - connect(m_pluginTimer, &PluginTimer::timeout, this, [this]() { - foreach (Thing *logger, m_froniusLoggers) - updateThingStates(logger); - - foreach (Thing *inverter, m_froniusInverters) - updateThingStates(inverter); - - foreach (Thing *meter, m_froniusMeters) - updateThingStates(meter); - - foreach (Thing *storage, m_froniusStorages) - updateThingStates(storage); - - foreach (SunspecThing *sunspecThing, m_sunspecThings.keys()) - sunspecThing->update(); - }); -} - void IntegrationPluginFronius::postSetupThing(Thing *thing) { qCDebug(dcFronius()) << "Post setup" << thing->name(); + if (!m_pluginTimer) { + m_pluginTimer = hardwareManager()->pluginTimerManager()->registerTimer(30); + connect(m_pluginTimer, &PluginTimer::timeout, this, [this]() { + foreach (Thing *logger, m_froniusLoggers) + updateThingStates(logger); + + foreach (Thing *inverter, m_froniusInverters) + updateThingStates(inverter); + + foreach (Thing *meter, m_froniusMeters) + updateThingStates(meter); + + foreach (Thing *storage, m_froniusStorages) + updateThingStates(storage); + + foreach (SunspecThing *sunspecThing, m_sunspecThings.keys()) + sunspecThing->update(); + }); + } + if (thing->thingClassId() == dataloggerThingClassId) { searchNewThings(m_froniusLoggers.key(thing)); updateThingStates(thing); @@ -271,9 +268,6 @@ void IntegrationPluginFronius::postSetupThing(Thing *thing) void IntegrationPluginFronius::thingRemoved(Thing *thing) { - // Remove things - - // Data Logger if (thing->thingClassId() == dataloggerThingClassId) { FroniusLogger *logger = m_froniusLoggers.key(thing); m_froniusLoggers.remove(logger); @@ -500,26 +494,27 @@ void IntegrationPluginFronius::updateThingStates(Thing *thing) void IntegrationPluginFronius::searchNewThings(FroniusLogger *logger) { QUrl url; QUrlQuery query; - query.addQueryItem("ThingClass", "System"); + query.addQueryItem("DeviceClass", "System"); url.setScheme("http"); url.setHost(logger->hostAddress()); - url.setPath(logger->baseUrl() + "GetActiveThingInfo.cgi"); + url.setPath(logger->baseUrl() + "GetActiveDeviceInfo.cgi"); url.setQuery(query); qCDebug(dcFronius()) << "Search Things at address" << url.toString(); + QNetworkRequest request = QNetworkRequest(url); + request.setHeader(QNetworkRequest::KnownHeaders::ContentTypeHeader, "application/json"); - QNetworkReply *reply = hardwareManager()->networkManager()->get(QNetworkRequest(url)); + QNetworkReply *reply = hardwareManager()->networkManager()->get(request); + connect(reply, &QNetworkReply::finished, reply, &QNetworkReply::deleteLater); connect(reply, &QNetworkReply::finished, [this, logger, reply]() { - reply->deleteLater(); - if (reply->error() != QNetworkReply::NoError) { qCWarning(dcFronius()) << "Network request error:" << reply->error() << reply->errorString(); return; } - Thing *thing = m_froniusLoggers.value(logger); - if (!thing) + Thing *loggerThing = m_froniusLoggers.value(logger); + if (!loggerThing) return; QByteArray data = reply->readAll(); @@ -543,68 +538,52 @@ void IntegrationPluginFronius::searchNewThings(FroniusLogger *logger) foreach (QString inverterId, inverterMap.keys()) { //check if thing already connected to logger if(!existingThing(inverterThingIdParamTypeId,inverterId)) { - QString thingName = thing->name() + " Inverter " + inverterId; - ThingDescriptor descriptor(inverterThingClassId, thingName, "Fronius Solar Inverter"); + QString thingName = loggerThing->name() + " Inverter " + inverterId; + ThingDescriptor descriptor(inverterThingClassId, thingName, "Fronius Solar Inverter", loggerThing->id()); ParamList params; params.append(Param(inverterThingNameParamTypeId, thingName)); - params.append(Param(inverterThingHostParamTypeId, m_froniusLoggers.key(thing)->hostAddress())); - params.append(Param(inverterThingBaseParamTypeId, m_froniusLoggers.key(thing)->baseUrl())); + params.append(Param(inverterThingHostParamTypeId, m_froniusLoggers.key(loggerThing)->hostAddress())); + params.append(Param(inverterThingBaseParamTypeId, m_froniusLoggers.key(loggerThing)->baseUrl())); params.append(Param(inverterThingIdParamTypeId, inverterId)); params.append(Param(inverterThingUniqueIdParamTypeId, "")); - params.append(Param(inverterThingHostIdParamTypeId, thing->id())); descriptor.setParams(params); thingDescriptors.append(descriptor); } } - if (!thingDescriptors.empty()) { - emit autoThingsAppeared(thingDescriptors); - thingDescriptors.clear(); - } - // parse reply for meter things at the host address QVariantMap meterMap = bodyMap.value("Data").toMap().value("Meter").toMap(); foreach (QString meterId, meterMap.keys()) { //check if thing already connected to logger - if(!existingThing(meterThingIdParamTypeId,meterId)) { - QString thingName = thing->name() + " Meter " + meterId; - ThingDescriptor descriptor(meterThingClassId, thingName, "Fronius Solar Meter"); + if(!existingThing(meterThingIdParamTypeId, meterId)) { + QString thingName = loggerThing->name() + " Meter " + meterId; + ThingDescriptor descriptor(meterThingClassId, thingName, "Fronius Solar Meter", loggerThing->id()); ParamList params; params.append(Param(meterThingNameParamTypeId, thingName)); - //params.append(Param(meterThingManufParamTypeId, "")); - //params.append(Param(meterThingCapacityParamTypeId, "")); - params.append(Param(meterThingHostParamTypeId, m_froniusLoggers.key(thing)->hostAddress())); - params.append(Param(meterThingBaseParamTypeId, m_froniusLoggers.key(thing)->baseUrl())); + params.append(Param(meterThingHostParamTypeId, m_froniusLoggers.key(loggerThing)->hostAddress())); + params.append(Param(meterThingBaseParamTypeId, m_froniusLoggers.key(loggerThing)->baseUrl())); params.append(Param(meterThingIdParamTypeId, meterId)); params.append(Param(meterThingUniqueIdParamTypeId, meterMap.value(meterId).toMap().value("Serial").toString())); - params.append(Param(meterThingHostIdParamTypeId, thing->id())); descriptor.setParams(params); thingDescriptors.append(descriptor); } } - if (!thingDescriptors.empty()) { - emit autoThingsAppeared(thingDescriptors); - thingDescriptors.clear(); - } - - // parse reply for storage things at the host address QVariantMap storageMap = bodyMap.value("Data").toMap().value("Storage").toMap(); foreach (QString storageId, storageMap.keys()) { //check if thing already connected to logger if(!existingThing(storageThingIdParamTypeId,storageId)) { - QString thingName = thing->name() + " Storage " + storageId; - ThingDescriptor descriptor(storageThingClassId, thingName, "Fronius Solar Storage"); + QString thingName = loggerThing->name() + " Storage " + storageId; + ThingDescriptor descriptor(storageThingClassId, thingName, "Fronius Solar Storage", loggerThing->id()); ParamList params; params.append(Param(storageThingNameParamTypeId, thingName)); params.append(Param(storageThingManufacturerParamTypeId, "")); params.append(Param(storageThingCapacityParamTypeId, "")); - params.append(Param(storageThingHostParamTypeId, m_froniusLoggers.key(thing)->hostAddress())); - params.append(Param(storageThingBaseParamTypeId, m_froniusLoggers.key(thing)->baseUrl())); + params.append(Param(storageThingHostParamTypeId, m_froniusLoggers.key(loggerThing)->hostAddress())); + params.append(Param(storageThingBaseParamTypeId, m_froniusLoggers.key(loggerThing)->baseUrl())); params.append(Param(storageThingIdParamTypeId, storageId)); params.append(Param(storageThingUniqueIdParamTypeId, storageMap.value(storageId).toMap().value("Serial").toString())); - params.append(Param(storageThingHostIdParamTypeId, thing->id())); descriptor.setParams(params); thingDescriptors.append(descriptor); } @@ -614,9 +593,7 @@ void IntegrationPluginFronius::searchNewThings(FroniusLogger *logger) emit autoThingsAppeared(thingDescriptors); thingDescriptors.clear(); } - }); - } bool IntegrationPluginFronius::existingThing(ParamTypeId thingParamId, QString thingId) diff --git a/fronius/integrationpluginfronius.h b/fronius/integrationpluginfronius.h index 1b9cccc..0995219 100644 --- a/fronius/integrationpluginfronius.h +++ b/fronius/integrationpluginfronius.h @@ -51,14 +51,11 @@ class IntegrationPluginFronius : public IntegrationPlugin public: explicit IntegrationPluginFronius(QObject *parent = nullptr); - void init() override; void setupThing(ThingSetupInfo *thing) override; void postSetupThing(Thing* thing) override; void executeAction(ThingActionInfo *info) override; void thingRemoved(Thing* thing) override; - void startMonitoringAutoThings() override; - private: PluginTimer *m_pluginTimer = nullptr; diff --git a/fronius/integrationpluginfronius.json b/fronius/integrationpluginfronius.json index d4b3854..3ed79b5 100644 --- a/fronius/integrationpluginfronius.json +++ b/fronius/integrationpluginfronius.json @@ -187,13 +187,6 @@ "displayName": "Uique id", "type": "QString", "inputType": "TextLine" - }, - { - "id": "e329ecd2-6893-432f-9f14-069593c996e9", - "name": "hostId", - "displayName": "host id", - "type": "QString", - "inputType": "TextLine" } ], "stateTypes": [ @@ -292,13 +285,6 @@ "displayName": "uique id", "type": "QString", "inputType": "TextLine" - }, - { - "id": "b4b86bfc-598a-4b5c-9350-52b944556ccc", - "name": "hostId", - "displayName": "host id", - "type": "QString", - "inputType": "TextLine" } ], "stateTypes": [ @@ -394,13 +380,6 @@ "displayName": "unique id", "type": "QString", "inputType": "TextLine" - }, - { - "id": "79daa7f4-2551-4b89-b34a-2d75d1441a55", - "name": "hostId", - "displayName": "Host ID", - "type": "QString", - "inputType": "TextLine" } ], "stateTypes": [ diff --git a/modbus/modbusrtumaster.cpp b/modbus/modbusrtumaster.cpp index b7b04b1..b3881e7 100644 --- a/modbus/modbusrtumaster.cpp +++ b/modbus/modbusrtumaster.cpp @@ -76,6 +76,16 @@ bool ModbusRTUMaster::connectDevice() return m_modbusRtuSerialMaster->connectDevice(); } +void ModbusRTUMaster::setNumberOfRetries(int number) +{ + m_modbusRtuSerialMaster->setNumberOfRetries(number); +} + +void ModbusRTUMaster::setTimeout(int timeout) +{ + m_modbusRtuSerialMaster->setTimeout(timeout); +} + QString ModbusRTUMaster::serialPort() { return m_modbusRtuSerialMaster->connectionParameter(QModbusDevice::SerialPortNameParameter).toString(); @@ -88,14 +98,14 @@ void ModbusRTUMaster::onReconnectTimer() } } -QUuid ModbusRTUMaster::readCoil(uint slaveAddress, uint registerAddress) +QUuid ModbusRTUMaster::readCoil(uint slaveAddress, uint registerAddress, uint size) { if (!m_modbusRtuSerialMaster) { return ""; } QUuid requestId = QUuid::createUuid(); - QModbusDataUnit request = QModbusDataUnit(QModbusDataUnit::RegisterType::Coils, registerAddress, 1); + QModbusDataUnit request = QModbusDataUnit(QModbusDataUnit::RegisterType::Coils, registerAddress, size); if (QModbusReply *reply = m_modbusRtuSerialMaster->sendReadRequest(request, slaveAddress)) { if (!reply->isFinished()) { @@ -106,7 +116,7 @@ QUuid ModbusRTUMaster::readCoil(uint slaveAddress, uint registerAddress) requestExecuted(requestId, true); const QModbusDataUnit unit = reply->result(); uint modbusAddress = unit.startAddress(); - emit receivedCoil(reply->serverAddress(), modbusAddress, unit.value(0)); + emit receivedCoil(reply->serverAddress(), modbusAddress, unit.values()); } else { requestExecuted(requestId, false); @@ -133,14 +143,20 @@ QUuid ModbusRTUMaster::readCoil(uint slaveAddress, uint registerAddress) } QUuid ModbusRTUMaster::writeCoil(uint slaveAddress, uint registerAddress, bool value) +{ + return writeCoils(slaveAddress, registerAddress, QVector() << static_cast(value)); +} + + +QUuid ModbusRTUMaster::writeCoils(uint slaveAddress, uint registerAddress, const QVector &values) { if (!m_modbusRtuSerialMaster) { return ""; } QUuid requestId = QUuid::createUuid(); - QModbusDataUnit request = QModbusDataUnit(QModbusDataUnit::RegisterType::Coils, registerAddress, 1); - request.setValue(0, static_cast(value)); + QModbusDataUnit request = QModbusDataUnit(QModbusDataUnit::RegisterType::Coils, registerAddress, values.length()); + request.setValues(values); if (QModbusReply *reply = m_modbusRtuSerialMaster->sendWriteRequest(request, slaveAddress)) { if (!reply->isFinished()) { @@ -151,7 +167,7 @@ QUuid ModbusRTUMaster::writeCoil(uint slaveAddress, uint registerAddress, bool v requestExecuted(requestId, true); const QModbusDataUnit unit = reply->result(); uint modbusAddress = unit.startAddress(); - emit receivedCoil(reply->serverAddress(), modbusAddress, unit.value(0)); + emit receivedCoil(reply->serverAddress(), modbusAddress, unit.values()); } else { requestExecuted(requestId, false); @@ -176,15 +192,20 @@ QUuid ModbusRTUMaster::writeCoil(uint slaveAddress, uint registerAddress, bool v return requestId; } -QUuid ModbusRTUMaster::writeHoldingRegister(uint slaveAddress, uint registerAddress, uint value) +QUuid ModbusRTUMaster::writeHoldingRegister(uint slaveAddress, uint registerAddress, quint16 value) +{ + return writeHoldingRegisters(slaveAddress, registerAddress, QVector() << value); +} + +QUuid ModbusRTUMaster::writeHoldingRegisters(uint slaveAddress, uint registerAddress, const QVector &values) { if (!m_modbusRtuSerialMaster) { return ""; } QUuid requestId = QUuid::createUuid(); - QModbusDataUnit request = QModbusDataUnit(QModbusDataUnit::RegisterType::HoldingRegisters, registerAddress, 1); - request.setValue(0, static_cast(value)); + QModbusDataUnit request = QModbusDataUnit(QModbusDataUnit::RegisterType::HoldingRegisters, registerAddress, values.length()); + request.setValues(values); if (QModbusReply *reply = m_modbusRtuSerialMaster->sendWriteRequest(request, slaveAddress)) { if (!reply->isFinished()) { @@ -220,14 +241,14 @@ QUuid ModbusRTUMaster::writeHoldingRegister(uint slaveAddress, uint registerAddr return requestId; } -QUuid ModbusRTUMaster::readDiscreteInput(uint slaveAddress, uint registerAddress) +QUuid ModbusRTUMaster::readDiscreteInput(uint slaveAddress, uint registerAddress, uint size) { if (!m_modbusRtuSerialMaster) { return ""; } QUuid requestId = QUuid::createUuid(); - QModbusDataUnit request = QModbusDataUnit(QModbusDataUnit::RegisterType::DiscreteInputs, registerAddress, 1); + QModbusDataUnit request = QModbusDataUnit(QModbusDataUnit::RegisterType::DiscreteInputs, registerAddress, size); if (QModbusReply *reply = m_modbusRtuSerialMaster->sendReadRequest(request, slaveAddress)) { if (!reply->isFinished()) { @@ -238,7 +259,7 @@ QUuid ModbusRTUMaster::readDiscreteInput(uint slaveAddress, uint registerAddress requestExecuted(requestId, true); const QModbusDataUnit unit = reply->result(); uint modbusAddress = unit.startAddress(); - emit receivedDiscreteInput(reply->serverAddress(), modbusAddress, unit.value(0)); + emit receivedDiscreteInput(reply->serverAddress(), modbusAddress, unit.values()); } else { requestExecuted(requestId, false); @@ -264,14 +285,14 @@ QUuid ModbusRTUMaster::readDiscreteInput(uint slaveAddress, uint registerAddress return requestId; } -QUuid ModbusRTUMaster::readInputRegister(uint slaveAddress, uint registerAddress) +QUuid ModbusRTUMaster::readInputRegister(uint slaveAddress, uint registerAddress, uint size) { if (!m_modbusRtuSerialMaster) { return ""; } QUuid requestId = QUuid::createUuid(); - QModbusDataUnit request = QModbusDataUnit(QModbusDataUnit::RegisterType::InputRegisters, registerAddress, 1); + QModbusDataUnit request = QModbusDataUnit(QModbusDataUnit::RegisterType::InputRegisters, registerAddress, size); if (QModbusReply *reply = m_modbusRtuSerialMaster->sendReadRequest(request, slaveAddress)) { if (!reply->isFinished()) { @@ -283,7 +304,7 @@ QUuid ModbusRTUMaster::readInputRegister(uint slaveAddress, uint registerAddress requestExecuted(requestId, true); const QModbusDataUnit unit = reply->result(); uint modbusAddress = unit.startAddress(); - emit receivedInputRegister(reply->serverAddress(), modbusAddress, unit.value(0)); + emit receivedInputRegister(reply->serverAddress(), modbusAddress, unit.values()); } else { requestExecuted(requestId, false); @@ -309,14 +330,14 @@ QUuid ModbusRTUMaster::readInputRegister(uint slaveAddress, uint registerAddress return requestId; } -QUuid ModbusRTUMaster::readHoldingRegister(uint slaveAddress, uint registerAddress) +QUuid ModbusRTUMaster::readHoldingRegister(uint slaveAddress, uint registerAddress, uint size) { if (!m_modbusRtuSerialMaster) { return ""; } QUuid requestId = QUuid::createUuid(); - QModbusDataUnit request = QModbusDataUnit(QModbusDataUnit::RegisterType::HoldingRegisters, registerAddress, 1); + QModbusDataUnit request = QModbusDataUnit(QModbusDataUnit::RegisterType::HoldingRegisters, registerAddress, size); if (QModbusReply *reply = m_modbusRtuSerialMaster->sendReadRequest(request, slaveAddress)) { if (!reply->isFinished()) { diff --git a/modbus/modbusrtumaster.h b/modbus/modbusrtumaster.h index 9218ac5..3a9b04c 100644 --- a/modbus/modbusrtumaster.h +++ b/modbus/modbusrtumaster.h @@ -45,14 +45,19 @@ public: ~ModbusRTUMaster(); bool connectDevice(); + void setNumberOfRetries(int number); + void setTimeout(int timeout); - QUuid readCoil(uint slaveAddress, uint registerAddress); - QUuid readDiscreteInput(uint slaveAddress, uint registerAddress); - QUuid readInputRegister(uint slaveAddress, uint registerAddress); - QUuid readHoldingRegister(uint slaveAddress, uint registerAddress); + QUuid readCoil(uint slaveAddress, uint registerAddress, uint size = 1); + QUuid readDiscreteInput(uint slaveAddress, uint registerAddress, uint size = 1); + QUuid readInputRegister(uint slaveAddress, uint registerAddress, uint size = 1); + QUuid readHoldingRegister(uint slaveAddress, uint registerAddress, uint size = 1); QUuid writeCoil(uint slaveAddress, uint registerAddress, bool status); - QUuid writeHoldingRegister(uint slaveAddress, uint registerAddress, uint data); + QUuid writeCoils(uint slaveAddress, uint registerAddress, const QVector &values); + + QUuid writeHoldingRegister(uint slaveAddress, uint registerAddress, quint16 value); + QUuid writeHoldingRegisters(uint slaveAddress, uint registerAddress, const QVector &values); QString serialPort(); @@ -72,10 +77,10 @@ signals: void requestExecuted(QUuid requestId, bool success); void requestError(QUuid requestId, const QString &error); - void receivedCoil(uint slaveAddress, uint modbusRegister, bool value); - void receivedDiscreteInput(uint slaveAddress, uint modbusRegister, bool value); + void receivedCoil(uint slaveAddress, uint modbusRegister, const QVector &values); + void receivedDiscreteInput(uint slaveAddress, uint modbusRegister, const QVector &values); void receivedHoldingRegister(uint slaveAddress, uint modbusRegister, const QVector &values); - void receivedInputRegister(uint slaveAddress, uint modbusRegister, uint value); + void receivedInputRegister(uint slaveAddress, uint modbusRegister, const QVector &values); }; #endif // MODBUSRTUMASTER_H diff --git a/modbus/modbustcpmaster.cpp b/modbus/modbustcpmaster.cpp index 7b92999..c7675e5 100644 --- a/modbus/modbustcpmaster.cpp +++ b/modbus/modbustcpmaster.cpp @@ -110,14 +110,14 @@ QHostAddress ModbusTCPMaster::hostAddress() return QHostAddress(m_modbusTcpClient->connectionParameter(QModbusDevice::NetworkAddressParameter).toString()); } -QUuid ModbusTCPMaster::readCoil(uint slaveAddress, uint registerAddress) +QUuid ModbusTCPMaster::readCoil(uint slaveAddress, uint registerAddress, uint size) { if (!m_modbusTcpClient) { return ""; } QUuid requestId = QUuid::createUuid(); - QModbusDataUnit request = QModbusDataUnit(QModbusDataUnit::RegisterType::Coils, registerAddress, 1); + QModbusDataUnit request = QModbusDataUnit(QModbusDataUnit::RegisterType::Coils, registerAddress, size); if (QModbusReply *reply = m_modbusTcpClient->sendReadRequest(request, slaveAddress)) { if (!reply->isFinished()) { @@ -128,7 +128,7 @@ QUuid ModbusTCPMaster::readCoil(uint slaveAddress, uint registerAddress) writeRequestExecuted(requestId, true); const QModbusDataUnit unit = reply->result(); uint modbusAddress = unit.startAddress(); - emit receivedCoil(reply->serverAddress(), modbusAddress, unit.value(0)); + emit receivedCoil(reply->serverAddress(), modbusAddress, unit.values()); } else { writeRequestExecuted(requestId, false); @@ -197,14 +197,14 @@ QUuid ModbusTCPMaster::writeHoldingRegisters(uint slaveAddress, uint registerAdd return requestId; } -QUuid ModbusTCPMaster::readDiscreteInput(uint slaveAddress, uint registerAddress) +QUuid ModbusTCPMaster::readDiscreteInput(uint slaveAddress, uint registerAddress, uint size) { if (!m_modbusTcpClient) { return ""; } QUuid requestId = QUuid::createUuid(); - QModbusDataUnit request = QModbusDataUnit(QModbusDataUnit::RegisterType::DiscreteInputs, registerAddress, 1); + QModbusDataUnit request = QModbusDataUnit(QModbusDataUnit::RegisterType::DiscreteInputs, registerAddress, size); if (QModbusReply *reply = m_modbusTcpClient->sendReadRequest(request, slaveAddress)) { if (!reply->isFinished()) { @@ -215,7 +215,7 @@ QUuid ModbusTCPMaster::readDiscreteInput(uint slaveAddress, uint registerAddress writeRequestExecuted(requestId, true); const QModbusDataUnit unit = reply->result(); uint modbusAddress = unit.startAddress(); - emit receivedDiscreteInput(reply->serverAddress(), modbusAddress, unit.value(0)); + emit receivedDiscreteInput(reply->serverAddress(), modbusAddress, unit.values()); } else { writeRequestExecuted(requestId, false); @@ -241,14 +241,14 @@ QUuid ModbusTCPMaster::readDiscreteInput(uint slaveAddress, uint registerAddress return requestId; } -QUuid ModbusTCPMaster::readInputRegister(uint slaveAddress, uint registerAddress) +QUuid ModbusTCPMaster::readInputRegister(uint slaveAddress, uint registerAddress, uint size) { if (!m_modbusTcpClient) { return ""; } QUuid requestId = QUuid::createUuid(); - QModbusDataUnit request = QModbusDataUnit(QModbusDataUnit::RegisterType::InputRegisters, registerAddress, 1); + QModbusDataUnit request = QModbusDataUnit(QModbusDataUnit::RegisterType::InputRegisters, registerAddress, size); if (QModbusReply *reply = m_modbusTcpClient->sendReadRequest(request, slaveAddress)) { if (!reply->isFinished()) { @@ -259,7 +259,7 @@ QUuid ModbusTCPMaster::readInputRegister(uint slaveAddress, uint registerAddress writeRequestExecuted(requestId, true); const QModbusDataUnit unit = reply->result(); uint modbusAddress = unit.startAddress(); - emit receivedInputRegister(reply->serverAddress(), modbusAddress, unit.value(0)); + emit receivedInputRegister(reply->serverAddress(), modbusAddress, unit.values()); } else { writeRequestExecuted(requestId, false); @@ -330,13 +330,18 @@ QUuid ModbusTCPMaster::readHoldingRegister(uint slaveAddress, uint registerAddre QUuid ModbusTCPMaster::writeCoil(uint slaveAddress, uint registerAddress, bool value) { + return writeCoils(slaveAddress, registerAddress, QVector() << static_cast(value)); +} + +QUuid ModbusTCPMaster::writeCoils(uint slaveAddress, uint registerAddress, const QVector &values) + { if (!m_modbusTcpClient) { return ""; } QUuid requestId = QUuid::createUuid(); - QModbusDataUnit request = QModbusDataUnit(QModbusDataUnit::RegisterType::Coils, registerAddress, 1); - request.setValue(0, static_cast(value)); + QModbusDataUnit request = QModbusDataUnit(QModbusDataUnit::RegisterType::Coils, registerAddress, values.length()); + request.setValues(values); if (QModbusReply *reply = m_modbusTcpClient->sendWriteRequest(request, slaveAddress)) { if (!reply->isFinished()) { @@ -347,7 +352,7 @@ QUuid ModbusTCPMaster::writeCoil(uint slaveAddress, uint registerAddress, bool v writeRequestExecuted(requestId, true); const QModbusDataUnit unit = reply->result(); uint modbusAddress = unit.startAddress(); - emit receivedCoil(reply->serverAddress(), modbusAddress, unit.value(0)); + emit receivedCoil(reply->serverAddress(), modbusAddress, unit.values()); } else { writeRequestExecuted(requestId, false); diff --git a/modbus/modbustcpmaster.h b/modbus/modbustcpmaster.h index c0312ee..0166c88 100644 --- a/modbus/modbustcpmaster.h +++ b/modbus/modbustcpmaster.h @@ -48,12 +48,13 @@ public: void setNumberOfRetries(int number); void setTimeout(int timeout); - QUuid readCoil(uint slaveAddress, uint registerAddress); - QUuid readDiscreteInput(uint slaveAddress, uint registerAddress); - QUuid readInputRegister(uint slaveAddress, uint registerAddress); + QUuid readCoil(uint slaveAddress, uint registerAddress, uint size = 1); + QUuid readDiscreteInput(uint slaveAddress, uint registerAddress, uint size = 1); + QUuid readInputRegister(uint slaveAddress, uint registerAddress, uint size = 1); QUuid readHoldingRegister(uint slaveAddress, uint registerAddress, uint size = 1); QUuid writeCoil(uint slaveAddress, uint registerAddress, bool status); + QUuid writeCoils(uint slaveAddress, uint registerAddress, const QVector &values); QUuid writeHoldingRegister(uint slaveAddress, uint registerAddress, quint16 value); QUuid writeHoldingRegisters(uint slaveAddress, uint registerAddress, const QVector &values); @@ -63,7 +64,6 @@ public: bool setHostAddress(const QHostAddress &hostAddress); bool setPort(uint port); - private: QTimer *m_reconnectTimer = nullptr; QModbusTcpClient *m_modbusTcpClient; @@ -80,10 +80,10 @@ signals: void writeRequestExecuted(const QUuid &requestId, bool success); void writeRequestError(const QUuid &requestId, const QString &error); - void receivedCoil(uint slaveAddress, uint modbusRegister, bool value); - void receivedDiscreteInput(uint slaveAddress, uint modbusRegister, bool value); + void receivedCoil(uint slaveAddress, uint modbusRegister, const QVector &values); + void receivedDiscreteInput(uint slaveAddress, uint modbusRegister, const QVector &values); void receivedHoldingRegister(uint slaveAddress, uint modbusRegister, const QVector &values); - void receivedInputRegister(uint slaveAddress, uint modbusRegister, uint value); + void receivedInputRegister(uint slaveAddress, uint modbusRegister, const QVector &values); }; #endif // MODBUSTCPMASTER_H diff --git a/modbuscommander/integrationpluginmodbuscommander.cpp b/modbuscommander/integrationpluginmodbuscommander.cpp index fffca4b..847ea42 100644 --- a/modbuscommander/integrationpluginmodbuscommander.cpp +++ b/modbuscommander/integrationpluginmodbuscommander.cpp @@ -358,7 +358,7 @@ void IntegrationPluginModbusCommander::onRequestError(QUuid requestId, const QSt } } -void IntegrationPluginModbusCommander::onReceivedCoil(quint32 slaveAddress, quint32 modbusRegister, bool value) +void IntegrationPluginModbusCommander::onReceivedCoil(quint32 slaveAddress, quint32 modbusRegister, const QVector &values) { auto modbus = sender(); @@ -368,7 +368,7 @@ void IntegrationPluginModbusCommander::onReceivedCoil(quint32 slaveAddress, quin if (thing->thingClassId() == coilThingClassId) { if ((thing->paramValue(m_slaveAddressParamTypeId.value(thing->thingClassId())) == slaveAddress) && (thing->paramValue(m_registerAddressParamTypeId.value(thing->thingClassId())) == modbusRegister)) { - thing->setStateValue(m_valueStateTypeId.value(thing->thingClassId()), value); + thing->setStateValue(m_valueStateTypeId.value(thing->thingClassId()), values[0]); thing->setStateValue(m_connectedStateTypeId.value(thing->thingClassId()), true); return; } @@ -380,7 +380,7 @@ void IntegrationPluginModbusCommander::onReceivedCoil(quint32 slaveAddress, quin if (thing->thingClassId() == coilThingClassId) { if ((thing->paramValue(m_slaveAddressParamTypeId.value(thing->thingClassId())) == slaveAddress) && (thing->paramValue(m_registerAddressParamTypeId.value(thing->thingClassId())) == modbusRegister)) { - thing->setStateValue(m_valueStateTypeId.value(thing->thingClassId()), value); + thing->setStateValue(m_valueStateTypeId.value(thing->thingClassId()), values[0]); thing->setStateValue(m_connectedStateTypeId.value(thing->thingClassId()), true); return; } @@ -389,7 +389,7 @@ void IntegrationPluginModbusCommander::onReceivedCoil(quint32 slaveAddress, quin } } -void IntegrationPluginModbusCommander::onReceivedDiscreteInput(quint32 slaveAddress, quint32 modbusRegister, bool value) +void IntegrationPluginModbusCommander::onReceivedDiscreteInput(quint32 slaveAddress, quint32 modbusRegister, const QVector &values) { auto modbus = sender(); @@ -399,7 +399,7 @@ void IntegrationPluginModbusCommander::onReceivedDiscreteInput(quint32 slaveAddr if (thing->thingClassId() == discreteInputThingClassId) { if ((thing->paramValue(m_slaveAddressParamTypeId.value(thing->thingClassId())) == slaveAddress) && (thing->paramValue(m_registerAddressParamTypeId.value(thing->thingClassId())) == modbusRegister)) { - thing->setStateValue(m_valueStateTypeId.value(thing->thingClassId()), value); + thing->setStateValue(m_valueStateTypeId.value(thing->thingClassId()), values[0]); thing->setStateValue(m_connectedStateTypeId.value(thing->thingClassId()), true); return; } @@ -411,7 +411,7 @@ void IntegrationPluginModbusCommander::onReceivedDiscreteInput(quint32 slaveAddr if (thing->thingClassId() == discreteInputThingClassId) { if ((thing->paramValue(m_slaveAddressParamTypeId.value(thing->thingClassId())) == slaveAddress) && (thing->paramValue(m_registerAddressParamTypeId.value(thing->thingClassId())) == modbusRegister)) { - thing->setStateValue(m_valueStateTypeId.value(thing->thingClassId()), value); + thing->setStateValue(m_valueStateTypeId.value(thing->thingClassId()), values[0]); thing->setStateValue(m_connectedStateTypeId.value(thing->thingClassId()), true); return; } @@ -451,7 +451,7 @@ void IntegrationPluginModbusCommander::onReceivedHoldingRegister(uint slaveAddre } } -void IntegrationPluginModbusCommander::onReceivedInputRegister(uint slaveAddress, uint modbusRegister, int value) +void IntegrationPluginModbusCommander::onReceivedInputRegister(uint slaveAddress, uint modbusRegister, const QVector &values) { auto modbus = sender(); @@ -461,7 +461,7 @@ void IntegrationPluginModbusCommander::onReceivedInputRegister(uint slaveAddress if (thing->thingClassId() == inputRegisterThingClassId) { if ((thing->paramValue(m_slaveAddressParamTypeId.value(thing->thingClassId())) == slaveAddress) && (thing->paramValue(m_registerAddressParamTypeId.value(thing->thingClassId())) == modbusRegister)) { - thing->setStateValue(m_valueStateTypeId.value(thing->thingClassId()), value); + thing->setStateValue(m_valueStateTypeId.value(thing->thingClassId()), values[0]); thing->setStateValue(m_connectedStateTypeId.value(thing->thingClassId()), true); return; } @@ -473,7 +473,7 @@ void IntegrationPluginModbusCommander::onReceivedInputRegister(uint slaveAddress if (thing->thingClassId() == inputRegisterThingClassId) { if ((thing->paramValue(m_slaveAddressParamTypeId.value(thing->thingClassId())) == slaveAddress) && (thing->paramValue(m_registerAddressParamTypeId.value(thing->thingClassId())) == modbusRegister)) { - thing->setStateValue(m_valueStateTypeId.value(thing->thingClassId()), value); + thing->setStateValue(m_valueStateTypeId.value(thing->thingClassId()), values[0]); thing->setStateValue(m_connectedStateTypeId.value(thing->thingClassId()), true); return; } diff --git a/modbuscommander/integrationpluginmodbuscommander.h b/modbuscommander/integrationpluginmodbuscommander.h index 45b393e..7fed22f 100644 --- a/modbuscommander/integrationpluginmodbuscommander.h +++ b/modbuscommander/integrationpluginmodbuscommander.h @@ -84,10 +84,11 @@ private slots: void onConnectionStateChanged(bool status); void onRequestExecuted(QUuid requestId, bool success); void onRequestError(QUuid requestId, const QString &error); - void onReceivedCoil(quint32 slaveAddress, quint32 modbusRegister, bool value); - void onReceivedDiscreteInput(quint32 slaveAddress, quint32 modbusRegister, bool value); + + void onReceivedCoil(quint32 slaveAddress, quint32 modbusRegister, const QVector &values); + void onReceivedDiscreteInput(quint32 slaveAddress, quint32 modbusRegister, const QVector &values); void onReceivedHoldingRegister(uint slaveAddress, uint modbusRegister, const QVector &values); - void onReceivedInputRegister(quint32 slaveAddress, quint32 modbusRegister, int value); + void onReceivedInputRegister(quint32 slaveAddress, quint32 modbusRegister, const QVector &values); }; #endif // INTEGRATIONPLUGINMODBUSCOMMANDER_H