Skip to content

Commit 05d16ce

Browse files
committed
adjustment to track sanding calculations
1 parent 1dea28c commit 05d16ce

File tree

2 files changed

+72
-38
lines changed

2 files changed

+72
-38
lines changed

Source/Orts.Simulation/Simulation/RollingStocks/MSTSLocomotive.cs

Lines changed: 65 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -251,9 +251,13 @@ public enum SlipControlType
251251

252252
// parameters for Track Sander based upon compressor air and abrasive table for 1/2" sand blasting nozzle @ 50psi
253253
public float MaxTrackSandBoxCapacityM3; // Capacity of sandbox
254-
public float CurrentTrackSandBoxCapacityM3;
255-
public float TrackSanderAirComsumptionM3pS;
256-
public float TrackSanderSandConsumptionM3pS;
254+
public float TrackSanderAirComsumptionForwardM3pS;
255+
public float TrackSanderAirComsumptionReverseM3pS = 0;
256+
public float TrackSanderSandConsumptionForwardM3pS;
257+
public float CurrentTrackSanderAirConsumptionM3pS;
258+
public float CurrentTrackSanderSandConsumptionM3pS;
259+
public float CurrentTrackSandBoxCapacityM3;
260+
public float TrackSanderSandConsumptionReverseM3pS = 0;
257261
public float SandWeightKgpM3 = 1600; // One cubic metre of sand weighs about 1.54-1.78 tonnes.
258262
public float TrackSanderSteamConsumptionForwardLbpS;
259263
public float TrackSanderSteamConsumptionReverseLbpS;
@@ -1141,14 +1145,25 @@ public override void Parse(string lowercasetoken, STFReader stf)
11411145
case "engine(ortswaterscoopdepth": WaterScoopDepthM = stf.ReadFloatBlock(STFReader.UNITS.Distance, 0.0f); break;
11421146
case "engine(ortswaterscoopwidth": WaterScoopWidthM = stf.ReadFloatBlock(STFReader.UNITS.Distance, 0.0f); break;
11431147
// Convert the following default ft^3 to Me^3 units
1144-
case "engine(ortsmaxtracksanderboxcapacity": MaxTrackSandBoxCapacityM3 = stf.ReadFloatBlock(STFReader.UNITS.VolumeDefaultFT3, null);
1148+
case "engine(ortsmaxtracksanderboxcapacity":
1149+
MaxTrackSandBoxCapacityM3 = stf.ReadFloatBlock(STFReader.UNITS.VolumeDefaultFT3, null);
11451150
MaxTrackSandBoxCapacityM3 = Me3.FromFt3(MaxTrackSandBoxCapacityM3);
11461151
break;
1147-
case "engine(ortsmaxtracksandersandconsumption": Me3.FromFt3( TrackSanderSandConsumptionM3pS = stf.ReadFloatBlock(STFReader.UNITS.VolumeDefaultFT3, null) );
1148-
TrackSanderSandConsumptionM3pS = Me3.FromFt3(TrackSanderSandConsumptionM3pS);
1152+
case "engine(ortsmaxtracksandersandconsumptionforward":
1153+
Me3.FromFt3( TrackSanderSandConsumptionForwardM3pS = stf.ReadFloatBlock(STFReader.UNITS.VolumeDefaultFT3, null) );
1154+
TrackSanderSandConsumptionForwardM3pS = Me3.FromFt3(TrackSanderSandConsumptionForwardM3pS);
11491155
break;
1150-
case "engine(ortsmaxtracksanderairconsumption": Me3.FromFt3( TrackSanderAirComsumptionM3pS = stf.ReadFloatBlock(STFReader.UNITS.VolumeDefaultFT3, null) );
1151-
TrackSanderAirComsumptionM3pS = Me3.FromFt3(TrackSanderAirComsumptionM3pS);
1156+
case "engine(ortsmaxtracksandersandconsumptionreverse":
1157+
Me3.FromFt3(TrackSanderSandConsumptionReverseM3pS = stf.ReadFloatBlock(STFReader.UNITS.VolumeDefaultFT3, null));
1158+
TrackSanderSandConsumptionReverseM3pS = Me3.FromFt3(TrackSanderSandConsumptionReverseM3pS);
1159+
break;
1160+
case "engine(ortsmaxtracksanderairconsumptionforward":
1161+
Me3.FromFt3( TrackSanderAirComsumptionForwardM3pS = stf.ReadFloatBlock(STFReader.UNITS.VolumeDefaultFT3, null) );
1162+
TrackSanderAirComsumptionForwardM3pS = Me3.FromFt3(TrackSanderAirComsumptionForwardM3pS);
1163+
break;
1164+
case "engine(ortsmaxtracksanderairconsumptionreverse":
1165+
Me3.FromFt3(TrackSanderAirComsumptionReverseM3pS = stf.ReadFloatBlock(STFReader.UNITS.VolumeDefaultFT3, null));
1166+
TrackSanderAirComsumptionReverseM3pS = Me3.FromFt3(TrackSanderAirComsumptionReverseM3pS);
11521167
break;
11531168
case "engine(ortscruisecontrol": SetUpCruiseControl(stf); break;
11541169
case "engine(ortsmultipositioncontroller": SetUpMPC(stf); break;
@@ -1206,8 +1221,10 @@ public override void Copy(MSTSWagon copy)
12061221
SanderSpeedEffectUpToMpS = locoCopy.SanderSpeedEffectUpToMpS;
12071222
SanderSpeedOfMpS = locoCopy.SanderSpeedOfMpS;
12081223
MaxTrackSandBoxCapacityM3 = locoCopy.MaxTrackSandBoxCapacityM3;
1209-
TrackSanderSandConsumptionM3pS = locoCopy.TrackSanderSandConsumptionM3pS;
1210-
TrackSanderAirComsumptionM3pS = locoCopy.TrackSanderAirComsumptionM3pS;
1224+
TrackSanderSandConsumptionForwardM3pS = locoCopy.TrackSanderSandConsumptionForwardM3pS;
1225+
TrackSanderSandConsumptionReverseM3pS = locoCopy.TrackSanderSandConsumptionReverseM3pS;
1226+
TrackSanderAirComsumptionForwardM3pS = locoCopy.TrackSanderAirComsumptionForwardM3pS;
1227+
TrackSanderAirComsumptionReverseM3pS = locoCopy.TrackSanderAirComsumptionReverseM3pS;
12111228
PowerOnDelayS = locoCopy.PowerOnDelayS;
12121229
DoesHornTriggerBell = locoCopy.DoesHornTriggerBell;
12131230
MaxSteamHeatPressurePSI = locoCopy.MaxSteamHeatPressurePSI;
@@ -1506,7 +1523,7 @@ public override void Initialize()
15061523
{
15071524
CurrentTrackSandBoxCapacityM3 = MaxTrackSandBoxCapacityM3;
15081525
}
1509-
1526+
15101527
// Ensure Drive Axles is set with a default value if user doesn't supply an OR value in ENG file
15111528
if (LocoNumDrvAxles == 0)
15121529
{
@@ -1756,14 +1773,14 @@ public override void Initialize()
17561773
MaxTrackSandBoxCapacityM3 = Me3.FromFt3(40.0f); // Capacity of sandbox - assume 40.0 cu ft
17571774
}
17581775

