Code development platform for open source projects from the European Union institutions

Skip to content
Snippets Groups Projects
Commit 00d4fd07 authored by Markus Quaritsch's avatar Markus Quaritsch
Browse files

refactoring PEV shift strategy: evaluate all gears and then select best gear

parent 73a3b8ab
No related branches found
No related tags found
No related merge requests found
......@@ -220,10 +220,10 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl
protected virtual uint CheckEarlyUpshift(Second absTime, Second dt, NewtonMeter outTorque, PerSecond outAngularVelocity, uint currentGear, IResponse response1)
{
var minFcGear = currentGear;
var minFc = double.MaxValue;
IResponse minFCResponse = null;
var fcCurrent = double.NaN;
//var minFcGear = currentGear;
//var minFc = double.MaxValue;
//IResponse minFCResponse = null;
//var fcCurrent = double.NaN;
//var fcUpshiftPossible = true;
......@@ -243,6 +243,8 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl
var totalTransmissionRatio = DataBus.ElectricMotorInfo(PowertrainPosition.BatteryElectricB2).ElectricMotorSpeed / DataBus.VehicleInfo.VehicleSpeed;
//var totalTransmissionRatio = outAngularVelocity / DataBus.VehicleSpeed;
var results = new List<Tuple<uint, double>>();
for (var i = 1; i <= shiftStrategyParameters.AllowedGearRangeFC; i++) {
var tryNextGear = (uint)(currentGear + i);
......@@ -282,26 +284,36 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl
//var reserve = 1 - response.EngineTorqueDemandTotal / response.EngineStationaryFullLoadTorque;
if (double.IsNaN(fcCurrent)) {
//var responseCurrent = RequestDryRunWithGear(absTime, dt, DataBus.VehicleSpeed, DataBus.DriverAcceleration, currentGear);
var responseCurrent = RequestDryRunWithGear(absTime, dt, outTorque, outAngularVelocity, currentGear);
fcCurrent = GetFCRating(responseCurrent);
}
//if (double.IsNaN(fcCurrent)) {
// //var responseCurrent = RequestDryRunWithGear(absTime, dt, DataBus.VehicleSpeed, DataBus.DriverAcceleration, currentGear);
// var responseCurrent = RequestDryRunWithGear(absTime, dt, outTorque, outAngularVelocity, currentGear);
// fcCurrent = GetFCRating(responseCurrent);
//}
var fcNext = GetFCRating(response);
results.Add(Tuple.Create(tryNextGear, fcNext));
if (reserve < ModelData.TorqueReserve ||
!fcNext.IsSmaller(fcCurrent * shiftStrategyParameters.RatingFactorCurrentGear) || !fcNext.IsSmaller(minFc)) {
continue;
}
//if (reserve < ModelData.TorqueReserve ||
// !fcNext.IsGreater(fcCurrent * shiftStrategyParameters.RatingFactorCurrentGear) || !fcNext.IsSmaller(minFc)) {
// continue;
//}
minFcGear = tryNextGear;
minFc = fcNext;
minFCResponse = response;
//minFcGear = tryNextGear;
//minFc = fcNext;
//minFCResponse = response;
}
if (currentGear != minFcGear) {
return minFcGear;
if (results.Count == 0) {
return currentGear;
}
var responseCurrent = RequestDryRunWithGear(absTime, dt, outTorque, outAngularVelocity, currentGear);
var fcCurrent = GetFCRating(responseCurrent);
var minFc = results.MinBy(x => x.Item2);
if (minFc.Item2.IsGreater(fcCurrent * shiftStrategyParameters.RatingFactorCurrentGear)) {
return minFc.Item1;
}
return currentGear;
......@@ -320,7 +332,7 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl
? VectoMath.Max(-ModelData.Gears[currentGear].MaxTorque, response.ElectricMotor.MaxDriveTorque)
: response.ElectricMotor.MaxDriveTorque;
var tqCurrent = (response.ElectricMotor.PowerRequest / response.ElectricMotor.AngularVelocity).LimitTo(maxDriveTorque, maxGenTorque);
var tqCurrent = (response.ElectricMotor.ElectricMotorPowerMech / response.ElectricMotor.AngularVelocity).LimitTo(maxDriveTorque, maxGenTorque);
var engineSpeed = response.ElectricMotor.AngularVelocity;
......@@ -431,9 +443,9 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl
protected virtual uint CheckEarlyDownshift(Second absTime, Second dt, NewtonMeter outTorque, PerSecond outAngularVelocity, uint currentGear, IResponse response1)
{
var minFcGear = currentGear;
var minFc = double.MaxValue;
var fcCurrent = double.NaN;
//var minFcGear = currentGear;
//var minFc = double.MaxValue * Math.Sign(outTorque.Value()) ;
//var fcCurrent = double.NaN;
var estimatedVelocityPostShift = VelocityDropData.Interpolate(DataBus.VehicleInfo.VehicleSpeed, DataBus.DrivingCycleInfo.RoadGradient ?? 0.SI<Radian>());
if (!estimatedVelocityPostShift.IsGreater(DeclarationData.GearboxTCU.MIN_SPEED_AFTER_TRACTION_INTERRUPTION)) {
......@@ -445,6 +457,7 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl
// return currentGear;
//}
var results = new List<Tuple<uint, double>>();
for (var i = 1; i <= shiftStrategyParameters.AllowedGearRangeFC; i++) {
var tryNextGear = (uint)(currentGear - i);
......@@ -463,24 +476,38 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl
continue;
}
if (double.IsNaN(fcCurrent)) {
var responseCurrent = RequestDryRunWithGear(absTime, dt, outTorque, outAngularVelocity, currentGear);
//if (double.IsNaN(fcCurrent)) {
// var responseCurrent = RequestDryRunWithGear(absTime, dt, outTorque, outAngularVelocity, currentGear);
//var responseCurrent = RequestDryRunWithGear(absTime, dt, DataBus.VehicleSpeed, DataBus.DriverAcceleration, currentGear);
fcCurrent = GetFCRating(responseCurrent);
}
// //var responseCurrent = RequestDryRunWithGear(absTime, dt, DataBus.VehicleSpeed, DataBus.DriverAcceleration, currentGear);
// fcCurrent = GetFCRating(responseCurrent);
//}
var fcNext = GetFCRating(response);
results.Add(Tuple.Create(tryNextGear,fcNext));
if (!fcNext.IsSmaller(fcCurrent * shiftStrategyParameters.RatingFactorCurrentGear) ||
!fcNext.IsSmaller(minFc)) {
continue;
}
//if (!fcNext.IsGreater(fcCurrent * shiftStrategyParameters.RatingFactorCurrentGear) ||
// !fcNext.IsGreater(minFc)) {
// continue;
//}
minFcGear = tryNextGear;
minFc = fcNext;
//minFcGear = tryNextGear;
//minFc = fcNext;
}
return minFcGear;
if (results.Count == 0) {
return currentGear;
}
var responseCurrent = RequestDryRunWithGear(absTime, dt, outTorque, outAngularVelocity, currentGear);
var fcCurrent = GetFCRating(responseCurrent);
var minFc = results.MinBy(x => x.Item2);
if (minFc.Item2.IsGreater(fcCurrent * shiftStrategyParameters.RatingFactorCurrentGear)) {
return minFc.Item1;
}
return currentGear;
}
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment