Skip to content

Commit f71b978

Browse files
committed
Automatic merge of T1.5.1-797-gabb8eb9a4 and 14 pull requests
- Pull request #570 at 3539862: Experimental glTF 2.0 support with PBR lighting - Pull request #839 at d00beb9: First phase of https://blueprints.launchpad.net/or/+spec/additional-cruise-control-parameters - Pull request #876 at f92de76: docs: add source for documents previously on website to source Documentation folder - Pull request #882 at a055bca: Blueprint/train car operations UI window - Pull request #885 at 8f94333: feat: Add notifications to Menu - Pull request #886 at 6c0785b: Scene viewer extension to TrackViewer - Pull request #892 at 1f5ba4c: Signal Function OPP_SIG_ID_TRAINPATH - Pull request #896 at 5866028: First implementation of https://blueprints.launchpad.net/or/+spec/specific-sounds-for-ai-trains - Pull request #897 at 0a9d939: feat: Improved system information collection - Pull request #899 at 2092f63: Duplex steam engines - Booster Engine addition - Pull request #903 at 7353625: Downloading route content (Github, zip) - Pull request #907 at 9b0b04f: Bug fix for https://bugs.launchpad.net/or/+bug/2047300 Dynamic tracks disappear after long tunnel - Pull request #908 at 4b4afe3: feat: supports switching adhesion precisions - Pull request #909 at c3a572a: Correct Control Car crash bug
16 parents 40ac510 + abb8eb9 + 3539862 + d00beb9 + f92de76 + a055bca + 8f94333 + 6c0785b + 1f5ba4c + 5866028 + 0a9d939 + 2092f63 + 7353625 + 9b0b04f + 4b4afe3 + c3a572a commit f71b978

File tree

1 file changed

+94
-72
lines changed

1 file changed

+94
-72
lines changed

Source/Orts.Simulation/Simulation/RollingStocks/MSTSSteamLocomotive.cs

Lines changed: 94 additions & 72 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)