diff --git a/VectoCore/VectoCore/Models/SimulationComponent/Strategies/HybridStrategy.cs b/VectoCore/VectoCore/Models/SimulationComponent/Strategies/HybridStrategy.cs index bfba5723be181e79d0f167b5d3300b1b4b89dc1a..8264346c8e5cc62862e6368e7e9204970b12d226 100644 --- a/VectoCore/VectoCore/Models/SimulationComponent/Strategies/HybridStrategy.cs +++ b/VectoCore/VectoCore/Models/SimulationComponent/Strategies/HybridStrategy.cs @@ -133,7 +133,7 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Strategies } var retVal = TestPowertrain.HybridController.NextComponent.Request(absTime, dt, outTorque, outAngularVelocity, true); - + retVal.HybridController.StrategySettings = cfg; return retVal; } @@ -287,6 +287,7 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Strategies return null; } + retVal.HybridController.StrategySettings = cfg; return retVal; } catch (Exception e) { Log.Debug(e); @@ -633,9 +634,49 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Strategies //var responses = new List<HybridResultEntry>(); + var gearRange = GetGearRange(absTime, dryRun); + + var gear = PreviousState.GearboxEngaged ? DataBus.GearboxInfo.Gear : Controller.ShiftStrategy.NextGear; // DataBus.GearboxInfo.Gear; + + var firstGear = GearList.Predecessor(gear, Math.Min(1, gearRange.Item1)); + var lastGear = gear; // GearList.Successor(gear, (uint)gearRange.Item2); + + var candidates = new Dictionary<GearshiftPosition, Tuple<Watt, IResponse>>(); var maxTorqueGbxIn = - StrategyParameters.MaxPropulsionTorque.FullLoadDriveTorque(emOffResponse.Gearbox.InputSpeed); - var emPos = ModelData.ElectricMachinesData.First().Item1; + StrategyParameters.MaxPropulsionTorque.FullLoadDriveTorque(emOffResponse.Gearbox.InputSpeed); + candidates[emOffResponse.Gearbox.Gear] = Tuple.Create(maxTorqueGbxIn * emOffResponse.Gearbox.InputSpeed, emOffResponse); + foreach (var nextGear in GearList.IterateGears(firstGear, lastGear)) { + if (candidates.ContainsKey(nextGear)) { + continue; + } + var emOff = new HybridStrategyResponse() { + CombustionEngineOn = DataBus.EngineInfo.EngineOn, // AllowICEOff(absTime), + GearboxInNeutral = false, + NextGear = nextGear, + MechanicalAssistPower = ElectricMotorsOff + }; + var testRequest = RequestDryRun(absTime, dt, outTorque, outAngularVelocity, nextGear, emOff); + if (testRequest != null) { + var maxGbxTorque = StrategyParameters.MaxPropulsionTorque.FullLoadDriveTorque(testRequest.Gearbox.InputSpeed); + candidates[nextGear] = Tuple.Create(maxGbxTorque * testRequest.Gearbox.InputSpeed, testRequest); + } + } + + var maxPwr = candidates.MaxBy(x => x.Value.Item1); + if (!emOffResponse.Gearbox.Gear.Equals(maxPwr.Key)) { + return new HybridStrategyResponse() { + ShiftRequired = true, + NextGear = maxPwr.Key, + //CombustionEngineOn = + EvaluatedSolution = new HybridResultEntry() { + Gear = maxPwr.Key, + Response = maxPwr.Value.Item2 + }, + MechanicalAssistPower = maxPwr.Value.Item2.HybridController.StrategySettings.MechanicalAssistPower + }; + } + + var emPos = ModelData.ElectricMachinesData.First().Item1; var currentGear = PreviousState.GearboxEngaged ? DataBus.GearboxInfo.Gear : Controller.ShiftStrategy.NextGear; var maxEmDriveSetting = new HybridStrategyResponse() { @@ -1246,43 +1287,29 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Strategies var allowICEOff = AllowICEOff(absTime) && !duringTractionInterruption; var emPos = ModelData.ElectricMachinesData.First().Item1; - var responses = new List<HybridResultEntry>(); - - var minimumShiftTimePassed = (DataBus.GearboxInfo.LastShift + ModelData.GearshiftParameters.TimeBetweenGearshifts).IsSmallerOrEqual(absTime); - var gearRangeUpshift = ModelData.GearshiftParameters.AllowedGearRangeUp; - var gearRangeDownshift = ModelData.GearshiftParameters.AllowedGearRangeDown; - if (!AllowEmergencyShift) { - if (dryRun || !minimumShiftTimePassed || - (absTime - DataBus.GearboxInfo.LastUpshift).IsSmaller( - ModelData.GearshiftParameters.DownshiftAfterUpshiftDelay /*, 0.1*/) - || (DataBus.DriverInfo.DrivingAction == DrivingAction.Accelerate && DataBus.VehicleInfo.VehicleSpeed.IsSmaller(5.KMPHtoMeterPerSecond()))) { - gearRangeDownshift = 0; - } - if (dryRun || !minimumShiftTimePassed || - (absTime - DataBus.GearboxInfo.LastDownshift).IsSmaller( - ModelData.GearshiftParameters.UpshiftAfterDownshiftDelay /*,0.1*/) - || (DataBus.DriverInfo.DrivingAction == DrivingAction.Accelerate && - DataBus.VehicleInfo.VehicleSpeed.IsSmaller(5.KMPHtoMeterPerSecond()))) { - gearRangeUpshift = 0; - } - } + var gearRange = GetGearRange(absTime, dryRun); var gear = PreviousState.GearboxEngaged ? DataBus.GearboxInfo.Gear : Controller.ShiftStrategy.NextGear; // DataBus.GearboxInfo.Gear; - var numGears = ModelData.GearboxData.Gears.Count; + + var firstGear = GearList.Predecessor(gear, (uint)gearRange.Item1); + var lastGear = GearList.Successor(gear, (uint)gearRange.Item2); + + var responses = new List<HybridResultEntry>(); + var allowEmergencyUpshift = false; var allowEmergencyDownshift = false; - foreach (var nextGear in GearList.IterateGears(GearList.Predecessor(gear, (uint)gearRangeDownshift), GearList.Successor(gear, (uint)gearRangeUpshift))) { + foreach (var nextGear in GearList.IterateGears(firstGear, lastGear)) { var emOffEntry = EvaluateConfigsForGear(absTime, dt, outTorque, outAngularVelocity, nextGear, allowICEOff, responses, emPos, dryRun); if (emOffEntry == null) { continue; } - if (nextGear.Equals(gear) && gearRangeUpshift == 0 && (emOffEntry.IgnoreReason & HybridConfigurationIgnoreReason.EngineSpeedTooHigh) != 0) { + if (nextGear.Equals(gear) && gearRange.Item2 == 0 && (emOffEntry.IgnoreReason & HybridConfigurationIgnoreReason.EngineSpeedTooHigh) != 0) { allowEmergencyUpshift = true; } - if (nextGear.Equals(gear) && gearRangeDownshift == 0 && (emOffEntry.IgnoreReason & HybridConfigurationIgnoreReason.EngineSpeedTooLow) != 0) { + if (nextGear.Equals(gear) && gearRange.Item1 == 0 && (emOffEntry.IgnoreReason & HybridConfigurationIgnoreReason.EngineSpeedTooLow) != 0) { allowEmergencyDownshift = true; } } @@ -1302,6 +1329,33 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Strategies return responses; } + private Tuple<uint, uint> GetGearRange(Second absTime, bool dryRun) + { + var minimumShiftTimePassed = + (DataBus.GearboxInfo.LastShift + ModelData.GearshiftParameters.TimeBetweenGearshifts).IsSmallerOrEqual(absTime); + var gearRangeUpshift = ModelData.GearshiftParameters.AllowedGearRangeUp; + var gearRangeDownshift = ModelData.GearshiftParameters.AllowedGearRangeDown; + if (!AllowEmergencyShift) { + if (dryRun || !minimumShiftTimePassed || + (absTime - DataBus.GearboxInfo.LastUpshift).IsSmaller( + ModelData.GearshiftParameters.DownshiftAfterUpshiftDelay /*, 0.1*/) + || (DataBus.DriverInfo.DrivingAction == DrivingAction.Accelerate && + DataBus.VehicleInfo.VehicleSpeed.IsSmaller(5.KMPHtoMeterPerSecond()))) { + gearRangeDownshift = 0; + } + + if (dryRun || !minimumShiftTimePassed || + (absTime - DataBus.GearboxInfo.LastDownshift).IsSmaller( + ModelData.GearshiftParameters.UpshiftAfterDownshiftDelay /*,0.1*/) + || (DataBus.DriverInfo.DrivingAction == DrivingAction.Accelerate && + DataBus.VehicleInfo.VehicleSpeed.IsSmaller(5.KMPHtoMeterPerSecond()))) { + gearRangeUpshift = 0; + } + } + + return Tuple.Create((uint)gearRangeDownshift, (uint)gearRangeUpshift); + } + private HybridResultEntry EvaluateConfigsForGear(Second absTime, Second dt, NewtonMeter outTorque, PerSecond outAngularVelocity, GearshiftPosition nextGear, bool allowICEOff, List<HybridResultEntry> responses, PowertrainPosition emPos, bool dryRun)