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

Skip to content
Snippets Groups Projects
Commit f347403f authored by Michael KRISPER's avatar Michael KRISPER
Browse files

SerialHybridStrategy and SerialHybridStrategyAT: Refactored to IUpdateable

parent cce1d8e2
No related branches found
No related tags found
No related merge requests found
...@@ -29,38 +29,20 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Strategies ...@@ -29,38 +29,20 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Strategies
protected override DrivetrainDemand GetDrivetrainPowerDemand(Second absTime, Second dt, NewtonMeter outTorque, protected override DrivetrainDemand GetDrivetrainPowerDemand(Second absTime, Second dt, NewtonMeter outTorque,
PerSecond outAngularVelocity, GenSetOperatingPoint maxPowerGenset) PerSecond outAngularVelocity, GenSetOperatingPoint maxPowerGenset)
{ {
if (TestPowertrain.Gearbox != null) { TestPowertrain.UpdateComponents();
if (!(DataBus.GearboxInfo is APTNGearbox)) {
throw new VectoException("AT Gearbox Required!");
}
TestPowertrain.Gearbox.Gear = DataBus.VehicleInfo.VehicleStopped ? DataBus.GearboxInfo.NextGear : DataBus.GearboxInfo.Gear;
}
TestPowertrain.Container.VehiclePort.Initialize(DataBus.VehicleInfo.VehicleSpeed, DataBus.DrivingCycleInfo.RoadGradient ?? 0.SI<Radian>());
//TestPowertrain.Vehicle.UpdateFrom(DataBus.VehicleInfo);
//(TestPowertrain.Container.VehicleInfo as Vehicle).PreviousState.Velocity = (DataBus.VehicleInfo as Vehicle).PreviousState.Velocity;
TestPowertrain.ElectricMotor.UpdateFrom(DataBus.ElectricMotorInfo(EmPosition));
TestPowertrain.Battery?.UpdateFrom(DataBus.BatteryInfo);
TestPowertrain.BatterySystem?.UpdateFrom(DataBus.BatteryInfo);
TestPowertrain.Charger.UpdateFrom(maxPowerGenset); TestPowertrain.Charger.UpdateFrom(maxPowerGenset);
TestPowertrain.WHRCharger?.UpdateFrom(DataBus.WHRCharger);
TestPowertrain.Container.VehiclePort.Initialize(DataBus.VehicleInfo.VehicleSpeed, DataBus.DrivingCycleInfo.RoadGradient ?? 0.SI<Radian>());
TestPowertrain.HybridController.Initialize(Controller.PreviousState.OutTorque, Controller.PreviousState.OutAngularVelocity); TestPowertrain.HybridController.Initialize(Controller.PreviousState.OutTorque, Controller.PreviousState.OutAngularVelocity);
TestPowertrain.Gearbox?.UpdateFrom(DataBus.GearboxInfo); TestPowertrain.Gearbox?.UpdateFrom((DataBus.GearboxInfo as AbstractGearbox<GearboxState>).PreviousState);
TestPowertrain.Brakes.BrakePower = DataBus.Brakes.BrakePower;
var testResponse = TestPowertrain.HybridController.NextComponent.Request(absTime, dt, outTorque, outAngularVelocity, false); var testResponse = TestPowertrain.HybridController.NextComponent.Request(absTime, dt, outTorque, outAngularVelocity, false);
var hybridStrategyResponse = new HybridStrategyResponse { TestPowertrain.HybridController.ApplyStrategySettings(new HybridStrategyResponse {
CombustionEngineOn = false, CombustionEngineOn = false,
MechanicalAssistPower = new Dictionary<PowertrainPosition, Tuple<PerSecond, NewtonMeter>> { MechanicalAssistPower = new Dictionary<PowertrainPosition, Tuple<PerSecond, NewtonMeter>> {
{ EmPosition, Tuple.Create(testResponse.ElectricMotor.AvgDrivetrainSpeed, -testResponse.ElectricMotor.TorqueRequest) } { EmPosition, Tuple.Create(testResponse.ElectricMotor.AvgDrivetrainSpeed, -testResponse.ElectricMotor.TorqueRequest) } }
} });
};
TestPowertrain.HybridController.ApplyStrategySettings(hybridStrategyResponse);
var testResponse2 = TestPowertrain.HybridController.NextComponent.Request(absTime, dt, outTorque, outAngularVelocity, false); var testResponse2 = TestPowertrain.HybridController.NextComponent.Request(absTime, dt, outTorque, outAngularVelocity, false);
return new DrivetrainDemand { return new DrivetrainDemand {
AvgEmDrivetrainSpeed = testResponse2.ElectricMotor.AvgDrivetrainSpeed, AvgEmDrivetrainSpeed = testResponse2.ElectricMotor.AvgDrivetrainSpeed,
...@@ -69,7 +51,7 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Strategies ...@@ -69,7 +51,7 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Strategies
Response = testResponse2 Response = testResponse2
}; };
} }
#endregion #endregion
} }
...@@ -82,35 +64,22 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Strategies ...@@ -82,35 +64,22 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Strategies
public SerialHybridStrategy(VectoRunData runData, IVehicleContainer container) : base(runData, container) { } public SerialHybridStrategy(VectoRunData runData, IVehicleContainer container) : base(runData, container) { }
protected override DrivetrainDemand GetDrivetrainPowerDemand(Second absTime, Second dt, NewtonMeter outTorque, protected override DrivetrainDemand GetDrivetrainPowerDemand(Second absTime, Second dt, NewtonMeter outTorque,
PerSecond outAngularVelocity, GenSetOperatingPoint maxPowerGenset) PerSecond outAngularVelocity, GenSetOperatingPoint maxPowerGenset)
{ {
TestPowertrain.Gearbox?.UpdateFrom(DataBus.GearboxInfo); TestPowertrain.UpdateComponents();
if (TestPowertrain.Gearbox != null) {
TestPowertrain.Gearbox.Gear = DataBus.VehicleInfo.VehicleStopped ? (DataBus.GearboxInfo as Gearbox).NextGear : DataBus.GearboxInfo.Gear;
}
TestPowertrain.Container.VehiclePort.Initialize(DataBus.VehicleInfo.VehicleSpeed, DataBus.DrivingCycleInfo.RoadGradient ?? 0.SI<Radian>());
TestPowertrain.ElectricMotor.UpdateFrom(DataBus.ElectricMotorInfo(EmPosition));
TestPowertrain.Battery?.UpdateFrom(DataBus.BatteryInfo);
TestPowertrain.BatterySystem?.UpdateFrom(DataBus.BatteryInfo);
TestPowertrain.Charger.UpdateFrom(maxPowerGenset); TestPowertrain.Charger.UpdateFrom(maxPowerGenset);
TestPowertrain.WHRCharger?.UpdateFrom(DataBus.WHRCharger);
TestPowertrain.Container.VehiclePort.Initialize(DataBus.VehicleInfo.VehicleSpeed, DataBus.DrivingCycleInfo.RoadGradient ?? 0.SI<Radian>());
TestPowertrain.HybridController.Initialize(Controller.PreviousState.OutTorque, Controller.PreviousState.OutAngularVelocity); TestPowertrain.HybridController.Initialize(Controller.PreviousState.OutTorque, Controller.PreviousState.OutAngularVelocity);
TestPowertrain.Brakes.BrakePower = DataBus.Brakes.BrakePower;
TestPowertrain.Gearbox?.UpdateFrom(DataBus.GearboxInfo);
TestPowertrain.Gearbox?.UpdateFrom((DataBus.GearboxInfo as AbstractGearbox<GearboxState>).PreviousState);
var testResponse = TestPowertrain.HybridController.NextComponent.Request(absTime, dt, outTorque, outAngularVelocity, false); var testResponse = TestPowertrain.HybridController.NextComponent.Request(absTime, dt, outTorque, outAngularVelocity, false);
TestPowertrain.HybridController.ApplyStrategySettings(new HybridStrategyResponse { TestPowertrain.HybridController.ApplyStrategySettings(new HybridStrategyResponse {
CombustionEngineOn = false, CombustionEngineOn = false,
MechanicalAssistPower = new Dictionary<PowertrainPosition, Tuple<PerSecond, NewtonMeter>> { MechanicalAssistPower = new Dictionary<PowertrainPosition, Tuple<PerSecond, NewtonMeter>> {
{ EmPosition, Tuple.Create(testResponse.ElectricMotor.AvgDrivetrainSpeed, -testResponse.ElectricMotor.TorqueRequest) } { EmPosition, Tuple.Create(testResponse.ElectricMotor.AvgDrivetrainSpeed, -testResponse.ElectricMotor.TorqueRequest) } }
}
}); });
var testResponse2 = TestPowertrain.HybridController.NextComponent.Request(absTime, dt, outTorque, outAngularVelocity, false); var testResponse2 = TestPowertrain.HybridController.NextComponent.Request(absTime, dt, outTorque, outAngularVelocity, false);
return new DrivetrainDemand { return new DrivetrainDemand {
AvgEmDrivetrainSpeed = testResponse2.ElectricMotor.AvgDrivetrainSpeed, AvgEmDrivetrainSpeed = testResponse2.ElectricMotor.AvgDrivetrainSpeed,
...@@ -119,11 +88,12 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Strategies ...@@ -119,11 +88,12 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Strategies
Response = testResponse2 Response = testResponse2
}; };
} }
} }
// ======================================================================= // =======================================================================
public abstract class AbstractSerialHybridStrategy<T> : LoggingObject, IHybridControlStrategy where T : class, IHybridControlledGearbox, IGearbox public abstract class AbstractSerialHybridStrategy<T> : LoggingObject, IHybridControlStrategy where T : class, IHybridControlledGearbox, IGearbox
{ {
public enum StateMachineState public enum StateMachineState
...@@ -161,13 +131,13 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Strategies ...@@ -161,13 +131,13 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Strategies
protected TestPowertrain<T> TestPowertrain; protected TestPowertrain<T> TestPowertrain;
protected TestGenset TestGenSet; protected TestGenset TestGenSet;
protected GenSetCharacteristics GenSetCharacteristics; protected GenSetCharacteristics GenSetCharacteristics;
protected PowertrainPosition EmPosition; protected PowertrainPosition EmPosition;
protected DryRunSolutionState DryRunSolution { get; set; } protected DryRunSolutionState DryRunSolution { get; set; }
public AbstractSerialHybridStrategy (VectoRunData runData, IVehicleContainer container) public AbstractSerialHybridStrategy(VectoRunData runData, IVehicleContainer container)
{ {
DataBus = container; DataBus = container;
ModelData = runData; ModelData = runData;
...@@ -203,8 +173,8 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Strategies ...@@ -203,8 +173,8 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Strategies
PowertrainBuilder.BuildSimpleGenSet(runData, gensetContainer); PowertrainBuilder.BuildSimpleGenSet(runData, gensetContainer);
TestGenSet = new TestGenset(gensetContainer, DataBus); TestGenSet = new TestGenset(gensetContainer, DataBus);
container.AddPreprocessor(new GensetPreprocessor(GenSetCharacteristics ,TestGenSet, runData.EngineData, container.AddPreprocessor(new GensetPreprocessor(GenSetCharacteristics, TestGenSet, runData.EngineData,
runData.ElectricMachinesData.FirstOrDefault(x => x.Item1 == PowertrainPosition.GEN)?.Item2)); runData.ElectricMachinesData.FirstOrDefault(x => x.Item1 == PowertrainPosition.GEN)?.Item2));
} }
...@@ -221,7 +191,7 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Strategies ...@@ -221,7 +191,7 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Strategies
} }
GenSetCharacteristics.ContinuousTorque = ModelData.ElectricMachinesData GenSetCharacteristics.ContinuousTorque = ModelData.ElectricMachinesData
.FirstOrDefault(x => x.Item1 == EmPosition)?.Item2.Overload.ContinuousTorque ?? 0.SI<NewtonMeter>(); .FirstOrDefault(x => x.Item1 == EmPosition)?.Item2.Overload.ContinuousTorque ?? 0.SI<NewtonMeter>();
PreviousState.AngularVelocity = outAngularVelocity; PreviousState.AngularVelocity = outAngularVelocity;
PreviousState.SMState = DataBus.BatteryInfo.StateOfCharge > StrategyParameters.TargetSoC PreviousState.SMState = DataBus.BatteryInfo.StateOfCharge > StrategyParameters.TargetSoC
...@@ -449,22 +419,21 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Strategies ...@@ -449,22 +419,21 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Strategies
} }
return ApproachGensetOperatingPoint(absTime, dt, gensetLimit, gensetState); return ApproachGensetOperatingPoint(absTime, dt, gensetLimit, gensetState);
} }
public GenSetOperatingPoint GensetOff => new public GenSetOperatingPoint GensetOff => new
GenSetOperatingPoint GenSetOperatingPoint {
{ ICEOn = false,
ICEOn = false, ICESpeed = ModelData.EngineData.IdleSpeed,
ICESpeed = ModelData.EngineData.IdleSpeed, ICETorque = null,
ICETorque = null, EMTorque = null
EMTorque = null };
};
public GenSetOperatingPoint GensetIdle => new GenSetOperatingPoint() { public GenSetOperatingPoint GensetIdle => new GenSetOperatingPoint() {
ICEOn = true, ICEOn = true,
ICESpeed = ModelData.EngineData.IdleSpeed, ICESpeed = ModelData.EngineData.IdleSpeed,
ICETorque = 0.SI<NewtonMeter>(), ICETorque = 0.SI<NewtonMeter>(),
EMTorque = null, EMTorque = null,
}; };
...@@ -620,7 +589,7 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Strategies ...@@ -620,7 +589,7 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Strategies
var iceSpeed = op.ICESpeed; var iceSpeed = op.ICESpeed;
var emTqDt = op.ICETorque; var emTqDt = op.ICETorque;
TestGenSet.ElectricMotorCtl.EMTorque = emTqDt; TestGenSet.ElectricMotorCtl.EMTorque = emTqDt;
var r1 = TestGenSet.ElectricMotor.Request(absTime, dt, 0.SI<NewtonMeter>(), iceSpeed); var r1 = TestGenSet.ElectricMotor.Request(absTime, dt, 0.SI<NewtonMeter>(), iceSpeed);
...@@ -760,8 +729,8 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Strategies ...@@ -760,8 +729,8 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Strategies
return (tqDt, iceSpeed, r1); return (tqDt, iceSpeed, r1);
} }
public IResponse AmendResponse(IResponse response, Second absTime, Second dt, NewtonMeter outTorque, public IResponse AmendResponse(IResponse response, Second absTime, Second dt, NewtonMeter outTorque,
PerSecond outAngularVelocity, bool dryRun) PerSecond outAngularVelocity, bool dryRun)
{ {
...@@ -773,7 +742,7 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Strategies ...@@ -773,7 +742,7 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Strategies
CurrentState.ICEOn = DataBus.EngineCtl.CombustionEngineOn; CurrentState.ICEOn = DataBus.EngineCtl.CombustionEngineOn;
PreviousState = CurrentState; PreviousState = CurrentState;
CurrentState = new StrategyState(); CurrentState = new StrategyState();
AllowEmergencyShift = false; AllowEmergencyShift = false;
} }
...@@ -788,12 +757,12 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Strategies ...@@ -788,12 +757,12 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Strategies
public void OperatingpointChangedDuringRequest(Second absTime, Second dt, NewtonMeter outTorque, PerSecond outAngularVelocity, public void OperatingpointChangedDuringRequest(Second absTime, Second dt, NewtonMeter outTorque, PerSecond outAngularVelocity,
bool dryRun, IResponse retVal) bool dryRun, IResponse retVal)
{ {
} }
public void RepeatDrivingAction(Second absTime) public void RepeatDrivingAction(Second absTime)
{ {
} }
#endregion #endregion
...@@ -854,8 +823,7 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Strategies ...@@ -854,8 +823,7 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Strategies
public GenSetOperatingPoint OptimalPoint public GenSetOperatingPoint OptimalPoint
{ {
get get {
{
if (_optimalPoint == null) { if (_optimalPoint == null) {
var tmp = OptimalPoints.Values.SelectMany(x => x).Where(x => x.ElectricPower > MinGensetPower).ToArray(); var tmp = OptimalPoints.Values.SelectMany(x => x).Where(x => x.ElectricPower > MinGensetPower).ToArray();
if (!tmp.Any()) { if (!tmp.Any()) {
...@@ -870,8 +838,7 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Strategies ...@@ -870,8 +838,7 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Strategies
public GenSetOperatingPoint OptimalPointDeRated public GenSetOperatingPoint OptimalPointDeRated
{ {
get get {
{
if (_optimalPointDerated == null) { if (_optimalPointDerated == null) {
var tmp = OptimalPoints.Values.SelectMany(x => x).Where(x => x.EMTorque.IsSmaller(ContinuousTorque)).Where(x => x.ElectricPower > MinGensetPower).ToArray(); var tmp = OptimalPoints.Values.SelectMany(x => x).Where(x => x.EMTorque.IsSmaller(ContinuousTorque)).Where(x => x.ElectricPower > MinGensetPower).ToArray();
if (!tmp.Any()) { if (!tmp.Any()) {
...@@ -880,7 +847,7 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Strategies ...@@ -880,7 +847,7 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Strategies
.Where(x => x.EMTorque.IsSmaller(ContinuousTorque)).ToArray(); .Where(x => x.EMTorque.IsSmaller(ContinuousTorque)).ToArray();
} }
_optimalPointDerated = tmp.MinBy(x => x.FuelConsumption / x.ElectricPower); _optimalPointDerated = tmp.MinBy(x => x.FuelConsumption / x.ElectricPower);
} }
......
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