764 lines
29 KiB
C++
764 lines
29 KiB
C++
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
|
*
|
|
* Copyright 2013 - 2025, nymea GmbH
|
|
* Contact: contact@nymea.io
|
|
*
|
|
* This fileDescriptor 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 <https://www.gnu.org/licenses/>.
|
|
*
|
|
* 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 "sunspecnameplatemodel.h"
|
|
#include "sunspecconnection.h"
|
|
|
|
SunSpecNameplateModel::SunSpecNameplateModel(SunSpecConnection *connection, quint16 modbusStartRegister, quint16 modelLength, SunSpecDataPoint::ByteOrder byteOrder, QObject *parent) :
|
|
SunSpecModel(connection, modbusStartRegister, 120, modelLength, byteOrder, parent)
|
|
{
|
|
m_modelBlockType = SunSpecModel::ModelBlockTypeFixed;
|
|
|
|
initDataPoints();
|
|
}
|
|
|
|
SunSpecNameplateModel::~SunSpecNameplateModel()
|
|
{
|
|
|
|
}
|
|
|
|
QString SunSpecNameplateModel::name() const
|
|
{
|
|
return "nameplate";
|
|
}
|
|
|
|
QString SunSpecNameplateModel::description() const
|
|
{
|
|
return "Inverter Controls Nameplate Ratings ";
|
|
}
|
|
|
|
QString SunSpecNameplateModel::label() const
|
|
{
|
|
return "Nameplate";
|
|
}
|
|
|
|
SunSpecNameplateModel::Dertyp SunSpecNameplateModel::derTyp() const
|
|
{
|
|
return m_derTyp;
|
|
}
|
|
float SunSpecNameplateModel::wRtg() const
|
|
{
|
|
return m_wRtg;
|
|
}
|
|
qint16 SunSpecNameplateModel::wRtgSf() const
|
|
{
|
|
return m_wRtgSf;
|
|
}
|
|
float SunSpecNameplateModel::vaRtg() const
|
|
{
|
|
return m_vaRtg;
|
|
}
|
|
qint16 SunSpecNameplateModel::vaRtgSf() const
|
|
{
|
|
return m_vaRtgSf;
|
|
}
|
|
float SunSpecNameplateModel::vArRtgQ1() const
|
|
{
|
|
return m_vArRtgQ1;
|
|
}
|
|
float SunSpecNameplateModel::vArRtgQ2() const
|
|
{
|
|
return m_vArRtgQ2;
|
|
}
|
|
float SunSpecNameplateModel::vArRtgQ3() const
|
|
{
|
|
return m_vArRtgQ3;
|
|
}
|
|
float SunSpecNameplateModel::vArRtgQ4() const
|
|
{
|
|
return m_vArRtgQ4;
|
|
}
|
|
qint16 SunSpecNameplateModel::vArRtgSf() const
|
|
{
|
|
return m_vArRtgSf;
|
|
}
|
|
float SunSpecNameplateModel::aRtg() const
|
|
{
|
|
return m_aRtg;
|
|
}
|
|
qint16 SunSpecNameplateModel::aRtgSf() const
|
|
{
|
|
return m_aRtgSf;
|
|
}
|
|
float SunSpecNameplateModel::pfRtgQ1() const
|
|
{
|
|
return m_pfRtgQ1;
|
|
}
|
|
float SunSpecNameplateModel::pfRtgQ2() const
|
|
{
|
|
return m_pfRtgQ2;
|
|
}
|
|
float SunSpecNameplateModel::pfRtgQ3() const
|
|
{
|
|
return m_pfRtgQ3;
|
|
}
|
|
float SunSpecNameplateModel::pfRtgQ4() const
|
|
{
|
|
return m_pfRtgQ4;
|
|
}
|
|
qint16 SunSpecNameplateModel::pfRtgSf() const
|
|
{
|
|
return m_pfRtgSf;
|
|
}
|
|
float SunSpecNameplateModel::whRtg() const
|
|
{
|
|
return m_whRtg;
|
|
}
|
|
qint16 SunSpecNameplateModel::whRtgSf() const
|
|
{
|
|
return m_whRtgSf;
|
|
}
|
|
float SunSpecNameplateModel::ahrRtg() const
|
|
{
|
|
return m_ahrRtg;
|
|
}
|
|
qint16 SunSpecNameplateModel::ahrRtgSf() const
|
|
{
|
|
return m_ahrRtgSf;
|
|
}
|
|
float SunSpecNameplateModel::maxChaRte() const
|
|
{
|
|
return m_maxChaRte;
|
|
}
|
|
qint16 SunSpecNameplateModel::maxChaRteSf() const
|
|
{
|
|
return m_maxChaRteSf;
|
|
}
|
|
float SunSpecNameplateModel::maxDisChaRte() const
|
|
{
|
|
return m_maxDisChaRte;
|
|
}
|
|
qint16 SunSpecNameplateModel::maxDisChaRteSf() const
|
|
{
|
|
return m_maxDisChaRteSf;
|
|
}
|
|
quint16 SunSpecNameplateModel::pad() const
|
|
{
|
|
return m_pad;
|
|
}
|
|
void SunSpecNameplateModel::initDataPoints()
|
|
{
|
|
SunSpecDataPoint modelIdDataPoint;
|
|
modelIdDataPoint.setName("ID");
|
|
modelIdDataPoint.setLabel("Model ID");
|
|
modelIdDataPoint.setDescription("Model identifier");
|
|
modelIdDataPoint.setMandatory(true);
|
|
modelIdDataPoint.setSize(1);
|
|
modelIdDataPoint.setAddressOffset(0);
|
|
modelIdDataPoint.setSunSpecDataType("uint16");
|
|
modelIdDataPoint.setByteOrder(m_byteOrder);
|
|
m_dataPoints.insert(modelIdDataPoint.name(), modelIdDataPoint);
|
|
|
|
SunSpecDataPoint modelLengthDataPoint;
|
|
modelLengthDataPoint.setName("L");
|
|
modelLengthDataPoint.setLabel("Model Length");
|
|
modelLengthDataPoint.setDescription("Model length");
|
|
modelLengthDataPoint.setMandatory(true);
|
|
modelLengthDataPoint.setSize(1);
|
|
modelLengthDataPoint.setAddressOffset(1);
|
|
modelLengthDataPoint.setSunSpecDataType("uint16");
|
|
modelLengthDataPoint.setByteOrder(m_byteOrder);
|
|
m_dataPoints.insert(modelLengthDataPoint.name(), modelLengthDataPoint);
|
|
|
|
SunSpecDataPoint derTypDataPoint;
|
|
derTypDataPoint.setName("DERTyp");
|
|
derTypDataPoint.setLabel("DERTyp");
|
|
derTypDataPoint.setDescription("Type of DER device. Default value is 4 to indicate PV device.");
|
|
derTypDataPoint.setMandatory(true);
|
|
derTypDataPoint.setSize(1);
|
|
derTypDataPoint.setAddressOffset(2);
|
|
derTypDataPoint.setBlockOffset(0);
|
|
derTypDataPoint.setSunSpecDataType("enum16");
|
|
derTypDataPoint.setByteOrder(m_byteOrder);
|
|
m_dataPoints.insert(derTypDataPoint.name(), derTypDataPoint);
|
|
|
|
SunSpecDataPoint wRtgDataPoint;
|
|
wRtgDataPoint.setName("WRtg");
|
|
wRtgDataPoint.setLabel("WRtg");
|
|
wRtgDataPoint.setDescription("Continuous power output capability of the inverter.");
|
|
wRtgDataPoint.setUnits("W");
|
|
wRtgDataPoint.setMandatory(true);
|
|
wRtgDataPoint.setSize(1);
|
|
wRtgDataPoint.setAddressOffset(3);
|
|
wRtgDataPoint.setBlockOffset(1);
|
|
wRtgDataPoint.setScaleFactorName("WRtg_SF");
|
|
wRtgDataPoint.setSunSpecDataType("uint16");
|
|
wRtgDataPoint.setByteOrder(m_byteOrder);
|
|
m_dataPoints.insert(wRtgDataPoint.name(), wRtgDataPoint);
|
|
|
|
SunSpecDataPoint wRtgSfDataPoint;
|
|
wRtgSfDataPoint.setName("WRtg_SF");
|
|
wRtgSfDataPoint.setLabel("WRtg_SF");
|
|
wRtgSfDataPoint.setDescription("Scale factor");
|
|
wRtgSfDataPoint.setMandatory(true);
|
|
wRtgSfDataPoint.setSize(1);
|
|
wRtgSfDataPoint.setAddressOffset(4);
|
|
wRtgSfDataPoint.setBlockOffset(2);
|
|
wRtgSfDataPoint.setSunSpecDataType("sunssf");
|
|
wRtgSfDataPoint.setByteOrder(m_byteOrder);
|
|
m_dataPoints.insert(wRtgSfDataPoint.name(), wRtgSfDataPoint);
|
|
|
|
SunSpecDataPoint vaRtgDataPoint;
|
|
vaRtgDataPoint.setName("VARtg");
|
|
vaRtgDataPoint.setLabel("VARtg");
|
|
vaRtgDataPoint.setDescription("Continuous Volt-Ampere capability of the inverter.");
|
|
vaRtgDataPoint.setUnits("VA");
|
|
vaRtgDataPoint.setMandatory(true);
|
|
vaRtgDataPoint.setSize(1);
|
|
vaRtgDataPoint.setAddressOffset(5);
|
|
vaRtgDataPoint.setBlockOffset(3);
|
|
vaRtgDataPoint.setScaleFactorName("VARtg_SF");
|
|
vaRtgDataPoint.setSunSpecDataType("uint16");
|
|
vaRtgDataPoint.setByteOrder(m_byteOrder);
|
|
m_dataPoints.insert(vaRtgDataPoint.name(), vaRtgDataPoint);
|
|
|
|
SunSpecDataPoint vaRtgSfDataPoint;
|
|
vaRtgSfDataPoint.setName("VARtg_SF");
|
|
vaRtgSfDataPoint.setLabel("VARtg_SF");
|
|
vaRtgSfDataPoint.setDescription("Scale factor");
|
|
vaRtgSfDataPoint.setMandatory(true);
|
|
vaRtgSfDataPoint.setSize(1);
|
|
vaRtgSfDataPoint.setAddressOffset(6);
|
|
vaRtgSfDataPoint.setBlockOffset(4);
|
|
vaRtgSfDataPoint.setSunSpecDataType("sunssf");
|
|
vaRtgSfDataPoint.setByteOrder(m_byteOrder);
|
|
m_dataPoints.insert(vaRtgSfDataPoint.name(), vaRtgSfDataPoint);
|
|
|
|
SunSpecDataPoint vArRtgQ1DataPoint;
|
|
vArRtgQ1DataPoint.setName("VArRtgQ1");
|
|
vArRtgQ1DataPoint.setLabel("VArRtgQ1");
|
|
vArRtgQ1DataPoint.setDescription("Continuous VAR capability of the inverter in quadrant 1.");
|
|
vArRtgQ1DataPoint.setUnits("var");
|
|
vArRtgQ1DataPoint.setMandatory(true);
|
|
vArRtgQ1DataPoint.setSize(1);
|
|
vArRtgQ1DataPoint.setAddressOffset(7);
|
|
vArRtgQ1DataPoint.setBlockOffset(5);
|
|
vArRtgQ1DataPoint.setScaleFactorName("VArRtg_SF");
|
|
vArRtgQ1DataPoint.setSunSpecDataType("int16");
|
|
vArRtgQ1DataPoint.setByteOrder(m_byteOrder);
|
|
m_dataPoints.insert(vArRtgQ1DataPoint.name(), vArRtgQ1DataPoint);
|
|
|
|
SunSpecDataPoint vArRtgQ2DataPoint;
|
|
vArRtgQ2DataPoint.setName("VArRtgQ2");
|
|
vArRtgQ2DataPoint.setLabel("VArRtgQ2");
|
|
vArRtgQ2DataPoint.setDescription("Continuous VAR capability of the inverter in quadrant 2.");
|
|
vArRtgQ2DataPoint.setUnits("var");
|
|
vArRtgQ2DataPoint.setMandatory(true);
|
|
vArRtgQ2DataPoint.setSize(1);
|
|
vArRtgQ2DataPoint.setAddressOffset(8);
|
|
vArRtgQ2DataPoint.setBlockOffset(6);
|
|
vArRtgQ2DataPoint.setScaleFactorName("VArRtg_SF");
|
|
vArRtgQ2DataPoint.setSunSpecDataType("int16");
|
|
vArRtgQ2DataPoint.setByteOrder(m_byteOrder);
|
|
m_dataPoints.insert(vArRtgQ2DataPoint.name(), vArRtgQ2DataPoint);
|
|
|
|
SunSpecDataPoint vArRtgQ3DataPoint;
|
|
vArRtgQ3DataPoint.setName("VArRtgQ3");
|
|
vArRtgQ3DataPoint.setLabel("VArRtgQ3");
|
|
vArRtgQ3DataPoint.setDescription("Continuous VAR capability of the inverter in quadrant 3.");
|
|
vArRtgQ3DataPoint.setUnits("var");
|
|
vArRtgQ3DataPoint.setMandatory(true);
|
|
vArRtgQ3DataPoint.setSize(1);
|
|
vArRtgQ3DataPoint.setAddressOffset(9);
|
|
vArRtgQ3DataPoint.setBlockOffset(7);
|
|
vArRtgQ3DataPoint.setScaleFactorName("VArRtg_SF");
|
|
vArRtgQ3DataPoint.setSunSpecDataType("int16");
|
|
vArRtgQ3DataPoint.setByteOrder(m_byteOrder);
|
|
m_dataPoints.insert(vArRtgQ3DataPoint.name(), vArRtgQ3DataPoint);
|
|
|
|
SunSpecDataPoint vArRtgQ4DataPoint;
|
|
vArRtgQ4DataPoint.setName("VArRtgQ4");
|
|
vArRtgQ4DataPoint.setLabel("VArRtgQ4");
|
|
vArRtgQ4DataPoint.setDescription("Continuous VAR capability of the inverter in quadrant 4.");
|
|
vArRtgQ4DataPoint.setUnits("var");
|
|
vArRtgQ4DataPoint.setMandatory(true);
|
|
vArRtgQ4DataPoint.setSize(1);
|
|
vArRtgQ4DataPoint.setAddressOffset(10);
|
|
vArRtgQ4DataPoint.setBlockOffset(8);
|
|
vArRtgQ4DataPoint.setScaleFactorName("VArRtg_SF");
|
|
vArRtgQ4DataPoint.setSunSpecDataType("int16");
|
|
vArRtgQ4DataPoint.setByteOrder(m_byteOrder);
|
|
m_dataPoints.insert(vArRtgQ4DataPoint.name(), vArRtgQ4DataPoint);
|
|
|
|
SunSpecDataPoint vArRtgSfDataPoint;
|
|
vArRtgSfDataPoint.setName("VArRtg_SF");
|
|
vArRtgSfDataPoint.setLabel("VArRtg_SF");
|
|
vArRtgSfDataPoint.setDescription("Scale factor");
|
|
vArRtgSfDataPoint.setMandatory(true);
|
|
vArRtgSfDataPoint.setSize(1);
|
|
vArRtgSfDataPoint.setAddressOffset(11);
|
|
vArRtgSfDataPoint.setBlockOffset(9);
|
|
vArRtgSfDataPoint.setSunSpecDataType("sunssf");
|
|
vArRtgSfDataPoint.setByteOrder(m_byteOrder);
|
|
m_dataPoints.insert(vArRtgSfDataPoint.name(), vArRtgSfDataPoint);
|
|
|
|
SunSpecDataPoint aRtgDataPoint;
|
|
aRtgDataPoint.setName("ARtg");
|
|
aRtgDataPoint.setLabel("ARtg");
|
|
aRtgDataPoint.setDescription("Maximum RMS AC current level capability of the inverter.");
|
|
aRtgDataPoint.setUnits("A");
|
|
aRtgDataPoint.setMandatory(true);
|
|
aRtgDataPoint.setSize(1);
|
|
aRtgDataPoint.setAddressOffset(12);
|
|
aRtgDataPoint.setBlockOffset(10);
|
|
aRtgDataPoint.setScaleFactorName("ARtg_SF");
|
|
aRtgDataPoint.setSunSpecDataType("uint16");
|
|
aRtgDataPoint.setByteOrder(m_byteOrder);
|
|
m_dataPoints.insert(aRtgDataPoint.name(), aRtgDataPoint);
|
|
|
|
SunSpecDataPoint aRtgSfDataPoint;
|
|
aRtgSfDataPoint.setName("ARtg_SF");
|
|
aRtgSfDataPoint.setLabel("ARtg_SF");
|
|
aRtgSfDataPoint.setDescription("Scale factor");
|
|
aRtgSfDataPoint.setMandatory(true);
|
|
aRtgSfDataPoint.setSize(1);
|
|
aRtgSfDataPoint.setAddressOffset(13);
|
|
aRtgSfDataPoint.setBlockOffset(11);
|
|
aRtgSfDataPoint.setSunSpecDataType("sunssf");
|
|
aRtgSfDataPoint.setByteOrder(m_byteOrder);
|
|
m_dataPoints.insert(aRtgSfDataPoint.name(), aRtgSfDataPoint);
|
|
|
|
SunSpecDataPoint pfRtgQ1DataPoint;
|
|
pfRtgQ1DataPoint.setName("PFRtgQ1");
|
|
pfRtgQ1DataPoint.setLabel("PFRtgQ1");
|
|
pfRtgQ1DataPoint.setDescription("Minimum power factor capability of the inverter in quadrant 1.");
|
|
pfRtgQ1DataPoint.setUnits("cos()");
|
|
pfRtgQ1DataPoint.setMandatory(true);
|
|
pfRtgQ1DataPoint.setSize(1);
|
|
pfRtgQ1DataPoint.setAddressOffset(14);
|
|
pfRtgQ1DataPoint.setBlockOffset(12);
|
|
pfRtgQ1DataPoint.setScaleFactorName("PFRtg_SF");
|
|
pfRtgQ1DataPoint.setSunSpecDataType("int16");
|
|
pfRtgQ1DataPoint.setByteOrder(m_byteOrder);
|
|
m_dataPoints.insert(pfRtgQ1DataPoint.name(), pfRtgQ1DataPoint);
|
|
|
|
SunSpecDataPoint pfRtgQ2DataPoint;
|
|
pfRtgQ2DataPoint.setName("PFRtgQ2");
|
|
pfRtgQ2DataPoint.setLabel("PFRtgQ2");
|
|
pfRtgQ2DataPoint.setDescription("Minimum power factor capability of the inverter in quadrant 2.");
|
|
pfRtgQ2DataPoint.setUnits("cos()");
|
|
pfRtgQ2DataPoint.setMandatory(true);
|
|
pfRtgQ2DataPoint.setSize(1);
|
|
pfRtgQ2DataPoint.setAddressOffset(15);
|
|
pfRtgQ2DataPoint.setBlockOffset(13);
|
|
pfRtgQ2DataPoint.setScaleFactorName("PFRtg_SF");
|
|
pfRtgQ2DataPoint.setSunSpecDataType("int16");
|
|
pfRtgQ2DataPoint.setByteOrder(m_byteOrder);
|
|
m_dataPoints.insert(pfRtgQ2DataPoint.name(), pfRtgQ2DataPoint);
|
|
|
|
SunSpecDataPoint pfRtgQ3DataPoint;
|
|
pfRtgQ3DataPoint.setName("PFRtgQ3");
|
|
pfRtgQ3DataPoint.setLabel("PFRtgQ3");
|
|
pfRtgQ3DataPoint.setDescription("Minimum power factor capability of the inverter in quadrant 3.");
|
|
pfRtgQ3DataPoint.setUnits("cos()");
|
|
pfRtgQ3DataPoint.setMandatory(true);
|
|
pfRtgQ3DataPoint.setSize(1);
|
|
pfRtgQ3DataPoint.setAddressOffset(16);
|
|
pfRtgQ3DataPoint.setBlockOffset(14);
|
|
pfRtgQ3DataPoint.setScaleFactorName("PFRtg_SF");
|
|
pfRtgQ3DataPoint.setSunSpecDataType("int16");
|
|
pfRtgQ3DataPoint.setByteOrder(m_byteOrder);
|
|
m_dataPoints.insert(pfRtgQ3DataPoint.name(), pfRtgQ3DataPoint);
|
|
|
|
SunSpecDataPoint pfRtgQ4DataPoint;
|
|
pfRtgQ4DataPoint.setName("PFRtgQ4");
|
|
pfRtgQ4DataPoint.setLabel("PFRtgQ4");
|
|
pfRtgQ4DataPoint.setDescription("Minimum power factor capability of the inverter in quadrant 4.");
|
|
pfRtgQ4DataPoint.setUnits("cos()");
|
|
pfRtgQ4DataPoint.setMandatory(true);
|
|
pfRtgQ4DataPoint.setSize(1);
|
|
pfRtgQ4DataPoint.setAddressOffset(17);
|
|
pfRtgQ4DataPoint.setBlockOffset(15);
|
|
pfRtgQ4DataPoint.setScaleFactorName("PFRtg_SF");
|
|
pfRtgQ4DataPoint.setSunSpecDataType("int16");
|
|
pfRtgQ4DataPoint.setByteOrder(m_byteOrder);
|
|
m_dataPoints.insert(pfRtgQ4DataPoint.name(), pfRtgQ4DataPoint);
|
|
|
|
SunSpecDataPoint pfRtgSfDataPoint;
|
|
pfRtgSfDataPoint.setName("PFRtg_SF");
|
|
pfRtgSfDataPoint.setLabel("PFRtg_SF");
|
|
pfRtgSfDataPoint.setDescription("Scale factor");
|
|
pfRtgSfDataPoint.setMandatory(true);
|
|
pfRtgSfDataPoint.setSize(1);
|
|
pfRtgSfDataPoint.setAddressOffset(18);
|
|
pfRtgSfDataPoint.setBlockOffset(16);
|
|
pfRtgSfDataPoint.setSunSpecDataType("sunssf");
|
|
pfRtgSfDataPoint.setByteOrder(m_byteOrder);
|
|
m_dataPoints.insert(pfRtgSfDataPoint.name(), pfRtgSfDataPoint);
|
|
|
|
SunSpecDataPoint whRtgDataPoint;
|
|
whRtgDataPoint.setName("WHRtg");
|
|
whRtgDataPoint.setLabel("WHRtg");
|
|
whRtgDataPoint.setDescription("Nominal energy rating of storage device.");
|
|
whRtgDataPoint.setUnits("Wh");
|
|
whRtgDataPoint.setSize(1);
|
|
whRtgDataPoint.setAddressOffset(19);
|
|
whRtgDataPoint.setBlockOffset(17);
|
|
whRtgDataPoint.setScaleFactorName("WHRtg_SF");
|
|
whRtgDataPoint.setSunSpecDataType("uint16");
|
|
whRtgDataPoint.setByteOrder(m_byteOrder);
|
|
m_dataPoints.insert(whRtgDataPoint.name(), whRtgDataPoint);
|
|
|
|
SunSpecDataPoint whRtgSfDataPoint;
|
|
whRtgSfDataPoint.setName("WHRtg_SF");
|
|
whRtgSfDataPoint.setLabel("WHRtg_SF");
|
|
whRtgSfDataPoint.setDescription("Scale factor");
|
|
whRtgSfDataPoint.setSize(1);
|
|
whRtgSfDataPoint.setAddressOffset(20);
|
|
whRtgSfDataPoint.setBlockOffset(18);
|
|
whRtgSfDataPoint.setSunSpecDataType("sunssf");
|
|
whRtgSfDataPoint.setByteOrder(m_byteOrder);
|
|
m_dataPoints.insert(whRtgSfDataPoint.name(), whRtgSfDataPoint);
|
|
|
|
SunSpecDataPoint ahrRtgDataPoint;
|
|
ahrRtgDataPoint.setName("AhrRtg");
|
|
ahrRtgDataPoint.setLabel("AhrRtg");
|
|
ahrRtgDataPoint.setDescription("The usable capacity of the battery. Maximum charge minus minimum charge from a technology capability perspective (Amp-hour capacity rating).");
|
|
ahrRtgDataPoint.setUnits("AH");
|
|
ahrRtgDataPoint.setSize(1);
|
|
ahrRtgDataPoint.setAddressOffset(21);
|
|
ahrRtgDataPoint.setBlockOffset(19);
|
|
ahrRtgDataPoint.setScaleFactorName("AhrRtg_SF");
|
|
ahrRtgDataPoint.setSunSpecDataType("uint16");
|
|
ahrRtgDataPoint.setByteOrder(m_byteOrder);
|
|
m_dataPoints.insert(ahrRtgDataPoint.name(), ahrRtgDataPoint);
|
|
|
|
SunSpecDataPoint ahrRtgSfDataPoint;
|
|
ahrRtgSfDataPoint.setName("AhrRtg_SF");
|
|
ahrRtgSfDataPoint.setLabel("AhrRtg_SF");
|
|
ahrRtgSfDataPoint.setDescription("Scale factor for amp-hour rating.");
|
|
ahrRtgSfDataPoint.setSize(1);
|
|
ahrRtgSfDataPoint.setAddressOffset(22);
|
|
ahrRtgSfDataPoint.setBlockOffset(20);
|
|
ahrRtgSfDataPoint.setSunSpecDataType("sunssf");
|
|
ahrRtgSfDataPoint.setByteOrder(m_byteOrder);
|
|
m_dataPoints.insert(ahrRtgSfDataPoint.name(), ahrRtgSfDataPoint);
|
|
|
|
SunSpecDataPoint maxChaRteDataPoint;
|
|
maxChaRteDataPoint.setName("MaxChaRte");
|
|
maxChaRteDataPoint.setLabel("MaxChaRte");
|
|
maxChaRteDataPoint.setDescription("Maximum rate of energy transfer into the storage device.");
|
|
maxChaRteDataPoint.setUnits("W");
|
|
maxChaRteDataPoint.setSize(1);
|
|
maxChaRteDataPoint.setAddressOffset(23);
|
|
maxChaRteDataPoint.setBlockOffset(21);
|
|
maxChaRteDataPoint.setScaleFactorName("MaxChaRte_SF");
|
|
maxChaRteDataPoint.setSunSpecDataType("uint16");
|
|
maxChaRteDataPoint.setByteOrder(m_byteOrder);
|
|
m_dataPoints.insert(maxChaRteDataPoint.name(), maxChaRteDataPoint);
|
|
|
|
SunSpecDataPoint maxChaRteSfDataPoint;
|
|
maxChaRteSfDataPoint.setName("MaxChaRte_SF");
|
|
maxChaRteSfDataPoint.setLabel("MaxChaRte_SF");
|
|
maxChaRteSfDataPoint.setDescription("Scale factor");
|
|
maxChaRteSfDataPoint.setSize(1);
|
|
maxChaRteSfDataPoint.setAddressOffset(24);
|
|
maxChaRteSfDataPoint.setBlockOffset(22);
|
|
maxChaRteSfDataPoint.setSunSpecDataType("sunssf");
|
|
maxChaRteSfDataPoint.setByteOrder(m_byteOrder);
|
|
m_dataPoints.insert(maxChaRteSfDataPoint.name(), maxChaRteSfDataPoint);
|
|
|
|
SunSpecDataPoint maxDisChaRteDataPoint;
|
|
maxDisChaRteDataPoint.setName("MaxDisChaRte");
|
|
maxDisChaRteDataPoint.setLabel("MaxDisChaRte");
|
|
maxDisChaRteDataPoint.setDescription("Maximum rate of energy transfer out of the storage device.");
|
|
maxDisChaRteDataPoint.setUnits("W");
|
|
maxDisChaRteDataPoint.setSize(1);
|
|
maxDisChaRteDataPoint.setAddressOffset(25);
|
|
maxDisChaRteDataPoint.setBlockOffset(23);
|
|
maxDisChaRteDataPoint.setScaleFactorName("MaxDisChaRte_SF");
|
|
maxDisChaRteDataPoint.setSunSpecDataType("uint16");
|
|
maxDisChaRteDataPoint.setByteOrder(m_byteOrder);
|
|
m_dataPoints.insert(maxDisChaRteDataPoint.name(), maxDisChaRteDataPoint);
|
|
|
|
SunSpecDataPoint maxDisChaRteSfDataPoint;
|
|
maxDisChaRteSfDataPoint.setName("MaxDisChaRte_SF");
|
|
maxDisChaRteSfDataPoint.setLabel("MaxDisChaRte_SF");
|
|
maxDisChaRteSfDataPoint.setDescription("Scale factor");
|
|
maxDisChaRteSfDataPoint.setSize(1);
|
|
maxDisChaRteSfDataPoint.setAddressOffset(26);
|
|
maxDisChaRteSfDataPoint.setBlockOffset(24);
|
|
maxDisChaRteSfDataPoint.setSunSpecDataType("sunssf");
|
|
maxDisChaRteSfDataPoint.setByteOrder(m_byteOrder);
|
|
m_dataPoints.insert(maxDisChaRteSfDataPoint.name(), maxDisChaRteSfDataPoint);
|
|
|
|
SunSpecDataPoint padDataPoint;
|
|
padDataPoint.setName("Pad");
|
|
padDataPoint.setLabel("Pad");
|
|
padDataPoint.setDescription("Pad register.");
|
|
padDataPoint.setSize(1);
|
|
padDataPoint.setAddressOffset(27);
|
|
padDataPoint.setBlockOffset(25);
|
|
padDataPoint.setSunSpecDataType("pad");
|
|
padDataPoint.setByteOrder(m_byteOrder);
|
|
m_dataPoints.insert(padDataPoint.name(), padDataPoint);
|
|
|
|
}
|
|
|
|
void SunSpecNameplateModel::processBlockData()
|
|
{
|
|
// Scale factors
|
|
if (m_dataPoints.value("WRtg_SF").isValid())
|
|
m_wRtgSf = m_dataPoints.value("WRtg_SF").toInt16();
|
|
|
|
if (m_dataPoints.value("VARtg_SF").isValid())
|
|
m_vaRtgSf = m_dataPoints.value("VARtg_SF").toInt16();
|
|
|
|
if (m_dataPoints.value("VArRtg_SF").isValid())
|
|
m_vArRtgSf = m_dataPoints.value("VArRtg_SF").toInt16();
|
|
|
|
if (m_dataPoints.value("ARtg_SF").isValid())
|
|
m_aRtgSf = m_dataPoints.value("ARtg_SF").toInt16();
|
|
|
|
if (m_dataPoints.value("PFRtg_SF").isValid())
|
|
m_pfRtgSf = m_dataPoints.value("PFRtg_SF").toInt16();
|
|
|
|
if (m_dataPoints.value("WHRtg_SF").isValid())
|
|
m_whRtgSf = m_dataPoints.value("WHRtg_SF").toInt16();
|
|
|
|
if (m_dataPoints.value("AhrRtg_SF").isValid())
|
|
m_ahrRtgSf = m_dataPoints.value("AhrRtg_SF").toInt16();
|
|
|
|
if (m_dataPoints.value("MaxChaRte_SF").isValid())
|
|
m_maxChaRteSf = m_dataPoints.value("MaxChaRte_SF").toInt16();
|
|
|
|
if (m_dataPoints.value("MaxDisChaRte_SF").isValid())
|
|
m_maxDisChaRteSf = m_dataPoints.value("MaxDisChaRte_SF").toInt16();
|
|
|
|
|
|
// Update properties according to the data point type
|
|
if (m_dataPoints.value("DERTyp").isValid())
|
|
m_derTyp = static_cast<Dertyp>(m_dataPoints.value("DERTyp").toUInt16());
|
|
|
|
if (m_dataPoints.value("WRtg").isValid())
|
|
m_wRtg = m_dataPoints.value("WRtg").toFloatWithSSF(m_wRtgSf);
|
|
|
|
if (m_dataPoints.value("WRtg_SF").isValid())
|
|
m_wRtgSf = m_dataPoints.value("WRtg_SF").toInt16();
|
|
|
|
if (m_dataPoints.value("VARtg").isValid())
|
|
m_vaRtg = m_dataPoints.value("VARtg").toFloatWithSSF(m_vaRtgSf);
|
|
|
|
if (m_dataPoints.value("VARtg_SF").isValid())
|
|
m_vaRtgSf = m_dataPoints.value("VARtg_SF").toInt16();
|
|
|
|
if (m_dataPoints.value("VArRtgQ1").isValid())
|
|
m_vArRtgQ1 = m_dataPoints.value("VArRtgQ1").toFloatWithSSF(m_vArRtgSf);
|
|
|
|
if (m_dataPoints.value("VArRtgQ2").isValid())
|
|
m_vArRtgQ2 = m_dataPoints.value("VArRtgQ2").toFloatWithSSF(m_vArRtgSf);
|
|
|
|
if (m_dataPoints.value("VArRtgQ3").isValid())
|
|
m_vArRtgQ3 = m_dataPoints.value("VArRtgQ3").toFloatWithSSF(m_vArRtgSf);
|
|
|
|
if (m_dataPoints.value("VArRtgQ4").isValid())
|
|
m_vArRtgQ4 = m_dataPoints.value("VArRtgQ4").toFloatWithSSF(m_vArRtgSf);
|
|
|
|
if (m_dataPoints.value("VArRtg_SF").isValid())
|
|
m_vArRtgSf = m_dataPoints.value("VArRtg_SF").toInt16();
|
|
|
|
if (m_dataPoints.value("ARtg").isValid())
|
|
m_aRtg = m_dataPoints.value("ARtg").toFloatWithSSF(m_aRtgSf);
|
|
|
|
if (m_dataPoints.value("ARtg_SF").isValid())
|
|
m_aRtgSf = m_dataPoints.value("ARtg_SF").toInt16();
|
|
|
|
if (m_dataPoints.value("PFRtgQ1").isValid())
|
|
m_pfRtgQ1 = m_dataPoints.value("PFRtgQ1").toFloatWithSSF(m_pfRtgSf);
|
|
|
|
if (m_dataPoints.value("PFRtgQ2").isValid())
|
|
m_pfRtgQ2 = m_dataPoints.value("PFRtgQ2").toFloatWithSSF(m_pfRtgSf);
|
|
|
|
if (m_dataPoints.value("PFRtgQ3").isValid())
|
|
m_pfRtgQ3 = m_dataPoints.value("PFRtgQ3").toFloatWithSSF(m_pfRtgSf);
|
|
|
|
if (m_dataPoints.value("PFRtgQ4").isValid())
|
|
m_pfRtgQ4 = m_dataPoints.value("PFRtgQ4").toFloatWithSSF(m_pfRtgSf);
|
|
|
|
if (m_dataPoints.value("PFRtg_SF").isValid())
|
|
m_pfRtgSf = m_dataPoints.value("PFRtg_SF").toInt16();
|
|
|
|
if (m_dataPoints.value("WHRtg").isValid())
|
|
m_whRtg = m_dataPoints.value("WHRtg").toFloatWithSSF(m_whRtgSf);
|
|
|
|
if (m_dataPoints.value("WHRtg_SF").isValid())
|
|
m_whRtgSf = m_dataPoints.value("WHRtg_SF").toInt16();
|
|
|
|
if (m_dataPoints.value("AhrRtg").isValid())
|
|
m_ahrRtg = m_dataPoints.value("AhrRtg").toFloatWithSSF(m_ahrRtgSf);
|
|
|
|
if (m_dataPoints.value("AhrRtg_SF").isValid())
|
|
m_ahrRtgSf = m_dataPoints.value("AhrRtg_SF").toInt16();
|
|
|
|
if (m_dataPoints.value("MaxChaRte").isValid())
|
|
m_maxChaRte = m_dataPoints.value("MaxChaRte").toFloatWithSSF(m_maxChaRteSf);
|
|
|
|
if (m_dataPoints.value("MaxChaRte_SF").isValid())
|
|
m_maxChaRteSf = m_dataPoints.value("MaxChaRte_SF").toInt16();
|
|
|
|
if (m_dataPoints.value("MaxDisChaRte").isValid())
|
|
m_maxDisChaRte = m_dataPoints.value("MaxDisChaRte").toFloatWithSSF(m_maxDisChaRteSf);
|
|
|
|
if (m_dataPoints.value("MaxDisChaRte_SF").isValid())
|
|
m_maxDisChaRteSf = m_dataPoints.value("MaxDisChaRte_SF").toInt16();
|
|
|
|
if (m_dataPoints.value("Pad").isValid())
|
|
m_pad = m_dataPoints.value("Pad").toUInt16();
|
|
|
|
|
|
qCDebug(dcSunSpecModelData()) << this;
|
|
}
|
|
|
|
QDebug operator<<(QDebug debug, SunSpecNameplateModel *model)
|
|
{
|
|
debug.nospace().noquote() << "SunSpecNameplateModel(Model: " << model->modelId() << ", Register: " << model->modbusStartRegister() << ", Length: " << model->modelLength() << ")\n";
|
|
debug.nospace().noquote() << " - " << model->dataPoints().value("DERTyp") << "-->";
|
|
if (model->dataPoints().value("DERTyp").isValid()) {
|
|
debug.nospace().noquote() << model->derTyp() << "\n";
|
|
} else {
|
|
debug.nospace().noquote() << "NaN\n";
|
|
}
|
|
|
|
debug.nospace().noquote() << " - " << model->dataPoints().value("WRtg") << "-->";
|
|
if (model->dataPoints().value("WRtg").isValid()) {
|
|
debug.nospace().noquote() << model->wRtg() << "\n";
|
|
} else {
|
|
debug.nospace().noquote() << "NaN\n";
|
|
}
|
|
|
|
debug.nospace().noquote() << " - " << model->dataPoints().value("VARtg") << "-->";
|
|
if (model->dataPoints().value("VARtg").isValid()) {
|
|
debug.nospace().noquote() << model->vaRtg() << "\n";
|
|
} else {
|
|
debug.nospace().noquote() << "NaN\n";
|
|
}
|
|
|
|
debug.nospace().noquote() << " - " << model->dataPoints().value("VArRtgQ1") << "-->";
|
|
if (model->dataPoints().value("VArRtgQ1").isValid()) {
|
|
debug.nospace().noquote() << model->vArRtgQ1() << "\n";
|
|
} else {
|
|
debug.nospace().noquote() << "NaN\n";
|
|
}
|
|
|
|
debug.nospace().noquote() << " - " << model->dataPoints().value("VArRtgQ2") << "-->";
|
|
if (model->dataPoints().value("VArRtgQ2").isValid()) {
|
|
debug.nospace().noquote() << model->vArRtgQ2() << "\n";
|
|
} else {
|
|
debug.nospace().noquote() << "NaN\n";
|
|
}
|
|
|
|
debug.nospace().noquote() << " - " << model->dataPoints().value("VArRtgQ3") << "-->";
|
|
if (model->dataPoints().value("VArRtgQ3").isValid()) {
|
|
debug.nospace().noquote() << model->vArRtgQ3() << "\n";
|
|
} else {
|
|
debug.nospace().noquote() << "NaN\n";
|
|
}
|
|
|
|
debug.nospace().noquote() << " - " << model->dataPoints().value("VArRtgQ4") << "-->";
|
|
if (model->dataPoints().value("VArRtgQ4").isValid()) {
|
|
debug.nospace().noquote() << model->vArRtgQ4() << "\n";
|
|
} else {
|
|
debug.nospace().noquote() << "NaN\n";
|
|
}
|
|
|
|
debug.nospace().noquote() << " - " << model->dataPoints().value("ARtg") << "-->";
|
|
if (model->dataPoints().value("ARtg").isValid()) {
|
|
debug.nospace().noquote() << model->aRtg() << "\n";
|
|
} else {
|
|
debug.nospace().noquote() << "NaN\n";
|
|
}
|
|
|
|
debug.nospace().noquote() << " - " << model->dataPoints().value("PFRtgQ1") << "-->";
|
|
if (model->dataPoints().value("PFRtgQ1").isValid()) {
|
|
debug.nospace().noquote() << model->pfRtgQ1() << "\n";
|
|
} else {
|
|
debug.nospace().noquote() << "NaN\n";
|
|
}
|
|
|
|
debug.nospace().noquote() << " - " << model->dataPoints().value("PFRtgQ2") << "-->";
|
|
if (model->dataPoints().value("PFRtgQ2").isValid()) {
|
|
debug.nospace().noquote() << model->pfRtgQ2() << "\n";
|
|
} else {
|
|
debug.nospace().noquote() << "NaN\n";
|
|
}
|
|
|
|
debug.nospace().noquote() << " - " << model->dataPoints().value("PFRtgQ3") << "-->";
|
|
if (model->dataPoints().value("PFRtgQ3").isValid()) {
|
|
debug.nospace().noquote() << model->pfRtgQ3() << "\n";
|
|
} else {
|
|
debug.nospace().noquote() << "NaN\n";
|
|
}
|
|
|
|
debug.nospace().noquote() << " - " << model->dataPoints().value("PFRtgQ4") << "-->";
|
|
if (model->dataPoints().value("PFRtgQ4").isValid()) {
|
|
debug.nospace().noquote() << model->pfRtgQ4() << "\n";
|
|
} else {
|
|
debug.nospace().noquote() << "NaN\n";
|
|
}
|
|
|
|
debug.nospace().noquote() << " - " << model->dataPoints().value("WHRtg") << "-->";
|
|
if (model->dataPoints().value("WHRtg").isValid()) {
|
|
debug.nospace().noquote() << model->whRtg() << "\n";
|
|
} else {
|
|
debug.nospace().noquote() << "NaN\n";
|
|
}
|
|
|
|
debug.nospace().noquote() << " - " << model->dataPoints().value("AhrRtg") << "-->";
|
|
if (model->dataPoints().value("AhrRtg").isValid()) {
|
|
debug.nospace().noquote() << model->ahrRtg() << "\n";
|
|
} else {
|
|
debug.nospace().noquote() << "NaN\n";
|
|
}
|
|
|
|
debug.nospace().noquote() << " - " << model->dataPoints().value("MaxChaRte") << "-->";
|
|
if (model->dataPoints().value("MaxChaRte").isValid()) {
|
|
debug.nospace().noquote() << model->maxChaRte() << "\n";
|
|
} else {
|
|
debug.nospace().noquote() << "NaN\n";
|
|
}
|
|
|
|
debug.nospace().noquote() << " - " << model->dataPoints().value("MaxDisChaRte") << "-->";
|
|
if (model->dataPoints().value("MaxDisChaRte").isValid()) {
|
|
debug.nospace().noquote() << model->maxDisChaRte() << "\n";
|
|
} else {
|
|
debug.nospace().noquote() << "NaN\n";
|
|
}
|
|
|
|
debug.nospace().noquote() << " - " << model->dataPoints().value("Pad") << "-->";
|
|
if (model->dataPoints().value("Pad").isValid()) {
|
|
debug.nospace().noquote() << model->pad() << "\n";
|
|
} else {
|
|
debug.nospace().noquote() << "NaN\n";
|
|
}
|
|
|
|
|
|
return debug.space().quote();
|
|
}
|