Skip to content

Commit f015efb

Browse files
committed
Use dedicated speed for replacement of dynamic brakes with air brakes
1 parent 2fcbcde commit f015efb

File tree

3 files changed

+12
-2
lines changed

3 files changed

+12
-2
lines changed

Source/Documentation/Manual/physics.rst

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3149,6 +3149,7 @@ the following parameters will adjust the behaviour of air brakes:
31493149
single: ORTSDynamicBrakesHasPartialBailOff
31503150
single: ORTSTrainDynamicBlendingTable
31513151
single: ORTSDynamicBrakeReplacementWithEngineBrake
3152+
single: ORTSDynamicBrakeReplacementWithEngineBrakeAtSpeed
31523153

31533154
- ``Engine(DynamicBrakeHasAutoBailOff`` -- Set to 1 if brake cylinders are
31543155
emptied while dynamic brake is active
@@ -3191,7 +3192,8 @@ notch of the train brake controller, where 0 means no dynamic brake and 1 means
31913192
Dynamic braking is not effective at low speeds. Thus, in some locomotives,
31923193
dynamic brake application demanded by the train brake controller is replaced by
31933194
`engine` air braking at low speeds. This effect can be activated setting
3194-
``Engine(ORTSDynamicBrakeReplacementWithEngineBrake `` to 1.
3195+
``Engine(ORTSDynamicBrakeReplacementWithEngineBrake`` to 1, provided that the locomotive
3196+
speed is below ``Engine(ORTSDynamicBrakeReplacementWithEngineBrakeAtSpeed``.
31953197

31963198
Native Open Rails Braking Parameters
31973199
------------------------------------

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

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -406,6 +406,7 @@ public float OdometerM
406406
public bool DynamicBrakeAutoBailOff;
407407
public bool DynamicBrakePartialBailOff;
408408
public bool DynamicBrakeEngineBrakeReplacement;
409+
public float DynamicBrakeEngineBrakeReplacementSpeed;
409410
public bool UsingRearCab;
410411
public bool BrakeOverchargeSoundOn = false;
411412
protected bool DynamicBrakeBlendingEnabled; // dynamic brake blending is configured
@@ -1085,6 +1086,7 @@ public override void Parse(string lowercasetoken, STFReader stf)
10851086
case "engine(ortsdynamicbrakeshasautobailoff": DynamicBrakeAutoBailOff = stf.ReadBoolBlock(true); break;
10861087
case "engine(ortsdynamicbrakeshaspartialbailoff": DynamicBrakePartialBailOff = stf.ReadBoolBlock(false); break;
10871088
case "engine(ortsdynamicbrakereplacementwithenginebrake": DynamicBrakeEngineBrakeReplacement = stf.ReadBoolBlock(false); break;
1089+
case "engine(ortsdynamicbrakereplacementwithenginebrakeatspeed": DynamicBrakeEngineBrakeReplacementSpeed = stf.ReadFloatBlock(STFReader.UNITS.SpeedDefaultMPH, null); break;
10881090
case "engine(dynamicbrakesdelaytimebeforeengaging": DynamicBrakeDelayS = stf.ReadFloatBlock(STFReader.UNITS.Time, null); break;
10891091
case "engine(dynamicbrakesresistorcurrentlimit": DynamicBrakeMaxCurrentA = stf.ReadFloatBlock(STFReader.UNITS.Current, null); break;
10901092
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;
@@ -1240,6 +1242,7 @@ public override void Copy(MSTSWagon copy)
12401242
DynamicBrakeAutoBailOff = locoCopy.DynamicBrakeAutoBailOff;
12411243
DynamicBrakePartialBailOff = locoCopy.DynamicBrakePartialBailOff;
12421244
DynamicBrakeEngineBrakeReplacement = locoCopy.DynamicBrakeEngineBrakeReplacement;
1245+
DynamicBrakeEngineBrakeReplacementSpeed = locoCopy.DynamicBrakeEngineBrakeReplacementSpeed;
12431246
DynamicBrakeMaxCurrentA = locoCopy.DynamicBrakeMaxCurrentA;
12441247
DynamicBrakeSpeed1MpS = locoCopy.DynamicBrakeSpeed1MpS;
12451248
DynamicBrakeSpeed2MpS = locoCopy.DynamicBrakeSpeed2MpS;
@@ -1833,6 +1836,11 @@ public override void Initialize()
18331836
}
18341837
}
18351838

1839+
if (DynamicBrakeEngineBrakeReplacement && DynamicBrakeEngineBrakeReplacementSpeed == 0)
1840+
{
1841+
DynamicBrakeEngineBrakeReplacementSpeed = DynamicBrakeSpeed2MpS;
1842+
}
1843+
18361844
// Initialise track sanding parameters
18371845
if (MaxTrackSandBoxCapacityM3 == 0)
18381846
{

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1717,7 +1717,7 @@ public override void Update(float elapsedClockSeconds)
17171717
}
17181718
}
17191719
}
1720-
if (loco.DynamicBrakeEngineBrakeReplacement && loco.RemoteControlGroup == 0 && loco.AbsTractionSpeedMpS < loco.DynamicBrakeSpeed2MpS && loco.Train.LeadLocomotive is MSTSLocomotive lead && lead.TrainBrakeController.TrainDynamicBrakeIntervention > 0)
1720+
if (loco.DynamicBrakeEngineBrakeReplacement && loco.RemoteControlGroup == 0 && loco.AbsTractionSpeedMpS < loco.DynamicBrakeEngineBrakeReplacementSpeed && loco.Train.LeadLocomotive is MSTSLocomotive lead && lead.TrainBrakeController.TrainDynamicBrakeIntervention > 0)
17211721
{
17221722
var requiredBrakeForceN = loco.MaxDynamicBrakeForceN * lead.TrainBrakeController.TrainDynamicBrakeIntervention;
17231723
var reverseBlendingPressurePSI = Math.Min(Math.Max((requiredBrakeForceN - loco.DynamicBrakeForceN) / Car.FrictionBrakeBlendingMaxForceN * ReferencePressurePSI

0 commit comments

Comments
 (0)