diff --git a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/SimulationComponents/StrategyDataAdapter/HybridStrategyParameterDataAdapter.cs b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/SimulationComponents/StrategyDataAdapter/HybridStrategyParameterDataAdapter.cs index fe39ffc971c0c8cc790702e04d69dde5c77f09ea..5a83a8bbf45288ab2d62a1f08863d0528307c1ee 100644 --- a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/SimulationComponents/StrategyDataAdapter/HybridStrategyParameterDataAdapter.cs +++ b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/SimulationComponents/StrategyDataAdapter/HybridStrategyParameterDataAdapter.cs @@ -1,9 +1,8 @@ using System; using System.Collections.Generic; -using System.ComponentModel; +using NLog.Targets; using TUGraz.VectoCommon.Exceptions; using TUGraz.VectoCommon.Utils; -using TUGraz.VectoCore.InputData.Reader.DataObjectAdapter.HeavyLorry; using TUGraz.VectoCore.Models.Simulation.Data; using TUGraz.VectoCore.Models.SimulationComponent.Data; using TUGraz.VectoCore.Models.SimulationComponent.Data.Battery; @@ -12,11 +11,11 @@ using TUGraz.VectoCore.Models.SimulationComponent.Impl; namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter.SimulationComponents.StrategyDataAdapter { - public abstract class HybridStrategyDataAdapter{ + public abstract class HybridStrategyDataAdapter{ } - public class ParallelHybridStrategyParameterDataAdapter : HybridStrategyParameters + public class ParallelHybridStrategyParameterDataAdapter : HybridStrategyDataAdapter { public HybridStrategyParameters CreateHybridStrategyParameters(BatterySystemData batterySystemData, SuperCapData superCap) { @@ -53,7 +52,7 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter.SimulationComponen } } - public class SerialHybridStrategyParameterDataAdapter : HybridStrategyParameters + public class SerialHybridStrategyParameterDataAdapter : HybridStrategyDataAdapter { public HybridStrategyParameters CreateHybridStrategyParameters(BatterySystemData batterySystemData, SuperCapData superCapData, Kilogram vehicleMass, VectoRunData.OvcHevMode ovcMode) @@ -94,7 +93,6 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter.SimulationComponen throw new ArgumentOutOfRangeException(nameof(ovcMode), ovcMode, null); } - //TODO Move to DeclarationData.Hybridstrategy.Parallel @@ -110,22 +108,28 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter.SimulationComponen result.MinSoC = tmpSystem.MinSoC + 2 * deltaSoc; result.TargetSoC = tmpSystem.MaxSoC - 5 * deltaSoc; - result.MaxSoC = tmpSystem.MaxSoC; + result.MaxSoC = double.NaN; + + if (result.MinSoC >= result.TargetSoC) { + deltaSoc = CalculatedDeltaSocSHev(vehicleMass, batterySystemData, tmpSystem, 50); + //Small battery + result.TargetSoC = tmpSystem.MaxSoC - 1 * deltaSoc; + result.MinSoC = tmpSystem.MinSoC + 2 * deltaSoc; + if (result.MinSoC >= result.TargetSoC) { + throw new VectoException("Min SOC higher than Target SOC"); + } + } } - private double CalculatedDeltaSocSHev(Kilogram vehicleMass, BatterySystemData batterySystemData, BatterySystem tmpSystem) - { - - + private double CalculatedDeltaSocSHev(Kilogram vehicleMass, BatterySystemData batterySystemData, + BatterySystem tmpSystem, double kmph = 100) + { var v_nom = tmpSystem.NominalVoltage; - var c_nom = tmpSystem.Capacity; - double speedInkmph = 100; - - var result = vehicleMass * speedInkmph.KMPHtoMeterPerSecond() * speedInkmph.KMPHtoMeterPerSecond() / v_nom / c_nom; - - + var c_nom = tmpSystem.Capacity.AsAmpHour; + var v = kmph.KMPHtoMeterPerSecond(); + var result = ((vehicleMass / 2 * v * v) / 3600) * (1 / v_nom) * (1 / c_nom); return result.Value(); } diff --git a/VectoCore/VectoCoreTest/Models/Declaration/DataAdapter/HybridStrategyDataAdapterTest.cs b/VectoCore/VectoCoreTest/Models/Declaration/DataAdapter/HybridStrategyDataAdapterTest.cs new file mode 100644 index 0000000000000000000000000000000000000000..c01efecea01e948fbc11869324eaf55a80b0ac53 --- /dev/null +++ b/VectoCore/VectoCoreTest/Models/Declaration/DataAdapter/HybridStrategyDataAdapterTest.cs @@ -0,0 +1,87 @@ +using System; +using System.Collections.Generic; +using System.Diagnostics; +using Castle.Components.DictionaryAdapter; +using Moq; +using NUnit.Framework; +using TUGraz.VectoCommon.InputData; +using TUGraz.VectoCommon.Utils; +using TUGraz.VectoCore.InputData.Reader.DataObjectAdapter.SimulationComponents.StrategyDataAdapter; +using TUGraz.VectoCore.Models.Simulation.Data; +using TUGraz.VectoCore.Models.SimulationComponent.Data; +using TUGraz.VectoCore.Models.SimulationComponent.Data.Battery; +using TUGraz.VectoCore.Tests.Utils; + +namespace TUGraz.VectoCore.Tests.Models.Declaration.DataAdapter; + + +[TestFixture] +public class HybridStrategyDataAdapterTest +{ + + [TestCase(0.7375, 0.2625, 11273.9176, 778.61, 247500, false, 0.624646591, 0.307641364)] + [TestCase(0.6, 0.2, 11000, 778.61, 80000, false, 0.582967134, 0.234065732)] + [TestCase(0.6, 0.2, 11000, 778.61, 5000, true, 0.268131464, 0.634065732)] + + public void SerialHybridStrategyTest(double bat_soc_max, double bat_soc_min, double vehicle_mass, double nominalVoltage, double nominalCapacity, bool exception, double expected_target_soc, double expected_min_soc) + { + var mass = vehicle_mass.SI<Kilogram>(); + var v_nom = nominalVoltage.SI<Volt>(); + var cap_nom = nominalCapacity.SI<AmpereSecond>(); + + + var dataAdapter = new SerialHybridStrategyParameterDataAdapter(); + var batterySystemData = new BatterySystemData() { + Batteries = new EditableList<Tuple<int, BatteryData>>() { + new Tuple<int, BatteryData>(1, new BatteryData() { + Capacity = cap_nom, + ChargeSustainingBattery = false, + BatteryId = -42, + MaxSOC = bat_soc_max, + MinSOC = bat_soc_min, + SOCMap = new SOCMap(new SOCMap.SOCMapEntry[] { + new SOCMap.SOCMapEntry() { + BatteryVolts = Math.Max((v_nom + (v_nom * 0.1)).Value(), 0).SI<Volt>(), + SOC = 0.1 + }, + + new SOCMap.SOCMapEntry() { + BatteryVolts = v_nom, + SOC = 0.5 + }, + + new SOCMap.SOCMapEntry() { + BatteryVolts = v_nom - (v_nom * 0.1), + SOC = 0.9 + } + }) + }) + } + }; + + + + + + + + + HybridStrategyParameters parameters = null; + try { + parameters = dataAdapter.CreateHybridStrategyParameters(batterySystemData, null, mass, + VectoRunData.OvcHevMode.NotApplicable); + } catch (Exception) { + Assert.IsTrue(exception); + Assert.Pass(); + } + Assert.IsTrue(parameters!.TargetSoC.IsEqual(expected_target_soc)); + Assert.IsTrue(parameters.MinSoC.IsEqual(expected_min_soc)); + + + + + + } + + +} \ No newline at end of file