From 928c2842d6a4d7db0d002c6027c40c44455743d3 Mon Sep 17 00:00:00 2001 From: "VKMTHD\\haraldmartini" <harald.martini@student.tugraz.at> Date: Tue, 20 Sep 2022 14:08:39 +0200 Subject: [PATCH] added auxiliary data adapter test, renamed ElectricAuxiliary to HighVoltageElectricAuxiliary and mark as obsolote added ElectricAuxiliaries class implemented lookup class to check if the aux technology is applicable for a vehicle architecture --- ...clarationDataAdapterGenericCompletedBus.cs | 8 +- .../DeclarationDataAdapterHeavyLorry.cs | 31 +++-- .../IDeclarationDataAdapter.cs | 10 +- .../DeclarationDataAdapterPrimaryBus.cs | 8 +- .../AuxiliaryDataAdapter.cs | 67 ++++++++-- .../DeclarationDataAdapterSingleBus.cs | 4 +- ...clarationModeCompletedBusRunDataFactory.cs | 2 +- ...DeclarationModeHeavyLorryRunDataFactory.cs | 2 +- ...tionModeHeavyLorryRunDataFactory_Hybrid.cs | 8 +- ...DeclarationModePrimaryBusRunDataFactory.cs | 2 +- ...arationModeSingleBusVectoRunDataFactory.cs | 2 +- ...rationVTPModeVectoRunDataFactoryLorries.cs | 8 +- .../Ports/IElectricEnergyStoragePort.cs | 2 +- VectoCore/VectoCore/Models/Declaration/Fan.cs | 125 +++++++++++++++++- .../VectoCore/Models/Declaration/HVAC.cs | 3 +- .../Declaration/IDeclarationAuxiliaryTable.cs | 9 ++ .../Models/Declaration/PneumaticSystem.cs | 25 +++- .../Models/Declaration/SteeringPump.cs | 33 ++++- .../Models/Simulation/Data/VectoRunData.cs | 3 + .../Simulation/DataBus/IDCDCConverter.cs | 2 +- .../Simulation/Impl/PowertrainBuilder.cs | 23 ++-- .../SimulationComponent/DCDCConverter.cs | 21 ++- .../SimulationComponent/ElectricSystem.cs | 2 +- .../Impl/ElectricAuxiliaries.cs | 58 ++++++++ ...ary.cs => HighVoltageElectricAuxiliary.cs} | 5 +- .../DeclarationDataAdapterTest.cs | 116 ++++++++++++++++ .../BatteryElectric/BatteryElectricTest.cs | 2 +- .../Integration/Hybrid/ParallelHybridTest.cs | 4 +- .../Integration/Hybrid/SerialHybridTest.cs | 2 +- VectoCore/VectoCoreTest/Utils/MockBattery.cs | 4 +- 30 files changed, 515 insertions(+), 76 deletions(-) create mode 100644 VectoCore/VectoCore/Models/SimulationComponent/Impl/ElectricAuxiliaries.cs rename VectoCore/VectoCore/Models/SimulationComponent/Impl/{ElectricAuxiliary.cs => HighVoltageElectricAuxiliary.cs} (90%) diff --git a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/CompletedBus/Generic/DeclarationDataAdapterGenericCompletedBus.cs b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/CompletedBus/Generic/DeclarationDataAdapterGenericCompletedBus.cs index f5d5fe7eae..a858f92554 100644 --- a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/CompletedBus/Generic/DeclarationDataAdapterGenericCompletedBus.cs +++ b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/CompletedBus/Generic/DeclarationDataAdapterGenericCompletedBus.cs @@ -49,11 +49,13 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter.CompletedBus.Gener return _engineDataAdapter.CreateEngineData(primaryVehicle, modeIdx, mission); } - public IList<VectoRunData.AuxData> CreateAuxiliaryData(IAuxiliariesDeclarationInputData auxData, IBusAuxiliariesDeclarationData busAuxData, - MissionType missionType, VehicleClass vehicleClass, Meter vehicleLength, int? numSteeredAxles) + public IList<VectoRunData.AuxData> CreateAuxiliaryData(IAuxiliariesDeclarationInputData auxData, + IBusAuxiliariesDeclarationData busAuxData, + MissionType missionType, VehicleClass vehicleClass, Meter vehicleLength, int? numSteeredAxles, + VectoSimulationJobType jobType) { return _auxDataAdapter.CreateAuxiliaryData(auxData, busAuxData, missionType, vehicleClass, vehicleLength, - numSteeredAxles); + numSteeredAxles, jobType); } public AxleGearData CreateAxleGearData(IAxleGearInputData axlegearData) diff --git a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/HeavyLorry/DeclarationDataAdapterHeavyLorry.cs b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/HeavyLorry/DeclarationDataAdapterHeavyLorry.cs index 26a5fc3973..08b8fdce66 100644 --- a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/HeavyLorry/DeclarationDataAdapterHeavyLorry.cs +++ b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/HeavyLorry/DeclarationDataAdapterHeavyLorry.cs @@ -158,7 +158,8 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter.HeavyLorry public abstract IList<VectoRunData.AuxData> CreateAuxiliaryData(IAuxiliariesDeclarationInputData auxData, IBusAuxiliariesDeclarationData busAuxData, - MissionType missionType, VehicleClass vehicleClass, Meter vehicleLength, int? numSteeredAxles); + MissionType missionType, VehicleClass vehicleClass, Meter vehicleLength, int? numSteeredAxles, + VectoSimulationJobType jobType); public AxleGearData CreateDummyAxleGearData(IGearboxDeclarationInputData gbxData) { @@ -207,10 +208,10 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter.HeavyLorry public override IList<VectoRunData.AuxData> CreateAuxiliaryData( IAuxiliariesDeclarationInputData auxInputData, IBusAuxiliariesDeclarationData busAuxData, MissionType mission, VehicleClass hvdClass, - Meter vehicleLength, int? numSteeredAxles) + Meter vehicleLength, int? numSteeredAxles, VectoSimulationJobType jobType) { return _auxAdapter.CreateAuxiliaryData(auxInputData, busAuxData, mission, hvdClass, vehicleLength, - numSteeredAxles); + numSteeredAxles, jobType); } } @@ -257,8 +258,10 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter.HeavyLorry protected override GearboxType[] SupportedGearboxTypes { get; } - public override IList<VectoRunData.AuxData> CreateAuxiliaryData(IAuxiliariesDeclarationInputData auxData, IBusAuxiliariesDeclarationData busAuxData, - MissionType missionType, VehicleClass vehicleClass, Meter vehicleLength, int? numSteeredAxles) + public override IList<VectoRunData.AuxData> CreateAuxiliaryData(IAuxiliariesDeclarationInputData auxData, + IBusAuxiliariesDeclarationData busAuxData, + MissionType missionType, VehicleClass vehicleClass, Meter vehicleLength, int? numSteeredAxles, + VectoSimulationJobType jobType) { throw new NotImplementedException(); } @@ -282,8 +285,10 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter.HeavyLorry return _gearboxDataAdapter.CreateGearshiftData(axleRatio, engineIdlingSpeed, type, gearsCount); } - public override IList<VectoRunData.AuxData> CreateAuxiliaryData(IAuxiliariesDeclarationInputData auxData, IBusAuxiliariesDeclarationData busAuxData, - MissionType missionType, VehicleClass vehicleClass, Meter vehicleLength, int? numSteeredAxles) + public override IList<VectoRunData.AuxData> CreateAuxiliaryData(IAuxiliariesDeclarationInputData auxData, + IBusAuxiliariesDeclarationData busAuxData, + MissionType missionType, VehicleClass vehicleClass, Meter vehicleLength, int? numSteeredAxles, + VectoSimulationJobType jobType) { throw new NotImplementedException(); } @@ -317,8 +322,10 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter.HeavyLorry return _gearboxDataAdapter.CreateGearshiftData(axleRatio, null, gearboxType, gearsCount); } - public override IList<VectoRunData.AuxData> CreateAuxiliaryData(IAuxiliariesDeclarationInputData auxData, IBusAuxiliariesDeclarationData busAuxData, - MissionType missionType, VehicleClass vehicleClass, Meter vehicleLength, int? numSteeredAxles) + public override IList<VectoRunData.AuxData> CreateAuxiliaryData(IAuxiliariesDeclarationInputData auxData, + IBusAuxiliariesDeclarationData busAuxData, + MissionType missionType, VehicleClass vehicleClass, Meter vehicleLength, int? numSteeredAxles, + VectoSimulationJobType jobType) { throw new NotImplementedException(); } @@ -416,8 +423,10 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter.HeavyLorry throw new NotImplementedException(); } - public override IList<VectoRunData.AuxData> CreateAuxiliaryData(IAuxiliariesDeclarationInputData auxData, IBusAuxiliariesDeclarationData busAuxData, - MissionType missionType, VehicleClass vehicleClass, Meter vehicleLength, int? numSteeredAxles) + public override IList<VectoRunData.AuxData> CreateAuxiliaryData(IAuxiliariesDeclarationInputData auxData, + IBusAuxiliariesDeclarationData busAuxData, + MissionType missionType, VehicleClass vehicleClass, Meter vehicleLength, int? numSteeredAxles, + VectoSimulationJobType jobType) { throw new NotImplementedException(); } diff --git a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/IDeclarationDataAdapter.cs b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/IDeclarationDataAdapter.cs index ce7438b9d4..fc7dfd6c85 100644 --- a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/IDeclarationDataAdapter.cs +++ b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/IDeclarationDataAdapter.cs @@ -62,7 +62,7 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter IList<VectoRunData.AuxData> CreateAuxiliaryData(IAuxiliariesDeclarationInputData auxData, IBusAuxiliariesDeclarationData busAuxData, MissionType missionType, VehicleClass vehicleClass, - Meter vehicleLength, int? numSteeredAxles); + Meter vehicleLength, int? numSteeredAxles, VectoSimulationJobType jobType); IList<Tuple<PowertrainPosition, ElectricMotorData>> CreateElectricMachines(IElectricMachinesDeclarationInputData electricMachines, IDictionary<PowertrainPosition, IList<Tuple<Volt, TableData>>> torqueLimits, Volt averageVoltage, GearList gears = null); @@ -100,7 +100,7 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter IList<VectoRunData.AuxData> CreateAuxiliaryData(IAuxiliariesDeclarationInputData auxData, IBusAuxiliariesDeclarationData busAuxData, MissionType missionType, VehicleClass vehicleClass, - Meter vehicleLength, int? numSteeredAxles); + Meter vehicleLength, int? numSteeredAxles, VectoSimulationJobType jobType); AirdragData CreateAirdragData(IAirdragDeclarationInputData airdragData, Mission mission, Segment segment); } @@ -117,7 +117,7 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter IList<VectoRunData.AuxData> CreateAuxiliaryData(IAuxiliariesDeclarationInputData auxData, IBusAuxiliariesDeclarationData busAuxData, MissionType missionType, VehicleClass vehicleClass, - Meter vehicleLength, int? numSteeredAxles); + Meter vehicleLength, int? numSteeredAxles, VectoSimulationJobType jobType); AxleGearData CreateAxleGearData(IAxleGearInputData axlegearData); @@ -172,7 +172,9 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter RetarderData CreateRetarderData(IRetarderInputData retarderData); ShiftStrategyParameters CreateGearshiftData(GearboxData gbx, double axleRatio, PerSecond engineIdlingSpeed); - IEnumerable<VectoRunData.AuxData> CreateAuxiliaryData(IAuxiliariesDeclarationInputData auxInputData, IBusAuxiliariesDeclarationData busAuxInput, MissionType mission, VehicleClass segment, Meter vehicleLength, int? numSteeredAxles); + IEnumerable<VectoRunData.AuxData> CreateAuxiliaryData(IAuxiliariesDeclarationInputData auxInputData, + IBusAuxiliariesDeclarationData busAuxInput, MissionType mission, VehicleClass segment, Meter vehicleLength, + int? numSteeredAxles, VectoSimulationJobType jobType); IAuxiliaryConfig CreateBusAuxiliariesData(Mission mission, IVehicleDeclarationInputData primaryVehicle, IVehicleDeclarationInputData completedVehicle, VectoRunData simulationRunData); VehicleData CreateVehicleData(ISingleBusInputDataProvider vehicle, Segment segment, Mission mission, diff --git a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/PrimaryBus/DeclarationDataAdapterPrimaryBus.cs b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/PrimaryBus/DeclarationDataAdapterPrimaryBus.cs index 1964006aba..6a0cd8f739 100644 --- a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/PrimaryBus/DeclarationDataAdapterPrimaryBus.cs +++ b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/PrimaryBus/DeclarationDataAdapterPrimaryBus.cs @@ -93,11 +93,13 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter.PrimaryBus return _ptoDataAdapter.CreatePTOTransmissionData(ptoData); } - public IList<VectoRunData.AuxData> CreateAuxiliaryData(IAuxiliariesDeclarationInputData auxData, IBusAuxiliariesDeclarationData busAuxData, - MissionType missionType, VehicleClass vehicleClass, Meter vehicleLength, int? numSteeredAxles) + public IList<VectoRunData.AuxData> CreateAuxiliaryData(IAuxiliariesDeclarationInputData auxData, + IBusAuxiliariesDeclarationData busAuxData, + MissionType missionType, VehicleClass vehicleClass, Meter vehicleLength, int? numSteeredAxles, + VectoSimulationJobType jobType) { return _auxDataAdapter.CreateAuxiliaryData(auxData, busAuxData, missionType, vehicleClass, vehicleLength, - numSteeredAxles); + numSteeredAxles, jobType); } diff --git a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/SimulationComponents/AuxiliaryDataAdapter.cs b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/SimulationComponents/AuxiliaryDataAdapter.cs index 09cfb91903..7c102cf43e 100644 --- a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/SimulationComponents/AuxiliaryDataAdapter.cs +++ b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/SimulationComponents/AuxiliaryDataAdapter.cs @@ -1,6 +1,7 @@ using System; using System.Collections.Generic; using System.Linq; +using Ninject.Infrastructure.Language; using TUGraz.VectoCommon.BusAuxiliaries; using TUGraz.VectoCommon.Exceptions; using TUGraz.VectoCommon.InputData; @@ -22,7 +23,7 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter.SimulationComponen { IList<VectoRunData.AuxData> CreateAuxiliaryData(IAuxiliariesDeclarationInputData auxInputData, IBusAuxiliariesDeclarationData busAuxData, MissionType mission, VehicleClass hvdClass, Meter vehicleLength, - int? numSteeredAxles); + int? numSteeredAxles, VectoSimulationJobType jobType); } public interface ICompletedBusAuxiliaryDataAdapter : IPrimaryBusAuxiliaryDataAdapter @@ -65,10 +66,10 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter.SimulationComponen } public IList<VectoRunData.AuxData> CreateAuxiliaryData(IAuxiliariesDeclarationInputData auxInputData, IBusAuxiliariesDeclarationData busAuxData, MissionType mission, VehicleClass hvdClass, Meter vehicleLength, - int? numSteeredAxles) + int? numSteeredAxles, VectoSimulationJobType jobType) { CheckDeclarationMode(auxInputData, "AuxiliariesData"); - return DoCreateAuxiliaryData(auxInputData, busAuxData, mission, hvdClass, vehicleLength, numSteeredAxles); + return DoCreateAuxiliaryData(auxInputData, busAuxData, mission, hvdClass, vehicleLength, numSteeredAxles, jobType); } public abstract AuxiliaryConfig CreateBusAuxiliariesData(Mission mission, IVehicleDeclarationInputData primaryVehicle, VectoRunData runData); @@ -76,13 +77,30 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter.SimulationComponen protected abstract IList<VectoRunData.AuxData> DoCreateAuxiliaryData( IAuxiliariesDeclarationInputData auxInputData, IBusAuxiliariesDeclarationData busAuxData, MissionType mission, VehicleClass hdvClass, Meter vehicleLength, - int? numSteeredAxles); + int? numSteeredAxles, VectoSimulationJobType jobType); } + public class HeavyLorryPEVAuxiliaryDataAdapter : HeavyLorryAuxiliaryDataAdapter + { + protected override HashSet<AuxiliaryType> AuxiliaryTypes { get; } = new HashSet<AuxiliaryType>() { + AuxiliaryType.ElectricSystem, + AuxiliaryType.HVAC, + AuxiliaryType.PneumaticSystem, + AuxiliaryType.SteeringPump + }; + } + public class HeavyLorryAuxiliaryDataAdapter : AuxiliaryDataAdapter { + protected virtual HashSet<AuxiliaryType> AuxiliaryTypes { get; } = new HashSet<AuxiliaryType>() { + AuxiliaryType.ElectricSystem, + AuxiliaryType.HVAC, + AuxiliaryType.PneumaticSystem, + AuxiliaryType.Fan, + AuxiliaryType.SteeringPump + }; #region Overrides of AuxiliaryDataAdapter public override AuxiliaryConfig CreateBusAuxiliariesData(Mission mission, IVehicleDeclarationInputData primaryVehicle, VectoRunData runData) @@ -90,20 +108,22 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter.SimulationComponen throw new System.NotImplementedException(); } - protected override IList<VectoRunData.AuxData> DoCreateAuxiliaryData(IAuxiliariesDeclarationInputData auxInputData, IBusAuxiliariesDeclarationData busAuxData, - MissionType mission, VehicleClass hdvClass, Meter vehicleLength, int? numSteeredAxles) + protected override IList<VectoRunData.AuxData> DoCreateAuxiliaryData( + IAuxiliariesDeclarationInputData auxInputData, IBusAuxiliariesDeclarationData busAuxData, + MissionType mission, VehicleClass hdvClass, Meter vehicleLength, int? numSteeredAxles, + VectoSimulationJobType jobType) { var retVal = new List<VectoRunData.AuxData>(); - if (auxInputData.Auxiliaries.Count != 5) + if (!new HashSet<AuxiliaryType>(auxInputData.Auxiliaries.Select(aux => aux.Type)).SetEquals(AuxiliaryTypes)) { Log.Error( - "In Declaration Mode exactly 5 Auxiliaries must be defined: Fan, Steering pump, HVAC, Electric System, Pneumatic System."); + "In Declaration Mode exactly 4 Auxiliaries must be defined for battery electric vehicles: Steering pump, HVAC, Electric System, Pneumatic System."); throw new VectoException( - "In Declaration Mode exactly 5 Auxiliaries must be defined: Fan, Steering pump, HVAC, Electric System, Pneumatic System."); + "In Declaration Mode exactly 4 Auxiliaries must be defined for battery electric vehicles: Steering pump, HVAC, Electric System, Pneumatic System."); } - foreach (var auxType in EnumHelper.GetValues<AuxiliaryType>()) + foreach (var auxType in AuxiliaryTypes) { var auxData = auxInputData.Auxiliaries.FirstOrDefault(a => a.Type == auxType); if (auxData == null) @@ -114,17 +134,27 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter.SimulationComponen var aux = new VectoRunData.AuxData { DemandType = AuxiliaryDemandType.Constant, - Technology = auxData.Technology + Technology = auxData.Technology, }; mission = mission.GetNonEMSMissionType(); switch (auxType) { case AuxiliaryType.Fan: + if (!DeclarationData.Fan.IsApplicable(hdvClass, jobType, auxData.Technology.FirstOrDefault())) { + throw new VectoException( + $"Fan technology '{auxData.Technology.FirstOrDefault()}' is not applicable for '{jobType}'"); + } aux.PowerDemand = DeclarationData.Fan.LookupPowerDemand(hdvClass, mission, auxData.Technology.FirstOrDefault()); aux.ID = Constants.Auxiliaries.IDs.Fan; + aux.IsFullyElectric = DeclarationData.Fan.IsFullyElectric(hdvClass, auxData.Technology.FirstOrDefault()); break; case AuxiliaryType.SteeringPump: + if (!DeclarationData.SteeringPump.IsApplicable(auxData.Technology, jobType)) { + throw new VectoException( + $"At least one steering pump technology of '{string.Join(",", auxData.Technology)}' is not applicable for '{jobType}'"); + } + if (numSteeredAxles.HasValue && auxData.Technology.Count != numSteeredAxles.Value) { throw new VectoException($"Number of steering pump technologies does not match number of steered axles ({numSteeredAxles.Value}, {auxData.Technology.Count})"); @@ -139,6 +169,12 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter.SimulationComponen aux.ID = Constants.Auxiliaries.IDs.HeatingVentilationAirCondition; break; case AuxiliaryType.PneumaticSystem: + if (!DeclarationData.PneumaticSystem.IsApplicable(jobType, + auxData.Technology.FirstOrDefault())) + { + throw new VectoException( + $"Pneumatic system technology'{auxData.Technology.FirstOrDefault()}' is not applicable for '{jobType}'"); + } aux.PowerDemand = DeclarationData.PneumaticSystem.Lookup(mission, auxData.Technology.FirstOrDefault()) .PowerDemand; aux.ID = Constants.Auxiliaries.IDs.PneumaticSystem; @@ -156,9 +192,12 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter.SimulationComponen return retVal; } + #endregion } + + public class PrimaryBusAuxiliaryDataAdapter : AuxiliaryDataAdapter, IPrimaryBusAuxiliaryDataAdapter { public ElectricsUserInputsConfig GetDefaultElectricalUserConfig() @@ -541,8 +580,10 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter.SimulationComponen return retVal; } - protected override IList<VectoRunData.AuxData> DoCreateAuxiliaryData(IAuxiliariesDeclarationInputData auxInputData, IBusAuxiliariesDeclarationData busAuxData, - MissionType mission, VehicleClass hdvClass, Meter vehicleLength, int? numSteeredAxles) + protected override IList<VectoRunData.AuxData> DoCreateAuxiliaryData( + IAuxiliariesDeclarationInputData auxInputData, IBusAuxiliariesDeclarationData busAuxData, + MissionType mission, VehicleClass hdvClass, Meter vehicleLength, int? numSteeredAxles, + VectoSimulationJobType jobType) { if (auxInputData != null) { diff --git a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/SingleBus/DeclarationDataAdapterSingleBus.cs b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/SingleBus/DeclarationDataAdapterSingleBus.cs index f93c188e0b..11edef3935 100644 --- a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/SingleBus/DeclarationDataAdapterSingleBus.cs +++ b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/SingleBus/DeclarationDataAdapterSingleBus.cs @@ -105,10 +105,10 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter.SingleBus public IEnumerable<VectoRunData.AuxData> CreateAuxiliaryData(IAuxiliariesDeclarationInputData auxInputData, IBusAuxiliariesDeclarationData busAuxInput, MissionType mission, - VehicleClass segment, Meter vehicleLength, int? numSteeredAxles) + VehicleClass segment, Meter vehicleLength, int? numSteeredAxles, VectoSimulationJobType jobType) { return _busAuxiliaryDataAdapter.CreateAuxiliaryData(auxInputData, busAuxInput, mission, segment, - vehicleLength, numSteeredAxles); + vehicleLength, numSteeredAxles, jobType); } public IAuxiliaryConfig CreateBusAuxiliariesData(Mission mission, diff --git a/VectoCore/VectoCore/InputData/Reader/Impl/DeclarationMode/CompletedBusRunDataFactory/DeclarationModeCompletedBusRunDataFactory.cs b/VectoCore/VectoCore/InputData/Reader/Impl/DeclarationMode/CompletedBusRunDataFactory/DeclarationModeCompletedBusRunDataFactory.cs index ac508b5e4e..86e48c4d08 100644 --- a/VectoCore/VectoCore/InputData/Reader/Impl/DeclarationMode/CompletedBusRunDataFactory/DeclarationModeCompletedBusRunDataFactory.cs +++ b/VectoCore/VectoCore/InputData/Reader/Impl/DeclarationMode/CompletedBusRunDataFactory/DeclarationModeCompletedBusRunDataFactory.cs @@ -126,7 +126,7 @@ namespace TUGraz.VectoCore.InputData.Reader.Impl.DeclarationMode.CompletedBusRun Aux = DataAdapterGeneric.CreateAuxiliaryData(PrimaryVehicle.Components.AuxiliaryInputData, primaryBusAuxiliaries, mission.MissionType, primarySegment.VehicleClass, mission.BusParameter.VehicleLength, - PrimaryVehicle.Components.AxleWheels.NumSteeredAxles), + PrimaryVehicle.Components.AxleWheels.NumSteeredAxles, PrimaryVehicle.VehicleType), Cycle = new DrivingCycleProxy(cycle, mission.MissionType.ToString()), Retarder = _retarderData, DriverData = _driverData, diff --git a/VectoCore/VectoCore/InputData/Reader/Impl/DeclarationMode/HeavyLorryRunDataFactory/DeclarationModeHeavyLorryRunDataFactory.cs b/VectoCore/VectoCore/InputData/Reader/Impl/DeclarationMode/HeavyLorryRunDataFactory/DeclarationModeHeavyLorryRunDataFactory.cs index 5a1c49f687..ad657b379b 100644 --- a/VectoCore/VectoCore/InputData/Reader/Impl/DeclarationMode/HeavyLorryRunDataFactory/DeclarationModeHeavyLorryRunDataFactory.cs +++ b/VectoCore/VectoCore/InputData/Reader/Impl/DeclarationMode/HeavyLorryRunDataFactory/DeclarationModeHeavyLorryRunDataFactory.cs @@ -286,7 +286,7 @@ namespace TUGraz.VectoCore.InputData.Reader.Impl.DeclarationMode.HeavyLorryRunDa vehicle.Components.AuxiliaryInputData, vehicle.Components.BusAuxiliaries, mission.MissionType, _segment.VehicleClass, vehicle.Length, - vehicle.Components.AxleWheels.NumSteeredAxles); + vehicle.Components.AxleWheels.NumSteeredAxles, vehicle.VehicleType); simulationRunData.Retarder = _retarderData; simulationRunData.DriverData = _driverdata; diff --git a/VectoCore/VectoCore/InputData/Reader/Impl/DeclarationMode/HeavyLorryRunDataFactory/DeclarationModeHeavyLorryRunDataFactory_Hybrid.cs b/VectoCore/VectoCore/InputData/Reader/Impl/DeclarationMode/HeavyLorryRunDataFactory/DeclarationModeHeavyLorryRunDataFactory_Hybrid.cs index 81536fba2b..8cf5ac751f 100644 --- a/VectoCore/VectoCore/InputData/Reader/Impl/DeclarationMode/HeavyLorryRunDataFactory/DeclarationModeHeavyLorryRunDataFactory_Hybrid.cs +++ b/VectoCore/VectoCore/InputData/Reader/Impl/DeclarationMode/HeavyLorryRunDataFactory/DeclarationModeHeavyLorryRunDataFactory_Hybrid.cs @@ -94,7 +94,13 @@ namespace TUGraz.VectoCore.InputData.Reader.Impl.DeclarationMode.HeavyLorryRunDa runData.AirdragData = _airdragData; runData.AngledriveData = _angledriveData; runData.HybridStrategyParameters = DataAdapter.CreateHybridStrategy(runData.BatteryData, runData.SuperCapData); - runData.Aux = DataAdapter.CreateAuxiliaryData(vehicle.Components.AuxiliaryInputData, vehicle.Components.BusAuxiliaries, mission.MissionType, _segment.VehicleClass, vehicle.Length, vehicle.Components.AxleWheels.NumSteeredAxles); + runData.Aux = DataAdapter.CreateAuxiliaryData(vehicle.Components.AuxiliaryInputData, + vehicle.Components.BusAuxiliaries, + mission.MissionType, + _segment.VehicleClass, + vehicle.Length, + vehicle.Components.AxleWheels.NumSteeredAxles, + vehicle.VehicleType); return runData; } diff --git a/VectoCore/VectoCore/InputData/Reader/Impl/DeclarationMode/PrimaryBusRunDataFactory/DeclarationModePrimaryBusRunDataFactory.cs b/VectoCore/VectoCore/InputData/Reader/Impl/DeclarationMode/PrimaryBusRunDataFactory/DeclarationModePrimaryBusRunDataFactory.cs index bf2a2cddd6..25857d4d88 100644 --- a/VectoCore/VectoCore/InputData/Reader/Impl/DeclarationMode/PrimaryBusRunDataFactory/DeclarationModePrimaryBusRunDataFactory.cs +++ b/VectoCore/VectoCore/InputData/Reader/Impl/DeclarationMode/PrimaryBusRunDataFactory/DeclarationModePrimaryBusRunDataFactory.cs @@ -166,7 +166,7 @@ namespace TUGraz.VectoCore.InputData.Reader.Impl.DeclarationMode.PrimaryBusRunDa vehicle.Components.AuxiliaryInputData, vehicle.Components.BusAuxiliaries, mission.MissionType, _segment.VehicleClass, vehicle.Length ?? mission.BusParameter.VehicleLength, - vehicle.Components.AxleWheels.NumSteeredAxles), + vehicle.Components.AxleWheels.NumSteeredAxles, vehicle.VehicleType), Cycle = new DrivingCycleProxy(cycle, mission.MissionType.ToString()), Retarder = _retarderData, DriverData = _driverdata, diff --git a/VectoCore/VectoCore/InputData/Reader/Impl/DeclarationMode/SingleBus/DeclarationModeSingleBusVectoRunDataFactory.cs b/VectoCore/VectoCore/InputData/Reader/Impl/DeclarationMode/SingleBus/DeclarationModeSingleBusVectoRunDataFactory.cs index 4a230192f1..17ebb2ce1d 100644 --- a/VectoCore/VectoCore/InputData/Reader/Impl/DeclarationMode/SingleBus/DeclarationModeSingleBusVectoRunDataFactory.cs +++ b/VectoCore/VectoCore/InputData/Reader/Impl/DeclarationMode/SingleBus/DeclarationModeSingleBusVectoRunDataFactory.cs @@ -171,7 +171,7 @@ namespace TUGraz.VectoCore.InputData.Reader.Impl.DeclarationMode.SingleBus Aux = DataAdapter.CreateAuxiliaryData(vehicle.Components.AuxiliaryInputData, vehicle.Components.BusAuxiliaries, mission.MissionType, _segment.VehicleClass, vehicle.Length ?? mission.BusParameter.VehicleLength, - vehicle.Components.AxleWheels.NumSteeredAxles), + vehicle.Components.AxleWheels.NumSteeredAxles, vehicle.VehicleType), Cycle = new DrivingCycleProxy(cycle, mission.MissionType.ToString()), Retarder = _retarderData, DriverData = _driverdata, diff --git a/VectoCore/VectoCore/InputData/Reader/Impl/DeclarationVTPModeVectoRunDataFactoryLorries.cs b/VectoCore/VectoCore/InputData/Reader/Impl/DeclarationVTPModeVectoRunDataFactoryLorries.cs index e8e1e70c79..b62a1448ff 100644 --- a/VectoCore/VectoCore/InputData/Reader/Impl/DeclarationVTPModeVectoRunDataFactoryLorries.cs +++ b/VectoCore/VectoCore/InputData/Reader/Impl/DeclarationVTPModeVectoRunDataFactoryLorries.cs @@ -124,14 +124,14 @@ namespace TUGraz.VectoCore.InputData.Reader.Impl JobInputData.Vehicle.Components.BusAuxiliaries, missionType, Segment.VehicleClass, JobInputData.Vehicle.Length, - JobInputData.Vehicle.Components.AxleWheels.NumSteeredAxles); + JobInputData.Vehicle.Components.AxleWheels.NumSteeredAxles, JobInputData.Vehicle.VehicleType); } protected virtual List<VectoRunData.AuxData> CreateVTPAuxData(IVehicleDeclarationInputData vehicle) { var numSteered = vehicle.Components.AxleWheels.NumSteeredAxles; var auxRD = DataAdapter.CreateAuxiliaryData( - vehicle.Components.AuxiliaryInputData, vehicle.Components.BusAuxiliaries, MissionType.RegionalDelivery, Segment.VehicleClass, vehicle.Length, numSteered) + vehicle.Components.AuxiliaryInputData, vehicle.Components.BusAuxiliaries, MissionType.RegionalDelivery, Segment.VehicleClass, vehicle.Length, numSteered, vehicle.VehicleType) .ToList(); foreach (var entry in auxRD) { @@ -139,7 +139,7 @@ namespace TUGraz.VectoCore.InputData.Reader.Impl } var auxLH = DataAdapter.CreateAuxiliaryData( - vehicle.Components.AuxiliaryInputData, vehicle.Components.BusAuxiliaries, MissionType.LongHaul, Segment.VehicleClass, vehicle.Length, numSteered) + vehicle.Components.AuxiliaryInputData, vehicle.Components.BusAuxiliaries, MissionType.LongHaul, Segment.VehicleClass, vehicle.Length, numSteered, vehicle.VehicleType) .ToList(); foreach (var entry in auxLH) { @@ -147,7 +147,7 @@ namespace TUGraz.VectoCore.InputData.Reader.Impl } var auxUD = DataAdapter.CreateAuxiliaryData( - vehicle.Components.AuxiliaryInputData, vehicle.Components.BusAuxiliaries, MissionType.UrbanDelivery, Segment.VehicleClass, vehicle.Length, numSteered) + vehicle.Components.AuxiliaryInputData, vehicle.Components.BusAuxiliaries, MissionType.UrbanDelivery, Segment.VehicleClass, vehicle.Length, numSteered, vehicle.VehicleType) .ToList(); foreach (var entry in auxUD) { diff --git a/VectoCore/VectoCore/Models/Connector/Ports/IElectricEnergyStoragePort.cs b/VectoCore/VectoCore/Models/Connector/Ports/IElectricEnergyStoragePort.cs index ebad9f4e94..2e4b966391 100644 --- a/VectoCore/VectoCore/Models/Connector/Ports/IElectricEnergyStoragePort.cs +++ b/VectoCore/VectoCore/Models/Connector/Ports/IElectricEnergyStoragePort.cs @@ -27,7 +27,7 @@ namespace TUGraz.VectoCore.Models.Connector.Ports.Impl } - public interface IElectricAuxConnecor + public interface IElectricAuxConnector { void Connect(IElectricAuxPort aux); } diff --git a/VectoCore/VectoCore/Models/Declaration/Fan.cs b/VectoCore/VectoCore/Models/Declaration/Fan.cs index ac0cc63559..a0be5bddb9 100644 --- a/VectoCore/VectoCore/Models/Declaration/Fan.cs +++ b/VectoCore/VectoCore/Models/Declaration/Fan.cs @@ -30,9 +30,11 @@ */ using System; +using System.Collections.Generic; using System.Data; using System.Linq; using TUGraz.VectoCommon.Exceptions; +using TUGraz.VectoCommon.InputData; using TUGraz.VectoCommon.Models; using TUGraz.VectoCommon.Utils; using TUGraz.VectoCore.Utils; @@ -78,6 +80,21 @@ namespace TUGraz.VectoCore.Models.Declaration : fanHeavyLorries.Lookup(mission, technology, true)).PowerDemand; } + public bool IsApplicable(VehicleClass vehicleClass, VectoSimulationJobType jobType, string technology) + { + return vehicleClass.IsMediumLorry() + ? fanMediumLorries.IsApplicable(jobType, technology) + : fanHeavyLorries.IsApplicable(jobType, technology); + } + + public bool IsFullyElectric(VehicleClass vehicleClass, string technology) + { + var tech = vehicleClass.IsMediumLorry() + ? fanMediumLorries.FullyElectricTechnologies() + : fanHeavyLorries.FullyElectricTechnologies(); + return tech.Contains(technology); + } + public string[] FullyElectricTechnologies() { return fanHeavyLorries.FullyElectricTechnologies(); @@ -86,8 +103,10 @@ namespace TUGraz.VectoCore.Models.Declaration public string[] GetTechnologies() => fanHeavyLorries.GetTechnologies(); } - public abstract class AbstractFan : LookupData<MissionType, string, bool, AuxDemandEntry>, IDeclarationAuxiliaryTable + public abstract class AbstractFan : LookupData<MissionType, string, bool, AuxDemandEntry>, IDeclarationAuxiliaryTable, IDeclarationAuxiliaryArchitectureTable { + + protected override string ErrorMessage => "Auxiliary Lookup Error: No value found for Fan. Mission: '{0}', Technology: '{1}'"; protected override void ParseData(DataTable table) @@ -96,12 +115,13 @@ namespace TUGraz.VectoCore.Models.Declaration var name = row.Field<string>("technology"); var electric = row.ParseBoolean("fullyelectric"); - foreach (DataColumn col in table.Columns) { - if (col.Caption != "technology" && col.Caption != "fullyelectric") { + foreach (DataColumn col in table.Columns.Cast<DataColumn>().Skip(table.Columns.IndexOf("fullyelectric") + 1)) + { + //if (col.Caption != "technology" && col.Caption != "fullyelectric") { Data[Tuple.Create(col.Caption.ParseEnum<MissionType>(), name, electric)] = new AuxDemandEntry { PowerDemand = row.ParseDouble(col).SI<Watt>(), }; - } + //} } } } @@ -111,20 +131,115 @@ namespace TUGraz.VectoCore.Models.Declaration var lookup = Tuple.Create(mission, technology, electrical); return Data.GetVECTOValueOrDefault(lookup, new AuxDemandEntry { PowerDemand = 0.SI<Watt>() }); } - + public string[] FullyElectricTechnologies() => Data.Keys.Where(x => x.Item3).Select(x => x.Item2).Distinct().ToArray(); public string[] GetTechnologies() => Data.Keys.Select(x => x.Item2).Distinct().ToArray(); + + protected abstract IDeclarationAuxiliaryArchitectureTable archMapping { get; } + + public bool IsApplicable(VectoSimulationJobType simType, string technology) + { + return archMapping.IsApplicable(simType, technology); + } + } public sealed class FanMediumLorries : AbstractFan { protected override string ResourceId => DeclarationData.DeclarationDataResourcePrefix + ".VAUX.Fan-Tech-Medium.csv"; + + #region Overrides of AbstractFan + + protected override IDeclarationAuxiliaryArchitectureTable archMapping => new + FanMediumLorriesVehicleArchitecture(); + + + #endregion } public sealed class FanHeavyLorries : AbstractFan { protected override string ResourceId => DeclarationData.DeclarationDataResourcePrefix + ".VAUX.Fan-Tech.csv"; + + protected override IDeclarationAuxiliaryArchitectureTable archMapping => new + FanHeavyLorriesVehicleArchitecture(); + } + + + /// <summary> + /// Maps the first columns of an auxiliary csv to a dictionary Dictionary<string technology, string arch> + /// </summary> + public abstract class AbstractAuxiliaryVehicleArchitectureLookup : LookupData<string, string, bool>, IDeclarationAuxiliaryArchitectureTable + { + public static Dictionary<VectoSimulationJobType, string> ArchitectureNameMapping = + new Dictionary<VectoSimulationJobType, string>() { + {VectoSimulationJobType.BatteryElectricVehicle, "pev"}, + {VectoSimulationJobType.SerialHybridVehicle, "s-hev"}, + {VectoSimulationJobType.ParallelHybridVehicle, "p-hev"}, + {VectoSimulationJobType.ConventionalVehicle, "conventional"}, + {VectoSimulationJobType.IEPC_S, "s-hev"}, + {VectoSimulationJobType.IEPC_E, "pev"}, + }; + + protected override string ErrorMessage => + "Auxiliary Lookup Error: No value found for Fan. Technology: '{0}', Architecture: '{1}'"; + #region Overrides of LookupData + + protected override void ParseData(DataTable table) + { + foreach (DataRow row in table.Rows) { + var name = row["technology"].ToString(); + foreach (DataColumn col in table.Columns.Cast<DataColumn>().Skip(1).Take(4)) { + Data[Tuple.Create(name, col.Caption)] = row.ParseBoolean(col.Caption); + } + } + } + + #endregion + + #region Implementation of IDeclarationAuxiliaryTable + + public string[] GetTechnologies() => Data.Keys.Select(x => x.Item1).Distinct().ToArray(); + + + public bool IsApplicable(VectoSimulationJobType simType, string technology) + { + if (!GetTechnologies().Contains(technology)) { + throw new VectoException($"Auxiliary Lookup Error: Unknown technology: '{technology}'"); + } + + if (!ArchitectureNameMapping.ContainsKey(simType)) { + throw new VectoException($"No Architecture mapping for {simType.ToString()}"); + } + + var arch = ArchitectureNameMapping[simType]; + return Lookup(technology, arch); + } + + #endregion + } + + public sealed class FanMediumLorriesVehicleArchitecture : AbstractAuxiliaryVehicleArchitectureLookup + { + #region Overrides of LookupData + + protected override string ResourceId => DeclarationData.DeclarationDataResourcePrefix + ".VAUX.Fan-Tech-Medium.csv"; + + + #endregion + } + + public sealed class FanHeavyLorriesVehicleArchitecture : AbstractAuxiliaryVehicleArchitectureLookup + { + #region Overrides of LookupData + + protected override string ResourceId => DeclarationData.DeclarationDataResourcePrefix + ".VAUX.Fan-Tech.csv"; + + + #endregion + } + } \ No newline at end of file diff --git a/VectoCore/VectoCore/Models/Declaration/HVAC.cs b/VectoCore/VectoCore/Models/Declaration/HVAC.cs index 7c20b0e87d..f6801fe922 100644 --- a/VectoCore/VectoCore/Models/Declaration/HVAC.cs +++ b/VectoCore/VectoCore/Models/Declaration/HVAC.cs @@ -33,6 +33,7 @@ using System; using System.Collections.Generic; using System.Data; using System.Linq; +using TUGraz.VectoCommon.InputData; using TUGraz.VectoCommon.Models; using TUGraz.VectoCommon.Utils; using TUGraz.VectoCore.Utils; @@ -44,7 +45,7 @@ namespace TUGraz.VectoCore.Models.Declaration { private List<string> Technologies; - protected override string ResourceId => DeclarationData.DeclarationDataResourcePrefix + ".VAUX.HVAC-Table.csv"; + protected override string ResourceId => DeclarationData.DeclarationDataResourcePrefix + ".VAUX.HVAC-Table.csv"; protected override string ErrorMessage => "Auxiliary Lookup Error: No value found for HVAC. Mission: '{0}', Technology: '{1}' , HDVClass: '{2}'"; diff --git a/VectoCore/VectoCore/Models/Declaration/IDeclarationAuxiliaryTable.cs b/VectoCore/VectoCore/Models/Declaration/IDeclarationAuxiliaryTable.cs index 2d552badb6..8711e8b758 100644 --- a/VectoCore/VectoCore/Models/Declaration/IDeclarationAuxiliaryTable.cs +++ b/VectoCore/VectoCore/Models/Declaration/IDeclarationAuxiliaryTable.cs @@ -29,10 +29,19 @@ * Martin Rexeis, rexeis@ivt.tugraz.at, IVT, Graz University of Technology */ +using TUGraz.VectoCommon.InputData; + namespace TUGraz.VectoCore.Models.Declaration { public interface IDeclarationAuxiliaryTable { string[] GetTechnologies(); + + + } + + public interface IDeclarationAuxiliaryArchitectureTable + { + bool IsApplicable(VectoSimulationJobType simType, string technology); } } \ No newline at end of file diff --git a/VectoCore/VectoCore/Models/Declaration/PneumaticSystem.cs b/VectoCore/VectoCore/Models/Declaration/PneumaticSystem.cs index 5222c8b037..768195a6a4 100644 --- a/VectoCore/VectoCore/Models/Declaration/PneumaticSystem.cs +++ b/VectoCore/VectoCore/Models/Declaration/PneumaticSystem.cs @@ -32,14 +32,16 @@ using System; using System.Data; using System.Linq; +using TUGraz.VectoCommon.InputData; using TUGraz.VectoCommon.Models; using TUGraz.VectoCommon.Utils; using TUGraz.VectoCore.Utils; namespace TUGraz.VectoCore.Models.Declaration { - public sealed class PneumaticSystem : LookupData<MissionType, string, AuxDemandEntry>, IDeclarationAuxiliaryTable + public sealed class PneumaticSystem : LookupData<MissionType, string, AuxDemandEntry>, IDeclarationAuxiliaryTable, IDeclarationAuxiliaryArchitectureTable { + private IDeclarationAuxiliaryArchitectureTable _declarationAuxiliaryArchitectureTableImplementation = new PneumaticSystemArchitectureTable(); protected override string ResourceId => DeclarationData.DeclarationDataResourcePrefix + ".VAUX.PS-Table.csv"; protected override string ErrorMessage => "Auxiliary Lookup Error: No value found for Pneumatic System. Mission: '{0}', Technology: '{1}'"; @@ -48,7 +50,7 @@ namespace TUGraz.VectoCore.Models.Declaration { foreach (DataRow row in table.Rows) { var technology = row.Field<string>("technology"); - foreach (DataColumn col in table.Columns) { + foreach (DataColumn col in table.Columns.Cast<DataColumn>().Skip(table.Columns.IndexOf("fullyelectric") + 1)) { if (col.Caption != "technology") { Data[Tuple.Create(col.Caption.ParseEnum<MissionType>(), technology)] = new AuxDemandEntry() { PowerDemand = row.ParseDouble(col.Caption).SI<Watt>() @@ -62,5 +64,24 @@ namespace TUGraz.VectoCore.Models.Declaration { return Data.Keys.Select(x => x.Item2).Distinct().ToArray(); } + + #region Implementation of IDeclarationAuxiliaryArchitectureTable + + public bool IsApplicable(VectoSimulationJobType simType, string technology) + { + return _declarationAuxiliaryArchitectureTableImplementation.IsApplicable(simType, technology); + } + + #endregion + + private class PneumaticSystemArchitectureTable : AbstractAuxiliaryVehicleArchitectureLookup + { + #region Overrides of LookupData + + protected override string ResourceId => DeclarationData.DeclarationDataResourcePrefix + ".VAUX.PS-Table.csv"; + + #endregion + } + } } \ No newline at end of file diff --git a/VectoCore/VectoCore/Models/Declaration/SteeringPump.cs b/VectoCore/VectoCore/Models/Declaration/SteeringPump.cs index ac909384d7..5a1623d7bf 100644 --- a/VectoCore/VectoCore/Models/Declaration/SteeringPump.cs +++ b/VectoCore/VectoCore/Models/Declaration/SteeringPump.cs @@ -34,6 +34,7 @@ using System.Collections.Generic; using System.Data; using System.Diagnostics; using System.Linq; +using TUGraz.VectoCommon.InputData; using TUGraz.VectoCommon.Models; using TUGraz.VectoCommon.Utils; using TUGraz.VectoCore.Utils; @@ -72,6 +73,16 @@ namespace TUGraz.VectoCore.Models.Declaration return power.UnloadedFriction + power.Banking + power.Steering; } + public bool IsApplicable(IEnumerable<string> technologies, VectoSimulationJobType jobType) + { + foreach (var technology in technologies) { + if (!_techLookup.IsApplicable(jobType, technology)) { + return false; + } + } + return true; + } + private sealed class SteeringPumpBaseLine : LookupData<MissionType, VehicleClass, SteeringPumpValues<Watt>> { protected override string ResourceId => DeclarationData.DeclarationDataResourcePrefix + ".VAUX.SP-Table.csv"; @@ -95,8 +106,9 @@ namespace TUGraz.VectoCore.Models.Declaration } } - private sealed class SteeringPumpTechnologies : LookupData<string, SteeringPumpValues<double>> + private sealed class SteeringPumpTechnologies : LookupData<string, SteeringPumpValues<double>>, IDeclarationAuxiliaryArchitectureTable { + private readonly IDeclarationAuxiliaryArchitectureTable _declarationAuxiliaryArchitectureTableImplementation = new SteeringPumpArchitectureTable(); protected override string ResourceId => DeclarationData.DeclarationDataResourcePrefix + ".VAUX.SP-Tech.csv"; protected override string ErrorMessage => "Auxiliary Lookup Error: No value found for SteeringPump Technology. Key: '{0}'"; @@ -129,6 +141,25 @@ namespace TUGraz.VectoCore.Models.Declaration { return Data.Keys.Distinct().ToArray(); } + + #region Implementation of IDeclarationAuxiliaryArchitectureTable + + public bool IsApplicable(VectoSimulationJobType simType, string technology) + { + return _declarationAuxiliaryArchitectureTableImplementation.IsApplicable(simType, technology); + } + + private class SteeringPumpArchitectureTable : AbstractAuxiliaryVehicleArchitectureLookup + { + #region Overrides of LookupData + + protected override string ResourceId => DeclarationData.DeclarationDataResourcePrefix + ".VAUX.SP-Tech.csv"; + + #endregion + } + + + #endregion } private sealed class SteeringPumpAxles : LookupData<MissionType, int, SteeringPumpValues<double>> diff --git a/VectoCore/VectoCore/Models/Simulation/Data/VectoRunData.cs b/VectoCore/VectoCore/Models/Simulation/Data/VectoRunData.cs index b730d453fe..57a83f6e68 100644 --- a/VectoCore/VectoCore/Models/Simulation/Data/VectoRunData.cs +++ b/VectoCore/VectoCore/Models/Simulation/Data/VectoRunData.cs @@ -190,6 +190,9 @@ namespace TUGraz.VectoCore.Models.Simulation.Data [Required] public AuxiliaryDemandType DemandType; + [Required] public bool ConnectToDcDc; + + [Required] public bool IsFullyElectric; public MissionType? MissionType; } diff --git a/VectoCore/VectoCore/Models/Simulation/DataBus/IDCDCConverter.cs b/VectoCore/VectoCore/Models/Simulation/DataBus/IDCDCConverter.cs index 5c3861dfb5..8e74bb047f 100644 --- a/VectoCore/VectoCore/Models/Simulation/DataBus/IDCDCConverter.cs +++ b/VectoCore/VectoCore/Models/Simulation/DataBus/IDCDCConverter.cs @@ -3,7 +3,7 @@ using TUGraz.VectoCore.Models.Connector.Ports.Impl; namespace TUGraz.VectoCore.Models.Simulation.DataBus { - public interface IDCDCConverter : IElectricAuxPort + public interface IDCDCConverter : IElectricAuxPort, IElectricAuxConnector { void ConsumerEnergy(WattSecond electricConsumerPower, bool dryRun); } diff --git a/VectoCore/VectoCore/Models/Simulation/Impl/PowertrainBuilder.cs b/VectoCore/VectoCore/Models/Simulation/Impl/PowertrainBuilder.cs index c40aeeaf07..e14f178d12 100644 --- a/VectoCore/VectoCore/Models/Simulation/Impl/PowertrainBuilder.cs +++ b/VectoCore/VectoCore/Models/Simulation/Impl/PowertrainBuilder.cs @@ -430,7 +430,7 @@ namespace TUGraz.VectoCore.Models.Simulation.Impl var container = new VehicleContainer(data.ExecutionMode, modData, _sumWriter) { RunData = data }; var es = ConnectREESS(data, container); - var aux = new ElectricAuxiliary(container); + var aux = new HighVoltageElectricAuxiliary(container); aux.AddConstant("P_aux_el", data.ElectricAuxDemand ?? 0.SI<Watt>()); es.Connect(aux); @@ -557,7 +557,7 @@ namespace TUGraz.VectoCore.Models.Simulation.Impl ? (IHybridControlStrategy)new SerialHybridStrategyAT(data, container) : new SerialHybridStrategy(data, container); - var aux = new ElectricAuxiliary(container); + var aux = new HighVoltageElectricAuxiliary(container); aux.AddConstant("P_aux_el", data.ElectricAuxDemand ?? 0.SI<Watt>()); es.Connect(aux); @@ -692,10 +692,11 @@ namespace TUGraz.VectoCore.Models.Simulation.Impl var ctl = new BatteryElectricMotorController(container, es); - var aux = new ElectricAuxiliary(container); + var aux = new HighVoltageElectricAuxiliary(container); aux.AddConstant("P_aux_el", data.ElectricAuxDemand ?? 0.SI<Watt>()); es.Connect(aux); + var cycle = new DistanceBasedDrivingCycle(container, data.Cycle); var powertrain = cycle .AddComponent(new Driver(container, data.DriverData, new DefaultDriverStrategy(container))) @@ -763,6 +764,10 @@ namespace TUGraz.VectoCore.Models.Simulation.Impl busAux.DCDCConverter = dcdc; es.Connect(dcdc); em.BusAux = busAux; + } else { + var dcdc = new DCDCConverter(container, 1); + es.Connect(dcdc); + dcdc.Connect(new ElectricAuxiliaries(container)); } return container; @@ -884,7 +889,7 @@ namespace TUGraz.VectoCore.Models.Simulation.Impl var ctl = new BatteryElectricMotorController(container, es); - var aux = new ElectricAuxiliary(container); + var aux = new HighVoltageElectricAuxiliary(container); aux.AddConstant("P_aux_el", data.ElectricAuxDemand ?? 0.SI<Watt>()); es.Connect(aux); @@ -977,7 +982,7 @@ namespace TUGraz.VectoCore.Models.Simulation.Impl var idleController = engine.IdleController; ctl.Engine = engine; - var aux = new ElectricAuxiliary(container); + var aux = new HighVoltageElectricAuxiliary(container); aux.AddConstant("P_aux_el", data.ElectricAuxDemand ?? 0.SI<Watt>()); es.Connect(aux); @@ -1102,7 +1107,7 @@ namespace TUGraz.VectoCore.Models.Simulation.Impl public static void BuildSimpleSerialHybridPowertrain(VectoRunData data, VehicleContainer container) { var es = ConnectREESS(data, container); - var aux = new ElectricAuxiliary(container); + var aux = new HighVoltageElectricAuxiliary(container); aux.AddConstant("P_aux_el", data.ElectricAuxDemand ?? 0.SI<Watt>()); es.Connect(aux); es.Connect(new GensetChargerAdapter(null)); @@ -1187,7 +1192,7 @@ namespace TUGraz.VectoCore.Models.Simulation.Impl public static void BuildSimpleIEPCHybridPowertrain(VectoRunData data, VehicleContainer container) { var es = ConnectREESS(data, container); - var aux = new ElectricAuxiliary(container); + var aux = new HighVoltageElectricAuxiliary(container); aux.AddConstant("P_aux_el", data.ElectricAuxDemand ?? 0.SI<Watt>()); es.Connect(aux); es.Connect(new GensetChargerAdapter(null)); @@ -1257,7 +1262,7 @@ namespace TUGraz.VectoCore.Models.Simulation.Impl public static void BuildSimpleHybridPowertrain(VectoRunData data, VehicleContainer container) { var es = ConnectREESS(data, container); - var aux = new ElectricAuxiliary(container); + var aux = new HighVoltageElectricAuxiliary(container); aux.AddConstant("P_aux_el", data.ElectricAuxDemand ?? 0.SI<Watt>()); es.Connect(aux); @@ -1348,7 +1353,7 @@ namespace TUGraz.VectoCore.Models.Simulation.Impl public static void BuildSimplePowertrainElectric(VectoRunData data, VehicleContainer container) { var es = ConnectREESS(data, container); - var aux = new ElectricAuxiliary(container); + var aux = new HighVoltageElectricAuxiliary(container); aux.AddConstant("P_aux_el", data.ElectricAuxDemand ?? 0.SI<Watt>()); es.Connect(aux); es.Connect(new SimpleCharger()); diff --git a/VectoCore/VectoCore/Models/SimulationComponent/DCDCConverter.cs b/VectoCore/VectoCore/Models/SimulationComponent/DCDCConverter.cs index 34559dde4a..e5887e33cf 100644 --- a/VectoCore/VectoCore/Models/SimulationComponent/DCDCConverter.cs +++ b/VectoCore/VectoCore/Models/SimulationComponent/DCDCConverter.cs @@ -1,4 +1,6 @@ -using TUGraz.VectoCommon.Utils; +using System.Collections.Generic; +using TUGraz.VectoCommon.Utils; +using TUGraz.VectoCore.Configuration; using TUGraz.VectoCore.Models.Connector.Ports.Impl; using TUGraz.VectoCore.Models.Simulation; using TUGraz.VectoCore.Models.Simulation.Data; @@ -25,7 +27,7 @@ namespace TUGraz.VectoCore.Models.SimulationComponent { PreviousState.ConsumedEnergy = 0.SI<WattSecond>(); CurrentState.ConsumedEnergy = 0.SI<WattSecond>(); - + _electricConsumers.ForEach(aux => aux.Initialize()); return 0.SI<Watt>(); } @@ -34,6 +36,10 @@ namespace TUGraz.VectoCore.Models.SimulationComponent var dischargeEnergy = (-DataBus.BatteryInfo.MaxDischargePower(dt) * dt); var chargeEnergy = (-DataBus.BatteryInfo.MaxChargePower(dt) * dt); var efficiency = PreviousState.ConsumedEnergy > 0 ? 1 / Efficiency : Efficiency; + + PreviousState.ConsumedEnergy += _electricConsumers.Sum(aux => aux.PowerDemand(absTime, dt, dryRun)) * dt; + + if ((PreviousState.ConsumedEnergy * efficiency).IsBetween(chargeEnergy, dischargeEnergy)) { return PreviousState.ConsumedEnergy / dt * efficiency; } @@ -103,5 +109,16 @@ namespace TUGraz.VectoCore.Models.SimulationComponent return false; } #endregion + + #region Implementation of IElectricAuxConnector + + private List<IElectricAuxPort> _electricConsumers = new List<IElectricAuxPort>(); + + public void Connect(IElectricAuxPort aux) + { + _electricConsumers.Add(aux); + } + + #endregion } } \ No newline at end of file diff --git a/VectoCore/VectoCore/Models/SimulationComponent/ElectricSystem.cs b/VectoCore/VectoCore/Models/SimulationComponent/ElectricSystem.cs index 66338c293e..0553b087f9 100644 --- a/VectoCore/VectoCore/Models/SimulationComponent/ElectricSystem.cs +++ b/VectoCore/VectoCore/Models/SimulationComponent/ElectricSystem.cs @@ -11,7 +11,7 @@ using TUGraz.VectoCore.OutputData; namespace TUGraz.VectoCore.Models.SimulationComponent { - public class ElectricSystem : StatefulVectoSimulationComponent<ElectricSystem.State>, IElectricSystem, IElectricAuxConnecor, + public class ElectricSystem : StatefulVectoSimulationComponent<ElectricSystem.State>, IElectricSystem, IElectricAuxConnector, IElectricChargerConnector, IBatteryConnector, IUpdateable { diff --git a/VectoCore/VectoCore/Models/SimulationComponent/Impl/ElectricAuxiliaries.cs b/VectoCore/VectoCore/Models/SimulationComponent/Impl/ElectricAuxiliaries.cs new file mode 100644 index 0000000000..7ebed76432 --- /dev/null +++ b/VectoCore/VectoCore/Models/SimulationComponent/Impl/ElectricAuxiliaries.cs @@ -0,0 +1,58 @@ +using System.Collections.Generic; +using System.Linq; +using TUGraz.VectoCommon.Models; +using TUGraz.VectoCommon.Utils; +using TUGraz.VectoCore.InputData.Reader.DataObjectAdapter.PrimaryBus; +using TUGraz.VectoCore.Models.Connector.Ports.Impl; +using TUGraz.VectoCore.Models.Simulation; +using TUGraz.VectoCore.Models.Simulation.Data; + +namespace TUGraz.VectoCore.Models.SimulationComponent.Impl +{ + + + public class ElectricAuxiliaries : IElectricAuxPort + { + private IEnumerable<VectoRunData.AuxData> _auxData; + + #region Implementation of IElectricAuxPort + + + public ElectricAuxiliaries(IVehicleContainer container) + { + + DataBus = container; + + } + + private IVehicleContainer DataBus { get; set; } + + public Watt Initialize() + { + _auxData = DataBus.RunData.Aux.Where(aux => aux.MissionType == DataBus.RunData.Mission.MissionType); + foreach (var auxData in _auxData) { + //auxData. + } + + return 0.SI<Watt>(); + } + + public Watt PowerDemand(Second absTime, Second dt, bool dryRun) + { + var left = DataBus.DrivingCycleInfo.CycleData.LeftSample; + var sum = 0.SI<Watt>(); + foreach (var auxData in _auxData) { + if (auxData.DemandType == AuxiliaryDemandType.Constant) { + sum += auxData.PowerDemand; + } else { + sum += auxData.PowerDemandFunc(left); + } + } + + return sum; + } + + #endregion + } +} + diff --git a/VectoCore/VectoCore/Models/SimulationComponent/Impl/ElectricAuxiliary.cs b/VectoCore/VectoCore/Models/SimulationComponent/Impl/HighVoltageElectricAuxiliary.cs similarity index 90% rename from VectoCore/VectoCore/Models/SimulationComponent/Impl/ElectricAuxiliary.cs rename to VectoCore/VectoCore/Models/SimulationComponent/Impl/HighVoltageElectricAuxiliary.cs index 0502961dfa..0e77bcc262 100644 --- a/VectoCore/VectoCore/Models/SimulationComponent/Impl/ElectricAuxiliary.cs +++ b/VectoCore/VectoCore/Models/SimulationComponent/Impl/HighVoltageElectricAuxiliary.cs @@ -8,13 +8,14 @@ using TUGraz.VectoCore.Models.Simulation.Impl; namespace TUGraz.VectoCore.Models.SimulationComponent.Impl { - internal class ElectricAuxiliary : IElectricAuxPort + [Obsolete] + internal class HighVoltageElectricAuxiliary : IElectricAuxPort { protected readonly Dictionary<string, Func<Watt>> Auxiliaries = new Dictionary<string, Func<Watt>>(); private IDataBus DataBus; - public ElectricAuxiliary(VehicleContainer container) + public HighVoltageElectricAuxiliary(VehicleContainer container) { DataBus = container; } diff --git a/VectoCore/VectoCoreTest/InputData/DeclarationDataAdapterTest/DeclarationDataAdapterTest.cs b/VectoCore/VectoCoreTest/InputData/DeclarationDataAdapterTest/DeclarationDataAdapterTest.cs index f3a3a28eee..8128c7cfcf 100644 --- a/VectoCore/VectoCoreTest/InputData/DeclarationDataAdapterTest/DeclarationDataAdapterTest.cs +++ b/VectoCore/VectoCoreTest/InputData/DeclarationDataAdapterTest/DeclarationDataAdapterTest.cs @@ -1,10 +1,16 @@ using System; +using System.Collections.Generic; +using System.Linq; +using System.Linq.Expressions; +using Moq; using Ninject; using NUnit.Framework; using TUGraz.VectoCommon.InputData; using TUGraz.VectoCommon.Models; +using TUGraz.VectoCommon.Utils; using TUGraz.VectoCore.InputData.Reader.DataObjectAdapter; using TUGraz.VectoCore.InputData.Reader.DataObjectAdapter.HeavyLorry; +using TUGraz.VectoCore.InputData.Reader.DataObjectAdapter.SimulationComponents; using TUGraz.VectoCore.Utils.Ninject; namespace TUGraz.VectoCore.Tests.InputData.DeclarationDataAdapterTest @@ -52,8 +58,118 @@ namespace TUGraz.VectoCore.Tests.InputData.DeclarationDataAdapterTest #endregion + [TestCase(VectoSimulationJobType.BatteryElectricVehicle, + new []{ "Full electric steering gear" }, + "Vacuum pump + elec. driven", + true, + 2, + TestName="PEVAuxFailSteeredAxle")] + [TestCase(VectoSimulationJobType.BatteryElectricVehicle, + new[] { "Full electric steering gear" }, + "Vacuum pump + elec. driven", + false, + TestName = "PEVAuxPass")] + [TestCase(VectoSimulationJobType.BatteryElectricVehicle, + new[] { "Full electric steering gear" }, + "Medium Supply 1-stage + mech. clutch + AMS", + true, + TestName = "PEVAuxFailPS")] + [TestCase(VectoSimulationJobType.SerialHybridVehicle, + new[] { "Full electric steering gear" }, + "Vacuum pump + elec. driven", + false, + TestName = "S-HEV Aux Pass")] + [TestCase(VectoSimulationJobType.ParallelHybridVehicle, + new[] { "Full electric steering gear" }, + "Vacuum pump + elec. driven", + false, + TestName = "PEVAuxPass")] + public void HeavyLorryPEVAuxiliaryDataAdapterFailTest(VectoSimulationJobType jobType, string[] spTechnologies, string psTechnology, bool fail, int? steeredAxles = null) + { + var dataAdapter = new HeavyLorryPEVAuxiliaryDataAdapter(); + + var auxData = new Mock<IAuxiliariesDeclarationInputData>(); + + Mock<IAuxiliaryDeclarationInputData> steeringSystem = new Mock<IAuxiliaryDeclarationInputData>(); + foreach(var spTechnoly in spTechnologies) + { + steeringSystem.SetType(AuxiliaryType.SteeringPump) + .AddTechnology(spTechnoly); + } + + var hvac = new Mock<IAuxiliaryDeclarationInputData>() + .SetType(AuxiliaryType.HVAC) + .AddTechnology("Default"); + var pneumatic = new Mock<IAuxiliaryDeclarationInputData>() + .SetType(AuxiliaryType.PneumaticSystem) + .AddTechnology(psTechnology); + var elSystem = new Mock<IAuxiliaryDeclarationInputData>() + .SetType(AuxiliaryType.ElectricSystem) + .AddTechnology("Standard technology"); + + + + + auxData.AddAuxiliaries(steeringSystem.Object, hvac.Object, pneumatic.Object, elSystem.Object); + try { + dataAdapter.CreateAuxiliaryData(auxData.Object, null, MissionType.LongHaul, VehicleClass.Class12, + 4.SI<Meter>(), steeredAxles ?? 1, VectoSimulationJobType.BatteryElectricVehicle); + } catch (Exception ex) { + if (fail) { + Assert.Pass($"Expected Exception {ex.Message}"); + } else { + throw new Exception("Exception occured", ex); + } + } + + + + + } + + } + + public static class AuxiliariesInputMockHelper + { + public static Mock<IAuxiliariesDeclarationInputData> AddAuxiliary(this Mock<IAuxiliariesDeclarationInputData> mock, IAuxiliaryDeclarationInputData aux) + { + var list = mock.Object?.Auxiliaries ?? new List<IAuxiliaryDeclarationInputData>(); + list.Add(aux); + mock.Setup(aux => aux.Auxiliaries) + .Returns(list); + + return mock; + } + + public static Mock<IAuxiliariesDeclarationInputData> AddAuxiliaries( + this Mock<IAuxiliariesDeclarationInputData> mock, params IAuxiliaryDeclarationInputData[] aux) + { + + foreach (var auxiliary in aux) { + mock = mock.AddAuxiliary(auxiliary); + } + + + return mock; + } + + public static Mock<IAuxiliaryDeclarationInputData> SetType(this Mock<IAuxiliaryDeclarationInputData> mock, AuxiliaryType type) + { + mock.Setup(aux => aux.Type).Returns(type); + return mock; + } + + public static Mock<IAuxiliaryDeclarationInputData> AddTechnology(this Mock<IAuxiliaryDeclarationInputData> mock, string technology) + { + var list = mock.Object.Technology ?? new List<string>(); + list.Add(technology); + mock.Setup(aux => aux.Technology).Returns(list); + return mock; + } + } + } \ No newline at end of file diff --git a/VectoCore/VectoCoreTest/Integration/BatteryElectric/BatteryElectricTest.cs b/VectoCore/VectoCoreTest/Integration/BatteryElectric/BatteryElectricTest.cs index 7472d8f276..b0e7069dcb 100644 --- a/VectoCore/VectoCoreTest/Integration/BatteryElectric/BatteryElectricTest.cs +++ b/VectoCore/VectoCoreTest/Integration/BatteryElectric/BatteryElectricTest.cs @@ -938,7 +938,7 @@ namespace TUGraz.VectoCore.Tests.Integration.BatteryElectric var cycle = new DistanceBasedDrivingCycle(container, cycleData); - var aux = new ElectricAuxiliary(container); + var aux = new HighVoltageElectricAuxiliary(container); aux.AddConstant("P_aux_el", pAuxEl.SI<Watt>()); es.Connect(aux); diff --git a/VectoCore/VectoCoreTest/Integration/Hybrid/ParallelHybridTest.cs b/VectoCore/VectoCoreTest/Integration/Hybrid/ParallelHybridTest.cs index d23239f37f..05ac899430 100644 --- a/VectoCore/VectoCoreTest/Integration/Hybrid/ParallelHybridTest.cs +++ b/VectoCore/VectoCoreTest/Integration/Hybrid/ParallelHybridTest.cs @@ -1668,7 +1668,7 @@ namespace TUGraz.VectoCore.Tests.Integration.Hybrid var cycle = new DistanceBasedDrivingCycle(container, cycleData); - var aux = new ElectricAuxiliary(container); + var aux = new HighVoltageElectricAuxiliary(container); aux.AddConstant("P_aux_el", pAuxEl.SI<Watt>()); es.Connect(aux); @@ -1779,7 +1779,7 @@ namespace TUGraz.VectoCore.Tests.Integration.Hybrid var engine = new StopStartCombustionEngine(container, runData.EngineData); var cycle = new DistanceBasedDrivingCycle(container, cycleData); - var aux = new ElectricAuxiliary(container); + var aux = new HighVoltageElectricAuxiliary(container); aux.AddConstant("P_aux_el", pAuxEl.SI<Watt>()); cycle .AddComponent(new Driver(container, runData.DriverData, new DefaultDriverStrategy(container))) diff --git a/VectoCore/VectoCoreTest/Integration/Hybrid/SerialHybridTest.cs b/VectoCore/VectoCoreTest/Integration/Hybrid/SerialHybridTest.cs index f471b49c75..e90659ada8 100644 --- a/VectoCore/VectoCoreTest/Integration/Hybrid/SerialHybridTest.cs +++ b/VectoCore/VectoCoreTest/Integration/Hybrid/SerialHybridTest.cs @@ -710,7 +710,7 @@ namespace TUGraz.VectoCore.Tests.Integration.Hybrid var cycle = new DistanceBasedDrivingCycle(container, cycleData); - var aux = new ElectricAuxiliary(container); + var aux = new HighVoltageElectricAuxiliary(container); aux.AddConstant("P_aux_el", pAuxEl.SI<Watt>()); es.Connect(aux); diff --git a/VectoCore/VectoCoreTest/Utils/MockBattery.cs b/VectoCore/VectoCoreTest/Utils/MockBattery.cs index baa6938522..360f5ab6ef 100644 --- a/VectoCore/VectoCoreTest/Utils/MockBattery.cs +++ b/VectoCore/VectoCoreTest/Utils/MockBattery.cs @@ -4,7 +4,7 @@ using TUGraz.VectoCore.Models.Connector.Ports.Impl; using TUGraz.VectoCore.Models.SimulationComponent; namespace TUGraz.VectoCore.Tests.Utils { - public class MockBattery : IElectricEnergyStorage, IElectricEnergyStoragePort, IElectricAuxConnecor + public class MockBattery : IElectricEnergyStorage, IElectricEnergyStoragePort, IElectricAuxConnector { public Volt InternalVoltage => 640.SI<Volt>(); @@ -46,7 +46,7 @@ namespace TUGraz.VectoCore.Tests.Utils { public IElectricEnergyStoragePort MainBatteryPort => this; - public IElectricAuxConnecor AuxBatteryPort() + public IElectricAuxConnector AuxBatteryPort() { return this; } -- GitLab