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 1de83eae authored by Markus Quaritsch's avatar Markus Quaritsch
Browse files

Merge pull request #325 in VECTO/vecto-sim from...

Merge pull request #325 in VECTO/vecto-sim from ~EMQUARIMA/vecto-sim:feature/VECTO-396-add-powershift-losses-also-in-measured to develop

* commit '7de44bc9':
  compute shift losses for measured speed mode with gear
  moving computation of powershift losses to base class
  adding constructor to gearinfo class
  move engine inertia to base class
parents 042ce100 7de44bc9
Branches
Tags
No related merge requests found
Showing
with 80 additions and 65 deletions
......@@ -294,7 +294,7 @@ namespace TUGraz.VectoCore.Models.Simulation.Impl
default:
throw new VectoSimulationException("Unknown Gearbox Type: {0}", data.Type);
}
return new Gearbox(container, data, strategy);
return new Gearbox(container, data, strategy, engineInertia);
}
}
}
\ No newline at end of file
......@@ -91,13 +91,17 @@ namespace TUGraz.VectoCore.Models.SimulationComponent
IGearbox Gearbox { get; set; }
GearInfo NextGear { get; }
}
public class GearInfo
{
public uint Gear;
public bool TorqueConverterLocked;
public GearInfo(uint gear, bool tcLocked)
{
Gear = gear;
TorqueConverterLocked = tcLocked;
}
public uint Gear { get; private set; }
public bool TorqueConverterLocked { get; private set; }
}
}
\ No newline at end of file
......@@ -63,7 +63,7 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl
public override GearInfo NextGear
{
get { return new GearInfo(){Gear = _nextGear, TorqueConverterLocked = false}; }
get { return new GearInfo( _nextGear, false); }
}
public override uint Engage(Second absTime, Second dt, NewtonMeter outTorque, PerSecond outAngularVelocity)
......
......@@ -50,7 +50,7 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl
protected internal readonly TorqueConverter TorqueConverter;
private IIdleController _idleController;
protected bool RequestAfterGearshift;
protected KilogramSquareMeter EngineInertia;
public bool TorqueConverterLocked
{
......@@ -60,12 +60,11 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl
public ATGearbox(IVehicleContainer container, GearboxData gearboxModelData, IShiftStrategy strategy,
KilogramSquareMeter engineInertia)
: base(container, gearboxModelData)
: base(container, gearboxModelData, engineInertia)
{
_strategy = strategy;
_strategy.Gearbox = this;
LastShift = -double.MaxValue.SI<Second>();
EngineInertia = engineInertia;
TorqueConverter = new TorqueConverter(this, _strategy, container, gearboxModelData.TorqueConverterData,
engineInertia);
}
......@@ -236,31 +235,6 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl
return retVal;
}
protected internal NewtonMeter ComputeShiftLosses(Second dt, NewtonMeter outTorque, PerSecond outAngularVelocity)
{
var torqueGbxIn = outTorque / ModelData.Gears[Gear].Ratio;
var deltaEngineSpeed = DataBus.EngineSpeed - outAngularVelocity * ModelData.Gears[Gear].Ratio;
var deltaClutchSpeed = (DataBus.EngineSpeed - PreviousState.OutAngularVelocity * ModelData.Gears[Gear].Ratio) / 2;
var torqueInertia = EngineInertia * deltaEngineSpeed / dt;
var averageEngineSpeed = (DataBus.EngineSpeed + outAngularVelocity * ModelData.Gears[Gear].Ratio) / 2;
var torqueLoss = (torqueGbxIn + torqueInertia) * deltaClutchSpeed / averageEngineSpeed;
return torqueLoss.Abs();
}
private bool ConsiderShiftLosses(GearInfo nextGear, NewtonMeter torqueOut)
{
if (torqueOut.IsSmaller(0)) {
return false;
}
if (nextGear.Gear == 0) {
return false;
}
if (ModelData.Gears[2].HasTorqueConverter) {
return false; // nextGear.TorqueConverterLocked || nextGear.Gear == 2;
}
return nextGear.TorqueConverterLocked;
}
private IResponse RequestEngaged(Second absTime, Second dt, NewtonMeter outTorque, PerSecond outAngularVelocity,
bool dryRun)
......
......@@ -285,7 +285,7 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl
public GearInfo NextGear
{
get { return new GearInfo() { Gear = _nextGear.Gear, TorqueConverterLocked = _nextGear.TorqueConverterLocked }; }
get { return new GearInfo(_nextGear.Gear, _nextGear.TorqueConverterLocked ); }
}
......
......@@ -51,9 +51,13 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl
/// </summary>
[Required, ValidateObject] internal readonly GearboxData ModelData;
protected AbstractGearbox(IVehicleContainer container, GearboxData gearboxModelData) : base(container)
protected KilogramSquareMeter EngineInertia;
protected AbstractGearbox(IVehicleContainer container, GearboxData gearboxModelData, KilogramSquareMeter engineInertia)
: base(container)
{
ModelData = gearboxModelData;
EngineInertia = engineInertia;
}
#region ITnOutPort
......@@ -121,6 +125,35 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl
#endregion
public abstract bool ClutchClosed(Second absTime);
protected bool ConsiderShiftLosses(GearInfo nextGear, NewtonMeter torqueOut)
{
if (ModelData.Type.ManualTransmission()) {
return false;
}
if (torqueOut.IsSmaller(0)) {
return false;
}
if (nextGear.Gear == 0) {
return false;
}
if (ModelData.Gears[2].HasTorqueConverter) {
return false; // nextGear.TorqueConverterLocked || nextGear.Gear == 2;
}
return nextGear.TorqueConverterLocked;
}
protected internal NewtonMeter ComputeShiftLosses(Second dt, NewtonMeter outTorque, PerSecond outAngularVelocity)
{
var torqueGbxIn = outTorque / ModelData.Gears[Gear].Ratio;
var deltaEngineSpeed = DataBus.EngineSpeed - outAngularVelocity * ModelData.Gears[Gear].Ratio;
var deltaClutchSpeed = (DataBus.EngineSpeed - PreviousState.OutAngularVelocity * ModelData.Gears[Gear].Ratio) / 2;
var torqueInertia = EngineInertia * deltaEngineSpeed / dt;
var averageEngineSpeed = (DataBus.EngineSpeed + outAngularVelocity * ModelData.Gears[Gear].Ratio) / 2;
var torqueLoss = (torqueGbxIn + torqueInertia) * deltaClutchSpeed / averageEngineSpeed;
return torqueLoss.Abs();
}
}
public class GearboxState : SimpleComponentState
......
......@@ -53,7 +53,7 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl
protected internal readonly TorqueConverter TorqueConverter;
public CycleGearbox(IVehicleContainer container, GearboxData gearboxModelData, KilogramSquareMeter engineInertia)
: base(container, gearboxModelData)
: base(container, gearboxModelData, engineInertia)
{
if (!gearboxModelData.Type.AutomaticTransmission()) {
return;
......@@ -228,10 +228,13 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl
return dryRunResponse;
}
// this code has to be _after_ the check for a potential gear-shift!
// (the above block issues dry-run requests and thus may update the CurrentState!)
CurrentState.TransmissionTorqueLoss = inTorque - (outTorque / effectiveRatio);
if (Gear != PreviousState.Gear &&
ConsiderShiftLosses(new GearInfo(Gear, torqueConverterLocked), outTorque)) {
CurrentState.PowershiftLosses = ComputeShiftLosses(dt, outTorque, outAngularVelocity);
}
inTorque += CurrentState.PowershiftLosses ?? 0.SI<NewtonMeter>();
CurrentState.SetState(inTorque, inAngularVelocity, outTorque, outAngularVelocity);
CurrentState.Gear = Gear;
// end critical section
......@@ -339,6 +342,9 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl
if (ModelData.Type.AutomaticTransmission()) {
container[ModalResultField.TC_Locked] = !CurrentState.TorqueConverterActive;
container[ModalResultField.P_gbx_shift_loss] = CurrentState.PowershiftLosses == null
? 0.SI<Watt>()
: CurrentState.PowershiftLosses * avgInAngularSpeed;
}
// torque converter fields are written by TorqueConverter (if present), called from Vehicle container
}
......@@ -366,10 +372,7 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl
{
get
{
return new GearInfo() {
Gear = DataBus.CycleData.RightSample.Gear,
TorqueConverterLocked = !DataBus.CycleData.RightSample.TorqueConverterActive ?? true
};
return new GearInfo(DataBus.CycleData.RightSample.Gear, !DataBus.CycleData.RightSample.TorqueConverterActive ?? true);
}
}
......@@ -385,6 +388,7 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl
public class CycleGearboxState : GearboxState
{
public bool TorqueConverterActive;
public NewtonMeter PowershiftLosses { get; set; }
}
public class CycleShiftStrategy : IShiftStrategy
......
......@@ -74,8 +74,8 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl
return _engageTime.IsSmallerOrEqual(absTime);
}
public Gearbox(IVehicleContainer container, GearboxData gearboxModelData, IShiftStrategy strategy)
: base(container, gearboxModelData)
public Gearbox(IVehicleContainer container, GearboxData gearboxModelData, IShiftStrategy strategy, KilogramSquareMeter engineInertia)
: base(container, gearboxModelData, engineInertia)
{
_strategy = strategy;
_strategy.Gearbox = this;
......
......@@ -94,7 +94,7 @@ namespace TUGraz.VectoCore.Tests.Integration
.AddComponent(new Brakes(container))
.AddComponent(new AxleGear(container, axleGearData))
.AddComponent(new DummyRetarder(container))
.AddComponent(new Gearbox(container, gearboxData, new AMTShiftStrategy(gearboxData, container)))
.AddComponent(new Gearbox(container, gearboxData, new AMTShiftStrategy(gearboxData, container), engineData.Inertia))
.AddComponent(new Clutch(container, engineData))
.AddComponent(engine);
......
......@@ -98,7 +98,7 @@ namespace TUGraz.VectoCore.Tests.Integration
.AddComponent(new Brakes(container))
.AddComponent(new AxleGear(container, axleGearData))
.AddComponent(new DummyRetarder(container))
.AddComponent(new Gearbox(container, gearboxData, new AMTShiftStrategy(gearboxData, container)))
.AddComponent(new Gearbox(container, gearboxData, new AMTShiftStrategy(gearboxData, container), engineData.Inertia))
.AddComponent(clutch)
.AddComponent(engine);
......
......@@ -89,7 +89,7 @@ namespace TUGraz.VectoCore.Tests.Integration.SimulationRuns
.AddComponent(new Wheels(container, vehicleData.DynamicTyreRadius, vehicleData.WheelsInertia))
.AddComponent(new Brakes(container))
.AddComponent(new AxleGear(container, axleGearData))
.AddComponent(new Gearbox(container, gearboxData, new AMTShiftStrategy(gearboxData, container)))
.AddComponent(new Gearbox(container, gearboxData, new AMTShiftStrategy(gearboxData, container), engineData.Inertia))
.AddComponent(new Clutch(container, engineData))
.AddComponent(new CombustionEngine(container, engineData));
......@@ -145,7 +145,7 @@ namespace TUGraz.VectoCore.Tests.Integration.SimulationRuns
.AddComponent(new Wheels(container, vehicleData.DynamicTyreRadius, vehicleData.WheelsInertia))
.AddComponent(new Brakes(container))
.AddComponent(new AxleGear(container, axleGearData))
.AddComponent(new Gearbox(container, gearboxData, new AMTShiftStrategy(gearboxData, container)))
.AddComponent(new Gearbox(container, gearboxData, new AMTShiftStrategy(gearboxData, container), engineData.Inertia))
.AddComponent(new Clutch(container, engineData))
.AddComponent(new CombustionEngine(container, engineData));
......@@ -215,7 +215,7 @@ namespace TUGraz.VectoCore.Tests.Integration.SimulationRuns
.AddComponent(new Wheels(container, vehicleData.DynamicTyreRadius, vehicleData.WheelsInertia))
.AddComponent(new Brakes(container))
.AddComponent(new AxleGear(container, axleGearData))
.AddComponent(new Gearbox(container, gearboxData, new AMTShiftStrategy(gearboxData, container)))
.AddComponent(new Gearbox(container, gearboxData, new AMTShiftStrategy(gearboxData, container), engineData.Inertia))
.AddComponent(new Clutch(container, engineData))
.AddComponent(new CombustionEngine(container, engineData));
......
......@@ -118,7 +118,7 @@ namespace TUGraz.VectoCore.Tests.Integration
.AddComponent(new Brakes(container))
.AddComponent(new AxleGear(container, axleGearData))
.AddComponent(new DummyRetarder(container))
.AddComponent(new Gearbox(container, gearboxData, gbxStrategy))
.AddComponent(new Gearbox(container, gearboxData, gbxStrategy, engineData.Inertia))
.AddComponent(clutch)
.AddComponent(engine);
......
......@@ -198,7 +198,7 @@ namespace TUGraz.VectoCore.Tests.Models.SimulationComponent
{
var gearboxData = MockSimulationDataFactory.CreateGearboxDataFromFile(gbxFile, engineFile);
var container = new VehicleContainer(ExecutionMode.Engineering);
var gearbox = new Gearbox(container, gearboxData, new AMTShiftStrategy(gearboxData, container));
var gearbox = new Gearbox(container, gearboxData, new AMTShiftStrategy(gearboxData, container), 0.SI<KilogramSquareMeter>());
var driver = new MockDriver(container);
var vehicle = new MockVehicle(container) { MyVehicleSpeed = 0.KMPHtoMeterPerSecond() };
......@@ -231,7 +231,7 @@ namespace TUGraz.VectoCore.Tests.Models.SimulationComponent
{
var gearboxData = MockSimulationDataFactory.CreateGearboxDataFromFile(gbxFile, engineFile);
var container = new VehicleContainer(ExecutionMode.Declaration);
var gearbox = new Gearbox(container, gearboxData, new AMTShiftStrategy(gearboxData, container));
var gearbox = new Gearbox(container, gearboxData, new AMTShiftStrategy(gearboxData, container), 0.SI<KilogramSquareMeter>());
var driver = new MockDriver(container);
var vehicle = new MockVehicle(container) { MyVehicleSpeed = 0.KMPHtoMeterPerSecond() };
......@@ -264,7 +264,7 @@ namespace TUGraz.VectoCore.Tests.Models.SimulationComponent
{
var gearboxData = MockSimulationDataFactory.CreateGearboxDataFromFile(GearboxDataFile, EngineDataFile);
var container = new VehicleContainer(executionMode: ExecutionMode.Engineering);
var gearbox = new Gearbox(container, gearboxData, new AMTShiftStrategy(gearboxData, container));
var gearbox = new Gearbox(container, gearboxData, new AMTShiftStrategy(gearboxData, container), 0.SI<KilogramSquareMeter>());
var driver = new MockDriver(container);
var vehicle = new MockVehicle(container) { MyVehicleSpeed = 0.KMPHtoMeterPerSecond() };
......@@ -298,7 +298,7 @@ namespace TUGraz.VectoCore.Tests.Models.SimulationComponent
{
var gearboxData = MockSimulationDataFactory.CreateGearboxDataFromFile(GearboxDataFile, EngineDataFile);
var container = new VehicleContainer(ExecutionMode.Engineering);
var gearbox = new Gearbox(container, gearboxData, new AMTShiftStrategy(gearboxData, container));
var gearbox = new Gearbox(container, gearboxData, new AMTShiftStrategy(gearboxData, container), 0.SI<KilogramSquareMeter>());
var driver = new MockDriver(container);
var vehicle = new MockVehicle(container) { MyVehicleSpeed = 0.KMPHtoMeterPerSecond() };
......@@ -329,7 +329,7 @@ namespace TUGraz.VectoCore.Tests.Models.SimulationComponent
{
var container = new VehicleContainer(ExecutionMode.Engineering);
var gearboxData = MockSimulationDataFactory.CreateGearboxDataFromFile(GearboxDataFile, EngineDataFile);
var gearbox = new Gearbox(container, gearboxData, new AMTShiftStrategy(gearboxData, container));
var gearbox = new Gearbox(container, gearboxData, new AMTShiftStrategy(gearboxData, container), 0.SI<KilogramSquareMeter>());
var vehicle = new MockVehicle(container) { MyVehicleSpeed = 0.KMPHtoMeterPerSecond() };
var driver = new MockDriver(container);
......@@ -391,7 +391,7 @@ namespace TUGraz.VectoCore.Tests.Models.SimulationComponent
{
var container = new VehicleContainer(ExecutionMode.Engineering);
var gearboxData = CreateGearboxData();
var gearbox = new Gearbox(container, gearboxData, new AMTShiftStrategy(gearboxData, container));
var gearbox = new Gearbox(container, gearboxData, new AMTShiftStrategy(gearboxData, container), 0.SI<KilogramSquareMeter>());
var driver = new MockDriver(container);
var vehicle = new MockVehicle(container) { MyVehicleSpeed = 0.KMPHtoMeterPerSecond() };
......@@ -439,7 +439,7 @@ namespace TUGraz.VectoCore.Tests.Models.SimulationComponent
{
var container = new VehicleContainer(ExecutionMode.Engineering);
var gearboxData = MockSimulationDataFactory.CreateGearboxDataFromFile(GearboxDataFile, EngineDataFile);
var gearbox = new Gearbox(container, gearboxData, new AMTShiftStrategy(gearboxData, container));
var gearbox = new Gearbox(container, gearboxData, new AMTShiftStrategy(gearboxData, container), 0.SI<KilogramSquareMeter>());
var driver = new MockDriver(container);
var port = new MockTnOutPort() { EngineN95hSpeed = 2000.RPMtoRad() };
......@@ -490,7 +490,7 @@ namespace TUGraz.VectoCore.Tests.Models.SimulationComponent
TotalMass = 19000.SI<Kilogram>()
};
var gearboxData = MockSimulationDataFactory.CreateGearboxDataFromFile(GearboxDataFile, EngineDataFile);
var gearbox = new Gearbox(container, gearboxData, new AMTShiftStrategy(gearboxData, container));
var gearbox = new Gearbox(container, gearboxData, new AMTShiftStrategy(gearboxData, container), 0.SI<KilogramSquareMeter>());
var port = new MockTnOutPort() { EngineN95hSpeed = 2000.RPMtoRad() };
container.Engine = port;
gearbox.InPort().Connect(port);
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment