Skip to content

Commit 78f4c85

Browse files
committed
Partial dynamic brake bailoff
Dynamic brakes are complemented with air brakes proportionally to automatic brake demand
1 parent dc256cd commit 78f4c85

File tree

2 files changed

+32
-10
lines changed

2 files changed

+32
-10
lines changed

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

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -372,6 +372,7 @@ public float OdometerM
372372
public float DynamicBrakeMaxCurrentA;
373373
public float DynamicBrakeDelayS;
374374
public bool DynamicBrakeAutoBailOff;
375+
public bool DynamicBrakePartialBailOff;
375376
public bool UsingRearCab;
376377
public bool BrakeOverchargeSoundOn = false;
377378

@@ -1019,6 +1020,7 @@ public override void Parse(string lowercasetoken, STFReader stf)
10191020
case "engine(dynamicbrakesmaximumforce": MaxDynamicBrakeForceN = stf.ReadFloatBlock(STFReader.UNITS.Force, null); break;
10201021
case "engine(dynamicbrakehasautobailoff":
10211022
case "engine(ortsdynamicbrakeshasautobailoff": DynamicBrakeAutoBailOff = stf.ReadBoolBlock(true); break;
1023+
case "engine(ortsdynamicbrakeshaspartialbailoff": DynamicBrakePartialBailOff = stf.ReadBoolBlock(false); break;
10221024
case "engine(dynamicbrakesdelaytimebeforeengaging": DynamicBrakeDelayS = stf.ReadFloatBlock(STFReader.UNITS.Time, null); break;
10231025
case "engine(dynamicbrakesresistorcurrentlimit": DynamicBrakeMaxCurrentA = stf.ReadFloatBlock(STFReader.UNITS.Current, null); break;
10241026
case "engine(numwheels": MSTSLocoNumDrvWheels = stf.ReadFloatBlock(STFReader.UNITS.None, 4.0f); if (MSTSLocoNumDrvWheels < 1) STFException.TraceWarning(stf, "Engine:NumWheels is less than 1, parts of the simulation may not function correctly"); break;
@@ -1138,6 +1140,7 @@ public override void Copy(MSTSWagon copy)
11381140
ContinuousForceTimeFactor = locoCopy.ContinuousForceTimeFactor;
11391141
DynamicBrakeForceCurves = locoCopy.DynamicBrakeForceCurves;
11401142
DynamicBrakeAutoBailOff = locoCopy.DynamicBrakeAutoBailOff;
1143+
DynamicBrakePartialBailOff = locoCopy.DynamicBrakePartialBailOff;
11411144
DynamicBrakeMaxCurrentA = locoCopy.DynamicBrakeMaxCurrentA;
11421145
CombinedControlType = locoCopy.CombinedControlType;
11431146
CombinedControlSplitPosition = locoCopy.CombinedControlSplitPosition;

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

Lines changed: 29 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -561,9 +561,9 @@ public override void Update(float elapsedClockSeconds)
561561
}
562562
else
563563
{
564+
bool isolateAutoBrake = false;
564565
if (Car is MSTSLocomotive loco && loco.EngineType != TrainCar.EngineTypes.Control) // TODO - Control cars ned to be linked to power suppy requirements.
565566
{
566-
bool isolateAutoBrake = false;
567567
// if (Car is MSTSLocomotive loco && loco.LocomotivePowerSupply.MainPowerSupplyOn)
568568
if (loco.LocomotivePowerSupply.MainPowerSupplyOn)
569569
{
@@ -588,20 +588,39 @@ public override void Update(float elapsedClockSeconds)
588588
if (loco.DynamicBrakeAutoBailOff && loco.DynamicBrakePercent > 0 && Car.MaxBrakeForceN > 0)
589589
{
590590
var requiredBrakeForceN = Math.Min(AutoCylPressurePSI / MaxCylPressurePSI, 1) * Car.MaxBrakeForceN;
591-
var localBrakeForceN = loco.DynamicBrakeForceN + Math.Min(BrakeLine3PressurePSI / MaxCylPressurePSI, 1) * Car.MaxBrakeForceN;
591+
var localBrakeForceN = loco.DynamicBrakeForceN + Math.Min(CylPressurePSI / MaxCylPressurePSI, 1) * Car.MaxBrakeForceN;
592592
if (localBrakeForceN > requiredBrakeForceN * 0.85f)
593+
{
593594
isolateAutoBrake = true;
595+
if (loco.DynamicBrakePartialBailOff)
596+
{
597+
var compensatedPressurePSI = Math.Min(Math.Max((requiredBrakeForceN - loco.DynamicBrakeForceN)/Car.MaxBrakeForceN*MaxCylPressurePSI, 0), MaxCylPressurePSI);
598+
if (CylPressurePSI < BrakeLine3PressurePSI)
599+
CylPressurePSI = BrakeLine3PressurePSI;
600+
if (compensatedPressurePSI < CylPressurePSI)
601+
{
602+
CylPressurePSI = Math.Max(CylPressurePSI - MaxReleaseRatePSIpS * elapsedClockSeconds, BrakeLine3PressurePSI);
603+
}
604+
else if (compensatedPressurePSI > CylPressurePSI + 4)
605+
{
606+
float dp = elapsedClockSeconds * MaxApplicationRatePSIpS;
607+
if (BrakeLine2PressurePSI - dp * AuxBrakeLineVolumeRatio / AuxCylVolumeRatio < CylPressurePSI + dp)
608+
dp = (BrakeLine2PressurePSI - CylPressurePSI) / (1 + AuxBrakeLineVolumeRatio / AuxCylVolumeRatio);
609+
if (dp > compensatedPressurePSI - CylPressurePSI)
610+
dp = compensatedPressurePSI - CylPressurePSI;
611+
BrakeLine2PressurePSI -= dp * AuxBrakeLineVolumeRatio / AuxCylVolumeRatio;
612+
CylPressurePSI += dp;
613+
}
614+
}
615+
else
616+
{
617+
CylPressurePSI = BrakeLine3PressurePSI;
618+
}
619+
}
594620
}
595621
}
596-
if (isolateAutoBrake)
597-
CylPressurePSI = BrakeLine3PressurePSI;
598-
else
599-
CylPressurePSI = Math.Max(AutoCylPressurePSI, BrakeLine3PressurePSI);
600-
}
601-
else
602-
{
603-
CylPressurePSI = Math.Max(AutoCylPressurePSI, BrakeLine3PressurePSI);
604622
}
623+
if (!isolateAutoBrake) CylPressurePSI = Math.Max(AutoCylPressurePSI, BrakeLine3PressurePSI);
605624
}
606625

607626
// 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

0 commit comments

Comments
 (0)