Skip to content

Commit 1dc61c5

Browse files
committed
Add rate for emergency brake actuation of triple valves
1 parent 58de89c commit 1dc61c5

File tree

2 files changed

+45
-38
lines changed

2 files changed

+45
-38
lines changed

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

Lines changed: 45 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,7 @@ public class AirSinglePipe : MSTSBrakeSystem
5050
protected float MaxApplicationRatePSIpS = .9f;
5151
protected float MaxAuxilaryChargingRatePSIpS = 1.684f;
5252
protected float BrakeInsensitivityPSIpS = 0;
53+
protected float EmergencyValveActuationRatePSIpS = 0;
5354
protected float EmergResChargingRatePSIpS = 1.684f;
5455
protected float EmergAuxVolumeRatio = 1.4f;
5556
protected string DebugType = string.Empty;
@@ -62,6 +63,7 @@ public class AirSinglePipe : MSTSBrakeSystem
6263
protected float SoundTriggerCounter = 0;
6364
protected float prevCylPressurePSI = 0f;
6465
protected float prevBrakePipePressurePSI = 0f;
66+
protected float prevBrakePipePressurePSI_sound = 0f;
6567
protected bool BailOffOn;
6668

6769

@@ -113,6 +115,7 @@ public override void InitializeFromCopy(BrakeSystem copy)
113115
MaxApplicationRatePSIpS = thiscopy.MaxApplicationRatePSIpS;
114116
MaxAuxilaryChargingRatePSIpS = thiscopy.MaxAuxilaryChargingRatePSIpS;
115117
BrakeInsensitivityPSIpS = thiscopy.BrakeInsensitivityPSIpS;
118+
EmergencyValveActuationRatePSIpS = thiscopy.EmergencyValveActuationRatePSIpS;
116119
EmergResChargingRatePSIpS = thiscopy.EmergResChargingRatePSIpS;
117120
EmergAuxVolumeRatio = thiscopy.EmergAuxVolumeRatio;
118121
TwoPipes = thiscopy.TwoPipes;
@@ -250,6 +253,7 @@ public override void Parse(string lowercasetoken, STFReader stf)
250253
// OpenRails specific parameters
251254
case "wagon(brakepipevolume": BrakePipeVolumeM3 = Me3.FromFt3(stf.ReadFloatBlock(STFReader.UNITS.VolumeDefaultFT3, null)); break;
252255
case "wagon(ortsbrakeinsensitivity": BrakeInsensitivityPSIpS = stf.ReadFloatBlock(STFReader.UNITS.PressureRateDefaultPSIpS, null); break;
256+
case "wagon(ortsemergencyvalveactuationrate": EmergencyValveActuationRatePSIpS = stf.ReadFloatBlock(STFReader.UNITS.PressureRateDefaultPSIpS, 15f); break;
253257
}
254258
}
255259

@@ -349,20 +353,37 @@ public override void LocoInitializeMoving() // starting conditions when starting
349353
{
350354
}
351355

