diff --git a/VectoCommon/VectoCommon/Models/OperatingPoint.cs b/VectoCommon/VectoCommon/Models/OperatingPoint.cs index 639ce72bbfeb3f9b971572b46e8aeec07692759f..ddcd47f3e6815de739fe63b21b34571727dfef37 100644 --- a/VectoCommon/VectoCommon/Models/OperatingPoint.cs +++ b/VectoCommon/VectoCommon/Models/OperatingPoint.cs @@ -40,6 +40,18 @@ namespace TUGraz.VectoCommon.Models public MeterPerSquareSecond Acceleration; public Meter SimulationDistance; public Second SimulationInterval; + + + public OperatingPoint(OperatingPoint operatingPoint) + { + Acceleration = operatingPoint.Acceleration; + SimulationDistance = operatingPoint.SimulationDistance; + SimulationInterval = operatingPoint.SimulationInterval; + } + + public OperatingPoint() + { + } public override string ToString() { diff --git a/VectoCore/VectoCore/Models/SimulationComponent/Impl/DefaultDriverStrategy.cs b/VectoCore/VectoCore/Models/SimulationComponent/Impl/DefaultDriverStrategy.cs index 1635e547bd43c2d9aa989eaa3b9e8a86a3ff5414..cffac5072dd4395a2dea699257f0d476497096fa 100644 --- a/VectoCore/VectoCore/Models/SimulationComponent/Impl/DefaultDriverStrategy.cs +++ b/VectoCore/VectoCore/Models/SimulationComponent/Impl/DefaultDriverStrategy.cs @@ -1001,6 +1001,10 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl first = Driver.DrivingActionAccelerate(absTime, ds, targetVelocity, gradient); debug.Add(new { action = "Coast:(Success & Acc<0) -> Accelerate", first }); } + if (!DataBus.EngineInfo.EngineOn && first is ResponseOverload) { + first = Driver.DrivingActionAccelerate(absTime, ds, targetVelocity, gradient); + debug.Add(new { action = "Coast:(Overload & ICE off) -> Accelerate", first }); + } } else { if (DataBus.GearboxInfo.GearboxType.AutomaticTransmission() && DataBus.GearboxInfo.DisengageGearbox) { first = Driver.DrivingActionCoast(absTime, ds, velocityWithOverspeed, gradient); diff --git a/VectoCore/VectoCore/Models/SimulationComponent/Impl/Driver.cs b/VectoCore/VectoCore/Models/SimulationComponent/Impl/Driver.cs index eb07caafaa40c12da83d0a4620554b6277bdec5c..94ae6f8030c514d50bcaab9523be5adab473548b 100644 --- a/VectoCore/VectoCore/Models/SimulationComponent/Impl/Driver.cs +++ b/VectoCore/VectoCore/Models/SimulationComponent/Impl/Driver.cs @@ -922,30 +922,31 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl LimitationMode limits) { var limitApplied = false; - var originalAcceleration = operatingPoint.Acceleration; + var retVal = new OperatingPoint(operatingPoint); + var originalAcceleration = retVal.Acceleration; //if (((limits & LimitationMode.LimitDecelerationLookahead) != 0) && - // operatingPoint.Acceleration < DriverData.LookAheadCoasting.Deceleration) { - // operatingPoint.Acceleration = DriverData.LookAheadCoasting.Deceleration; + // retVal.Acceleration < DriverData.LookAheadCoasting.Deceleration) { + // retVal.Acceleration = DriverData.LookAheadCoasting.Deceleration; // limitApplied = true; //} var accelerationLimits = DriverData.AccelerationCurve.Lookup(DataBus.VehicleInfo.VehicleSpeed); - if (operatingPoint.Acceleration > accelerationLimits.Acceleration) { - operatingPoint.Acceleration = accelerationLimits.Acceleration; + if (retVal.Acceleration > accelerationLimits.Acceleration) { + retVal.Acceleration = accelerationLimits.Acceleration; limitApplied = true; } if (((limits & LimitationMode.LimitDecelerationDriver) != 0) && - operatingPoint.Acceleration < accelerationLimits.Deceleration) { - operatingPoint.Acceleration = accelerationLimits.Deceleration; + retVal.Acceleration < accelerationLimits.Deceleration) { + retVal.Acceleration = accelerationLimits.Deceleration; limitApplied = true; } if (limitApplied) { - operatingPoint.SimulationInterval = - ComputeTimeInterval(operatingPoint.Acceleration, operatingPoint.SimulationDistance) + retVal.SimulationInterval = + ComputeTimeInterval(retVal.Acceleration, retVal.SimulationDistance) .SimulationInterval; Log.Debug("Limiting acceleration from {0} to {1}, dt: {2}", originalAcceleration, - operatingPoint.Acceleration, operatingPoint.SimulationInterval); + retVal.Acceleration, retVal.SimulationInterval); } - return operatingPoint; + return retVal; } /// <summary> diff --git a/VectoCore/VectoCore/Models/SimulationComponent/Strategies/HybridStrategy.cs b/VectoCore/VectoCore/Models/SimulationComponent/Strategies/HybridStrategy.cs index 5bd6a913598083d7ca1d0a41f9b0b910939ac7dd..a1fe968e5ae4bd996857564d757e1d2a0b5b2698 100644 --- a/VectoCore/VectoCore/Models/SimulationComponent/Strategies/HybridStrategy.cs +++ b/VectoCore/VectoCore/Models/SimulationComponent/Strategies/HybridStrategy.cs @@ -150,7 +150,7 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Strategies return response; } - if (dryRun && DataBus.DriverInfo.DrivingAction == DrivingAction.Brake) { + if (dryRun && DataBus.DriverInfo.DrivingAction == DrivingAction.Brake && (DataBus.GearboxInfo.GearEngaged(absTime) || ElectricMotorCanPropellDuringTractionInterruption)) { var tmp = MaxRecuperationSetting(absTime, dt, outTorque, outAngularVelocity); var outTorqueWithoutBraking = outTorque - 2 * DataBus.Brakes.BrakePower / (PreviousState.AngularVelocity + outAngularVelocity); @@ -159,7 +159,7 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Strategies DryRunAction = DataBus.DriverInfo.DrivingAction; DryRunResult = tmp; var brakeRetVal = CreateResponse(tmp, currentGear); - DebugData.Add(new { Best = tmp, RetVal = brakeRetVal, DryRun = dryRun }); + DebugData.Add(new { DrivingAction = DataBus.DriverInfo.DrivingAction, Best = tmp, RetVal = brakeRetVal, DryRun = dryRun }); return brakeRetVal; } } @@ -227,7 +227,7 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Strategies CurrentState.GearshiftTriggerTstmp = absTime; } - DebugData.Add(new { Evaluations = eval, Best = best, RetVal = retVal, DryRun = dryRun }); + DebugData.Add(new { DrivingAction = DataBus.DriverInfo.DrivingAction, Evaluations = eval, Best = best, RetVal = retVal, DryRun = dryRun }); return retVal; } @@ -237,7 +237,7 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Strategies { var best = eval.Where(x => !double.IsNaN(x.Score)).OrderBy(x => x.Score).FirstOrDefault(); if (best == null) { - best = eval.FirstOrDefault(x => !DataBus.EngineCtl.CombustionEngineOn || !x.IgnoreReason.InvalidEngineSpeed()); + best = eval.OrderBy(x => Math.Abs((int)currentGear - x.Gear)).FirstOrDefault(x => !DataBus.EngineCtl.CombustionEngineOn || !x.IgnoreReason.InvalidEngineSpeed()); if (best == null /*&& dryRun*/) { var emEngaged = (!ElectricMotorCanPropellDuringTractionInterruption || (DataBus.GearboxInfo.GearEngaged(absTime) && eval.First().Response.Gearbox.Gear != 0)); @@ -300,14 +300,15 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Strategies GearboxInNeutral = false, MechanicalAssistPower = ElectricMotorsOff }; - var firstResponse = RequestDryRun(absTime, dt, outTorque, outAngularVelocity, DataBus.GearboxInfo.Gear, first); + var currentGear = PreviousState.GearboxEngaged ? DataBus.GearboxInfo.Gear : Controller.ShiftStrategy.NextGear.Gear; + var firstResponse = RequestDryRun(absTime, dt, outTorque, outAngularVelocity, currentGear, first); var allowICEOff = PreviousState.ICEStartTStmp == null || PreviousState.ICEStartTStmp.IsSmaller(absTime + MIN_ICE_ON_TIME); var emPos = ModelData.ElectricMachinesData.First().Item1; - var currentGear = PreviousState.GearboxEngaged ? DataBus.GearboxInfo.Gear : Controller.ShiftStrategy.NextGear.Gear; + var emTorque = !ElectricMotorCanPropellDuringTractionInterruption && (firstResponse.Gearbox.Gear == 0 || !DataBus.GearboxInfo.GearEngaged(absTime)) ? null : firstResponse.ElectricMotor.MaxRecuperationTorque; return TryConfiguration(absTime, dt, outTorque, outAngularVelocity, currentGear, emPos, emTorque, double.NaN, allowICEOff); } @@ -607,6 +608,9 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Strategies TestPowertrain.CombustionEngine.PreviousState.EngineTorqueOut = (DataBus.EngineInfo as CombustionEngine).PreviousState.EngineTorqueOut; TestPowertrain.CombustionEngine.PreviousState.DynamicFullLoadTorque = (DataBus.EngineInfo as CombustionEngine).PreviousState.DynamicFullLoadTorque; + TestPowertrain.Clutch.PreviousState.InAngularVelocity = + (DataBus.ClutchInfo as SwitchableClutch).PreviousState.InAngularVelocity; + if (/*nextGear != DataBus.GearboxInfo.Gear && */TestPowertrain.ElectricMotorP2 != null) { TestPowertrain.ElectricMotorP2.PreviousState.OutAngularVelocity = DataBus.ElectricMotorInfo(PowertrainPosition.HybridP2).ElectricMotorSpeed;