347 lines
12 KiB
C++
347 lines
12 KiB
C++
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
|
*
|
|
* Copyright 2013 - 2021, 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
|
|
*
|
|
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
|
|
|
|
#ifndef SUNSPECBATTERYMODEL_H
|
|
#define SUNSPECBATTERYMODEL_H
|
|
|
|
#include <QObject>
|
|
|
|
#include "sunspecmodel.h"
|
|
|
|
class SunSpecConnection;
|
|
|
|
class SunSpecBatteryModel : public SunSpecModel
|
|
{
|
|
Q_OBJECT
|
|
public:
|
|
|
|
enum Chast {
|
|
ChastOff = 1,
|
|
ChastEmpty = 2,
|
|
ChastDischarging = 3,
|
|
ChastCharging = 4,
|
|
ChastFull = 5,
|
|
ChastHolding = 6,
|
|
ChastTesting = 7
|
|
};
|
|
Q_ENUM(Chast)
|
|
|
|
enum Locremctl {
|
|
LocremctlRemote = 0,
|
|
LocremctlLocal = 1
|
|
};
|
|
Q_ENUM(Locremctl)
|
|
|
|
enum Typ {
|
|
TypNotApplicableUnknown = 0,
|
|
TypLeadAcid = 1,
|
|
TypNickelMetalHydrate = 2,
|
|
TypNickelCadmium = 3,
|
|
TypLithiumIon = 4,
|
|
TypCarbonZinc = 5,
|
|
TypZincChloride = 6,
|
|
TypAlkaline = 7,
|
|
TypRechargeableAlkaline = 8,
|
|
TypSodiumSulfur = 9,
|
|
TypFlow = 10,
|
|
TypOther = 99
|
|
};
|
|
Q_ENUM(Typ)
|
|
|
|
enum State {
|
|
StateDisconnected = 1,
|
|
StateInitializing = 2,
|
|
StateConnected = 3,
|
|
StateStandby = 4,
|
|
StateSocProtection = 5,
|
|
StateSuspending = 6,
|
|
StateFault = 99
|
|
};
|
|
Q_ENUM(State)
|
|
|
|
enum Reqinvstate {
|
|
ReqinvstateNoRequest = 0,
|
|
ReqinvstateStart = 1,
|
|
ReqinvstateStop = 2
|
|
};
|
|
Q_ENUM(Reqinvstate)
|
|
|
|
enum Setop {
|
|
SetopConnect = 1,
|
|
SetopDisconnect = 2
|
|
};
|
|
Q_ENUM(Setop)
|
|
|
|
enum Setinvstate {
|
|
SetinvstateInverterStopped = 1,
|
|
SetinvstateInverterStandby = 2,
|
|
SetinvstateInverterStarted = 3
|
|
};
|
|
Q_ENUM(Setinvstate)
|
|
|
|
enum Evt1 {
|
|
Evt1CommunicationError = 0x1,
|
|
Evt1OverTempAlarm = 0x2,
|
|
Evt1OverTempWarning = 0x4,
|
|
Evt1UnderTempAlarm = 0x8,
|
|
Evt1UnderTempWarning = 0x10,
|
|
Evt1OverChargeCurrentAlarm = 0x20,
|
|
Evt1OverChargeCurrentWarning = 0x40,
|
|
Evt1OverDischargeCurrentAlarm = 0x80,
|
|
Evt1OverDischargeCurrentWarning = 0x100,
|
|
Evt1OverVoltAlarm = 0x200,
|
|
Evt1OverVoltWarning = 0x400,
|
|
Evt1UnderVoltAlarm = 0x800,
|
|
Evt1UnderVoltWarning = 0x1000,
|
|
Evt1UnderSocMinAlarm = 0x2000,
|
|
Evt1UnderSocMinWarning = 0x4000,
|
|
Evt1OverSocMaxAlarm = 0x8000,
|
|
Evt1OverSocMaxWarning = 0x10000,
|
|
Evt1VoltageImbalanceWarning = 0x20000,
|
|
Evt1TemperatureImbalanceAlarm = 0x40000,
|
|
Evt1TemperatureImbalanceWarning = 0x80000,
|
|
Evt1ContactorError = 0x100000,
|
|
Evt1FanError = 0x200000,
|
|
Evt1GroundFault = 0x400000,
|
|
Evt1OpenDoorError = 0x800000,
|
|
Evt1CurrentImbalanceWarning = 0x1000000,
|
|
Evt1OtherAlarm = 0x2000000,
|
|
Evt1OtherWarning = 0x4000000,
|
|
Evt1Reserved1 = 0x8000000,
|
|
Evt1ConfigurationAlarm = 0x10000000,
|
|
Evt1ConfigurationWarning = 0x20000000
|
|
};
|
|
Q_DECLARE_FLAGS(Evt1Flags, Evt1)
|
|
Q_FLAG(Evt1)
|
|
|
|
explicit SunSpecBatteryModel(SunSpecConnection *connection, quint16 modbusStartRegister, quint16 modelLength, SunSpecDataPoint::ByteOrder byteOrder, QObject *parent = nullptr);
|
|
~SunSpecBatteryModel() override;
|
|
|
|
QString name() const override;
|
|
QString description() const override;
|
|
QString label() const override;
|
|
|
|
/* Nameplate charge capacity in amp-hours. [Ah] */
|
|
float nameplateChargeCapacity() const;
|
|
/* Nameplate energy capacity in DC watt-hours. [Wh] */
|
|
float nameplateEnergyCapacity() const;
|
|
/* Maximum rate of energy transfer into the storage device in DC watts. [W] */
|
|
float nameplateMaxChargeRate() const;
|
|
/* Maximum rate of energy transfer out of the storage device in DC watts. [W] */
|
|
float nameplateMaxDischargeRate() const;
|
|
/* Self discharge rate. Percentage of capacity (WHRtg) discharged per day. [%WHRtg] */
|
|
float selfDischargeRate() const;
|
|
/* Manufacturer maximum state of charge, expressed as a percentage. [%WHRtg] */
|
|
float nameplateMaxSoC() const;
|
|
/* Manufacturer minimum state of charge, expressed as a percentage. [%WHRtg] */
|
|
float nameplateMinSoC() const;
|
|
|
|
/* Setpoint for maximum reserve for storage as a percentage of the nominal maximum storage. [%WHRtg] */
|
|
float maxReservePercent() const;
|
|
QModbusReply *setMaxReservePercent(float maxReservePercent);
|
|
|
|
/* Setpoint for minimum reserve for storage as a percentage of the nominal maximum storage. [%WHRtg] */
|
|
float minReservePercent() const;
|
|
QModbusReply *setMinReservePercent(float minReservePercent);
|
|
|
|
/* State of charge, expressed as a percentage. [%WHRtg] */
|
|
float stateOfCharge() const;
|
|
/* Depth of discharge, expressed as a percentage. [%] */
|
|
float depthOfDischarge() const;
|
|
/* Percentage of battery life remaining. [%] */
|
|
float stateOfHealth() const;
|
|
/* Number of cycles executed in the battery. */
|
|
quint32 cycleCount() const;
|
|
/* Charge status of storage device. Enumeration. */
|
|
Chast chargeStatus() const;
|
|
/* Battery control mode. Enumeration. */
|
|
Locremctl controlMode() const;
|
|
/* Value is incremented every second with periodic resets to zero. */
|
|
quint16 batteryHeartbeat() const;
|
|
/* Value is incremented every second with periodic resets to zero. */
|
|
quint16 controllerHeartbeat() const;
|
|
QModbusReply *setControllerHeartbeat(quint16 controllerHeartbeat);
|
|
|
|
/* Used to reset any latched alarms. 1 = Reset. */
|
|
quint16 alarmReset() const;
|
|
QModbusReply *setAlarmReset(quint16 alarmReset);
|
|
|
|
/* Type of battery. Enumeration. */
|
|
Typ batteryType() const;
|
|
/* State of the battery bank. Enumeration. */
|
|
State stateOfTheBatteryBank() const;
|
|
/* Vendor specific battery bank state. Enumeration. */
|
|
quint16 vendorBatteryBankState() const;
|
|
/* Date the device warranty expires. */
|
|
quint32 warrantyDate() const;
|
|
/* Alarms and warnings. Bit flags. */
|
|
Evt1Flags batteryEvent1Bitfield() const;
|
|
/* Alarms and warnings. Bit flags. */
|
|
quint32 batteryEvent2Bitfield() const;
|
|
/* Vendor defined events. */
|
|
quint32 vendorEventBitfield1() const;
|
|
/* Vendor defined events. */
|
|
quint32 vendorEventBitfield2() const;
|
|
/* DC Bus Voltage. [V] */
|
|
float externalBatteryVoltage() const;
|
|
/* Instantaneous maximum battery voltage. [V] */
|
|
float maxBatteryVoltage() const;
|
|
/* Instantaneous minimum battery voltage. [V] */
|
|
float minBatteryVoltage() const;
|
|
/* Maximum voltage for all cells in the bank. [V] */
|
|
float maxCellVoltage() const;
|
|
/* String containing the cell with maximum voltage. */
|
|
quint16 maxCellVoltageString() const;
|
|
/* Module containing the cell with maximum voltage. */
|
|
quint16 maxCellVoltageModule() const;
|
|
/* Minimum voltage for all cells in the bank. [V] */
|
|
float minCellVoltage() const;
|
|
/* String containing the cell with minimum voltage. */
|
|
quint16 minCellVoltageString() const;
|
|
/* Module containing the cell with minimum voltage. */
|
|
quint16 minCellVoltageModule() const;
|
|
/* Average cell voltage for all cells in the bank. [V] */
|
|
float averageCellVoltage() const;
|
|
/* Total DC current flowing to/from the battery bank. [A] */
|
|
float totalDcCurrent() const;
|
|
/* Instantaneous maximum DC charge current. [A] */
|
|
float maxChargeCurrent() const;
|
|
/* Instantaneous maximum DC discharge current. [A] */
|
|
float maxDischargeCurrent() const;
|
|
/* Total power flowing to/from the battery bank. [W] */
|
|
float totalPower() const;
|
|
/* Request from battery to start or stop the inverter. Enumeration. */
|
|
Reqinvstate inverterStateRequest() const;
|
|
/* AC Power requested by battery. [W] */
|
|
float batteryPowerRequest() const;
|
|
/* Instruct the battery bank to perform an operation such as connecting. Enumeration. */
|
|
Setop setOperation() const;
|
|
QModbusReply *setSetOperation(Setop setOperation);
|
|
|
|
/* Set the current state of the inverter. */
|
|
Setinvstate setInverterState() const;
|
|
QModbusReply *setSetInverterState(Setinvstate setInverterState);
|
|
|
|
/* Scale factor for charge capacity. */
|
|
qint16 aHRtg_SF() const;
|
|
/* Scale factor for energy capacity. */
|
|
qint16 wHRtg_SF() const;
|
|
/* Scale factor for maximum charge and discharge rate. */
|
|
qint16 wChaDisChaMax_SF() const;
|
|
/* Scale factor for self discharge rate. */
|
|
qint16 disChaRte_SF() const;
|
|
/* Scale factor for state of charge values. */
|
|
qint16 soC_SF() const;
|
|
/* Scale factor for depth of discharge. */
|
|
qint16 doD_SF() const;
|
|
/* Scale factor for state of health. */
|
|
qint16 soH_SF() const;
|
|
/* Scale factor for DC bus voltage. */
|
|
qint16 v_SF() const;
|
|
/* Scale factor for cell voltage. */
|
|
qint16 cellV_SF() const;
|
|
/* Scale factor for DC current. */
|
|
qint16 a_SF() const;
|
|
/* Scale factor for instantaneous DC charge/discharge current. */
|
|
qint16 aMax_SF() const;
|
|
/* Scale factor for AC power request. */
|
|
qint16 w_SF() const;
|
|
|
|
protected:
|
|
quint16 m_fixedBlockLength = 62;
|
|
|
|
void initDataPoints();
|
|
void processBlockData() override;
|
|
|
|
private:
|
|
float m_nameplateChargeCapacity = 0;
|
|
float m_nameplateEnergyCapacity = 0;
|
|
float m_nameplateMaxChargeRate = 0;
|
|
float m_nameplateMaxDischargeRate = 0;
|
|
float m_selfDischargeRate = 0;
|
|
float m_nameplateMaxSoC = 0;
|
|
float m_nameplateMinSoC = 0;
|
|
float m_maxReservePercent = 0;
|
|
float m_minReservePercent = 0;
|
|
float m_stateOfCharge = 0;
|
|
float m_depthOfDischarge = 0;
|
|
float m_stateOfHealth = 0;
|
|
quint32 m_cycleCount = 0;
|
|
Chast m_chargeStatus;
|
|
Locremctl m_controlMode;
|
|
quint16 m_batteryHeartbeat = 0;
|
|
quint16 m_controllerHeartbeat = 0;
|
|
quint16 m_alarmReset = 0;
|
|
Typ m_batteryType;
|
|
State m_stateOfTheBatteryBank;
|
|
quint16 m_vendorBatteryBankState = 0;
|
|
quint32 m_warrantyDate = 0;
|
|
Evt1Flags m_batteryEvent1Bitfield;
|
|
quint32 m_batteryEvent2Bitfield = 0;
|
|
quint32 m_vendorEventBitfield1 = 0;
|
|
quint32 m_vendorEventBitfield2 = 0;
|
|
float m_externalBatteryVoltage = 0;
|
|
float m_maxBatteryVoltage = 0;
|
|
float m_minBatteryVoltage = 0;
|
|
float m_maxCellVoltage = 0;
|
|
quint16 m_maxCellVoltageString = 0;
|
|
quint16 m_maxCellVoltageModule = 0;
|
|
float m_minCellVoltage = 0;
|
|
quint16 m_minCellVoltageString = 0;
|
|
quint16 m_minCellVoltageModule = 0;
|
|
float m_averageCellVoltage = 0;
|
|
float m_totalDcCurrent = 0;
|
|
float m_maxChargeCurrent = 0;
|
|
float m_maxDischargeCurrent = 0;
|
|
float m_totalPower = 0;
|
|
Reqinvstate m_inverterStateRequest;
|
|
float m_batteryPowerRequest = 0;
|
|
Setop m_setOperation;
|
|
Setinvstate m_setInverterState;
|
|
qint16 m_aHRtg_SF = 0;
|
|
qint16 m_wHRtg_SF = 0;
|
|
qint16 m_wChaDisChaMax_SF = 0;
|
|
qint16 m_disChaRte_SF = 0;
|
|
qint16 m_soC_SF = 0;
|
|
qint16 m_doD_SF = 0;
|
|
qint16 m_soH_SF = 0;
|
|
qint16 m_v_SF = 0;
|
|
qint16 m_cellV_SF = 0;
|
|
qint16 m_a_SF = 0;
|
|
qint16 m_aMax_SF = 0;
|
|
qint16 m_w_SF = 0;
|
|
|
|
|
|
};
|
|
|
|
QDebug operator<<(QDebug debug, SunSpecBatteryModel *model);
|
|
|
|
#endif // SUNSPECBATTERYMODEL_H
|