Code development platform for open source projects from the European Union institutions :large_blue_circle: EU Login authentication by SMS has been phased out. To see alternatives please check here

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

remove initialize method in gearbox that takes a gear as argument and issues a...

remove initialize method in gearbox that takes a gear as argument and issues a dry-run request with a different gear.
this approach caused errors because the internal 'previous state' of components might be modified.
instead, a separate simple test-powertrain is used to calculate the necessary values without altering the state of the actual powertrain
parent 6304ad08
Branches
Tags
No related merge requests found
......@@ -53,39 +53,5 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl
return response;
}
protected internal override ResponseDryRun Initialize(Second absTime, GearshiftPosition gear,
NewtonMeter outTorque, PerSecond outAngularVelocity)
{
var oldGear = Gear;
Gear = gear;
var inAngularVelocity = outAngularVelocity * ModelData.Gears[gear.Gear].Ratio;
var torqueLossResult = ModelData.Gears[gear.Gear].LossMap.GetTorqueLoss(outAngularVelocity, outTorque);
CurrentState.TorqueLossResult = torqueLossResult;
var inTorque = outTorque / ModelData.Gears[gear.Gear].Ratio + torqueLossResult.Value;
if (!inAngularVelocity.IsEqual(0)) {
var alpha = ModelData.Inertia.IsEqual(0) ? 0.SI<PerSquareSecond>() : outTorque / ModelData.Inertia;
var inertiaPowerLoss = Formulas.InertiaPower(inAngularVelocity, alpha, ModelData.Inertia, Constants.SimulationSettings.TargetTimeInterval);
inTorque += inertiaPowerLoss / inAngularVelocity;
}
var response = NextComponent.Request(absTime, Constants.SimulationSettings.TargetTimeInterval, inTorque, inAngularVelocity, true);
var eMotor = DataBus.ElectricMotorInfo(DataBus.PowertrainInfo.ElectricMotorPositions[0]);
var fullLoad = -eMotor.MaxPowerDrive(DataBus.BatteryInfo.InternalVoltage, inAngularVelocity, gear);
Gear = oldGear;
return new ResponseDryRun(this, response) {
ElectricMotor = { PowerRequest = response.ElectricMotor.PowerRequest },
Gearbox = {
PowerRequest = outTorque * outAngularVelocity,
InputSpeed = inAngularVelocity,
InputTorque = inTorque,
OutputTorque = outTorque,
OutputSpeed = outAngularVelocity,
},
DeltaFullLoad = response.ElectricMotor.PowerRequest - fullLoad
};
}
}
}
\ No newline at end of file
......@@ -135,64 +135,6 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl
public override bool TCLocked => true;
protected internal virtual ResponseDryRun Initialize(Second absTime, GearshiftPosition gear, NewtonMeter outTorque, PerSecond outAngularVelocity)
{
var oldGear = Gear;
Gear = gear;
var inAngularVelocity = outAngularVelocity * ModelData.Gears[gear.Gear].Ratio;
var torqueLossResult = ModelData.Gears[gear.Gear].LossMap.GetTorqueLoss(outAngularVelocity, outTorque);
CurrentState.TorqueLossResult = torqueLossResult;
var inTorque = outTorque / ModelData.Gears[gear.Gear].Ratio + torqueLossResult.Value;
if (DataBus.PowertrainInfo.ElectricMotorPositions.Any(x => x.IsOneOf(PowertrainPosition.HybridP2, PowertrainPosition.HybridP2_5))) {
// if there is an electric motor after the transmission, initialize the EM first
NextComponent.Initialize(inTorque, inAngularVelocity);
}
if (!inAngularVelocity.IsEqual(0)) {
var alpha = ModelData.Inertia.IsEqual(0)
? 0.SI<PerSquareSecond>()
: outTorque / ModelData.Inertia;
var inertiaPowerLoss = Formulas.InertiaPower(inAngularVelocity, alpha, ModelData.Inertia,
Constants.SimulationSettings.TargetTimeInterval);
inTorque += inertiaPowerLoss / inAngularVelocity;
}
var response = NextComponent.Request(absTime, Constants.SimulationSettings.TargetTimeInterval,
inTorque, inAngularVelocity, true);
//NextComponent.Initialize(inTorque, inAngularVelocity);
//response.Switch().
// Case<ResponseSuccess>().
// Case<ResponseOverload>().
// Case<ResponseUnderload>().
// Default(r => { throw new UnexpectedResponseException("Gearbox.Initialize", r); });
var fullLoad = DataBus.EngineInfo.EngineStationaryFullPower(inAngularVelocity);
Gear = oldGear;
return new ResponseDryRun(this) {
Engine = {
PowerRequest = response.Engine.PowerRequest,
EngineSpeed = response.Engine.EngineSpeed,
DynamicFullLoadPower = response.Engine.DynamicFullLoadPower,
TorqueOutDemand = response.Engine.TorqueOutDemand,
DynamicFullLoadTorque = response.Engine.DynamicFullLoadTorque
},
Clutch = {
PowerRequest = response.Clutch.PowerRequest,
},
Gearbox = {
PowerRequest = outTorque * outAngularVelocity,
InputSpeed = inAngularVelocity,
InputTorque = inTorque,
OutputTorque = outTorque,
OutputSpeed = outAngularVelocity,
},
DeltaFullLoad = response.Engine.PowerRequest - fullLoad
};
}
/// <summary>
/// Requests the Gearbox to deliver torque and angularVelocity
......
......@@ -11,10 +11,12 @@ using TUGraz.VectoCore.Models.Connector.Ports.Impl;
using TUGraz.VectoCore.Models.Declaration;
using TUGraz.VectoCore.Models.Simulation;
using TUGraz.VectoCore.Models.Simulation.Data;
using TUGraz.VectoCore.Models.Simulation.Impl;
using TUGraz.VectoCore.Models.SimulationComponent.Data;
using TUGraz.VectoCore.Models.SimulationComponent.Data.Engine;
using TUGraz.VectoCore.Models.SimulationComponent.Data.Gearbox;
using TUGraz.VectoCore.Models.SimulationComponent.Impl.Shiftstrategies;
using TUGraz.VectoCore.Models.SimulationComponent.Strategies;
using TUGraz.VectoCore.OutputData;
using TUGraz.VectoCore.Utils;
......@@ -307,6 +309,8 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl
protected readonly GearList GearList;
protected readonly VectoRunData _runData;
protected TestPowertrain<Gearbox> TestPowertrain;
public HybridCtlShiftStrategy(HybridController hybridController, IVehicleContainer container) : base(
container)
{
......@@ -334,6 +338,12 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl
MaxStartGear = gear;
break;
}
// create testcontainer
var testContainer = new SimplePowertrainContainer(_runData);
PowertrainBuilder.BuildSimpleHybridPowertrain(_runData, testContainer);
TestPowertrain = new TestPowertrain<Gearbox>(testContainer, DataBus);
}
public override ShiftPolygon ComputeDeclarationShiftPolygon(GearboxType gearboxType, int i,
......@@ -378,10 +388,20 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl
foreach (var entry in GearList.Reverse()) {
var gear = entry;
//for (var gear = (uint)GearboxModelData.Gears.Count; gear > 1; gear--) {
var response = _gearbox.Initialize(absTime, gear, outTorque, outAngularVelocity);
TestPowertrain.UpdateComponents();
TestPowertrain.Gearbox.Gear = gear;
TestPowertrain.Gearbox._nextGear = gear;
if (_controller.CurrentStrategySettings != null) {
TestPowertrain.HybridController.ApplyStrategySettings(_controller.CurrentStrategySettings);
}
var response = TestPowertrain.Gearbox.Initialize(outTorque, outAngularVelocity);
response = TestPowertrain.Gearbox.Request(absTime,
Constants.SimulationSettings.MeasuredSpeedTargetTimeInterval, outTorque, outAngularVelocity,
true);
var inAngularSpeed = outAngularVelocity * GearboxModelData.Gears[gear.Gear].Ratio;
var fullLoadPower = response.Engine.PowerRequest - response.DeltaFullLoad;
var fullLoadPower = DataBus.EngineInfo.EngineStationaryFullPower(response.Engine.EngineSpeed);
var reserve = 1 - response.Engine.PowerRequest / fullLoadPower;
var inTorque = response.Clutch.PowerRequest / inAngularSpeed;
......@@ -426,7 +446,18 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl
continue;
}
var response = _gearbox.Initialize(absTime, gear, outTorque, outAngularVelocity);
//var response = _gearbox.Initialize(absTime, gear, outTorque, outAngularVelocity);
TestPowertrain.UpdateComponents();
TestPowertrain.Gearbox.Gear = gear;
TestPowertrain.Gearbox._nextGear = gear;
if (_controller.CurrentStrategySettings != null) {
TestPowertrain.HybridController.ApplyStrategySettings(_controller.CurrentStrategySettings);
}
var response = TestPowertrain.Gearbox.Initialize(outTorque, outAngularVelocity);
response = TestPowertrain.Gearbox.Request(absTime,
Constants.SimulationSettings.MeasuredSpeedTargetTimeInterval, outTorque, outAngularVelocity,
true);
var fullLoadPower =
response.Engine.DynamicFullLoadTorque; //EnginePowerRequest - response.DeltaFullLoad;
......@@ -599,8 +630,18 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl
}
foreach (var gear in Gears.Reverse()) {
var response = _gearbox.Initialize(absTime, gear, torque, outAngularVelocity);
//var response = _gearbox.Initialize(absTime, gear, torque, outAngularVelocity);
TestPowertrain.UpdateComponents();
TestPowertrain.Gearbox.Gear = gear;
TestPowertrain.Gearbox._nextGear = gear;
if (_controller.CurrentStrategySettings != null) {
TestPowertrain.HybridController.ApplyStrategySettings(_controller.CurrentStrategySettings);
}
var response = TestPowertrain.Gearbox.Initialize(torque, outAngularVelocity);
response = TestPowertrain.Gearbox.Request(absTime,
Constants.SimulationSettings.MeasuredSpeedTargetTimeInterval, torque, outAngularVelocity,
true);
if (response.Engine.EngineSpeed > DataBus.EngineInfo.EngineRatedSpeed || response.Engine.EngineSpeed < DataBus.EngineInfo.EngineIdleSpeed) {
continue;
}
......@@ -633,7 +674,18 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl
continue;
}
var response = _gearbox.Initialize(absTime, gear, outTorque, outAngularVelocity);
//var response = _gearbox.Initialize(absTime, gear, outTorque, outAngularVelocity);
TestPowertrain.UpdateComponents();
TestPowertrain.Gearbox.Gear = gear;
TestPowertrain.Gearbox._nextGear = gear;
if (_controller.CurrentStrategySettings != null) {
TestPowertrain.HybridController.ApplyStrategySettings(_controller.CurrentStrategySettings);
}
var response = TestPowertrain.Gearbox.Initialize(outTorque, outAngularVelocity);
response = TestPowertrain.Gearbox.Request(absTime,
Constants.SimulationSettings.MeasuredSpeedTargetTimeInterval, outTorque, outAngularVelocity,
true);
var fullLoadPower =
response.Engine.DynamicFullLoadTorque; //EnginePowerRequest - response.DeltaFullLoad;
......
......@@ -11,41 +11,5 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl
{
public PEVGearbox(IVehicleContainer container, IShiftStrategy strategy) : base(container, strategy) { }
protected internal override ResponseDryRun Initialize(Second absTime, GearshiftPosition gear, NewtonMeter outTorque, PerSecond outAngularVelocity)
{
var oldGear = Gear;
Gear = gear;
var inAngularVelocity = outAngularVelocity * ModelData.Gears[gear.Gear].Ratio;
var torqueLossResult = ModelData.Gears[gear.Gear].LossMap.GetTorqueLoss(outAngularVelocity, outTorque);
CurrentState.TorqueLossResult = torqueLossResult;
var inTorque = outTorque / ModelData.Gears[gear.Gear].Ratio + torqueLossResult.Value;
if (!inAngularVelocity.IsEqual(0)) {
var alpha = ModelData.Inertia.IsEqual(0)
? 0.SI<PerSquareSecond>()
: outTorque / ModelData.Inertia;
var inertiaPowerLoss = Formulas.InertiaPower(inAngularVelocity, alpha, ModelData.Inertia,
Constants.SimulationSettings.TargetTimeInterval);
inTorque += inertiaPowerLoss / inAngularVelocity;
}
var response =
NextComponent.Request(absTime, Constants.SimulationSettings.TargetTimeInterval, inTorque,
inAngularVelocity, true); //NextComponent.Initialize(inTorque, inAngularVelocity);
var fullLoad = -DataBus.ElectricMotorInfo(PowertrainPosition.BatteryElectricE2).MaxPowerDrive(DataBus.BatteryInfo.InternalVoltage, inAngularVelocity, Gear);
Gear = oldGear;
return new ResponseDryRun(this, response) {
ElectricMotor = {
PowerRequest = response.ElectricMotor.PowerRequest
},
Gearbox = {
PowerRequest = outTorque * outAngularVelocity,
},
DeltaFullLoad = response.ElectricMotor.PowerRequest - fullLoad
};
}
}
}
\ No newline at end of file
......@@ -40,10 +40,12 @@ using TUGraz.VectoCore.Models.Declaration;
using TUGraz.VectoCore.Models.Simulation;
using TUGraz.VectoCore.Models.Simulation.Data;
using TUGraz.VectoCore.Models.Simulation.DataBus;
using TUGraz.VectoCore.Models.Simulation.Impl;
using TUGraz.VectoCore.Models.SimulationComponent.Data;
using TUGraz.VectoCore.Models.SimulationComponent.Data.Engine;
using TUGraz.VectoCore.Models.SimulationComponent.Data.Gearbox;
using TUGraz.VectoCore.Models.SimulationComponent.Impl.Shiftstrategies;
using TUGraz.VectoCore.Models.SimulationComponent.Strategies;
namespace TUGraz.VectoCore.Models.SimulationComponent.Impl
{
......@@ -68,6 +70,8 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl
private GearshiftPosition DesiredGearRoadsweeping;
private readonly IShiftPolygonCalculator _shiftPolygonCalculator;
protected TestPowertrain<Gearbox> TestPowertrain;
public AMTShiftStrategy(IVehicleContainer dataBus) : base(dataBus)
{
var runData = dataBus.RunData;
......@@ -95,6 +99,12 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl
break;
}
}
// create testcontainer
var testContainer = new SimplePowertrainContainer(runData);
PowertrainBuilder.BuildSimplePowertrain(runData, testContainer);
TestPowertrain = new TestPowertrain<Gearbox>(testContainer, DataBus);
}
private bool SpeedTooLowForEngine(GearshiftPosition gear, PerSecond outAngularSpeed)
......@@ -143,10 +153,19 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl
foreach (var gear in Gears.Reverse()) {
var selected = gear;
var response = _gearbox.Initialize(absTime, gear, outTorque, outAngularVelocity);
//var response = _gearbox.Initialize(absTime, gear, outTorque, outAngularVelocity);
TestPowertrain.UpdateComponents();
TestPowertrain.Gearbox.Gear = gear;
TestPowertrain.Gearbox._nextGear = gear;
var response = TestPowertrain.Gearbox.Initialize(outTorque, outAngularVelocity);
response = TestPowertrain.Gearbox.Request(absTime,
Constants.SimulationSettings.MeasuredSpeedTargetTimeInterval, outTorque, outAngularVelocity,
true);
var inAngularSpeed = outAngularVelocity * GearboxModelData.Gears[gear.Gear].Ratio;
var fullLoadPower = response.Engine.PowerRequest - response.DeltaFullLoad;
var fullLoadPower = DataBus.EngineInfo.EngineStationaryFullPower(response.Engine.EngineSpeed);
var reserve = 1 - response.Engine.PowerRequest / fullLoadPower;
var inTorque = response.Clutch.PowerRequest / inAngularSpeed;
......@@ -184,7 +203,15 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl
continue;
}
var response = _gearbox.Initialize(absTime, gear, outTorque, outAngularVelocity);
//var response = _gearbox.Initialize(absTime, gear, outTorque, outAngularVelocity);
TestPowertrain.UpdateComponents();
TestPowertrain.Gearbox.Gear = gear;
TestPowertrain.Gearbox._nextGear = gear;
var response = TestPowertrain.Gearbox.Initialize(outTorque, outAngularVelocity);
response = TestPowertrain.Gearbox.Request(absTime,
Constants.SimulationSettings.MeasuredSpeedTargetTimeInterval, outTorque, outAngularVelocity,
true);
var fullLoadPower = response.Engine.DynamicFullLoadPower; //EnginePowerRequest - response.DeltaFullLoad;
var reserve = 1 - response.Engine.PowerRequest / fullLoadPower;
......
......@@ -5,6 +5,7 @@ using TUGraz.VectoCommon.Exceptions;
using TUGraz.VectoCommon.InputData;
using TUGraz.VectoCommon.Models;
using TUGraz.VectoCommon.Utils;
using TUGraz.VectoCore.Configuration;
using TUGraz.VectoCore.InputData.Reader.DataObjectAdapter;
using TUGraz.VectoCore.Models.Connector.Ports.Impl;
using TUGraz.VectoCore.Models.Declaration;
......@@ -16,6 +17,7 @@ using TUGraz.VectoCore.Models.SimulationComponent.Data;
using TUGraz.VectoCore.Models.SimulationComponent.Data.ElectricMotor;
using TUGraz.VectoCore.Models.SimulationComponent.Data.Engine;
using TUGraz.VectoCore.Models.SimulationComponent.Data.Gearbox;
using TUGraz.VectoCore.Models.SimulationComponent.Strategies;
using TUGraz.VectoCore.OutputData;
using TUGraz.VectoCore.Utils;
......@@ -89,14 +91,14 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl.Shiftstrategies
protected bool DriveOffStandstill { get; set; }
protected TestPowertrain<Gearbox> TestPowertrain;
public PEVAMTShiftStrategy(IVehicleContainer dataBus) : this(dataBus, false)
{
if (dataBus.RunData.VehicleData == null) {
return;
}
EMPos = dataBus.RunData.ElectricMachinesData.FirstOrDefault(x =>
x.Item1 == PowertrainPosition.BatteryElectricE2 || x.Item1 == PowertrainPosition.IEPC)?.Item1 ?? PowertrainPosition.HybridPositionNotSet;
SetupVelocityDropPreprocessor(dataBus);
......@@ -136,6 +138,12 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl.Shiftstrategies
DeRatedShiftpolygons = CalculateDeratedShiftLines(em,
runData.GearboxData.InputData.Gears, runData.VehicleData.DynamicTyreRadius,
runData.AxleGearData?.AxleGear.Ratio ?? 1.0, runData.GearboxData.Type);
// create testcontainer
var testContainer = new SimplePowertrainContainer(runData);
PowertrainBuilder.BuildSimplePowertrainElectric(runData, testContainer);
TestPowertrain = new TestPowertrain<Gearbox>(testContainer, DataBus);
}
protected void SetupVelocityDropPreprocessor(IVehicleContainer dataBus)
......@@ -670,7 +678,15 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl.Shiftstrategies
emE2.Control = new PEVInitControl(DataBus as IVehicleContainer);
foreach (var gear in GearList.Reverse()) {
//for (var gear = (uint)GearboxModelData.Gears.Count; gear > 1; gear--) {
var response = _gearbox.Initialize(absTime, gear, outTorque, outAngularVelocity);
//var response = _gearbox.Initialize(absTime, gear, outTorque, outAngularVelocity);
TestPowertrain.UpdateComponents();
TestPowertrain.Gearbox.Gear = gear;
TestPowertrain.Gearbox._nextGear = gear;
var response = TestPowertrain.Gearbox.Initialize(outTorque, outAngularVelocity);
response = TestPowertrain.Gearbox.Request(absTime,
Constants.SimulationSettings.MeasuredSpeedTargetTimeInterval, outTorque, outAngularVelocity,
true);
var inAngularSpeed = outAngularVelocity * GearboxModelData.Gears[gear.Gear].Ratio;
var inTorque = response.ElectricMotor.PowerRequest / inAngularSpeed;
......@@ -710,7 +726,15 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl.Shiftstrategies
continue;
}
var response = _gearbox.Initialize(absTime, gear, outTorque, outAngularVelocity);
//var response = _gearbox.Initialize(absTime, gear, outTorque, outAngularVelocity);
TestPowertrain.UpdateComponents();
TestPowertrain.Gearbox.Gear = gear;
TestPowertrain.Gearbox._nextGear = gear;
var response = TestPowertrain.Gearbox.Initialize(outTorque, outAngularVelocity);
response = TestPowertrain.Gearbox.Request(absTime,
Constants.SimulationSettings.MeasuredSpeedTargetTimeInterval, outTorque, outAngularVelocity,
true);
var fullLoadPower = -(response.ElectricMotor.MaxDriveTorque * response.ElectricMotor.AngularVelocity);
//.DynamicFullLoadPower; //EnginePowerRequest - response.DeltaFullLoad;
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment