@@ -517,36 +517,73 @@ public override void Update(float elapsedClockSeconds)
517
517
if ( AutoCylPressurePSI < 0 )
518
518
AutoCylPressurePSI = 0 ;
519
519
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 ;
521
549
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
523
555
{
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.
526
559
{
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 )
534
562
{
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
+ }
543
580
}
544
581
}
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 ;
545
586
}
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 ;
550
587
551
588
// 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
552
589
// 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