352-
public virtual void UpdateTripleValveState(float targetPressurePSI)
356+
public void UpdateTripleValveState(float elapsedClockSeconds)
353357
{
354-
if (BrakeLine1PressurePSI < FullServPressurePSI - 1)
355-
TripleValveState = ValveState.Emergency;
356-
else if (BrakeLine1PressurePSI > AuxResPressurePSI + 1)
357-
TripleValveState = ValveState.Release;
358-
else if (TripleValveState == ValveState.Emergency && BrakeLine1PressurePSI > AuxResPressurePSI)
359-
TripleValveState = ValveState.Release;
360-
else if (ControlResPressurePSI > 70 && BrakeLine1PressurePSI > ControlResPressurePSI * 0.97f) // UIC regulation: for 5 bar systems, release if > 4.85 bar
361-
TripleValveState = ValveState.Release;
362-
else if (TripleValveState != ValveState.Emergency && BrakeLine1PressurePSI < AuxResPressurePSI - 1)
363-
TripleValveState = ValveState.Apply;
364-
else if (TripleValveState == ValveState.Apply && BrakeLine1PressurePSI >= AuxResPressurePSI)
365-
TripleValveState = ValveState.Lap;
358+
if ((Car as MSTSWagon).DistributorPresent)
359+
{
360+
float targetPressurePSI = (ControlResPressurePSI - BrakeLine1PressurePSI) * AuxCylVolumeRatio;
361+
if (targetPressurePSI > AutoCylPressurePSI && (prevBrakePipePressurePSI - BrakeLine1PressurePSI) > Math.Max(elapsedClockSeconds, 0.0001f) * EmergencyValveActuationRatePSIpS)
362+
TripleValveState = ValveState.Emergency;
363+
else if (targetPressurePSI < AutoCylPressurePSI - (TripleValveState != ValveState.Release ? 2.2f : 0f)
364+
|| targetPressurePSI < 2.2f) // The latter is a UIC regulation (0.15 bar)
365+
TripleValveState = ValveState.Release;
366+
else if (!BailOffOn && TripleValveState != ValveState.Emergency && targetPressurePSI > AutoCylPressurePSI + (TripleValveState != ValveState.Apply ? 2.2f : 0f))
367+
TripleValveState = ValveState.Apply;
368+
else
369+
TripleValveState = ValveState.Lap;
370+
}
371+
else
372+
{
373+
if (BrakeLine1PressurePSI < AuxResPressurePSI - 1 && (prevBrakePipePressurePSI - BrakeLine1PressurePSI) > Math.Max(elapsedClockSeconds, 0.0001f) * EmergencyValveActuationRatePSIpS)
374+
TripleValveState = ValveState.Emergency;
375+
else if (BrakeLine1PressurePSI > AuxResPressurePSI + 1)
376+
TripleValveState = ValveState.Release;
377+
else if (TripleValveState == ValveState.Emergency && BrakeLine1PressurePSI > AuxResPressurePSI)
378+
TripleValveState = ValveState.Release;
379+
else if (ControlResPressurePSI > 70 && BrakeLine1PressurePSI > ControlResPressurePSI * 0.97f) // UIC regulation: for 5 bar systems, release if > 4.85 bar
380+
TripleValveState = ValveState.Release;
381+
else if (TripleValveState != ValveState.Emergency && BrakeLine1PressurePSI < AuxResPressurePSI - 1)
382+
TripleValveState = ValveState.Apply;
383+
else if (TripleValveState == ValveState.Apply && BrakeLine1PressurePSI >= AuxResPressurePSI)
384+
TripleValveState = ValveState.Lap;
385+
}
386+
prevBrakePipePressurePSI = BrakeLine1PressurePSI;
366387
}
367388

368389
public override void Update(float elapsedClockSeconds)
@@ -393,15 +414,15 @@ public override void Update(float elapsedClockSeconds)
393414
}
394415
}
395416
else
396-
UpdateTripleValveState(threshold);
417+
UpdateTripleValveState(elapsedClockSeconds);
397418

