diff --git a/VectoCore/VectoCore/Models/Simulation/Impl/PowertrainBuilder.cs b/VectoCore/VectoCore/Models/Simulation/Impl/PowertrainBuilder.cs index b60112e7517895015751d995971f00b42b08fb2f..22fda1ad32151ccf707e87fddc8e92b22134ea43 100644 --- a/VectoCore/VectoCore/Models/Simulation/Impl/PowertrainBuilder.cs +++ b/VectoCore/VectoCore/Models/Simulation/Impl/PowertrainBuilder.cs @@ -67,6 +67,7 @@ namespace TUGraz.VectoCore.Models.Simulation.Impl Tuple.Create<GbxTypeList, string, string, StrategyCreator>( new GbxTypeList {GearboxType.AMT}, typeof(AMTShiftStrategyV2).FullName, AMTShiftStrategyV2.Name, (r, c) => new AMTShiftStrategyV2(r, c)), Tuple.Create<GbxTypeList, string, string, StrategyCreator>( new GbxTypeList {GearboxType.ATPowerSplit, GearboxType.ATSerial}, typeof(ATShiftStrategy).FullName, ATShiftStrategy.Name, (r, c) => new ATShiftStrategy(r, c)), Tuple.Create<GbxTypeList, string, string, StrategyCreator>( new GbxTypeList {GearboxType.ATPowerSplit, GearboxType.ATSerial}, typeof(ATShiftStrategyVoith).FullName, ATShiftStrategyVoith.Name, (r, c) => new ATShiftStrategyVoith(r, c)), + Tuple.Create<GbxTypeList, string, string, StrategyCreator>( new GbxTypeList {GearboxType.ATPowerSplit, GearboxType.ATSerial}, typeof(ATShiftStrategyOptimized).FullName, ATShiftStrategyOptimized.Name, (r, c) => new ATShiftStrategyOptimized(r, c)), }; @@ -437,10 +438,7 @@ namespace TUGraz.VectoCore.Models.Simulation.Impl private static IGearbox GetSimpleGearbox(IVehicleContainer container, VectoRunData runData) { - if (runData.GearboxData.Type != GearboxType.AMT) { - throw new VectoException("SimplePowertrain only supports AMT gearbox!"); - } - return new Gearbox(container, null, runData); + return runData.GearboxData.Type.AutomaticTransmission() ? (IGearbox) new ATGearbox(container, null, runData) : new Gearbox(container, null, runData); } public static IEnumerable<Tuple<string, string>> GetRegisteredShiftStrategies(GearboxType? type) diff --git a/VectoCore/VectoCore/Models/Simulation/Impl/VehicleContainer.cs b/VectoCore/VectoCore/Models/Simulation/Impl/VehicleContainer.cs index 368d5154ca3feca4c8affe9bda3799c64b4a3039..b7747fe208273584aceeb9b5660c636fb36aa7ee 100644 --- a/VectoCore/VectoCore/Models/Simulation/Impl/VehicleContainer.cs +++ b/VectoCore/VectoCore/Models/Simulation/Impl/VehicleContainer.cs @@ -286,7 +286,7 @@ namespace TUGraz.VectoCore.Models.Simulation.Impl get { return ModData.FuelData.FuelType; } } - public Second AbsTime { get; set; } + public virtual Second AbsTime { get; set; } public void AddComponent(VectoSimulationComponent component) { diff --git a/VectoCore/VectoCore/Models/SimulationComponent/Impl/AMTShiftStrategyOptimized.cs b/VectoCore/VectoCore/Models/SimulationComponent/Impl/AMTShiftStrategyOptimized.cs index 6a87a6893009fa0c54c54ec7d3bf277834e93295..b9fdad187ef71fc038215cd000f8bcdaef11176b 100644 --- a/VectoCore/VectoCore/Models/SimulationComponent/Impl/AMTShiftStrategyOptimized.cs +++ b/VectoCore/VectoCore/Models/SimulationComponent/Impl/AMTShiftStrategyOptimized.cs @@ -17,6 +17,7 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl private Dictionary<uint, EngineFullLoadCurve> fld; private ShiftStrategyParameters shiftStrategyParameters; private SimplePowertrainContainer TestContainer; + private Gearbox TestContainerGbx; public AMTShiftStrategyOptimized(VectoRunData runData, IDataBus dataBus) : base(runData, dataBus) { @@ -31,6 +32,10 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl var builder = new PowertrainBuilder(modData); TestContainer = new SimplePowertrainContainer(runData); builder.BuildSimplePowertrain(runData, TestContainer); + TestContainerGbx = TestContainer.GearboxCtl as Gearbox; + if (TestContainerGbx == null) { + throw new VectoException("Unknown gearboxtype: {0}", TestContainer.GearboxCtl.GetType().FullName); + } } #region Overrides of AMTShiftStrategy @@ -136,8 +141,8 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl protected override ResponseDryRun RequestDryRunWithGear( Second absTime, Second dt, NewtonMeter outTorque, PerSecond outAngularVelocity, uint tryNextGear) { - TestContainer.GearboxCtl.Disengaged = false; - TestContainer.GearboxCtl.Gear = tryNextGear; + TestContainerGbx.Disengaged = false; + TestContainerGbx.Gear = tryNextGear; TestContainer.GearboxOutPort.Initialize(outTorque, outAngularVelocity); var response = (ResponseDryRun)TestContainer.GearboxOutPort.Request( diff --git a/VectoCore/VectoCore/Models/SimulationComponent/Impl/AMTShiftStrategyV2.cs b/VectoCore/VectoCore/Models/SimulationComponent/Impl/AMTShiftStrategyV2.cs index f97266dc4eb58c1872a88e8688daa28b5a849858..ce3250d6a8dad3d94afbce9718e8eea197dade3f 100644 --- a/VectoCore/VectoCore/Models/SimulationComponent/Impl/AMTShiftStrategyV2.cs +++ b/VectoCore/VectoCore/Models/SimulationComponent/Impl/AMTShiftStrategyV2.cs @@ -40,6 +40,7 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl private MeterPerSecond demandedSpeed = 0.SI<MeterPerSecond>(); private MeterPerSquareSecond driverAccelerationAvg; private Radian gradient = 0.SI<Radian>(); + private Gearbox TestContainerGbx; public struct HistoryEntry { @@ -73,6 +74,10 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl var builder = new PowertrainBuilder(modData); TestContainer = new SimplePowertrainContainer(data); builder.BuildSimplePowertrain(data, TestContainer); + TestContainerGbx = TestContainer.GearboxCtl as Gearbox; + if (TestContainerGbx == null) { + throw new VectoException("Unknown gearboxtype: {0}", TestContainer.GearboxCtl.GetType().FullName); + } // register pre-processors var maxG = data.Cycle.Entries.Max(x => Math.Abs(x.RoadGradientPercent.Value())) + 1; @@ -317,7 +322,7 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl bool driveOff, uint gear, uint currentGear, Radian gradient, MeterPerSecond predictionVelocity, MeterPerSecond velocityAfterGearshift, MeterPerSquareSecond accRsv, MeterPerSquareSecond driverAccelerationAvg) { - TestContainer.GearboxCtl.Gear = gear; + TestContainerGbx.Gear = gear; TestContainer.VehiclePort.Initialize(predictionVelocity, gradient); var respAccRsv = (ResponseDryRun)TestContainer.VehiclePort.Request( @@ -498,7 +503,7 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl i <= Math.Min(ModelData.Gears.Count, gear + ShiftStrategyParameters.AllowedGearRangeUp); i++) { var nextGear = (uint)i; - TestContainer.GearboxCtl.Gear = nextGear; + TestContainerGbx.Gear = nextGear; var init = TestContainer.VehiclePort.Initialize(predictedVelocity, gradient); if (init.EngineSpeed > GetEngineSpeedLimitLow(false) && init.EngineSpeed < upperEngineSpeedLimit) { @@ -513,7 +518,7 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl i >= Math.Max(1, gear + ShiftStrategyParameters.AllowedGearRangeDown); i--) { var nextGear = (uint)i; - TestContainer.GearboxCtl.Gear = nextGear; + TestContainerGbx.Gear = nextGear; var init = TestContainer.VehiclePort.Initialize(predictedVelocity, gradient); if (init.EngineSpeed > GetEngineSpeedLimitLow(false) && init.EngineSpeed < upperEngineSpeedLimit) { @@ -649,7 +654,7 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl var averageAccelerationTorque = AverageAccelerationTorqueLookup.Interpolate( responseDriverDemand.EngineSpeed, responseDriverDemand.EngineTorqueDemand); - TestContainer.GearboxCtl.Gear = gear; + TestContainerGbx.Gear = gear; var initResponse = TestContainer.VehiclePort.Initialize(vehicleSpeed, estimatedGradient); var delta = initResponse.EngineTorqueDemand - averageAccelerationTorque; var acceleration = SearchAlgorithm.Search( diff --git a/VectoCore/VectoCore/Models/SimulationComponent/Impl/ATGearbox.cs b/VectoCore/VectoCore/Models/SimulationComponent/Impl/ATGearbox.cs index 41aea191c52f1bb79c0d1e23fa9fed6e3cda123c..be2627fa695700f2da82c46cc58de29aadb3220b 100644 --- a/VectoCore/VectoCore/Models/SimulationComponent/Impl/ATGearbox.cs +++ b/VectoCore/VectoCore/Models/SimulationComponent/Impl/ATGearbox.cs @@ -64,7 +64,9 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl : base(container, runData) { _strategy = strategy; - _strategy.Gearbox = this; + if (_strategy != null) { + _strategy.Gearbox = this; + } LastShift = -double.MaxValue.SI<Second>(); TorqueConverter = new TorqueConverter(this, _strategy, container, ModelData.TorqueConverterData, runData); @@ -330,7 +332,7 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl return response; } var retVal = NextComponent.Request(absTime, dt, inTorque, inAngularVelocity, dryRun); - if (!dryRun && retVal is ResponseSuccess && + if (!dryRun && retVal is ResponseSuccess && _strategy != null && _strategy.ShiftRequired(absTime, dt, outTorque, outAngularVelocity, inTorque, inAngularVelocity, Gear, LastShift, retVal)) { retVal = new ResponseGearShift { Source = this }; @@ -412,7 +414,7 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl container[ModalResultField.n_gbx_out_avg] = avgOutAngularSpeed; container[ModalResultField.T_gbx_out] = CurrentState.OutTorque; - _strategy.WriteModalResults(container); + _strategy?.WriteModalResults(container); } protected override void DoCommitSimulationStep() diff --git a/VectoCore/VectoCore/Models/SimulationComponent/Impl/ATShiftStrategy.cs b/VectoCore/VectoCore/Models/SimulationComponent/Impl/ATShiftStrategy.cs index f36cdde819e7fb2ef707265b94814980fa9331c8..bd028588c3cc3b8f0a9c631defd8eaf065777cfd 100644 --- a/VectoCore/VectoCore/Models/SimulationComponent/Impl/ATShiftStrategy.cs +++ b/VectoCore/VectoCore/Models/SimulationComponent/Impl/ATShiftStrategy.cs @@ -232,9 +232,23 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl return result.Value; } } + + if (gear < ModelData.Gears.Keys.Max()) { + var earlyUpshift = CheckEarlyUpshift( + absTime, dt, outTorque, outAngularVelocity, inTorque, inAngularVelocity, gear, lastShiftTime); + if (earlyUpshift.HasValue) { + return earlyUpshift.Value; + } + } + return false; } + protected virtual bool? CheckEarlyUpshift(Second absTime, Second dt, NewtonMeter outTorque, PerSecond outAngularVelocity, NewtonMeter inTorque, PerSecond inAngularVelocity, uint gear, Second lastShiftTime) + { + return null; + } + protected virtual bool? CheckUpshiftTcTc(Second absTime, Second dt, NewtonMeter outTorque, PerSecond outAngularVelocity, uint gear, GearData currentGear) { @@ -374,9 +388,22 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl } } + if (gear > 1 || (gear == 1 && _gearbox.TorqueConverterLocked)) { + var earlyDownshift = CheckEarlyDownshift( + absTime, dt, outTorque, outAngularVelocity, inTorque, inAngularVelocity, gear, lastShiftTime); + if (earlyDownshift.HasValue) { + return earlyDownshift.Value; + } + } + return false; } + protected virtual bool? CheckEarlyDownshift(Second absTime, Second dt, NewtonMeter outTorque, PerSecond outAngularVelocity, NewtonMeter inTorque, PerSecond inAngularVelocity, uint gear, Second lastShiftTime) + { + return null; + } + protected virtual void SetGear(NextGearState gbxState) { _gearbox.Gear = gbxState.Gear; diff --git a/VectoCore/VectoCore/Models/SimulationComponent/Impl/ATShiftStrategyOptimized.cs b/VectoCore/VectoCore/Models/SimulationComponent/Impl/ATShiftStrategyOptimized.cs new file mode 100644 index 0000000000000000000000000000000000000000..774bd197dd7314347527a4ed20ad98a7ddbb0b27 --- /dev/null +++ b/VectoCore/VectoCore/Models/SimulationComponent/Impl/ATShiftStrategyOptimized.cs @@ -0,0 +1,141 @@ +using System.Collections.Generic; +using TUGraz.VectoCommon.Exceptions; +using TUGraz.VectoCommon.Utils; +using TUGraz.VectoCore.Models.Connector.Ports.Impl; +using TUGraz.VectoCore.Models.Simulation.Data; +using TUGraz.VectoCore.Models.Simulation.DataBus; +using TUGraz.VectoCore.Models.Simulation.Impl; +using TUGraz.VectoCore.Models.SimulationComponent.Data.Engine; +using TUGraz.VectoCore.OutputData; + +namespace TUGraz.VectoCore.Models.SimulationComponent.Impl +{ + + + public class ATShiftStrategyOptimized : ATShiftStrategy + { + private FuelConsumptionMap fcMap; + private Dictionary<uint, EngineFullLoadCurve> fld; + private ShiftStrategyParameters shiftStrategyParameters; + private SimplePowertrainContainer TestContainer; + private ATGearbox TestContainerGbx; + + + public new static string Name + { + get { return "AT shift strategy w early upshift (FC-based)"; } + } + + public ATShiftStrategyOptimized(VectoRunData runData, IDataBus dataBus) : base(runData, dataBus) + { + fcMap = runData.EngineData.ConsumptionMap; + fld = runData.EngineData.FullLoadCurves; + shiftStrategyParameters = runData.GearshiftParameters; + if (shiftStrategyParameters == null) { + throw new VectoException("Parameters for shift strategy missing!"); + } + + var modData = new ModalDataContainer(runData, null, null, false); + var builder = new PowertrainBuilder(modData); + TestContainer = new SimplePowertrainContainer(runData); + builder.BuildSimplePowertrain(runData, TestContainer); + TestContainerGbx = TestContainer.GearboxCtl as ATGearbox; + if (TestContainerGbx == null) { + throw new VectoException("Unknown gearboxtype: {0}", TestContainer.GearboxCtl.GetType().FullName); + } + + + } + + #region Overrides of ATShiftStrategy + + protected override bool? CheckEarlyUpshift( + Second absTime, Second dt, NewtonMeter outTorque, PerSecond outAngularVelocity, NewtonMeter origInTorque, + PerSecond origInAngularVelocity, uint currentGear, Second lastShiftTime) + { + var tryNextGear = _gearbox.TorqueConverterLocked ? currentGear + 1 : currentGear; + if (!(ModelData.Gears[tryNextGear].Ratio <= shiftStrategyParameters.RatioEarlyDownshiftFC)) { + return null; + } + + var response = RequestDryRunWithGear(absTime, dt, outTorque, outAngularVelocity, tryNextGear, true); + + var inAngularVelocity = ModelData.Gears[tryNextGear].Ratio * outAngularVelocity; + var inTorque = response.EnginePowerRequest / inAngularVelocity; + + // if next gear supplied enough power reserve: take it + // otherwise take + if (!ModelData.Gears[tryNextGear].ShiftPolygon.IsBelowDownshiftCurve(inTorque, inAngularVelocity)) { + var fullLoadPower = response.EnginePowerRequest - response.DeltaFullLoad; + var reserve = 1 - response.EnginePowerRequest / fullLoadPower; + + var responseCurrent = RequestDryRunWithGear(absTime, dt, outTorque, outAngularVelocity, currentGear, _gearbox.TorqueConverterLocked); + var fcCurrent = fcMap.GetFuelConsumption( + responseCurrent.EngineTorqueDemand.LimitTo( + fld[currentGear].DragLoadStationaryTorque(responseCurrent.EngineSpeed), + fld[currentGear].FullLoadStationaryTorque(responseCurrent.EngineSpeed)) + , responseCurrent.EngineSpeed); + var fcNext = fcMap.GetFuelConsumption( + response.EngineTorqueDemand.LimitTo( + fld[tryNextGear].DragLoadStationaryTorque(response.EngineSpeed), + fld[tryNextGear].FullLoadStationaryTorque(response.EngineSpeed)), response.EngineSpeed); + + if (reserve >= ModelData.TorqueReserve && fcNext.Value.IsSmaller(fcCurrent.Value * shiftStrategyParameters.RatingFactorCurrentGear)) { + Upshift(absTime, currentGear); + return true; + } + } + return null; + } + + protected override bool? CheckEarlyDownshift( + Second absTime, Second dt, NewtonMeter outTorque, PerSecond outAngularVelocity, NewtonMeter origInTorque, + PerSecond origInAngularVelocity, uint currentGear, Second lastShiftTime) + { + var tryNextGear = _gearbox.TorqueConverterLocked && currentGear == 1 ? currentGear : currentGear - 1; + var tryNextTc = currentGear == 1 && _gearbox.TorqueConverterLocked ? false : true; + if (!(ModelData.Gears[tryNextGear].Ratio < shiftStrategyParameters.RatioEarlyUpshiftFC)) { + return null; + } + + var response = RequestDryRunWithGear(absTime, dt, outTorque, outAngularVelocity, tryNextGear, tryNextTc); + + var inAngularVelocity = ModelData.Gears[tryNextGear].Ratio * outAngularVelocity; + var inTorque = response.EnginePowerRequest / inAngularVelocity; + + if (!IsAboveUpShiftCurve(tryNextGear, inTorque, inAngularVelocity, tryNextTc)) { + var responseCurrent = RequestDryRunWithGear(absTime, dt, outTorque, outAngularVelocity, currentGear, _gearbox.TorqueConverterLocked); + var fcCurrent = fcMap.GetFuelConsumption( + responseCurrent.EngineTorqueDemand.LimitTo( + fld[currentGear].DragLoadStationaryTorque(responseCurrent.EngineSpeed), + fld[currentGear].FullLoadStationaryTorque(responseCurrent.EngineSpeed)) + , responseCurrent.EngineSpeed); + var fcNext = fcMap.GetFuelConsumption( + response.EngineTorqueDemand.LimitTo( + fld[tryNextGear].DragLoadStationaryTorque(response.EngineSpeed), + fld[tryNextGear].FullLoadStationaryTorque(response.EngineSpeed)), response.EngineSpeed); + + if (fcNext.Value.IsSmaller(fcCurrent.Value * shiftStrategyParameters.RatingFactorCurrentGear)) { + Downshift(absTime, currentGear); + return true; + } + } + + return null; + } + + #endregion + + protected ResponseDryRun RequestDryRunWithGear(Second absTime, Second dt, NewtonMeter outTorque, PerSecond outAngularVelocity, uint tryNextGear, bool tcLocked) + { + TestContainerGbx.Disengaged = false; + TestContainerGbx.Gear = tryNextGear; + TestContainerGbx.TorqueConverterLocked = tcLocked; + + TestContainer.GearboxOutPort.Initialize(outTorque, outAngularVelocity); + var response = (ResponseDryRun)TestContainer.GearboxOutPort.Request( + 0.SI<Second>(), dt, outTorque, outAngularVelocity, true); + return response; + } + } +} diff --git a/VectoCore/VectoCore/Models/SimulationComponent/Impl/MaxCardanTorquePreprocessor.cs b/VectoCore/VectoCore/Models/SimulationComponent/Impl/MaxCardanTorquePreprocessor.cs index bc9d2d0461149fc664eefef4657eeb7c6f3666a6..02eba65806f972d19c0c877e7731e672d9f9507a 100644 --- a/VectoCore/VectoCore/Models/SimulationComponent/Impl/MaxCardanTorquePreprocessor.cs +++ b/VectoCore/VectoCore/Models/SimulationComponent/Impl/MaxCardanTorquePreprocessor.cs @@ -1,4 +1,5 @@ using System.Collections.Generic; +using TUGraz.VectoCommon.Exceptions; using TUGraz.VectoCommon.Utils; using TUGraz.VectoCore.Models.Connector.Ports.Impl; using TUGraz.VectoCore.Models.Simulation; @@ -25,7 +26,12 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl { { var retVal = new Dictionary<uint, List<KeyValuePair<PerSecond, NewtonMeter>>>(Data.GearboxData.Gears.Count); - TestContainer.GearboxCtl.Gear = 1; + var testContainerGbx = TestContainer.GearboxCtl as Gearbox; + if (testContainerGbx == null) { + throw new VectoException("Unknown gearboxtype: {0}", TestContainer.GearboxCtl.GetType().FullName); + } + + testContainerGbx.Gear = 1; var init = TestContainer.VehiclePort.Initialize(Data.GearshiftParameters.StartVelocity, 0.SI<Radian>()); var powertrainRatioWOGearbox = (Data.GearshiftParameters.StartVelocity / init.EngineSpeed * Data.GearboxData.Gears[1].Ratio).Cast<Meter>(); @@ -33,7 +39,7 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl { foreach (var gearData in Data.GearboxData.Gears) { retVal[gearData.Key] = new List<KeyValuePair<PerSecond, NewtonMeter>>(); - TestContainer.GearboxCtl.Gear = gearData.Key; + testContainerGbx.Gear = gearData.Key; for (var engineSpeed = Data.EngineData.IdleSpeed; engineSpeed < Data.EngineData.FullLoadCurves[0].N95hSpeed; engineSpeed += engineSpeedSteps) { diff --git a/VectoCore/VectoCore/Models/SimulationComponent/Impl/SimplePowertrainContainer.cs b/VectoCore/VectoCore/Models/SimulationComponent/Impl/SimplePowertrainContainer.cs index 2817bc38befeecb48da848a470a5baa722524de6..178defe6e1b6f809a1437cd5c4afd829c4199174 100644 --- a/VectoCore/VectoCore/Models/SimulationComponent/Impl/SimplePowertrainContainer.cs +++ b/VectoCore/VectoCore/Models/SimulationComponent/Impl/SimplePowertrainContainer.cs @@ -1,4 +1,5 @@ -using TUGraz.VectoCore.Models.Connector.Ports; +using TUGraz.VectoCommon.Utils; +using TUGraz.VectoCore.Models.Connector.Ports; using TUGraz.VectoCore.Models.Simulation.Data; using TUGraz.VectoCore.Models.Simulation.Impl; using TUGraz.VectoCore.OutputData; @@ -18,12 +19,14 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl { public ITnOutPort GearboxOutPort { - get { return (Gearbox as Gearbox)?.OutPort(); } + get { return (Gearbox as IGearbox)?.OutPort(); } } - public Gearbox GearboxCtl + public IGearbox GearboxCtl { - get { return Gearbox as Gearbox; } + get { return Gearbox as IGearbox; } } + + public override Second AbsTime { get { return 0.SI<Second>(); } } } } \ No newline at end of file diff --git a/VectoCore/VectoCore/Models/SimulationComponent/Impl/TorqueConverter.cs b/VectoCore/VectoCore/Models/SimulationComponent/Impl/TorqueConverter.cs index e4822cd61e7bb0e9b60b6a7255151459e19b03ab..290698ed65a011bbb699ab25c4a700f88eba82d5 100644 --- a/VectoCore/VectoCore/Models/SimulationComponent/Impl/TorqueConverter.cs +++ b/VectoCore/VectoCore/Models/SimulationComponent/Impl/TorqueConverter.cs @@ -131,9 +131,9 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl // check if shift is required var ratio = Gearbox.GetGearData(Gearbox.Gear).TorqueConverterRatio; if (absTime > DataBus.LastShift && retVal is ResponseSuccess) { - var shiftRequired = ShiftStrategy.ShiftRequired( + var shiftRequired = ShiftStrategy?.ShiftRequired( absTime, dt, outTorque * ratio, outAngularVelocity / ratio, inTorque, - operatingPoint.InAngularVelocity, Gearbox.Gear, Gearbox.LastShift, retVal); + operatingPoint.InAngularVelocity, Gearbox.Gear, Gearbox.LastShift, retVal) ?? false; return shiftRequired ? new ResponseGearShift { Source = this } : retVal; } @@ -170,7 +170,10 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl Source = this, DeltaFullLoad = delta, DeltaDragLoad = delta, - TorqueConverterOperatingPoint = operatingPoint + TorqueConverterOperatingPoint = operatingPoint, + EngineTorqueDemand = inTorque, + EngineSpeed = engineResponse.EngineSpeed, + EnginePowerRequest = engineResponse.EnginePowerRequest }; } @@ -196,7 +199,10 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl Source = this, DeltaFullLoad = 10 * deltaMax, DeltaDragLoad = 10 * deltaMin, - TorqueConverterOperatingPoint = dryOperatingPointMax + TorqueConverterOperatingPoint = dryOperatingPointMax, + EngineTorqueDemand = inTorque, + EngineSpeed = dryOperatingPointMax?.InAngularVelocity ?? dryOperatingPointMin?.InAngularVelocity ?? 0.RPMtoRad(), + EnginePowerRequest = engineResponse.EnginePowerRequest }; } diff --git a/VectoCore/VectoCore/VectoCore.csproj b/VectoCore/VectoCore/VectoCore.csproj index 92cc4c1854192386d1744b8d215baeceee41e3b7..66c5df00504b2a3fea9284a0871356d17f4e9cd7 100644 --- a/VectoCore/VectoCore/VectoCore.csproj +++ b/VectoCore/VectoCore/VectoCore.csproj @@ -209,6 +209,7 @@ <Compile Include="Models\SimulationComponent\Impl\ATGearbox.cs" /> <Compile Include="Models\SimulationComponent\Impl\ATShiftStrategy.cs" /> <Compile Include="Models\SimulationComponent\Data\ShiftStrategy\AverageAccelerationTorqueLookup.cs" /> + <Compile Include="Models\SimulationComponent\Impl\ATShiftStrategyOptimized.cs" /> <Compile Include="Models\SimulationComponent\Impl\ATShiftStrategyVoith.cs" /> <Compile Include="Models\SimulationComponent\Impl\AverageAccelerationTorquePreprocessor.cs" /> <Compile Include="Models\SimulationComponent\Impl\BaseShiftStrategy.cs" /> diff --git a/VectoCore/VectoCoreTest/Models/Simulation/ShiftStrategyV2Test.cs b/VectoCore/VectoCoreTest/Models/Simulation/ShiftStrategyV2Test.cs index f3372bfea2173cb8a3f7fff70d989f4200f529ca..259ba83a81613032c0a33388c1bb7894cc5ec56f 100644 --- a/VectoCore/VectoCoreTest/Models/Simulation/ShiftStrategyV2Test.cs +++ b/VectoCore/VectoCoreTest/Models/Simulation/ShiftStrategyV2Test.cs @@ -296,13 +296,20 @@ namespace TUGraz.VectoCore.Tests.Models.Simulation } - [TestCase(@"TestData\Integration\ShiftStrategyV2\CityBus_AT\CityBus_AT_PS.vecto"), - TestCase(@"TestData\Integration\ShiftStrategyV2\CityBus_AT\CityBus_AT_Ser.vecto")] + [TestCase(@"TestData\Integration\ShiftStrategyV2\CityBus_AT_GSVoith\CityBus_AT_PS.vecto"), + TestCase(@"TestData\Integration\ShiftStrategyV2\CityBus_AT_GSVoith\CityBus_AT_Ser.vecto")] public void RunEngineeringVoith(string jobName) { RunJob_Engineering(jobName); } + [TestCase(@"TestData\Integration\ShiftStrategyV2\CityBus_AT_FCOpt\CityBus_AT_PS.vecto"), + TestCase(@"TestData\Integration\ShiftStrategyV2\CityBus_AT_FCOpt\CityBus_AT_Ser.vecto")] + public void RunEngineeringFCoptimized(string jobName) + { + RunJob_Engineering(jobName); + } + [TestCase(@"J:\TE-Em\Projekte\I_2017_24_VECTO_Erweiterungen_2018ff\Arbeitsordner\GearshiftModel\AMT\Overdrive\Scania\FC based DECL\Scania w overdrive transm.vecto", 1)] public void RunDeclaration(string jobName, int runIdx) diff --git a/VectoCore/VectoCoreTest/VectoCoreTest.csproj b/VectoCore/VectoCoreTest/VectoCoreTest.csproj index 1476d8af2fc230dd8e6753e45d82e45ba2bfb062..58c58e9cf95a70ecc0b58fcd19a9572291bd8057 100644 --- a/VectoCore/VectoCoreTest/VectoCoreTest.csproj +++ b/VectoCore/VectoCoreTest/VectoCoreTest.csproj @@ -222,76 +222,145 @@ <None Include="TestData\Components\GearshiftLinesVoith.vgsv"> <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> </None> - <None Include="TestData\Integration\ShiftStrategyV2\CityBus_AT\175kW.vfld"> + <None Include="TestData\Integration\ShiftStrategyV2\CityBus_AT_FCOpt\175kW.vfld"> <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> </None> - <None Include="TestData\Integration\ShiftStrategyV2\CityBus_AT\175kW.vmap"> + <None Include="TestData\Integration\ShiftStrategyV2\CityBus_AT_FCOpt\175kW.vmap"> <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> </None> - <None Include="TestData\Integration\ShiftStrategyV2\CityBus_AT\AccelerationReserveLookup.csv"> + <None Include="TestData\Integration\ShiftStrategyV2\CityBus_AT_FCOpt\AccelerationReserveLookup.csv"> <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> </None> - <None Include="TestData\Integration\ShiftStrategyV2\CityBus_AT\AT-Shift.vgbs"> + <None Include="TestData\Integration\ShiftStrategyV2\CityBus_AT_FCOpt\AT-Shift.vgbs"> <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> </None> - <None Include="TestData\Integration\ShiftStrategyV2\CityBus_AT\CityBus_AT_PS.vecto"> + <None Include="TestData\Integration\ShiftStrategyV2\CityBus_AT_FCOpt\CityBus_AT_PS.vecto"> <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> </None> - <None Include="TestData\Integration\ShiftStrategyV2\CityBus_AT\CityBus_AT_PS.vveh"> + <None Include="TestData\Integration\ShiftStrategyV2\CityBus_AT_FCOpt\CityBus_AT_PS.vveh"> <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> </None> - <None Include="TestData\Integration\ShiftStrategyV2\CityBus_AT\CityBus_AT_Ser.vecto"> + <None Include="TestData\Integration\ShiftStrategyV2\CityBus_AT_FCOpt\CityBus_AT_Ser.vecto"> <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> </None> - <None Include="TestData\Integration\ShiftStrategyV2\CityBus_AT\CityBus_AT_Ser.vveh"> + <None Include="TestData\Integration\ShiftStrategyV2\CityBus_AT_FCOpt\CityBus_AT_Ser.vveh"> <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> </None> - <None Include="TestData\Integration\ShiftStrategyV2\CityBus_AT\Driver.vacc"> + <None Include="TestData\Integration\ShiftStrategyV2\CityBus_AT_FCOpt\Driver.vacc"> <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> </None> - <None Include="TestData\Integration\ShiftStrategyV2\CityBus_AT\Engine_175kW_6.8l.veng"> + <None Include="TestData\Integration\ShiftStrategyV2\CityBus_AT_FCOpt\Engine_175kW_6.8l.veng"> <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> </None> - <None Include="TestData\Integration\ShiftStrategyV2\CityBus_AT\GearboxPowerSplit.vgbx"> + <None Include="TestData\Integration\ShiftStrategyV2\CityBus_AT_FCOpt\GearboxPowerSplit.vgbx"> <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> </None> - <None Include="TestData\Integration\ShiftStrategyV2\CityBus_AT\GearboxSerial.vgbx"> + <None Include="TestData\Integration\ShiftStrategyV2\CityBus_AT_FCOpt\GearboxSerial.vgbx"> <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> </None> - <None Include="TestData\Integration\ShiftStrategyV2\CityBus_AT\GearshiftLinesVoith.vgsv"> + <None Include="TestData\Integration\ShiftStrategyV2\CityBus_AT_GSVoith\GearshiftLinesVoith.vgsv"> <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> </None> - <None Include="TestData\Integration\ShiftStrategyV2\CityBus_AT\Interurban.vdri"> + <None Include="TestData\Integration\ShiftStrategyV2\CityBus_AT_FCOpt\Interurban.vdri"> <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> </None> - <None Include="TestData\Integration\ShiftStrategyV2\CityBus_AT\PredictionTimeLookup.csv"> + <None Include="TestData\Integration\ShiftStrategyV2\CityBus_AT_FCOpt\PredictionTimeLookup.csv"> <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> </None> - <None Include="TestData\Integration\ShiftStrategyV2\CityBus_AT\RegionalDelivery.vdri"> + <None Include="TestData\Integration\ShiftStrategyV2\CityBus_AT_FCOpt\RegionalDelivery.vdri"> <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> </None> - <None Include="TestData\Integration\ShiftStrategyV2\CityBus_AT\ShareEngineSpeedHigh.csv"> + <None Include="TestData\Integration\ShiftStrategyV2\CityBus_AT_FCOpt\ShareEngineSpeedHigh.csv"> <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> </None> - <None Include="TestData\Integration\ShiftStrategyV2\CityBus_AT\ShareIdleLow.csv"> + <None Include="TestData\Integration\ShiftStrategyV2\CityBus_AT_FCOpt\ShareIdleLow.csv"> <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> </None> - <None Include="TestData\Integration\ShiftStrategyV2\CityBus_AT\ShareTq99L.csv"> + <None Include="TestData\Integration\ShiftStrategyV2\CityBus_AT_FCOpt\ShareTq99L.csv"> <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> </None> - <None Include="TestData\Integration\ShiftStrategyV2\CityBus_AT\ShiftParameters.vtcu"> + <None Include="TestData\Integration\ShiftStrategyV2\CityBus_AT_FCOpt\ShiftParameters.vtcu"> <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> </None> - <None Include="TestData\Integration\ShiftStrategyV2\CityBus_AT\TorqueConverter.vtcc"> + <None Include="TestData\Integration\ShiftStrategyV2\CityBus_AT_FCOpt\TorqueConverter.vtcc"> <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> </None> - <None Include="TestData\Integration\ShiftStrategyV2\CityBus_AT\TorqueConverterPowerSplit.vtcc"> + <None Include="TestData\Integration\ShiftStrategyV2\CityBus_AT_FCOpt\TorqueConverterPowerSplit.vtcc"> <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> </None> - <None Include="TestData\Integration\ShiftStrategyV2\CityBus_AT\Urban.vdri"> + <None Include="TestData\Integration\ShiftStrategyV2\CityBus_AT_FCOpt\Urban.vdri"> <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> </None> - <None Include="TestData\Integration\ShiftStrategyV2\CityBus_AT\UrbanDelivery.vdri"> + <None Include="TestData\Integration\ShiftStrategyV2\CityBus_AT_FCOpt\UrbanDelivery.vdri"> + <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> + </None> + <None Include="TestData\Integration\ShiftStrategyV2\CityBus_AT_GSVoith\175kW.vfld"> + <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> + </None> + <None Include="TestData\Integration\ShiftStrategyV2\CityBus_AT_GSVoith\175kW.vmap"> + <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> + </None> + <None Include="TestData\Integration\ShiftStrategyV2\CityBus_AT_GSVoith\AccelerationReserveLookup.csv"> + <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> + </None> + <None Include="TestData\Integration\ShiftStrategyV2\CityBus_AT_GSVoith\AT-Shift.vgbs"> + <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> + </None> + <None Include="TestData\Integration\ShiftStrategyV2\CityBus_AT_GSVoith\CityBus_AT_PS.vecto"> + <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> + </None> + <None Include="TestData\Integration\ShiftStrategyV2\CityBus_AT_GSVoith\CityBus_AT_PS.vveh"> + <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> + </None> + <None Include="TestData\Integration\ShiftStrategyV2\CityBus_AT_GSVoith\CityBus_AT_Ser.vecto"> + <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> + </None> + <None Include="TestData\Integration\ShiftStrategyV2\CityBus_AT_GSVoith\CityBus_AT_Ser.vveh"> + <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> + </None> + <None Include="TestData\Integration\ShiftStrategyV2\CityBus_AT_GSVoith\Driver.vacc"> + <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> + </None> + <None Include="TestData\Integration\ShiftStrategyV2\CityBus_AT_GSVoith\Engine_175kW_6.8l.veng"> + <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> + </None> + <None Include="TestData\Integration\ShiftStrategyV2\CityBus_AT_GSVoith\GearboxPowerSplit.vgbx"> + <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> + </None> + <None Include="TestData\Integration\ShiftStrategyV2\CityBus_AT_GSVoith\GearboxSerial.vgbx"> + <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> + </None> + <None Include="TestData\Integration\ShiftStrategyV2\CityBus_AT_GSVoith\Interurban.vdri"> + <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> + </None> + <None Include="TestData\Integration\ShiftStrategyV2\CityBus_AT_GSVoith\PredictionTimeLookup.csv"> + <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> + </None> + <None Include="TestData\Integration\ShiftStrategyV2\CityBus_AT_GSVoith\RegionalDelivery.vdri"> + <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> + </None> + <None Include="TestData\Integration\ShiftStrategyV2\CityBus_AT_GSVoith\ShareEngineSpeedHigh.csv"> + <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> + </None> + <None Include="TestData\Integration\ShiftStrategyV2\CityBus_AT_GSVoith\ShareIdleLow.csv"> + <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> + </None> + <None Include="TestData\Integration\ShiftStrategyV2\CityBus_AT_GSVoith\ShareTq99L.csv"> + <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> + </None> + <None Include="TestData\Integration\ShiftStrategyV2\CityBus_AT_GSVoith\ShiftParameters.vtcu"> + <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> + </None> + <None Include="TestData\Integration\ShiftStrategyV2\CityBus_AT_GSVoith\TorqueConverter.vtcc"> + <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> + </None> + <None Include="TestData\Integration\ShiftStrategyV2\CityBus_AT_GSVoith\TorqueConverterPowerSplit.vtcc"> + <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> + </None> + <None Include="TestData\Integration\ShiftStrategyV2\CityBus_AT_GSVoith\Urban.vdri"> + <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> + </None> + <None Include="TestData\Integration\ShiftStrategyV2\CityBus_AT_GSVoith\UrbanDelivery.vdri"> <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> </None> <None Include="TestData\Integration\ShiftStrategyV2\Class5_Tractor_4x2\325kW.vfld">