1759-
if (TrackSanderAirComsumptionM3pS == 0)
1776+
if (TrackSanderAirComsumptionForwardM3pS == 0)
17601777
{
1761-
TrackSanderAirComsumptionM3pS = Me3.FromFt3(195.0f) / 60.0f; // Default value - cubic feet per min (CFM) 195 ft3/m
1778+
TrackSanderAirComsumptionForwardM3pS = Me3.FromFt3(56.0f) / 60.0f; // Default value - cubic feet per min (CFM) 28 ft3/m x 2 sanders @ 140 psi - convert to /sec values
17621779
}
17631780

1764-
if (TrackSanderSandConsumptionM3pS == 0)
1781+
if (TrackSanderSandConsumptionForwardM3pS == 0)
17651782
{
1766-
TrackSanderSandConsumptionM3pS = Me3.FromFt3(11.6f) / 3600.0f; // Default value - 11.6 ft3/h
1783+
TrackSanderSandConsumptionForwardM3pS = Me3.FromFt3(3.4f) / 3600.0f; // Default value - 1.7 ft3/h x 2 sanders @ 140 psi - convert to /sec values
17671784
}
17681785

17691786
if (TrackSanderSteamConsumptionForwardLbpS == 0 && SandingSystemType == SandingSystemTypes.Steam)
@@ -3244,24 +3261,12 @@ public virtual void UpdateFrictionCoefficient(float elapsedClockSeconds)
32443261

