diff --git a/VectoCore/VectoCore/InputData/FileIO/XML/Declaration/DataProvider/XMLElectricStorageSystemDeclarationInputData.cs b/VectoCore/VectoCore/InputData/FileIO/XML/Declaration/DataProvider/XMLElectricStorageSystemDeclarationInputData.cs index 93f4898b11e5b827334065248a6651096638cf04..9517346f525460a8ada0c5e7c181a77c28011b2c 100644 --- a/VectoCore/VectoCore/InputData/FileIO/XML/Declaration/DataProvider/XMLElectricStorageSystemDeclarationInputData.cs +++ b/VectoCore/VectoCore/InputData/FileIO/XML/Declaration/DataProvider/XMLElectricStorageSystemDeclarationInputData.cs @@ -413,7 +413,7 @@ namespace TUGraz.VectoCore.InputData.FileIO.XML.Declaration.DataProvider #region Implementation of ISuperCapDeclarationInputData public virtual Farad Capacity => GetDouble(XMLNames.Capacitor_Capacitance).SI<Farad>(); - public virtual Ohm InternalResistance => GetDouble(XMLNames.Capacitor_InternalResistance).SI(Unit.SI.Milli.Ohm).Cast<Ohm>(); + public virtual Ohm InternalResistance => GetDouble(XMLNames.Capacitor_InternalResistance).SI<Ohm>(); public virtual Volt MinVoltage => GetDouble(XMLNames.Capacitor_MinVoltage).SI<Volt>(); public virtual Volt MaxVoltage => GetDouble(XMLNames.Capacitor_MaxVoltage).SI<Volt>(); public virtual Ampere MaxCurrentCharge => GetDouble(XMLNames.Capacitor_MaxChargingCurrent).SI<Ampere>(); diff --git a/VectoCore/VectoCore/Models/Declaration/DeclarationData.cs b/VectoCore/VectoCore/Models/Declaration/DeclarationData.cs index 0feeb31f49f075d84c72d404c8f43720d87b1929..f357ff5f1401dd18593ad8a6e7ec886729f9b372 100644 --- a/VectoCore/VectoCore/Models/Declaration/DeclarationData.cs +++ b/VectoCore/VectoCore/Models/Declaration/DeclarationData.cs @@ -107,9 +107,12 @@ namespace TUGraz.VectoCore.Models.Declaration public static readonly PTOTransmission PTOTransmission = new PTOTransmission(); public static readonly HEVStrategyParameters HEVStrategyParameters = new HEVStrategyParameters(); + + public const double HEV_EquivalenceFactor_Min = 0.1; + public const double HEV_EquivalenceFactor_Max = 4.0; //public static readonly HEVStrategyParameters InitEquivalenceFactorsBus = new HEVStrategyParametersBus(); - public static readonly VehicleOperationLookup VehicleOperation = new VehicleOperationLookup(); + public static readonly VehicleOperationLookup VehicleOperation = new VehicleOperationLookup(); public static readonly double ElectricMachineDefaultMechanicalTransmissionEfficiency = 1; //public static MeterPerSecond CycleSpeedLimit; @@ -1483,7 +1486,12 @@ namespace TUGraz.VectoCore.Models.Declaration TorqueRatio = 0.9, Torque = -4 * first.Torque }, - }; + new TorqueConverterEntry() { + SpeedRatio = 15, + TorqueRatio = 0.85, + Torque = -4.1 * first.Torque + }, + }; foreach (var torqueConverterEntry in characteristicTorque) { torqueConverterEntry.SpeedRatio = torqueConverterEntry.SpeedRatio * ratio; torqueConverterEntry.TorqueRatio = torqueConverterEntry.TorqueRatio / ratio; diff --git a/VectoCore/VectoCore/Models/Declaration/IterativeRunStrategies/HevChargeSustainingIterativeRunStrategy.cs b/VectoCore/VectoCore/Models/Declaration/IterativeRunStrategies/HevChargeSustainingIterativeRunStrategy.cs index 7c30fe33f07c05d7d3c882f27c2153314ebf3f66..d13879ece793529412c39a2066493f12cdb7bfc1 100644 --- a/VectoCore/VectoCore/Models/Declaration/IterativeRunStrategies/HevChargeSustainingIterativeRunStrategy.cs +++ b/VectoCore/VectoCore/Models/Declaration/IterativeRunStrategies/HevChargeSustainingIterativeRunStrategy.cs @@ -65,6 +65,8 @@ namespace TUGraz.VectoCore.Models.Declaration.IterativeRunStrategies d_soc_1 = _results[iteration].d_soc; f_equiv_2 = f_equiv_1 - (d_soc_1/100 / k); + f_equiv_2 = f_equiv_2.LimitTo(DeclarationData.HEV_EquivalenceFactor_Min, + DeclarationData.HEV_EquivalenceFactor_Max); runData.HybridStrategyParameters.EquivalenceFactor = f_equiv_2; runData.HybridStrategyParameters.EquivalenceFactorCharge = f_equiv_2 * factorCharge; runData.HybridStrategyParameters.EquivalenceFactorDischarge = f_equiv_2 * factorDischarge; @@ -76,8 +78,15 @@ namespace TUGraz.VectoCore.Models.Declaration.IterativeRunStrategies f_equiv_1 = _results[0].f_equiv; f_equiv_2 = _results[1].f_equiv; - f_equiv_3 = (((0 - d_soc_1) / (d_soc_2 - d_soc_1)) * (f_equiv_2 - f_equiv_1)) + f_equiv_1; - f_equiv_3 = f_equiv_3.LimitTo(0.1, 4); + if (d_soc_1.IsGreater(0) && d_soc_2.IsGreater(0) && d_soc_1.IsEqual(d_soc_2, 1e-5)) { + f_equiv_3 = DeclarationData.HEV_EquivalenceFactor_Min; + } else if (d_soc_1.IsSmaller(0) && d_soc_2.IsSmaller(0) && d_soc_1.IsEqual(d_soc_2, 1e-5)) { + f_equiv_3 = DeclarationData.HEV_EquivalenceFactor_Max; + } else { + f_equiv_3 = (((0 - d_soc_1) / (d_soc_2 - d_soc_1)) * (f_equiv_2 - f_equiv_1)) + f_equiv_1; + } + + f_equiv_3 = f_equiv_3.LimitTo(DeclarationData.HEV_EquivalenceFactor_Min, DeclarationData.HEV_EquivalenceFactor_Max); runData.HybridStrategyParameters.EquivalenceFactor = f_equiv_3; runData.HybridStrategyParameters.EquivalenceFactorCharge = f_equiv_3 * factorCharge; runData.HybridStrategyParameters.EquivalenceFactorDischarge = f_equiv_3 * factorDischarge; diff --git a/VectoCore/VectoCore/Models/SimulationComponent/Impl/DefaultDriverStrategy.cs b/VectoCore/VectoCore/Models/SimulationComponent/Impl/DefaultDriverStrategy.cs index a59e56d9d4dfdb2a1fbfe9694b0864684b70a052..d8448b22ebde7a01c6365cc8e9055f4688dc07a4 100644 --- a/VectoCore/VectoCore/Models/SimulationComponent/Impl/DefaultDriverStrategy.cs +++ b/VectoCore/VectoCore/Models/SimulationComponent/Impl/DefaultDriverStrategy.cs @@ -232,7 +232,10 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl if (CurrentDrivingMode == DrivingMode.DrivingModeBrake) { var nextAction = GetNextDrivingAction(ds); - if (nextAction != null && !BrakeTrigger.HasEqualTrigger(nextAction) && nextAction.ActionDistance.IsSmallerOrEqual(BrakeTrigger.ActionDistance)) { + var currentDistance = DataBus.MileageCounter.Distance; + + if (nextAction != null && !BrakeTrigger.HasEqualTrigger(nextAction) && + (nextAction.ActionDistance.IsSmallerOrEqual(BrakeTrigger.ActionDistance) || nextAction.BrakingStartDistance.IsBetween(currentDistance, currentDistance + ds))) { BrakeTrigger = nextAction; } if (DataBus.MileageCounter.Distance.IsGreaterOrEqual(BrakeTrigger.TriggerDistance, 1e-3.SI<Meter>())) { diff --git a/VectoCore/VectoCore/Models/SimulationComponent/Strategies/HybridStrategy.cs b/VectoCore/VectoCore/Models/SimulationComponent/Strategies/HybridStrategy.cs index 791a20d6be1ccd7a94cbfd5075124e479cfd0021..9407295bb257f59d0a17a7187c3f2b727ce37a22 100644 --- a/VectoCore/VectoCore/Models/SimulationComponent/Strategies/HybridStrategy.cs +++ b/VectoCore/VectoCore/Models/SimulationComponent/Strategies/HybridStrategy.cs @@ -1482,8 +1482,12 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Strategies AllowICEOff(absTime), newEval, best.Setting.MechanicalAssistPower.First().Key, dryRun); if (newEval.Count > 0) { + var oldBest = best; best = DoSelectBestOption(newEval, absTime, dt, outTorque, outAngularVelocity, dryRun, currentGear); + if (best == null) { + best = oldBest; + } } } } @@ -2127,9 +2131,12 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Strategies } } - + var avgEngineSpeed = resp.Engine.DynamicFullLoadTorque.IsEqual(0) + ? resp.Engine.EngineSpeed // dynamic full load may be 0 if engine speed is too high, use this as estimate for now + : resp.Engine.DynamicFullLoadPower / resp.Engine.DynamicFullLoadTorque; if (!iceOff && /*!resp.Engine.TotalTorqueDemand.IsBetween(resp.Engine.DragTorque, resp.Engine.DynamicFullLoadTorque)*/ - (resp.Engine.TotalTorqueDemand.IsSmaller(resp.Engine.DragTorque) || resp.Engine.TotalTorqueDemand.IsGreater(resp.Engine.DynamicFullLoadTorque))) { + ((resp.Engine.TotalTorqueDemand * avgEngineSpeed).IsSmaller(resp.Engine.DragPower, Constants.SimulationSettings.LineSearchTolerance) || + (resp.Engine.TotalTorqueDemand * avgEngineSpeed).IsGreater(resp.Engine.DynamicFullLoadPower, Constants.SimulationSettings.LineSearchTolerance))) { tmp.FuelCosts = double.NaN; tmp.IgnoreReason |= resp.Engine.TotalTorqueDemand.IsGreater(resp.Engine.DynamicFullLoadTorque) ? HybridConfigurationIgnoreReason.EngineTorqueDemandTooHigh