@@ -338,7 +338,8 @@ public override void LocoInitializeMoving() // starting conditions when starting
338
338
339
339
public void UpdateTripleValveState ( float elapsedClockSeconds )
340
340
{
341
- if ( ( Car as MSTSWagon ) . BrakeValve == MSTSWagon . BrakeValveType . Distributor )
341
+ var valveType = ( Car as MSTSWagon ) . BrakeValve ;
342
+ if ( valveType == MSTSWagon . BrakeValveType . Distributor )
342
343
{
343
344
float targetPressurePSI = ( ControlResPressurePSI - BrakeLine1PressurePSI ) * AuxCylVolumeRatio ;
344
345
if ( targetPressurePSI > AutoCylPressurePSI && EmergencyValveActuationRatePSIpS > 0 && ( prevBrakePipePressurePSI - BrakeLine1PressurePSI ) > Math . Max ( elapsedClockSeconds , 0.0001f ) * EmergencyValveActuationRatePSIpS )
@@ -351,7 +352,7 @@ public void UpdateTripleValveState(float elapsedClockSeconds)
351
352
else
352
353
TripleValveState = ValveState . Lap ;
353
354
}
354
- else
355
+ else if ( valveType == MSTSWagon . BrakeValveType . TripleValve || valveType == MSTSWagon . BrakeValveType . Distributor )
355
356
{
356
357
if ( BrakeLine1PressurePSI < AuxResPressurePSI - 1 && EmergencyValveActuationRatePSIpS > 0 && ( prevBrakePipePressurePSI - BrakeLine1PressurePSI ) > Math . Max ( elapsedClockSeconds , 0.0001f ) * EmergencyValveActuationRatePSIpS )
357
358
TripleValveState = ValveState . Emergency ;
@@ -364,6 +365,10 @@ public void UpdateTripleValveState(float elapsedClockSeconds)
364
365
else if ( TripleValveState == ValveState . Apply && BrakeLine1PressurePSI >= AuxResPressurePSI )
365
366
TripleValveState = ValveState . Lap ;
366
367
}
368
+ else
369
+ {
370
+ TripleValveState = ValveState . Release ;
371
+ }
367
372
prevBrakePipePressurePSI = BrakeLine1PressurePSI ;
368
373
}
369
374
@@ -423,13 +428,16 @@ public override void Update(float elapsedClockSeconds)
423
428
AuxResPressurePSI -= dp / AuxCylVolumeRatio ;
424
429
AutoCylPressurePSI += dp ;
425
430
426
- if ( TripleValveState == ValveState . Emergency && ( Car as MSTSWagon ) . EmergencyReservoirPresent )
431
+ if ( TripleValveState == ValveState . Emergency )
427
432
{
428
- dp = elapsedClockSeconds * MaxApplicationRatePSIpS ;
429
- if ( EmergResPressurePSI - dp < AuxResPressurePSI + dp * EmergAuxVolumeRatio )
430
- dp = ( EmergResPressurePSI - AuxResPressurePSI ) / ( 1 + EmergAuxVolumeRatio ) ;
431
- EmergResPressurePSI -= dp ;
432
- AuxResPressurePSI += dp * EmergAuxVolumeRatio ;
433
+ if ( ( Car as MSTSWagon ) . EmergencyReservoirPresent )
434
+ {
435
+ dp = elapsedClockSeconds * MaxApplicationRatePSIpS ;
436
+ if ( EmergResPressurePSI - dp < AuxResPressurePSI + dp * EmergAuxVolumeRatio )
437
+ dp = ( EmergResPressurePSI - AuxResPressurePSI ) / ( 1 + EmergAuxVolumeRatio ) ;
438
+ EmergResPressurePSI -= dp ;
439
+ AuxResPressurePSI += dp * EmergAuxVolumeRatio ;
440
+ }
433
441
}
434
442
}
435
443
@@ -525,15 +533,11 @@ public override void Update(float elapsedClockSeconds)
525
533
var engineBrakeStatus = loco . EngineBrakeController . Notches [ loco . EngineBrakeController . CurrentNotch ] . Type ;
526
534
var trainBrakeStatus = loco . TrainBrakeController . Notches [ loco . TrainBrakeController . CurrentNotch ] . Type ;
527
535
// BailOff
528
- if ( engineBrakeStatus == ControllerState . Release )
536
+ if ( engineBrakeStatus == ControllerState . BailOff )
529
537
{
530
538
AutoCylPressurePSI -= MaxReleaseRatePSIpS * elapsedClockSeconds ;
531
539
if ( AutoCylPressurePSI < 0 ) AutoCylPressurePSI = 0 ;
532
540
}
533
- // Independent air brake application
534
- if ( AutoCylPressurePSI < BrakeLine3PressurePSI )
535
- AutoCylPressurePSI = BrakeLine3PressurePSI ;
536
- BrakeLine3PressurePSI = AutoCylPressurePSI ;
537
541
// Emergency application
538
542
if ( trainBrakeStatus == ControllerState . Emergency )
539
543
{
@@ -543,43 +547,61 @@ public override void Update(float elapsedClockSeconds)
543
547
AutoCylPressurePSI += dp ;
544
548
}
545
549
// Release pipe open
546
- HoldingValve = engineBrakeStatus == ControllerState . Running && trainBrakeStatus == ControllerState . Release ? ValveState . Release : ValveState . Lap ;
550
+ HoldingValve = engineBrakeStatus == ControllerState . Release && trainBrakeStatus == ControllerState . Release ? ValveState . Release : ValveState . Lap ;
551
+
552
+ // Independent air brake equalization
553
+ if ( AutoCylPressurePSI < loco . Train . BrakeLine3PressurePSI )
554
+ AutoCylPressurePSI = loco . Train . BrakeLine3PressurePSI ;
555
+ else
556
+ loco . Train . BrakeLine3PressurePSI = AutoCylPressurePSI ;
557
+
547
558
// Equalization between application chamber and brake cylinders
548
559
// TODO: Drain air from main reservoir
549
560
CylPressurePSI = AutoCylPressurePSI ;
550
561
}
551
562
else
552
563
{
553
- bool bailoff = false ;
554
-
555
564
if ( Car is MSTSLocomotive loco && loco . EngineType != TrainCar . EngineTypes . Control ) // TODO - Control cars ned to be linked to power suppy requirements.
556
565
{
566
+ bool isolateAutoBrake = false ;
557
567
// if (Car is MSTSLocomotive loco && loco.LocomotivePowerSupply.MainPowerSupplyOn)
558
568
if ( loco . LocomotivePowerSupply . MainPowerSupplyOn )
559
569
{
560
- if ( loco . Train . LeadLocomotiveIndex >= 0 && ( ( MSTSLocomotive ) loco . Train . Cars [ loco . Train . LeadLocomotiveIndex ] ) . BailOff )
561
- {
562
- bailoff = true ;
563
- CylPressurePSI -= MaxReleaseRatePSIpS * elapsedClockSeconds ;
564
- if ( CylPressurePSI < 0 ) CylPressurePSI = 0 ;
570
+ if ( loco . Train . LeadLocomotiveIndex >= 0 )
571
+ {
572
+ var lead = loco . Train . Cars [ loco . Train . LeadLocomotiveIndex ] as MSTSLocomotive ;
573
+ if ( lead != null && ( lead . BailOff ||
574
+ ( lead . EngineBrakeController != null && lead . EngineBrakeController . CurrentNotch >= 0 && lead . EngineBrakeController . Notches [ lead . EngineBrakeController . CurrentNotch ] . Type == ControllerState . BailOff ) ) )
575
+ {
576
+ if ( loco . BrakeValve == MSTSWagon . BrakeValveType . Distributor )
577
+ {
578
+ ControlResPressurePSI = 0 ;
579
+ }
580
+ else
581
+ {
582
+ AutoCylPressurePSI -= MaxReleaseRatePSIpS * elapsedClockSeconds ;
583
+ if ( AutoCylPressurePSI < 0 )
584
+ AutoCylPressurePSI = 0 ;
585
+ }
586
+ }
565
587
}
566
- else if ( loco . DynamicBrakeAutoBailOff && loco . DynamicBrakePercent > 0 && Car . MaxBrakeForceN > 0 )
588
+ if ( loco . DynamicBrakeAutoBailOff && loco . DynamicBrakePercent > 0 && Car . MaxBrakeForceN > 0 )
567
589
{
568
- bailoff = true ;
569
- var requiredBrakeForce = Math . Min ( AutoCylPressurePSI / MaxCylPressurePSI , 1 ) * Car . MaxBrakeForceN ;
570
- var airBrakeForce = requiredBrakeForce - loco . DynamicBrakeForceN ;
571
- var requiredCylPressure = Math . Max ( Math . Min ( airBrakeForce / Car . MaxBrakeForceN * MaxCylPressurePSI , AutoCylPressurePSI ) , 0 ) ;
572
- if ( requiredCylPressure > CylPressurePSI )
573
- CylPressurePSI = Math . Min ( requiredCylPressure , CylPressurePSI + MaxApplicationRatePSIpS * elapsedClockSeconds ) ;
574
- if ( requiredCylPressure < CylPressurePSI )
575
- CylPressurePSI = Math . Max ( requiredCylPressure , CylPressurePSI - MaxReleaseRatePSIpS * elapsedClockSeconds ) ;
590
+ var requiredBrakeForceN = Math . Min ( AutoCylPressurePSI / MaxCylPressurePSI , 1 ) * Car . MaxBrakeForceN ;
591
+ var localBrakeForceN = loco . DynamicBrakeForceN + Math . Min ( BrakeLine3PressurePSI / MaxCylPressurePSI , 1 ) * Car . MaxBrakeForceN ;
592
+ if ( localBrakeForceN > requiredBrakeForceN * 0.85f )
593
+ isolateAutoBrake = true ;
576
594
}
577
595
}
596
+ if ( isolateAutoBrake )
597
+ CylPressurePSI = BrakeLine3PressurePSI ;
598
+ else
599
+ CylPressurePSI = Math . Max ( AutoCylPressurePSI , BrakeLine3PressurePSI ) ;
600
+ }
601
+ else
602
+ {
603
+ CylPressurePSI = Math . Max ( AutoCylPressurePSI , BrakeLine3PressurePSI ) ;
578
604
}
579
- if ( ! bailoff )
580
- CylPressurePSI = AutoCylPressurePSI ;
581
- if ( CylPressurePSI < BrakeLine3PressurePSI ) // Brake Cylinder pressure will be the greater of engine brake pressure or train brake pressure
582
- CylPressurePSI = BrakeLine3PressurePSI ;
583
605
}
584
606
585
607
// 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