diff --git a/VectoCore/Models/SimulationComponent/Data/Gearbox/TransmissionLossMap.cs b/VectoCore/Models/SimulationComponent/Data/Gearbox/TransmissionLossMap.cs index bf5d161ea4c5fb284028a20291b0ad061292292b..485275c55719ecdf940a1f6f4e82b25c40767147 100644 --- a/VectoCore/Models/SimulationComponent/Data/Gearbox/TransmissionLossMap.cs +++ b/VectoCore/Models/SimulationComponent/Data/Gearbox/TransmissionLossMap.cs @@ -113,18 +113,17 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Data.Gearbox public NewtonMeter GearboxInTorque(PerSecond inAngularVelocity, NewtonMeter outTorque) { try { - var limitedAngularVelocity = VectoMath.Limit(inAngularVelocity, _minSpeed, _maxSpeed).Value(); - var limitedTorque = VectoMath.Limit(outTorque, _minTorque, _maxTorque).Value(); + //var limitedAngularVelocity = VectoMath.Limit(inAngularVelocity, _minSpeed, _maxSpeed).Value(); + //var limitedTorque = VectoMath.Limit(outTorque, _minTorque, _maxTorque).Value(); - var inTorque = _lossMap.Interpolate(limitedAngularVelocity, limitedTorque).SI<NewtonMeter>(); - Logger<TransmissionLossMap>().Debug("GearboxLoss: {0}", inTorque - outTorque); + var inTorque = _lossMap.Interpolate(inAngularVelocity.Value(), outTorque.Value()).SI<NewtonMeter>(); + Log.Debug("GearboxLoss: {0}", inTorque - outTorque); // Limit input torque to a maximum value without losses (just torque/ratio) return VectoMath.Max(inTorque, outTorque / _ratio); } catch (VectoException) { - Logger<TransmissionLossMap>() - .Error("Failed to interpolate in TransmissionLossMap. angularVelocity: {0}, torque: {1}", inAngularVelocity, - outTorque); + Log.Error("Failed to interpolate in TransmissionLossMap. angularVelocity: {0}, torque: {1}", inAngularVelocity, + outTorque); return outTorque / _ratio; } } diff --git a/VectoCore/Models/SimulationComponent/Impl/Gearbox.cs b/VectoCore/Models/SimulationComponent/Impl/Gearbox.cs index f5bc39507a083b24f868d8ae664284e4d88084d4..36330009a794f80bba8673f91ddfdf72df3985c8 100644 --- a/VectoCore/Models/SimulationComponent/Impl/Gearbox.cs +++ b/VectoCore/Models/SimulationComponent/Impl/Gearbox.cs @@ -229,25 +229,22 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl Log.Debug("Gearbox engaged gear {0}", Gear); } - PerSecond inEngineSpeed; + var inEngineSpeed = outEngineSpeed * Data.Gears[Gear].Ratio; NewtonMeter inTorque; if (outEngineSpeed.IsEqual(0)) { - inEngineSpeed = outEngineSpeed; - inTorque = outTorque; + inTorque = outTorque / Data.Gears[Gear].Ratio; } else { - inEngineSpeed = outEngineSpeed * Data.Gears[Gear].Ratio; inTorque = Data.Gears[Gear].LossMap.GearboxInTorque(inEngineSpeed, outTorque); - - _powerLoss = inTorque * inEngineSpeed - outTorque * outEngineSpeed; - var torqueLossInertia = !inEngineSpeed.IsEqual(0) - ? Formulas.InertiaPower(inEngineSpeed, _previousInEnginespeed, Data.Inertia, dt) / inEngineSpeed - : 0.SI<NewtonMeter>(); - - _previousInEnginespeed = inEngineSpeed; - inTorque += torqueLossInertia; - _powerLossInertia = torqueLossInertia * inEngineSpeed; } + _powerLoss = inTorque * inEngineSpeed - outTorque * outEngineSpeed; + var torqueLossInertia = !inEngineSpeed.IsEqual(0) + ? Formulas.InertiaPower(inEngineSpeed, _previousInEnginespeed, Data.Inertia, dt) / inEngineSpeed + : 0.SI<NewtonMeter>(); + + _previousInEnginespeed = inEngineSpeed; + inTorque += torqueLossInertia; + _powerLossInertia = torqueLossInertia * inEngineSpeed; if (dryRun) { var dryRunResponse = NextComponent.Request(absTime, dt, inTorque, inEngineSpeed, true); diff --git a/VectoCoreTest/Models/SimulationComponent/GearboxTest.cs b/VectoCoreTest/Models/SimulationComponent/GearboxTest.cs index 425a5e65f3445efd74f265ca095a7b00075c86a2..8eda6598709f67801ee0453d402b086ff4daafb9 100644 --- a/VectoCoreTest/Models/SimulationComponent/GearboxTest.cs +++ b/VectoCoreTest/Models/SimulationComponent/GearboxTest.cs @@ -198,26 +198,24 @@ namespace TUGraz.VectoCore.Tests.Models.SimulationComponent // the first element 0.0 is just a placeholder for axlegear, not used in this test var expected = new[] { - new { gear = 1, t = -1000, n = 800, loss = 29.108, responseType = typeof(ResponseSuccess) }, - new { gear = 2, t = -1000, n = 800, loss = 29.108, responseType = typeof(ResponseSuccess) }, - new { gear = 7, t = -1000, n = 1200, loss = 16.132, responseType = typeof(ResponseSuccess) }, - new { gear = 7, t = 850, n = 1200, loss = 15.382, responseType = typeof(ResponseSuccess) }, - new { gear = 7, t = 2450, n = 1200, loss = 23.382, responseType = typeof(ResponseSuccess) }, - new { gear = 1, t = 50, n = 800, loss = 10.108, responseType = typeof(ResponseSuccess) }, + new { gear = 1, t = -1000, n = 600, loss = 28.096, responseType = typeof(ResponseSuccess) }, + new { gear = 2, t = -1000, n = 600, loss = 28.096, responseType = typeof(ResponseSuccess) }, + new { gear = 7, t = -1000, n = 600, loss = 13.096, responseType = typeof(ResponseSuccess) }, + new { gear = 7, t = 850, n = 600, loss = 12.346, responseType = typeof(ResponseSuccess) }, + new { gear = 7, t = 2050, n = 1200, loss = 21.382, responseType = typeof(ResponseSuccess) }, + new { gear = 1, t = 50, n = 600, loss = 9.096, responseType = typeof(ResponseSuccess) }, new { gear = 1, t = 2450, n = 800, loss = 58.11, responseType = typeof(ResponseSuccess) }, new { gear = 1, t = 850, n = 800, loss = 26.11, responseType = typeof(ResponseSuccess) }, - new { gear = 1, t = 850, n = 0, loss = 22.06, responseType = typeof(ResponseSuccess) }, + new { gear = 1, t = 850, n = 0, loss = 0.0, responseType = typeof(ResponseSuccess) }, new { gear = 1, t = 850, n = 200, loss = 23.07, responseType = typeof(ResponseSuccess) }, - new { gear = 2, t = 50, n = 800, loss = 10.108, responseType = typeof(ResponseSuccess) }, - new { gear = 2, t = 2450, n = 800, loss = 58.11, responseType = typeof(ResponseGearShift) }, + new { gear = 2, t = 50, n = 600, loss = 9.096, responseType = typeof(ResponseSuccess) }, + new { gear = 2, t = 2050, n = 1200, loss = 52.132, responseType = typeof(ResponseSuccess) }, new { gear = 2, t = 850, n = 800, loss = 26.11, responseType = typeof(ResponseSuccess) }, - new { gear = 2, t = 850, n = 0, loss = 22.06, responseType = typeof(ResponseGearShift) }, - new { gear = 2, t = 850, n = 400, loss = 11.334, responseType = typeof(ResponseGearShift) }, - new { gear = 2, t = 850, n = 2000, loss = 32.18, responseType = typeof(ResponseGearShift) }, - new { gear = 7, t = -1000, n = 0, loss = 10.06, responseType = typeof(ResponseGearShift) }, - new { gear = 7, t = 850, n = 0, loss = 9.31, responseType = typeof(ResponseGearShift) }, - new { gear = 7, t = 850, n = 2000, loss = 19.43, responseType = typeof(ResponseGearShift) }, - new { gear = 7, t = 2450, n = 0, loss = 17.31, responseType = typeof(ResponseGearShift) }, + new { gear = 2, t = 850, n = 0, loss = 0.0, responseType = typeof(ResponseSuccess) }, + new { gear = 2, t = 850, n = 600, loss = 25.096, responseType = typeof(ResponseSuccess) }, + new { gear = 7, t = -1000, n = 0, loss = 0.0, responseType = typeof(ResponseSuccess) }, + new { gear = 7, t = 850, n = 0, loss = 0.0, responseType = typeof(ResponseSuccess) }, + new { gear = 7, t = 2450, n = 0, loss = 0.0, responseType = typeof(ResponseSuccess) }, }; var absTime = 0.SI<Second>(); diff --git a/VectoCoreTest/Utils/MockPorts.cs b/VectoCoreTest/Utils/MockPorts.cs index 769dc3d286afc443bce80a473f8b617993cb76d7..94eccca59ea5675b0614027b6e7928f9864ec470 100644 --- a/VectoCoreTest/Utils/MockPorts.cs +++ b/VectoCoreTest/Utils/MockPorts.cs @@ -29,8 +29,8 @@ namespace TUGraz.VectoCore.Tests.Utils Source = this, GearboxPowerRequest = torque * angularVelocity, EnginePowerRequest = torque * angularVelocity, - DeltaFullLoad = -100000.SI<Watt>(), - DeltaDragLoad = -500.SI<Watt>() + DeltaFullLoad = (torque - 2300.SI<NewtonMeter>()) * angularVelocity, + DeltaDragLoad = (torque - -100.SI<NewtonMeter>()) * angularVelocity }; }