From d6f5eabe0cd212d03233959eacf9b270a270ef83 Mon Sep 17 00:00:00 2001 From: Markus Quaritsch <markus.quaritsch@tugraz.at> Date: Thu, 24 Sep 2015 17:33:29 +0200 Subject: [PATCH] Introduce EngineIdleController Class and Interface(s) --- .../Simulation/Impl/PowertrainBuilder.cs | 5 +-- .../SimulationComponent/ICombustionEngine.cs | 5 ++- .../ICombustionEngineIdleController.cs | 10 ++++++ .../Models/SimulationComponent/Impl/Brakes.cs | 2 +- .../Models/SimulationComponent/Impl/Clutch.cs | 9 +++-- .../Impl/CombustionEngine.cs | 35 ++++++++++++++++++- VectoCore/VectoCore.csproj | 1 + VectoCoreTest/Integration/CoachPowerTrain.cs | 5 +-- .../EngineOnlyCycle/EngineOnlyCycleTest.cs | 2 +- .../SimulationRuns/FullPowertrain.cs | 15 ++++---- .../SimulationRuns/MinimalPowertrain.cs | 12 ++++--- .../Integration/Truck40tPowerTrain.cs | 7 ++-- .../Models/Simulation/DrivingCycleTests.cs | 4 +-- .../Models/SimulationComponent/ClutchTest.cs | 2 +- .../CombustionEngineTest.cs | 2 +- .../Models/SimulationComponent/DriverTest.cs | 9 ++--- 16 files changed, 94 insertions(+), 31 deletions(-) create mode 100644 VectoCore/Models/SimulationComponent/ICombustionEngineIdleController.cs diff --git a/VectoCore/Models/Simulation/Impl/PowertrainBuilder.cs b/VectoCore/Models/Simulation/Impl/PowertrainBuilder.cs index 052aaf2825..f3832255fb 100644 --- a/VectoCore/Models/Simulation/Impl/PowertrainBuilder.cs +++ b/VectoCore/Models/Simulation/Impl/PowertrainBuilder.cs @@ -70,8 +70,9 @@ namespace TUGraz.VectoCore.Models.Simulation.Impl break; } + var engine = new CombustionEngine(_container, data.EngineData); // gearbox --> clutch - tmp = AddComponent(tmp, new Clutch(_container, data.EngineData)); + tmp = AddComponent(tmp, new Clutch(_container, data.EngineData, engine.GetIdleController())); // clutch --> direct aux --> ... --> aux_XXX --> directAux @@ -94,7 +95,7 @@ namespace TUGraz.VectoCore.Models.Simulation.Impl tmp = AddComponent(tmp, aux); } // connect aux --> engine - AddComponent(tmp, new CombustionEngine(_container, data.EngineData)); + AddComponent(tmp, engine); return _container; } diff --git a/VectoCore/Models/SimulationComponent/ICombustionEngine.cs b/VectoCore/Models/SimulationComponent/ICombustionEngine.cs index 6626e33d7e..34b0eaf1c0 100644 --- a/VectoCore/Models/SimulationComponent/ICombustionEngine.cs +++ b/VectoCore/Models/SimulationComponent/ICombustionEngine.cs @@ -6,5 +6,8 @@ namespace TUGraz.VectoCore.Models.SimulationComponent /// <summary> /// Defines Interfaces for a combustion engine. /// </summary> - public interface ICombustionEngine : ITnOutProvider, IEngineInfo {} + public interface ICombustionEngine : ITnOutProvider, IEngineInfo + { + ICombustionEngineIdleController GetIdleController(); + } } \ No newline at end of file diff --git a/VectoCore/Models/SimulationComponent/ICombustionEngineIdleController.cs b/VectoCore/Models/SimulationComponent/ICombustionEngineIdleController.cs new file mode 100644 index 0000000000..1b2f61d94c --- /dev/null +++ b/VectoCore/Models/SimulationComponent/ICombustionEngineIdleController.cs @@ -0,0 +1,10 @@ +using TUGraz.VectoCore.Models.Connector.Ports; +using TUGraz.VectoCore.Models.SimulationComponent.Impl; + +namespace TUGraz.VectoCore.Models.SimulationComponent +{ + public interface ICombustionEngineIdleController : ITnOutPort + { + void SetRequestPort(ITnOutPort tnOutPort); + } +} \ No newline at end of file diff --git a/VectoCore/Models/SimulationComponent/Impl/Brakes.cs b/VectoCore/Models/SimulationComponent/Impl/Brakes.cs index d37861b0e3..acaba8dbfc 100644 --- a/VectoCore/Models/SimulationComponent/Impl/Brakes.cs +++ b/VectoCore/Models/SimulationComponent/Impl/Brakes.cs @@ -34,7 +34,7 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl if (angularVelocity.IsEqual(0)) { BreakTorque = torque; } else { - BreakTorque = Formulas.PowerToTorque(BreakPower, angularVelocity); + BreakTorque = BreakPower / angularVelocity; } } if (!dryRun && BreakPower < 0) { diff --git a/VectoCore/Models/SimulationComponent/Impl/Clutch.cs b/VectoCore/Models/SimulationComponent/Impl/Clutch.cs index 364cc85f2a..14661335e7 100644 --- a/VectoCore/Models/SimulationComponent/Impl/Clutch.cs +++ b/VectoCore/Models/SimulationComponent/Impl/Clutch.cs @@ -17,12 +17,16 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl private const double ClutchEff = 1; private ClutchState _clutchState = SimulationComponent.ClutchState.ClutchSlipping; + protected ICombustionEngineIdleController IdleController; - public Clutch(IVehicleContainer cockpit, CombustionEngineData engineData) + + public Clutch(IVehicleContainer cockpit, CombustionEngineData engineData, + ICombustionEngineIdleController idleController) : base(cockpit) { _idleSpeed = engineData.IdleSpeed; _ratedSpeed = engineData.FullLoadCurve.RatedSpeed; + IdleController = idleController; } public ClutchState State() @@ -56,7 +60,8 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl public IResponse Request(Second absTime, Second dt, NewtonMeter torque, PerSecond angularVelocity, bool dryRun = false) { if (angularVelocity == null) { - var retval = NextComponent.Request(absTime, dt, torque, null, dryRun); + //var retval = NextComponent.Request(absTime, dt, torque, null, dryRun); + var retval = IdleController.Request(absTime, dt, torque, null, dryRun); retval.ClutchPowerRequest = 0.SI<Watt>(); return retval; } diff --git a/VectoCore/Models/SimulationComponent/Impl/CombustionEngine.cs b/VectoCore/Models/SimulationComponent/Impl/CombustionEngine.cs index e6860d90d8..f9e1ef2027 100644 --- a/VectoCore/Models/SimulationComponent/Impl/CombustionEngine.cs +++ b/VectoCore/Models/SimulationComponent/Impl/CombustionEngine.cs @@ -79,6 +79,13 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl get { return Data.FullLoadCurve.RatedSpeed; } } + public ICombustionEngineIdleController GetIdleController() + { + return IdleController ?? new CombustionEngineIdleController(this); + } + + protected CombustionEngineIdleController IdleController { get; set; } + #endregion #region ITnOutProvider @@ -450,6 +457,32 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl #endregion - public class CombustionEngineIdleController {} + protected class CombustionEngineIdleController : ICombustionEngineIdleController + { + protected CombustionEngine Engine; + + protected ITnOutPort OutPort; + + public CombustionEngineIdleController(CombustionEngine combustionEngine) + { + Engine = combustionEngine; + } + + public void SetRequestPort(ITnOutPort tnOutPort) + { + OutPort = tnOutPort; + } + + public IResponse Request(Second absTime, Second dt, NewtonMeter torque, PerSecond angularVelocity, + bool dryRun = false) + { + throw new NotImplementedException(); + } + + public IResponse Initialize(NewtonMeter torque, PerSecond angularVelocity) + { + return new ResponseSuccess() { Source = this }; + } + } } } \ No newline at end of file diff --git a/VectoCore/VectoCore.csproj b/VectoCore/VectoCore.csproj index 2505b4398f..cdc012fe68 100644 --- a/VectoCore/VectoCore.csproj +++ b/VectoCore/VectoCore.csproj @@ -155,6 +155,7 @@ <Compile Include="Models\SimulationComponent\Data\GearboxType.cs" /> <Compile Include="Models\SimulationComponent\IAuxiliary.cs" /> <Compile Include="Models\SimulationComponent\IBrakes.cs" /> + <Compile Include="Models\SimulationComponent\ICombustionEngineIdleController.cs" /> <Compile Include="Models\SimulationComponent\IDriverActions.cs" /> <Compile Include="Models\SimulationComponent\IDriverStrategy.cs" /> <Compile Include="Models\SimulationComponent\IDrivingCycleInfo.cs" /> diff --git a/VectoCoreTest/Integration/CoachPowerTrain.cs b/VectoCoreTest/Integration/CoachPowerTrain.cs index 24a7ef13c7..003829bcd2 100644 --- a/VectoCoreTest/Integration/CoachPowerTrain.cs +++ b/VectoCoreTest/Integration/CoachPowerTrain.cs @@ -48,6 +48,7 @@ namespace TUGraz.VectoCore.Tests.Integration var vehicleData = CreateVehicleData(3300.SI<Kilogram>()); var driverData = CreateDriverData(AccelerationFile); + var engine = new CombustionEngine(container, engineData); var cycle = new DistanceBasedDrivingCycle(container, cycleData); dynamic tmp = Port.AddComponent(cycle, new Driver(container, driverData, new DefaultDriverStrategy())); tmp = Port.AddComponent(tmp, new Vehicle(container, vehicleData)); @@ -55,14 +56,14 @@ namespace TUGraz.VectoCore.Tests.Integration tmp = Port.AddComponent(tmp, new Brakes(container)); tmp = Port.AddComponent(tmp, new AxleGear(container, axleGearData)); tmp = Port.AddComponent(tmp, new Gearbox(container, gearboxData, new AMTShiftStrategy(gearboxData, container))); - tmp = Port.AddComponent(tmp, new Clutch(container, engineData)); + tmp = Port.AddComponent(tmp, new Clutch(container, engineData, engine.GetIdleController())); var aux = new Auxiliary(container); aux.AddConstant("", 0.SI<Watt>()); tmp = Port.AddComponent(tmp, aux); - Port.AddComponent(tmp, new CombustionEngine(container, engineData)); + Port.AddComponent(tmp, engine); return container; } diff --git a/VectoCoreTest/Integration/EngineOnlyCycle/EngineOnlyCycleTest.cs b/VectoCoreTest/Integration/EngineOnlyCycle/EngineOnlyCycleTest.cs index 86d87d3484..751d0df538 100644 --- a/VectoCoreTest/Integration/EngineOnlyCycle/EngineOnlyCycleTest.cs +++ b/VectoCoreTest/Integration/EngineOnlyCycle/EngineOnlyCycleTest.cs @@ -82,7 +82,7 @@ namespace TUGraz.VectoCore.Tests.Integration.EngineOnlyCycle var angularVelocity = 644.4445.RPMtoRad(); var power = 2329.973.SI<Watt>(); - gearbox.OutPort().Request(absTime, dt, Formulas.PowerToTorque(power, angularVelocity), angularVelocity); + gearbox.OutPort().Request(absTime, dt, power / angularVelocity, angularVelocity); foreach (var sc in vehicleContainer.SimulationComponents()) { sc.CommitSimulationStep(dataWriter); diff --git a/VectoCoreTest/Integration/SimulationRuns/FullPowertrain.cs b/VectoCoreTest/Integration/SimulationRuns/FullPowertrain.cs index 8aa3661f5a..4784c93be4 100644 --- a/VectoCoreTest/Integration/SimulationRuns/FullPowertrain.cs +++ b/VectoCoreTest/Integration/SimulationRuns/FullPowertrain.cs @@ -58,8 +58,9 @@ namespace TUGraz.VectoCore.Tests.Integration.SimulationRuns tmp = Port.AddComponent(tmp, new AxleGear(container, axleGearData)); var gbx = new Gearbox(container, gearboxData, new AMTShiftStrategy(gearboxData, container)); tmp = Port.AddComponent(tmp, gbx); - tmp = Port.AddComponent(tmp, new Clutch(container, engineData)); - Port.AddComponent(tmp, new CombustionEngine(container, engineData)); + var engine = new CombustionEngine(container, engineData); + tmp = Port.AddComponent(tmp, new Clutch(container, engineData, engine.GetIdleController())); + Port.AddComponent(tmp, engine); cyclePort.Initialize(); @@ -114,8 +115,9 @@ namespace TUGraz.VectoCore.Tests.Integration.SimulationRuns tmp = Port.AddComponent(tmp, new AxleGear(container, axleGearData)); var gbx = new Gearbox(container, gearboxData, new AMTShiftStrategy(gearboxData, container)); tmp = Port.AddComponent(tmp, gbx); - tmp = Port.AddComponent(tmp, new Clutch(container, engineData)); - Port.AddComponent(tmp, new CombustionEngine(container, engineData)); + var engine = new CombustionEngine(container, engineData); + tmp = Port.AddComponent(tmp, new Clutch(container, engineData, engine.GetIdleController())); + Port.AddComponent(tmp, engine); cyclePort.Initialize(); @@ -186,8 +188,9 @@ namespace TUGraz.VectoCore.Tests.Integration.SimulationRuns tmp = Port.AddComponent(tmp, new Brakes(container)); tmp = Port.AddComponent(tmp, new AxleGear(container, axleGearData)); tmp = Port.AddComponent(tmp, new Gearbox(container, gearboxData, new AMTShiftStrategy(gearboxData, container))); - tmp = Port.AddComponent(tmp, new Clutch(container, engineData)); - Port.AddComponent(tmp, new CombustionEngine(container, engineData)); + var engine = new CombustionEngine(container, engineData); + tmp = Port.AddComponent(tmp, new Clutch(container, engineData, engine.GetIdleController())); + Port.AddComponent(tmp, engine); cyclePort.Initialize(); diff --git a/VectoCoreTest/Integration/SimulationRuns/MinimalPowertrain.cs b/VectoCoreTest/Integration/SimulationRuns/MinimalPowertrain.cs index e2f6627baf..b59165ec3e 100644 --- a/VectoCoreTest/Integration/SimulationRuns/MinimalPowertrain.cs +++ b/VectoCoreTest/Integration/SimulationRuns/MinimalPowertrain.cs @@ -53,8 +53,8 @@ namespace TUGraz.VectoCore.Tests.Integration.SimulationRuns tmp = Port.AddComponent(tmp, new Wheels(vehicleContainer, vehicleData.DynamicTyreRadius)); tmp = Port.AddComponent(tmp, new AxleGear(vehicleContainer, axleGearData)); - tmp = Port.AddComponent(tmp, new Clutch(vehicleContainer, engineData)); var engine = new CombustionEngine(vehicleContainer, engineData); + tmp = Port.AddComponent(tmp, new Clutch(vehicleContainer, engineData, engine.GetIdleController())); Port.AddComponent(tmp, engine); var gbx = new MockGearbox(vehicleContainer); @@ -104,8 +104,9 @@ namespace TUGraz.VectoCore.Tests.Integration.SimulationRuns tmp = Port.AddComponent(tmp, new Wheels(vehicleContainer, vehicleData.DynamicTyreRadius)); tmp = Port.AddComponent(tmp, new Brakes(vehicleContainer)); tmp = Port.AddComponent(tmp, new AxleGear(vehicleContainer, axleGearData)); - tmp = Port.AddComponent(tmp, new Clutch(vehicleContainer, engineData)); - Port.AddComponent(tmp, new CombustionEngine(vehicleContainer, engineData)); + var engine = new CombustionEngine(vehicleContainer, engineData); + tmp = Port.AddComponent(tmp, new Clutch(vehicleContainer, engineData, engine.GetIdleController())); + Port.AddComponent(tmp, engine); var gbx = new MockGearbox(vehicleContainer); @@ -173,8 +174,9 @@ namespace TUGraz.VectoCore.Tests.Integration.SimulationRuns tmp = Port.AddComponent(tmp, new Wheels(vehicleContainer, vehicleData.DynamicTyreRadius)); tmp = Port.AddComponent(tmp, new Brakes(vehicleContainer)); tmp = Port.AddComponent(tmp, new AxleGear(vehicleContainer, axleGearData)); - tmp = Port.AddComponent(tmp, new Clutch(vehicleContainer, engineData)); - Port.AddComponent(tmp, new CombustionEngine(vehicleContainer, engineData)); + var engine = new CombustionEngine(vehicleContainer, engineData); + tmp = Port.AddComponent(tmp, new Clutch(vehicleContainer, engineData, engine.GetIdleController())); + Port.AddComponent(tmp, engine); var gbx = new MockGearbox(vehicleContainer); diff --git a/VectoCoreTest/Integration/Truck40tPowerTrain.cs b/VectoCoreTest/Integration/Truck40tPowerTrain.cs index a84ce2cfbf..d0cf2c748b 100644 --- a/VectoCoreTest/Integration/Truck40tPowerTrain.cs +++ b/VectoCoreTest/Integration/Truck40tPowerTrain.cs @@ -55,6 +55,7 @@ namespace TUGraz.VectoCore.Tests.Integration var vehicleData = CreateVehicleData(massExtra, loading); var driverData = CreateDriverData(AccelerationFile); + var engine = new CombustionEngine(container, engineData); var cycle = new DistanceBasedDrivingCycle(container, cycleData); dynamic tmp = Port.AddComponent(cycle, new Driver(container, driverData, new DefaultDriverStrategy())); tmp = Port.AddComponent(tmp, new Vehicle(container, vehicleData)); @@ -62,14 +63,16 @@ namespace TUGraz.VectoCore.Tests.Integration tmp = Port.AddComponent(tmp, new Brakes(container)); tmp = Port.AddComponent(tmp, new AxleGear(container, axleGearData)); tmp = Port.AddComponent(tmp, new Gearbox(container, gearboxData, new AMTShiftStrategy(gearboxData, container))); - tmp = Port.AddComponent(tmp, new Clutch(container, engineData)); + var clutch = new Clutch(container, engineData, engine.GetIdleController()); + engine.GetIdleController().SetRequestPort(clutch); + tmp = Port.AddComponent(tmp, clutch); var aux = new Auxiliary(container); aux.AddConstant("", 0.SI<Watt>()); tmp = Port.AddComponent(tmp, aux); - Port.AddComponent(tmp, new CombustionEngine(container, engineData)); + Port.AddComponent(tmp, engine); return container; } diff --git a/VectoCoreTest/Models/Simulation/DrivingCycleTests.cs b/VectoCoreTest/Models/Simulation/DrivingCycleTests.cs index 096a973318..2409282395 100644 --- a/VectoCoreTest/Models/Simulation/DrivingCycleTests.cs +++ b/VectoCoreTest/Models/Simulation/DrivingCycleTests.cs @@ -74,7 +74,7 @@ namespace TUGraz.VectoCore.Tests.Models.Simulation Assert.AreEqual(absTime, outPort.AbsTime); Assert.AreEqual(dt, outPort.Dt); Assert.AreEqual(743.2361.RPMtoRad(), outPort.AngularVelocity); - Assert.AreEqual(Formulas.PowerToTorque(2779.576.SI<Watt>(), 743.2361.RPMtoRad()), outPort.Torque); + Assert.AreEqual(2779.576.SI<Watt>() / 743.2361.RPMtoRad(), outPort.Torque); // ======================== @@ -95,7 +95,7 @@ namespace TUGraz.VectoCore.Tests.Models.Simulation Assert.AreEqual(absTime, outPort.AbsTime); Assert.AreEqual(dt, outPort.Dt); Assert.AreEqual(1584.731.RPMtoRad(), outPort.AngularVelocity); - Assert.AreEqual(Formulas.PowerToTorque(3380.548.SI<Watt>(), 1584.731.RPMtoRad()), outPort.Torque); + Assert.AreEqual(3380.548.SI<Watt>() / 1584.731.RPMtoRad(), outPort.Torque); absTime += dt; } diff --git a/VectoCoreTest/Models/SimulationComponent/ClutchTest.cs b/VectoCoreTest/Models/SimulationComponent/ClutchTest.cs index bc726dae75..88877f8ffa 100644 --- a/VectoCoreTest/Models/SimulationComponent/ClutchTest.cs +++ b/VectoCoreTest/Models/SimulationComponent/ClutchTest.cs @@ -22,7 +22,7 @@ namespace TUGraz.VectoCore.Tests.Models.SimulationComponent var engineData = EngineeringModeSimulationDataReader.CreateEngineDataFromFile(CoachEngine); var gearbox = new MockGearbox(container); - var clutch = new Clutch(container, engineData); + var clutch = new Clutch(container, engineData, null); var inPort = clutch.InPort(); var outPort = new MockTnOutPort(); diff --git a/VectoCoreTest/Models/SimulationComponent/CombustionEngineTest.cs b/VectoCoreTest/Models/SimulationComponent/CombustionEngineTest.cs index 1127b0d6a8..671e92727f 100644 --- a/VectoCoreTest/Models/SimulationComponent/CombustionEngineTest.cs +++ b/VectoCoreTest/Models/SimulationComponent/CombustionEngineTest.cs @@ -206,7 +206,7 @@ namespace TUGraz.VectoCore.Tests.Models.SimulationComponent var engineData = EngineeringModeSimulationDataReader.CreateEngineDataFromFile(CoachEngine); var engine = new CombustionEngine(container, engineData); - var clutch = new Clutch(container, engineData); + var clutch = new Clutch(container, engineData, engine.GetIdleController()); var driver = new MockDriver(container); diff --git a/VectoCoreTest/Models/SimulationComponent/DriverTest.cs b/VectoCoreTest/Models/SimulationComponent/DriverTest.cs index 204c9bfed6..0857517930 100644 --- a/VectoCoreTest/Models/SimulationComponent/DriverTest.cs +++ b/VectoCoreTest/Models/SimulationComponent/DriverTest.cs @@ -50,7 +50,7 @@ namespace TUGraz.VectoCore.Tests.Models.SimulationComponent dynamic tmp = AddComponent(driver, new Vehicle(vehicleContainer, vehicleData)); tmp = AddComponent(tmp, new Wheels(vehicleContainer, vehicleData.DynamicTyreRadius)); - tmp = AddComponent(tmp, new Clutch(vehicleContainer, engineData)); + tmp = AddComponent(tmp, new Clutch(vehicleContainer, engineData, engine.GetIdleController())); AddComponent(tmp, engine); var gbx = new MockGearbox(vehicleContainer) { Gear = 1 }; @@ -105,7 +105,7 @@ namespace TUGraz.VectoCore.Tests.Models.SimulationComponent dynamic tmp = AddComponent(driver, new Vehicle(vehicleContainer, vehicleData)); tmp = AddComponent(tmp, new Wheels(vehicleContainer, vehicleData.DynamicTyreRadius)); - tmp = AddComponent(tmp, new Clutch(vehicleContainer, engineData)); + tmp = AddComponent(tmp, new Clutch(vehicleContainer, engineData, engine.GetIdleController())); AddComponent(tmp, engine); var gbx = new MockGearbox(vehicleContainer); @@ -163,8 +163,9 @@ namespace TUGraz.VectoCore.Tests.Models.SimulationComponent dynamic tmp = AddComponent(driver, new Vehicle(vehicleContainer, vehicleData)); tmp = AddComponent(tmp, new Wheels(vehicleContainer, vehicleData.DynamicTyreRadius)); - tmp = AddComponent(tmp, new Clutch(vehicleContainer, engineData)); - AddComponent(tmp, new CombustionEngine(vehicleContainer, engineData)); + var engine = new CombustionEngine(vehicleContainer, engineData); + tmp = AddComponent(tmp, new Clutch(vehicleContainer, engineData, engine.GetIdleController())); + AddComponent(tmp, engine); var gbx = new MockGearbox(vehicleContainer); -- GitLab