Skip to content

Commit 13ab98b

Browse files
committed
Use correct rate units for parser
1 parent 8b5c27f commit 13ab98b

File tree

3 files changed

+45
-19
lines changed

3 files changed

+45
-19
lines changed

Source/Documentation/Manual/physics.rst

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1170,7 +1170,7 @@ the target demand. This can be tuned both for traction and dynamic braking by in
11701170
``ORTSTractiveForceRampDownToZeroRate``, ``ORTSDynamicBrakeForceRampUpRate``,
11711171
``ORTSDynamicBrakeForceRampDownRate`` and ``ORTSDynamicBrakeForceRampDownToZeroRate``
11721172
in the .eng file. The value of each parameter determines the force increase/decrease
1173-
rate in one second. To include ramp up/down times also for power, use the equivalent
1173+
rate. To include ramp up/down times also for power, use the equivalent
11741174
``ORTSTractivePowerRampUpRate``, ``ORTSTractivePowerRampDownRate``,
11751175
``ORTSTractivePowerRampDownToZeroRate``, ``ORTSDynamicBrakePowerRampUpRate``,
11761176
``ORTSDynamicBrakePowerRampDownRate`` and ``ORTSDynamicBrakePowerRampDownToZeroRate``
@@ -1179,12 +1179,11 @@ parameters.
11791179
Example::
11801180

11811181
Engine (
1182-
ORTSTractiveForceRampUpRate ( 50kN )
1183-
ORTSTractiveForceRampDownRate ( 50kN )
1184-
ORTSTractiveForceRampDownToZeroRate ( 100kN )
1185-
ORTSDynamicBrakeForceRampUpRate ( 70kN )
1186-
ORTSDynamicBrakeForceRampDownRate ( 50kN )
1187-
ORTSDynamicBrakeForceRampDownToZeroRate ( 50kN )
1182+
ORTSTractiveForceRampUpRate ( 50kN/s )
1183+
ORTSTractiveForceRampDownRate ( 50kN/s )
1184+
ORTSTractiveForceRampDownToZeroRate ( 100kN/s )
1185+
ORTSDynamicBrakePowerRampUpRate ( 1000kW/s )
1186+
ORTSDynamicBrakeForceRampDownRate ( 50kN/s )
11881187
)
11891188

11901189
Another possibility to avoid sudden variations in tractive force while the driver

Source/Orts.Parsers.Msts/STFReader.cs

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -821,6 +821,16 @@ public enum UNITS
821821
/// </summary>
822822
Energy = 1 << 29,
823823

