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

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

allow extrapolation of the ADC loss-map when analyzing different hybrid...

allow extrapolation of the ADC loss-map when analyzing different hybrid configurations and during dry-runs
parent 3f9daa46
No related branches found
No related tags found
No related merge requests found
......@@ -13,7 +13,7 @@ namespace TUGraz.VectoCore.Models.Simulation.DataBus
PerSecond MaxSpeed { get; }
Watt DragPower(Volt volt, PerSecond electricMotorSpeed, GearshiftPosition gear);
Watt MaxPowerDrive(Volt volt, PerSecond inAngularVelocity, GearshiftPosition gear);
NewtonMeter GetTorqueForElectricPower(Volt volt, Watt electricPower, PerSecond avgEmSpeed, Second dt, GearshiftPosition gear);
NewtonMeter GetTorqueForElectricPower(Volt volt, Watt electricPower, PerSecond avgEmSpeed, Second dt, GearshiftPosition gear, bool allowExtrapolation);
bool DeRatingActive { get; }
}
......
......@@ -64,7 +64,7 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl
return ModelData.EfficiencyData.FullLoadDriveTorque(volt, electricMotorSpeed, gear) * electricMotorSpeed;
}
public NewtonMeter GetTorqueForElectricPower(Volt volt, Watt electricPower, PerSecond avgEmSpeed, Second dt, GearshiftPosition gear)
public NewtonMeter GetTorqueForElectricPower(Volt volt, Watt electricPower, PerSecond avgEmSpeed, Second dt, GearshiftPosition gear, bool allowExtrapolation)
{
var maxTorque = electricPower > 0
? GetMaxRecuperationTorque(volt, dt, avgEmSpeed, gear)
......@@ -78,7 +78,7 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl
var tqInertia = Formulas.InertiaPower(emSpeed, PreviousState.EMSpeed, ModelData.Inertia, dt) / avgEmSpeed;
var tqEm = tqEmMap + tqInertia;
var tqDt = ConvertEmTorqueToDrivetrain(avgEmSpeed, tqEm);
var tqDt = ConvertEmTorqueToDrivetrain(avgEmSpeed, tqEm, allowExtrapolation);
return tqDt;
}
......@@ -174,8 +174,8 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl
maxRecuperationTorqueEm = null;
}
var maxDriveTorqueDt = maxDriveTorqueEm == null ? null : ConvertEmTorqueToDrivetrain(avgEmSpeed, maxDriveTorqueEm);
var maxRecuperationTorqueDt = maxRecuperationTorqueEm == null ? null : ConvertEmTorqueToDrivetrain(avgEmSpeed, maxRecuperationTorqueEm);
var maxDriveTorqueDt = maxDriveTorqueEm == null ? null : ConvertEmTorqueToDrivetrain(avgEmSpeed, maxDriveTorqueEm, dryRun);
var maxRecuperationTorqueDt = maxRecuperationTorqueEm == null ? null : ConvertEmTorqueToDrivetrain(avgEmSpeed, maxRecuperationTorqueEm, dryRun);
// control returns torque that shall be applied on the drivetrain. calculate backward to the EM
var emTorqueDt = Control.MechanicalAssistPower(absTime, dt, outTorque,
......@@ -241,7 +241,7 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl
// if EM is off, calculate EM drag torque 'forward' to be applied on drivetrain
// add inertia, drag is positive
emTorque = ModelData.DragCurveLookup(avgEmSpeed, gear) + inertiaTorqueEm;
emTorqueDt = ConvertEmTorqueToDrivetrain(avgEmSpeed, emTorque);
emTorqueDt = ConvertEmTorqueToDrivetrain(avgEmSpeed, emTorque, dryRun);
emOff = true;
}
......@@ -430,9 +430,9 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl
}
protected internal NewtonMeter ConvertEmTorqueToDrivetrain(PerSecond emSpeed, NewtonMeter emTorque)
protected internal NewtonMeter ConvertEmTorqueToDrivetrain(PerSecond emSpeed, NewtonMeter emTorque, bool dryRun)
{
var dtTorque = ModelData.TransmissionLossMap.GetOutTorque(emSpeed, emTorque);
var dtTorque = ModelData.TransmissionLossMap.GetOutTorque(emSpeed, emTorque, DataBus.IsTestPowertrain || dryRun);
var dtSpeed = emSpeed / ModelData.RatioADC;
var emTorqueBwd = ConvertDrivetrainTorqueToEm(dtSpeed, dtTorque);
......
......@@ -55,17 +55,17 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Strategies
.FullLoadEntries.Select(x =>
new ElectricMotorFullLoadCurve.FullLoadEntry() {
FullGenerationTorque =
Genset.ElectricMotor.ConvertEmTorqueToDrivetrain(x.MotorSpeed, VectoMath.Min(continuousTq ,x.FullGenerationTorque)),
Genset.ElectricMotor.ConvertEmTorqueToDrivetrain(x.MotorSpeed, VectoMath.Min(continuousTq ,x.FullGenerationTorque), false),
FullDriveTorque =
Genset.ElectricMotor.ConvertEmTorqueToDrivetrain(x.MotorSpeed, VectoMath.Max(-continuousTq, x.FullDriveTorque)),
Genset.ElectricMotor.ConvertEmTorqueToDrivetrain(x.MotorSpeed, VectoMath.Max(-continuousTq, x.FullDriveTorque), false),
MotorSpeed = Genset.ElectricMotor.ConvertEmSpeedToDrivetrain(x.MotorSpeed)
}).Where(x => x.MotorSpeed.IsSmallerOrEqual(maxSpeed)).ToList());
if (!emFldDrivetrain.FullLoadEntries.Any(x => x.MotorSpeed.IsEqual(maxSpeed))) {
emFldDrivetrain.FullLoadEntries.Add(new ElectricMotorFullLoadCurve.FullLoadEntry() {
FullGenerationTorque =
Genset.ElectricMotor.ConvertEmTorqueToDrivetrain(maxSpeed, VectoMath.Min(continuousTq, emFldDrivetrain.FullGenerationTorque(maxSpeed))),
Genset.ElectricMotor.ConvertEmTorqueToDrivetrain(maxSpeed, VectoMath.Min(continuousTq, emFldDrivetrain.FullGenerationTorque(maxSpeed)), false),
FullDriveTorque =
Genset.ElectricMotor.ConvertEmTorqueToDrivetrain(maxSpeed, VectoMath.Max(-continuousTq, emFldDrivetrain.FullLoadDriveTorque(maxSpeed))),
Genset.ElectricMotor.ConvertEmTorqueToDrivetrain(maxSpeed, VectoMath.Max(-continuousTq, emFldDrivetrain.FullLoadDriveTorque(maxSpeed)), false),
MotorSpeed = maxSpeed
});
}
......@@ -155,7 +155,7 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Strategies
try {
Genset.ElectricMotor.Initialize(0.SI<NewtonMeter>(), speed);
var tq = Genset.ElectricMotor.GetTorqueForElectricPower(voltage, pwr, speed * EmData.RatioADC, dt, new GearshiftPosition(0));
var tq = Genset.ElectricMotor.GetTorqueForElectricPower(voltage, pwr, speed * EmData.RatioADC, dt, new GearshiftPosition(0), false);
if (tq == null || tq.IsSmallerOrEqual(0)) {
continue;
......
......@@ -1975,7 +1975,7 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Strategies
//var emDriveTorque = ModelData.ElectricMachinesData.Where(x => x.Item1 == emPos).First().Item2.EfficiencyMap
// .LookupTorque(emDrivePower, firstResponse.ElectricMotor.AngularVelocity, maxEmTorque);
var emDriveTorque = DataBus.ElectricMotorInfo(emPos).GetTorqueForElectricPower(voltage, emDrivePower, firstResponse.ElectricMotor.AngularVelocity, dt, new GearshiftPosition(0));
var emDriveTorque = DataBus.ElectricMotorInfo(emPos).GetTorqueForElectricPower(voltage, emDrivePower, firstResponse.ElectricMotor.AngularVelocity, dt, new GearshiftPosition(0), dryRun);
var emDragTorque = ModelData.ElectricMachinesData.First(x => x.Item1 == emPos).Item2
.DragCurveLookup(firstResponse.ElectricMotor.AngularVelocity, nextGear);
if (emDriveTorque != null &&
......
......@@ -423,7 +423,7 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Strategies
genSetOperatingPoint = MaxGensetPower(absTime, dt, drivetrainDemand, maxPowerGenset, gensetState);
emTorque = TestPowertrain.ElectricMotor.GetTorqueForElectricPower(
DataBus.BatteryInfo.InternalVoltage, drivetrainDemand.Response.ElectricSystem.MaxPowerDrive,
drivetrainDemand.Response.ElectricMotor.AngularVelocity, dt, DataBus.GearboxInfo?.Gear ?? new GearshiftPosition(0));
drivetrainDemand.Response.ElectricMotor.AngularVelocity, dt, DataBus.GearboxInfo?.Gear ?? new GearshiftPosition(0), dryRun);
if (emTorque == null) {
emTorque = -emResponse.MaxDriveTorque;
} else {
......
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