Skip to content

Commit 7d9eda4

Browse files
committed
Replace dynamic brakes by air brakes at low speeds
1 parent 597ce24 commit 7d9eda4

File tree

3 files changed

+17
-0
lines changed

3 files changed

+17
-0
lines changed

Source/Documentation/Manual/physics.rst

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3147,6 +3147,8 @@ the following parameters will adjust the behaviour of air brakes:
31473147
.. index::
31483148
single: DynamicBrakeHasAutoBailOff
31493149
single: ORTSDynamicBrakesHasPartialBailOff
3150+
single: ORTSTrainDynamicBlendingTable
3151+
single: ORTSDynamicBrakeReplacementWithEngineBrake
31503152

31513153
- ``Engine(DynamicBrakeHasAutoBailOff`` -- Set to 1 if brake cylinders are
31523154
emptied while dynamic brake is active
@@ -3186,6 +3188,10 @@ notch of the train brake controller, where 0 means no dynamic brake and 1 means
31863188
)
31873189
)
31883190
)
3191+
Dynamic braking is not effective at low speeds. Thus, in some locomotives,
3192+
dynamic brake application demanded by the train brake controller is replaced by
3193+
`engine` air braking at low speeds. This effect can be activated setting
3194+
``Engine(ORTSDynamicBrakeReplacementWithEngineBrake `` to 1.
31893195
31903196
Native Open Rails Braking Parameters
31913197
------------------------------------

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

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -405,6 +405,7 @@ public float OdometerM
405405
public float DynamicBrakeDelayS;
406406
public bool DynamicBrakeAutoBailOff;
407407
public bool DynamicBrakePartialBailOff;
408+
public bool DynamicBrakeEngineBrakeReplacement;
408409
public bool UsingRearCab;
409410
public bool BrakeOverchargeSoundOn = false;
410411
protected bool DynamicBrakeBlendingEnabled; // dynamic brake blending is configured
@@ -1083,6 +1084,7 @@ public override void Parse(string lowercasetoken, STFReader stf)
10831084
case "engine(dynamicbrakehasautobailoff":
10841085
case "engine(ortsdynamicbrakeshasautobailoff": DynamicBrakeAutoBailOff = stf.ReadBoolBlock(true); break;
10851086
case "engine(ortsdynamicbrakeshaspartialbailoff": DynamicBrakePartialBailOff = stf.ReadBoolBlock(false); break;
1087+
case "engine(ortsdynamicbrakereplacementwithenginebrake": DynamicBrakeEngineBrakeReplacement = stf.ReadBoolBlock(false); break;
10861088
case "engine(dynamicbrakesdelaytimebeforeengaging": DynamicBrakeDelayS = stf.ReadFloatBlock(STFReader.UNITS.Time, null); break;
10871089
case "engine(dynamicbrakesresistorcurrentlimit": DynamicBrakeMaxCurrentA = stf.ReadFloatBlock(STFReader.UNITS.Current, null); break;
10881090
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;
@@ -1237,6 +1239,7 @@ public override void Copy(MSTSWagon copy)
12371239
DynamicBrakeForceCurves = locoCopy.DynamicBrakeForceCurves;
12381240
DynamicBrakeAutoBailOff = locoCopy.DynamicBrakeAutoBailOff;
12391241
DynamicBrakePartialBailOff = locoCopy.DynamicBrakePartialBailOff;
1242+
DynamicBrakeEngineBrakeReplacement = locoCopy.DynamicBrakeEngineBrakeReplacement;
12401243
DynamicBrakeMaxCurrentA = locoCopy.DynamicBrakeMaxCurrentA;
12411244
DynamicBrakeSpeed1MpS = locoCopy.DynamicBrakeSpeed1MpS;
12421245
DynamicBrakeSpeed2MpS = locoCopy.DynamicBrakeSpeed2MpS;

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

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1714,6 +1714,14 @@ public override void Update(float elapsedClockSeconds)
17141714
}
17151715
}
17161716
}
1717+
if (loco.DynamicBrakeEngineBrakeReplacement && loco.RemoteControlGroup == 0 && loco.AbsTractionSpeedMpS < loco.DynamicBrakeSpeed2MpS && loco.Train.LeadLocomotive is MSTSLocomotive lead && lead.TrainBrakeController.TrainDynamicBrakeIntervention > 0)
1718+
{
1719+
var requiredBrakeForceN = loco.MaxDynamicBrakeForceN * lead.TrainBrakeController.TrainDynamicBrakeIntervention;
1720+
var reverseBlendingPressurePSI = Math.Min(Math.Max((requiredBrakeForceN - loco.DynamicBrakeForceN) / Car.FrictionBrakeBlendingMaxForceN * ReferencePressurePSI
1721+
+ BrakeCylinderSpringPressurePSI, 0), MaxCylPressurePSI);
1722+
reverseBlendingPressurePSI /= RelayValveRatio;
1723+
if (demandedPressurePSI < reverseBlendingPressurePSI) demandedPressurePSI = reverseBlendingPressurePSI;
1724+
}
17171725
}
17181726
}
17191727
}

0 commit comments

Comments
 (0)