@@ -517,36 +517,73 @@ public override void Update(float elapsedClockSeconds)
517517 if ( AutoCylPressurePSI < 0 )
518518 AutoCylPressurePSI = 0 ;
519519
520- bool bailoff = false ;
520+ if ( Car is MSTSLocomotive && ( Car as MSTSWagon ) . BrakeValve == MSTSWagon . BrakeValveType . DistributingValve )
521+ {
522+ // For distributing valves, we use AutoCylPressurePSI as "Application Chamber/Pipe" pressure
523+ // CylPressurePSI is the actual pressure applied to cylinders
524+ var loco = Car as MSTSLocomotive ;
525+ var engineBrakeStatus = loco . EngineBrakeController . Notches [ loco . EngineBrakeController . CurrentNotch ] . Type ;
526+ var trainBrakeStatus = loco . TrainBrakeController . Notches [ loco . TrainBrakeController . CurrentNotch ] . Type ;
527+ // BailOff
528+ if ( engineBrakeStatus == ControllerState . BailOff )
529+ {
530+ AutoCylPressurePSI -= MaxReleaseRatePSIpS * elapsedClockSeconds ;
531+ if ( AutoCylPressurePSI < 0 ) AutoCylPressurePSI = 0 ;
532+ }
533+ // Emergency application
534+ if ( trainBrakeStatus == ControllerState . Emergency )
535+ {
536+ float dp = elapsedClockSeconds * MaxApplicationRatePSIpS ;
537+ if ( dp > MaxCylPressurePSI - AutoCylPressurePSI )
538+ dp = MaxCylPressurePSI - AutoCylPressurePSI ;
539+ AutoCylPressurePSI += dp ;
540+ }
541+ // Release pipe open
542+ HoldingValve = engineBrakeStatus == ControllerState . Release && trainBrakeStatus == ControllerState . Release ? ValveState . Release : ValveState . Lap ;
543+
544+ // Independent air brake equalization
545+ if ( AutoCylPressurePSI < loco . Train . BrakeLine3PressurePSI )
546+ AutoCylPressurePSI = loco . Train . BrakeLine3PressurePSI ;
547+ else
548+ loco . Train . BrakeLine3PressurePSI = AutoCylPressurePSI ;
521549
522- if ( Car is MSTSLocomotive loco && loco . EngineType != TrainCar . EngineTypes . Control ) // TODO - Control cars ned to be linked to power suppy requirements.
550+ // Equalization between application chamber and brake cylinders
551+ // TODO: Drain air from main reservoir
552+ CylPressurePSI = AutoCylPressurePSI ;
553+ }
554+ else
523555 {
524- // if (Car is MSTSLocomotive loco && loco.LocomotivePowerSupply.MainPowerSupplyOn)
525- if ( loco . LocomotivePowerSupply . MainPowerSupplyOn )
556+ bool bailoff = false ;
557+
558+ if ( Car is MSTSLocomotive loco && loco . EngineType != TrainCar . EngineTypes . Control ) // TODO - Control cars ned to be linked to power suppy requirements.
526559 {
527- if ( loco . Train . LeadLocomotiveIndex >= 0 && ( ( MSTSLocomotive ) loco . Train . Cars [ loco . Train . LeadLocomotiveIndex ] ) . BailOff )
528- {
529- bailoff = true ;
530- CylPressurePSI -= MaxReleaseRatePSIpS * elapsedClockSeconds ;
531- if ( CylPressurePSI < 0 ) CylPressurePSI = 0 ;
532- }
533- else if ( loco . DynamicBrakeAutoBailOff && loco . DynamicBrakePercent > 0 && Car . MaxBrakeForceN > 0 )
560+ // if (Car is MSTSLocomotive loco && loco.LocomotivePowerSupply.MainPowerSupplyOn)
561+ if ( loco . LocomotivePowerSupply . MainPowerSupplyOn )
534562 {
535- bailoff = true ;
536- var requiredBrakeForce = Math . Min ( AutoCylPressurePSI / MaxCylPressurePSI , 1 ) * Car . MaxBrakeForceN ;
537- var airBrakeForce = requiredBrakeForce - loco . DynamicBrakeForceN ;
538- var requiredCylPressure = Math . Max ( Math . Min ( airBrakeForce / Car . MaxBrakeForceN * MaxCylPressurePSI , AutoCylPressurePSI ) , 0 ) ;
539- if ( requiredCylPressure > CylPressurePSI )
540- CylPressurePSI = Math . Min ( requiredCylPressure , CylPressurePSI + MaxApplicationRatePSIpS * elapsedClockSeconds ) ;
541- if ( requiredCylPressure < CylPressurePSI )
542- CylPressurePSI = Math . Max ( requiredCylPressure , CylPressurePSI - MaxReleaseRatePSIpS * elapsedClockSeconds ) ;
563+ if ( loco . Train . LeadLocomotiveIndex >= 0 && ( ( MSTSLocomotive ) loco . Train . Cars [ loco . Train . LeadLocomotiveIndex ] ) . BailOff )
564+ {
565+ bailoff = true ;
566+ CylPressurePSI -= MaxReleaseRatePSIpS * elapsedClockSeconds ;
567+ if ( CylPressurePSI < 0 ) CylPressurePSI = 0 ;
568+ }
569+ else if ( loco . DynamicBrakeAutoBailOff && loco . DynamicBrakePercent > 0 && Car . MaxBrakeForceN > 0 )
570+ {
571+ bailoff = true ;
572+ var requiredBrakeForce = Math . Min ( AutoCylPressurePSI / MaxCylPressurePSI , 1 ) * Car . MaxBrakeForceN ;
573+ var airBrakeForce = requiredBrakeForce - loco . DynamicBrakeForceN ;
574+ var requiredCylPressure = Math . Max ( Math . Min ( airBrakeForce / Car . MaxBrakeForceN * MaxCylPressurePSI , AutoCylPressurePSI ) , 0 ) ;
575+ if ( requiredCylPressure > CylPressurePSI )
576+ CylPressurePSI = Math . Min ( requiredCylPressure , CylPressurePSI + MaxApplicationRatePSIpS * elapsedClockSeconds ) ;
577+ if ( requiredCylPressure < CylPressurePSI )
578+ CylPressurePSI = Math . Max ( requiredCylPressure , CylPressurePSI - MaxReleaseRatePSIpS * elapsedClockSeconds ) ;
579+ }
543580 }
544581 }
582+ if ( ! bailoff )
583+ CylPressurePSI = AutoCylPressurePSI ;
584+ if ( CylPressurePSI < BrakeLine3PressurePSI ) // Brake Cylinder pressure will be the greater of engine brake pressure or train brake pressure
585+ CylPressurePSI = BrakeLine3PressurePSI ;
545586 }
546- if ( ! bailoff )
547- CylPressurePSI = AutoCylPressurePSI ;
548- if ( CylPressurePSI < BrakeLine3PressurePSI ) // Brake Cylinder pressure will be the greater of engine brake pressure or train brake pressure
549- CylPressurePSI = BrakeLine3PressurePSI ;
550587
551588 // 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
552589 // dump valves. When axle rotations which are sensed electrically, differ by a predetermined speed the dump valves are operated releasing brake cylinder pressure to both axles of the affected
0 commit comments