diff --git a/VectoCore/Models/Simulation/Impl/PowertrainBuilder.cs b/VectoCore/Models/Simulation/Impl/PowertrainBuilder.cs index 052aaf2825af0bc00d62478132e6c7ddfcea99e6..f3832255fbb093c9d13a5998c8bfb3109a000f06 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 6626e33d7ec3b2e00aef279d8ee3e820bfcda90f..34b0eaf1c0731c025e6445259fb4e12dc41130fb 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 0000000000000000000000000000000000000000..1b2f61d94cf3a2203a9a97a6202a11396094c1ec --- /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 d37861b0e38e2d99950e0912e2008a38d299cf43..acaba8dbfcff514bf2c279d2b3d063064c664e39 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 364cc85f2a1c17bf83b64ec785a7ecc684c4c51c..14661335e7c93c7d45f5a101e23034d4a68b2076 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 e6860d90d8cfd6b1a7db30ae404cb0357c5ba4d6..f9e1ef202791d7a68e3eddbdf26cd3d00ae6b711 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 2505b4398f5cac850be9a3de0186db4cb98b2869..cdc012fe680190d06d7bcdee22dfc351594fed9f 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 24a7ef13c7fcaca364b26f79132c3072687993f9..003829bcd263553e47a2e77450cf3261518c0f1b 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 86d87d34843abb7259359d3f3d98cc87747a93f1..751d0df538444d9f95af24050889f3f50c47183b 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 8aa3661f5ab9744ac354cc6aa44368c3280f9a29..4784c93be460a336b49769e76c00ef394a1c2e3b 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 e2f6627baf744eba6b276c10b443ed2c73320770..b59165ec3e5743377933c0cba0bb8cdd90fee5ae 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 a84ce2cfbf9d1dab3d4564c897ff34ce2b65780d..d0cf2c748b7b9273fdaeae291970cf8e6db54d8e 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 096a973318fa03dface2330f564496d99e8abb98..24092823959b61078fb8bc8fbb229736a2c89463 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 bc726dae75fc21a0da603f167cedb48666442df3..88877f8ffa35350c357ff417891cc4367b3e1a4c 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 1127b0d6a83c60274652c5d66b0a11e44eff1dfd..671e92727f4e3923def0909dbcf827a1ae10782f 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 204c9bfed698e88a0e5cc65fe3e52104491a1a63..0857517930696ad307727a1e63f7dc2a93ae3990 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);