diff --git a/VectoCore/VectoCore/Models/Simulation/DataBus/IRESSInfo.cs b/VectoCore/VectoCore/Models/Simulation/DataBus/IRESSInfo.cs index 0321fa05fe5554f7869a9bab9d5e3b9defd56561..ebeab12bd5cc04fa193a7d71451c858029f910c0 100644 --- a/VectoCore/VectoCore/Models/Simulation/DataBus/IRESSInfo.cs +++ b/VectoCore/VectoCore/Models/Simulation/DataBus/IRESSInfo.cs @@ -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; } diff --git a/VectoCore/VectoCore/Models/SimulationComponent/Data/ElectricComponents/Battery/BatteryData.cs b/VectoCore/VectoCore/Models/SimulationComponent/Data/ElectricComponents/Battery/BatteryData.cs index dd4b37c7318fdb1f034dcda9f6ec4dc0fa229201..4a683a084afde389db258b050b986bd5fc67a21a 100644 --- a/VectoCore/VectoCore/Models/SimulationComponent/Data/ElectricComponents/Battery/BatteryData.cs +++ b/VectoCore/VectoCore/Models/SimulationComponent/Data/ElectricComponents/Battery/BatteryData.cs @@ -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; } diff --git a/VectoCore/VectoCore/OutputData/XML/DeclarationReports/CustomerInformationFile/CustomerInformationFile_0_9/CIFWriter/ComponentGroupWriters.cs b/VectoCore/VectoCore/OutputData/XML/DeclarationReports/CustomerInformationFile/CustomerInformationFile_0_9/CIFWriter/ComponentGroupWriters.cs index f499da1116e1714df3246b7b3368d676c5b78736..aaba53c72ec7286b8b036812b98186559d26d3fc 100644 --- a/VectoCore/VectoCore/OutputData/XML/DeclarationReports/CustomerInformationFile/CustomerInformationFile_0_9/CIFWriter/ComponentGroupWriters.cs +++ b/VectoCore/VectoCore/OutputData/XML/DeclarationReports/CustomerInformationFile/CustomerInformationFile_0_9/CIFWriter/ComponentGroupWriters.cs @@ -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; diff --git a/VectoCore/VectoCore/OutputData/XML/DeclarationReports/ManufacturerReport/ManufacturerReport_0_9/ManufacturerReportXMLTypeWriter/Components/MRFREESSSpecificationsType.cs b/VectoCore/VectoCore/OutputData/XML/DeclarationReports/ManufacturerReport/ManufacturerReport_0_9/ManufacturerReportXMLTypeWriter/Components/MRFREESSSpecificationsType.cs index c47495ed0f0f54db4b83a8c00e6deda20e81de7d..5fd0d34a9a2b8a19447c9bc428203ebe6f959bdc 100644 --- a/VectoCore/VectoCore/OutputData/XML/DeclarationReports/ManufacturerReport/ManufacturerReport_0_9/ManufacturerReportXMLTypeWriter/Components/MRFREESSSpecificationsType.cs +++ b/VectoCore/VectoCore/OutputData/XML/DeclarationReports/ManufacturerReport/ManufacturerReport_0_9/ManufacturerReportXMLTypeWriter/Components/MRFREESSSpecificationsType.cs @@ -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 } }