diff --git a/VectoCommon/VectoCommon/Utils/Validation.cs b/VectoCommon/VectoCommon/Utils/Validation.cs index 7a81b6f9b56d75143d49c422f3f50892661af26e..e5a3427f2d43a79a59dad5eb7d064028cdb8878d 100644 --- a/VectoCommon/VectoCommon/Utils/Validation.cs +++ b/VectoCommon/VectoCommon/Utils/Validation.cs @@ -213,6 +213,17 @@ namespace TUGraz.VectoCommon.Utils } } + [AttributeUsage(AttributeTargets.Property | AttributeTargets.Field, AllowMultiple = true)] + public class RangeOrNaN : RangeAttribute + { + public override bool IsValid(object value) + { + return double.IsNaN((double)value) || base.IsValid(value); + } + + public RangeOrNaN(double minimum, double maximum) : base(minimum, maximum) {} + } + /// <summary> /// Attribute which validates the Min-Max Range of an SI Object. /// </summary> diff --git a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/EngineeringDataAdapter.cs b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/EngineeringDataAdapter.cs index 266f4c89d74b38e1f37de2954a202f58301e63cb..1d2484751a7c4b93d2ca4f6e4e7657f932277498 100644 --- a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/EngineeringDataAdapter.cs +++ b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/EngineeringDataAdapter.cs @@ -195,10 +195,8 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter gearData.TorqueConverterGearLossMap = gearData.LossMap; gearData.TorqueConverterShiftPolygon = gearbox.TorqueConverter.ShiftPolygon == null ? null : ShiftPolygonReader.Create(gearbox.TorqueConverter.ShiftPolygon); // NOTE: the lower gear in 'gears' dictionary has index i !! - - // todo mk-2016-10-27: do not set to NaN -- validation fails! but how to remove locked transmission for previous gear? - //gears[i].Ratio = double.NaN; - //gears[i].LossMap = null; + gears[i].Ratio = double.NaN; + gears[i].LossMap = null; } } gears.Add(i + 1, gearData); diff --git a/VectoCore/VectoCore/Models/Simulation/Data/VectoRunData.cs b/VectoCore/VectoCore/Models/Simulation/Data/VectoRunData.cs index bcfcba8473084fc2d22c24067bed86168bfb09ec..be76ceab6b4f5ee4607a201f03e6afb0f35d3947 100644 --- a/VectoCore/VectoCore/Models/Simulation/Data/VectoRunData.cs +++ b/VectoCore/VectoCore/Models/Simulation/Data/VectoRunData.cs @@ -141,13 +141,15 @@ namespace TUGraz.VectoCore.Models.Simulation.Data for (var angularVelocity = engineData.IdleSpeed; angularVelocity < engineData.FullLoadCurve.RatedSpeed; angularVelocity += 2.0 / 3.0 * (engineData.FullLoadCurve.RatedSpeed - engineData.IdleSpeed) / 10.0) { + if (!gear.Value.HasLockedGear) + continue; + var velocity = angularVelocity / gear.Value.Ratio / angledriveRatio / axlegearRatio * dynamicTyreRadius; if (velocity > maxSpeed) { continue; } - for (var inTorque = engineData.FullLoadCurve.FullLoadStationaryTorque(angularVelocity) / 3; inTorque < engineData.FullLoadCurve.FullLoadStationaryTorque(angularVelocity); inTorque += 2.0 / 3.0 * engineData.FullLoadCurve.FullLoadStationaryTorque(angularVelocity) / 10.0) { diff --git a/VectoCore/VectoCore/Models/SimulationComponent/Data/Gearbox/GearData.cs b/VectoCore/VectoCore/Models/SimulationComponent/Data/Gearbox/GearData.cs index 2fa8a90adeadc2465e141a0fa13747de1c3bb38c..06a8d9c68b38d250a643859068707f470e6ae3bf 100644 --- a/VectoCore/VectoCore/Models/SimulationComponent/Data/Gearbox/GearData.cs +++ b/VectoCore/VectoCore/Models/SimulationComponent/Data/Gearbox/GearData.cs @@ -41,7 +41,7 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Data.Gearbox [ValidateObject] public TransmissionLossMap LossMap { get; internal set; } - [Required, Range(double.Epsilon, 25)] + [Required, RangeOrNaN(double.Epsilon, 25)] public double Ratio { get; internal set; } } diff --git a/VectoCore/VectoCore/Models/SimulationComponent/Impl/ATShiftStrategy.cs b/VectoCore/VectoCore/Models/SimulationComponent/Impl/ATShiftStrategy.cs index ab8282bc00e739e87ebaa4d50a88fa1630d77251..5773929f18fc1a9296c6bf8f2065e4de9b2a72cf 100644 --- a/VectoCore/VectoCore/Models/SimulationComponent/Impl/ATShiftStrategy.cs +++ b/VectoCore/VectoCore/Models/SimulationComponent/Impl/ATShiftStrategy.cs @@ -186,10 +186,10 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl } if (!_gearbox.TorqueConverterLocked && Data.Gears.ContainsKey(gear + 1) && Data.Gears[gear + 1].HasTorqueConverter) { // C -> C upshift - var gearRatio = Data.Gears[gear + 1].Ratio / Data.Gears[gear].Ratio; + var gearRatio = Data.Gears[gear + 1].TorqueConverterRatio / Data.Gears[gear].TorqueConverterRatio; var minEnginseSpeed = VectoMath.Min(700.RPMtoRad(), gearRatio * (DataBus.EngineN80hSpeed - 150.RPMtoRad())); - var nextGbxInSpeed = outAngularVelocity * Data.Gears[gear + 1].Ratio; - var nextGbxInTorque = outTorque / Data.Gears[gear + 1].Ratio; + var nextGbxInSpeed = outAngularVelocity * Data.Gears[gear + 1].TorqueConverterRatio; + var nextGbxInTorque = outTorque / Data.Gears[gear + 1].TorqueConverterRatio; var tcOperatingPoint = _gearbox.TorqueConverter.FindOperatingPoint(nextGbxInTorque, nextGbxInSpeed); if (tcOperatingPoint.InAngularVelocity.IsGreater(minEnginseSpeed) && DataBus.EngineStationaryFullPower(tcOperatingPoint.InAngularVelocity) diff --git a/VectoCore/VectoCore/Models/SimulationComponent/Impl/AbstractGearbox.cs b/VectoCore/VectoCore/Models/SimulationComponent/Impl/AbstractGearbox.cs index 16cd74b109de31906d0cf1b66b39c2326e387138..ae9372b50ff71a6537d74474742733851810b8be 100644 --- a/VectoCore/VectoCore/Models/SimulationComponent/Impl/AbstractGearbox.cs +++ b/VectoCore/VectoCore/Models/SimulationComponent/Impl/AbstractGearbox.cs @@ -96,13 +96,12 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl public Watt GearboxLoss() { - //var outTorque = ModelData.Gears[Gear].LossMap.GetOutTorque(inAngularVelocity, inTorque, true); - //var torqueLoss = inTorque - outTorque * ModelData.Gears[Gear].Ratio; - - //return torqueLoss * inAngularVelocity; + var ratio = ModelData.Gears[PreviousState.Gear].HasLockedGear + ? ModelData.Gears[PreviousState.Gear].Ratio + : ModelData.Gears[PreviousState.Gear].TorqueConverterRatio; return (PreviousState.TransmissionTorqueLoss + - PreviousState.InertiaTorqueLossOut / ModelData.Gears[PreviousState.Gear].Ratio) * PreviousState.InAngularVelocity; + PreviousState.InertiaTorqueLossOut / ratio) * PreviousState.InAngularVelocity; } #endregion