Code development platform for open source projects from the European Union institutions

Skip to content
Snippets Groups Projects
Commit 49fdb20b authored by Markus Quaritsch's avatar Markus Quaritsch
Browse files

Pull request #296: bugfix reported values of stored capacity in MRF/CIF

Merge in VECTO/vecto-dev from VECTO/mq_vecto-dev:bugfix/VECTO-1754-mrf-totalusablecapacityinsimulation to develop

* commit '53192c50':
  bugfix reported values of stored capacity in MRF/CIF
parents 4f0da7e5 53192c50
No related branches found
No related tags found
No related merge requests found
......@@ -8,6 +8,7 @@ namespace TUGraz.VectoCore.Models.Simulation.DataBus
double StateOfCharge { get; }
// only a rough estimate! do not use for reports etc.
WattSecond StoredEnergy { get; }
//Ampere MaxCurrent { get; }
......
......@@ -28,7 +28,14 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Data.ElectricComponents.Ba
}
}
public WattSecond UseableStoredEnergy
public WattSecond TotalStoredEnergy {
get {
return Batteries.Select(x => x.Item1).Distinct().OrderBy(x => x).Aggregate(0.SI<WattSecond>(),
(current, s) => current + Batteries.Where(x => x.Item1 == s).Min(x => x.Item2.TotalStoredEnergy));
}
}
public WattSecond UseableStoredEnergy
{
get
{
......@@ -40,6 +47,7 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Data.ElectricComponents.Ba
public class BatteryData
{
private WattSecond _totaltoredEnergy;
private WattSecond _useableStoredEnergy;
[ValidateObject]
......@@ -60,23 +68,25 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Data.ElectricComponents.Ba
public int BatteryId { get; internal set; }
public bool ChargeSustainingBattery { get; internal set; }
public WattSecond UseableStoredEnergy => _useableStoredEnergy ?? (_useableStoredEnergy = CalculateUsableEnergy());
public WattSecond TotalStoredEnergy => _totaltoredEnergy ?? (_totaltoredEnergy = CalculateBatteryEnergy(0, 1));
public WattSecond UseableStoredEnergy => _useableStoredEnergy ?? (_useableStoredEnergy = CalculateBatteryEnergy(MinSOC, MaxSOC));
public IElectricStorageDeclarationInputData InputData { get; internal set; }
protected WattSecond CalculateUsableEnergy()
protected WattSecond CalculateBatteryEnergy(double minSoc, double maxSoc)
{
var retVal = 0.SI<WattSecond>();
foreach (var (low, high) in SOCMap.Entries.Pairwise()) {
if (low.SOC.IsSmaller(MinSOC) && high.SOC.IsSmaller(MinSOC)) {
if (low.SOC.IsSmaller(minSoc) && high.SOC.IsSmaller(minSoc)) {
continue;
}
if (low.SOC.IsGreater(MaxSOC) && high.SOC.IsGreater(MaxSOC)) {
if (low.SOC.IsGreater(maxSoc) && high.SOC.IsGreater(maxSoc)) {
continue;
}
var min = VectoMath.Max(MinSOC, low.SOC);
var max = VectoMath.Min(MaxSOC, high.SOC);
var min = VectoMath.Max(minSoc, low.SOC);
var max = VectoMath.Min(maxSoc, high.SOC);
var voltage = SOCMap.Lookup((min + max) / 2.0);
retVal += (max - min) * Capacity * voltage;
}
......
......@@ -228,23 +228,14 @@ namespace TUGraz.VectoCore.OutputData.XML.DeclarationReports.CustomerInformation
{
var vehicle = GetVehicle(inputData);
var reess = vehicle.Components.ElectricStorage;
//var batteries = reess.ElectricStorageElements
// .Where(es => es.REESSPack.StorageType == REESSType.Battery)
// .Select(es => es.REESSPack as IBatteryPackDeclarationInputData).ToArray();
var batTotalCap = 0.SI<WattSecond>();
var batUsableCap = 0.SI<WattSecond>();
if (reess.ElectricStorageElements.Any(x => x.REESSPack.StorageType == REESSType.Battery)) {
var eletricStorageAdapter = new ElectricStorageAdapter();
var batData = eletricStorageAdapter.CreateBatteryData(reess, vehicle.VehicleType, vehicle.OvcHev);
batUsableCap = GetEnergyStoredInBatterySystem(batData);
foreach (var entry in batData.Batteries) {
entry.Item2.MinSOC = 0;
entry.Item2.MaxSOC = 1;
}
batTotalCap = GetEnergyStoredInBatterySystem(batData);
batUsableCap = batData.UseableStoredEnergy;
batTotalCap = batData.TotalStoredEnergy;
}
var capacitors = reess.ElectricStorageElements.Where(es => es.REESSPack.StorageType == REESSType.SuperCap)
......@@ -253,35 +244,17 @@ namespace TUGraz.VectoCore.OutputData.XML.DeclarationReports.CustomerInformation
var totalStorageCapacity =
batTotalCap +
(capacitors.Length > 0 ? capacitors.Sum(cap => GetStorageCapacity(cap)) : 0.SI<WattSecond>());
var totalUsableCapacity = batUsableCap +
var usableCapacity = batUsableCap +
(capacitors.Length > 0
? capacitors.Sum(cap => GetTotalUsableCapacityInSimulation(cap))
: 0.SI<WattSecond>());
return new List<XElement>() {
new XElement(_cif + "TotalStorageCapacity", totalUsableCapacity.ValueAsUnit("kWh", 0)),
new XElement(_cif + "UsableStorageCapacity", totalStorageCapacity.ValueAsUnit("kWh", 0))
new XElement(_cif + "TotalStorageCapacity", totalStorageCapacity.ValueAsUnit("kWh", 0)),
new XElement(_cif + "UsableStorageCapacity", usableCapacity.ValueAsUnit("kWh", 0))
};
}
private static WattSecond GetEnergyStoredInBatterySystem(BatterySystemData batData)
{
var tmpBat = new BatterySystem(null, batData);
// set every single battery to its max SoC - initializing the battery system does
// not work as individual batteries may have different SoC limits
foreach (var battery in tmpBat.Batteries.SelectMany(batteryString => batteryString.Value.Batteries)) {
battery.Initialize(battery.MaxSoC);
}
var energyFull = tmpBat.StoredEnergy;
// set every single battery to its min SoC - initializing the battery system does
// not work as individual batteries may have different SoC limits
foreach (var battery in tmpBat.Batteries.SelectMany(batteryString => batteryString.Value.Batteries)) {
battery.Initialize(battery.MinSoC);
}
var energyEmpty = tmpBat.StoredEnergy;
return energyFull - energyEmpty;
}
private WattSecond GetTotalUsableCapacityInSimulation(ISuperCapDeclarationInputData cap)
{
return GetStorageCapacity(cap) * 0.8;
......
......@@ -37,11 +37,11 @@ namespace TUGraz.VectoCore.OutputData.XML.DeclarationReports.ManufacturerReport.
foreach (var entry in batData.Batteries.OrderBy(x => x.Item1)) {
var batteryPackInput = entry.Item2.InputData;
var battery = batteryPackInput.REESSPack as IBatteryPackDeclarationInputData;
var batUsableCap = GetEnergyStoredInBattery(entry);
var batUsableCap = entry.Item2.UseableStoredEnergy;
entry.Item2.MaxSOC = 1;
entry.Item2.MinSOC = 0;
var batTotalCap = GetEnergyStoredInBattery(entry);
var batTotalCap = entry.Item2.TotalStoredEnergy;
result.Add(new XElement(_mrf + XMLNames.ElectricEnergyStorage_Battery,
new XAttribute("stringId", entry.Item1),
new XElement(_mrf + XMLNames.Component_Model, battery.Model),
......@@ -73,16 +73,6 @@ namespace TUGraz.VectoCore.OutputData.XML.DeclarationReports.ManufacturerReport.
return result;
}
private static WattSecond GetEnergyStoredInBattery(Tuple<int, BatteryData> entry)
{
var tmpBattery = new Battery(null, entry.Item2);
tmpBattery.Initialize(tmpBattery.MaxSoC);
var energyFull = tmpBattery.StoredEnergy;
tmpBattery.Initialize(tmpBattery.MinSoC);
var energyEmpty = tmpBattery.StoredEnergy;
return energyFull - energyEmpty;
}
#endregion
}
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment