@@ -50,6 +50,7 @@ public class AirSinglePipe : MSTSBrakeSystem
5050 protected float MaxApplicationRatePSIpS = .9f ;
5151 protected float MaxAuxilaryChargingRatePSIpS = 1.684f ;
5252 protected float BrakeInsensitivityPSIpS = 0 ;
53+ protected float EmergencyValveActuationRatePSIpS = 0 ;
5354 protected float EmergResChargingRatePSIpS = 1.684f ;
5455 protected float EmergAuxVolumeRatio = 1.4f ;
5556 protected string DebugType = string . Empty ;
@@ -62,6 +63,7 @@ public class AirSinglePipe : MSTSBrakeSystem
6263 protected float SoundTriggerCounter = 0 ;
6364 protected float prevCylPressurePSI = 0f ;
6465 protected float prevBrakePipePressurePSI = 0f ;
66+ protected float prevBrakePipePressurePSI_sound = 0f ;
6567 protected bool BailOffOn ;
6668
6769
@@ -113,6 +115,7 @@ public override void InitializeFromCopy(BrakeSystem copy)
113115 MaxApplicationRatePSIpS = thiscopy . MaxApplicationRatePSIpS ;
114116 MaxAuxilaryChargingRatePSIpS = thiscopy . MaxAuxilaryChargingRatePSIpS ;
115117 BrakeInsensitivityPSIpS = thiscopy . BrakeInsensitivityPSIpS ;
118+ EmergencyValveActuationRatePSIpS = thiscopy . EmergencyValveActuationRatePSIpS ;
116119 EmergResChargingRatePSIpS = thiscopy . EmergResChargingRatePSIpS ;
117120 EmergAuxVolumeRatio = thiscopy . EmergAuxVolumeRatio ;
118121 TwoPipes = thiscopy . TwoPipes ;
@@ -250,6 +253,7 @@ public override void Parse(string lowercasetoken, STFReader stf)
250253 // OpenRails specific parameters
251254 case "wagon(brakepipevolume" : BrakePipeVolumeM3 = Me3 . FromFt3 ( stf . ReadFloatBlock ( STFReader . UNITS . VolumeDefaultFT3 , null ) ) ; break ;
252255 case "wagon(ortsbrakeinsensitivity" : BrakeInsensitivityPSIpS = stf . ReadFloatBlock ( STFReader . UNITS . PressureRateDefaultPSIpS , null ) ; break ;
256+ case "wagon(ortsemergencyvalveactuationrate" : EmergencyValveActuationRatePSIpS = stf . ReadFloatBlock ( STFReader . UNITS . PressureRateDefaultPSIpS , 15f ) ; break ;
253257 }
254258 }
255259
@@ -349,20 +353,37 @@ public override void LocoInitializeMoving() // starting conditions when starting
349353 {
350354 }
351355
352- public virtual void UpdateTripleValveState ( float targetPressurePSI )
356+ public void UpdateTripleValveState ( float elapsedClockSeconds )
353357 {
354- if ( BrakeLine1PressurePSI < FullServPressurePSI - 1 )
355- TripleValveState = ValveState . Emergency ;
356- else if ( BrakeLine1PressurePSI > AuxResPressurePSI + 1 )
357- TripleValveState = ValveState . Release ;
358- else if ( TripleValveState == ValveState . Emergency && BrakeLine1PressurePSI > AuxResPressurePSI )
359- TripleValveState = ValveState . Release ;
360- else if ( ControlResPressurePSI > 70 && BrakeLine1PressurePSI > ControlResPressurePSI * 0.97f ) // UIC regulation: for 5 bar systems, release if > 4.85 bar
361- TripleValveState = ValveState . Release ;
362- else if ( TripleValveState != ValveState . Emergency && BrakeLine1PressurePSI < AuxResPressurePSI - 1 )
363- TripleValveState = ValveState . Apply ;
364- else if ( TripleValveState == ValveState . Apply && BrakeLine1PressurePSI >= AuxResPressurePSI )
365- TripleValveState = ValveState . Lap ;
358+ if ( ( Car as MSTSWagon ) . DistributorPresent )
359+ {
360+ float targetPressurePSI = ( ControlResPressurePSI - BrakeLine1PressurePSI ) * AuxCylVolumeRatio ;
361+ if ( targetPressurePSI > AutoCylPressurePSI && ( prevBrakePipePressurePSI - BrakeLine1PressurePSI ) > Math . Max ( elapsedClockSeconds , 0.0001f ) * EmergencyValveActuationRatePSIpS )
362+ TripleValveState = ValveState . Emergency ;
363+ else if ( targetPressurePSI < AutoCylPressurePSI - ( TripleValveState != ValveState . Release ? 2.2f : 0f )
364+ || targetPressurePSI < 2.2f ) // The latter is a UIC regulation (0.15 bar)
365+ TripleValveState = ValveState . Release ;
366+ else if ( ! BailOffOn && TripleValveState != ValveState . Emergency && targetPressurePSI > AutoCylPressurePSI + ( TripleValveState != ValveState . Apply ? 2.2f : 0f ) )
367+ TripleValveState = ValveState . Apply ;
368+ else
369+ TripleValveState = ValveState . Lap ;
370+ }
371+ else
372+ {
373+ if ( BrakeLine1PressurePSI < AuxResPressurePSI - 1 && ( prevBrakePipePressurePSI - BrakeLine1PressurePSI ) > Math . Max ( elapsedClockSeconds , 0.0001f ) * EmergencyValveActuationRatePSIpS )
374+ TripleValveState = ValveState . Emergency ;
375+ else if ( BrakeLine1PressurePSI > AuxResPressurePSI + 1 )
376+ TripleValveState = ValveState . Release ;
377+ else if ( TripleValveState == ValveState . Emergency && BrakeLine1PressurePSI > AuxResPressurePSI )
378+ TripleValveState = ValveState . Release ;
379+ else if ( ControlResPressurePSI > 70 && BrakeLine1PressurePSI > ControlResPressurePSI * 0.97f ) // UIC regulation: for 5 bar systems, release if > 4.85 bar
380+ TripleValveState = ValveState . Release ;
381+ else if ( TripleValveState != ValveState . Emergency && BrakeLine1PressurePSI < AuxResPressurePSI - 1 )
382+ TripleValveState = ValveState . Apply ;
383+ else if ( TripleValveState == ValveState . Apply && BrakeLine1PressurePSI >= AuxResPressurePSI )
384+ TripleValveState = ValveState . Lap ;
385+ }
386+ prevBrakePipePressurePSI = BrakeLine1PressurePSI ;
366387 }
367388
368389 public override void Update ( float elapsedClockSeconds )
@@ -393,15 +414,15 @@ public override void Update(float elapsedClockSeconds)
393414 }
394415 }
395416 else
396- UpdateTripleValveState ( threshold ) ;
417+ UpdateTripleValveState ( elapsedClockSeconds ) ;
397418
398419 // triple valve is set to charge the brake cylinder
399420 if ( ( TripleValveState == ValveState . Apply || TripleValveState == ValveState . Emergency ) && ! Car . WheelBrakeSlideProtectionActive )
400421 {
401422 float dp = elapsedClockSeconds * MaxApplicationRatePSIpS ;
402423 if ( AuxResPressurePSI - dp / AuxCylVolumeRatio < AutoCylPressurePSI + dp )
403424 dp = ( AuxResPressurePSI - AutoCylPressurePSI ) * AuxCylVolumeRatio / ( 1 + AuxCylVolumeRatio ) ;
404- if ( ( Car as MSTSWagon ) . DistributorPresent && dp > threshold - AutoCylPressurePSI )
425+ if ( ( Car as MSTSWagon ) . DistributorPresent && TripleValveState != ValveState . Emergency && dp > threshold - AutoCylPressurePSI )
405426 dp = threshold - AutoCylPressurePSI ;
406427 if ( AutoCylPressurePSI + dp > MaxCylPressurePSI )
407428 dp = MaxCylPressurePSI - AutoCylPressurePSI ;
@@ -469,9 +490,12 @@ public override void Update(float elapsedClockSeconds)
469490 float minCylPressurePSI = Math . Max ( threshold , RetainerPressureThresholdPSI ) ;
470491 if ( TripleValveState == ValveState . Release && HoldingValve == ValveState . Release && AutoCylPressurePSI > minCylPressurePSI )
471492 {
472- AutoCylPressurePSI -= elapsedClockSeconds * ReleaseRatePSIpS ;
473- if ( AutoCylPressurePSI < minCylPressurePSI )
474- AutoCylPressurePSI = minCylPressurePSI ;
493+ float dp = elapsedClockSeconds * ReleaseRatePSIpS ;
494+ if ( AutoCylPressurePSI - dp < minCylPressurePSI )
495+ dp = AutoCylPressurePSI - minCylPressurePSI ;
496+ if ( dp < 0 )
497+ dp = 0 ;
498+ AutoCylPressurePSI -= dp ;
475499 }
476500
477501 // Charge Auxiliary reservoir for MRP
@@ -616,11 +640,11 @@ public override void Update(float elapsedClockSeconds)
616640 Car . SignalEvent ( Event . TrainBrakePressureStoppedChanging ) ;
617641 }
618642
619- if ( Math . Abs ( BrakeLine1PressurePSI - prevBrakePipePressurePSI ) > 0.1f /*BrakeLine1PressurePSI > prevBrakePipePressurePSI*/ )
643+ if ( Math . Abs ( BrakeLine1PressurePSI - prevBrakePipePressurePSI_sound ) > 0.1f /*BrakeLine1PressurePSI > prevBrakePipePressurePSI*/ )
620644 {
621645 if ( ! BrakePipePressureChanging )
622646 {
623- if ( BrakeLine1PressurePSI > prevBrakePipePressurePSI )
647+ if ( BrakeLine1PressurePSI > prevBrakePipePressurePSI_sound )
624648 Car . SignalEvent ( Event . BrakePipePressureIncrease ) ;
625649 else
626650 Car . SignalEvent ( Event . BrakePipePressureDecrease ) ;
@@ -634,7 +658,7 @@ public override void Update(float elapsedClockSeconds)
634658 Car . SignalEvent ( Event . BrakePipePressureStoppedChanging ) ;
635659 }
636660 prevCylPressurePSI = AutoCylPressurePSI ;
637- prevBrakePipePressurePSI = BrakeLine1PressurePSI ;
661+ prevBrakePipePressurePSI_sound = BrakeLine1PressurePSI ;
638662
639663 var lead = Car as MSTSLocomotive ;
640664
0 commit comments