diff --git a/VectoCore/VectoCore/Models/SimulationComponent/Impl/Driver.cs b/VectoCore/VectoCore/Models/SimulationComponent/Impl/Driver.cs index f29644d0fd6043e890607faf395034e1acf6f557..56ede55d48aa8ba07ae4d8d9f1f9cac2c1afa224 100644 --- a/VectoCore/VectoCore/Models/SimulationComponent/Impl/Driver.cs +++ b/VectoCore/VectoCore/Models/SimulationComponent/Impl/Driver.cs @@ -551,9 +551,20 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl return retVal; } - operatingPoint = SearchBrakingPower(absTime, operatingPoint.SimulationDistance, gradient, - operatingPoint.Acceleration, response); - + var engaged = (DataBus as IGearboxInfo).DisengageGearbox; + try { + operatingPoint = SearchBrakingPower( + absTime, operatingPoint.SimulationDistance, gradient, + operatingPoint.Acceleration, response); + } catch (VectoSearchAbortedException vsa) { + Log.Warn("Search braking power aborted {0}", vsa); + if (DataBus.GearboxType.AutomaticTransmission()) { + (DataBus as IGearboxControl).DisengageGearbox = true; + operatingPoint = SearchBrakingPower( + absTime, operatingPoint.SimulationDistance, gradient, + operatingPoint.Acceleration, response); + } + } if (!ds.IsEqual(operatingPoint.SimulationDistance, 1E-15.SI<Meter>())) { Log.Info( "SearchOperatingPoint Braking reduced the max. distance: {0} -> {1}. Issue new request from driving cycle!", @@ -648,7 +659,10 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl retVal.SimulationInterval = operatingPoint.SimulationInterval; retVal.SimulationDistance = ds; retVal.OperatingPoint = operatingPoint; - + + if (DataBus.GearboxType.AutomaticTransmission() && engaged != (DataBus as IGearboxInfo).DisengageGearbox) { + (DataBus as IGearboxControl).DisengageGearbox = engaged; + } return retVal; } @@ -794,6 +808,17 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl : response.GearboxPowerRequest; return delta.Value(); }, + abortCriterion: (result, i) => { + if (i < 7) { + return false; + } + var response = (ResponseDryRun)result; + if (response == null) { + return false; + } + + return DataBus.GearboxType.AutomaticTransmission() && response.DeltaDragLoad.Value().IsSmallerOrEqual(-double.MaxValue / 20); + }, forceLineSearch: DataBus.GearboxType.AutomaticTransmission() && !DataBus.TCLocked); return operatingPoint; diff --git a/VectoCore/VectoCore/Models/SimulationComponent/Impl/TorqueConverter.cs b/VectoCore/VectoCore/Models/SimulationComponent/Impl/TorqueConverter.cs index 4e74a81793928303ae1cfd61c21896cb5a0b5dda..0dc24b6d7c140171f33d7d7842cfc517f0fcafd7 100644 --- a/VectoCore/VectoCore/Models/SimulationComponent/Impl/TorqueConverter.cs +++ b/VectoCore/VectoCore/Models/SimulationComponent/Impl/TorqueConverter.cs @@ -310,7 +310,7 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl var maxSpeed = VectoMath.Min(ModelData.TorqueConverterSpeedLimit, DataBus.EngineN95hSpeed); for (var n = DataBus.EngineIdleSpeed; n <= maxSpeed; - n += maxSpeed / 20) { + n += maxSpeed / 100) { var tcOp = ModelData.FindOperatingPoint(n, outAngularVelocity); var inTorque = CalculateAverageInTorque(tcOp); var res = (ResponseDryRun)NextComponent.Request(absTime, dt, inTorque, tcOp.InAngularVelocity, true);