@@ -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
@@ -553,36 +561,47 @@ public override void Update(float elapsedClockSeconds)
553
561
}
554
562
else
555
563
{
556
- bool bailoff = false ;
557
-
558
564
if ( Car is MSTSLocomotive loco && loco . EngineType != TrainCar . EngineTypes . Control ) // TODO - Control cars ned to be linked to power suppy requirements.
559
565
{
566
+ bool isolateAutoBrake = false ;
560
567
// if (Car is MSTSLocomotive loco && loco.LocomotivePowerSupply.MainPowerSupplyOn)
561
568
if ( loco . LocomotivePowerSupply . MainPowerSupplyOn )
562
569
{
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 ;
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
+ }
568
587
}
569
- else if ( loco . DynamicBrakeAutoBailOff && loco . DynamicBrakePercent > 0 && Car . MaxBrakeForceN > 0 )
588
+ if ( loco . DynamicBrakeAutoBailOff && loco . DynamicBrakePercent > 0 && Car . MaxBrakeForceN > 0 )
570
589
{
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 ) ;
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 ;
579
594
}
580
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 ) ;
581
604
}
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 ;
586
605
}
587
606
588
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