@@ -304,7 +304,7 @@ public override void Initialize(bool handbrakeOn, float maxPressurePSI, float fu
304304 if ( maxPressurePSI > 0 )
305305 ControlResPressurePSI = maxPressurePSI ;
306306 FullServPressurePSI = fullServPressurePSI ;
307- AutoCylPressurePSI = immediateRelease ? 0 : Math . Min ( ( maxPressurePSI - BrakeLine1PressurePSI ) * AuxCylVolumeRatio , MaxCylPressurePSI ) ;
307+ CylPressurePSI = AutoCylPressurePSI = immediateRelease ? 0 : Math . Min ( ( maxPressurePSI - BrakeLine1PressurePSI ) * AuxCylVolumeRatio , MaxCylPressurePSI ) ;
308308 AuxResPressurePSI = Math . Max ( TwoPipes ? maxPressurePSI : maxPressurePSI - AutoCylPressurePSI / AuxCylVolumeRatio , BrakeLine1PressurePSI ) ;
309309 if ( ( Car as MSTSWagon ) . EmergencyReservoirPresent )
310310 EmergResPressurePSI = Math . Max ( AuxResPressurePSI , maxPressurePSI ) ;
@@ -563,9 +563,9 @@ public override void Update(float elapsedClockSeconds)
563563 }
564564 else
565565 {
566- bool isolateAutoBrake = false ;
567566 if ( Car is MSTSLocomotive loco && loco . EngineType != TrainCar . EngineTypes . Control ) // TODO - Control cars ned to be linked to power suppy requirements.
568567 {
568+ float demandedPressurePSI = Math . Max ( AutoCylPressurePSI , BrakeLine3PressurePSI ) ;
569569 // if (Car is MSTSLocomotive loco && loco.LocomotivePowerSupply.MainPowerSupplyOn)
570570 if ( loco . LocomotivePowerSupply . MainPowerSupplyOn )
571571 {
@@ -595,47 +595,59 @@ public override void Update(float elapsedClockSeconds)
595595 var localBrakeForceN = loco . DynamicBrakeForceN + Math . Min ( CylPressurePSI / MaxCylPressurePSI , 1 ) * Car . MaxBrakeForceN ;
596596 if ( localBrakeForceN > requiredBrakeForceN - 0.15f * Car . MaxBrakeForceN )
597597 {
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
603600 {
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 ;
615602 }
603+ if ( demandedPressurePSI < BrakeLine3PressurePSI )
604+ demandedPressurePSI = BrakeLine3PressurePSI ;
616605 }
617606 }
618607 else if ( loco . DynamicBrakeAutoBailOff )
619608 {
620609 if ( loco . DynamicBrakeForceCurves == null )
621610 {
622- isolateAutoBrake = true ;
623- CylPressurePSI = BrakeLine3PressurePSI ;
611+ demandedPressurePSI = BrakeLine3PressurePSI ;
624612 }
625613 else
626614 {
627615 var dynforce = loco . DynamicBrakeForceCurves . Get ( 1.0f , loco . AbsSpeedMpS ) ;
628616 if ( ( loco . MaxDynamicBrakeForceN == 0 && dynforce > 0 ) || dynforce > loco . MaxDynamicBrakeForceN * 0.6 )
629617 {
630- isolateAutoBrake = true ;
631- CylPressurePSI = BrakeLine3PressurePSI ;
618+ demandedPressurePSI = BrakeLine3PressurePSI ;
632619 }
633620 }
634621 }
635622 }
636623 }
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 ) ;
637650 }
638- if ( ! isolateAutoBrake ) CylPressurePSI = Math . Max ( AutoCylPressurePSI , BrakeLine3PressurePSI ) ;
639651 }
640652
641653 // 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