32453262
public void UpdateTrackSander(float elapsedClockSeconds)
32463263
{
3247-
// updates track sander in terms of sand usage and impact on air compressor
3248-
// The following assumptions have been made:
3249-
//
3264+
// updates track sander in terms of sand usage and impact on air compressor
3265+
// The following assumptions have been made:
3266+
//
32503267

32513268
if (Sander && AbsSpeedMpS < SanderSpeedOfMpS) // If sander switch is on, and not blocked by speed, adjust parameters
32523269
{
3253-
// Calculate sand consumption for sander
3254-
if (CurrentTrackSandBoxCapacityM3 > 0.0) // if sand still in sandbox then sanding is available
3255-
{
3256-
// Calculate consumption of sand, and drop in sand box level
3257-
float ActualSandConsumptionM3pS = pS.FrompH(TrackSanderSandConsumptionM3pS) * elapsedClockSeconds;
3258-
CurrentTrackSandBoxCapacityM3 -= ActualSandConsumptionM3pS;
3259-
CurrentTrackSandBoxCapacityM3 = MathHelper.Clamp(CurrentTrackSandBoxCapacityM3, 0.0f, MaxTrackSandBoxCapacityM3);
3260-
if (CurrentTrackSandBoxCapacityM3 == 0.0)
3261-
{
3262-
Simulator.Confirmer.Message(ConfirmLevel.Warning, Simulator.Catalog.GetString("Sand supply has been exhausted"));
3263-
}
3264-
}
32653270

32663271
// Calculate steam, air or gravity consumption for different sander modes
32673272
if (SandingSystemType == SandingSystemTypes.Steam)
@@ -3276,13 +3281,40 @@ public void UpdateTrackSander(float elapsedClockSeconds)
32763281
}
32773282

32783283
}
3279-
else
3284+
else // air consumption
32803285
{
3286+
float sandingAirConsumptionM3pS = 0.0f;
3287+
float sandingSandConsumptionM3pS = 0.0f;
3288+
3289+
if (Direction == Direction.Reverse)
3290+
{
3291+
sandingAirConsumptionM3pS = TrackSanderAirComsumptionReverseM3pS;
3292+
sandingSandConsumptionM3pS = TrackSanderSandConsumptionReverseM3pS;
3293+
}
3294+
else
3295+
{
3296+
sandingAirConsumptionM3pS = TrackSanderAirComsumptionForwardM3pS;
3297+
sandingSandConsumptionM3pS = TrackSanderSandConsumptionForwardM3pS;
3298+
}
3299+
32813300
// Calculate air consumption and change in main air reservoir pressure
3282-
float ActualAirConsumptionM3pS = pS.FrompM(TrackSanderAirComsumptionM3pS) * elapsedClockSeconds;
3283-
float SanderPressureDiffPSI = ActualAirConsumptionM3pS / Me3.ToFt3(MainResVolumeM3);
3301+
CurrentTrackSanderAirConsumptionM3pS = (MainResPressurePSI * MaxMainResPressurePSI) * pS.FrompM(sandingAirConsumptionM3pS) * elapsedClockSeconds;
3302+
float SanderPressureDiffPSI = CurrentTrackSanderAirConsumptionM3pS / Me3.ToFt3(MainResVolumeM3);
32843303
MainResPressurePSI -= SanderPressureDiffPSI;
32853304
MainResPressurePSI = MathHelper.Clamp(MainResPressurePSI, 0.001f, MaxMainResPressurePSI);
3305+
3306+
// Calculate sand consumption for sander
3307+
if (CurrentTrackSandBoxCapacityM3 > 0.0) // if sand still in sandbox then sanding is available
3308+
{
3309+
// Calculate consumption of sand, and drop in sand box level
3310+
CurrentTrackSanderSandConsumptionM3pS = (MainResPressurePSI * MaxMainResPressurePSI) * pS.FrompH(sandingSandConsumptionM3pS) * elapsedClockSeconds;
3311+
CurrentTrackSandBoxCapacityM3 -= CurrentTrackSanderSandConsumptionM3pS;
3312+
CurrentTrackSandBoxCapacityM3 = MathHelper.Clamp(CurrentTrackSandBoxCapacityM3, 0.0f, MaxTrackSandBoxCapacityM3);
3313+
if (CurrentTrackSandBoxCapacityM3 <= 0.0)
3314+
{
3315+
Simulator.Confirmer.Message(ConfirmLevel.Warning, Simulator.Catalog.GetString("Sand supply has been exhausted"));
3316+
}
3317+
}
32863318
}
32873319
}
32883320

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

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -8003,14 +8003,17 @@ public override string GetDebugStatus()
80038003
SteamEngines[i].CalculatedFactorOfAdhesion);
80048004
}
80058005

8006-
status.AppendFormat("{0}\t{1}\t{2}\t{3}\t{4:N2}\t{5}\t{6:N2}\n",
8006+
status.AppendFormat("{0}\t{1}\t{2:N2}\t{3}\t{4:N8}/{9}\t\t{5}\t{6:N3}/{9}\t{7}\t{8:N1}\n",
80078007
Simulator.Catalog.GetString("Sand:"),
8008-
Simulator.Catalog.GetString("S/Use"),
8009-
FormatStrings.FormatVolume(TrackSanderSandConsumptionM3pS, IsMetric),
80108008
Simulator.Catalog.GetString("S/Box"),
80118009
FormatStrings.FormatVolume(CurrentTrackSandBoxCapacityM3, IsMetric),
8010+
Simulator.Catalog.GetString("S/Use"),
8011+
FormatStrings.FormatVolume(pS.TopM(CurrentTrackSanderSandConsumptionM3pS), IsMetric),
8012+
Simulator.Catalog.GetString("A/Use"),
8013+
FormatStrings.FormatVolume(pS.TopM(CurrentTrackSanderAirConsumptionM3pS), IsMetric),
80128014
Simulator.Catalog.GetString("M/Press"),
8013-
MainResPressurePSI);
8015+
MainResPressurePSI,
8016+
FormatStrings.min);
80148017

80158018
status.AppendFormat("\n{0}\t{1}\t{2}\t{3}\t{4}\t{5}\t{6}\t{7}\t{8}\n",
80168019
Simulator.Catalog.GetString("CylE:"),
@@ -8023,7 +8026,6 @@ public override string GetDebugStatus()
80238026
Simulator.Catalog.GetString("#4"),
80248027
CylinderSteamExhaust4On ? Simulator.Catalog.GetString("Yes") : Simulator.Catalog.GetString("No")
80258028
);
8026-
80278029
}
80288030

80298031
#if DEBUG_STEAM_EFFECTS

0 commit comments

Comments
 (0)