diff --git a/VectoCore/VectoCore/Models/SimulationComponent/Impl/ATGearbox.cs b/VectoCore/VectoCore/Models/SimulationComponent/Impl/ATGearbox.cs index 7ba29d28ac9aded0a597818704374c9cc8e897b1..51da402b0e0f46d8dcd748eeca99abd4a4d551b3 100644 --- a/VectoCore/VectoCore/Models/SimulationComponent/Impl/ATGearbox.cs +++ b/VectoCore/VectoCore/Models/SimulationComponent/Impl/ATGearbox.cs @@ -303,8 +303,10 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl var avgEngineSpeed = (DataBus.EngineSpeed + outAngularVelocity * effectiveRatio) / 2; powershiftLoss = aliquotEnergyLoss / dt / avgEngineSpeed; inTorque += powershiftLoss; - + //inTorque += CurrentState.PowershiftLossEnergy; + } else { + _powershiftLossEnergy = null; } } diff --git a/VectoCore/VectoCore/Models/SimulationComponent/Impl/ATShiftStrategy.cs b/VectoCore/VectoCore/Models/SimulationComponent/Impl/ATShiftStrategy.cs index 40e1c4a4340fb87f245341ec4d6c2d5a012052b3..a2a7fae5b8eccb3d14f811a40190f61ae7cd60d7 100644 --- a/VectoCore/VectoCore/Models/SimulationComponent/Impl/ATShiftStrategy.cs +++ b/VectoCore/VectoCore/Models/SimulationComponent/Impl/ATShiftStrategy.cs @@ -245,7 +245,7 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl var nextGearboxInTorque = outTorque / nextGear.TorqueConverterRatio; var shiftLosses = _gearbox.ComputeShiftLosses(outTorque, outAngularVelocity, gear + 1) / ModelData.PowershiftShiftTime / nextGearboxInSpeed; nextGearboxInTorque += shiftLosses; - var tcOperatingPoint = _gearbox.TorqueConverter.FindOperatingPoint(nextGearboxInTorque, nextGearboxInSpeed); + var tcOperatingPoint = _gearbox.TorqueConverter.FindOperatingPoint(absTime, dt, nextGearboxInTorque, nextGearboxInSpeed); var engineSpeedOverMin = tcOperatingPoint.InAngularVelocity.IsGreater(minEngineSpeed); var avgSpeed = (DataBus.EngineSpeed + tcOperatingPoint.InAngularVelocity) / 2; diff --git a/VectoCore/VectoCore/Models/SimulationComponent/Impl/TorqueConverter.cs b/VectoCore/VectoCore/Models/SimulationComponent/Impl/TorqueConverter.cs index e26ffc6ceb3ef9f70d85658acd4b8d8e5394e0a2..80fa01293c7625f2a95a5295b270f4f681ae042f 100644 --- a/VectoCore/VectoCore/Models/SimulationComponent/Impl/TorqueConverter.cs +++ b/VectoCore/VectoCore/Models/SimulationComponent/Impl/TorqueConverter.cs @@ -102,7 +102,7 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl Second absTime, Second dt, NewtonMeter outTorque, PerSecond outAngularVelocity, bool dryRun = false) { - var operatingPoint = FindOperatingPoint(outTorque, outAngularVelocity); + var operatingPoint = FindOperatingPoint(absTime, dt, outTorque, outAngularVelocity); var inTorque = CalculateAverageInTorque(operatingPoint); if (dryRun) { @@ -316,7 +316,7 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl return retVal; } - protected internal TorqueConverterOperatingPoint FindOperatingPoint( + protected internal TorqueConverterOperatingPoint FindOperatingPoint(Second absTime, Second dt, NewtonMeter outTorque, PerSecond outAngularVelocity) { @@ -324,6 +324,15 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl if (operatingPointList.Count == 0) { Log.Debug("TorqueConverter: Failed to find torque converter operating point, fallback: creeping"); var tqOperatingPoint = ModelData.FindOperatingPoint(DataBus.EngineIdleSpeed, outAngularVelocity); + + var engineResponse = (ResponseDryRun) + NextComponent.Request(absTime, dt, tqOperatingPoint.InTorque, tqOperatingPoint.InAngularVelocity, true); + + var engineOK = engineResponse.DeltaDragLoad.IsGreaterOrEqual(0) && engineResponse.DeltaFullLoad.IsSmallerOrEqual(0); + if (!engineOK) { + tqOperatingPoint = ModelData.FindOperatingPoint(VectoMath.Max(DataBus.EngineIdleSpeed, DataBus.EngineSpeed * 0.9), outAngularVelocity); + } + tqOperatingPoint.Creeping = true; return tqOperatingPoint; }