Added Apparent Power to interface and meter

pull/167/head
Emil Madsen 2020-09-24 21:23:06 +02:00
rodzic 65ad8f624c
commit db7acae6cd
4 zmienionych plików z 82 dodań i 32 usunięć

Wyświetl plik

@ -22,18 +22,20 @@
#include"wmbus_utils.h"
#include"util.h"
#include<cmath>
using namespace std;
#define ERROR_CODE_VOLTAGE_PHASE_1_OVERFLOW 0x01
#define ERROR_CODE_VOLTAGE_PHASE_2_OVERFLOW 0x02
#define ERROR_CODE_VOLTAGE_PHASE_3_OVERFLOW 0x04
constexpr uint8_t ERROR_CODE_VOLTAGE_PHASE_1_OVERFLOW=0x01;
constexpr uint8_t ERROR_CODE_VOLTAGE_PHASE_2_OVERFLOW=0x02;
constexpr uint8_t ERROR_CODE_VOLTAGE_PHASE_3_OVERFLOW=0x04;
#define ERROR_CODE_CURRENT_PHASE_1_OVERFLOW 0x08
#define ERROR_CODE_CURRENT_PHASE_2_OVERFLOW 0x10
#define ERROR_CODE_CURRENT_PHASE_3_OVERFLOW 0x20
constexpr uint8_t ERROR_CODE_CURRENT_PHASE_1_OVERFLOW=0x08;
constexpr uint8_t ERROR_CODE_CURRENT_PHASE_2_OVERFLOW=0x10;
constexpr uint8_t ERROR_CODE_CURRENT_PHASE_3_OVERFLOW=0x20;
#define ERROR_CODE_FREQUENCY_OUT_OF_RANGE 0x40
constexpr uint8_t ERROR_CODE_FREQUENCY_OUT_OF_RANGE=0x40;
struct MeterEM24 : public virtual ElectricityMeter, public virtual MeterCommonImplementation {
@ -45,6 +47,9 @@ struct MeterEM24 : public virtual ElectricityMeter, public virtual MeterCommonIm
double totalReactiveEnergyConsumption(Unit u);
double totalReactiveEnergyProduction(Unit u);
double totalApparentEnergyConsumption(Unit u);
double totalApparentEnergyProduction(Unit u);
string status();
private:
@ -91,6 +96,16 @@ MeterEM24::MeterEM24(WMBus *bus, MeterInfo &mi) :
"The total reactive energy production recorded by this meter.",
true, true);
addPrint("total_apparent_energy_consumption", Quantity::Apparent_Energy,
[&](Unit u){ return totalApparentEnergyConsumption(u); },
"The total apparent energy consumption by calculation.",
true, true);
addPrint("total_apparent_energy_production", Quantity::Apparent_Energy,
[&](Unit u){ return totalApparentEnergyProduction(u); },
"The total apparent energy production by calculation.",
true, true);
addPrint("errors", Quantity::Text,
[&](){ return status(); },
"Any errors currently being reported.",
@ -121,6 +136,27 @@ double MeterEM24::totalReactiveEnergyProduction(Unit u)
return convert(total_reactive_energy_production_kvarh_, Unit::KVARH, u);
}
double MeterEM24::totalApparentEnergyConsumption(Unit u)
{
assertQuantity(u, Quantity::Apparent_Energy);
return convert(
sqrt(
pow(total_true_energy_consumption_kwh_, 2) +
pow(total_reactive_energy_consumption_kvarh_, 2)
)
, Unit::KVAH, u);
}
double MeterEM24::totalApparentEnergyProduction(Unit u)
{
assertQuantity(u, Quantity::Apparent_Energy);
return convert(
sqrt(
pow(total_true_energy_production_kwh_, 2) +
pow(total_reactive_energy_production_kvarh_, 2)
)
, Unit::KVAH, u);
}
void MeterEM24::processContent(Telegram *t)
{
@ -175,4 +211,3 @@ string MeterEM24::status()
}
return s;
}

Wyświetl plik

