Skip to content

Commit 1c65f5c

Browse files
authored
Merge pull request #414 from peternewell/diesel-adhesion#2
Fix issues with adhesion resume
2 parents e1ec300 + 903c1a2 commit 1c65f5c

File tree

2 files changed

+29
-22
lines changed

2 files changed

+29
-22
lines changed

Source/Orts.Simulation/Simulation/RollingStocks/MSTSLocomotive.cs

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -424,6 +424,7 @@ public float OdometerM
424424
public Axle LocomotiveAxle;
425425
public IIRFilter CurrentFilter;
426426
public IIRFilter AdhesionFilter;
427+
public float SaveAdhesionFilter;
427428

428429
public float FilteredMotiveForceN;
429430

@@ -1110,6 +1111,7 @@ public override void Save(BinaryWriter outf)
11101111
outf.Write(ScoopIsBroken);
11111112
outf.Write(IsWaterScoopDown);
11121113
outf.Write(CurrentTrackSandBoxCapacityM3);
1114+
outf.Write(SaveAdhesionFilter);
11131115

11141116
base.Save(outf);
11151117

@@ -1137,7 +1139,7 @@ public override void Restore(BinaryReader inf)
11371139
VacuumExhausterIsOn = inf.ReadBoolean();
11381140
TrainBrakePipeLeakPSIorInHgpS = inf.ReadSingle();
11391141
AverageForceN = inf.ReadSingle();
1140-
LocomotiveAxle.Reset(Simulator.GameTime, inf.ReadSingle());
1142+
float axleSpeedMpS = inf.ReadSingle();
11411143
CabLightOn = inf.ReadBoolean();
11421144
UsingRearCab = inf.ReadBoolean();
11431145
CalculatedCarHeaterSteamUsageLBpS = inf.ReadSingle();
@@ -1154,13 +1156,18 @@ public override void Restore(BinaryReader inf)
11541156
ScoopIsBroken = inf.ReadBoolean();
11551157
IsWaterScoopDown = inf.ReadBoolean();
11561158
CurrentTrackSandBoxCapacityM3 = inf.ReadSingle();
1159+
1160+
SaveAdhesionFilter = inf.ReadSingle();
11571161

1158-
AdhesionFilter.Reset(0.5f);
1162+
AdhesionFilter.Reset(SaveAdhesionFilter);
11591163

11601164
base.Restore(inf);
11611165

11621166
TrainControlSystem.Restore(inf);
11631167
LocomotiveAxle = new Axle(inf);
1168+
MoveParamsToAxle();
1169+
LocomotiveAxle.FilterMovingAverage.Initialize(AverageForceN);
1170+
LocomotiveAxle.Reset(Simulator.GameTime, axleSpeedMpS);
11641171
}
11651172

11661173
public bool IsLeadLocomotive()
@@ -2796,7 +2803,8 @@ public virtual void UpdateFrictionCoefficient(float elapsedClockSeconds)
27962803
// Set adhesion conditions for diesel, electric or steam geared locomotives
27972804
if (elapsedClockSeconds > 0)
27982805
{
2799-
LocomotiveAxle.AdhesionConditions = AdhesionMultiplier * AdhesionFilter.Filter(BaseFrictionCoefficientFactor + AdhesionRandom, elapsedClockSeconds);
2806+
SaveAdhesionFilter = AdhesionFilter.Filter(BaseFrictionCoefficientFactor + AdhesionRandom, elapsedClockSeconds);
2807+
LocomotiveAxle.AdhesionConditions = AdhesionMultiplier * SaveAdhesionFilter;
28002808
LocomotiveAxle.AdhesionConditions = MathHelper.Clamp(LocomotiveAxle.AdhesionConditions, 0.05f, 2.5f); // Avoids NaNs in axle speed computing
28012809
}
28022810

Source/Orts.Simulation/Simulation/RollingStocks/SubSystems/PowerTransmissions/Axle.cs

