From 2bbab145a20a4f013062377a724bcf50a90b63c1 Mon Sep 17 00:00:00 2001 From: Markus Quaritsch <markus.quaritsch@tugraz.at> Date: Mon, 26 Jul 2021 15:50:29 +0200 Subject: [PATCH] fix some testcases, hybrid stragety: calc aux energy for aux connected to REESS (approx.) --- .../Resources/XMLNames.Designer.cs | 2 +- .../VectoCommon/Resources/XMLNames.resx | 2 +- .../Models/Simulation/DataBus/IRESSInfo.cs | 2 + .../SimulationComponent/DCDCConverter.cs | 4 +- .../Data/Battery/BatteryData.cs | 4 +- .../SimulationComponent/Impl/Battery.cs | 4 +- .../SimulationComponent/Impl/BatterySystem.cs | 18 ++++++++- .../SimulationComponent/Impl/ElectricMotor.cs | 4 ++ .../SimulationComponent/Impl/SuperCap.cs | 2 + .../Strategies/HybridStrategy.cs | 37 +++++++++---------- .../Integration/Hybrid/ParallelHybridTest.cs | 2 +- .../HeavyBusPrimaryVehicle.vveh | 18 +++++---- .../vecto_vehicle-completed_heavyBus_42.xml | 6 ++- .../vecto_vehicle-completed_heavyBus.xml | 6 ++- VectoCore/VectoCoreTest/Utils/MockBattery.cs | 2 + 15 files changed, 74 insertions(+), 39 deletions(-) diff --git a/VectoCommon/VectoCommon/Resources/XMLNames.Designer.cs b/VectoCommon/VectoCommon/Resources/XMLNames.Designer.cs index 6e87b019a0..cb581783da 100644 --- a/VectoCommon/VectoCommon/Resources/XMLNames.Designer.cs +++ b/VectoCommon/VectoCommon/Resources/XMLNames.Designer.cs @@ -3787,7 +3787,7 @@ namespace TUGraz.VectoCommon.Resources { } /// <summary> - /// Looks up a localized string similar to ATEcoRollReleaseLockupClutch. + /// Looks up a localized string similar to APTEcoRollReleaseLockupClutch. /// </summary> public static string Vehicle_ADAS_ATEcoRollReleaseLockupClutch { get { diff --git a/VectoCommon/VectoCommon/Resources/XMLNames.resx b/VectoCommon/VectoCommon/Resources/XMLNames.resx index a5029ad819..5bec7fe60f 100644 --- a/VectoCommon/VectoCommon/Resources/XMLNames.resx +++ b/VectoCommon/VectoCommon/Resources/XMLNames.resx @@ -1135,7 +1135,7 @@ <value>TechnicalPermissibleMaximumLadenMass</value> </data> <data name="Vehicle_ADAS_ATEcoRollReleaseLockupClutch" xml:space="preserve"> - <value>ATEcoRollReleaseLockupClutch</value> + <value>APTEcoRollReleaseLockupClutch</value> </data> <data name="ManufacturerPrimaryVehicle" xml:space="preserve"> <value>ManufacturerPrimaryVehicle</value> diff --git a/VectoCore/VectoCore/Models/Simulation/DataBus/IRESSInfo.cs b/VectoCore/VectoCore/Models/Simulation/DataBus/IRESSInfo.cs index 4f14b5555d..9fc7a1afb1 100644 --- a/VectoCore/VectoCore/Models/Simulation/DataBus/IRESSInfo.cs +++ b/VectoCore/VectoCore/Models/Simulation/DataBus/IRESSInfo.cs @@ -19,5 +19,7 @@ namespace TUGraz.VectoCore.Models.Simulation.DataBus double MinSoC { get; } double MaxSoC { get; } + AmpereSecond Capacity { get; } + Volt NominalVoltage { get; } } } \ No newline at end of file diff --git a/VectoCore/VectoCore/Models/SimulationComponent/DCDCConverter.cs b/VectoCore/VectoCore/Models/SimulationComponent/DCDCConverter.cs index c697576c80..fd0a9d86a5 100644 --- a/VectoCore/VectoCore/Models/SimulationComponent/DCDCConverter.cs +++ b/VectoCore/VectoCore/Models/SimulationComponent/DCDCConverter.cs @@ -31,7 +31,9 @@ namespace TUGraz.VectoCore.Models.SimulationComponent public Watt PowerDemand(Second absTime, Second dt, bool dryRun) { - if ((-DataBus.BatteryInfo.MaxDischargePower(dt) * dt).IsGreater(PreviousState.ConsumedEnergy)) { + var dischargeEnergy = (-DataBus.BatteryInfo.MaxDischargePower(dt) * dt); + var chargeEnergy = (-DataBus.BatteryInfo.MaxChargePower(dt) * dt); + if (PreviousState.ConsumedEnergy.IsBetween(chargeEnergy, dischargeEnergy)) { return PreviousState.ConsumedEnergy / dt / Efficiency; } diff --git a/VectoCore/VectoCore/Models/SimulationComponent/Data/Battery/BatteryData.cs b/VectoCore/VectoCore/Models/SimulationComponent/Data/Battery/BatteryData.cs index 89c372d893..2af79ad862 100644 --- a/VectoCore/VectoCore/Models/SimulationComponent/Data/Battery/BatteryData.cs +++ b/VectoCore/VectoCore/Models/SimulationComponent/Data/Battery/BatteryData.cs @@ -25,7 +25,9 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Data.Battery { (current, s) => current + Batteries.Where(x => x.Item1 == s).Min(x => x.Item2.Capacity)); } } - } + + + } public class BatteryData { diff --git a/VectoCore/VectoCore/Models/SimulationComponent/Impl/Battery.cs b/VectoCore/VectoCore/Models/SimulationComponent/Impl/Battery.cs index 4bb7194912..2d131e2d61 100644 --- a/VectoCore/VectoCore/Models/SimulationComponent/Impl/Battery.cs +++ b/VectoCore/VectoCore/Models/SimulationComponent/Impl/Battery.cs @@ -234,7 +234,9 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl } public AmpereSecond Capacity => ModelData.Capacity; - + + public Volt NominalVoltage => ModelData.SOCMap.Lookup(0.5); + public Ampere MaxChargeCurrent(Second dt) { return VectoMath.Min( diff --git a/VectoCore/VectoCore/Models/SimulationComponent/Impl/BatterySystem.cs b/VectoCore/VectoCore/Models/SimulationComponent/Impl/BatterySystem.cs index a65a105cdf..b2856aa303 100644 --- a/VectoCore/VectoCore/Models/SimulationComponent/Impl/BatterySystem.cs +++ b/VectoCore/VectoCore/Models/SimulationComponent/Impl/BatterySystem.cs @@ -21,6 +21,8 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl protected readonly List<Battery> _batteries; private AmpereSecond _capacity; + private AmpereSecond _capacityMinSoc; + private AmpereSecond _capacityMaxSoc; public BatteryString() { @@ -94,6 +96,14 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl public Ampere Current { get; set; } + public AmpereSecond CapacityMinSoc => + _capacityMinSoc ?? (_capacityMinSoc = _batteries.Min(x => x.Capacity * x.MinSoC)); + + public AmpereSecond CapacityMaxSoc => + _capacityMaxSoc ?? (_capacityMaxSoc = _batteries.Min(x => x.Capacity * x.MaxSoC)); + + public Volt NominalVoltage => Batteries.Sum(x => x.NominalVoltage); + private Ampere SelectSolution(double[] solutions, double sign, Second dt) { var maxCurrent = Math.Sign(sign) < 0 @@ -106,6 +116,8 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl protected internal readonly Dictionary<int, BatteryString> Batteries = new Dictionary<int, BatteryString>(); private AmpereSecond _totalCapacity; + private Scalar _minSoc; + private Scalar _maxSoc; public BatterySystem(IVehicleContainer dataBus, BatterySystemData batterySystemData) : base(dataBus) { @@ -206,9 +218,11 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl return Batteries.Values.Sum(bs => bs.MaxDischargePower(dt, tPulse)); } - public double MinSoC { get; } - public double MaxSoC { get; } + public double MinSoC => _minSoc ?? (_minSoc = Batteries.Values.Sum(x => x.CapacityMinSoc) / TotalCapacity); + public double MaxSoC => _maxSoc ?? (_maxSoc = Batteries.Values.Sum(x => x.CapacityMinSoc) / TotalCapacity); + public AmpereSecond Capacity => TotalCapacity; + public Volt NominalVoltage => Batteries.Values.Select(x => x.NominalVoltage).Average(); #endregion #region Implementation of IElectricEnergyStoragePort diff --git a/VectoCore/VectoCore/Models/SimulationComponent/Impl/ElectricMotor.cs b/VectoCore/VectoCore/Models/SimulationComponent/Impl/ElectricMotor.cs index 564b82d298..ba785ec339 100644 --- a/VectoCore/VectoCore/Models/SimulationComponent/Impl/ElectricMotor.cs +++ b/VectoCore/VectoCore/Models/SimulationComponent/Impl/ElectricMotor.cs @@ -289,6 +289,10 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl IResponse retVal = null; if (NextComponent == null) { + if (electricSupplyResponse.MaxPowerDrive.IsEqual(0.SI<Watt>(), 100.SI<Watt>())) { + retVal = new ResponseBatteryEmpty(this, electricSupplyResponse); + return retVal; + } // electric motor only var remainingPower = inTorqueDt * avgDtSpeed; if (dryRun) { diff --git a/VectoCore/VectoCore/Models/SimulationComponent/Impl/SuperCap.cs b/VectoCore/VectoCore/Models/SimulationComponent/Impl/SuperCap.cs index f786f997b5..041129065c 100644 --- a/VectoCore/VectoCore/Models/SimulationComponent/Impl/SuperCap.cs +++ b/VectoCore/VectoCore/Models/SimulationComponent/Impl/SuperCap.cs @@ -56,6 +56,8 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl public double MinSoC => ModelData.MinVoltage / ModelData.MaxVoltage; public double MaxSoC => 1; + public AmpereSecond Capacity => null; + public Volt NominalVoltage => null; public void Initialize(double initialSoC) { diff --git a/VectoCore/VectoCore/Models/SimulationComponent/Strategies/HybridStrategy.cs b/VectoCore/VectoCore/Models/SimulationComponent/Strategies/HybridStrategy.cs index ac34ce3e78..0b2446c82e 100644 --- a/VectoCore/VectoCore/Models/SimulationComponent/Strategies/HybridStrategy.cs +++ b/VectoCore/VectoCore/Models/SimulationComponent/Strategies/HybridStrategy.cs @@ -586,17 +586,17 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Strategies shiftStrategyParameters.AllowedGearRangeFC = shiftStrategyParameters.AllowedGearRangeFC.LimitTo(1, 2); } - // TODO: MQ 20210712 how to handle with batterysystem - //var auxEnergyReserve = ModelData.ElectricAuxDemand * StrategyParameters.AuxReserveTime; - BatteryDischargeEnergyThreshold = 0.SI<WattSecond>(); - //if (auxEnergyReserve > 0) { - // 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) + - // auxEnergyReserve; - //} - AllowEmergencyShift = false; + // TODO: MQ 20210712 how to handle with batterysystem + //var auxEnergyReserve = ModelData.ElectricAuxDemand * StrategyParameters.AuxReserveTime; + BatteryDischargeEnergyThreshold = 0.SI<WattSecond>(); + //if (auxEnergyReserve > 0) { + // 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) + + // auxEnergyReserve; + //} + AllowEmergencyShift = false; } public virtual IHybridController Controller { protected get; set; } @@ -2261,14 +2261,13 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Strategies } // TODO: MQ 20210712 how to handle with batterysystem - //var auxEnergyReserve = ModelData.ElectricAuxDemand * StrategyParameters.AuxReserveTime; - //if (auxEnergyReserve > 0) { - // 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) + - // auxEnergyReserve; - //} + var auxEnergyReserve = ModelData.ElectricAuxDemand * StrategyParameters.AuxReserveTime; + if (auxEnergyReserve > 0) { + var minSoc = Math.Max(DataBus.BatteryInfo.MinSoC, StrategyParameters.MinSoC); + BatteryDischargeEnergyThreshold = + DataBus.BatteryInfo.Capacity * minSoc * DataBus.BatteryInfo.NominalVoltage + + auxEnergyReserve; + } PreviousState.AngularVelocity = outAngularVelocity; PreviousState.GearboxEngaged = true; diff --git a/VectoCore/VectoCoreTest/Integration/Hybrid/ParallelHybridTest.cs b/VectoCore/VectoCoreTest/Integration/Hybrid/ParallelHybridTest.cs index e462b54c99..8b81313065 100644 --- a/VectoCore/VectoCoreTest/Integration/Hybrid/ParallelHybridTest.cs +++ b/VectoCore/VectoCoreTest/Integration/Hybrid/ParallelHybridTest.cs @@ -409,7 +409,7 @@ namespace TUGraz.VectoCore.Tests.Integration.Hybrid TestCase(80, 0.5, -5, 0, TestName = "P2 Hybrid ConstantSpeed 80km/h SoC: 0.5, DH 5%"), TestCase(30, 0.25, 0, 1000, TestName = "P2 Hybrid ConstantSpeed 30km/h SoC: 0.25, level P_auxEl: 1kW"), - TestCase(30, 0.25, 0, 5000, TestName = "P2 Hybrid ConstantSpeed 30km/h SoC: 0.25, level P_auxEl: 5kW"), + TestCase(30, 0.25, 0, 0, TestName = "P2 Hybrid ConstantSpeed 30km/h SoC: 0.25, level P_auxEl: 0kW"), ] public void P2HybridConstantSpeed(double vmax, double initialSoC, double slope, double pAuxEl) { diff --git a/VectoCore/VectoCoreTest/TestData/Generic Vehicles/Engineering Mode/HeavyBusPrimary/HeavyBusPrimaryVehicle.vveh b/VectoCore/VectoCoreTest/TestData/Generic Vehicles/Engineering Mode/HeavyBusPrimary/HeavyBusPrimaryVehicle.vveh index 08fc17fd5e..166c5193b6 100644 --- a/VectoCore/VectoCoreTest/TestData/Generic Vehicles/Engineering Mode/HeavyBusPrimary/HeavyBusPrimaryVehicle.vveh +++ b/VectoCore/VectoCoreTest/TestData/Generic Vehicles/Engineering Mode/HeavyBusPrimary/HeavyBusPrimaryVehicle.vveh @@ -62,13 +62,15 @@ "SteeringPumpTechnology": [ "Dual displacement with mech. control" ], - "ElectricSupply": { - "Alternators": [ - { - "Technology": "standard alternator", - "Ratio": 1.0 - } - ], + "ElectricSupply": { + "Alternators": [ + { + "Technology": "standard alternator", + "Ratio": 1.0 + } + ], + "MaxAlternatorPower": 0, + "Technology": "conventional", "ResultCards": { "Idle": [ { @@ -114,7 +116,7 @@ ] }, "SmartElectrics": false - }, + }, "ElectricConsumers": { }, "PneumaticSupply": { diff --git a/VectoCore/VectoCoreTest/TestData/Integration/Buses/FactorMethod/vecto_vehicle-completed_heavyBus_42.xml b/VectoCore/VectoCoreTest/TestData/Integration/Buses/FactorMethod/vecto_vehicle-completed_heavyBus_42.xml index 102d148e65..6fbd95682f 100644 --- a/VectoCore/VectoCoreTest/TestData/Integration/Buses/FactorMethod/vecto_vehicle-completed_heavyBus_42.xml +++ b/VectoCore/VectoCoreTest/TestData/Integration/Buses/FactorMethod/vecto_vehicle-completed_heavyBus_42.xml @@ -18,8 +18,10 @@ xsi:schemaLocation="urn:tugraz:ivt:VectoAPI:DeclarationJob v:\VectoCore\VectoCor <TechnicalPermissibleMaximumLadenMass>18000</TechnicalPermissibleMaximumLadenMass> <AirdragModifiedMultistage>false</AirdragModifiedMultistage> <ClassBus>I+II</ClassBus> - <NumberPassengersLowerDeck>30</NumberPassengersLowerDeck> - <NumberPassengersUpperDeck>0</NumberPassengersUpperDeck> + <NumberPassengerSeatsLowerDeck>30</NumberPassengerSeatsLowerDeck> + <NumberPassengersStandingLowerDeck>0</NumberPassengersStandingLowerDeck> + <NumberPassengerSeatsUpperDeck>0</NumberPassengerSeatsUpperDeck> + <NumberPassengersStandingUpperDeck>0</NumberPassengersStandingUpperDeck> <BodyworkCode>CE</BodyworkCode> <LowEntry>true</LowEntry> <HeightIntegratedBody>3000</HeightIntegratedBody> diff --git a/VectoCore/VectoCoreTest/TestData/Integration/Buses/vecto_vehicle-completed_heavyBus.xml b/VectoCore/VectoCoreTest/TestData/Integration/Buses/vecto_vehicle-completed_heavyBus.xml index f00a8112fe..1218ea9e6c 100644 --- a/VectoCore/VectoCoreTest/TestData/Integration/Buses/vecto_vehicle-completed_heavyBus.xml +++ b/VectoCore/VectoCoreTest/TestData/Integration/Buses/vecto_vehicle-completed_heavyBus.xml @@ -18,8 +18,10 @@ xsi:schemaLocation="urn:tugraz:ivt:VectoAPI:DeclarationJob v:\VectoCore\VectoCor <TechnicalPermissibleMaximumLadenMass>15400</TechnicalPermissibleMaximumLadenMass> <AirdragModifiedMultistage>true</AirdragModifiedMultistage> <ClassBus>II+III</ClassBus> - <NumberPassengersLowerDeck>50</NumberPassengersLowerDeck> - <NumberPassengersUpperDeck>0</NumberPassengersUpperDeck> + <NumberPassengerSeatsLowerDeck>50</NumberPassengerSeatsLowerDeck> + <NumberPassengersStandingLowerDeck>0</NumberPassengersStandingLowerDeck> + <NumberPassengerSeatsUpperDeck>0</NumberPassengerSeatsUpperDeck> + <NumberPassengersStandingUpperDeck>0</NumberPassengersStandingUpperDeck> <BodyworkCode>CA</BodyworkCode> <LowEntry>true</LowEntry> <HeightIntegratedBody>2700</HeightIntegratedBody> diff --git a/VectoCore/VectoCoreTest/Utils/MockBattery.cs b/VectoCore/VectoCoreTest/Utils/MockBattery.cs index 0334390504..9dd7e3a1e6 100644 --- a/VectoCore/VectoCoreTest/Utils/MockBattery.cs +++ b/VectoCore/VectoCoreTest/Utils/MockBattery.cs @@ -40,6 +40,8 @@ namespace TUGraz.VectoCore.Tests.Utils { public double MinSoC => 0; public double MaxSoC => 1; + public AmpereSecond Capacity => null; + public Volt NominalVoltage => null; public IElectricEnergyStoragePort MainBatteryPort => this; -- GitLab