@@ -114,6 +114,7 @@ public override void InitializeFromCopy(BrakeSystem copy)
114114 AuxBrakeLineVolumeRatio = thiscopy . AuxBrakeLineVolumeRatio ;
115115 EmergResVolumeM3 = thiscopy . EmergResVolumeM3 ;
116116 BrakePipeVolumeM3 = thiscopy . BrakePipeVolumeM3 ;
117+ CylVolumeM3 = thiscopy . CylVolumeM3 ;
117118 RetainerPressureThresholdPSI = thiscopy . RetainerPressureThresholdPSI ;
118119 ReleaseRatePSIpS = thiscopy . ReleaseRatePSIpS ;
119120 MaxReleaseRatePSIpS = thiscopy . MaxReleaseRatePSIpS ;
@@ -258,6 +259,7 @@ public override void Parse(string lowercasetoken, STFReader stf)
258259 case "wagon(ortsbrakerelayvalveapplicationrate" : RelayValveApplicationRatePSIpS = stf . ReadFloatBlock ( STFReader . UNITS . PressureRateDefaultPSIpS , null ) ; break ;
259260 case "wagon(ortsbrakerelayvalvereleaserate" : RelayValveReleaseRatePSIpS = stf . ReadFloatBlock ( STFReader . UNITS . PressureRateDefaultPSIpS , null ) ; break ;
260261 case "wagon(ortsmaxtriplevalvecylinderpressure" : MaxTripleValveCylPressurePSI = stf . ReadFloatBlock ( STFReader . UNITS . PressureDefaultPSI , null ) ; break ;
262+ case "wagon(ortsbrakecylindervolume" : CylVolumeM3 = Me3 . FromFt3 ( stf . ReadFloatBlock ( STFReader . UNITS . VolumeDefaultFT3 , null ) ) ; break ;
261263 }
262264 }
263265
@@ -280,7 +282,6 @@ public override void Save(BinaryWriter outf)
280282 outf . Write ( AngleCockBOpen ) ;
281283 outf . Write ( BleedOffValveOpen ) ;
282284 outf . Write ( ( int ) HoldingValve ) ;
283- outf . Write ( CylVolumeM3 ) ;
284285 }
285286
286287 public override void Restore ( BinaryReader inf )
@@ -302,7 +303,6 @@ public override void Restore(BinaryReader inf)
302303 AngleCockBOpen = inf . ReadBoolean ( ) ;
303304 BleedOffValveOpen = inf . ReadBoolean ( ) ;
304305 HoldingValve = ( ValveState ) inf . ReadInt32 ( ) ;
305- CylVolumeM3 = inf . ReadSingle ( ) ;
306306 }
307307
308308 public override void Initialize ( bool handbrakeOn , float maxPressurePSI , float fullServPressurePSI , bool immediateRelease )
@@ -351,7 +351,7 @@ public override void Initialize(bool handbrakeOn, float maxPressurePSI, float fu
351351 else
352352 AuxBrakeLineVolumeRatio = 3.1f ;
353353
354- CylVolumeM3 = EmergResVolumeM3 / EmergAuxVolumeRatio / AuxCylVolumeRatio ;
354+ if ( CylVolumeM3 == 0 ) CylVolumeM3 = EmergResVolumeM3 / EmergAuxVolumeRatio / AuxCylVolumeRatio ;
355355
356356 RelayValveFitted |= ( loco != null && ( loco . DynamicBrakeAutoBailOff || loco . DynamicBrakePartialBailOff ) ) || ( Car as MSTSWagon ) . BrakeValve == MSTSWagon . BrakeValveType . DistributingValve ;
357357 }
@@ -661,11 +661,21 @@ public override void Update(float elapsedClockSeconds)
661661 float dp = elapsedClockSeconds * RelayValveApplicationRatePSIpS ;
662662 if ( dp > demandedPressurePSI - CylPressurePSI )
663663 dp = demandedPressurePSI - CylPressurePSI ;
664- if ( TwoPipes )
664+
665+ // TODO: Implement a brake reservoir which keeps some air available in case of main reservoir leakage
666+ // Currently we drain from the main reservoir directly
667+ if ( loco != null )
665668 {
666- if ( BrakeLine2PressurePSI - dp * AuxBrakeLineVolumeRatio / AuxCylVolumeRatio < CylPressurePSI + dp )
667- dp = ( BrakeLine2PressurePSI - CylPressurePSI ) / ( 1 + AuxBrakeLineVolumeRatio / AuxCylVolumeRatio ) ;
668- BrakeLine2PressurePSI -= dp * AuxBrakeLineVolumeRatio / AuxCylVolumeRatio ;
669+ float volumeRatio = CylVolumeM3 / loco . MainResVolumeM3 ;
670+ if ( loco . MainResPressurePSI - dp * volumeRatio < CylPressurePSI + dp )
671+ dp = ( loco . MainResPressurePSI - CylPressurePSI ) / ( 1 + volumeRatio ) ;
672+ loco . MainResPressurePSI -= dp * volumeRatio ;
673+ }
674+ else if ( TwoPipes )
675+ {
676+ if ( BrakeLine2PressurePSI - dp * CylVolumeM3 / BrakePipeVolumeM3 < CylPressurePSI + dp )
677+ dp = ( BrakeLine2PressurePSI - CylPressurePSI ) / ( 1 + CylVolumeM3 / BrakePipeVolumeM3 ) ;
678+ BrakeLine2PressurePSI -= dp * CylVolumeM3 / BrakePipeVolumeM3 ;
669679 }
670680 if ( MaxCylPressurePSI < CylPressurePSI + dp )
671681 dp = MaxCylPressurePSI - CylPressurePSI ;
0 commit comments