Skip to content

Commit 50f4362

Browse files
authored
Merge pull request #646 from cesarBLG/brake-controller-mrp
Fix issue with brake controller pressure
2 parents 16d3fbc + 5d22bbe commit 50f4362

File tree

4 files changed

+19
-9
lines changed

4 files changed

+19
-9
lines changed

Source/Orts.Simulation/Simulation/Physics/Train.cs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3970,6 +3970,14 @@ public virtual void InitializeBrakes()
39703970
Simulator.Confirmer.Warning(CabControl.InitializeBrakes, CabSetting.Warn1);
39713971
return;
39723972
}
3973+
if (Simulator.Settings.VerboseConfigurationMessages && LeadLocomotiveIndex >= 0) // Check incompatibilities between brake control valves
3974+
{
3975+
MSTSLocomotive lead = (MSTSLocomotive)Cars[LeadLocomotiveIndex];
3976+
if (Cars.Any(x => (x as MSTSWagon).BrakeValve != lead.BrakeValve))
3977+
{
3978+
Trace.TraceInformation("Cars along the train have incompatible brake control valves");
3979+
}
3980+
}
39733981
UnconditionalInitializeBrakes();
39743982
return;
39753983
}

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

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -766,9 +766,11 @@ protected static void PropagateBrakeLinePressures(float elapsedClockSeconds, Tra
766766
// reduce pressure in lead brake line if brake pipe pressure is above equalising pressure - apply brakes
767767
else if (lead.BrakeSystem.BrakeLine1PressurePSI > train.EqualReservoirPressurePSIorInHg)
768768
{
769-
float ServiceVariationFactor = (1 - trainPipeTimeVariationS / serviceTimeFactor);
770-
ServiceVariationFactor = MathHelper.Clamp(ServiceVariationFactor, 0.05f, 1.0f); // Keep factor within acceptable limits - prevent value from going negative
771-
lead.BrakeSystem.BrakeLine1PressurePSI *= ServiceVariationFactor;
769+
float serviceVariationFactor = Math.Min(trainPipeTimeVariationS / serviceTimeFactor, 0.95f);
770+
float pressureDiffPSI = serviceTimeFactor * lead.BrakeSystem.BrakeLine1PressurePSI;
771+
if (lead.BrakeSystem.BrakeLine1PressurePSI > train.EqualReservoirPressurePSIorInHg)
772+
pressureDiffPSI = lead.BrakeSystem.BrakeLine1PressurePSI - train.EqualReservoirPressurePSIorInHg;
773+
lead.BrakeSystem.BrakeLine1PressurePSI -= pressureDiffPSI;
772774
}
773775
}
774776

Source/Orts.Simulation/Simulation/RollingStocks/SubSystems/Controllers/BrakeController.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -369,7 +369,7 @@ public void Initialize()
369369
Script.MainReservoirPressureBar = () =>
370370
{
371371
if (Locomotive.Train != null)
372-
return Bar.FromPSI(Locomotive.Train.BrakeLine2PressurePSI);
372+
return Bar.FromPSI(Locomotive.MainResPressurePSI);
373373
else
374374
return float.MaxValue;
375375
};

Source/Orts.Simulation/Simulation/RollingStocks/SubSystems/Controllers/MSTSBrakeController.cs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -124,13 +124,13 @@ public override void UpdatePressure(ref float pressureBar, float elapsedClockSec
124124
switch (type)
125125
{
126126
case ControllerState.Release:
127-
IncreasePressure(ref pressureBar, MaxPressureBar(), ReleaseRateBarpS(), elapsedClockSeconds);
127+
IncreasePressure(ref pressureBar, Math.Min(MaxPressureBar(), MainReservoirPressureBar()), ReleaseRateBarpS(), elapsedClockSeconds);
128128
DecreasePressure(ref pressureBar, MaxPressureBar(), OverchargeEliminationRateBarpS(), elapsedClockSeconds);
129129
epState = -1;
130130
break;
131131
case ControllerState.FullQuickRelease:
132132
case ControllerState.SMEReleaseStart:
133-
IncreasePressure(ref pressureBar, MaxPressureBar(), QuickReleaseRateBarpS(), elapsedClockSeconds);
133+
IncreasePressure(ref pressureBar, Math.Min(MaxPressureBar(), MainReservoirPressureBar()), QuickReleaseRateBarpS(), elapsedClockSeconds);
134134
DecreasePressure(ref pressureBar, MaxPressureBar(), OverchargeEliminationRateBarpS(), elapsedClockSeconds);
135135
epState = -1;
136136
break;
@@ -197,7 +197,7 @@ public override void UpdatePressure(ref float pressureBar, float elapsedClockSec
197197
x = MaxPressureBar() - MinReductionBar() * (1 - x) - FullServReductionBar() * x;
198198
DecreasePressure(ref pressureBar, x, ApplyRateBarpS(), elapsedClockSeconds);
199199
if (ForceControllerReleaseGraduated || notch.Type == ControllerState.EPApply)
200-
IncreasePressure(ref pressureBar, x, ReleaseRateBarpS(), elapsedClockSeconds);
200+
IncreasePressure(ref pressureBar, Math.Min(x, MainReservoirPressureBar()), ReleaseRateBarpS(), elapsedClockSeconds);
201201
}
202202
break;
203203
case ControllerState.GSelfLapH:
@@ -207,15 +207,15 @@ public override void UpdatePressure(ref float pressureBar, float elapsedClockSec
207207
x = MaxPressureBar() - MinReductionBar() * (1 - x) - FullServReductionBar() * x;
208208
DecreasePressure(ref pressureBar, x, ApplyRateBarpS(), elapsedClockSeconds);
209209
if (ForceControllerReleaseGraduated || notch.Type == ControllerState.GSelfLap)
210-
IncreasePressure(ref pressureBar, x, ReleaseRateBarpS(), elapsedClockSeconds);
210+
IncreasePressure(ref pressureBar, Math.Min(x, MainReservoirPressureBar()), ReleaseRateBarpS(), elapsedClockSeconds);
211211
break;
212212
case ControllerState.Emergency:
213213
pressureBar -= EmergencyRateBarpS() * elapsedClockSeconds;
214214
epState = 1;
215215
break;
216216
case ControllerState.Dummy:
217217
x = MaxPressureBar() - FullServReductionBar() * (notch.Smooth ? x : CurrentValue());
218-
IncreasePressure(ref pressureBar, x, ReleaseRateBarpS(), elapsedClockSeconds);
218+
IncreasePressure(ref pressureBar, Math.Min(x, MainReservoirPressureBar()), ReleaseRateBarpS(), elapsedClockSeconds);
219219
DecreasePressure(ref pressureBar, x, ApplyRateBarpS(), elapsedClockSeconds);
220220
epState = -1;
221221
break;

0 commit comments

Comments
 (0)