@ -24,6 +24,7 @@
#include<algorithm>
#include<memory.h>
#include<time.h>
#include<cmath>
MeterCommonImplementation::MeterCommonImplementation(WMBus *bus, MeterInfo &mi,
MeterType type) :
@ -472,38 +473,43 @@ void MeterCommonImplementation::printMeter(Telegram *t,
}
}
double WaterMeter::totalWaterConsumption(Unit u) { return -47.11; }
double WaterMeter::totalWaterConsumption(Unit u) { return -NAN; }
bool WaterMeter::hasTotalWaterConsumption() { return false; }
double WaterMeter::targetWaterConsumption(Unit u) { return -47.11; }
double WaterMeter::targetWaterConsumption(Unit u) { return -NAN; }
bool WaterMeter::hasTargetWaterConsumption() { return false; }
double WaterMeter::maxFlow(Unit u) { return -47.11; }
double WaterMeter::maxFlow(Unit u) { return -NAN; }
bool WaterMeter::hasMaxFlow() { return false; }
double WaterMeter::flowTemperature(Unit u) { return -47.11; }
double WaterMeter::flowTemperature(Unit u) { return -NAN; }
bool WaterMeter::hasFlowTemperature() { return false; }
double WaterMeter::externalTemperature(Unit u) { return -47.11; }
double WaterMeter::externalTemperature(Unit u) { return -NAN; }
bool WaterMeter::hasExternalTemperature() { return false; }
string WaterMeter::statusHumanReadable() { return "-47.11"; }
string WaterMeter::status() { return "-47.11"; }
string WaterMeter::timeDry() { return "-47.11"; }
string WaterMeter::timeReversed() { return "-47.11"; }
string WaterMeter::timeLeaking() { return "-47.11"; }
string WaterMeter::timeBursting() { return "-47.11"; }
string WaterMeter::statusHumanReadable() { return "-NAN"; }
string WaterMeter::status() { return "-NAN"; }
string WaterMeter::timeDry() { return "-NAN"; }
string WaterMeter::timeReversed() { return "-NAN"; }
string WaterMeter::timeLeaking() { return "-NAN"; }
string WaterMeter::timeBursting() { return "-NAN"; }
double HeatMeter::totalEnergyConsumption(Unit u) { return -47.11; }
double HeatMeter::currentPeriodEnergyConsumption(Unit u) { return -47.11; }
double HeatMeter::previousPeriodEnergyConsumption(Unit u) { return -47.11; }
double HeatMeter::currentPowerConsumption(Unit u) { return -47.11; }
double HeatMeter::totalVolume(Unit u) { return -47.11; }
double HeatMeter::totalEnergyConsumption(Unit u) { return -NAN; }
double HeatMeter::currentPeriodEnergyConsumption(Unit u) { return -NAN; }
double HeatMeter::previousPeriodEnergyConsumption(Unit u) { return -NAN; }
double HeatMeter::currentPowerConsumption(Unit u) { return -NAN; }
double HeatMeter::totalVolume(Unit u) { return -NAN; }
double ElectricityMeter::totalEnergyConsumption(Unit u) { return -47.11; }
double ElectricityMeter::currentPowerConsumption(Unit u) { return -47.11; }
double ElectricityMeter::totalEnergyProduction(Unit u) { return -47.11; }
double ElectricityMeter::currentPowerProduction(Unit u) { return -47.11; }
double ElectricityMeter::totalEnergyConsumption(Unit u) { return -NAN; }
double ElectricityMeter::totalEnergyProduction(Unit u) { return -NAN; }
double ElectricityMeter::totalReactiveEnergyConsumption(Unit u) { return -NAN; }
double ElectricityMeter::totalReactiveEnergyProduction(Unit u) { return -NAN; }
double ElectricityMeter::totalApparentEnergyConsumption(Unit u) { return -NAN; }
double ElectricityMeter::totalApparentEnergyProduction(Unit u) { return -NAN; }
double HeatCostMeter::currentConsumption(Unit u) { return -47.11; }
string HeatCostMeter::setDate() { return "47.11"; }
double HeatCostMeter::consumptionAtSetDate(Unit u) { return -47.11; }
double ElectricityMeter::currentPowerConsumption(Unit u) { return -NAN; }
double ElectricityMeter::currentPowerProduction(Unit u) { return -NAN; }
double HeatCostMeter::currentConsumption(Unit u) { return -NAN; }
string HeatCostMeter::setDate() { return "NAN"; }
double HeatCostMeter::consumptionAtSetDate(Unit u) { return -NAN; }
void MeterCommonImplementation::setExpectedTPLSecurityMode(TPLSecurityMode tsm)
{

Wyświetl plik

@ -252,8 +252,15 @@ struct HeatMeter : public virtual Meter
struct ElectricityMeter : public virtual Meter
{
virtual double totalEnergyConsumption(Unit u); // kwh
virtual double currentPowerConsumption(Unit u); // kw
virtual double totalEnergyProduction(Unit u); // kwh
virtual double totalReactiveEnergyConsumption(Unit u); // kvarh
virtual double totalReactiveEnergyProduction(Unit u); // kvarh
virtual double totalApparentEnergyConsumption(Unit u); // kvah
virtual double totalApparentEnergyProduction(Unit u); // kvah
virtual double currentPowerConsumption(Unit u); // kw
virtual double currentPowerProduction(Unit u); // kw
};

Wyświetl plik

@ -24,6 +24,7 @@
#define LIST_OF_QUANTITIES \
X(Energy,KWH) \
X(Reactive_Energy,KVARH) \
X(Apparent_Energy,KVAH) \
X(Power,KW) \
X(Volume,M3) \
X(Flow,M3H) \
@ -39,6 +40,7 @@
X(MJ,mj,"MJ",Energy,"Mega Joule") \
X(GJ,gj,"GJ",Energy,"Giga Joule") \
X(KVARH,kvarh,"kVARh",Reactive_Energy,"kilo volt amperes reactive hour") \
X(KVAH,kvah,"kVAh",Apparent_Energy,"kilo volt amperes hour") \
X(M3,m3,"m3",Volume,"cubic meter") \
X(L,l,"l",Volume,"litre") \
X(KW,kw,"kW",Power,"kilo Watt") \