From 110fd67cdbf26b2f0a40cfcb79c713217110a747 Mon Sep 17 00:00:00 2001 From: Markus Quaritsch <markus.quaritsch@tugraz.at> Date: Fri, 19 Feb 2016 12:37:11 +0100 Subject: [PATCH] gearbox: after engaging clutch: compute avgerage in-angular speed from out-angular speed; inertia torque loss relates to output velocity --- .../SimulationComponent/Impl/Gearbox.cs | 55 ++++++++++--------- 1 file changed, 30 insertions(+), 25 deletions(-) diff --git a/VectoCore/Models/SimulationComponent/Impl/Gearbox.cs b/VectoCore/Models/SimulationComponent/Impl/Gearbox.cs index 7a3ab4b991..32b3a9bac2 100644 --- a/VectoCore/Models/SimulationComponent/Impl/Gearbox.cs +++ b/VectoCore/Models/SimulationComponent/Impl/Gearbox.cs @@ -139,7 +139,8 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl inTorque += torqueLossInertia; PreviousState.SetState(inTorque, inAngularVelocity, outTorque, outAngularVelocity); - PreviousState.InertiaTorqueLoss = 0.SI<NewtonMeter>(); + PreviousState.InertiaTorqueLossOut = 0.SI<NewtonMeter>(); + PreviousState.Gear = Gear; var response = NextComponent.Initialize(inTorque, inAngularVelocity); if (response is ResponseSuccess) { @@ -265,10 +266,13 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl }; } - CurrentState.SetState(0.SI<NewtonMeter>(), null, outTorque, outAngularVelocity); + CurrentState.SetState(0.SI<NewtonMeter>(), outAngularVelocity * ModelData.Gears[PreviousState.Gear].Ratio, outTorque, + outAngularVelocity); + CurrentState.Gear = PreviousState.Gear; var response = NextComponent.Request(absTime, dt, 0.SI<NewtonMeter>(), null); response.GearboxPowerRequest = outTorque * avgAngularVelocity; + //CurrentState.InAngularVelocity = ; return response; } @@ -297,12 +301,10 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl Log.Debug("Gearbox engaged gear {0}", Gear); } + var avgOutAngularVelocity = (PreviousState.OutAngularVelocity + outAngularVelocity) / 2.0; + var inTorque = ModelData.Gears[Gear].LossMap.GetInTorque(avgOutAngularVelocity * ModelData.Gears[Gear].Ratio, + outTorque); var inAngularVelocity = outAngularVelocity * ModelData.Gears[Gear].Ratio; - var avgInAngularVelocity = ((PreviousState.InAngularVelocity ?? - PreviousState.OutAngularVelocity * ModelData.Gears[Gear].Ratio) + inAngularVelocity) / 2.0; - var inTorque = ModelData.Gears[Gear].LossMap.GetInTorque(avgInAngularVelocity, outTorque); - - CurrentState.TransmissionTorqueLoss = inTorque - (outTorque / ModelData.Gears[Gear].Ratio); if (dryRun) { if ((DataBus.DrivingBehavior == DrivingBehavior.Braking || DataBus.DrivingBehavior == DrivingBehavior.Coasting) && @@ -343,20 +345,21 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl } } - //_powerLoss = outTorqueWithTransmissionLosses * inEngineSpeed - outTorque * outAngularVelocity; - + // 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!) + CurrentState.TransmissionTorqueLoss = inTorque - (outTorque / ModelData.Gears[Gear].Ratio); if (!inAngularVelocity.IsEqual(0)) { - CurrentState.InertiaTorqueLoss = - Formulas.InertiaPower(inAngularVelocity, - PreviousState.InAngularVelocity ?? PreviousState.OutAngularVelocity * ModelData.Gears[Gear].Ratio, - ModelData.Inertia, dt) / - avgInAngularVelocity; - inTorque += CurrentState.InertiaTorqueLoss; + // MQ 19.2.2016: check! inertia is related to output side, torque loss accounts to input side + CurrentState.InertiaTorqueLossOut = + Formulas.InertiaPower(outAngularVelocity, PreviousState.OutAngularVelocity, ModelData.Inertia, dt) / + avgOutAngularVelocity; + inTorque += CurrentState.InertiaTorqueLossOut / ModelData.Gears[Gear].Ratio; } else { - CurrentState.InertiaTorqueLoss = 0.SI<NewtonMeter>(); + CurrentState.InertiaTorqueLossOut = 0.SI<NewtonMeter>(); } - CurrentState.SetState(inTorque, inAngularVelocity, outTorque, outAngularVelocity); + CurrentState.Gear = Gear; + // end criticla section var response = NextComponent.Request(absTime, dt, inTorque, inAngularVelocity); response.GearboxPowerRequest = outTorque * (PreviousState.OutAngularVelocity + CurrentState.OutAngularVelocity) / 2.0; @@ -379,15 +382,16 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl protected override void DoWriteModalResults(IModalDataContainer container) { - var avgAngularSpeed = 0.SI<PerSecond>(); - if (PreviousState.InAngularVelocity != null && CurrentState.InAngularVelocity != null) { - avgAngularSpeed = (PreviousState.InAngularVelocity + CurrentState.InAngularVelocity) / 2.0; - } + //var avgAngularSpeed = ((PreviousState.InAngularVelocity * ModelData.Gears[CurrentState.Gear].Ratio / + // ModelData.Gears[PreviousState.Gear].Ratio) + + // CurrentState.InAngularVelocity) / 2.0; + var avgInAngularSpeed = (PreviousState.OutAngularVelocity + + CurrentState.OutAngularVelocity) / 2.0 * ModelData.Gears[Gear].Ratio; container[ModalResultField.Gear] = Disengaged || DataBus.VehicleStopped ? 0 : Gear; - container[ModalResultField.P_gbx_loss] = CurrentState.TransmissionTorqueLoss * avgAngularSpeed; - container[ModalResultField.P_gbx_inertia] = CurrentState.InertiaTorqueLoss * avgAngularSpeed; - container[ModalResultField.P_gbx_in] = CurrentState.InTorque * avgAngularSpeed; + container[ModalResultField.P_gbx_loss] = CurrentState.TransmissionTorqueLoss * avgInAngularSpeed; + container[ModalResultField.P_gbx_inertia] = CurrentState.InertiaTorqueLossOut * avgInAngularSpeed; + container[ModalResultField.P_gbx_in] = CurrentState.InTorque * avgInAngularSpeed; } protected override void DoCommitSimulationStep() @@ -411,8 +415,9 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl public class GearboxState : SimpleComponentState { - public NewtonMeter InertiaTorqueLoss = 0.SI<NewtonMeter>(); + public NewtonMeter InertiaTorqueLossOut = 0.SI<NewtonMeter>(); public NewtonMeter TransmissionTorqueLoss = 0.SI<NewtonMeter>(); + public uint Gear; } } } \ No newline at end of file -- GitLab