@@ -726,7 +726,7 @@ public float TenderCoalMassKG // Decreased by firing and increased
726726
727727 public float BoosterCylinderCockParticleDurationS;
728728
729-
729+ float BoosterSteamFraction;
730730 bool BoosterCylinderCocksOn = false;
731731
732732 public float BlowdownSteamVolumeM3pS;
@@ -2291,6 +2291,7 @@ public override void Update(float elapsedClockSeconds)
22912291 }
22922292 else if (SteamEngines[i].AuxiliarySteamEngineType == SteamEngine.AuxiliarySteamEngineTypes.Booster) // Booster Engine
22932293 {
2294+ // Air pressure must be greater then 70psi to ensure sufficient supply for the Booster engine
22942295 bool BoosterAirisLow = false;
22952296 if (MainResPressurePSI < 70)
22962297 {
@@ -2316,16 +2317,25 @@ public override void Update(float elapsedClockSeconds)
23162317 }
23172318
23182319 // Identify operating mode for the Booster
2320+ // There are xx modes of operation for the Booster Engine as follows:
2321+ // a) Booster disengaged - all air and steam supply off
2322+ // b) Idle mode - air supply on and Idle valve in Idle position
2323+ // c) Run mode (Gear not engaged) - booster engine starting to turn over, but no tractive force produced.
2324+ // d) Run mode (Gear engaged) - booster engine producing tractive force
2325+
23192326 // Idle mode
23202327 if (SteamBoosterAirOpen && !SteamBoosterIdle && !BoosterAirisLow)
23212328 {
23222329 SteamBoosterRunMode = false;
23232330 SteamBoosterIdleMode = true;
23242331 BoosterGearsEngaged = false;
2325- BoosterCylinderSteamExhaustOn = false;
2326- BoosterCylinderCocksOn = true;
2327- enginethrottle = 0.0f;
23282332 BoosterGearEngageTimerS = 0;
2333+ BoosterCylinderSteamExhaustOn = true;
2334+ BoosterCylinderCocksOn = true;
2335+ BoosterSteamFraction = 0.2f;
2336+ enginethrottle = 0.0f;
2337+
2338+ // Steam consumption based upon steam flow through choke
23292339
23302340 // Allow time for cylinders to heat up
23312341 if (!BoosterIdleHeatingTimerReset)
@@ -2337,53 +2347,72 @@ public override void Update(float elapsedClockSeconds)
23372347 BoosterIdleHeatingTimerS += elapsedClockSeconds;
23382348
23392349 // Booster needs to be idled (heated) for approx this period of time before engaging the gears in Run mode
2340- BoosterGearEngageTimePeriodS = BoosterIdleHeatingTimePeriodS + BoosterGearSyncTimePeriodS - BoosterIdleHeatingTimerS;
2350+ BoosterGearEngageTimePeriodS = BoosterIdleHeatingTimePeriodS + BoosterGearSyncTimePeriodS - BoosterIdleHeatingTimerS;
23412351 }
23422352
2343- // Trace.TraceInformation("Idle Mode - Timer {0} GearPeriod {1} Reset {2} BoosterHeating {3} Sync {4}", BoosterIdleHeatingTimerS, BoosterGearEngageTimePeriodS, BoosterIdleHeatingTimerReset, BoosterIdleHeatingTimePeriodS, BoosterGearSyncTimePeriodS);
2353+ // Trace.TraceInformation("Idle Mode - Timer {0} GearPeriod {1} Reset {2} BoosterHeating {3} Sync {4}", BoosterIdleHeatingTimerS, BoosterGearEngageTimePeriodS, BoosterIdleHeatingTimerReset, BoosterIdleHeatingTimePeriodS, BoosterGearSyncTimePeriodS);
23442354 }
2345- // Run mode
2346- else if (SteamBoosterAirOpen && SteamBoosterIdle && !BoosterAirisLow)
2355+ // Run mode - Gears not engaged
2356+ else if (SteamBoosterAirOpen && SteamBoosterIdle && !BoosterAirisLow && !BoosterGearsEngaged )
23472357 {
23482358 SteamBoosterIdleMode = false;
23492359 SteamBoosterRunMode = true;
23502360
2351- // Trace.TraceInformation("Run Mode - Timer {0} GearPeriod {1}", BoosterGearEngageTimeS, BoosterGearEngageTimePeriodS);
2361+ BoosterCylinderSteamExhaustOn = true;
2362+ BoosterCylinderCocksOn = true;
2363+ BoosterSteamFraction = 0.2f;
2364+ enginethrottle = 0;
2365+
2366+ // Steam consumption based upon steam flow through choke
2367+
2368+ // Trace.TraceInformation("Run Mode - Timer {0} GearPeriod {1}", BoosterGearEngageTimeS, BoosterGearEngageTimePeriodS);
23522369
2353- if (BoosterGearEngageTimerS > BoosterGearEngageTimePeriodS && SteamBoosterLatchedLocked && throttle > 0.01 ) // Booster gears engaged
2370+ if (!BoosterGearsEngaged && BoosterGearEngageTimerS > BoosterGearEngageTimePeriodS && SteamBoosterLatchedLocked && cutoff > SteamEngines[i].BoosterThrottleCutoff ) // Booster gears engaged
23542371 {
2355- enginethrottle = throttle;
2356- BoosterCylinderSteamExhaustOn = true;
2357- BoosterCylinderCocksOn = false;
23582372 BoosterGearsEngaged = true;
23592373 BoosterIdleHeatingTimerReset = false;
23602374 BoosterIdleHeatingTimerS = 0;
2361- // Trace.TraceInformation("Run Mode - " );
2375+ // Trace.TraceInformation("Run Mode - " );
23622376 }
2363- else // Booster gears have not engaged yet
2364- {
2365- BoosterCylinderSteamExhaustOn = false;
2366- BoosterCylinderCocksOn = true;
23672377 BoosterGearEngageTimerS += elapsedClockSeconds;
2368- }
23692378 }
2370- else if (SteamBoosterAirOpen && SteamBoosterIdle) // Move booster to run mode, but not latched
2379+ // Run mode - Gears engaged
2380+ else if (SteamBoosterAirOpen && SteamBoosterIdle && !BoosterAirisLow && BoosterGearsEngaged)
23712381 {
2372- BoosterCylinderSteamExhaustOn = false;
2373- BoosterCylinderCocksOn = true;
2382+ SteamBoosterIdleMode = false;
2383+ SteamBoosterRunMode = true;
2384+
2385+ if (SteamBoosterLatchedLocked && cutoff > SteamEngines[i].BoosterThrottleCutoff)
2386+ {
2387+ // Set values required for booster running
2388+ enginethrottle = throttle;
2389+ BoosterCylinderSteamExhaustOn = true;
2390+ BoosterCylinderCocksOn = false;
2391+ BoosterSteamFraction = throttle;
2392+ }
2393+ else // If booster is unlatched then disengage gears and drop back to "Run mode - Gears Disengaged".
2394+ {
2395+ BoosterGearsEngaged = false;
2396+ BoosterGearEngageTimerS = 0;
2397+
2398+ }
2399+
23742400 }
2375- else if (!SteamBoosterAirOpen || !SteamBoosterLatchedLocked) // Turn Booster off completely
2401+ // Turn Booster off completely
2402+ else if (!SteamBoosterAirOpen || BoosterAirisLow)
23762403 {
23772404 SteamBoosterRunMode = false;
23782405 SteamBoosterIdleMode = false;
23792406 BoosterCylinderSteamExhaustOn = false;
23802407 BoosterCylinderCocksOn = false;
23812408 enginethrottle = 0;
2382- BoosterGearEngageTimerS = 0;
23832409 BoosterIdleHeatingTimerReset = false;
23842410 BoosterCylinderSteamExhaustOn = false;
23852411 BoosterGearsEngaged = false;
2412+ BoosterGearEngageTimerS = 0;
23862413 BoosterIdleHeatingTimerS = 0;
2414+ BoosterSteamFraction = 0.0f;
2415+
23872416 }
23882417
23892418 UpdateCylinders(elapsedClockSeconds, enginethrottle, boostercutoff, absSpeedMpS, i);
@@ -2427,24 +2456,29 @@ public override void Update(float elapsedClockSeconds)
24272456
24282457 // Calculate steam pressure for booster steam gauge
24292458 if (SteamEngines[i].AuxiliarySteamEngineType == SteamEngine.AuxiliarySteamEngineTypes.Booster)
2430- {
2431- if (SteamBoosterRunMode && SteamEngines[i].LogSteamChestPressurePSI > PrevCabSteamBoosterPressurePSI)
2432- {
2433- CabSteamBoosterPressurePSI = SteamEngines[i].LogSteamChestPressurePSI;
2434- PrevCabSteamBoosterPressurePSI = CabSteamBoosterPressurePSI;
2435- }
2436- else if (SteamBoosterRunMode && SteamEngines[i].LogSteamChestPressurePSI < PrevCabSteamBoosterPressurePSI)
2459+ {
2460+ if (SteamBoosterRunMode && BoosterGearsEngaged)
2461+ // Run - gears engaged mode - Steam pressure will tend to steam chest (ie follows throttle) pressure
24372462 {
2438- var DesiredBoosterPressure = SteamEngines[i].LogSteamChestPressurePSI;
2439-
2440- if (DesiredBoosterPressure < PrevCabSteamBoosterPressurePSI)
2463+ if (SteamEngines[i].LogSteamChestPressurePSI > PrevCabSteamBoosterPressurePSI)
24412464 {
2442- CabSteamBoosterPressurePSI = PrevCabSteamBoosterPressurePSI - 1;
2443- CabSteamBoosterPressurePSI = MathHelper.Clamp(CabSteamBoosterPressurePSI, 0, MaxBoilerPressurePSI);
2465+ CabSteamBoosterPressurePSI = SteamEngines[i].LogSteamChestPressurePSI;
24442466 PrevCabSteamBoosterPressurePSI = CabSteamBoosterPressurePSI;
24452467 }
2468+ else if (SteamEngines[i].LogSteamChestPressurePSI < PrevCabSteamBoosterPressurePSI)
2469+ {
2470+ var DesiredBoosterPressure = SteamEngines[i].LogSteamChestPressurePSI;
2471+
2472+ if (DesiredBoosterPressure < PrevCabSteamBoosterPressurePSI)
2473+ {
2474+ CabSteamBoosterPressurePSI = PrevCabSteamBoosterPressurePSI - 1;
2475+ CabSteamBoosterPressurePSI = MathHelper.Clamp(CabSteamBoosterPressurePSI, 0, MaxBoilerPressurePSI);
2476+ PrevCabSteamBoosterPressurePSI = CabSteamBoosterPressurePSI;
2477+ }
2478+ }
24462479 }
2447- else if (SteamBoosterIdleMode)
2480+ else if (SteamBoosterIdleMode || (SteamBoosterRunMode && !BoosterGearsEngaged))
2481+ // Idle or Run - gears disengaged mode - Steam pressure will tend to preliminary steam gauge setting
24482482 {
24492483 var DesiredBoosterPressure = (BoosterIdleChokeSizeIn / BoosterMaxIdleChokeSizeIn) * BoilerPressurePSI;
24502484
@@ -2454,12 +2488,14 @@ public override void Update(float elapsedClockSeconds)
24542488 CabSteamBoosterPressurePSI = MathHelper.Clamp(CabSteamBoosterPressurePSI, 0, MaxBoilerPressurePSI);
24552489 PrevCabSteamBoosterPressurePSI = CabSteamBoosterPressurePSI;
24562490 }
2457- else
2491+ else if (DesiredBoosterPressure < PrevCabSteamBoosterPressurePSI)
24582492 {
2459- CabSteamBoosterPressurePSI = PrevCabSteamBoosterPressurePSI;
2493+ CabSteamBoosterPressurePSI = PrevCabSteamBoosterPressurePSI - 1;
2494+ CabSteamBoosterPressurePSI = MathHelper.Clamp(CabSteamBoosterPressurePSI, 0, MaxBoilerPressurePSI);
2495+ PrevCabSteamBoosterPressurePSI = CabSteamBoosterPressurePSI;
24602496 }
24612497 }
2462- else // Booster disabled
2498+ else // Booster disabled - Steam pressure = 0 or tends to 0
24632499 {
24642500 var DesiredBoosterPressure = 0;
24652501
@@ -2879,7 +2915,7 @@ private void UpdateFX(float elapsedClockSeconds)
28792915 {
28802916 var crankAngleDiffRad = BoosterWheelCrankAngleDiffRad[i];
28812917 float normalisedCrankAngleRad = NormalisedCrankAngle(i, crankAngleDiffRad);
2882-
2918+
28832919 // Exhaust crank angle
28842920 float exhaustCrankAngleRad = 0;
28852921 if (normalisedCrankAngleRad <= MathHelper.Pi)
@@ -2891,26 +2927,24 @@ private void UpdateFX(float elapsedClockSeconds)
28912927 exhaustCrankAngleRad = CylinderExhaustOpenFactor * (float)Math.PI + (float)Math.PI;
28922928 }
28932929
2894- if (absSpeedMpS > 0.001 )
2930+ if (i == 0 && ((normalisedCrankAngleRad <= MathHelper.Pi && normalisedCrankAngleRad >= exhaustCrankAngleRad) || (normalisedCrankAngleRad < 2 * MathHelper.Pi && normalisedCrankAngleRad >= exhaustCrankAngleRad)) )
28952931 {
2896- if (i == 0 && ((normalisedCrankAngleRad <= MathHelper.Pi && normalisedCrankAngleRad >= exhaustCrankAngleRad) || (normalisedCrankAngleRad < 2 * MathHelper.Pi && normalisedCrankAngleRad >= exhaustCrankAngleRad)))
2897- {
2898- BoosterCylinderSteamExhaust01On = true;
2899- }
2900- else if (i == 0)
2901- {
2902- BoosterCylinderSteamExhaust01On = false;
2903- }
2932+ BoosterCylinderSteamExhaust01On = true;
2933+ }
2934+ else if (i == 0)
2935+ {
2936+ BoosterCylinderSteamExhaust01On = false;
2937+ }
29042938
2905- else if (i == 1 && ((normalisedCrankAngleRad <= MathHelper.Pi && normalisedCrankAngleRad >= exhaustCrankAngleRad) || (normalisedCrankAngleRad < 2 * MathHelper.Pi && normalisedCrankAngleRad >= exhaustCrankAngleRad)))
2906- {
2907- BoosterCylinderSteamExhaust02On = true;
2908- }
2909- else if (i == 1)
2910- {
2911- BoosterCylinderSteamExhaust02On = false;
2912- }
2939+ else if (i == 1 && ((normalisedCrankAngleRad <= MathHelper.Pi && normalisedCrankAngleRad >= exhaustCrankAngleRad) || (normalisedCrankAngleRad < 2 * MathHelper.Pi && normalisedCrankAngleRad >= exhaustCrankAngleRad)))
2940+ {
2941+ BoosterCylinderSteamExhaust02On = true;
2942+ }
2943+ else if (i == 1)
2944+ {
2945+ BoosterCylinderSteamExhaust02On = false;
29132946 }
2947+
29142948 }
29152949 }
29162950
@@ -2995,23 +3029,11 @@ private void UpdateFX(float elapsedClockSeconds)
29953029 Cylinders2_21SteamVolumeM3pS = CylinderCock2_21On && CylinderCocksAreOpen && throttle > 0.0 && CylCockSteamUsageDisplayLBpS > 0.0 ? (10.0f * SteamEffectsFactor) : 0.0f;
29963030 Cylinders2_22SteamVolumeM3pS = CylinderCock2_22On && CylinderCocksAreOpen && throttle > 0.0 && CylCockSteamUsageDisplayLBpS > 0.0 ? (10.0f * SteamEffectsFactor) : 0.0f;
29973031
2998- // Booster Engine steam pressure
2999- float BoosterSteamFraction = 0;
3000-
3001- if (SteamBoosterIdleMode)
3002- {
3003- BoosterSteamFraction = 0.2f;
3004- }
3005- else
3006- {
3007- BoosterSteamFraction = throttle;
3008- }
3009-
30103032 // Booster Cylinder Steam Exhausts (automatic)
3011- BoosterCylinderSteamExhaust01SteamVolumeM3pS = throttle > 0.0 && BoosterCylinderSteamExhaustOn && BoosterCylinderSteamExhaust01On ? (10.0f * BoosterSteamFraction) : 0.0f;
3033+ BoosterCylinderSteamExhaust01SteamVolumeM3pS = BoosterCylinderSteamExhaustOn && BoosterCylinderSteamExhaust01On ? (10.0f * BoosterSteamFraction) : 0.0f;
30123034 BoosterCylinderSteamExhaust01SteamVelocityMpS = 100.0f;
30133035
3014- BoosterCylinderSteamExhaust02SteamVolumeM3pS = throttle > 0.0 && BoosterCylinderSteamExhaustOn && BoosterCylinderSteamExhaust02On ? (10.0f * BoosterSteamFraction) : 0.0f;
3036+ BoosterCylinderSteamExhaust02SteamVolumeM3pS = BoosterCylinderSteamExhaustOn && BoosterCylinderSteamExhaust02On ? (10.0f * BoosterSteamFraction) : 0.0f;
30153037 BoosterCylinderSteamExhaust02SteamVelocityMpS = 100.0f;
30163038
30173039 // Booster Cylinder Steam Cylinder Cocks (automatic)
0 commit comments