diff --git a/VECTO/Input Files/Gearbox.vb b/VECTO/Input Files/Gearbox.vb index 38eec343d112e0b63a281b9d3ba102112262d0db..9e3a4519dd52c23e702d5c0a92027884275ac481 100644 --- a/VECTO/Input Files/Gearbox.vb +++ b/VECTO/Input Files/Gearbox.vb @@ -74,7 +74,7 @@ Public Class Gearbox Public PSShiftTime As Double - Public Sub New() + Public Sub New() _myPath = "" _filePath = "" SetDefault() @@ -595,6 +595,18 @@ Public Class Gearbox End Get End Property + Public ReadOnly Property VeloictyDropFactor As Double? Implements IGearshiftEngineeringInputData.VeloictyDropFactor + Get + Return Nothing + End Get + End Property + + Public ReadOnly Property AccelerationFactor As Double? Implements IGearshiftEngineeringInputData.AccelerationFactor + Get + Return Nothing + End Get + End Property + Public Overridable ReadOnly Property LoadStageShiftLines As TableData Implements IGearshiftEngineeringInputData.LoadStageShiftLines Get Return Nothing diff --git a/VectoCommon/VectoCommon/InputData/EngineeringInputData.cs b/VectoCommon/VectoCommon/InputData/EngineeringInputData.cs index 904adaed184ffc4c9ba5834521cda50c338d6dd6..1531d28d0661cae80a7369e0e29fa360325d4db4 100644 --- a/VectoCommon/VectoCommon/InputData/EngineeringInputData.cs +++ b/VectoCommon/VectoCommon/InputData/EngineeringInputData.cs @@ -277,6 +277,9 @@ namespace TUGraz.VectoCommon.InputData int? AllowedGearRangeFC { get; } + double? VeloictyDropFactor { get; } + + double? AccelerationFactor { get; } // Voith GS Parameters TableData LoadStageShiftLines { get; } diff --git a/VectoCore/VectoCore/InputData/FileIO/JSON/JSONGearboxData.cs b/VectoCore/VectoCore/InputData/FileIO/JSON/JSONGearboxData.cs index ed8f182f2fbad9bfbe52ca022d82800a9eec354b..84c37a92970674c80f12ccee6abd3e835f35cce6 100644 --- a/VectoCore/VectoCore/InputData/FileIO/JSON/JSONGearboxData.cs +++ b/VectoCore/VectoCore/InputData/FileIO/JSON/JSONGearboxData.cs @@ -118,6 +118,7 @@ namespace TUGraz.VectoCore.InputData.FileIO.JSON public class JSONGearboxDataV5 : JSONFile, IGearboxEngineeringInputData, IAxleGearInputData, ITorqueConverterEngineeringInputData, IGearshiftEngineeringInputData { + public JSONGearboxDataV5(JObject data, string filename, bool tolerateMissing = false) : base(data, filename, tolerateMissing) {} @@ -403,6 +404,17 @@ namespace TUGraz.VectoCore.InputData.FileIO.JSON public double? RatioEarlyUpshiftFC { get { return null; } } public double? RatioEarlyDownshiftFC { get { return null; } } public int? AllowedGearRangeFC { get { return null; } } + + public double? VeloictyDropFactor + { + get { return null; } + } + + public double? AccelerationFactor + { + get { return null; } + } + public TableData LoadStageShiftLines { get { return null; } } public IList<double> LoadStageThresoldsUp { get { return null; } } public IList<double> LoadStageThresoldsDown { get { return null; } } diff --git a/VectoCore/VectoCore/InputData/FileIO/JSON/JSONTCUData.cs b/VectoCore/VectoCore/InputData/FileIO/JSON/JSONTCUData.cs index 6cda1e9b0ff76f36d91b3df5bbf2fbfcc365a133..14fad26e2114a029fc90793671ae6b48ccc4ac11 100644 --- a/VectoCore/VectoCore/InputData/FileIO/JSON/JSONTCUData.cs +++ b/VectoCore/VectoCore/InputData/FileIO/JSON/JSONTCUData.cs @@ -268,6 +268,28 @@ namespace TUGraz.VectoCore.InputData.FileIO.JSON } } + public double? VeloictyDropFactor + { + get { + if (Body["VelocityDropFactor"] == null) { + return null; + } + + return Body.GetEx<double>("VelocityDropFactor"); + } + } + + public double? AccelerationFactor + { + get { + if (Body["AccelerationFactorNP98h"] == null) { + return null; + } + + return Body.GetEx<double>("AccelerationFactorNP98h"); + } + } + public TableData LoadStageShiftLines { get { diff --git a/VectoCore/VectoCore/InputData/FileIO/XML/Engineering/DataProvider/XMLEngineeringGearshiftData.cs b/VectoCore/VectoCore/InputData/FileIO/XML/Engineering/DataProvider/XMLEngineeringGearshiftData.cs index 4ef9f27622e00ef4707902d38ec64fb22624ba7a..38265ec2784688a4228ba80a5d388ff9a0288677 100644 --- a/VectoCore/VectoCore/InputData/FileIO/XML/Engineering/DataProvider/XMLEngineeringGearshiftData.cs +++ b/VectoCore/VectoCore/InputData/FileIO/XML/Engineering/DataProvider/XMLEngineeringGearshiftData.cs @@ -115,6 +115,14 @@ namespace TUGraz.VectoCore.InputData.FileIO.XML.Engineering.DataProvider public virtual double? RatioEarlyUpshiftFC { get { return null; } } public virtual double? RatioEarlyDownshiftFC { get { return null; } } public int? AllowedGearRangeFC { get { return null; } } + + public double? VeloictyDropFactor { get { return null; } } + + public double? AccelerationFactor + { + get { return null; } + } + public virtual TableData LoadStageShiftLines { get { return null; } } public virtual IList<double> LoadStageThresoldsUp { get { return null; } } public virtual IList<double> LoadStageThresoldsDown { get { return null; } } diff --git a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/DeclarationDataAdapter.cs b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/DeclarationDataAdapter.cs index 1b65f8f0b05de1c77e176e08d64a5f2640335065..afbe13ca47c2511bed52b3cacdee84fc294d5adc 100644 --- a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/DeclarationDataAdapter.cs +++ b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/DeclarationDataAdapter.cs @@ -599,6 +599,8 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter RatioEarlyUpshiftFC = DeclarationData.GearboxTCU.RatioEarlyUpshiftFC / axleRatio, RatioEarlyDownshiftFC = DeclarationData.GearboxTCU.RatioEarlyDownshiftFC / axleRatio, AllowedGearRangeFC = gbxType.AutomaticTransmission() ? DeclarationData.GearboxTCU.AllowedGearRangeFCAT : DeclarationData.GearboxTCU.AllowedGearRangeFCAMT, + VelocityDropFactor = DeclarationData.GearboxTCU.VelocityDropFactor, + AccelerationFactor = DeclarationData.GearboxTCU.AccelerationFactor, }; return retVal; diff --git a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/EngineeringDataAdapter.cs b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/EngineeringDataAdapter.cs index 72c1cf2bdb831c8e1a43f1556780106ce0b9ae93..db9761b38d8cb9b3cb0f234019d2bceb5d96004c 100644 --- a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/EngineeringDataAdapter.cs +++ b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/EngineeringDataAdapter.cs @@ -458,6 +458,8 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter RatioEarlyUpshiftFC = (gsInputData.RatioEarlyUpshiftFC ?? DeclarationData.GearboxTCU.RatioEarlyUpshiftFC) / axleRatio, RatioEarlyDownshiftFC = (gsInputData.RatioEarlyDownshiftFC ?? DeclarationData.GearboxTCU.RatioEarlyDownshiftFC) / axleRatio, AllowedGearRangeFC = gsInputData.AllowedGearRangeFC ?? (gbxType.AutomaticTransmission() ? DeclarationData.GearboxTCU.AllowedGearRangeFCAT : DeclarationData.GearboxTCU.AllowedGearRangeFCAMT), + VelocityDropFactor = gsInputData.VeloictyDropFactor ?? DeclarationData.GearboxTCU.VelocityDropFactor, + AccelerationFactor = gsInputData.AccelerationFactor ?? DeclarationData.GearboxTCU.AccelerationFactor, // voith gs parameters diff --git a/VectoCore/VectoCore/Models/Connector/Ports/Impl/Response.cs b/VectoCore/VectoCore/Models/Connector/Ports/Impl/Response.cs index ca3cd73032f5309c11a5cc58a61613fd0dd71fe3..bb0eae80650c446287bca09f265e5810ccf4c1fb 100644 --- a/VectoCore/VectoCore/Models/Connector/Ports/Impl/Response.cs +++ b/VectoCore/VectoCore/Models/Connector/Ports/Impl/Response.cs @@ -52,6 +52,9 @@ namespace TUGraz.VectoCore.Models.Connector.Ports.Impl public Watt DragPower { get; set; } public NewtonMeter EngineTorqueDemand { get; set; } public NewtonMeter EngineTorqueDemandTotal { get; set; } + + public NewtonMeter EngineStationaryFullLoadTorque { get; set; } + public NewtonMeter EngineDynamicFullLoadTorque { get; set; } public MeterPerSecond VehicleSpeed { get; set; } @@ -127,10 +130,11 @@ namespace TUGraz.VectoCore.Models.Connector.Ports.Impl public class ResponseDryRun : AbstractResponse { + public Watt DeltaFullLoad { get; set; } public Watt DeltaDragLoad { get; set; } public PerSecond DeltaEngineSpeed { get; set; } - + } internal class ResponseGearShift : AbstractResponse diff --git a/VectoCore/VectoCore/Models/Declaration/DeclarationData.cs b/VectoCore/VectoCore/Models/Declaration/DeclarationData.cs index 3e13cbb2f89527883b4439764abd05dcd66aac88..f4257b66f2b9fd7208079e1c095d646dc4b53ad3 100644 --- a/VectoCore/VectoCore/Models/Declaration/DeclarationData.cs +++ b/VectoCore/VectoCore/Models/Declaration/DeclarationData.cs @@ -202,6 +202,8 @@ namespace TUGraz.VectoCore.Models.Declaration public const double RatingFactorCurrentGearAT = 0.95; public static readonly MeterPerSquareSecond DriverAccelerationThresholdLow = 0.1.SI<MeterPerSquareSecond>(); + public static double VelocityDropFactor = 0.0; + public static double AccelerationFactor = 0.5; public const double RatioEarlyUpshiftFC = 24; public const double RatioEarlyDownshiftFC = 24; @@ -272,7 +274,7 @@ namespace TUGraz.VectoCore.Models.Declaration var p2 = new Point(engine.IdleSpeed.Value() * 1.1, 0); var p3 = new Point(fullLoadCurve.NTq99lSpeed.Value(), 0); - var p5 = new Point(fullLoadCurve.RatedSpeed.Value(), fullLoadCurve.MaxTorque.Value() * 1.1); + var p5 = new Point(fullLoadCurve.NP98hSpeed.Value(), fullLoadCurve.MaxTorque.Value() * 1.1); var downShift = new List<ShiftPolygon.ShiftPolygonEntry>(); diff --git a/VectoCore/VectoCore/Models/Simulation/Data/ShiftStrategyParameters.cs b/VectoCore/VectoCore/Models/Simulation/Data/ShiftStrategyParameters.cs index 86ce5e14db9f8da5379222b95381518580eb9ef5..6ce35c267c254d623e95a8bbc4ddb0c5cf22e30d 100644 --- a/VectoCore/VectoCore/Models/Simulation/Data/ShiftStrategyParameters.cs +++ b/VectoCore/VectoCore/Models/Simulation/Data/ShiftStrategyParameters.cs @@ -54,11 +54,17 @@ namespace TUGraz.VectoCore.Models.Simulation.Data { public double RatioEarlyDownshiftFC { get; set; } public double RatioEarlyUpshiftFC { get; set; } + public int AllowedGearRangeFC { get; set; } + + public double AccelerationFactor { get; set; } + + public double VelocityDropFactor { get; internal set; } + // Shift Lines for Voith proposed shift strategy public TableData GearshiftLines { get; set; } public IEnumerable<Tuple<double, double>> LoadstageThresholds { get; set; } - public int AllowedGearRangeFC { get; set; } + } } \ No newline at end of file diff --git a/VectoCore/VectoCore/Models/SimulationComponent/Data/Engine/EngineFullLoadCurve.cs b/VectoCore/VectoCore/Models/SimulationComponent/Data/Engine/EngineFullLoadCurve.cs index fc360d838318ebc7ff3986dbc6c4a5a30f1f0bed..86d6ee681daaa7baa6f13e2d4678f90b6613f0c8 100644 --- a/VectoCore/VectoCore/Models/SimulationComponent/Data/Engine/EngineFullLoadCurve.cs +++ b/VectoCore/VectoCore/Models/SimulationComponent/Data/Engine/EngineFullLoadCurve.cs @@ -62,6 +62,10 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Data.Engine private PerSecond _nTq99lSpeed; // 99% of max Torque below rated speed private PerSecond _nP99hSpeed; // 99% of Pmax above rated speed + private PerSecond _nTq98hSpeed; // 99% of max Torque above rated + private PerSecond _nP98hSpeed; // 99% of Pmax above rated speed + + [Required, ValidateObject] internal readonly List<FullLoadCurveEntry> FullLoadEntries; private SortedList<PerSecond, int> _quickLookup; @@ -281,6 +285,16 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Data.Engine get { return _nP99hSpeed ?? (_nP99hSpeed = ComputeNP99HSpeed()); } } + public PerSecond NTq98hSpeed + { + get { return _nTq98hSpeed ?? (_nTq98hSpeed = FindEnginSpeedForTorque(0.98 * MaxTorque).Last()); } + } + + public PerSecond NP98hSpeed + { + get { return _nP98hSpeed ?? (_nP98hSpeed = ComputeNP98HSpeed()); } + } + private PerSecond ComputeNP99HSpeed() { var retVal = FindEngineSpeedForPower(0.99 * MaxPower).Last(); @@ -291,6 +305,16 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Data.Engine return retVal; } + private PerSecond ComputeNP98HSpeed() + { + var retVal = FindEngineSpeedForPower(0.98 * MaxPower).Last(); + if (retVal <= RatedSpeed) { + throw new VectoException( + "failed to compute n_P99H - must be higher than rated speed. rated speed: {0}, n_tq99h: {1}", RatedSpeed, retVal); + } + return retVal; + } + public PerSecond LoSpeed { get { return _engineSpeedLo ?? (_engineSpeedLo = FindEngineSpeedForPower(0.55 * MaxPower).First()); } diff --git a/VectoCore/VectoCore/Models/SimulationComponent/Impl/AMTShiftStrategyOptimized.cs b/VectoCore/VectoCore/Models/SimulationComponent/Impl/AMTShiftStrategyOptimized.cs index 7580c17593acc60bee7aa45efe7180777e3b53c8..31c60806d35a4d46f7cfe446f49473e955009b3f 100644 --- a/VectoCore/VectoCore/Models/SimulationComponent/Impl/AMTShiftStrategyOptimized.cs +++ b/VectoCore/VectoCore/Models/SimulationComponent/Impl/AMTShiftStrategyOptimized.cs @@ -1,4 +1,5 @@ -using System.Collections.Generic; +using System; +using System.Collections.Generic; using System.Linq; using TUGraz.VectoCommon.Exceptions; using TUGraz.VectoCommon.InputData; @@ -6,6 +7,7 @@ using TUGraz.VectoCommon.Models; using TUGraz.VectoCommon.Utils; 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.DataBus; using TUGraz.VectoCore.Models.Simulation.Impl; @@ -24,7 +26,10 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl private SimplePowertrainContainer TestContainer; private Gearbox TestContainerGbx; - public AMTShiftStrategyOptimized(VectoRunData runData, IDataBus dataBus) : base(runData, dataBus) + protected readonly VelocityRollingLookup VelocityDropData; + private AccelerationCurveData accCurve; + + public AMTShiftStrategyOptimized(VectoRunData runData, IVehicleContainer dataBus) : base(runData, dataBus) { if (runData.EngineData == null) { return; @@ -32,6 +37,7 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl fcMap = runData.EngineData.ConsumptionMap; fld = runData.EngineData.FullLoadCurves; shiftStrategyParameters = runData.GearshiftParameters; + accCurve = runData.DriverData.AccelerationCurve; if (shiftStrategyParameters == null) { throw new VectoException("Parameters for shift strategy missing!"); } @@ -45,6 +51,15 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl throw new VectoException("Unknown gearboxtype: {0}", TestContainer.GearboxCtl.GetType().FullName); } + // register pre-processors + var maxG = runData.Cycle.Entries.Max(x => Math.Abs(x.RoadGradientPercent.Value())) + 1; + var grad = Convert.ToInt32(maxG / 2) * 2; + + VelocityDropData = new VelocityRollingLookup(); + dataBus.AddPreprocessor( + new VelocitySpeedGearshiftPreprocessor(VelocityDropData, runData.GearboxData.TractionInterruption, TestContainer, -grad, grad, 2)); + + if (shiftStrategyParameters.AllowedGearRangeFC > 2 || shiftStrategyParameters.AllowedGearRangeFC < 1) { Log.Warn("Gear-range for FC-based gearshift must be either 1 or 2!"); shiftStrategyParameters.AllowedGearRangeFC = shiftStrategyParameters.AllowedGearRangeFC.LimitTo(1, 2); @@ -62,6 +77,12 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl var fcUpshiftPossible = true; + var estimatedVelocityPostShift = VelocityDropData.Interpolate(DataBus.VehicleSpeed, DataBus.RoadGradient); + var vDrop = DataBus.VehicleSpeed - estimatedVelocityPostShift; + var vehicleSpeedForGearRating = DataBus.VehicleSpeed - vDrop * shiftStrategyParameters.VelocityDropFactor; + + var totalTransmissionRatio = DataBus.EngineSpeed / DataBus.VehicleSpeed; + for (var i = 1; i <= shiftStrategyParameters.AllowedGearRangeFC; i++) { var tryNextGear = (uint)(currentGear + i); @@ -70,7 +91,9 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl } fcUpshiftPossible = true; - var response = RequestDryRunWithGear(absTime, dt, outTorque, outAngularVelocity, tryNextGear); + + var response = RequestDryRunWithGear(absTime, dt, vehicleSpeedForGearRating, DataBus.DriverAcceleration, tryNextGear); + //var response = RequestDryRunWithGear(absTime, dt, outTorque, outAngularVelocity, tryNextGear); var inAngularVelocity = ModelData.Gears[tryNextGear].Ratio * outAngularVelocity; var inTorque = response.ClutchPowerRequest / inAngularVelocity; @@ -83,19 +106,48 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl var fullLoadPower = response.EnginePowerRequest - response.DeltaFullLoad; var reserve = 1 - response.EnginePowerRequest / fullLoadPower; + //var reserve = 1 - response.EngineTorqueDemandTotal / response.EngineStationaryFullLoadTorque; + + if (reserve < ModelData.TorqueReserve && reserve > -0.1) { + //var acc = EstimateAcceleration(outAngularVelocity, outTorque); + + //var estimatedEngineSpeed = vehicleSpeedForGearRating * (totalTransmissionRatio / ModelData.Gears[currentGear].Ratio * ModelData.Gears[tryNextGear].Ratio); + var accelerationFactor = outAngularVelocity * ModelData.Gears[currentGear].Ratio < fld[0].NTq98hSpeed ? + 1.0 : + VectoMath.Interpolate(fld[0].NTq98hSpeed, fld[0].NP98hSpeed, 1.0, shiftStrategyParameters.AccelerationFactor, outAngularVelocity * ModelData.Gears[currentGear].Ratio); + var minAcc = VectoMath.Min(DataBus.DriverAcceleration, accCurve.Lookup(vehicleSpeedForGearRating).Acceleration * accelerationFactor); + //var minAcc = DataBus.DriverAcceleration * accelerationFactor; + response = RequestDryRunWithGear(absTime, dt, vehicleSpeedForGearRating, minAcc, tryNextGear); + //response = RequestDryRunWithGear(absTime, dt, outTorque, outAngularVelocity, tryNextGear); + fullLoadPower = response.EnginePowerRequest - response.DeltaFullLoad; + reserve = 1 - response.EnginePowerRequest / fullLoadPower; + if (reserve < ModelData.TorqueReserve) { + continue; + } else { + Log.Error("foo"); + } + } if (fcCurrent == null) { - var responseCurrent = RequestDryRunWithGear(absTime, dt, outTorque, outAngularVelocity, currentGear); - fcCurrent = fcMap.GetFuelConsumption( - responseCurrent.EngineTorqueDemandTotal.LimitTo( - fld[currentGear].DragLoadStationaryTorque(responseCurrent.EngineSpeed), - fld[currentGear].FullLoadStationaryTorque(responseCurrent.EngineSpeed)) - , responseCurrent.EngineSpeed).Value; + var responseCurrent = RequestDryRunWithGear(absTime, dt, DataBus.VehicleSpeed, DataBus.DriverAcceleration, currentGear); + //var responseCurrent = RequestDryRunWithGear(absTime, dt,outTorque, outAngularVelocity, currentGear); + var tqCurrent = responseCurrent.EngineTorqueDemandTotal.LimitTo( + fld[currentGear].DragLoadStationaryTorque(responseCurrent.EngineSpeed), + fld[currentGear].FullLoadStationaryTorque(responseCurrent.EngineSpeed)); + var fcCurRes = fcMap.GetFuelConsumption(tqCurrent, responseCurrent.EngineSpeed, true); + if (fcCurRes.Extrapolated) { + Log.Warn("EffShift Strategy: Extrapolation of fuel consumption for current gear!n: {1}, Tq: {2}", responseCurrent.EngineSpeed, tqCurrent); + } + fcCurrent = fcCurRes.Value; } - var fcNext = fcMap.GetFuelConsumption( - response.EngineTorqueDemandTotal.LimitTo( - fld[tryNextGear].DragLoadStationaryTorque(response.EngineSpeed), - fld[tryNextGear].FullLoadStationaryTorque(response.EngineSpeed)), response.EngineSpeed).Value; + var tqNext = response.EngineTorqueDemandTotal.LimitTo( + fld[tryNextGear].DragLoadStationaryTorque(response.EngineSpeed), + fld[tryNextGear].FullLoadStationaryTorque(response.EngineSpeed)); + var fcNextRes = fcMap.GetFuelConsumption(tqNext, response.EngineSpeed, true); + if (fcNextRes.Extrapolated) { + Log.Warn("EffShift Strategy: Extrapolation of fuel consumption for gear {0}! n: {1}, Tq: {2}", tryNextGear, response.EngineSpeed, tqNext); + } + var fcNext = fcNextRes.Value; if (reserve < ModelData.TorqueReserve || !fcNext.IsSmaller(fcCurrent * shiftStrategyParameters.RatingFactorCurrentGear) || !fcNext.IsSmaller(minFc)) { @@ -212,6 +264,24 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl #endregion + protected ResponseDryRun RequestDryRunWithGear( + Second absTime, Second dt, MeterPerSecond vehicleSpeed, MeterPerSquareSecond acceleration, uint tryNextGear) + { + LogEnabled = false; + TestContainerGbx.Disengaged = false; + TestContainerGbx.Gear = tryNextGear; + + //TestContainer.GearboxOutPort.Initialize(outTorque, outAngularVelocity); + TestContainer.VehiclePort.Initialize(vehicleSpeed, DataBus.RoadGradient); + var response = (ResponseDryRun)TestContainer.VehiclePort.Request( + 0.SI<Second>(), dt, acceleration, DataBus.RoadGradient, true); + + //var response = (ResponseDryRun)TestContainer.GearboxOutPort.Request( + // 0.SI<Second>(), dt, outTorque, outAngularVelocity, true); + LogEnabled = true; + return response; + } + protected override ResponseDryRun RequestDryRunWithGear( Second absTime, Second dt, NewtonMeter outTorque, PerSecond outAngularVelocity, uint tryNextGear) { diff --git a/VectoCore/VectoCore/Models/SimulationComponent/Impl/CombustionEngine.cs b/VectoCore/VectoCore/Models/SimulationComponent/Impl/CombustionEngine.cs index 09652250f3bce782c0bb2297cb3f7432ee718c00..bc75d01d0e693e33cf83eab2ec560342eb443b69 100644 --- a/VectoCore/VectoCore/Models/SimulationComponent/Impl/CombustionEngine.cs +++ b/VectoCore/VectoCore/Models/SimulationComponent/Impl/CombustionEngine.cs @@ -193,7 +193,8 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl } var fullDragTorque = ModelData.FullLoadCurves[DataBus.Gear].DragLoadStationaryTorque(avgEngineSpeed); - var dynamicFullLoadPower = ComputeFullLoadPower(avgEngineSpeed, dt, dryRun); + var stationaryFullLoadTorque = ModelData.FullLoadCurves[DataBus.Gear].FullLoadStationaryTorque(avgEngineSpeed); + var dynamicFullLoadPower = ComputeFullLoadPower(avgEngineSpeed, stationaryFullLoadTorque, dt, dryRun); var dynamicFullLoadTorque = dynamicFullLoadPower / avgEngineSpeed; var inertiaTorqueLoss = @@ -231,6 +232,7 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl EngineTorqueDemand = torqueOut, EngineTorqueDemandTotal = totalTorqueDemand, EngineDynamicFullLoadTorque = dynamicFullLoadTorque, + EngineStationaryFullLoadTorque = stationaryFullLoadTorque, DragPower = fullDragTorque * avgEngineSpeed, AuxiliariesPowerDemand = auxTorqueDemand * avgEngineSpeed, EngineSpeed = angularVelocity, @@ -243,6 +245,7 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl CurrentState.FullDragTorque = fullDragTorque; CurrentState.DynamicFullLoadTorque = dynamicFullLoadTorque; CurrentState.InertiaTorqueLoss = inertiaTorqueLoss; + CurrentState.StationaryFullLoadTorque = stationaryFullLoadTorque; if ((deltaFull * avgEngineSpeed).IsGreater(0.SI<Watt>(), Constants.SimulationSettings.LineSearchTolerance) && (deltaDrag * avgEngineSpeed).IsSmaller(0.SI<Watt>(), Constants.SimulationSettings.LineSearchTolerance)) { @@ -274,6 +277,7 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl DynamicFullLoadPower = dynamicFullLoadPower, EngineTorqueDemand = torqueOut, EngineTorqueDemandTotal = totalTorqueDemand, + EngineStationaryFullLoadTorque = stationaryFullLoadTorque, EngineDynamicFullLoadTorque = dynamicFullLoadTorque, DragPower = CurrentState.FullDragTorque * avgEngineSpeed, Source = this, @@ -292,6 +296,7 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl DynamicFullLoadPower = dynamicFullLoadPower, EngineTorqueDemand = torqueOut, EngineTorqueDemandTotal = totalTorqueDemand, + EngineStationaryFullLoadTorque = stationaryFullLoadTorque, EngineDynamicFullLoadTorque = dynamicFullLoadTorque, DragPower = CurrentState.FullDragTorque * avgEngineSpeed, Source = this, @@ -306,6 +311,7 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl EnginePowerRequest = totalTorqueDemand * avgEngineSpeed, EngineTorqueDemand = torqueOut, EngineTorqueDemandTotal = totalTorqueDemand, + EngineStationaryFullLoadTorque = stationaryFullLoadTorque, EngineDynamicFullLoadTorque = dynamicFullLoadTorque, DynamicFullLoadPower = dynamicFullLoadPower, DragPower = CurrentState.FullDragTorque * avgEngineSpeed, @@ -451,15 +457,14 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl /// <summary> /// computes full load power from gear [-], angularVelocity [rad/s] and dt [s]. /// </summary> - protected Watt ComputeFullLoadPower(PerSecond avgAngularVelocity, Second dt, bool dryRun) + protected Watt ComputeFullLoadPower(PerSecond avgAngularVelocity, NewtonMeter stationaryFullLoadTorque, Second dt, bool dryRun) { if (dt <= 0) { throw new VectoException("ComputeFullLoadPower cannot compute for simulation interval length 0."); } - CurrentState.StationaryFullLoadTorque = - ModelData.FullLoadCurves[DataBus.Gear].FullLoadStationaryTorque(avgAngularVelocity); - var stationaryFullLoadPower = CurrentState.StationaryFullLoadTorque * avgAngularVelocity; + + var stationaryFullLoadPower = stationaryFullLoadTorque * avgAngularVelocity; Watt dynFullPowerCalculated; diff --git a/VectoCore/VectoCore/Models/SimulationComponent/Impl/EngineOnlyCombustionEngine.cs b/VectoCore/VectoCore/Models/SimulationComponent/Impl/EngineOnlyCombustionEngine.cs index cfc757149d1181ab1fbf561d6f1d876ae2362b09..77252b159d64e2e9c1b11a7c7bd02b9e6228a29e 100644 --- a/VectoCore/VectoCore/Models/SimulationComponent/Impl/EngineOnlyCombustionEngine.cs +++ b/VectoCore/VectoCore/Models/SimulationComponent/Impl/EngineOnlyCombustionEngine.cs @@ -68,7 +68,9 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl CurrentState.EngineTorque = totalTorqueDemand; CurrentState.FullDragTorque = ModelData.FullLoadCurves[0].DragLoadStationaryTorque(avgEngineSpeed); - var dynamicFullLoadPower = ComputeFullLoadPower(avgEngineSpeed, dt, dryRun); + var stationaryFullLoadTorque = ModelData.FullLoadCurves[DataBus.Gear].FullLoadStationaryTorque(avgEngineSpeed); + var dynamicFullLoadPower = ComputeFullLoadPower(avgEngineSpeed, stationaryFullLoadTorque, dt, dryRun); + CurrentState.StationaryFullLoadTorque = stationaryFullLoadTorque; CurrentState.DynamicFullLoadTorque = dynamicFullLoadPower / avgEngineSpeed; ValidatePowerDemand(totalTorqueDemand, CurrentState.DynamicFullLoadTorque, CurrentState.FullDragTorque);