diff --git a/VectoCore/VectoCore/Models/SimulationComponent/Strategies/GensetPreprocessor.cs b/VectoCore/VectoCore/Models/SimulationComponent/Strategies/GensetPreprocessor.cs index 482ca5efcb65763c62576d0c9e7db9a9e29fe037..cf76189e231dbae76c1e0ad74ab625824f0f631b 100644 --- a/VectoCore/VectoCore/Models/SimulationComponent/Strategies/GensetPreprocessor.cs +++ b/VectoCore/VectoCore/Models/SimulationComponent/Strategies/GensetPreprocessor.cs @@ -1,6 +1,8 @@ using System; using System.Collections.Generic; +using System.ComponentModel; using System.Linq; +using TUGraz.VectoCommon.Exceptions; using TUGraz.VectoCommon.Models; using TUGraz.VectoCommon.Utils; using TUGraz.VectoCore.InputData.Reader.DataObjectAdapter; @@ -21,14 +23,16 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Strategies private CombustionEngineData IceData; private ElectricMotorData EmData; protected GenSetCharacteristics OptimalPoints; + private readonly IVehicleContainer _container; public GensetPreprocessor(GenSetCharacteristics optimalPoints, TestGenset testGenSet, CombustionEngineData engineData, - ElectricMotorData electricMotorData) + ElectricMotorData electricMotorData, IVehicleContainer container) { Genset = testGenSet; IceData = engineData; EmData = electricMotorData; OptimalPoints = optimalPoints; + _container = container; } #region Implementation of ISimulationPreprocessor @@ -49,8 +53,8 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Strategies private void MaxElectricPower(Volt voltage, bool emDerated) { var continuousTq = emDerated ? EmData.Overload.ContinuousTorque : double.MaxValue.SI<NewtonMeter>(); - var maxSpeed = VectoMath.Min(EmData.EfficiencyData.MaxSpeed, - IceData.FullLoadCurves[0].FullLoadEntries.Select(x => x.EngineSpeed).Max()); + var maxSpeedIce = IceData.FullLoadCurves[0].FullLoadEntries.Select(x => x.EngineSpeed).Max(); + var maxSpeed = VectoMath.Min(EmData.EfficiencyData.MaxSpeed, maxSpeedIce); var emFldDrivetrain = new ElectricMotorFullLoadCurve(EmData.EfficiencyData.VoltageLevels[0].FullLoadCurve .FullLoadEntries.Select(x => new ElectricMotorFullLoadCurve.FullLoadEntry() { @@ -69,20 +73,24 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Strategies MotorSpeed = maxSpeed }); } + + ///TODO consider torque demand of engine auxiliaries here var iceFld = new ElectricMotorFullLoadCurve(IceData.FullLoadCurves[0].FullLoadEntries.Select(x => new ElectricMotorFullLoadCurve.FullLoadEntry() { - FullDriveTorque = -x.TorqueFullLoad, + FullDriveTorque = -x.TorqueFullLoad + _container.EngineInfo.EngineAuxDemand(x.EngineSpeed,0.SI<Second>()) / x.EngineSpeed, FullGenerationTorque = 0.SI<NewtonMeter>(), MotorSpeed = x.EngineSpeed }).Where(x => x.MotorSpeed.IsSmallerOrEqual(maxSpeed)).ToList()); if (!iceFld.FullLoadEntries.Any(x => x.MotorSpeed.IsEqual(maxSpeed))) { iceFld.FullLoadEntries.Add(new ElectricMotorFullLoadCurve.FullLoadEntry() { - FullDriveTorque = -IceData.FullLoadCurves[0].FullLoadStationaryTorque(maxSpeed), + FullDriveTorque = -IceData.FullLoadCurves[0].FullLoadStationaryTorque(maxSpeed) + _container.EngineInfo.EngineAuxDemand(maxSpeed, 0.SI<Second>()) / maxSpeed, FullGenerationTorque = 0.SI<NewtonMeter>(), MotorSpeed = maxSpeed }); } + + var combinedFldEntries = AbstractSimulationDataAdapter.IntersectEMFullLoadCurves(iceFld, emFldDrivetrain).FullLoadEntries.Select(x => new EngineFullLoadCurve.FullLoadCurveEntry() { EngineSpeed = x.MotorSpeed, @@ -117,6 +125,16 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Strategies } else { OptimalPoints.MaxPower = tmp; } + } else { + switch (response) + { + case ResponseOverload ovld: + + default: + throw new VectoException( + $"Could not determine max {(emDerated ? "derated" : "")} electric genset power! Invalid response [{response.GetType().Name}] from {response.Source.GetType().Name}"); + break; + } } } diff --git a/VectoCore/VectoCore/Models/SimulationComponent/Strategies/SerialHybridStrategy.cs b/VectoCore/VectoCore/Models/SimulationComponent/Strategies/SerialHybridStrategy.cs index 78f5fa87f671a6be67ae557651f7615a54b8ba52..91e5aa2c49bfca6311f31aaca2afc075533f21fb 100644 --- a/VectoCore/VectoCore/Models/SimulationComponent/Strategies/SerialHybridStrategy.cs +++ b/VectoCore/VectoCore/Models/SimulationComponent/Strategies/SerialHybridStrategy.cs @@ -193,7 +193,7 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Strategies container.AddPreprocessor(new GensetPreprocessor(GenSetCharacteristics, TestGenSet, runData.EngineData, - runData.ElectricMachinesData.FirstOrDefault(x => x.Item1 == PowertrainPosition.GEN)?.Item2)); + runData.ElectricMachinesData.FirstOrDefault(x => x.Item1 == PowertrainPosition.GEN)?.Item2, container)); }