Lines changed: 18 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -315,7 +315,7 @@ public float AdhesionK
315315
/// </summary>
316316
float axleSpeedMpS;
317317
/// <summary>
318-
/// Read only axle speed value, in metric meters per second
318+
/// Axle speed value, in metric meters per second
319319
/// </summary>
320320
public float AxleSpeedMpS
321321
{
@@ -342,10 +342,6 @@ public float AxleForceN
342342
{
343343
return axleForceN;
344344
}
345-
/*set
346-
{
347-
axleForceN = value;
348-
}*/
349345
}
350346

351347
/// <summary>
@@ -387,12 +383,12 @@ public float WheelSlipThresholdMpS
387383
{
388384
if (AdhesionK == 0.0f)
389385
AdhesionK = 1.0f;
390-
float A = 2.0f*AdhesionK*AdhesionConditions*AdhesionConditions;
391-
float B = AdhesionConditions*AdhesionConditions;
392-
float C = AdhesionK*AdhesionK;
393-
float a = -2.0f*A*B;
394-
float b = A*B;
395-
float c = A*C;
386+
float A = 2.0f * AdhesionK * AdhesionConditions * AdhesionConditions;
387+
float B = AdhesionConditions * AdhesionConditions;
388+
float C = AdhesionK * AdhesionK;
389+
float a = -2.0f * A * B;
390+
float b = A * B;
391+
float c = A * C;
396392
return ((-b - (float)Math.Sqrt(b * b - 4.0f * a * c)) / (2.0f * a));
397393
}
398394
}
@@ -520,10 +516,6 @@ public Axle()
520516
AxleRevolutionsInt.IsLimited = true;
521517
Adhesion2 = 0.331455f;
522518

523-
CurtiusKnifflerA = 7.5f;
524-
CurtiusKnifflerB = 44.0f;
525-
CurtiusKnifflerC = 0.161f;
526-
527519
switch (driveType)
528520
{
529521
case AxleDriveType.NotDriven:
@@ -561,10 +553,6 @@ public Axle(ElectricMotor electricMotor)
561553
AxleRevolutionsInt.IsLimited = true;
562554
Adhesion2 = 0.331455f;
563555

564-
CurtiusKnifflerA = 7.5f;
565-
CurtiusKnifflerB = 44.0f;
566-
CurtiusKnifflerC = 0.161f;
567-
568556
switch (driveType)
569557
{
570558
case AxleDriveType.NotDriven:
@@ -594,6 +582,11 @@ public Axle(BinaryReader inf) : this()
594582
{
595583
previousSlipPercent = inf.ReadSingle();
596584
previousSlipSpeedMpS = inf.ReadSingle();
585+
axleForceN = inf.ReadSingle();
586+
adhesionK = inf.ReadSingle();
587+
AdhesionConditions = inf.ReadSingle();
588+
frictionN = inf.ReadSingle();
589+
dampingNs = inf.ReadSingle();
597590
}
598591

599592
/// <summary>
@@ -604,6 +597,11 @@ public void Save(BinaryWriter outf)
604597
{
605598
outf.Write(previousSlipPercent);
606599
outf.Write(previousSlipSpeedMpS);
600+
outf.Write(axleForceN);
601+
outf.Write(adhesionK);
602+
outf.Write(AdhesionConditions);
603+
outf.Write(frictionN);
604+
outf.Write(dampingNs);
607605
}
608606

609607
/// <summary>
@@ -615,6 +613,7 @@ public void Save(BinaryWriter outf)
615613
/// <param name="timeSpan"></param>
616614
public virtual void Update(float timeSpan)
617615
{
616+
618617
//Update axle force ( = k * loadTorqueNm)
619618
axleForceN = AxleWeightN * SlipCharacteristics(AxleSpeedMpS - TrainSpeedMpS, TrainSpeedMpS, AdhesionK, AdhesionConditions, Adhesion2);
620619

0 commit comments

Comments
 (0)