From 9cd41fdc02a44258736793658543a42dbd623e1e Mon Sep 17 00:00:00 2001 From: Markus Quaritsch <markus.quaritsch@tugraz.at> Date: Thu, 3 Dec 2020 16:57:14 +0100 Subject: [PATCH] bugfix in supercap: calculation of max discharge power, ensure initial soc is higher than min soc, fix in powertrain builder calculating aux buffer in case of supercap --- .../VectoCore/Models/Simulation/Impl/PowertrainBuilder.cs | 6 ++++++ .../VectoCore/Models/SimulationComponent/Impl/SuperCap.cs | 6 +++--- .../Models/SimulationComponent/Strategies/HybridStrategy.cs | 6 +++--- 3 files changed, 12 insertions(+), 6 deletions(-) diff --git a/VectoCore/VectoCore/Models/Simulation/Impl/PowertrainBuilder.cs b/VectoCore/VectoCore/Models/Simulation/Impl/PowertrainBuilder.cs index 8cc4e89534..30a70b1a2f 100644 --- a/VectoCore/VectoCore/Models/Simulation/Impl/PowertrainBuilder.cs +++ b/VectoCore/VectoCore/Models/Simulation/Impl/PowertrainBuilder.cs @@ -370,12 +370,18 @@ namespace TUGraz.VectoCore.Models.Simulation.Impl var es = new ElectricSystem(container); if (data.BatteryData != null) { + if (data.BatteryData.InitialSoC < data.BatteryData.MinSOC) { + throw new VectoException("Battery: Initial SoC has to be higher than min SoC"); + } var battery = new Battery(container, data.BatteryData); battery.Initialize(data.BatteryData.InitialSoC); es.Connect(battery); } if (data.SuperCapData != null) { + if (data.SuperCapData.InitialSoC < data.SuperCapData.MinVoltage / data.SuperCapData.MaxVoltage) { + throw new VectoException("SuperCap: Initial SoC has to be higher than min SoC"); + } var superCap = new SuperCap(container, data.SuperCapData); superCap.Initialize(data.SuperCapData.InitialSoC); es.Connect(superCap); diff --git a/VectoCore/VectoCore/Models/SimulationComponent/Impl/SuperCap.cs b/VectoCore/VectoCore/Models/SimulationComponent/Impl/SuperCap.cs index 621be6e2a4..e839aec156 100644 --- a/VectoCore/VectoCore/Models/SimulationComponent/Impl/SuperCap.cs +++ b/VectoCore/VectoCore/Models/SimulationComponent/Impl/SuperCap.cs @@ -1,5 +1,6 @@ using System; using System.Linq; +using TUGraz.VectoCommon.Exceptions; using TUGraz.VectoCommon.InputData; using TUGraz.VectoCommon.Models; using TUGraz.VectoCommon.Utils; @@ -57,7 +58,7 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl var maxDischargePower = InternalVoltage * maxDischargeCurrent + maxDischargeCurrent * ModelData.InternalResistance * maxDischargeCurrent; var maxPower = -InternalVoltage / (4 * ModelData.InternalResistance) * InternalVoltage; - return VectoMath.Max(maxDischargePower > 0 ? -double.MaxValue.SI<Watt>():maxDischargePower, maxPower); + return VectoMath.Max(maxDischargePower, maxPower); } public double MinSoC @@ -71,8 +72,7 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl public void Initialize(double initialSoC) { - PreviousState.Charge = ModelData.Capacity * ((ModelData.MaxVoltage - ModelData.MinVoltage) * initialSoC + - ModelData.MinVoltage); + PreviousState.Charge = ModelData.Capacity * (ModelData.MaxVoltage * initialSoC ); } diff --git a/VectoCore/VectoCore/Models/SimulationComponent/Strategies/HybridStrategy.cs b/VectoCore/VectoCore/Models/SimulationComponent/Strategies/HybridStrategy.cs index f4a0c0efa6..e790d82f2d 100644 --- a/VectoCore/VectoCore/Models/SimulationComponent/Strategies/HybridStrategy.cs +++ b/VectoCore/VectoCore/Models/SimulationComponent/Strategies/HybridStrategy.cs @@ -360,7 +360,7 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Strategies var auxEnergyReserve = ModelData.ElectricAuxDemand * StrategyParameters.AuxReserveTime; BatteryDischargeEnergyThreshold = 0.SI<WattSecond>(); if (auxEnergyReserve > 0) { - var minSoc = Math.Max(ModelData.BatteryData?.MinSOC ?? ModelData.SuperCapData.InitialSoC, + var minSoc = Math.Max(ModelData.BatteryData?.MinSOC ?? ModelData.SuperCapData.MinVoltage / ModelData.SuperCapData.MaxVoltage, StrategyParameters.MinSoC); BatteryDischargeEnergyThreshold = ModelData.BatteryData.Capacity * minSoc * ModelData.BatteryData.SOCMap.Lookup(minSoc) + @@ -985,8 +985,8 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Strategies ShiftRequired = best.Gear.Engaged && !best.Gear.Equals(currentGear), // gs?.Item1 ?? false, NextGear = best.Gear, // gs?.Item2 ?? 0, EvaluatedSolution = best, - SimulationInterval = best.SimulationInterval - }; + SimulationInterval = best.SimulationInterval + }; //var pos = retVal.MechanicalAssistPower.Keys.First(); //if (retVal.MechanicalAssistPower[pos].Item1 == null) { // retVal.MechanicalAssistPower[pos] = Tuple.Create(best.Response.ElectricMotor.AngularVelocity, retVal.MechanicalAssistPower[pos].Item2); -- GitLab