@@ -304,7 +304,7 @@ public override void Initialize(bool handbrakeOn, float maxPressurePSI, float fu
304
304
if ( maxPressurePSI > 0 )
305
305
ControlResPressurePSI = maxPressurePSI ;
306
306
FullServPressurePSI = fullServPressurePSI ;
307
- AutoCylPressurePSI = immediateRelease ? 0 : Math . Min ( ( maxPressurePSI - BrakeLine1PressurePSI ) * AuxCylVolumeRatio , MaxCylPressurePSI ) ;
307
+ CylPressurePSI = AutoCylPressurePSI = immediateRelease ? 0 : Math . Min ( ( maxPressurePSI - BrakeLine1PressurePSI ) * AuxCylVolumeRatio , MaxCylPressurePSI ) ;
308
308
AuxResPressurePSI = Math . Max ( TwoPipes ? maxPressurePSI : maxPressurePSI - AutoCylPressurePSI / AuxCylVolumeRatio , BrakeLine1PressurePSI ) ;
309
309
if ( ( Car as MSTSWagon ) . EmergencyReservoirPresent )
310
310
EmergResPressurePSI = Math . Max ( AuxResPressurePSI , maxPressurePSI ) ;
@@ -563,9 +563,9 @@ public override void Update(float elapsedClockSeconds)
563
563
}
564
564
else
565
565
{
566
- bool isolateAutoBrake = false ;
567
566
if ( Car is MSTSLocomotive loco && loco . EngineType != TrainCar . EngineTypes . Control ) // TODO - Control cars ned to be linked to power suppy requirements.
568
567
{
568
+ float demandedPressurePSI = Math . Max ( AutoCylPressurePSI , BrakeLine3PressurePSI ) ;
569
569
// if (Car is MSTSLocomotive loco && loco.LocomotivePowerSupply.MainPowerSupplyOn)
570
570
if ( loco . LocomotivePowerSupply . MainPowerSupplyOn )
571
571
{
@@ -595,47 +595,59 @@ public override void Update(float elapsedClockSeconds)
595
595
var localBrakeForceN = loco . DynamicBrakeForceN + Math . Min ( CylPressurePSI / MaxCylPressurePSI , 1 ) * Car . MaxBrakeForceN ;
596
596
if ( localBrakeForceN > requiredBrakeForceN - 0.15f * Car . MaxBrakeForceN )
597
597
{
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
603
600
{
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 ;
615
602
}
603
+ if ( demandedPressurePSI < BrakeLine3PressurePSI )
604
+ demandedPressurePSI = BrakeLine3PressurePSI ;
616
605
}
617
606
}
618
607
else if ( loco . DynamicBrakeAutoBailOff )
619
608
{
620
609
if ( loco . DynamicBrakeForceCurves == null )
621
610
{
622
- isolateAutoBrake = true ;
623
- CylPressurePSI = BrakeLine3PressurePSI ;
611
+ demandedPressurePSI = BrakeLine3PressurePSI ;
624
612
}
625
613
else
626
614
{
627
615
var dynforce = loco . DynamicBrakeForceCurves . Get ( 1.0f , loco . AbsSpeedMpS ) ;
628
616
if ( ( loco . MaxDynamicBrakeForceN == 0 && dynforce > 0 ) || dynforce > loco . MaxDynamicBrakeForceN * 0.6 )
629
617
{
630
- isolateAutoBrake = true ;
631
- CylPressurePSI = BrakeLine3PressurePSI ;
618
+ demandedPressurePSI = BrakeLine3PressurePSI ;
632
619
}
633
620
}
634
621
}
635
622
}
636
623
}
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 ) ;
637
650
}
638
- if ( ! isolateAutoBrake ) CylPressurePSI = Math . Max ( AutoCylPressurePSI , BrakeLine3PressurePSI ) ;
639
651
}
640
652
641
653
// 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