@@ -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
0 commit comments