diff --git a/VectoCore/Models/Simulation/Data/IModalDataWriter.cs b/VectoCore/Models/Simulation/Data/IModalDataWriter.cs index 66753ce86ce46a85ca08e091f21a16285c0e3a05..631e0414f6a76ff85546c3086ce70afad647cab9 100644 --- a/VectoCore/Models/Simulation/Data/IModalDataWriter.cs +++ b/VectoCore/Models/Simulation/Data/IModalDataWriter.cs @@ -14,7 +14,7 @@ namespace TUGraz.VectoCore.Models.Simulation.Data /// <summary> /// Commits the data of the current simulation step. /// </summary> - void CommitSimulationStep(TimeSpan absTime, TimeSpan simulationInterval); + void CommitSimulationStep(); void Finish(); } diff --git a/VectoCore/Models/Simulation/Data/ModalDataWriter.cs b/VectoCore/Models/Simulation/Data/ModalDataWriter.cs index ee53ebdb23d6a2843a5a3d2e8eb24f99f7c02438..8d111757aa8932493cd9268c57c9807eb502bd30 100644 --- a/VectoCore/Models/Simulation/Data/ModalDataWriter.cs +++ b/VectoCore/Models/Simulation/Data/ModalDataWriter.cs @@ -19,10 +19,8 @@ namespace TUGraz.VectoCore.Models.Simulation.Data public string FileName { get; set; } - public void CommitSimulationStep(TimeSpan absTime, TimeSpan simulationInterval) + public void CommitSimulationStep() { - this[ModalResultField.time] = (absTime - TimeSpan.FromTicks(simulationInterval.Ticks / 2)).TotalSeconds; - this[ModalResultField.simulationInterval] = simulationInterval.TotalSeconds; Data.Rows.Add(CurrentRow); CurrentRow = Data.NewRow(); } diff --git a/VectoCore/Models/SimulationComponent/Data/DrivingCycleData.cs b/VectoCore/Models/SimulationComponent/Data/DrivingCycleData.cs index 25512f938d3e95ec44f066e918dbb4edd03fa088..cd9fc224d589dfd17d341374214591694530eed6 100644 --- a/VectoCore/Models/SimulationComponent/Data/DrivingCycleData.cs +++ b/VectoCore/Models/SimulationComponent/Data/DrivingCycleData.cs @@ -353,7 +353,7 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Data if (row.Field<string>(Fields.EnginePower).Equals("<DRAG>")) entry.Drag = true; else - entry.EngineTorque = VectoMath.ConvertPowerToTorque(row.ParseDouble(Fields.EnginePower), entry.EngineSpeed); + entry.EngineTorque = VectoMath.ConvertPowerRpmToTorque(row.ParseDouble(Fields.EnginePower), entry.EngineSpeed); } if (row.Table.Columns.Contains(Fields.AdditionalAuxPowerDemand)) diff --git a/VectoCore/Models/SimulationComponent/Impl/CombustionEngine.cs b/VectoCore/Models/SimulationComponent/Impl/CombustionEngine.cs index 57f6fea7d38991f19a8abc7b1628133602bbd7d3..9e8a94b00cb3d309e9a1ad62d0a6cc3b71b1550e 100644 --- a/VectoCore/Models/SimulationComponent/Impl/CombustionEngine.cs +++ b/VectoCore/Models/SimulationComponent/Impl/CombustionEngine.cs @@ -35,7 +35,8 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl public double EnginePower { get; set; } public double EngineSpeed { get; set; } public double EnginePowerLoss { get; set; } - public double FullLoadPower { get; set; } + public double StationaryFullLoadPower { get; set; } + public double DynamicFullLoadPower { get; set; } public double FullLoadTorque { get; set; } public double FullDragPower { get; set; } public double FullDragTorque { get; set; } @@ -117,11 +118,12 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl { writer[ModalResultField.PaEng] = _currentState.EnginePowerLoss; writer[ModalResultField.Pe_drag] = _currentState.FullDragPower; - writer[ModalResultField.Pe_full] = _currentState.FullLoadPower; + writer[ModalResultField.Pe_full] = _currentState.StationaryFullLoadPower; writer[ModalResultField.Pe_eng] = _currentState.EnginePower; writer[ModalResultField.Tq_drag] = _currentState.FullDragTorque; writer[ModalResultField.Tq_full] = _currentState.FullLoadTorque; + writer[ModalResultField.Tq_eng] = _currentState.EngineTorque; writer[ModalResultField.n] = _currentState.EngineSpeed; _previousState = _currentState; _currentState = new EngineState(); @@ -130,6 +132,7 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl public void Request(TimeSpan absTime, TimeSpan dt, double torque, double engineSpeed) { _currentState.EngineSpeed = engineSpeed; + _currentState.AbsTime = absTime; var requestedPower = VectoMath.ConvertRpmTorqueToPower(engineSpeed, torque); @@ -147,10 +150,7 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl _currentState.FullDragTorque = _data.GetFullLoadCurve(currentGear).DragLoadStationaryTorque(engineSpeed); _currentState.FullDragPower = VectoMath.ConvertRpmTorqueToPower(engineSpeed, _currentState.FullDragTorque); - //_currentState.FullLoadPower = FullLoadPowerDyamic(currentGear, engineSpeed); - //_currentState.FullDragPower = _data.GetFullLoadCurve(currentGear).DragLoadStationaryPower(engineSpeed); - - _currentState.FullLoadPower = FullLoadPowerDyamic(currentGear, engineSpeed); + ComputeFullLoadPower(currentGear, engineSpeed); ValidatePowerDemand(requestedEnginePower); @@ -159,6 +159,7 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl UpdateEngineState(requestedEnginePower); _currentState.EnginePower = requestedEnginePower + _currentState.EnginePowerLoss; + _currentState.EngineTorque = VectoMath.ConvertPowerRpmToTorque(_currentState.EnginePower, _currentState.EngineSpeed); } protected void ValidatePowerDemand(double requestedEnginePower) @@ -167,7 +168,7 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl { throw new VectoSimulationException(String.Format("t: {0} P_engine_drag > 0! n: {1} [1/min] ", _currentState.AbsTime, _currentState.EngineSpeed)); } - if (_currentState.FullLoadPower <= 0 && requestedEnginePower > 0) + if (_currentState.DynamicFullLoadPower <= 0 && requestedEnginePower > 0) { throw new VectoSimulationException(String.Format("t: {0} P_engine_full < 0! n: {1} [1/min] ", _currentState.AbsTime, _currentState.EngineSpeed)); } @@ -175,13 +176,13 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl protected double LimitEnginePower(double requestedEnginePower) { - if (requestedEnginePower > _currentState.FullLoadPower) + if (requestedEnginePower > _currentState.DynamicFullLoadPower) { - if (requestedEnginePower / _currentState.FullLoadPower > MaxPowerExceededThreshold) + if (requestedEnginePower / _currentState.DynamicFullLoadPower > MaxPowerExceededThreshold) { _enginePowerCorrections.Add(_currentState.AbsTime); - Log.WarnFormat("t: {0} requested power > P_engine_full * 1.05 - corrected. P_request: {1} P_engine_full: {2}", _currentState.AbsTime, requestedEnginePower, _currentState.FullLoadPower); - return _currentState.FullLoadPower; + Log.WarnFormat("t: {0} requested power > P_engine_full * 1.05 - corrected. P_request: {1} P_engine_full: {2}", _currentState.AbsTime, requestedEnginePower, _currentState.DynamicFullLoadPower); + return _currentState.DynamicFullLoadPower; } } else if (requestedEnginePower < _currentState.FullDragPower) @@ -201,7 +202,7 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl { if (requestedEnginePower < -ZeroThreshold) { - _currentState.OperationMode = IsFullLoad(requestedEnginePower, _currentState.FullLoadPower) + _currentState.OperationMode = IsFullLoad(requestedEnginePower, _currentState.DynamicFullLoadPower) ? EngineOperationMode.FullLoad : EngineOperationMode.Load; } @@ -225,13 +226,16 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl return retVal; } - protected double FullLoadPowerDyamic(uint gear, double rpm) + protected void ComputeFullLoadPower(uint gear, double rpm) { - var staticFullLoadPower = _data.GetFullLoadCurve(gear).FullLoadStationaryPower(rpm); + //_currentState.StationaryFullLoadPower = _data.GetFullLoadCurve(gear).FullLoadStationaryPower(rpm); + _currentState.FullLoadTorque = _data.GetFullLoadCurve(gear).FullLoadStationaryTorque(rpm); + _currentState.StationaryFullLoadPower = VectoMath.ConvertRpmTorqueToPower(rpm, _currentState.FullLoadTorque); + var pt1 = _data.GetFullLoadCurve(gear).PT1(rpm); - return Math.Min((1 / (pt1 + 1)) * (staticFullLoadPower + pt1 * _previousState.EnginePower), - staticFullLoadPower); + _currentState.DynamicFullLoadPower = Math.Min((1 / (pt1 + 1)) * (_currentState.StationaryFullLoadPower + pt1 * _previousState.EnginePower), + _currentState.StationaryFullLoadPower); } protected bool IsFullLoad(double requestedPower, double maxPower) diff --git a/VectoCore/Utils/VectoMath.cs b/VectoCore/Utils/VectoMath.cs index 75c063ecab6d66b4b02abf9f50cd1de407b78dcc..99ec613752a4ae59f2e1440d595d7af07d55eb38 100644 --- a/VectoCore/Utils/VectoMath.cs +++ b/VectoCore/Utils/VectoMath.cs @@ -30,7 +30,7 @@ namespace TUGraz.VectoCore.Utils return (2.0 * Math.PI / 60.0) * torque * rpm; } - public static double ConvertPowerToTorque(double power, double rpm) + public static double ConvertPowerRpmToTorque(double power, double rpm) { return power / ((2.0 * Math.PI / 60.0) * rpm); } diff --git a/VectoCoreTest/Integration/EngineOnlyCycle/EngineOnlyCycleTest.cs b/VectoCoreTest/Integration/EngineOnlyCycle/EngineOnlyCycleTest.cs index 1fdbc85835231294ce34c561c5370f4162d354c9..8b90c5871d776b58782163019f29bf4fa193ae1a 100644 --- a/VectoCoreTest/Integration/EngineOnlyCycle/EngineOnlyCycleTest.cs +++ b/VectoCoreTest/Integration/EngineOnlyCycle/EngineOnlyCycleTest.cs @@ -29,7 +29,7 @@ namespace TUGraz.VectoCore.Tests.Integration.EngineOnlyCycle var dt = TimeSpan.FromSeconds(1); - gearbox.Request(absTime, dt, VectoMath.ConvertPowerToTorque(2329.973, 644.4445), 644.4445); + gearbox.Request(absTime, dt, VectoMath.ConvertPowerRpmToTorque(2329.973, 644.4445), 644.4445); foreach (var sc in vehicleContainer.SimulationComponents()) { diff --git a/VectoCoreTest/Models/SimulationComponent/CombustionEngineTest.cs b/VectoCoreTest/Models/SimulationComponent/CombustionEngineTest.cs index 286750e2de77b9660d54bbcbbfcc3df447f5fe3f..44128abd1e854e74b0b9e5586f260cf7ffeaf63a 100644 --- a/VectoCoreTest/Models/SimulationComponent/CombustionEngineTest.cs +++ b/VectoCoreTest/Models/SimulationComponent/CombustionEngineTest.cs @@ -83,7 +83,7 @@ namespace TUGraz.VectoCore.Tests.Models.SimulationComponent } engineSpeed = 644.4445; - port.Request(absTime, dt, VectoMath.ConvertPowerToTorque(2329.973, engineSpeed), engineSpeed); + port.Request(absTime, dt, VectoMath.ConvertPowerRpmToTorque(2329.973, engineSpeed), engineSpeed); engine.CommitSimulationStep(dataWriter); Assert.AreEqual(1152.40304, dataWriter.GetDouble(ModalResultField.PaEng), 0.001); @@ -100,7 +100,7 @@ namespace TUGraz.VectoCore.Tests.Models.SimulationComponent } engineSpeed = 869.7512; - port.Request(absTime, dt, VectoMath.ConvertPowerToTorque(7984.56, engineSpeed), engineSpeed); + port.Request(absTime, dt, VectoMath.ConvertPowerRpmToTorque(7984.56, engineSpeed), engineSpeed); engine.CommitSimulationStep(dataWriter); @@ -109,7 +109,7 @@ namespace TUGraz.VectoCore.Tests.Models.SimulationComponent absTime += dt; engineSpeed = 644.4445; - port.Request(absTime, dt, VectoMath.ConvertPowerToTorque(7984.56, engineSpeed), engineSpeed); + port.Request(absTime, dt, VectoMath.ConvertPowerRpmToTorque(7984.56, engineSpeed), engineSpeed); engine.CommitSimulationStep(dataWriter); absTime += dt; diff --git a/VectoCoreTest/Utils/TestModalDataWriter.cs b/VectoCoreTest/Utils/TestModalDataWriter.cs index 70f9d1a9388d0153492135947c9d7d63096e983d..fc36269512b74b9e0aee8f4bfb0a40bf31b467b2 100644 --- a/VectoCoreTest/Utils/TestModalDataWriter.cs +++ b/VectoCoreTest/Utils/TestModalDataWriter.cs @@ -19,12 +19,17 @@ namespace TUGraz.VectoCore.Tests.Utils CurrentRow = Data.NewRow(); } + public void CommitSimulationStep() + { + Data.Rows.Add(CurrentRow); + CurrentRow = Data.NewRow(); + } + public void CommitSimulationStep(TimeSpan absTime, TimeSpan simulationInterval) { CurrentRow[ModalResultField.time.GetName()] = (absTime - TimeSpan.FromTicks(simulationInterval.Ticks / 2)).TotalSeconds; CurrentRow[ModalResultField.simulationInterval.GetName()] = simulationInterval.TotalSeconds; - Data.Rows.Add(CurrentRow); - CurrentRow = Data.NewRow(); + CommitSimulationStep(); } public void Finish()