Skip to content

Commit 341c1ce

Browse files
committed
Change application and release rates for dynamic brake bail off
1 parent b8c97ee commit 341c1ce

File tree

2 files changed

+36
-24
lines changed

2 files changed

+36
-24
lines changed

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

Lines changed: 35 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -304,7 +304,7 @@ public override void Initialize(bool handbrakeOn, float maxPressurePSI, float fu
304304
if (maxPressurePSI > 0)
305305
ControlResPressurePSI = maxPressurePSI;
306306
FullServPressurePSI = fullServPressurePSI;
307-
AutoCylPressurePSI = immediateRelease ? 0 : Math.Min((maxPressurePSI - BrakeLine1PressurePSI) * AuxCylVolumeRatio, MaxCylPressurePSI);
307+
CylPressurePSI = AutoCylPressurePSI = immediateRelease ? 0 : Math.Min((maxPressurePSI - BrakeLine1PressurePSI) * AuxCylVolumeRatio, MaxCylPressurePSI);
308308
AuxResPressurePSI = Math.Max(TwoPipes ? maxPressurePSI : maxPressurePSI - AutoCylPressurePSI / AuxCylVolumeRatio, BrakeLine1PressurePSI);
309309
if ((Car as MSTSWagon).EmergencyReservoirPresent)
310310
EmergResPressurePSI = Math.Max(AuxResPressurePSI, maxPressurePSI);
@@ -563,9 +563,9 @@ public override void Update(float elapsedClockSeconds)
563563
}
564564
else
565565
{
566-
bool isolateAutoBrake = false;
567566
if (Car is MSTSLocomotive loco && loco.EngineType != TrainCar.EngineTypes.Control) // TODO - Control cars ned to be linked to power suppy requirements.
568567
{
568+
float demandedPressurePSI = Math.Max(AutoCylPressurePSI, BrakeLine3PressurePSI);
569569
// if (Car is MSTSLocomotive loco && loco.LocomotivePowerSupply.MainPowerSupplyOn)
570570
if (loco.LocomotivePowerSupply.MainPowerSupplyOn)
571571
{
@@ -595,47 +595,59 @@ public override void Update(float elapsedClockSeconds)
595595
var localBrakeForceN = loco.DynamicBrakeForceN + Math.Min(CylPressurePSI / MaxCylPressurePSI, 1) * Car.MaxBrakeForceN;
596596
if (localBrakeForceN > requiredBrakeForceN - 0.15f * Car.MaxBrakeForceN)
597597
{
598-
isolateAutoBrake = true;
599-
var compensatedPressurePSI = Math.Min(Math.Max((requiredBrakeForceN - loco.DynamicBrakeForceN)/Car.MaxBrakeForceN*MaxCylPressurePSI, 0), MaxCylPressurePSI);
600-
if (CylPressurePSI < BrakeLine3PressurePSI)
601-
CylPressurePSI = BrakeLine3PressurePSI;
602-
if (compensatedPressurePSI < CylPressurePSI)
598+
demandedPressurePSI = Math.Min(Math.Max((requiredBrakeForceN - loco.DynamicBrakeForceN)/Car.MaxBrakeForceN*MaxCylPressurePSI, 0), MaxCylPressurePSI);
599+
if (demandedPressurePSI > CylPressurePSI && demandedPressurePSI < CylPressurePSI + 4) // Allow some margin for unnecessary air brake application
603600
{
604-
CylPressurePSI = Math.Max(CylPressurePSI - MaxReleaseRatePSIpS * elapsedClockSeconds, BrakeLine3PressurePSI);
605-
}
606-
else if (compensatedPressurePSI > CylPressurePSI + 4)
607-
{
608-
float dp = elapsedClockSeconds * MaxApplicationRatePSIpS;
609-
if (BrakeLine2PressurePSI - dp * AuxBrakeLineVolumeRatio / AuxCylVolumeRatio < CylPressurePSI + dp)
610-
dp = (BrakeLine2PressurePSI - CylPressurePSI) / (1 + AuxBrakeLineVolumeRatio / AuxCylVolumeRatio);
611-
if (dp > compensatedPressurePSI - CylPressurePSI)
612-
dp = compensatedPressurePSI - CylPressurePSI;
613-
BrakeLine2PressurePSI -= dp * AuxBrakeLineVolumeRatio / AuxCylVolumeRatio;
614-
CylPressurePSI += dp;
601+
demandedPressurePSI = CylPressurePSI;
615602
}
603+
if (demandedPressurePSI < BrakeLine3PressurePSI)
604+
demandedPressurePSI = BrakeLine3PressurePSI;
616605
}
617606
}
618607
else if (loco.DynamicBrakeAutoBailOff)
619608
{
620609
if (loco.DynamicBrakeForceCurves == null)
621610
{
622-
isolateAutoBrake = true;
623-
CylPressurePSI = BrakeLine3PressurePSI;
611+
demandedPressurePSI = BrakeLine3PressurePSI;
624612
}
625613
else
626614
{
627615
var dynforce = loco.DynamicBrakeForceCurves.Get(1.0f, loco.AbsSpeedMpS);
628616
if ((loco.MaxDynamicBrakeForceN == 0 && dynforce > 0) || dynforce > loco.MaxDynamicBrakeForceN * 0.6)
629617
{
630-
isolateAutoBrake = true;
631-
CylPressurePSI = BrakeLine3PressurePSI;
618+
demandedPressurePSI = BrakeLine3PressurePSI;
632619
}
633620
}
634621
}
635622
}
636623
}
624+
// TODO: this first clause is intended for locomotives fitted with some sort of proportional valve
625+
// i.e. the triple valve is not directly attached to the physical brake cylinder
626+
// This allows e.g. blending, variable load, or higher pressures than provided by triple valves
627+
if (loco.DynamicBrakeAutoBailOff || loco.DynamicBrakeAutoBailOff)
628+
{
629+
if (demandedPressurePSI > CylPressurePSI)
630+
{
631+
float dp = elapsedClockSeconds * loco.EngineBrakeApplyRatePSIpS;
632+
if (dp > demandedPressurePSI - CylPressurePSI)
633+
dp = demandedPressurePSI - CylPressurePSI;
634+
/* TODO: Proportional valves need air from the main reservoir
635+
if (BrakeLine2PressurePSI - dp * AuxBrakeLineVolumeRatio / AuxCylVolumeRatio < CylPressurePSI + dp)
636+
dp = (BrakeLine2PressurePSI - CylPressurePSI) / (1 + AuxBrakeLineVolumeRatio / AuxCylVolumeRatio);
637+
BrakeLine2PressurePSI -= dp * AuxBrakeLineVolumeRatio / AuxCylVolumeRatio;*/
638+
CylPressurePSI += dp;
639+
}
640+
else if (demandedPressurePSI < CylPressurePSI) CylPressurePSI = Math.Max(demandedPressurePSI, CylPressurePSI - elapsedClockSeconds * loco.EngineBrakeReleaseRatePSIpS);
641+
}
642+
else // Rest of cases
643+
{
644+
CylPressurePSI = Math.Max(AutoCylPressurePSI, BrakeLine3PressurePSI);
645+
}
646+
}
647+
else
648+
{
649+
CylPressurePSI = Math.Max(AutoCylPressurePSI, BrakeLine3PressurePSI);
637650
}
638-
if (!isolateAutoBrake) CylPressurePSI = Math.Max(AutoCylPressurePSI, BrakeLine3PressurePSI);
639651
}
640652

641653
// During braking wheelslide control is effected throughout the train by additional equipment on each vehicle. In the piping to each pair of brake cylinders are fitted electrically operated

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -147,7 +147,7 @@ public override string GetFullStatus(BrakeSystem lastCarBrakeSystem, Dictionary<
147147
public override void Initialize(bool handbrakeOn, float maxPressurePSI, float fullServPressurePSI, bool immediateRelease)
148148
{
149149
base.Initialize(handbrakeOn, maxPressurePSI, fullServPressurePSI, immediateRelease);
150-
AutoCylPressurePSI = Math.Max(AutoCylPressurePSI, Math.Min(Math.Max(Car.Train.BrakeLine4, 0), 1) * MaxCylPressurePSI);
150+
CylPressurePSI = AutoCylPressurePSI = Math.Max(AutoCylPressurePSI, Math.Min(Math.Max(Car.Train.BrakeLine4, 0), 1) * MaxCylPressurePSI);
151151
}
152152
}
153153
}

0 commit comments

Comments
 (0)