diff --git a/VectoCore/VectoCore/Models/SimulationComponent/Impl/AMTShiftStrategy.cs b/VectoCore/VectoCore/Models/SimulationComponent/Impl/AMTShiftStrategy.cs index 032339bdf595814d74e715907ca7c9b93df1783e..5a75944df6c6ec6b6dc072d1a5bdbb8854b5d09a 100644 --- a/VectoCore/VectoCore/Models/SimulationComponent/Impl/AMTShiftStrategy.cs +++ b/VectoCore/VectoCore/Models/SimulationComponent/Impl/AMTShiftStrategy.cs @@ -29,9 +29,11 @@ * Martin Rexeis, rexeis@ivt.tugraz.at, IVT, Graz University of Technology */ +using System.Linq; using TUGraz.VectoCommon.Utils; using TUGraz.VectoCore.Configuration; using TUGraz.VectoCore.Models.Connector.Ports.Impl; +using TUGraz.VectoCore.Models.Simulation.Data; using TUGraz.VectoCore.Models.Simulation.DataBus; using TUGraz.VectoCore.Models.SimulationComponent.Data; @@ -42,12 +44,25 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl /// </summary> public class AMTShiftStrategy : ShiftStrategy { + protected uint MaxStartGear; protected uint _nextGear { get; set; } public AMTShiftStrategy(VectoRunData runData, IDataBus dataBus) : base(runData.GearboxData, dataBus) { EarlyShiftUp = true; SkipGears = true; + + var transmissionRatio = runData.AxleGearData.AxleGear.Ratio * + (runData.AngledriveData == null ? 1.0 : runData.AngledriveData.Angledrive.Ratio) / + runData.VehicleData.DynamicTyreRadius; + var minEngineSpeed = (runData.EngineData.FullLoadCurve.RatedSpeed - runData.EngineData.IdleSpeed) * + Constants.SimulationSettings.ClutchClosingSpeedNorm + runData.EngineData.IdleSpeed; + foreach (var gearData in ModelData.Gears.Reverse()) { + if (ModelData.StartSpeed * transmissionRatio * gearData.Value.Ratio > minEngineSpeed) { + MaxStartGear = gearData.Key; + break; + } + } } private bool SpeedTooLowForEngine(uint gear, PerSecond outAngularSpeed) @@ -83,7 +98,7 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl public override uint InitGear(Second absTime, Second dt, NewtonMeter outTorque, PerSecond outAngularVelocity) { if (DataBus.VehicleSpeed.IsEqual(0)) { - for (var gear = (uint)ModelData.Gears.Count; gear > 1; gear--) { + for (var gear = MaxStartGear; gear > 1; gear--) { var inAngularSpeed = outAngularVelocity * ModelData.Gears[gear].Ratio; var ratedSpeed = DataBus.EngineRatedSpeed; @@ -98,8 +113,9 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl var inTorque = response.ClutchPowerRequest / inAngularSpeed; // if in shift curve and above idle speed and torque reserve is provided. - if (/*!IsBelowDownShiftCurve(gear, inTorque, response.EngineSpeed) &&*/ response.EngineSpeed > DataBus.EngineIdleSpeed && - reserve >= ModelData.StartTorqueReserve) { + if ( /*!IsBelowDownShiftCurve(gear, inTorque, response.EngineSpeed) &&*/ response.EngineSpeed > + DataBus.EngineIdleSpeed && + reserve >= ModelData.StartTorqueReserve) { _nextGear = gear; _gearbox.LastUpshift = absTime; _gearbox.LastDownshift = absTime;