Skip to content

Commit e9b7c48

Browse files
committed
Separate graduated/full release application from type of brake system
1 parent 64ef15d commit e9b7c48

File tree

2 files changed

+23
-42
lines changed

2 files changed

+23
-42
lines changed

Source/Orts.Simulation/Simulation/RollingStocks/SubSystems/Brakes/MSTS/AirSinglePipe.cs

Lines changed: 19 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@ public class AirSinglePipe : MSTSBrakeSystem
3838
protected float AutoCylPressurePSI = 64;
3939
protected float AuxResPressurePSI = 64;
4040
protected float EmergResPressurePSI = 64;
41+
protected float ControlResPressurePSI = 64;
4142
protected float FullServPressurePSI = 50;
4243
protected float MaxCylPressurePSI = 64;
4344
protected float AuxCylVolumeRatio = 2.5f;
@@ -53,7 +54,6 @@ public class AirSinglePipe : MSTSBrakeSystem
5354
protected float EmergAuxVolumeRatio = 1.4f;
5455
protected string DebugType = string.Empty;
5556
protected string RetainerDebugState = string.Empty;
56-
protected bool NoMRPAuxResCharging;
5757
protected float CylVolumeM3;
5858

5959

@@ -116,7 +116,6 @@ public override void InitializeFromCopy(BrakeSystem copy)
116116
EmergResChargingRatePSIpS = thiscopy.EmergResChargingRatePSIpS;
117117
EmergAuxVolumeRatio = thiscopy.EmergAuxVolumeRatio;
118118
TwoPipes = thiscopy.TwoPipes;
119-
NoMRPAuxResCharging = thiscopy.NoMRPAuxResCharging;
120119
HoldingValve = thiscopy.HoldingValve;
121120
}
122121

