diff --git a/VECTOAux/VectoAuxiliariesTests/UnitTests/AveragePneumaticLoadDemandTests.vb b/VECTOAux/VectoAuxiliariesTests/UnitTests/AveragePneumaticLoadDemandTests.vb index 44db80d57ce47641351bb8bf7697efcb27a1e11a..a725be13136fb3d44f778eaa90709f25143304f5 100644 --- a/VECTOAux/VectoAuxiliariesTests/UnitTests/AveragePneumaticLoadDemandTests.vb +++ b/VECTOAux/VectoAuxiliariesTests/UnitTests/AveragePneumaticLoadDemandTests.vb @@ -71,8 +71,7 @@ Namespace UnitTests psUserInputsConfig.Doors = ConsumerTechnology.Pneumatically '"Pneumatic" psUserInputsConfig.AdBlueDosing = ConsumerTechnology.Pneumatically ' "Pneumatic" - Dim psAuxConfig = New DeclarationDataAdapterTruck().CreatePneumaticAuxConfig(RetarderType.LossesIncludedInTransmission) - Dim psActuationsMap = ActuationsMapReader.Read(_actuationsMapPath) + Dim psAuxConfig = New DeclarationDataAdapterPrimaryBus().CreatePneumaticAuxConfig(RetarderType.LossesIncludedInTransmission) Dim psCompressorMap = CompressorMapReader.ReadFile(_compressorMapPath) @@ -82,7 +81,7 @@ Namespace UnitTests Dim _ target As _ - New M03Impl(auxCfg, psCompressorMap, psActuationsMap, _Signals) + New M03Impl(auxCfg, psCompressorMap, auxCfg.Actuations, _Signals) Assert.IsNotNull(target) @@ -93,9 +92,7 @@ Namespace UnitTests initialise() - Dim psAuxConfig = New DeclarationDataAdapterTruck().CreatePneumaticAuxConfig(RetarderType.LossesIncludedInTransmission) - Dim psActuationsMap = ActuationsMapReader.Read(_actuationsMapPath) - + Dim psAuxConfig = New DeclarationDataAdapterPrimaryBus().CreatePneumaticAuxConfig(RetarderType.LossesIncludedInTransmission) Dim psCompressorMap = CompressorMapReader.ReadFile(_compressorMapPath) @@ -106,7 +103,7 @@ Namespace UnitTests Dim _ target As _ - New M03Impl(auxConfig, psCompressorMap, psActuationsMap, _Signals) + New M03Impl(auxConfig, psCompressorMap, auxConfig.Actuations, _Signals) Dim expected As Double = 7947.684 Dim actual As NormLiter = target.TotalAirDemand @@ -119,10 +116,7 @@ Namespace UnitTests initialise() - Dim psAuxConfig = New DeclarationDataAdapterTruck().CreatePneumaticAuxConfig(RetarderType.LossesIncludedInTransmission) - Dim psActuationsMap = ActuationsMapReader.Read(_actuationsMapPath) - - + Dim psAuxConfig = New DeclarationDataAdapterPrimaryBus().CreatePneumaticAuxConfig(RetarderType.LossesIncludedInTransmission) Dim psCompressorMap =CompressorMapReader.ReadFile(_compressorMapPath) @@ -133,7 +127,7 @@ Namespace UnitTests Dim _ target As _ - New M03Impl(auxConfig, psCompressorMap, psActuationsMap, _Signals) + New M03Impl(auxConfig, psCompressorMap, auxConfig.Actuations, _Signals) Dim expected As Single = 5832.091 Dim actual As Watt = target.GetAveragePowerDemandAtCrankFromPneumatics() @@ -149,9 +143,7 @@ Namespace UnitTests _defaultInputConfig.CompressorGearEfficiency = 0.8 - Dim psAuxConfig = New DeclarationDataAdapterTruck().CreatePneumaticAuxConfig(RetarderType.LossesIncludedInTransmission) - Dim psActuationsMap = ActuationsMapReader.Read(_actuationsMapPath) - + Dim psAuxConfig = New DeclarationDataAdapterPrimaryBus().CreatePneumaticAuxConfig(RetarderType.LossesIncludedInTransmission) Dim psCompressorMap = CompressorMapReader.ReadFile(_compressorMapPath) @@ -161,7 +153,7 @@ Namespace UnitTests Dim _ target As _ - New M03Impl(auxConfig, psCompressorMap, psActuationsMap, _Signals) + New M03Impl(auxConfig, psCompressorMap, auxConfig.Actuations, _Signals) Dim expected As Single = 5832.091 @@ -173,9 +165,7 @@ Namespace UnitTests initialise() - Dim psAuxConfig = New DeclarationDataAdapterTruck().CreatePneumaticAuxConfig(RetarderType.LossesIncludedInTransmission) - Dim psActuationsMap = ActuationsMapReader.Read(_actuationsMapPath) - + Dim psAuxConfig = New DeclarationDataAdapterPrimaryBus().CreatePneumaticAuxConfig(RetarderType.LossesIncludedInTransmission) Dim psCompressorMap = CompressorMapReader.ReadFile(_compressorMapPath) @@ -186,11 +176,11 @@ Namespace UnitTests Dim _ target As _ - New M03Impl(auxConfig, psCompressorMap, psActuationsMap, _Signals) + New M03Impl(auxConfig, psCompressorMap, auxConfig.Actuations, _Signals) - Dim expected As Double = 7947.55127/ - psActuationsMap.GetNumActuations(New ActuationsKey("CycleTime", "Urban")) _ + Dim expected As Double = 7947.55127/ auxConfig.Actuations.CycleTime.Value() + ' _Signals.TotalCycleTimeSeconds Assert.AreEqual(expected, target.AverageAirConsumed().Value(), 0.001) @@ -204,9 +194,7 @@ Namespace UnitTests _defaultInputConfig.SmartRegeneration = False - Dim psAuxConfig = New DeclarationDataAdapterTruck().CreatePneumaticAuxConfig(RetarderType.LossesIncludedInTransmission) - Dim psActuationsMap = ActuationsMapReader.Read(_actuationsMapPath) - + Dim psAuxConfig = New DeclarationDataAdapterPrimaryBus().CreatePneumaticAuxConfig(RetarderType.LossesIncludedInTransmission) Dim psCompressorMap = CompressorMapReader.ReadFile(_compressorMapPath) @@ -217,9 +205,9 @@ Namespace UnitTests Dim _ target As _ - New M03Impl(auxConfig, psCompressorMap, psActuationsMap, _Signals) + New M03Impl(auxConfig, psCompressorMap, auxConfig.Actuations, _Signals) - Dim expected As Double = 8863.378/psActuationsMap.GetNumActuations(New ActuationsKey("CycleTime", "Urban")) _ + Dim expected As Double = 8863.378/auxConfig.Actuations.CycleTime.Value() _ ' _Signals.TotalCycleTimeSeconds Assert.AreEqual(expected, target.AverageAirConsumed().Value(), 0.001) @@ -233,8 +221,7 @@ Namespace UnitTests '_defaultInputConfig.RetarderBrake = False - Dim psAuxConfig = New DeclarationDataAdapterTruck().CreatePneumaticAuxConfig(RetarderType.None) - Dim psActuationsMap = ActuationsMapReader.Read(_actuationsMapPath) + Dim psAuxConfig = New DeclarationDataAdapterPrimaryBus().CreatePneumaticAuxConfig(RetarderType.None) Dim psCompressorMap = CompressorMapReader.ReadFile(_compressorMapPath) @@ -245,9 +232,9 @@ Namespace UnitTests Dim _ target As _ - New M03Impl(auxConfig, psCompressorMap, psActuationsMap, _Signals) + New M03Impl(auxConfig, psCompressorMap, auxConfig.Actuations, _Signals) - Dim expected As Double = 8541.45/psActuationsMap.GetNumActuations(New ActuationsKey( "CycleTime","Urban")) _ + Dim expected As Double = 8541.45/auxConfig.Actuations.CycleTime.Value() _ ' _Signals.TotalCycleTimeSeconds @@ -262,8 +249,7 @@ Namespace UnitTests _defaultInputConfig.KneelingHeightMillimeters = 100.SI(Unit.si.Milli.Meter).Cast (Of Meter) - Dim psAuxConfig = New DeclarationDataAdapterTruck().CreatePneumaticAuxConfig(RetarderType.LossesIncludedInTransmission) - Dim psActuationsMap = ActuationsMapReader.Read(_actuationsMapPath) + Dim psAuxConfig = New DeclarationDataAdapterPrimaryBus().CreatePneumaticAuxConfig(RetarderType.LossesIncludedInTransmission) Dim psCompressorMap = CompressorMapReader.ReadFile(_compressorMapPath) @@ -273,9 +259,9 @@ Namespace UnitTests Dim _ target As _ - New M03Impl(auxConfig, psCompressorMap, psActuationsMap, _Signals) + New M03Impl(auxConfig, psCompressorMap, auxConfig.Actuations, _Signals) - Dim expected As Double = 8557.524/ psActuationsMap.GetNumActuations(New ActuationsKey("CycleTime", "Urban")) ' _Signals.TotalCycleTimeSeconds + Dim expected As Double = 8557.524/ auxConfig.Actuations.CycleTime.Value() ' _Signals.TotalCycleTimeSeconds Assert.AreEqual(expected, target.AverageAirConsumed().Value(), 0.001) End Sub @@ -288,8 +274,7 @@ Namespace UnitTests _defaultInputConfig.AirSuspensionControl = ConsumerTechnology.Mechanically - Dim psAuxConfig = New DeclarationDataAdapterTruck().CreatePneumaticAuxConfig(RetarderType.LossesIncludedInTransmission) - Dim psActuationsMap = ActuationsMapReader.Read(_actuationsMapPath) + Dim psAuxConfig = New DeclarationDataAdapterPrimaryBus().CreatePneumaticAuxConfig(RetarderType.LossesIncludedInTransmission) Dim psCompressorMap = CompressorMapReader.ReadFile(_compressorMapPath) @@ -300,9 +285,9 @@ Namespace UnitTests Dim _ target As _ - New M03Impl(auxConfig, psCompressorMap, psActuationsMap, _Signals) + New M03Impl(auxConfig, psCompressorMap, auxConfig.Actuations, _Signals) - Dim expected As Double = 8726.1840/psActuationsMap.GetNumActuations(New ActuationsKey("CycleTime", "Urban")) _ + Dim expected As Double = 8726.1840/auxConfig.Actuations.CycleTime.Value() _ ' _Signals.TotalCycleTimeSeconds Assert.AreEqual(expected, target.AverageAirConsumed().Value(), 0.001) @@ -316,8 +301,7 @@ Namespace UnitTests _defaultInputConfig.AdBlueDosing = ConsumerTechnology.Pneumatically - Dim psAuxConfig = New DeclarationDataAdapterTruck().CreatePneumaticAuxConfig(RetarderType.LossesIncludedInTransmission) - Dim psActuationsMap = ActuationsMapReader.Read(_actuationsMapPath) + Dim psAuxConfig = New DeclarationDataAdapterPrimaryBus().CreatePneumaticAuxConfig(RetarderType.LossesIncludedInTransmission) Dim psCompressorMap = CompressorMapReader.ReadFile(_compressorMapPath) @@ -328,10 +312,9 @@ Namespace UnitTests Dim _ target As _ - New M03Impl(auxConfig, psCompressorMap, psActuationsMap, _Signals) + New M03Impl(auxConfig, psCompressorMap, auxConfig.Actuations, _Signals) - Dim expected As Double = 7947.68457/ - psActuationsMap.GetNumActuations(New ActuationsKey("CycleTime","Urban")) _ + Dim expected As Double = 7947.68457/auxConfig.Actuations.CycleTime.Value() _ ' _Signals.TotalCycleTimeSeconds Assert.AreEqual(expected, target.AverageAirConsumed().Value(), 0.001) @@ -345,8 +328,7 @@ Namespace UnitTests _defaultInputConfig.Doors = ConsumerTechnology.Electrically - Dim psAuxConfig = New DeclarationDataAdapterTruck().CreatePneumaticAuxConfig(RetarderType.LossesIncludedInTransmission) - Dim psActuationsMap = ActuationsMapReader.Read(_actuationsMapPath) + Dim psAuxConfig = New DeclarationDataAdapterPrimaryBus().CreatePneumaticAuxConfig(RetarderType.LossesIncludedInTransmission) Dim psCompressorMap = CompressorMapReader.ReadFile(_compressorMapPath) Dim auxConfig As IAuxiliaryConfig = GetAuxConfig(psAuxConfig) @@ -356,10 +338,9 @@ Namespace UnitTests Dim _ target As _ - New M03Impl(auxConfig, psCompressorMap, psActuationsMap, _Signals) + New M03Impl(auxConfig, psCompressorMap, auxConfig.Actuations, _Signals) - Dim expected As Double = 6880.88428/ - psActuationsMap.GetNumActuations(New ActuationsKey("CycleTime","Urban")) _ + Dim expected As Double = 6880.88428/auxConfig.Actuations.CycleTime.Value() _ ' _Signals.TotalCycleTimeSeconds Assert.AreEqual(expected, target.AverageAirConsumed().Value(), 0.001) @@ -373,7 +354,12 @@ Namespace UnitTests .VehicleData = New VehicleData() with { .CurbWeight = _vehicleMassKG.SI(of Kilogram) }, - .Cycle = "Urban" + .Actuations = New Actuations() With { + .Braking = 153, + .ParkBrakeAndDoors = 75, + .Kneeling = 25, + .CycleTime = 3114.SI(Of Second) + } } End Function End Class diff --git a/VECTOAux/VectoAuxiliariesTests/UnitTests/Utils.vb b/VECTOAux/VectoAuxiliariesTests/UnitTests/Utils.vb index d7764c44dde5e5035b20ceab947ae88f9b8bb373..02901bab37e614c4fb4afb8811921dcfcc9179ac 100644 --- a/VECTOAux/VectoAuxiliariesTests/UnitTests/Utils.vb +++ b/VECTOAux/VectoAuxiliariesTests/UnitTests/Utils.vb @@ -159,8 +159,12 @@ Public Class Utils }, .VehicleData = vehicleData, .Signals = signals, - .ActuationsMap = ActuationsMapReader.Read("TestFiles/testPneumaticActuationsMap_GOODMAP.apac"), - .Cycle = "TESTCYCLE" + .Actuations = New Actuations() With { + .Braking = 153, + .ParkBrakeAndDoors = 24, + .Kneeling = 25, + .CycleTime = 1000.SI(of Second)() + } } Return retVal End Function diff --git a/VectoCommon/VectoCommon/BusAuxiliaries/ActuationsKey.cs b/VectoCommon/VectoCommon/BusAuxiliaries/ActuationsKey.cs deleted file mode 100644 index 5cc34203603178444dc2765c60d1331667c27da0..0000000000000000000000000000000000000000 --- a/VectoCommon/VectoCommon/BusAuxiliaries/ActuationsKey.cs +++ /dev/null @@ -1,50 +0,0 @@ -// Copyright 2017 European Union. -// Licensed under the EUPL (the 'Licence'); -// -// * You may not use this work except in compliance with the Licence. -// * You may obtain a copy of the Licence at: http://ec.europa.eu/idabc/eupl -// * Unless required by applicable law or agreed to in writing, -// software distributed under the Licence is distributed on an "AS IS" basis, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// -// See the LICENSE.txt for the specific language governing permissions and limitations. - -using System; -using System.Diagnostics; - -namespace TUGraz.VectoCommon.BusAuxiliaries -{ - [DebuggerDisplay("({ConsumerName}/{CycleName})")] - public class ActuationsKey - { - // Properties - public string ConsumerName { get; } - - public string CycleName { get; } - - // Constructor - public ActuationsKey(string consumerName, string cycleName) - { - if (consumerName.Trim().Length == 0 | cycleName.Trim().Length == 0) - throw new ArgumentException("ConsumerName and CycleName must be provided"); - ConsumerName = consumerName; - CycleName = cycleName; - } - - - // Overrides to enable this class to be used as a dictionary key in the ActuationsMap. - public override bool Equals(object obj) - { - var other = (ActuationsKey)obj; - if (other == null) { - return false; - } - return other.ConsumerName == ConsumerName && other.CycleName == CycleName; - } - - public override int GetHashCode() - { - return string.Format("{0}#{1}", ConsumerName, CycleName).GetHashCode(); - } - } -} diff --git a/VectoCommon/VectoCommon/BusAuxiliaries/IActuations.cs b/VectoCommon/VectoCommon/BusAuxiliaries/IActuations.cs new file mode 100644 index 0000000000000000000000000000000000000000..e9f52489f5eaed22a41f3a01d1404bc0bce45465 --- /dev/null +++ b/VectoCommon/VectoCommon/BusAuxiliaries/IActuations.cs @@ -0,0 +1,12 @@ +using TUGraz.VectoCommon.Utils; + +namespace TUGraz.VectoCore.Models.BusAuxiliaries +{ + public interface IActuations + { + int Braking { get; } + Second CycleTime { get; } + int Kneeling { get; } + int ParkBrakeAndDoors { get; } + } +} \ No newline at end of file diff --git a/VectoCommon/VectoCommon/BusAuxiliaries/IActuationsMap.cs b/VectoCommon/VectoCommon/BusAuxiliaries/IActuationsMap.cs index a283575a0e86250fd445773758351ef2c046b960..5f163e06a3e4df99f5638d53823f8e6d6e04a3ed 100644 --- a/VectoCommon/VectoCommon/BusAuxiliaries/IActuationsMap.cs +++ b/VectoCommon/VectoCommon/BusAuxiliaries/IActuationsMap.cs @@ -10,12 +10,14 @@ // See the LICENSE.txt for the specific language governing permissions and limitations. +using System; +using TUGraz.VectoCommon.Models; +using TUGraz.VectoCore.Models.BusAuxiliaries; + namespace TUGraz.VectoCommon.BusAuxiliaries { public interface IActuationsMap { - int GetNumActuations(ActuationsKey key); - - string Source { get; } + IActuations Lookup(MissionType missionType); } } diff --git a/VectoCommon/VectoCommon/BusAuxiliaries/IAuxiliaryConfig.cs b/VectoCommon/VectoCommon/BusAuxiliaries/IAuxiliaryConfig.cs index d887d5af8d6f3ab26df8daa8283ddc887e67a38e..d903c7bb20cac32e786ea09cdb5feeb414bbcd6e 100644 --- a/VectoCommon/VectoCommon/BusAuxiliaries/IAuxiliaryConfig.cs +++ b/VectoCommon/VectoCommon/BusAuxiliaries/IAuxiliaryConfig.cs @@ -9,6 +9,8 @@ // // See the LICENSE.txt for the specific language governing permissions and limitations. +using TUGraz.VectoCore.Models.BusAuxiliaries; + namespace TUGraz.VectoCommon.BusAuxiliaries { public interface IAuxiliaryConfig { @@ -22,13 +24,11 @@ namespace TUGraz.VectoCommon.BusAuxiliaries { ISSMInputs SSMInputs { get; } - IActuationsMap ActuationsMap { get; } + IActuations Actuations { get; } bool ConfigValuesAreTheSameAs(IAuxiliaryConfig other); - string Cycle { get; } - IVehicleData VehicleData { get; } IFuelConsumptionMap FuelMap { get; } diff --git a/VectoCommon/VectoCommon/VectoCommon.csproj b/VectoCommon/VectoCommon/VectoCommon.csproj index 0328627de8177e95612ca21d5d28eeb3d4f13369..15868e082f2c00e825c4fcb19406583dc13e72b5 100644 --- a/VectoCommon/VectoCommon/VectoCommon.csproj +++ b/VectoCommon/VectoCommon/VectoCommon.csproj @@ -50,9 +50,10 @@ <Reference Include="System.Xml" /> </ItemGroup> <ItemGroup> - <Compile Include="BusAuxiliaries\ActuationsKey.cs" /> + <Compile Include="BusAuxiliaries\BusHVACSystemConfiguration.cs" /> <Compile Include="BusAuxiliaries\CompressorMapValues.cs" /> <Compile Include="BusAuxiliaries\FloorType.cs" /> + <Compile Include="BusAuxiliaries\IActuations.cs" /> <Compile Include="BusAuxiliaries\IAlternatorMap.cs" /> <Compile Include="BusAuxiliaries\IAuxiliaryConfig.cs" /> <Compile Include="BusAuxiliaries\ICombinedAlternatorMapRow.cs" /> @@ -105,6 +106,7 @@ <Compile Include="Models\IResponse.cs" /> <Compile Include="Models\LegislativeClass.cs" /> <Compile Include="Models\LoggingObject.cs" /> + <Compile Include="Models\MissionType.cs" /> <Compile Include="Models\OperatingPoint.cs" /> <Compile Include="Models\RetarderType.cs" /> <Compile Include="Models\SimulationType.cs" /> diff --git a/VectoCore/VectoCore/InputData/FileIO/JSON/BusAuxiliaryInputData.cs b/VectoCore/VectoCore/InputData/FileIO/JSON/BusAuxiliaryInputData.cs index ee4ee701b55662e630d7af666df44ed4ed746904..db94f4fb2b682661c44f08e7adccdac914e0e9a8 100644 --- a/VectoCore/VectoCore/InputData/FileIO/JSON/BusAuxiliaryInputData.cs +++ b/VectoCore/VectoCore/InputData/FileIO/JSON/BusAuxiliaryInputData.cs @@ -34,7 +34,13 @@ namespace TUGraz.VectoCore.InputData.FileIO.JSON var techList = string.IsNullOrWhiteSpace(data["SSMTechologies"]?.ToString()) ? DeclarationData.BusAuxiliaries.SSMTechnologyList : SSMTechnologiesReader.ReadFromFile(data["SSMTechologies"].ToString()); - var actuationsMap = ActuationsMapReader.Read(Path.Combine(baseDir, data.GetEx<string>("ActuationsMap"))); + var actuations = new Actuations() { + Braking = data["Actuations"]?.GetEx<int>("Brakes") ?? 0, + ParkBrakeAndDoors = data["Actuations"]?.GetEx<int>("Park brake + 2 doors") ?? 0, + Kneeling = data["Actuations"]?.GetEx<int>("Kneeling") ?? 0, + CycleTime = (data["Actiations"]?.GetEx<int>("CycleTime") ?? 3600).SI<Second>() + }; + //ActuationsMapReader.Read(Path.Combine(baseDir, data.GetEx<string>("ActuationsMap"))); var ssm = string.IsNullOrWhiteSpace(data["SSMFilePath"]?.ToString()) ? new SSMInputs(vehicleData, "", FuelData.Diesel) { EnvironmentalConditionsMap = env, @@ -48,7 +54,7 @@ namespace TUGraz.VectoCore.InputData.FileIO.JSON PneumaticAuxillariesConfig = pac, PneumaticUserInputsConfig = puc, SSMInputs = ssm, - ActuationsMap = actuationsMap, + Actuations = actuations, VehicleData = vehicleData }; } diff --git a/VectoCore/VectoCore/InputData/Reader/ComponentData/ActuationsMapReader.cs b/VectoCore/VectoCore/InputData/Reader/ComponentData/ActuationsMapReader.cs index 68edb0139bdc0b4c6b153a6f2483193476f5d85b..147ac6e20aec4fb5b0285cdca25e7895ca7d02ba 100644 --- a/VectoCore/VectoCore/InputData/Reader/ComponentData/ActuationsMapReader.cs +++ b/VectoCore/VectoCore/InputData/Reader/ComponentData/ActuationsMapReader.cs @@ -6,14 +6,16 @@ using TUGraz.VectoCommon.BusAuxiliaries; using TUGraz.VectoCommon.Exceptions; using TUGraz.VectoCommon.Models; using TUGraz.VectoCommon.Utils; +using TUGraz.VectoCore.Models.BusAuxiliaries; using TUGraz.VectoCore.Models.BusAuxiliaries.DownstreamModules.Impl.Pneumatics; +using TUGraz.VectoCore.Models.Declaration; using TUGraz.VectoCore.Utils; namespace TUGraz.VectoCore.InputData.Reader.ComponentData { public static class ActuationsMapReader { - public static readonly string[] Header = new[] { Fields.ConsumerName, Fields.CycleName, Fields.Actuations }; + public static readonly string[] Header = new[] { Fields.CycleName, Fields.Braking, Fields.ParkBrakeAndDoors, Fields.Kneeling, Fields.CycleTime }; public static IActuationsMap Read(string fileName) { @@ -33,16 +35,22 @@ namespace TUGraz.VectoCore.InputData.Reader.ComponentData string.Join(", ", data.Columns.Cast<DataColumn>().Select(c => c.ColumnName))); } - var retVal = new Dictionary<ActuationsKey, int>(); + var retVal = new Dictionary<MissionType, IActuations>(); foreach (DataRow row in data.Rows) { - var key = new ActuationsKey(row.Field<string>(Fields.ConsumerName), row.Field<string>(Fields.CycleName)); + var key = row.Field<string>(Fields.CycleName).ParseEnum<MissionType>(); if (retVal.ContainsKey(key)) { - throw new VectoException("Duplicate entries in pneumatic actuations map! {0} / {1}", key.ConsumerName, key.CycleName); + throw new VectoException("Duplicate entries in actuations map! {0} / {1}", key.ToXMLFormat()); } - retVal[key] = row.Field<string>(Fields.Actuations).ToInt(); + var entry = new Actuations() { + Braking = row.Field<string>(Fields.Braking).ToInt(), + ParkBrakeAndDoors = row.Field<string>(Fields.ParkBrakeAndDoors).ToInt(), + Kneeling = row.Field<string>(Fields.Kneeling).ToInt(), + CycleTime = row.Field<string>(Fields.CycleTime).ToInt().SI<Second>(), + }; + retVal[key] = entry; } - return new ActuationsMap(retVal, source); + return new ActuationsMap(retVal); } private static bool HeaderIsValid(DataColumnCollection cols) @@ -52,9 +60,11 @@ namespace TUGraz.VectoCore.InputData.Reader.ComponentData public class Fields { - public const string ConsumerName = "ConsumerName"; public const string CycleName = "CycleName"; - public const string Actuations = "Actuations"; + public const string Braking = "Brakes"; + public const string ParkBrakeAndDoors = "Park brake + 2 doors"; + public const string Kneeling = "Kneeling"; + public const string CycleTime = "CycleTime"; } } diff --git a/VectoCore/VectoCore/Models/BusAuxiliaries/Actuations.cs b/VectoCore/VectoCore/Models/BusAuxiliaries/Actuations.cs new file mode 100644 index 0000000000000000000000000000000000000000..07f8e87346450241d8a815aea1c8942eb86cd35d --- /dev/null +++ b/VectoCore/VectoCore/Models/BusAuxiliaries/Actuations.cs @@ -0,0 +1,14 @@ +using TUGraz.VectoCommon.Utils; + +namespace TUGraz.VectoCore.Models.BusAuxiliaries { + public class Actuations : IActuations + { + public int Braking { get; internal set; } + + public int ParkBrakeAndDoors { get; internal set; } + + public int Kneeling { get; internal set; } + + public Second CycleTime { get; internal set; } + } +} \ No newline at end of file diff --git a/VectoCore/VectoCore/Models/BusAuxiliaries/AdvancedAuxiliaries.cs b/VectoCore/VectoCore/Models/BusAuxiliaries/AdvancedAuxiliaries.cs index b0b193a3140a24b985b15efd88f1ce043b503312..3137d52ef1549e259275ea511a49476eebe95936 100644 --- a/VectoCore/VectoCore/Models/BusAuxiliaries/AdvancedAuxiliaries.cs +++ b/VectoCore/VectoCore/Models/BusAuxiliaries/AdvancedAuxiliaries.cs @@ -93,7 +93,6 @@ namespace TUGraz.VectoCore.Models.BusAuxiliaries { //Signals.PneumaticOverrunUtilisation = auxConfig.PneumaticAuxillariesConfig.OverrunUtilisationForCompressionFraction; var alternatorMap = auxConfig.ElectricalUserInputsConfig.AlternatorMap; - var actuationsMap = auxConfig.ActuationsMap; var compressorMap = auxConfig.PneumaticUserInputsConfig.CompressorMap; // fuelMap = New cMAP() @@ -138,7 +137,7 @@ namespace TUGraz.VectoCore.Models.BusAuxiliaries { auxConfig.ElectricalUserInputsConfig.AlternatorGearEfficiency, auxConfig.ElectricalUserInputsConfig.PowerNetVoltage); - M3 = new M03Impl(auxConfig, compressorMap, actuationsMap, Signals); + M3 = new M03Impl(auxConfig, compressorMap, auxCfg.Actuations, Signals); M4 = new M04Impl(compressorMap, auxConfig.PneumaticUserInputsConfig.CompressorGearRatio, auxConfig.PneumaticUserInputsConfig.CompressorGearEfficiency, Signals); M5 = new M05Impl(M0_5tmp, auxConfig.ElectricalUserInputsConfig.PowerNetVoltage, auxConfig.ElectricalUserInputsConfig.AlternatorGearEfficiency); diff --git a/VectoCore/VectoCore/Models/BusAuxiliaries/DownstreamModules/Impl/Electrics/M0_1Impl.cs b/VectoCore/VectoCore/Models/BusAuxiliaries/DownstreamModules/Impl/Electrics/M0_1Impl.cs index ad41ff52613b6d6d166f57ace8c1b616413f8cc8..3dbccc79862ab1bedebdc6e50baf07010231df7f 100644 --- a/VectoCore/VectoCore/Models/BusAuxiliaries/DownstreamModules/Impl/Electrics/M0_1Impl.cs +++ b/VectoCore/VectoCore/Models/BusAuxiliaries/DownstreamModules/Impl/Electrics/M0_1Impl.cs @@ -15,7 +15,7 @@ namespace TUGraz.VectoCore.Models.BusAuxiliaries.DownstreamModules.Impl.Electric public M0_1Impl(IAuxiliaryConfig config) { Consumer = config.ElectricalUserInputsConfig.ElectricalConsumers; - var doorDutyCycleFraction = GetDoorActuationTimeFraction(config.ActuationsMap, config.Cycle); + var doorDutyCycleFraction = (config.Actuations.ParkBrakeAndDoors * Constants.BusAuxiliaries.ElectricalConsumers.DoorActuationTimeSecond) / config.Actuations.CycleTime; ; GetTotalAverageDemandAmpsIncludingBaseLoad = Consumer.Items.Sum( x => x.ConsumerName == Constants.BusAuxiliaries.ElectricalConsumers.DoorsPerVehicleConsumer @@ -26,6 +26,8 @@ namespace TUGraz.VectoCore.Models.BusAuxiliaries.DownstreamModules.Impl.Electric x => x.ConsumerName == Constants.BusAuxiliaries.ElectricalConsumers.DoorsPerVehicleConsumer ? x.NumberInActualVehicle * x.NominalConsumptionAmps * doorDutyCycleFraction : x.TotalAvgConumptionAmps); + + // just for debugging linq expression above var sum = 0.0; foreach (var x in Consumer.Items) { if (x.BaseVehicle) { @@ -39,20 +41,6 @@ namespace TUGraz.VectoCore.Models.BusAuxiliaries.DownstreamModules.Impl.Electric } } - private double GetDoorActuationTimeFraction(IActuationsMap actuations, string cycle) - - { - var actuationsKey = new ActuationsKey(Constants.BusAuxiliaries.BrakeAndDoorsActuationKey , cycle); - - var numActuations = actuations.GetNumActuations(actuationsKey); - var secondsPerActuation = Constants.BusAuxiliaries.ElectricalConsumers.DoorActuationTimeSecond; - - actuationsKey = new ActuationsKey(Constants.BusAuxiliaries.CycleTimeActuationKey, cycle); - var doorDutyCycleFraction = (numActuations * secondsPerActuation) / actuations.GetNumActuations(actuationsKey).SI<Second>(); - - return doorDutyCycleFraction; - } - public Ampere GetTotalAverageDemandAmpsIncludingBaseLoad { get; } public Ampere GetTotalAverageDemandAmpsWithoutBaseLoad { get; } diff --git a/VectoCore/VectoCore/Models/BusAuxiliaries/DownstreamModules/Impl/Pneumatics/ActuationsMap.cs b/VectoCore/VectoCore/Models/BusAuxiliaries/DownstreamModules/Impl/Pneumatics/ActuationsMap.cs index 537bb0e6551bba46ae898316509f409c51582f23..c5f4ac05c2d2cb654fccbe0ca6943355cb7afb44 100644 --- a/VectoCore/VectoCore/Models/BusAuxiliaries/DownstreamModules/Impl/Pneumatics/ActuationsMap.cs +++ b/VectoCore/VectoCore/Models/BusAuxiliaries/DownstreamModules/Impl/Pneumatics/ActuationsMap.cs @@ -12,30 +12,29 @@ using System; using System.Collections.Generic; using TUGraz.VectoCommon.BusAuxiliaries; +using TUGraz.VectoCommon.Models; +using TUGraz.VectoCore.Models.Declaration; namespace TUGraz.VectoCore.Models.BusAuxiliaries.DownstreamModules.Impl.Pneumatics { public class ActuationsMap : IActuationsMap { - private Dictionary<ActuationsKey, int> _map; + private Dictionary<MissionType, IActuations> _map; - public ActuationsMap(Dictionary<ActuationsKey, int> map, string source) + public ActuationsMap(Dictionary<MissionType, IActuations> map) { _map = map; - Source = source; + } - public int GetNumActuations(ActuationsKey key) - { - if (_map == null || !_map.ContainsKey(key)) - throw new ArgumentException(string.Format("Pneumatic Actuations map does not contain the key '{0} / {1}'.", key.ConsumerName, key.CycleName)); - - return _map[key]; - } - public string Source { get; } + #region Implementation of IActuationsMap + public IActuations Lookup(MissionType missionType) + { + return _map[missionType.GetNonEMSMissionType()]; + } - + #endregion } } diff --git a/VectoCore/VectoCore/Models/BusAuxiliaries/DownstreamModules/Impl/Pneumatics/M03Impl.cs b/VectoCore/VectoCore/Models/BusAuxiliaries/DownstreamModules/Impl/Pneumatics/M03Impl.cs index 2ae3b292be40cf3477e6e29b09b7c04f3b2320d4..8ea540b1990a313484ee3bdd907c06459156ed43 100644 --- a/VectoCore/VectoCore/Models/BusAuxiliaries/DownstreamModules/Impl/Pneumatics/M03Impl.cs +++ b/VectoCore/VectoCore/Models/BusAuxiliaries/DownstreamModules/Impl/Pneumatics/M03Impl.cs @@ -9,29 +9,24 @@ namespace TUGraz.VectoCore.Models.BusAuxiliaries.DownstreamModules.Impl.Pneumati { protected IPneumaticUserInputsConfig _pneumaticUserInputsConfig; protected IPneumaticsConsumersDemand _pneumaticAuxillariesConfig; - protected IActuationsMap ActuationsMap; + protected IActuations Actuations; protected ICompressorMap _pneumaticsCompressorFlowRateMap; protected Kilogram _vehicleMassKG; - protected string _cycleName; protected ISignals _signals; protected NormLiter _totalAirDemand; - private Second totalCycleTimeSeconds; - + //public M03Impl(IPneumaticUserInputsConfig pneumaticsUserInputConfig, IPneumaticsAuxilliariesConfig pneumaticsAuxillariesConfig, IPneumaticActuationsMap pneumaticsActuationsMap, ICompressorMap pneumaticsCompressorFlowRateMap, Kilogram vehicleMassKG, string cycleName, ISignals signals) - public M03Impl(IAuxiliaryConfig auxConfig, ICompressorMap compressorMap, IActuationsMap actuationsMap, ISignals signals) + public M03Impl(IAuxiliaryConfig auxConfig, ICompressorMap compressorMap, IActuations actuations, ISignals signals) { _pneumaticUserInputsConfig = auxConfig.PneumaticUserInputsConfig; _pneumaticAuxillariesConfig = auxConfig.PneumaticAuxillariesConfig; - ActuationsMap = actuationsMap; + Actuations = actuations; _pneumaticsCompressorFlowRateMap = compressorMap; _vehicleMassKG = auxConfig.VehicleData.TotalVehicleWeight; - _cycleName = auxConfig.Cycle; + _signals = signals; - totalCycleTimeSeconds = ActuationsMap - .GetNumActuations(new ActuationsKey(Constants.BusAuxiliaries.CycleTimeActuationKey, auxConfig.Cycle)).SI<Second>(); - //'Calculate the Total Required Air Delivery Rate L / S _totalAirDemand = TotalAirDemandCalculation(); } @@ -43,14 +38,13 @@ namespace TUGraz.VectoCore.Models.BusAuxiliaries.DownstreamModules.Impl.Pneumati //'* * Breaks * * - double numActuationsPerCycle = ActuationsMap.GetNumActuations(new ActuationsKey("Brakes", _cycleName)); + double numActuationsPerCycle = Actuations.Braking; //'=IF(K10 = "yes", IF(COUNTBLANK(F33), G33, F33), IF(COUNTBLANK(F34), G34, F34)) * K16 var airConsumptionPerActuation = _pneumaticAuxillariesConfig.Braking * _vehicleMassKG; var breaks = numActuationsPerCycle * airConsumptionPerActuation ; //'* * ParkBrakesBreakplus2Doors * *Park break +2 doors - numActuationsPerCycle = - ActuationsMap.GetNumActuations(new ActuationsKey(Constants.BusAuxiliaries.BrakeAndDoorsActuationKey, _cycleName)); + numActuationsPerCycle = Actuations.ParkBrakeAndDoors; //'=SUM(IF(K14 = "electric", 0, IF(COUNTBLANK(F36), G36, F36)), PRODUCT(K16 * IF(COUNTBLANK(F37), G37, F37))) airConsumptionPerActuation = _pneumaticUserInputsConfig.Doors == ConsumerTechnology.Electrically ? 0.SI<NormLiter>() @@ -59,7 +53,7 @@ namespace TUGraz.VectoCore.Models.BusAuxiliaries.DownstreamModules.Impl.Pneumati var parkBrakesplus2Doors = (numActuationsPerCycle * airConsumptionPerActuation); //'* * Kneeling * * - numActuationsPerCycle = ActuationsMap.GetNumActuations(new ActuationsKey("Kneeling", _cycleName)); + numActuationsPerCycle = Actuations.Kneeling; //'=IF(COUNTBLANK(F35), G35, F35) * K11 * K16 airConsumptionPerActuation = _pneumaticAuxillariesConfig.BreakingWithKneeling * _pneumaticUserInputsConfig.KneelingHeightMillimeters * _vehicleMassKG; @@ -69,7 +63,7 @@ namespace TUGraz.VectoCore.Models.BusAuxiliaries.DownstreamModules.Impl.Pneumati // '=IF(K13 = "electric", 0, G39 * F54) - Supplied Spreadsheet var adBlue = _pneumaticUserInputsConfig.AdBlueDosing == ConsumerTechnology.Electrically ? 0.SI<NormLiter>() - : _pneumaticAuxillariesConfig.AdBlueInjection * totalCycleTimeSeconds; + : _pneumaticAuxillariesConfig.AdBlueInjection * Actuations.CycleTime; //'* * Regeneration * * // '=SUM(R6: R9) * IF(K9 = "yes", IF(COUNTBLANK(F41), G41, F41), IF(COUNTBLANK(F40), G40, F40)) - Supplied SpreadSheet @@ -84,13 +78,13 @@ namespace TUGraz.VectoCore.Models.BusAuxiliaries.DownstreamModules.Impl.Pneumati //numActuationsPerCycle =; airConsumptionPerActuation = _pneumaticAuxillariesConfig.DeadVolume; var deadVolBlowOuts = (airConsumptionPerActuation * _pneumaticAuxillariesConfig.DeadVolBlowOuts * - totalCycleTimeSeconds).Cast<NormLiter>(); + Actuations.CycleTime).Cast<NormLiter>(); //'* * AirSuspension * * // '=IF(K12 = "electrically", 0, G38 * F54) - Suplied Spreadsheet var airSuspension = _pneumaticUserInputsConfig.AirSuspensionControl == ConsumerTechnology.Electrically ? 0.SI<NormLiter>() - : _pneumaticAuxillariesConfig.AirControlledSuspension * totalCycleTimeSeconds; + : _pneumaticAuxillariesConfig.AirControlledSuspension * Actuations.CycleTime; //'* * Total Air Demand** var totalAirDemand = breaks + parkBrakesplus2Doors + kneeling + adBlue + regeneration + deadVolBlowOuts + @@ -108,7 +102,7 @@ namespace TUGraz.VectoCore.Models.BusAuxiliaries.DownstreamModules.Impl.Pneumati var cmp = _pneumaticsCompressorFlowRateMap.Interpolate( _signals.EngineSpeed * _pneumaticUserInputsConfig.CompressorGearRatio); - var sum1 = _totalAirDemand / totalCycleTimeSeconds; + var sum1 = _totalAirDemand / Actuations.CycleTime; var sum6 = cmp.FlowRate; var sum7 = cmp.PowerOn - cmp.PowerOff; @@ -121,7 +115,7 @@ namespace TUGraz.VectoCore.Models.BusAuxiliaries.DownstreamModules.Impl.Pneumati public NormLiterPerSecond AverageAirConsumed() { - var sum1 = _totalAirDemand / totalCycleTimeSeconds; + var sum1 = _totalAirDemand / Actuations.CycleTime; return sum1; } diff --git a/VectoCore/VectoCore/OutputData/FileIO/BusAuxWriter.cs b/VectoCore/VectoCore/OutputData/FileIO/BusAuxWriter.cs index 87d5c3a24443175610492622aa300779189d4352..58ff6877aa57afa5becc6b168892692e162ba59a 100644 --- a/VectoCore/VectoCore/OutputData/FileIO/BusAuxWriter.cs +++ b/VectoCore/VectoCore/OutputData/FileIO/BusAuxWriter.cs @@ -33,10 +33,13 @@ namespace TUGraz.VectoCore.OutputData.FileIO body["SSMTechologies"] = string.IsNullOrWhiteSpace(auxCfg.SSMInputs.Technologies.Source) ? "" : JSONFileWriter.GetRelativePath(auxCfg.SSMInputs.Technologies.Source, basePath); - body["ActuationsMap"] = string.IsNullOrWhiteSpace(auxCfg.ActuationsMap.Source) - ? "" - : JSONFileWriter.GetRelativePath(auxCfg.ActuationsMap.Source, basePath); - + body["Actuations"] = new Dictionary<string, object>() { + {"Brakes", auxCfg.Actuations.Braking }, + {"Park brake + 2 doors", auxCfg.Actuations.ParkBrakeAndDoors }, + {"Kneeling", auxCfg.Actuations.Kneeling }, + {"CycleTime", auxCfg.Actuations.CycleTime.Value() } + }; + JSONInputDataFactory.WriteFile(JToken.FromObject(new Dictionary<string, object>() { { "Header", "AAUX" }, { "Body", body } }), auxFile); } catch (Exception) { returnValue = false; diff --git a/VectoCore/VectoCore/Resources/Declaration/Buses/DefaultActuationsMap.APAC b/VectoCore/VectoCore/Resources/Declaration/Buses/DefaultActuationsMap.APAC index 318d9a9de99f5869bbdd940ceb9c0fa219725487..dc2724bf3aac96ef5b1b9363adf6b4172bd3c499 100644 --- a/VectoCore/VectoCore/Resources/Declaration/Buses/DefaultActuationsMap.APAC +++ b/VectoCore/VectoCore/Resources/Declaration/Buses/DefaultActuationsMap.APAC @@ -1,25 +1,6 @@ -ConsumerName, CycleName, Actuations -Brakes,Heavy urban,191 -Brakes,Urban,153 -Brakes,Suburban,49 -Brakes,Interurban,190 -Brakes,Coach,27 -Brakes,UnknownCycleName,0 -Park brake + 2 doors,Heavy urban,82 -Park brake + 2 doors,Urban,75 -Park brake + 2 doors,Suburban,25 -Park brake + 2 doors,Interurban,9 -Park brake + 2 doors,Coach,6 -Park brake + 2 doors,UnknownCycleName,0 -Kneeling,Heavy urban,68 -Kneeling,Urban,58 -Kneeling,Suburban,6 -Kneeling,Interurban,0 -Kneeling,Coach,0 -Kneeling,UnknownCycleName,0 -CycleTime,Heavy urban,8912 -CycleTime,Urban,8149 -CycleTime,Suburban,3283 -CycleTime,Interurban,12962 -CycleTime,Coach,15086 -CycleTime,UnknownCycleName,3600 \ No newline at end of file +CycleName , Brakes , Park brake + 2 doors , Kneeling , CycleTime +Heavy urban , 191 , 82 , 68 , 8912 +Urban , 153 , 75 , 58 , 8149 +Suburban , 49 , 25 , 6 , 3283 +Interurban , 190 , 9 , 0 , 12962 +Coach , 27 , 6 , 0 , 15086 \ No newline at end of file