diff --git a/VectoCore/VectoCore/Models/Simulation/DataBus/IElectricMotorInfo.cs b/VectoCore/VectoCore/Models/Simulation/DataBus/IElectricMotorInfo.cs index 6d1c18719648912b75d1b6d34b622dda6cf88afe..802703c7fa154dbff43dadeafd6cdf786e99eeb6 100644 --- a/VectoCore/VectoCore/Models/Simulation/DataBus/IElectricMotorInfo.cs +++ b/VectoCore/VectoCore/Models/Simulation/DataBus/IElectricMotorInfo.cs @@ -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; } } diff --git a/VectoCore/VectoCore/Models/SimulationComponent/Impl/ElectricMotor.cs b/VectoCore/VectoCore/Models/SimulationComponent/Impl/ElectricMotor.cs index 8c27301e54bd993616c84b1c068e279fb2610600..4b9ec551970f85feb092f197e962d66e874565b1 100644 --- a/VectoCore/VectoCore/Models/SimulationComponent/Impl/ElectricMotor.cs +++ b/VectoCore/VectoCore/Models/SimulationComponent/Impl/ElectricMotor.cs @@ -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); diff --git a/VectoCore/VectoCore/Models/SimulationComponent/Strategies/GensetPreprocessor.cs b/VectoCore/VectoCore/Models/SimulationComponent/Strategies/GensetPreprocessor.cs index 6649b4f81ea46960477ee22aca458c4020bbdc5e..482ca5efcb65763c62576d0c9e7db9a9e29fe037 100644 --- a/VectoCore/VectoCore/Models/SimulationComponent/Strategies/GensetPreprocessor.cs +++ b/VectoCore/VectoCore/Models/SimulationComponent/Strategies/GensetPreprocessor.cs @@ -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; diff --git a/VectoCore/VectoCore/Models/SimulationComponent/Strategies/HybridStrategy.cs b/VectoCore/VectoCore/Models/SimulationComponent/Strategies/HybridStrategy.cs index 879823d423033dac242b87c362ca9b69f9243e47..3dfd2518f0dee4ca36b6f189b61b2cfe7ef9261c 100644 --- a/VectoCore/VectoCore/Models/SimulationComponent/Strategies/HybridStrategy.cs +++ b/VectoCore/VectoCore/Models/SimulationComponent/Strategies/HybridStrategy.cs @@ -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 && diff --git a/VectoCore/VectoCore/Models/SimulationComponent/Strategies/SerialHybridStrategy.cs b/VectoCore/VectoCore/Models/SimulationComponent/Strategies/SerialHybridStrategy.cs index f9a5cc20ecc08f4558c10ffdd0a56f72683681d6..00892ed54b9bc1f98384816a1fb70c88dd102ac8 100644 --- a/VectoCore/VectoCore/Models/SimulationComponent/Strategies/SerialHybridStrategy.cs +++ b/VectoCore/VectoCore/Models/SimulationComponent/Strategies/SerialHybridStrategy.cs @@ -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 {