diff --git a/VECTO/GUI/GearboxForm.vb b/VECTO/GUI/GearboxForm.vb index fe16fdd197cf634f2cb77dd62f7f5830115d3f88..d2e992bdec8dd65118bf8bfd028db0993fcf1885 100644 --- a/VECTO/GUI/GearboxForm.vb +++ b/VECTO/GUI/GearboxForm.vb @@ -73,11 +73,17 @@ Public Class GearboxForm CbGStype.ValueMember = "Value" CbGStype.DisplayMember = "Label" - CbGStype.DataSource = [Enum].GetValues(GetType(GearboxType)) _ - .Cast(Of GearboxType)() _ - .Where(Function(type) type.ManualTransmission() OrElse type.AutomaticTransmission()) _ - .Select(Function(type) New With {Key .Value = type, .Label = type.GetLabel()}).ToList() - + If (Cfg.DeclMode) Then + CbGStype.DataSource = [Enum].GetValues(GetType(GearboxType)) _ + .Cast(Of GearboxType)() _ + .Where(Function(type) type.ManualTransmission() OrElse type = GearboxType.ATSerial) _ + .Select(Function(type) New With {Key .Value = type, .Label = type.GetLabel()}).ToList() + Else + CbGStype.DataSource = [Enum].GetValues(GetType(GearboxType)) _ + .Cast(Of GearboxType)() _ + .Where(Function(type) type.ManualTransmission() OrElse type.AutomaticTransmission()) _ + .Select(Function(type) New With {Key .Value = type, .Label = type.GetLabel()}).ToList() + End If DeclInit() _changed = False @@ -99,7 +105,7 @@ Public Class GearboxForm TbMinTimeBetweenShifts.Text = DeclarationData.Gearbox.MinTimeBetweenGearshifts.ToGUIFormat() 'cDeclaration.MinTimeBetweenGearshift(GStype) - TbTqResv.Text = (DeclarationData.Gearbox.TorqueReserve * 100).ToGUIFormat() ' cDeclaration.TqResv + TbTqResv.Text = (DeclarationData.Gearbox.TorqueReserve * 100).ToGUIFormat() ' cDeclaration.TqResv TbTqResvStart.Text = (DeclarationData.Gearbox.TorqueReserveStart * 100).ToGUIFormat() 'cDeclaration.TqResvStart TbStartSpeed.Text = DeclarationData.Gearbox.StartSpeed.ToGUIFormat() 'cDeclaration.StartSpeed TbStartAcc.Text = DeclarationData.Gearbox.StartAcceleration.ToGUIFormat() ' cDeclaration.StartAcc @@ -820,7 +826,7 @@ Public Class GearboxForm 'Dim fullLoadCurve As FullLoadCurve = ConvertToFullLoadCurve(FLD0.LnU, FLD0.LTq) Dim gears As IList(Of ITransmissionInputData) = ConvertToGears(LvGears.Items) Dim shiftLines As ShiftPolygon = GetShiftLines(engine.IdleSpeed, engineFld, vehicle, gears, gear) - If (CType(CbGStype.SelectedValue, GearboxType).ManualTransmission() AndAlso Not IsNothing(shiftLines)) Then + If (Not IsNothing(shiftLines)) Then s = New Series @@ -891,8 +897,9 @@ Public Class GearboxForm Private Function GetShiftLines(ByVal idleSpeed As PerSecond, engineFullLoadCurve As EngineFullLoadCurve, vehicle As IVehicleEngineeringInputData, gears As IList(Of ITransmissionInputData), ByVal gear As Integer) _ As ShiftPolygon + Dim maxTqStr As String = LvGears.Items(gear).SubItems(GearboxTbl.MaxTorque).Text Dim engine As CombustionEngineData = ConvertToEngineData(engineFullLoadCurve, idleSpeed, gear, - LvGears.Items(gear).SubItems(GearboxTbl.MaxTorque).Text.ToDouble(0).SI(Of NewtonMeter)) + If(String.IsNullOrWhiteSpace(maxTqStr), Nothing, maxTqStr.ToDouble(0).SI(Of NewtonMeter))) If gears.Count <= 1 Then Return Nothing End If @@ -906,7 +913,7 @@ Public Class GearboxForm If (rDyn.IsEqual(0)) Then Return Nothing End If - Dim shiftLines As ShiftPolygon = DeclarationData.Gearbox.ComputeShiftPolygon(gear - 1, + Dim shiftLines As ShiftPolygon = DeclarationData.Gearbox.ComputeShiftPolygon(CType(CbGStype.SelectedValue, GearboxType), gear - 1, engine.FullLoadCurves(CType(gear, UInteger)), gears, engine, Double.Parse(LvGears.Items(0).SubItems(GearboxTbl.Ratio).Text, CultureInfo.InvariantCulture), (rDyn)) diff --git a/VECTO/Input Files/Gearbox.vb b/VECTO/Input Files/Gearbox.vb index 91f5efc722648579e64eb23481158f704f04cc49..c25999ffe0b93fd107e43a7574b56f535e8ec515 100644 --- a/VECTO/Input Files/Gearbox.vb +++ b/VECTO/Input Files/Gearbox.vb @@ -368,6 +368,13 @@ Public Class Gearbox End Get End Property + Public ReadOnly Property IGearboxDeclarationInputData_TorqueConverter As ITorqueConverterDeclarationInputData _ + Implements IGearboxDeclarationInputData.TorqueConverter + Get + Return Me + End Get + End Property + Public ReadOnly Property ReferenceRPM As PerSecond Implements ITorqueConverterEngineeringInputData.ReferenceRPM Get Return TorqueConverterReferenceRpm.RPMtoRad() diff --git a/VectoCommon/VectoCommon/InputData/DeclarationInputData.cs b/VectoCommon/VectoCommon/InputData/DeclarationInputData.cs index f73c2afac6677a2f348d7ee25faa550f79f26b5d..862f5604db5742afa7dfad1d028f9578b3b76eca 100644 --- a/VectoCommon/VectoCommon/InputData/DeclarationInputData.cs +++ b/VectoCommon/VectoCommon/InputData/DeclarationInputData.cs @@ -211,6 +211,12 @@ namespace TUGraz.VectoCommon.InputData /// cf. VECTO Input Parameters.xlsx /// </summary> IList<ITransmissionInputData> Gears { get; } + + /// <summary> + /// P090, P091, P092, P127 + /// cf. VECTO Input Parameters.xlsx + /// </summary> + ITorqueConverterDeclarationInputData TorqueConverter { get; } } diff --git a/VectoCommon/VectoCommon/InputData/EngineeringInputData.cs b/VectoCommon/VectoCommon/InputData/EngineeringInputData.cs index c8db80a6d093c4986f7d6c8cc6ccea64c03b47c5..6ef698ff641aa6892519363d3c418a906b5a7d59 100644 --- a/VectoCommon/VectoCommon/InputData/EngineeringInputData.cs +++ b/VectoCommon/VectoCommon/InputData/EngineeringInputData.cs @@ -183,12 +183,6 @@ namespace TUGraz.VectoCommon.InputData ///// </summary> //bool SkipGears { get; } - /// <summary> - /// P090, P091, P092, P127 - /// cf. VECTO Input Parameters.xlsx - /// </summary> - ITorqueConverterEngineeringInputData TorqueConverter { get; } - Second DownshiftAfterUpshiftDelay { get; } Second UpshiftAfterDownshiftDelay { get; } @@ -196,6 +190,8 @@ namespace TUGraz.VectoCommon.InputData MeterPerSquareSecond UpshiftMinAcceleration { get; } Second PowershiftShiftTime { get; } + + new ITorqueConverterEngineeringInputData TorqueConverter { get; } } public interface ITorqueConverterEngineeringInputData : ITorqueConverterDeclarationInputData diff --git a/VectoCore/VectoCore/InputData/FileIO/JSON/JSONGearboxData.cs b/VectoCore/VectoCore/InputData/FileIO/JSON/JSONGearboxData.cs index c3bc053dba707c141392f961aceb4b742bba76f4..cefd8c1086532aba7b75c9a672fc5a92e90d0b24 100644 --- a/VectoCore/VectoCore/InputData/FileIO/JSON/JSONGearboxData.cs +++ b/VectoCore/VectoCore/InputData/FileIO/JSON/JSONGearboxData.cs @@ -348,6 +348,11 @@ namespace TUGraz.VectoCore.InputData.FileIO.JSON get { return Body.GetEx<double>(JsonKeys.Gearbox_StartTorqueReserve) / 100.0; } } + ITorqueConverterDeclarationInputData IGearboxDeclarationInputData.TorqueConverter + { + get { return TorqueConverter; } + } + public virtual ITorqueConverterEngineeringInputData TorqueConverter { get { return this; } @@ -494,7 +499,10 @@ namespace TUGraz.VectoCore.InputData.FileIO.JSON get { return "N/A"; } } - public CertificationMethod CertificationMethod { get { return CertificationMethod.NotCertified; } } + public CertificationMethod CertificationMethod + { + get { return CertificationMethod.NotCertified; } + } public string CertificationNumber { diff --git a/VectoCore/VectoCore/InputData/FileIO/XML/Declaration/XMLDeclarationGearboxDataProvider.cs b/VectoCore/VectoCore/InputData/FileIO/XML/Declaration/XMLDeclarationGearboxDataProvider.cs index 5ed7d6a5dda28f0f25956c207aadf1f0d599dda9..a620842e1e2f73b09a44cc6f1cc83fa41ca57703 100644 --- a/VectoCore/VectoCore/InputData/FileIO/XML/Declaration/XMLDeclarationGearboxDataProvider.cs +++ b/VectoCore/VectoCore/InputData/FileIO/XML/Declaration/XMLDeclarationGearboxDataProvider.cs @@ -63,6 +63,13 @@ namespace TUGraz.VectoCore.InputData.FileIO.XML.Declaration } } + public ITorqueConverterDeclarationInputData TorqueConverter + { + get { + return new XMLDeclarationTorqueConverterDataProvider(InputData); + } + } + protected ITransmissionInputData ReadGear(string gearNr) { var retVal = new TransmissionInputData(); diff --git a/VectoCore/VectoCore/InputData/FileIO/XML/Engineering/XMLEngineeringGearboxDataProvider.cs b/VectoCore/VectoCore/InputData/FileIO/XML/Engineering/XMLEngineeringGearboxDataProvider.cs index f0554c6be31fcc26661e97c25798220ff1755837..f756df129aa2ea700aac69fb50a135e83fdbc391 100644 --- a/VectoCore/VectoCore/InputData/FileIO/XML/Engineering/XMLEngineeringGearboxDataProvider.cs +++ b/VectoCore/VectoCore/InputData/FileIO/XML/Engineering/XMLEngineeringGearboxDataProvider.cs @@ -104,6 +104,12 @@ namespace TUGraz.VectoCore.InputData.FileIO.XML.Engineering get { return InputData.XMLEngineeringJobData.StartTorqueReserve; } } + + ITorqueConverterDeclarationInputData IGearboxDeclarationInputData.TorqueConverter + { + get { return TorqueConverter; } + } + public ITorqueConverterEngineeringInputData TorqueConverter { get diff --git a/VectoCore/VectoCore/InputData/Reader/ComponentData/TorqueConverterDataReader.cs b/VectoCore/VectoCore/InputData/Reader/ComponentData/TorqueConverterDataReader.cs index 136400b61ca88e633423c5b28311dd8021e67d34..b9c20ed06c1330ea9010f540a3d2f013ac69634a 100644 --- a/VectoCore/VectoCore/InputData/Reader/ComponentData/TorqueConverterDataReader.cs +++ b/VectoCore/VectoCore/InputData/Reader/ComponentData/TorqueConverterDataReader.cs @@ -60,8 +60,9 @@ namespace TUGraz.VectoCore.InputData.Reader.ComponentData public static TorqueConverterData Create(DataTable data, PerSecond referenceRpm, PerSecond maxRpm, ExecutionMode mode, double ratio, MeterPerSquareSecond lcMinAcceleration, MeterPerSquareSecond ccMinAcceleration) { - if (data == null) + if (data == null) { throw new VectoException("TorqueConverter Characteristics data is missing."); + } if (data.Columns.Count != 3) { throw new VectoException("TorqueConverter Characteristics data must consist of 3 columns"); @@ -74,30 +75,31 @@ namespace TUGraz.VectoCore.InputData.Reader.ComponentData if (HeaderIsValid(data.Columns)) { characteristicTorque = (from DataRow row in data.Rows select - new TorqueConverterEntry() { - SpeedRatio = row.ParseDouble(Fields.SpeedRatio), - Torque = row.ParseDouble(Fields.CharacteristicTorque).SI<NewtonMeter>(), - TorqueRatio = row.ParseDouble(Fields.TorqueRatio) - }).ToArray(); + new TorqueConverterEntry() { + SpeedRatio = row.ParseDouble(Fields.SpeedRatio), + Torque = row.ParseDouble(Fields.CharacteristicTorque).SI<NewtonMeter>(), + TorqueRatio = row.ParseDouble(Fields.TorqueRatio) + }).ToArray(); } else { characteristicTorque = (from DataRow row in data.Rows select - new TorqueConverterEntry() { - SpeedRatio = row.ParseDouble(0), - Torque = row.ParseDouble(2).SI<NewtonMeter>(), - TorqueRatio = row.ParseDouble(1) - }).ToArray(); + new TorqueConverterEntry() { + SpeedRatio = row.ParseDouble(0), + Torque = row.ParseDouble(2).SI<NewtonMeter>(), + TorqueRatio = row.ParseDouble(1) + }).ToArray(); } if (mode == ExecutionMode.Declaration) { + var tcDrag = DeclarationData.TorqueConverter.GetTorqueConverterDragCurve(ratio).Last(); characteristicTorque = characteristicTorque.Where(x => x.SpeedRatio < ratio) - .Concat(DeclarationData.Gearbox.GetTorqueConverterDragCurve(ratio)) + .Concat(DeclarationData.TorqueConverter.GetTorqueConverterDragCurve(ratio)) .ToArray(); } else { if (!characteristicTorque.Any(x => x.SpeedRatio > ratio)) { characteristicTorque = characteristicTorque.Where(x => x.SpeedRatio < ratio) - .Concat(DeclarationData.Gearbox.GetTorqueConverterDragCurve(ratio)) + .Concat(DeclarationData.TorqueConverter.GetTorqueConverterDragCurve(ratio)) .ToArray(); } } diff --git a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/AbstractSimulationDataAdapter.cs b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/AbstractSimulationDataAdapter.cs index 035586c46647f9d78cd25156af95c515a85239f7..4bd060470e0c18a4d2bb33434fca5171c0b6e0d9 100644 --- a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/AbstractSimulationDataAdapter.cs +++ b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/AbstractSimulationDataAdapter.cs @@ -153,6 +153,41 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter }; } + protected TransmissionLossMap CreateGearLossMap(ITransmissionInputData gear, uint i, bool useEfficiencyFallback, bool extendLossMap) + { + if (gear.LossMap != null) { + return TransmissionLossMapReader.Create(gear.LossMap, gear.Ratio, string.Format("Gear {0}", i + 1), extendLossMap); + } + if (useEfficiencyFallback) { + return TransmissionLossMapReader.Create(gear.Efficiency, gear.Ratio, string.Format("Gear {0}", i + 1)); + } + throw new InvalidFileFormatException("Gear {0} LossMap missing.", i + 1); + } + + protected static void CreateTCSecondGearATSerial(IGearboxDeclarationInputData gearbox, GearData gearData, + ShiftPolygon shiftPolygon) + { + gearData.TorqueConverterRatio = gearData.Ratio; + gearData.TorqueConverterGearLossMap = gearData.LossMap; + gearData.TorqueConverterShiftPolygon = shiftPolygon; + } + + protected static void CreateTCFirstGearATSerial(IGearboxDeclarationInputData gearbox, GearData gearData, + ShiftPolygon shiftPolygon) + { + gearData.TorqueConverterRatio = gearData.Ratio; + gearData.TorqueConverterGearLossMap = gearData.LossMap; + gearData.TorqueConverterShiftPolygon = shiftPolygon; + } + + protected static void CretateTCFirstGearATPowerSplit(IGearboxDeclarationInputData gearbox, GearData gearData, uint i, + ShiftPolygon shiftPolygon) + { + gearData.TorqueConverterRatio = 1; + gearData.TorqueConverterGearLossMap = TransmissionLossMapReader.Create(1, 1, string.Format("TCGear {0}", i + 1)); + gearData.TorqueConverterShiftPolygon = shiftPolygon; + } + public AxleGearData CreateAxleGearData(IAxleGearInputData data, bool useEfficiencyFallback) { var retVal = SetCommonAxleGearData(data); diff --git a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/DeclarationDataAdapter.cs b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/DeclarationDataAdapter.cs index b0eae3f194b31f4bdd94ee3ed9032736bc51ea61..d89d57385921b2dad75aac7040118b97083b2b2b 100644 --- a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/DeclarationDataAdapter.cs +++ b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/DeclarationDataAdapter.cs @@ -217,61 +217,86 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter WarnDeclarationMode("GearboxData"); } var retVal = SetCommonGearboxData(gearbox); - switch (retVal.Type) { + switch (gearbox.Type) { + case GearboxType.DrivingCycle: case GearboxType.ATPowerSplit: - case GearboxType.ATSerial: throw new VectoSimulationException( - "Automatic Transmission currently not supported in DeclarationMode!"); + "Unsupported gearbox type: {0}!", retVal.Type); //case GearboxType.Custom: // throw new VectoSimulationException("Custom Transmission not supported in DeclarationMode!"); } - var gears = gearbox.Gears; - if (gears.Count < 1) { + var gearsInput = gearbox.Gears; + if (gearsInput.Count < 1) { throw new VectoSimulationException( "At least one Gear-Entry must be defined in Gearbox!"); } - retVal.Inertia = DeclarationData.Gearbox.Inertia; - retVal.TractionInterruption = retVal.Type.TractionInterruption(); + SetDeclarationData(retVal); - retVal.TorqueReserve = DeclarationData.Gearbox.TorqueReserve; - retVal.StartTorqueReserve = DeclarationData.Gearbox.TorqueReserveStart; - retVal.ShiftTime = DeclarationData.Gearbox.MinTimeBetweenGearshifts; - retVal.StartSpeed = DeclarationData.Gearbox.StartSpeed; - retVal.StartAcceleration = DeclarationData.Gearbox.StartAcceleration; + var gearDifferenceRatio = gearbox.Type.AutomaticTransmission() && gearbox.Gears.Count > 2 + ? gearbox.Gears[0].Ratio / gearbox.Gears[1].Ratio + : 1.0; - TransmissionLossMap gearLossMap; - retVal.Gears = gears.Select((gear, i) => { - uint gearNbr = (uint)(i + 1); - try { - if (gear.LossMap == null) { - throw new InvalidFileFormatException(string.Format("LossMap for Gear {0} is missing.", i + 1)); + var gears = new Dictionary<uint, GearData>(); + var tcShiftPolygon = DeclarationData.TorqueConverter.ComputeShiftPolygon(engine.FullLoadCurves[0]); + for (uint i = 0; i < gearsInput.Count; i++) { + var gear = gearsInput[(int)i]; + var lossMap = CreateGearLossMap(gear, i, useEfficiencyFallback, true); + + var shiftPolygon = DeclarationData.Gearbox.ComputeShiftPolygon(gearbox.Type, (int)i, engine.FullLoadCurves[i+1], gearsInput, engine, + axlegearRatio, dynamicTyreRadius); + + var gearData = new GearData { + ShiftPolygon = shiftPolygon, + MaxSpeed = gear.MaxInputSpeed, + Ratio = gear.Ratio, + LossMap = lossMap, + }; + + if (gearbox.Type == GearboxType.ATPowerSplit && i == 0) { + // powersplit transmission: torque converter already contains ratio and losses + CretateTCFirstGearATPowerSplit(gearbox, gearData, i, tcShiftPolygon); + } + if (gearbox.Type == GearboxType.ATSerial) { + if (i == 0) { + // torqueconverter is active in first gear - duplicate ratio and lossmap for torque converter mode + CreateTCFirstGearATSerial(gearbox, gearData, tcShiftPolygon); } - gearLossMap = TransmissionLossMapReader.Create(gear.LossMap, gear.Ratio, string.Format("Gear {0}", i + 1), true); - } catch (InvalidFileFormatException) { - if (useEfficiencyFallback) { - gearLossMap = TransmissionLossMapReader.Create(gear.Efficiency, gear.Ratio, string.Format("Gear {0}", i + 1)); - } else { - throw; + if (i == 1 && gearDifferenceRatio >= DeclarationData.Gearbox.TorqueConverterSecondGearThreshold) { + // ratio between first and second gear is above threshold, torqueconverter is active in second gear as well + // -> duplicate ratio and lossmap for torque converter mode, remove locked transmission for previous gear + CreateTCSecondGearATSerial(gearbox, gearData, tcShiftPolygon); + // NOTE: the lower gear in 'gears' dictionary has index i !! + gears[i].Ratio = double.NaN; + gears[i].LossMap = null; } } + gears.Add(i + 1, gearData); + } + retVal.Gears = gears; + if (retVal.Type.AutomaticTransmission()) { + var ratio = double.IsNaN(retVal.Gears[1].Ratio) ? 1 : retVal.Gears[1].TorqueConverterRatio / retVal.Gears[1].Ratio; + retVal.PowershiftShiftTime = DeclarationData.Gearbox.PowershiftShiftTime; + retVal.TorqueConverterData = TorqueConverterDataReader.Create(gearbox.TorqueConverter.TCData, + DeclarationData.TorqueConverter.ReferenceRPM, DeclarationData.TorqueConverter.MaxInputSpeed, ExecutionMode.Declaration, ratio, + DeclarationData.TorqueConverter.CLUpshiftMinAcceleration, DeclarationData.TorqueConverter.CCUpshiftMinAcceleration); + } - var shiftPolygon = DeclarationData.Gearbox.ComputeShiftPolygon(i, engine.FullLoadCurves[gearNbr], gears, engine, - axlegearRatio, dynamicTyreRadius); - - return new KeyValuePair<uint, GearData>(gearNbr, - new GearData { - LossMap = gearLossMap, - ShiftPolygon = shiftPolygon, - MaxSpeed = gear.MaxInputSpeed, - Ratio = gear.Ratio, - }); - }).ToDictionary(kv => kv.Key, kv => kv.Value); + return retVal; + } + private static void SetDeclarationData(GearboxData retVal) + { + retVal.Inertia = DeclarationData.Gearbox.Inertia; + retVal.TractionInterruption = retVal.Type.TractionInterruption(); + retVal.TorqueReserve = DeclarationData.Gearbox.TorqueReserve; + retVal.StartTorqueReserve = DeclarationData.Gearbox.TorqueReserveStart; + retVal.ShiftTime = DeclarationData.Gearbox.MinTimeBetweenGearshifts; + retVal.StartSpeed = DeclarationData.Gearbox.StartSpeed; + retVal.StartAcceleration = DeclarationData.Gearbox.StartAcceleration; retVal.DownshiftAfterUpshiftDelay = DeclarationData.Gearbox.DownshiftAfterUpshiftDelay; retVal.UpshiftAfterDownshiftDelay = DeclarationData.Gearbox.UpshiftAfterDownshiftDelay; retVal.UpshiftMinAcceleration = DeclarationData.Gearbox.UpshiftMinAcceleration; - return retVal; } public IList<VectoRunData.AuxData> CreateAuxiliaryData(IAuxiliariesDeclarationInputData auxInputData, diff --git a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/EngineeringDataAdapter.cs b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/EngineeringDataAdapter.cs index c5c5727ba905e0148f7b86f14987e925395c7f74..8a0aceacc4728a9d68a0b15079a5e1093ef21cdf 100644 --- a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/EngineeringDataAdapter.cs +++ b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/EngineeringDataAdapter.cs @@ -172,40 +172,28 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter throw new VectoSimulationException("At least two Gear-Entries must be defined in Gearbox!"); } - retVal.Inertia = gearbox.Type.ManualTransmission() ? gearbox.Inertia : 0.SI<KilogramSquareMeter>(); - retVal.TractionInterruption = gearbox.TractionInterruption; - retVal.TorqueReserve = gearbox.TorqueReserve; - retVal.StartTorqueReserve = gearbox.StartTorqueReserve; - retVal.ShiftTime = gearbox.MinTimeBetweenGearshift; - retVal.StartSpeed = gearbox.StartSpeed; - retVal.StartAcceleration = gearbox.StartAcceleration; + SetEngineeringData(gearbox, retVal); var gearDifferenceRatio = gearbox.Type.AutomaticTransmission() && gearbox.Gears.Count > 2 ? gearbox.Gears[0].Ratio / gearbox.Gears[1].Ratio : 1.0; var gears = new Dictionary<uint, GearData>(); - + ShiftPolygon tcShiftPolygon = null; + if (gearbox.Type.AutomaticTransmission()) { + tcShiftPolygon = gearbox.TorqueConverter.ShiftPolygon != null + ? ShiftPolygonReader.Create(gearbox.TorqueConverter.ShiftPolygon) + : DeclarationData.TorqueConverter.ComputeShiftPolygon(engineData.FullLoadCurves[0]); + } for (uint i = 0; i < gearbox.Gears.Count; i++) { var gear = gearbox.Gears[(int)i]; - TransmissionLossMap lossMap; - if (gear.LossMap != null) { - lossMap = TransmissionLossMapReader.Create(gear.LossMap, gear.Ratio, string.Format("Gear {0}", i + 1)); - } else if (useEfficiencyFallback) { - lossMap = TransmissionLossMapReader.Create(gear.Efficiency, gear.Ratio, string.Format("Gear {0}", i + 1)); - } else { - throw new InvalidFileFormatException("Gear {0} LossMap or Efficiency missing.", i + 1); - } + var lossMap = CreateGearLossMap(gear, i, useEfficiencyFallback, false); - //var fullLoadCurve = IntersectFullLoadCurves(engineData.FullLoadCurve, gear.MaxTorque); - if (gearbox.Type.AutomaticTransmission() && gear.ShiftPolygon == null) { - throw new VectoException("Shiftpolygons are required for AT Gearboxes!"); - } var shiftPolygon = gear.ShiftPolygon != null && gear.ShiftPolygon.SourceType != DataSourceType.Missing ? ShiftPolygonReader.Create(gear.ShiftPolygon) - : DeclarationData.Gearbox.ComputeShiftPolygon((int)i, engineData.FullLoadCurves[i + 1], gearbox.Gears, engineData, - axlegearRatio, - dynamicTyreRadius); + : DeclarationData.Gearbox.ComputeShiftPolygon(gearbox.Type, (int)i, engineData.FullLoadCurves[i + 1], gearbox.Gears, + engineData, + axlegearRatio, dynamicTyreRadius); var gearData = new GearData { ShiftPolygon = shiftPolygon, MaxSpeed = gear.MaxInputSpeed, @@ -213,33 +201,19 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter LossMap = lossMap, }; - if (gearbox.Type == GearboxType.ATPowerSplit) { - if (i == 0) { - // powersplit transmission: torque converter already contains ratio and losses - gearData.TorqueConverterRatio = 1; - gearData.TorqueConverterGearLossMap = TransmissionLossMapReader.Create(1, 1, string.Format("TCGear {0}", i + 1)); - gearData.TorqueConverterShiftPolygon = gearbox.TorqueConverter.ShiftPolygon == null - ? null - : ShiftPolygonReader.Create(gearbox.TorqueConverter.ShiftPolygon); - } + if (gearbox.Type == GearboxType.ATPowerSplit && i == 0) { + // powersplit transmission: torque converter already contains ratio and losses + CretateTCFirstGearATPowerSplit(gearbox, gearData, i, tcShiftPolygon); } if (gearbox.Type == GearboxType.ATSerial) { if (i == 0) { // torqueconverter is active in first gear - duplicate ratio and lossmap for torque converter mode - gearData.TorqueConverterRatio = gearData.Ratio; - gearData.TorqueConverterGearLossMap = gearData.LossMap; - gearData.TorqueConverterShiftPolygon = gearbox.TorqueConverter.ShiftPolygon == null - ? null - : ShiftPolygonReader.Create(gearbox.TorqueConverter.ShiftPolygon); + CreateTCFirstGearATSerial(gearbox, gearData, tcShiftPolygon); } if (i == 1 && gearDifferenceRatio >= DeclarationData.Gearbox.TorqueConverterSecondGearThreshold) { // ratio between first and second gear is above threshold, torqueconverter is active in second gear as well // -> duplicate ratio and lossmap for torque converter mode, remove locked transmission for previous gear - gearData.TorqueConverterRatio = gearData.Ratio; - gearData.TorqueConverterGearLossMap = gearData.LossMap; - gearData.TorqueConverterShiftPolygon = gearbox.TorqueConverter.ShiftPolygon == null - ? null - : ShiftPolygonReader.Create(gearbox.TorqueConverter.ShiftPolygon); + CreateTCSecondGearATSerial(gearbox, gearData, tcShiftPolygon); // NOTE: the lower gear in 'gears' dictionary has index i !! gears[i].Ratio = double.NaN; gears[i].LossMap = null; @@ -249,30 +223,33 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter } retVal.Gears = gears; - if (retVal.Gears.Any(g => g.Value.HasTorqueConverter)) { - if (!retVal.Type.AutomaticTransmission()) { - throw new VectoException("Torque Converter can only be used with AT gearbox model"); - } + if (retVal.Type.AutomaticTransmission()) { var ratio = double.IsNaN(retVal.Gears[1].Ratio) ? 1 : retVal.Gears[1].TorqueConverterRatio / retVal.Gears[1].Ratio; + retVal.PowershiftShiftTime = gearbox.PowershiftShiftTime; retVal.TorqueConverterData = TorqueConverterDataReader.Create(gearbox.TorqueConverter.TCData, gearbox.TorqueConverter.ReferenceRPM, gearbox.TorqueConverter.MaxInputSpeed, ExecutionMode.Engineering, ratio, gearbox.TorqueConverter.CLUpshiftMinAcceleration, gearbox.TorqueConverter.CCUpshiftMinAcceleration); - } else { - if (retVal.Type.AutomaticTransmission()) { - throw new VectoException("AT gearbox model requires torque converter"); - } } - if (retVal.Type.AutomaticTransmission()) { - retVal.PowershiftShiftTime = gearbox.PowershiftShiftTime; - } + return retVal; + } + + private static void SetEngineeringData(IGearboxEngineeringInputData gearbox, GearboxData retVal) + { + retVal.Inertia = gearbox.Type.ManualTransmission() ? gearbox.Inertia : 0.SI<KilogramSquareMeter>(); + retVal.TractionInterruption = gearbox.TractionInterruption; + retVal.TorqueReserve = gearbox.TorqueReserve; + retVal.StartTorqueReserve = gearbox.StartTorqueReserve; + retVal.ShiftTime = gearbox.MinTimeBetweenGearshift; + retVal.StartSpeed = gearbox.StartSpeed; + retVal.StartAcceleration = gearbox.StartAcceleration; retVal.DownshiftAfterUpshiftDelay = gearbox.DownshiftAfterUpshiftDelay; retVal.UpshiftAfterDownshiftDelay = gearbox.UpshiftAfterDownshiftDelay; retVal.UpshiftMinAcceleration = gearbox.UpshiftMinAcceleration; - return retVal; } + public IList<VectoRunData.AuxData> CreateAuxiliaryData(IAuxiliariesEngineeringInputData auxInputData) { var auxList = new List<VectoRunData.AuxData>(auxInputData.Auxiliaries.Count + 1) { diff --git a/VectoCore/VectoCore/Models/Declaration/DeclarationData.cs b/VectoCore/VectoCore/Models/Declaration/DeclarationData.cs index c9cd23536a493c489e5512ab4562302639c0a21e..5bc9dcdff9613d2640751f2ac46b16eaa83271a6 100644 --- a/VectoCore/VectoCore/Models/Declaration/DeclarationData.cs +++ b/VectoCore/VectoCore/Models/Declaration/DeclarationData.cs @@ -177,10 +177,12 @@ namespace TUGraz.VectoCore.Models.Declaration //public static readonly PerSecond TorqueConverterSpeedLimit = 1600.RPMtoRad(); public static readonly double TorqueConverterSecondGearThreshold = 1.8; + public static readonly Second PowershiftShiftTime = 0.8.SI<Second>(); /// <summary> /// computes the shift polygons for a single gear according to the whitebook 2016 /// </summary> + /// <param name="type"></param> /// <param name="gearIdx">index of the gear to compute the shift polygons for -- gear number - 1!</param> /// <param name="fullLoadCurve">engine full load curve, potentially limited by the gearbox</param> /// <param name="gears">list of gears</param> @@ -188,7 +190,15 @@ namespace TUGraz.VectoCore.Models.Declaration /// <param name="axlegearRatio"></param> /// <param name="dynamicTyreRadius"></param> /// <returns></returns> - public static ShiftPolygon ComputeShiftPolygon(int gearIdx, EngineFullLoadCurve fullLoadCurve, + public static ShiftPolygon ComputeShiftPolygon(GearboxType type, int gearIdx, EngineFullLoadCurve fullLoadCurve, + IList<ITransmissionInputData> gears, CombustionEngineData engine, double axlegearRatio, Meter dynamicTyreRadius) + { + return type.AutomaticTransmission() + ? TorqueConverter.ComputeShiftPolygon(fullLoadCurve) // That's the same for all gears, so call the same method... + : ComputeManualTransmissionShiftPolygon(gearIdx, fullLoadCurve, gears, engine, axlegearRatio, dynamicTyreRadius); + } + + public static ShiftPolygon ComputeManualTransmissionShiftPolygon(int gearIdx, EngineFullLoadCurve fullLoadCurve, IList<ITransmissionInputData> gears, CombustionEngineData engine, double axlegearRatio, Meter dynamicTyreRadius) { if (gears.Count < 2) { @@ -209,8 +219,7 @@ namespace TUGraz.VectoCore.Models.Declaration var p3 = new Point(nVHigh.Value() * 0.9, fullLoadCurve.FullLoadStationaryTorque(nVHigh * 0.9).Value()); - var p4 = - new Point((nVHigh * (1 + diffRatio / 3)).Value(), 0); + var p4 = new Point((nVHigh * (1 + diffRatio / 3)).Value(), 0); var p5 = new Point(fullLoadCurve.N95hSpeed.Value(), fullLoadCurve.MaxTorque.Value()); var p6 = new Point(p2.X, VectoMath.Interpolate(p1, p3, p2.X)); @@ -247,7 +256,7 @@ namespace TUGraz.VectoCore.Models.Declaration var p3pExt = new Point((1.1 * p5.Y - edgeP6pP3p.OffsetXY) / edgeP6pP3p.SlopeXY, 1.1 * p5.Y); // ReSharper restore InconsistentNaming - upShift = IntersectShiftPolygon(new[] { p4, p7, p5 }.ToList(), new[] { p2p, p6p, p3pExt }.ToList()) + upShift = IntersectShiftPolygon(new[] { p4, p7, p5 }, new[] { p2p, p6p, p3pExt }) .Select(point => new ShiftPolygon.ShiftPolygonEntry() { AngularSpeed = point.X.SI<PerSecond>(), Torque = point.Y.SI<NewtonMeter>() @@ -284,12 +293,10 @@ namespace TUGraz.VectoCore.Models.Declaration internal static IEnumerable<Point> ShiftPolygonFldMargin(List<FullLoadCurve.FullLoadCurveEntry> fullLoadCurve, PerSecond rpmLimit) { - return - fullLoadCurve.TakeWhile(fldEntry => fldEntry.EngineSpeed < rpmLimit) - .Select( - fldEntry => - new Point(fldEntry.EngineSpeed.Value(), fldEntry.TorqueFullLoad.Value() * ShiftPolygonEngineFldMargin)) - .ToList(); + return fullLoadCurve.TakeWhile(fldEntry => fldEntry.EngineSpeed < rpmLimit) + .Select(fldEntry => + new Point(fldEntry.EngineSpeed.Value(), fldEntry.TorqueFullLoad.Value() * ShiftPolygonEngineFldMargin)) + .ToList(); } // ReSharper disable once InconsistentNaming @@ -300,7 +307,7 @@ namespace TUGraz.VectoCore.Models.Declaration return engineSpeed; } - internal static List<Point> IntersectShiftPolygon(List<Point> orig, List<Point> transformedDownshift) + internal static List<Point> IntersectShiftPolygon(Point[] orig, Point[] transformedDownshift) { var intersections = new List<Point>(); // compute all intersection points between both line segments @@ -352,7 +359,7 @@ namespace TUGraz.VectoCore.Models.Declaration return shiftPolygon.OrderBy(pt => pt.X).ThenBy(pt => pt.Y).ToList(); } - private static List<Point> ProjectPointsToLineSegments(List<Point> lineSegments, List<Point> points) + private static IEnumerable<Point> ProjectPointsToLineSegments(IEnumerable<Point> lineSegments, Point[] points) { var pointSet = new List<Point>(); foreach (var segment in lineSegments.Pairwise(Edge.Create)) { @@ -365,6 +372,39 @@ namespace TUGraz.VectoCore.Models.Declaration } return pointSet; } + } + + public static class TorqueConverter + { + public static readonly PerSecond ReferenceRPM = 1000.RPMtoRad(); + public static readonly PerSecond MaxInputSpeed = 5000.RPMtoRad(); + public static readonly MeterPerSquareSecond CLUpshiftMinAcceleration = 0.1.SI<MeterPerSquareSecond>(); + public static readonly MeterPerSquareSecond CCUpshiftMinAcceleration = 0.1.SI<MeterPerSquareSecond>(); + + private static PerSecond DownshiftPRM = 700.RPMtoRad(); + private static PerSecond UpshiftLowRPM = 900.RPMtoRad(); + private static PerSecond UpshiftHighRPM = 1150.RPMtoRad(); + + public static ShiftPolygon ComputeShiftPolygon(EngineFullLoadCurve fullLoadCurve) + { + var maxDragTorque = fullLoadCurve.MaxDragTorque * 1.1; + var maxTorque = fullLoadCurve.MaxTorque * 1.1; + var p0 = new Point(UpshiftLowRPM.Value(), maxDragTorque.Value()); + var p1 = new Point(UpshiftLowRPM.Value(), 0); + var p2 = new Point(UpshiftHighRPM.Value(), fullLoadCurve.FullLoadStationaryTorque(UpshiftHighRPM).Value()); + var edge = new Edge(p1, p2); + var p2corr = new Point((maxTorque.Value() - edge.OffsetXY) / edge.SlopeXY, maxTorque.Value()); + + return new ShiftPolygon( + new[] { + new ShiftPolygon.ShiftPolygonEntry() { AngularSpeed = DownshiftPRM, Torque = maxDragTorque }, + new ShiftPolygon.ShiftPolygonEntry() { AngularSpeed = DownshiftPRM, Torque = maxTorque } + }.ToList(), + new[] { p0, p1, p2corr }.Select( + pt => + new ShiftPolygon.ShiftPolygonEntry() { AngularSpeed = pt.X.SI<PerSecond>(), Torque = pt.Y.SI<NewtonMeter>() }) + .ToList()); + } public static IEnumerable<TorqueConverterEntry> GetTorqueConverterDragCurve(double ratio) { diff --git a/VectoCore/VectoCore/Models/SimulationComponent/Data/GearboxData.cs b/VectoCore/VectoCore/Models/SimulationComponent/Data/GearboxData.cs index 580bdab56eb932786bc7c60c3befcfa5e92de9e7..1d33219f7beee704a921d036f88849c3556ee61e 100644 --- a/VectoCore/VectoCore/Models/SimulationComponent/Data/GearboxData.cs +++ b/VectoCore/VectoCore/Models/SimulationComponent/Data/GearboxData.cs @@ -109,6 +109,16 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Data var emsMission = GetEmsMode(validationContext); var result = new List<ValidationResult>(); + + if (gearboxData.Gears.Any(g => g.Value.HasTorqueConverter)) { + if (!gearboxData.Type.AutomaticTransmission()) { + return new ValidationResult("Torque Converter can only be used with AT gearbox model"); + } + } else { + if (gearboxData.Type.AutomaticTransmission()) { + return new ValidationResult("AT gearbox model requires torque converter"); + } + } if (gearboxData.Type.AutomaticTransmission()) { gearboxData.TorqueConverterData.RequiredSpeedRatio = Math.Round(gearboxData.Gears[1].TorqueConverterRatio / gearboxData.Gears[1].Ratio, 4) * 0.95; diff --git a/VectoCore/VectoCore/Resources/XSD/VectoDeclarationDefinitions.1.0.xsd b/VectoCore/VectoCore/Resources/XSD/VectoDeclarationDefinitions.1.0.xsd index 7478f0cfcdfad2d4f0e46bf156ac73edc35bc57a..9871aac1d6a1f527a3b3e8713fa7df721c29702d 100644 --- a/VectoCore/VectoCore/Resources/XSD/VectoDeclarationDefinitions.1.0.xsd +++ b/VectoCore/VectoCore/Resources/XSD/VectoDeclarationDefinitions.1.0.xsd @@ -1511,27 +1511,27 @@ INVALID: 1.2345, .1234, 01.23 ToDo: -0.00 </xs:documentation> </xs:annotation> - <xs:restriction base="xs:double"> + <xs:restriction base="xs:decimal"> <xs:pattern value="[-]?([1-9][0-9]*|0)\.[0-9]{2}"/> </xs:restriction> </xs:simpleType> <xs:simpleType name="Double3"> - <xs:restriction base="xs:double"> + <xs:restriction base="xs:decimal"> <xs:pattern value="[-]?([1-9][0-9]*|0)\.[0-9]{3}"/> </xs:restriction> </xs:simpleType> <xs:simpleType name="Double4"> - <xs:restriction base="xs:double"> + <xs:restriction base="xs:decimal"> <xs:pattern value="[-]?([1-9][0-9]*|0)\.[0-9]{4}"/> </xs:restriction> </xs:simpleType> <xs:simpleType name="Double5"> - <xs:restriction base="xs:double"> + <xs:restriction base="xs:decimal"> <xs:pattern value="[-]?([1-9][0-9]*|0)\.[0-9]{5}"/> </xs:restriction> </xs:simpleType> <xs:simpleType name="Double6"> - <xs:restriction base="xs:double"> + <xs:restriction base="xs:decimal"> <xs:pattern value="[-]?([1-9][0-9]*|0)\.[0-9]{6}"/> </xs:restriction> </xs:simpleType> diff --git a/VectoCore/VectoCoreTest/Models/Declaration/ShiftPolygonTest.cs b/VectoCore/VectoCoreTest/Models/Declaration/ShiftPolygonTest.cs index fb3ae089a1bcb9088b1a67017bad810e88cc5984..450a3e386296b2554615100a5a7637b89d17800c 100644 --- a/VectoCore/VectoCoreTest/Models/Declaration/ShiftPolygonTest.cs +++ b/VectoCore/VectoCoreTest/Models/Declaration/ShiftPolygonTest.cs @@ -73,7 +73,7 @@ namespace TUGraz.VectoCore.Tests.Models.Declaration new Point(20, 20), }; - var result = DeclarationData.Gearbox.IntersectShiftPolygon(upShift.ToList(), transformed.ToList()); + var result = DeclarationData.Gearbox.IntersectShiftPolygon(upShift, transformed); Assert.AreEqual(expected.Length, result.Count); @@ -104,7 +104,7 @@ namespace TUGraz.VectoCore.Tests.Models.Declaration new Point(20, 15.6), }; - var result = DeclarationData.Gearbox.IntersectShiftPolygon(upShift.ToList(), transformed.ToList()); + var result = DeclarationData.Gearbox.IntersectShiftPolygon(upShift, transformed); Assert.AreEqual(expected.Length, result.Count); @@ -113,7 +113,7 @@ namespace TUGraz.VectoCore.Tests.Models.Declaration Assert.AreEqual(tuple.Item1.Y, tuple.Item2.Y); } - result = DeclarationData.Gearbox.IntersectShiftPolygon(transformed.ToList(), upShift.ToList()); + result = DeclarationData.Gearbox.IntersectShiftPolygon(transformed, upShift); Assert.AreEqual(expected.Length, result.Count); @@ -145,7 +145,7 @@ namespace TUGraz.VectoCore.Tests.Models.Declaration new Point(20, 20), }; - var result = DeclarationData.Gearbox.IntersectShiftPolygon(upShift.ToList(), transformed.ToList()); + var result = DeclarationData.Gearbox.IntersectShiftPolygon(upShift, transformed); Assert.AreEqual(expected.Length, result.Count); @@ -154,7 +154,7 @@ namespace TUGraz.VectoCore.Tests.Models.Declaration Assert.AreEqual(tuple.Item1.Y, tuple.Item2.Y); } - result = DeclarationData.Gearbox.IntersectShiftPolygon(transformed.ToList(), upShift.ToList()); + result = DeclarationData.Gearbox.IntersectShiftPolygon(transformed, upShift); Assert.AreEqual(expected.Length, result.Count); @@ -186,7 +186,7 @@ namespace TUGraz.VectoCore.Tests.Models.Declaration new Point(20, 16.8), }; - var result = DeclarationData.Gearbox.IntersectShiftPolygon(upShift.ToList(), transformed.ToList()); + var result = DeclarationData.Gearbox.IntersectShiftPolygon(upShift, transformed); Assert.AreEqual(expected.Length, result.Count); @@ -195,7 +195,7 @@ namespace TUGraz.VectoCore.Tests.Models.Declaration Assert.AreEqual(tuple.Item1.Y, tuple.Item2.Y, 1e-3); } - result = DeclarationData.Gearbox.IntersectShiftPolygon(transformed.ToList(), upShift.ToList()); + result = DeclarationData.Gearbox.IntersectShiftPolygon(transformed, upShift); Assert.AreEqual(expected.Length, result.Count); @@ -348,7 +348,7 @@ namespace TUGraz.VectoCore.Tests.Models.Declaration var shiftPolygons = new List<ShiftPolygon>(); for (var i = 0; i < gearboxData.Gears.Count; i++) { - shiftPolygons.Add(DeclarationData.Gearbox.ComputeShiftPolygon(i, engineData.FullLoadCurves[(uint)(i + 1)], + shiftPolygons.Add(DeclarationData.Gearbox.ComputeShiftPolygon(GearboxType.AMT, i, engineData.FullLoadCurves[(uint)(i + 1)], gearboxData.Gears, engineData, axlegearRatio, rdyn)); } @@ -405,7 +405,7 @@ namespace TUGraz.VectoCore.Tests.Models.Declaration var downshiftOrig = new List<List<Point>>(); var upshiftOrig = new List<List<Point>>(); for (var i = 0; i < gearboxData.Gears.Count; i++) { - shiftPolygons.Add(DeclarationData.Gearbox.ComputeShiftPolygon(i, fullLoadCurves[(uint)(i + 1)], gearboxData.Gears, + shiftPolygons.Add(DeclarationData.Gearbox.ComputeShiftPolygon(GearboxType.AMT,i, fullLoadCurves[(uint)(i + 1)], gearboxData.Gears, engineData, axlegearRatio, rdyn)); List<Point> tmp1, tmp2, tmp3; @@ -491,7 +491,7 @@ namespace TUGraz.VectoCore.Tests.Models.Declaration var upshiftOrig = new List<List<Point>>(); for (var i = 0; i < gearboxData.Gears.Count; i++) { shiftPolygons.Add( - DeclarationData.Gearbox.ComputeShiftPolygon(i, fullLoadCurves[(uint)(i + 1)], gearboxData.Gears, + DeclarationData.Gearbox.ComputeShiftPolygon(gearboxData.Type, i, fullLoadCurves[(uint)(i + 1)], gearboxData.Gears, engineData, axlegearRatio, rdyn.SI<Meter>()) ); List<Point> tmp1, tmp2, tmp3; diff --git a/VectoCore/VectoCoreTest/Models/SimulationComponentData/ValidationTest.cs b/VectoCore/VectoCoreTest/Models/SimulationComponentData/ValidationTest.cs index b45c8b4acb582a0081302961c02e19ddb9a67255..b1f96980a878cacd8159fb39efdcb28c4d2d4236 100644 --- a/VectoCore/VectoCoreTest/Models/SimulationComponentData/ValidationTest.cs +++ b/VectoCore/VectoCoreTest/Models/SimulationComponentData/ValidationTest.cs @@ -627,6 +627,7 @@ namespace TUGraz.VectoCore.Tests.Models.SimulationComponentData public string DigestValue { get; set; } public GearboxType Type { get; set; } public IList<ITransmissionInputData> Gears { get; set; } + ITorqueConverterDeclarationInputData IGearboxDeclarationInputData.TorqueConverter { get { return TorqueConverter; } } public KilogramSquareMeter Inertia { get; set; } public Second TractionInterruption { get; set; } public Second MinTimeBetweenGearshift { get; set; }