824+
/// <summary>Valid Units: n/s, kn/s, lbf/s
825+
/// <para>Scaled to newtons per second.</para>
826+
/// </summary>
827+
ForceRate = 1 << 30,
828+
829+
/// <summary>Valid Units: w/s, kw/s, hp/s
830+
/// <para>Scaled to watts per second.</para>
831+
/// </summary>
832+
PowerRate = 1 << 31,
833+
824834
// "Any" is used where units cannot easily be specified, such as generic routines for interpolating continuous data from point values.
825835
// or interpreting locomotive cab attributes from the ORTSExtendedCVF experimental mechanism.
826836
// "Any" should not be used where the dimensions of a unit are predictable.
@@ -1170,6 +1180,23 @@ internal double ParseUnitSuffix(ref string constant, UNITS validUnits)
11701180
case "wh": return 3.6e3f;
11711181
case "kwh": return 3.6e6f;
11721182
}
1183+
if ((validUnits & UNITS.ForceRate) > 0)
1184+
switch (suffix)
1185+
{
1186+
case "": return 1.0;
1187+
case "n/s": return 1;
1188+
case "kn/s": return 1e3;
1189+
case "lbf/s": return 4.44822162;
1190+
case "lb/s": return 4.44822162;
1191+
}
1192+
if ((validUnits & UNITS.PowerRate) > 0)
1193+
switch (suffix)
1194+
{
1195+
case "": return 1.0;
1196+
case "w/s": return 1;
1197+
case "kw/s": return 1e3;
1198+
case "hp/s": return 745.699872;
1199+
}
11731200
STFException.TraceWarning(this, "Found a suffix '" + suffix + "' which could not be parsed as a " + validUnits.ToString() + " unit");
11741201
return 1;
11751202
}

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

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -979,18 +979,18 @@ public override void Parse(string lowercasetoken, STFReader stf)
979979
STFException.TraceWarning(stf, "Skipped unknown traction motor type " + tractionMotorType);
980980
}
981981
break;
982-
case "engine(ortstractiveforcerampuprate": TractionForceRampUpNpS = stf.ReadFloatBlock(STFReader.UNITS.Force, null); break;
983-
case "engine(ortstractiveforcerampdownrate": TractionForceRampDownNpS = stf.ReadFloatBlock(STFReader.UNITS.Force, null); break;
984-
case "engine(ortstractiveforcerampdowntozerorate": TractionForceRampDownToZeroNpS = stf.ReadFloatBlock(STFReader.UNITS.Force, null); break;
985-
case "engine(ortstractivepowerrampuprate": TractionPowerRampUpWpS = stf.ReadFloatBlock(STFReader.UNITS.Power, null); break;
986-
case "engine(ortstractivepowerrampdownrate": TractionPowerRampDownWpS = stf.ReadFloatBlock(STFReader.UNITS.Power, null); break;
987-
case "engine(ortstractivepowerrampdowntozerorate": TractionPowerRampDownToZeroWpS = stf.ReadFloatBlock(STFReader.UNITS.Power, null); break;
988-
case "engine(ortsdynamicbrakeforcerampuprate": DynamicBrakeForceRampUpNpS = stf.ReadFloatBlock(STFReader.UNITS.Force, null); break;
989-
case "engine(ortsdynamicbrakeforcerampdownrate": DynamicBrakeForceRampDownNpS = stf.ReadFloatBlock(STFReader.UNITS.Force, null); break;
990-
case "engine(ortsdynamicbrakeforcerampdowntozerorate": DynamicBrakeForceRampDownToZeroNpS = stf.ReadFloatBlock(STFReader.UNITS.Force, null); break;
991-
case "engine(ortsdynamicbrakepowerrampuprate": DynamicBrakePowerRampUpWpS = stf.ReadFloatBlock(STFReader.UNITS.Power, null); break;
992-
case "engine(ortsdynamicbrakepowerrampdownrate": DynamicBrakePowerRampDownWpS = stf.ReadFloatBlock(STFReader.UNITS.Power, null); break;
993-
case "engine(ortsdynamicbrakepowerrampdowntozerorate": DynamicBrakePowerRampDownToZeroWpS = stf.ReadFloatBlock(STFReader.UNITS.Power, null); break;
982+
case "engine(ortstractiveforcerampuprate": TractionForceRampUpNpS = stf.ReadFloatBlock(STFReader.UNITS.ForceRate, null); break;
983+
case "engine(ortstractiveforcerampdownrate": TractionForceRampDownNpS = stf.ReadFloatBlock(STFReader.UNITS.ForceRate, null); break;
984+
case "engine(ortstractiveforcerampdowntozerorate": TractionForceRampDownToZeroNpS = stf.ReadFloatBlock(STFReader.UNITS.ForceRate, null); break;
985+
case "engine(ortstractivepowerrampuprate": TractionPowerRampUpWpS = stf.ReadFloatBlock(STFReader.UNITS.PowerRate, null); break;
986+
case "engine(ortstractivepowerrampdownrate": TractionPowerRampDownWpS = stf.ReadFloatBlock(STFReader.UNITS.PowerRate, null); break;
987+
case "engine(ortstractivepowerrampdowntozerorate": TractionPowerRampDownToZeroWpS = stf.ReadFloatBlock(STFReader.UNITS.PowerRate, null); break;
988+
case "engine(ortsdynamicbrakeforcerampuprate": DynamicBrakeForceRampUpNpS = stf.ReadFloatBlock(STFReader.UNITS.ForceRate, null); break;
989+
case "engine(ortsdynamicbrakeforcerampdownrate": DynamicBrakeForceRampDownNpS = stf.ReadFloatBlock(STFReader.UNITS.ForceRate, null); break;
990+
case "engine(ortsdynamicbrakeforcerampdowntozerorate": DynamicBrakeForceRampDownToZeroNpS = stf.ReadFloatBlock(STFReader.UNITS.ForceRate, null); break;
991+
case "engine(ortsdynamicbrakepowerrampuprate": DynamicBrakePowerRampUpWpS = stf.ReadFloatBlock(STFReader.UNITS.PowerRate, null); break;
992+
case "engine(ortsdynamicbrakepowerrampdownrate": DynamicBrakePowerRampDownWpS = stf.ReadFloatBlock(STFReader.UNITS.PowerRate, null); break;
993+
case "engine(ortsdynamicbrakepowerrampdowntozerorate": DynamicBrakePowerRampDownToZeroWpS = stf.ReadFloatBlock(STFReader.UNITS.PowerRate, null); break;
994994

995995
case "engine(enginecontrollers(throttle": ThrottleController = new MSTSNotchController(stf); break;
996996
case "engine(enginecontrollers(regulator": ThrottleController = new MSTSNotchController(stf); break;

0 commit comments

Comments
 (0)