398419
// triple valve is set to charge the brake cylinder
399420
if ((TripleValveState == ValveState.Apply || TripleValveState == ValveState.Emergency) && !Car.WheelBrakeSlideProtectionActive)
400421
{
401422
float dp = elapsedClockSeconds * MaxApplicationRatePSIpS;
402423
if (AuxResPressurePSI - dp / AuxCylVolumeRatio < AutoCylPressurePSI + dp)
403424
dp = (AuxResPressurePSI - AutoCylPressurePSI) * AuxCylVolumeRatio / (1 + AuxCylVolumeRatio);
404-
if ((Car as MSTSWagon).DistributorPresent && dp > threshold - AutoCylPressurePSI)
425+
if ((Car as MSTSWagon).DistributorPresent && TripleValveState != ValveState.Emergency && dp > threshold - AutoCylPressurePSI)
405426
dp = threshold - AutoCylPressurePSI;
406427
if (AutoCylPressurePSI + dp > MaxCylPressurePSI)
407428
dp = MaxCylPressurePSI - AutoCylPressurePSI;
@@ -469,9 +490,12 @@ public override void Update(float elapsedClockSeconds)
469490
float minCylPressurePSI = Math.Max(threshold, RetainerPressureThresholdPSI);
470491
if (TripleValveState == ValveState.Release && HoldingValve == ValveState.Release && AutoCylPressurePSI > minCylPressurePSI)
471492
{
472-
AutoCylPressurePSI -= elapsedClockSeconds * ReleaseRatePSIpS;
473-
if (AutoCylPressurePSI < minCylPressurePSI)
474-
AutoCylPressurePSI = minCylPressurePSI;
493+
float dp = elapsedClockSeconds * ReleaseRatePSIpS;
494+
if (AutoCylPressurePSI - dp < minCylPressurePSI)
495+
dp = AutoCylPressurePSI-minCylPressurePSI;
496+
if (dp < 0)
497+
dp = 0;
498+
AutoCylPressurePSI -= dp;
475499
}
476500

477501
// Charge Auxiliary reservoir for MRP
@@ -616,11 +640,11 @@ public override void Update(float elapsedClockSeconds)
616640
Car.SignalEvent(Event.TrainBrakePressureStoppedChanging);
617641
}
618642

619-
if ( Math.Abs(BrakeLine1PressurePSI - prevBrakePipePressurePSI) > 0.1f /*BrakeLine1PressurePSI > prevBrakePipePressurePSI*/)
643+
if ( Math.Abs(BrakeLine1PressurePSI - prevBrakePipePressurePSI_sound) > 0.1f /*BrakeLine1PressurePSI > prevBrakePipePressurePSI*/)
620644
{
621645
if (!BrakePipePressureChanging)
622646
{
623-
if (BrakeLine1PressurePSI > prevBrakePipePressurePSI)
647+
if (BrakeLine1PressurePSI > prevBrakePipePressurePSI_sound)
624648
Car.SignalEvent(Event.BrakePipePressureIncrease);
625649
else
626650
Car.SignalEvent(Event.BrakePipePressureDecrease);
@@ -634,7 +658,7 @@ public override void Update(float elapsedClockSeconds)
634658
Car.SignalEvent(Event.BrakePipePressureStoppedChanging);
635659
}
636660
prevCylPressurePSI = AutoCylPressurePSI;
637-
prevBrakePipePressurePSI = BrakeLine1PressurePSI;
661+
prevBrakePipePressurePSI_sound = BrakeLine1PressurePSI;
638662

639663
var lead = Car as MSTSLocomotive;
640664

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

Lines changed: 0 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -26,22 +26,5 @@ public AirTwinPipe(TrainCar car)
2626
TwoPipes = true;
2727
DebugType = "2P";
2828
}
29-
public override void UpdateTripleValveState(float targetPressurePSI)
30-
{
31-
if (!(Car as MSTSWagon).DistributorPresent)
32-
{
33-
base.UpdateTripleValveState(targetPressurePSI);
34-
}
35-
else
36-
{
37-
if (targetPressurePSI < AutoCylPressurePSI - (TripleValveState != ValveState.Release ? 2.2f : 0f)
38-
|| targetPressurePSI < 2.2f) // The latter is a UIC regulation (0.15 bar)
39-
TripleValveState = ValveState.Release;
40-
else if (!BailOffOn && targetPressurePSI > AutoCylPressurePSI + (TripleValveState != ValveState.Apply ? 2.2f : 0f))
41-
TripleValveState = ValveState.Apply;
42-
else
43-
TripleValveState = ValveState.Lap;
44-
}
45-
}
4629
}
4730
}

0 commit comments

Comments
 (0)