@@ -265,6 +264,7 @@ public override void Save(BinaryWriter outf)
265264
outf.Write(AutoCylPressurePSI);
266265
outf.Write(AuxResPressurePSI);
267266
outf.Write(EmergResPressurePSI);
267+
outf.Write(ControlResPressurePSI);
268268
outf.Write(FullServPressurePSI);
269269
outf.Write((int)TripleValveState);
270270
outf.Write(FrontBrakeHoseConnected);
@@ -287,6 +287,7 @@ public override void Restore(BinaryReader inf)
287287
AutoCylPressurePSI = inf.ReadSingle();
288288
AuxResPressurePSI = inf.ReadSingle();
289289
EmergResPressurePSI = inf.ReadSingle();
290+
ControlResPressurePSI = inf.ReadSingle();
290291
FullServPressurePSI = inf.ReadSingle();
291292
TripleValveState = (ValveState)inf.ReadInt32();
292293
FrontBrakeHoseConnected = inf.ReadBoolean();
@@ -311,11 +312,13 @@ public override void Initialize(bool handbrakeOn, float maxPressurePSI, float fu
311312
BrakeLine1PressurePSI = Car.Train.EqualReservoirPressurePSIorInHg;
312313
BrakeLine2PressurePSI = Car.Train.BrakeLine2PressurePSI;
313314
BrakeLine3PressurePSI = 0;
314-
if ((Car as MSTSWagon).EmergencyReservoirPresent || maxPressurePSI > 0)
315-
EmergResPressurePSI = maxPressurePSI;
315+
if (maxPressurePSI > 0)
316+
ControlResPressurePSI = maxPressurePSI;
316317
FullServPressurePSI = fullServPressurePSI;
317318
AutoCylPressurePSI = immediateRelease ? 0 : Math.Min((maxPressurePSI - BrakeLine1PressurePSI) * AuxCylVolumeRatio, MaxCylPressurePSI);
318319
AuxResPressurePSI = TwoPipes ? maxPressurePSI : Math.Max(maxPressurePSI - AutoCylPressurePSI / AuxCylVolumeRatio, BrakeLine1PressurePSI);
320+
if ((Car as MSTSWagon).EmergencyReservoirPresent)
321+
EmergResPressurePSI = Math.Max(AuxResPressurePSI, maxPressurePSI);
319322
TripleValveState = ValveState.Lap;
320323
HoldingValve = ValveState.Release;
321324
HandbrakePercent = handbrakeOn & (Car as MSTSWagon).HandBrakePresent ? 100 : 0;
@@ -339,24 +342,22 @@ public override void Initialize(bool handbrakeOn, float maxPressurePSI, float fu
339342
/// </summary>
340343
public override void InitializeMoving ()
341344
{
342-
var emergResPressurePSI = EmergResPressurePSI;
343345
Initialize(false, 0, FullServPressurePSI, true);
344-
EmergResPressurePSI = emergResPressurePSI;
345346
}
346347

347348
public override void LocoInitializeMoving() // starting conditions when starting speed > 0
348349
{
349350
}
350351

351-
public virtual void UpdateTripleValveState(float controlPressurePSI)
352+
public virtual void UpdateTripleValveState(float targetPressurePSI)
352353
{
353354
if (BrakeLine1PressurePSI < FullServPressurePSI - 1)
354355
TripleValveState = ValveState.Emergency;
355356
else if (BrakeLine1PressurePSI > AuxResPressurePSI + 1)
356357
TripleValveState = ValveState.Release;
357358
else if (TripleValveState == ValveState.Emergency && BrakeLine1PressurePSI > AuxResPressurePSI)
358359
TripleValveState = ValveState.Release;
359-
else if (EmergResPressurePSI > 70 && BrakeLine1PressurePSI > EmergResPressurePSI * 0.97f) // UIC regulation: for 5 bar systems, release if > 4.85 bar
360+
else if (ControlResPressurePSI > 70 && BrakeLine1PressurePSI > ControlResPressurePSI * 0.97f) // UIC regulation: for 5 bar systems, release if > 4.85 bar
360361
TripleValveState = ValveState.Release;
361362
else if (TripleValveState != ValveState.Emergency && BrakeLine1PressurePSI < AuxResPressurePSI - 1)
362363
TripleValveState = ValveState.Apply;
@@ -366,13 +367,7 @@ public virtual void UpdateTripleValveState(float controlPressurePSI)
366367

367368
public override void Update(float elapsedClockSeconds)
368369
{
369-
//ValveState prevTripleValueState = TripleValveState;
370-
371-
// Emergency reservoir's second role (in OpenRails) is to act as a control reservoir,
372-
// maintaining a reference control pressure for graduated release brake actions.
373-
// Thus this pressure must be set even in brake systems ER not present otherwise. It just stays static in this case.
374-
float threshold = Math.Max(RetainerPressureThresholdPSI,
375-
(Car as MSTSWagon).DistributorPresent ? (EmergResPressurePSI - BrakeLine1PressurePSI) * AuxCylVolumeRatio : 0);
370+
float threshold = (Car as MSTSWagon).DistributorPresent ? (ControlResPressurePSI - BrakeLine1PressurePSI) * AuxCylVolumeRatio : 0;
376371

377372
if (BleedOffValveOpen)
378373
{
@@ -406,7 +401,7 @@ public override void Update(float elapsedClockSeconds)
406401
float dp = elapsedClockSeconds * MaxApplicationRatePSIpS;
407402
if (AuxResPressurePSI - dp / AuxCylVolumeRatio < AutoCylPressurePSI + dp)
408403
dp = (AuxResPressurePSI - AutoCylPressurePSI) * AuxCylVolumeRatio / (1 + AuxCylVolumeRatio);
409-
if (TwoPipes && dp > threshold - AutoCylPressurePSI)
404+
if ((Car as MSTSWagon).DistributorPresent && dp > threshold - AutoCylPressurePSI)
410405
dp = threshold - AutoCylPressurePSI;
411406
if (AutoCylPressurePSI + dp > MaxCylPressurePSI)
412407
dp = MaxCylPressurePSI - AutoCylPressurePSI;
@@ -431,6 +426,8 @@ public override void Update(float elapsedClockSeconds)
431426
// triple valve set to release pressure in brake cylinder and EP valve set
432427
if (TripleValveState == ValveState.Release && HoldingValve == ValveState.Release)
433428
{
429+
if (threshold < RetainerPressureThresholdPSI)
430+
threshold = RetainerPressureThresholdPSI;
434431
if (AutoCylPressurePSI > threshold)
435432
{
436433
AutoCylPressurePSI -= elapsedClockSeconds * ReleaseRatePSIpS;
@@ -440,7 +437,7 @@ public override void Update(float elapsedClockSeconds)
440437

441438
if ((Car as MSTSWagon).EmergencyReservoirPresent)
442439
{
443-
if (!(Car as MSTSWagon).DistributorPresent && AuxResPressurePSI < EmergResPressurePSI && AuxResPressurePSI < BrakeLine1PressurePSI)
440+
if (AuxResPressurePSI < EmergResPressurePSI && AuxResPressurePSI < BrakeLine1PressurePSI)
444441
{
445442
float dp = elapsedClockSeconds * EmergResChargingRatePSIpS;
446443
if (EmergResPressurePSI - dp < AuxResPressurePSI + dp * EmergAuxVolumeRatio)
@@ -459,7 +456,7 @@ public override void Update(float elapsedClockSeconds)
459456
AuxResPressurePSI -= dp * EmergAuxVolumeRatio;
460457
}
461458
}
462-
if (AuxResPressurePSI < BrakeLine1PressurePSI && (!TwoPipes || NoMRPAuxResCharging || BrakeLine2PressurePSI < BrakeLine1PressurePSI) && !BleedOffValveOpen)
459+
if (AuxResPressurePSI < BrakeLine1PressurePSI && (!TwoPipes || !(Car as MSTSWagon).DistributorPresent || BrakeLine2PressurePSI < BrakeLine1PressurePSI) && !BleedOffValveOpen)
463460
{
464461
float dp = elapsedClockSeconds * MaxAuxilaryChargingRatePSIpS; // Change in pressure for train brake pipe.
465462
if (AuxResPressurePSI + dp > BrakeLine1PressurePSI - dp * AuxBrakeLineVolumeRatio)
@@ -479,9 +476,9 @@ public override void Update(float elapsedClockSeconds)
479476

480477
// Charge Auxiliary reservoir for MRP
481478
if (TwoPipes
482-
&& !NoMRPAuxResCharging
479+
&& (Car as MSTSWagon).DistributorPresent
483480
&& AuxResPressurePSI < BrakeLine2PressurePSI
484-
&& AuxResPressurePSI < EmergResPressurePSI
481+
&& AuxResPressurePSI < ControlResPressurePSI
485482
&& (BrakeLine2PressurePSI > BrakeLine1PressurePSI || TripleValveState != ValveState.Release) && !BleedOffValveOpen)
486483
{
487484
float dp = elapsedClockSeconds * MaxAuxilaryChargingRatePSIpS;
@@ -725,25 +722,11 @@ protected static void PropagateBrakeLinePressures(float elapsedClockSeconds, Tra
725722
PressureDiffEqualToPipePSI = 0;
726723

727724
// Adjust brake pipe pressure based upon pressure differential
728-
if (lead.TrainBrakePipeLeakPSIorInHgpS == 0) // Train pipe leakage disabled (ie. No Train Leakage parameter present in ENG file)
725+
if (lead.TrainBrakeController.TrainBrakeControllerState != ControllerState.Lap) // in LAP psoition brake pipe is isolated, and thus brake pipe pressure decreases, but reservoir remains at same pressure
729726
{
730727
lead.BrakeSystem.BrakeLine1PressurePSI += PressureDiffEqualToPipePSI;
731728
lead.MainResPressurePSI -= PressureDiffEqualToPipePSI * lead.BrakeSystem.BrakePipeVolumeM3 / lead.MainResVolumeM3;
732729
}
733-
else
734-
// Train pipe leakage is enabled (ie. ENG file parameter present)
735-
{
736-
// If pipe leakage and brake control valve is in LAP position then pipe is connected to main reservoir and maintained at equalising pressure from reservoir
737-
// All other brake states will have the brake pipe connected to the main reservoir, and therefore leakage will be compenstaed by air from main reservoir
738-
// Modern self lap brakes will maintain pipe pressure using air from main reservoir
739-
740-
if (lead.TrainBrakeController.TrainBrakeControllerState != ControllerState.Lap)
741-
{
742-
lead.BrakeSystem.BrakeLine1PressurePSI += PressureDiffEqualToPipePSI; // Increase brake pipe pressure to cover loss
743-
lead.MainResPressurePSI = lead.MainResPressurePSI - (PressureDiffEqualToPipePSI * lead.BrakeSystem.BrakePipeVolumeM3 / lead.MainResVolumeM3); // Decrease main reservoir pressure
744-
}
745-
// else in LAP psoition brake pipe is isolated, and thus brake pipe pressure decreases, but reservoir remains at same pressure
746-
}
747730
}
748731
// reduce pressure in lead brake line if brake pipe pressure is above equalising pressure - apply brakes
749732
else if (lead.BrakeSystem.BrakeLine1PressurePSI > train.EqualReservoirPressurePSIorInHg)
@@ -1011,6 +994,7 @@ public void NormalizePressures(float maxPressurePSI)
1011994
if (AuxResPressurePSI > maxPressurePSI) AuxResPressurePSI = maxPressurePSI;
1012995
if (BrakeLine1PressurePSI > maxPressurePSI) BrakeLine1PressurePSI = maxPressurePSI;
1013996
if (EmergResPressurePSI > maxPressurePSI) EmergResPressurePSI = maxPressurePSI;
997+
if (ControlResPressurePSI > maxPressurePSI) ControlResPressurePSI = maxPressurePSI;
1014998
}
1015999

10161000
public override bool IsBraking()

Source/Orts.Simulation/Simulation/RollingStocks/SubSystems/Brakes/MSTS/AirTwinPipe.cs

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -25,16 +25,13 @@ public AirTwinPipe(TrainCar car)
2525
{
2626
TwoPipes = true;
2727
DebugType = "2P";
28-
(Car as MSTSWagon).DistributorPresent = true;
29-
(Car as MSTSWagon).EmergencyReservoirPresent = false;
3028
}
31-
32-
public override void UpdateTripleValveState(float controlPressurePSI)
29+
public override void UpdateTripleValveState(float targetPressurePSI)
3330
{
34-
if (controlPressurePSI < AutoCylPressurePSI - (TripleValveState != ValveState.Release ? 2.2f : 0f)
35-
|| controlPressurePSI < 2.2f) // The latter is a UIC regulation (0.15 bar)
31+
if (targetPressurePSI < AutoCylPressurePSI - (TripleValveState != ValveState.Release ? 2.2f : 0f)
32+
|| targetPressurePSI < 2.2f) // The latter is a UIC regulation (0.15 bar)
3633
TripleValveState = ValveState.Release;
37-
else if (!BailOffOn && controlPressurePSI > AutoCylPressurePSI + (TripleValveState != ValveState.Apply ? 2.2f : 0f))
34+
else if (!BailOffOn && targetPressurePSI > AutoCylPressurePSI + (TripleValveState != ValveState.Apply ? 2.2f : 0f))
3835
TripleValveState = ValveState.Apply;
3936
else
4037
TripleValveState = ValveState.Lap;

0 commit comments

Comments
 (0)