From 4c12bf2321b7082dffc5fa8ceacb8458e68ee07b Mon Sep 17 00:00:00 2001 From: Markus Quaritsch <markus.quaritsch@tugraz.at> Date: Fri, 10 Feb 2017 14:00:16 +0100 Subject: [PATCH] gearbox: when disengaged search operating point for gbx-in torque = 0; compute gbx losses as diff gbx-in - gbx-out --- .../SimulationComponent/Impl/Gearbox.cs | 64 ++++++++++++------- 1 file changed, 42 insertions(+), 22 deletions(-) diff --git a/VectoCore/VectoCore/Models/SimulationComponent/Impl/Gearbox.cs b/VectoCore/VectoCore/Models/SimulationComponent/Impl/Gearbox.cs index 859fa60998..dd4ec29a5c 100644 --- a/VectoCore/VectoCore/Models/SimulationComponent/Impl/Gearbox.cs +++ b/VectoCore/VectoCore/Models/SimulationComponent/Impl/Gearbox.cs @@ -64,8 +64,7 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl public Second LastDownshift { get; private set; } - public override GearInfo NextGear - { + public override GearInfo NextGear { get { return _strategy.NextGear; } } @@ -221,13 +220,27 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl var avgAngularVelocity = (PreviousState.OutAngularVelocity + outAngularVelocity) / 2.0; + var gear = NextGear.Gear; + + var avgOutAngularVelocity = (PreviousState.OutAngularVelocity + outAngularVelocity) / 2.0; + var inTorqueLossResult = ModelData.Gears[gear].LossMap.GetTorqueLoss(avgOutAngularVelocity, outTorque); + var inTorque = outTorque / ModelData.Gears[gear].Ratio + inTorqueLossResult.Value; + + var inAngularVelocity = outAngularVelocity * ModelData.Gears[gear].Ratio; + var inertiaTorqueLossOut = !inAngularVelocity.IsEqual(0) + ? Formulas.InertiaPower(outAngularVelocity, PreviousState.OutAngularVelocity, ModelData.Inertia, dt) / + avgOutAngularVelocity + : 0.SI<NewtonMeter>(); + inTorque += inertiaTorqueLossOut / ModelData.Gears[gear].Ratio; + var avgInAngularVelocity = (PreviousState.InAngularVelocity + inAngularVelocity) / 2.0; + if (dryRun) { // if gearbox is disengaged the 0[W]-line is the limit for drag and full load. return new ResponseDryRun { Source = this, - GearboxPowerRequest = outTorque * avgAngularVelocity, - DeltaDragLoad = outTorque * avgAngularVelocity, - DeltaFullLoad = outTorque * avgAngularVelocity, + GearboxPowerRequest = inTorque * avgInAngularVelocity, + DeltaDragLoad = inTorque * avgInAngularVelocity, + DeltaFullLoad = inTorque * avgInAngularVelocity, }; } @@ -242,29 +255,33 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl }; } - if ((outTorque * avgAngularVelocity).IsGreater(0.SI<Watt>(), Constants.SimulationSettings.LineSearchTolerance)) { + if ((inTorque * avgInAngularVelocity).IsGreater(0.SI<Watt>(), Constants.SimulationSettings.LineSearchTolerance)) { return new ResponseOverload { Source = this, - Delta = outTorque * avgAngularVelocity, - GearboxPowerRequest = outTorque * avgAngularVelocity + Delta = inTorque * avgInAngularVelocity, + GearboxPowerRequest = inTorque * avgInAngularVelocity }; } - if ((outTorque * avgAngularVelocity).IsSmaller(0.SI<Watt>(), Constants.SimulationSettings.LineSearchTolerance)) { + if ((inTorque * avgInAngularVelocity).IsSmaller(0.SI<Watt>(), Constants.SimulationSettings.LineSearchTolerance)) { return new ResponseUnderload { Source = this, - Delta = outTorque * avgAngularVelocity, - GearboxPowerRequest = outTorque * avgAngularVelocity + Delta = inTorque * avgInAngularVelocity, + GearboxPowerRequest = inTorque * avgInAngularVelocity }; } - var inTorque = 0.SI<NewtonMeter>(); - var inAngularSpeed = outAngularVelocity * ModelData.Gears[NextGear.Gear].Ratio; - CurrentState.SetState(inTorque, inAngularSpeed, outTorque, + //var inTorque = 0.SI<NewtonMeter>(); + if (avgInAngularVelocity.Equals(0.SI<PerSecond>())) { + inTorque = 0.SI<NewtonMeter>(); + } + + CurrentState.SetState(inTorque, inAngularVelocity, outTorque, outAngularVelocity); - CurrentState.Gear = PreviousState.Gear; + CurrentState.Gear = gear; + CurrentState.TransmissionTorqueLoss = inTorque * ModelData.Gears[gear].Ratio - outTorque; - var response = NextComponent.Request(absTime, dt, inTorque, inAngularSpeed); + var response = NextComponent.Request(absTime, dt, 0.SI<NewtonMeter>(), inAngularVelocity); //CurrentState.InAngularVelocity = response.EngineSpeed; @@ -355,11 +372,11 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl // this code has to be _after_ the check for a potential gear-shift! // (the above block issues dry-run requests and thus may update the CurrentState!) // begin critical section - CurrentState.TransmissionTorqueLoss = inTorque - outTorque / ModelData.Gears[Gear].Ratio; + CurrentState.TransmissionTorqueLoss = inTorque * ModelData.Gears[Gear].Ratio - outTorque; // MQ 19.2.2016: check! inertia is related to output side, torque loss accounts to input side CurrentState.InertiaTorqueLossOut = inertiaTorqueLossOut; - CurrentState.TransmissionTorqueLoss = inTorque - outTorque / ModelData.Gears[Gear].Ratio; + CurrentState.TorqueLossResult = inTorqueLossResult; CurrentState.SetState(inTorque, inAngularVelocity, outTorque, outAngularVelocity); CurrentState.Gear = Gear; @@ -374,13 +391,16 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl protected override void DoWriteModalResults(IModalDataContainer container) { var avgInAngularSpeed = (PreviousState.InAngularVelocity + CurrentState.InAngularVelocity) / 2.0; + var avgOutAngularSpeed = (PreviousState.OutAngularVelocity + CurrentState.OutAngularVelocity) / 2.0; // (PreviousState.OutAngularVelocity + //CurrentState.OutAngularVelocity) / 2.0 * ModelData.Gears[Gear].Ratio; - + var inPower = CurrentState.InTorque * avgInAngularSpeed; + var outPower = CurrentState.OutTorque * avgOutAngularSpeed; container[ModalResultField.Gear] = Disengaged || DataBus.VehicleStopped ? 0 : Gear; - container[ModalResultField.P_gbx_loss] = CurrentState.TransmissionTorqueLoss * avgInAngularSpeed; - container[ModalResultField.P_gbx_inertia] = CurrentState.InertiaTorqueLossOut * avgInAngularSpeed; - container[ModalResultField.P_gbx_in] = CurrentState.InTorque * avgInAngularSpeed; + container[ModalResultField.P_gbx_loss] = inPower - outPower; + //CurrentState.TransmissionTorqueLoss * avgOutAngularSpeed; + container[ModalResultField.P_gbx_inertia] = CurrentState.InertiaTorqueLossOut * avgOutAngularSpeed; + container[ModalResultField.P_gbx_in] = inPower; container[ModalResultField.n_gbx_out_avg] = (PreviousState.OutAngularVelocity + CurrentState.OutAngularVelocity) / 2.0; container[ModalResultField.T_gbx_out] = CurrentState.OutTorque; -- GitLab