From 91a068aeca5977ea0a385d154701085cecac4080 Mon Sep 17 00:00:00 2001 From: Markus Quaritsch <markus.quaritsch@tugraz.at> Date: Thu, 14 May 2020 09:41:32 +0200 Subject: [PATCH] additional criteria for AT transmissions: if during a deceleration phase the required motor speed goes below idle speed and thus no operating point can be found at all throw an exception. in case of such an exeption, disengage for the simulation interval and perform braking with disengaged powertrain --- .../Models/SimulationComponent/Impl/Driver.cs | 33 ++++++++++++++++--- .../Impl/TorqueConverter.cs | 2 +- 2 files changed, 30 insertions(+), 5 deletions(-) diff --git a/VectoCore/VectoCore/Models/SimulationComponent/Impl/Driver.cs b/VectoCore/VectoCore/Models/SimulationComponent/Impl/Driver.cs index f29644d0fd..56ede55d48 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 4e74a81793..0dc24b6d7c 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); -- GitLab