diff --git a/VectoCore/VectoCore/Models/Simulation/IVehicleContainer.cs b/VectoCore/VectoCore/Models/Simulation/IVehicleContainer.cs index b14b1af37372091bb66b52f666a527c72db53975..38548b02517ba68567e7faa3e4529b03d6656f60 100644 --- a/VectoCore/VectoCore/Models/Simulation/IVehicleContainer.cs +++ b/VectoCore/VectoCore/Models/Simulation/IVehicleContainer.cs @@ -29,48 +29,48 @@ * Martin Rexeis, rexeis@ivt.tugraz.at, IVT, Graz University of Technology */ -using System; -using System.ComponentModel.DataAnnotations; -using TUGraz.VectoCommon.Utils; -using TUGraz.VectoCore.Models.Connector.Ports; -using TUGraz.VectoCore.Models.Simulation.Data; -using TUGraz.VectoCore.Models.Simulation.DataBus; -using TUGraz.VectoCore.Models.Simulation.Impl; -using TUGraz.VectoCore.Models.SimulationComponent; -using TUGraz.VectoCore.OutputData; - -namespace TUGraz.VectoCore.Models.Simulation -{ - /// <summary> - /// Defines Methods for adding components, commiting a simulation step and finishing the simulation. - /// Also defines interfaces for all cockpit access to data. - /// </summary> - public interface IVehicleContainer : IDataBus - { - IModalDataContainer ModalData { get; } - - [Required, ValidateObject] - VectoRunData RunData { get; } - - ISimulationOutPort GetCycleOutPort(); - - VectoRun.Status RunStatus { get; set; } - - /// <summary> - /// Adds a component to the vehicle container. - /// </summary> - /// <param name="component"></param> - void AddComponent(VectoSimulationComponent component); - - /// <summary> - /// Commits the current simulation step. - /// </summary> - void CommitSimulationStep(Second time, Second simulationInterval); - - /// <summary> - /// Finishes the simulation. - /// </summary> - /// <param name="exception"></param> - void FinishSimulationRun(Exception exception = null); - } +using System; +using System.ComponentModel.DataAnnotations; +using TUGraz.VectoCommon.Utils; +using TUGraz.VectoCore.Models.Connector.Ports; +using TUGraz.VectoCore.Models.Simulation.Data; +using TUGraz.VectoCore.Models.Simulation.DataBus; +using TUGraz.VectoCore.Models.Simulation.Impl; +using TUGraz.VectoCore.Models.SimulationComponent; +using TUGraz.VectoCore.OutputData; + +namespace TUGraz.VectoCore.Models.Simulation +{ + /// <summary> + /// Defines Methods for adding components, commiting a simulation step and finishing the simulation. + /// Also defines interfaces for all cockpit access to data. + /// </summary> + public interface IVehicleContainer : IDataBus + { + IModalDataContainer ModalData { get; } + + [Required, ValidateObject] + VectoRunData RunData { get; } + + ISimulationOutPort GetCycleOutPort(); + + VectoRun.Status RunStatus { get; set; } + + /// <summary> + /// Adds a component to the vehicle container. + /// </summary> + /// <param name="component"></param> + void AddComponent(VectoSimulationComponent component); + + /// <summary> + /// Commits the current simulation step. + /// </summary> + void CommitSimulationStep(Second time, Second simulationInterval); + + /// <summary> + /// Finishes the simulation. + /// </summary> + /// <param name="exception"></param> + void FinishSimulationRun(Exception exception = null); + } } \ No newline at end of file diff --git a/VectoCore/VectoCore/Models/SimulationComponent/Impl/VTPCycle.cs b/VectoCore/VectoCore/Models/SimulationComponent/Impl/VTPCycle.cs index 957d0479aad6aff14b10169cb6a6138cc6f7e143..3a1f6d5df5611b0b1641f03d38d36cf64bc86e5f 100644 --- a/VectoCore/VectoCore/Models/SimulationComponent/Impl/VTPCycle.cs +++ b/VectoCore/VectoCore/Models/SimulationComponent/Impl/VTPCycle.cs @@ -13,144 +13,144 @@ using TUGraz.VectoCore.Utils; namespace TUGraz.VectoCore.Models.SimulationComponent.Impl { - internal class VTPCycle : PWheelCycle - { - private uint StartGear; - - public VTPCycle(VehicleContainer container, IDrivingCycleData cycle, double axleGearRatio, - VehicleData vehicleData, Dictionary<uint, double> gearRatios) : base(container, cycle) { } - - public override IResponse Initialize() - { - SelectStartGear(); - return base.Initialize(); - } - - private void SelectStartGear() - { - var transmissionRatio = RunData.AxleGearData.AxleGear.Ratio * - (RunData.AngledriveData == null ? 1.0 : RunData.AngledriveData.Angledrive.Ratio) / - RunData.VehicleData.DynamicTyreRadius; - var cardanStartSpeed = (RunData.GearboxData.StartSpeed * transmissionRatio).Cast<PerSecond>(); - var minEngineSpeed = (RunData.EngineData.FullLoadCurves[0].RatedSpeed - RunData.EngineData.IdleSpeed) * - Constants.SimulationSettings.ClutchClosingSpeedNorm + RunData.EngineData.IdleSpeed; - var wheelStartTorque = - (RunData.VehicleData.VehicleCategory == VehicleCategory.Tractor - ? 40000.SI<Kilogram>() - : RunData.VehicleData.GrossVehicleWeight) * RunData.GearboxData.StartAcceleration * - RunData.VehicleData.DynamicTyreRadius; - var wheelStartSpeed = RunData.GearboxData.StartSpeed / RunData.VehicleData.DynamicTyreRadius; - CycleIterator.LeftSample.WheelAngularVelocity = wheelStartSpeed; - var maxStartGear = 1u; - foreach (var gearData in RunData.GearboxData.Gears.Reverse()) { - if (cardanStartSpeed * gearData.Value.Ratio > minEngineSpeed) { - maxStartGear = gearData.Key; - break; - } - } - for (var gear = maxStartGear; gear > 1; gear--) { - var inAngularSpeed = cardanStartSpeed * RunData.GearboxData.Gears[gear].Ratio; - - var ratedSpeed = DataBus.EngineRatedSpeed; - if (inAngularSpeed > ratedSpeed || inAngularSpeed.IsEqual(0)) { - continue; - } - - var response = Initialize(gear, wheelStartTorque, wheelStartSpeed); - - var fullLoadPower = response.DynamicFullLoadPower; //EnginePowerRequest - response.DeltaFullLoad; - var reserve = 1 - response.EnginePowerRequest / fullLoadPower; - - if (response.EngineSpeed > DataBus.EngineIdleSpeed && reserve >= RunData.GearboxData.StartTorqueReserve) { - StartGear = gear; - return; - } - } - StartGear = 1; - } - - internal ResponseDryRun Initialize(uint gear, NewtonMeter outTorque, PerSecond outAngularVelocity) - { - CycleIterator.RightSample.Gear = gear; - //var inAngularVelocity = outAngularVelocity * RunData.GearboxData.Gears[gear].Ratio; - //var torqueLossResult = RunData.GearboxData.Gears[gear].LossMap.GetTorqueLoss(outAngularVelocity, outTorque); - //var inTorque = outTorque / RunData.GearboxData.Gears[gear].Ratio + torqueLossResult.Value; - - var response = - (ResponseDryRun) - NextComponent.Request(0.SI<Second>(), Constants.SimulationSettings.TargetTimeInterval, outTorque, - outAngularVelocity, true); - - //var fullLoad = DataBus.EngineStationaryFullPower(inAngularVelocity); - - return new ResponseDryRun { - Source = this, - EnginePowerRequest = response.EnginePowerRequest, - EngineSpeed = response.EngineSpeed, - DynamicFullLoadPower = response.DynamicFullLoadPower, - ClutchPowerRequest = response.ClutchPowerRequest, - GearboxPowerRequest = outTorque * outAngularVelocity, - //DeltaFullLoad = response.EnginePowerRequest - fullLoad - }; - } - - protected override void InitializeCycleData() - { - FirstRun = false; + internal class VTPCycle : PWheelCycle + { + private uint StartGear; + + public VTPCycle(VehicleContainer container, IDrivingCycleData cycle, double axleGearRatio, + VehicleData vehicleData, Dictionary<uint, double> gearRatios) : base(container, cycle) { } + + public override IResponse Initialize() + { + SelectStartGear(); + return base.Initialize(); + } + + private void SelectStartGear() + { + var transmissionRatio = RunData.AxleGearData.AxleGear.Ratio * + (RunData.AngledriveData == null ? 1.0 : RunData.AngledriveData.Angledrive.Ratio) / + RunData.VehicleData.DynamicTyreRadius; + var cardanStartSpeed = (RunData.GearboxData.StartSpeed * transmissionRatio).Cast<PerSecond>(); + var minEngineSpeed = (RunData.EngineData.FullLoadCurves[0].RatedSpeed - RunData.EngineData.IdleSpeed) * + Constants.SimulationSettings.ClutchClosingSpeedNorm + RunData.EngineData.IdleSpeed; + var wheelStartTorque = + (RunData.VehicleData.VehicleCategory == VehicleCategory.Tractor + ? 40000.SI<Kilogram>() + : RunData.VehicleData.GrossVehicleWeight) * RunData.GearboxData.StartAcceleration * + RunData.VehicleData.DynamicTyreRadius; + var wheelStartSpeed = RunData.GearboxData.StartSpeed / RunData.VehicleData.DynamicTyreRadius; + CycleIterator.LeftSample.WheelAngularVelocity = wheelStartSpeed; + var maxStartGear = 1u; + foreach (var gearData in RunData.GearboxData.Gears.Reverse()) + if (cardanStartSpeed * gearData.Value.Ratio > minEngineSpeed) { + maxStartGear = gearData.Key; + break; + } + for (var gear = maxStartGear; gear > 1; gear--) { + var inAngularSpeed = cardanStartSpeed * RunData.GearboxData.Gears[gear].Ratio; + + var ratedSpeed = DataBus.EngineRatedSpeed; + if (inAngularSpeed > ratedSpeed || inAngularSpeed.IsEqual(0)) + continue; + + var response = Initialize(gear, wheelStartTorque, wheelStartSpeed); + + var fullLoadPower = response.DynamicFullLoadPower; //EnginePowerRequest - response.DeltaFullLoad; + var reserve = 1 - response.EnginePowerRequest / fullLoadPower; + + if (response.EngineSpeed > DataBus.EngineIdleSpeed && reserve >= RunData.GearboxData.StartTorqueReserve) { + StartGear = gear; + return; + } + } + StartGear = 1; + } + + internal ResponseDryRun Initialize(uint gear, NewtonMeter outTorque, PerSecond outAngularVelocity) + { + CycleIterator.RightSample.Gear = gear; + //var inAngularVelocity = outAngularVelocity * RunData.GearboxData.Gears[gear].Ratio; + //var torqueLossResult = RunData.GearboxData.Gears[gear].LossMap.GetTorqueLoss(outAngularVelocity, outTorque); + //var inTorque = outTorque / RunData.GearboxData.Gears[gear].Ratio + torqueLossResult.Value; + + var response = + (ResponseDryRun) + NextComponent.Request(0.SI<Second>(), Constants.SimulationSettings.TargetTimeInterval, outTorque, + outAngularVelocity, true); + + //var fullLoad = DataBus.EngineStationaryFullPower(inAngularVelocity); + + return new ResponseDryRun { + Source = this, + EnginePowerRequest = response.EnginePowerRequest, + EngineSpeed = response.EngineSpeed, + DynamicFullLoadPower = response.DynamicFullLoadPower, + ClutchPowerRequest = response.ClutchPowerRequest, + GearboxPowerRequest = outTorque * outAngularVelocity, + //DeltaFullLoad = response.EnginePowerRequest - fullLoad + }; + } + + protected override void InitializeCycleData() + { + FirstRun = false; var minEngineSpeed = (RunData.EngineData.FullLoadCurves[0].RatedSpeed - RunData.EngineData.IdleSpeed) * Constants.SimulationSettings.ClutchClosingSpeedNorm + RunData.EngineData.IdleSpeed; var gearRatios = RunData.GearboxData.Gears.ToDictionary(g => g.Key, g => g.Value.Ratio); - var stopped = false; - - foreach (var entry in Data.Entries) { - stopped = stopped || entry.VehicleTargetSpeed.IsEqual(0.KMPHtoMeterPerSecond(), - 0.3.KMPHtoMeterPerSecond()); - entry.AngularVelocity = - entry.VehicleTargetSpeed.IsEqual(0.KMPHtoMeterPerSecond(), 0.3.KMPHtoMeterPerSecond()) - ? 0.RPMtoRad() - : entry.WheelAngularVelocity; + var stopped = false; - var cardanSpeed = entry.WheelAngularVelocity * - RunData.AxleGearData.AxleGear.Ratio * (RunData.AngledriveData?.Angledrive.Ratio ?? 1); - if (cardanSpeed.IsEqual(0, 1)) { - entry.Gear = 0; - continue; - } - var ratio = (entry.EngineSpeed / cardanSpeed).Value(); - var gear = gearRatios.Aggregate((x, y) => - Math.Abs(x.Value / ratio - 1) < Math.Abs(y.Value / ratio - 1) ? x : y).Key; - - - //entry.Gear = entry.EngineSpeed < (RunData.EngineData.IdleSpeed + 50.RPMtoRad()) && entry.VehicleTargetSpeed < 5.KMPHtoMeterPerSecond() ? 0 : gear; - if (stopped && gear < StartGear) - entry.Gear = StartGear; - else - entry.Gear = gear == 1 && cardanSpeed * gearRatios[1] <= minEngineSpeed ? 0 : gear; - if (gear > StartGear) - stopped = false; - } - } - - public override bool VehicleStopped - { - get - { - if (CycleIterator.LeftSample.Gear == 0) - return true; - if (CycleIterator.LeftSample.Gear != StartGear) - return false; - - var transmissionRatio = RunData.AxleGearData.AxleGear.Ratio * - (RunData.AngledriveData?.Angledrive.Ratio ?? 1.0); - return CycleIterator.LeftSample.WheelAngularVelocity * transmissionRatio * - RunData.GearboxData.Gears[CycleIterator.LeftSample.Gear].Ratio < DataBus.EngineIdleSpeed; - //return CycleIterator.LeftSample.VehicleTargetSpeed.IsEqual(0.KMPHtoMeterPerSecond(), - // 0.3.KMPHtoMeterPerSecond()); - } - } - - } + foreach (var entry in Data.Entries) { + stopped = stopped || entry.VehicleTargetSpeed.IsEqual(0.KMPHtoMeterPerSecond(), + 0.3.KMPHtoMeterPerSecond()); + entry.AngularVelocity = + entry.VehicleTargetSpeed.IsEqual(0.KMPHtoMeterPerSecond(), 0.3.KMPHtoMeterPerSecond()) + ? 0.RPMtoRad() + : entry.WheelAngularVelocity; + var cardanSpeed = entry.WheelAngularVelocity * + RunData.AxleGearData.AxleGear.Ratio * (RunData.AngledriveData?.Angledrive.Ratio ?? 1); + if (cardanSpeed.IsEqual(0.RPMtoRad(), 1.RPMtoRad())) { + entry.Gear = 0; + continue; + } + var ratio = (entry.EngineSpeed / cardanSpeed).Value(); + var gear = gearRatios.Aggregate((x, y) => + Math.Abs(x.Value / ratio - 1) < Math.Abs(y.Value / ratio - 1) ? x : y).Key; + + + //entry.Gear = entry.EngineSpeed < (RunData.EngineData.IdleSpeed + 50.RPMtoRad()) && entry.VehicleTargetSpeed < 5.KMPHtoMeterPerSecond() ? 0 : gear; + if (stopped && gear <= StartGear) { + entry.Gear = entry.VehicleTargetSpeed.IsEqual(0.KMPHtoMeterPerSecond(), + 0.3.KMPHtoMeterPerSecond()) + ? 0 + : StartGear; + } else { + entry.Gear = gear == 1 && cardanSpeed * gearRatios[1] <= minEngineSpeed ? 0 : gear; + } + if (gear > StartGear) + stopped = false; + } + } + + public override bool VehicleStopped + { + get + { + if (CycleIterator.LeftSample.Gear == 0) + return true; + if (CycleIterator.LeftSample.Gear != StartGear) + return false; + + var transmissionRatio = RunData.AxleGearData.AxleGear.Ratio * + (RunData.AngledriveData?.Angledrive.Ratio ?? 1.0); + return CycleIterator.LeftSample.WheelAngularVelocity * transmissionRatio * + RunData.GearboxData.Gears[CycleIterator.LeftSample.Gear].Ratio < DataBus.EngineIdleSpeed; + //return CycleIterator.LeftSample.VehicleTargetSpeed.IsEqual(0.KMPHtoMeterPerSecond(), + // 0.3.KMPHtoMeterPerSecond()); + } + } + } } \ No newline at end of file diff --git a/VectoCore/VectoCoreTest/Integration/EPTP/EPTPTest.cs b/VectoCore/VectoCoreTest/Integration/EPTP/EPTPTest.cs index a18db88d3800543d743d4e4431ac95d15780c446..ee514abd82feec1f09d8a4e22c7f81389a1ed491 100644 --- a/VectoCore/VectoCoreTest/Integration/EPTP/EPTPTest.cs +++ b/VectoCore/VectoCoreTest/Integration/EPTP/EPTPTest.cs @@ -28,11 +28,11 @@ namespace TUGraz.VectoCore.Tests.Integration.EPTP jobContainer.AddRuns(runsFactory); - //var i = 0; - //jobContainer.Runs[i].Run.Run(); - //Assert.IsTrue(jobContainer.Runs[i].Run.FinishedWithoutErrors); + //var i = 0; + //jobContainer.Runs[i].Run.Run(); + //Assert.IsTrue(jobContainer.Runs[i].Run.FinishedWithoutErrors); - jobContainer.Execute(); + jobContainer.Execute(); jobContainer.WaitFinished(); Assert.AreEqual(true, jobContainer.AllCompleted);