From 4436140340552172f373a0d47091962ffa7d3ced Mon Sep 17 00:00:00 2001 From: Michael Krisper <michael.krisper@tugraz.at> Date: Mon, 31 Oct 2016 13:36:47 +0100 Subject: [PATCH] added RangeOrNaN validation attribute for Gear-Ratio. Switched to TC-Ratio for NonLockedGears --- VectoCommon/VectoCommon/Utils/Validation.cs | 11 +++++++++++ .../DataObjectAdapter/EngineeringDataAdapter.cs | 6 ++---- .../VectoCore/Models/Simulation/Data/VectoRunData.cs | 4 +++- .../SimulationComponent/Data/Gearbox/GearData.cs | 2 +- .../SimulationComponent/Impl/ATShiftStrategy.cs | 6 +++--- .../SimulationComponent/Impl/AbstractGearbox.cs | 9 ++++----- 6 files changed, 24 insertions(+), 14 deletions(-) diff --git a/VectoCommon/VectoCommon/Utils/Validation.cs b/VectoCommon/VectoCommon/Utils/Validation.cs index 7a81b6f9b5..e5a3427f2d 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 266f4c89d7..1d2484751a 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 bcfcba8473..be76ceab6b 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 2fa8a90ade..06a8d9c68b 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 ab8282bc00..5773929f18 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 16cd74b109..ae9372b50f 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 -- GitLab