From 13a0c96711ce38fd6d102871a3e94e0389581509 Mon Sep 17 00:00:00 2001 From: "VKMTHD\\haraldmartini" <harald.martini@student.tugraz.at> Date: Tue, 13 Sep 2022 18:13:42 +0200 Subject: [PATCH] added HybridStrategyParameterDataAdapter, BatteryDataAdapter, ElectricMachinesDataAdapter --- .../InputData/DeclarationInputData.cs | 2 +- .../VectoCommon/Models/VehicleCategory.cs | 5 +- .../FileIO/JSON/JSONComponentInputData.cs | 2 +- .../InputData/FileIO/JSON/JSONVehicleData.cs | 6 +- .../XMLDeclarationVehicleDataProvider.cs | 10 +- ...ectricStorageSystemDeclarationInputData.cs | 15 +- ...eclarationHeavyLorryVehicleDataProvider.cs | 2 +- .../XMLDeclarationMultistageInputReader.cs | 2 +- .../XMLEngineeringVehicleDataProvider.cs | 2 +- .../EngineeringDataAdapter.cs | 10 +- .../DeclarationDataAdapterHeavyLorry.cs | 118 ++++++- .../DeclarationDataAdapterHeavyLorry_old.cs | 104 ------- .../IDeclarationDataAdapter.cs | 12 +- .../DeclarationDataAdapterPrimaryBus.cs | 68 ++++- .../AuxiliaryDataAdapter.cs | 3 + .../BatteryDataAdapter.cs | 137 +++++++++ .../ElectricMachinesDataAdapter.cs | 288 ++++++++++++++++++ .../SimulationComponents/EngineDataAdapter.cs | 11 +- .../RetarderDataAdapter.cs | 6 +- .../HybridStrategyParameterDataAdapter.cs | 62 ++++ .../VehicleDataAdapter.cs | 1 + .../DeclarationDataAdapterSingleBus.cs | 4 +- ...DeclarationModeHeavyLorryRunDataFactory.cs | 215 +++++++------ ...tionModeHeavyLorryRunDataFactory_Hybrid.cs | 155 ++++++++++ ...DeclarationModePrimaryBusRunDataFactory.cs | 201 ++++++++---- .../Models/Declaration/DeclarationData.cs | 19 +- .../Models/Simulation/Data/VectoRunData.cs | 4 +- .../Data/ElectricMotor/ElectricMotorData.cs | 2 +- .../SimulationComponent/Impl/ElectricMotor.cs | 2 +- .../VIFElectricMotorTorqueLimitsType.cs | 2 +- ...CombineArgumentsToNameInstanceProviders.cs | 2 +- .../VehicleTypeAndArchitectureStringHelper.cs | 10 + VectoCore/VectoCore/VectoCore.csproj | 1 + .../Integration/Hybrid/SerialHybridTest.cs | 12 +- .../Utils/MockDeclarationVehicleInputData.cs | 4 +- .../Utils/MockSimulationDataFactory.cs | 25 +- .../Utils/MockVehicleInputData.cs | 2 +- 37 files changed, 1177 insertions(+), 349 deletions(-) delete mode 100644 VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/HeavyLorry/DeclarationDataAdapterHeavyLorry_old.cs create mode 100644 VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/SimulationComponents/BatteryDataAdapter.cs create mode 100644 VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/SimulationComponents/ElectricMachinesDataAdapter.cs create mode 100644 VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/SimulationComponents/StrategyDataAdapter/HybridStrategyParameterDataAdapter.cs create mode 100644 VectoCore/VectoCore/InputData/Reader/Impl/DeclarationMode/HeavyLorryRunDataFactory/DeclarationModeHeavyLorryRunDataFactory_Hybrid.cs diff --git a/VectoCommon/VectoCommon/InputData/DeclarationInputData.cs b/VectoCommon/VectoCommon/InputData/DeclarationInputData.cs index f883e870b8..96f9a73011 100644 --- a/VectoCommon/VectoCommon/InputData/DeclarationInputData.cs +++ b/VectoCommon/VectoCommon/InputData/DeclarationInputData.cs @@ -196,7 +196,7 @@ namespace TUGraz.VectoCommon.InputData VehicleDeclarationType VehicleDeclarationType { get; } - Dictionary<PowertrainPosition, List<Tuple<Volt, TableData>>> ElectricMotorTorqueLimits { get; } + IDictionary<PowertrainPosition, IList<Tuple<Volt, TableData>>> ElectricMotorTorqueLimits { get; } TableData BoostingLimitations { get; } diff --git a/VectoCommon/VectoCommon/Models/VehicleCategory.cs b/VectoCommon/VectoCommon/Models/VehicleCategory.cs index 7ebef4a669..73b19f61e3 100644 --- a/VectoCommon/VectoCommon/Models/VehicleCategory.cs +++ b/VectoCommon/VectoCommon/Models/VehicleCategory.cs @@ -73,6 +73,7 @@ namespace TUGraz.VectoCommon.Models switch (category) { case VehicleCategory.RigidTruck: case VehicleCategory.Tractor: + case VehicleCategory.Van: return Lorry; break; case VehicleCategory.HeavyBusPrimaryVehicle: @@ -81,8 +82,8 @@ namespace TUGraz.VectoCommon.Models case VehicleCategory.HeavyBusCompletedVehicle: return CompletedBus; break; - case VehicleCategory.Van: - return Van; + //case VehicleCategory.Van: + // return Van; default: return category.GetLabel(); } diff --git a/VectoCore/VectoCore/InputData/FileIO/JSON/JSONComponentInputData.cs b/VectoCore/VectoCore/InputData/FileIO/JSON/JSONComponentInputData.cs index a0c64f7b78..1e677dedb0 100644 --- a/VectoCore/VectoCore/InputData/FileIO/JSON/JSONComponentInputData.cs +++ b/VectoCore/VectoCore/InputData/FileIO/JSON/JSONComponentInputData.cs @@ -261,7 +261,7 @@ namespace TUGraz.VectoCore.InputData.FileIO.JSON public VehicleDeclarationType VehicleDeclarationType { get; } - public Dictionary<PowertrainPosition, List<Tuple<Volt, TableData>>> ElectricMotorTorqueLimits => Vehicle.ElectricMotorTorqueLimits; + public IDictionary<PowertrainPosition, IList<Tuple<Volt, TableData>>> ElectricMotorTorqueLimits => Vehicle.ElectricMotorTorqueLimits; public TableData BoostingLimitations => Vehicle.BoostingLimitations; diff --git a/VectoCore/VectoCore/InputData/FileIO/JSON/JSONVehicleData.cs b/VectoCore/VectoCore/InputData/FileIO/JSON/JSONVehicleData.cs index 82a85abcf1..c4872cb832 100644 --- a/VectoCore/VectoCore/InputData/FileIO/JSON/JSONVehicleData.cs +++ b/VectoCore/VectoCore/InputData/FileIO/JSON/JSONVehicleData.cs @@ -181,10 +181,10 @@ namespace TUGraz.VectoCore.InputData.FileIO.JSON //public override Dictionary<PowertrainPosition, List<Tuple<Volt, TableData>>> ElectricMotorTorqueLimits => // throw new NotImplementedException(); - public override Dictionary<PowertrainPosition, List<Tuple<Volt, TableData>>> ElectricMotorTorqueLimits => + public override IDictionary<PowertrainPosition, IList<Tuple<Volt, TableData>>> ElectricMotorTorqueLimits => Body["EMTorqueLimits"] == null ? null - : new Dictionary<PowertrainPosition, List<Tuple<Volt, TableData>>>() { + : new Dictionary<PowertrainPosition, IList<Tuple<Volt, TableData>>>() { { GetElectricMachines().Entries.First().Position, new List<Tuple<Volt, TableData>>() { @@ -322,7 +322,7 @@ namespace TUGraz.VectoCore.InputData.FileIO.JSON public virtual Meter Height => Body["VehicleHeight"] == null ? null : Body.GetEx<double>("VehicleHeight").SI<Meter>(); - public virtual Dictionary<PowertrainPosition, List<Tuple<Volt, TableData>>> ElectricMotorTorqueLimits => null; + public virtual IDictionary<PowertrainPosition, IList<Tuple<Volt, TableData>>> ElectricMotorTorqueLimits => null; public virtual TableData BoostingLimitations => null; diff --git a/VectoCore/VectoCore/InputData/FileIO/XML/Declaration/DataProvider/XMLDeclarationVehicleDataProvider.cs b/VectoCore/VectoCore/InputData/FileIO/XML/Declaration/DataProvider/XMLDeclarationVehicleDataProvider.cs index 3b37daaa2b..7a8250bf57 100644 --- a/VectoCore/VectoCore/InputData/FileIO/XML/Declaration/DataProvider/XMLDeclarationVehicleDataProvider.cs +++ b/VectoCore/VectoCore/InputData/FileIO/XML/Declaration/DataProvider/XMLDeclarationVehicleDataProvider.cs @@ -229,7 +229,7 @@ namespace TUGraz.VectoCore.InputData.FileIO.XML.Declaration.DataProvider public virtual ConsumerTechnology? DoorDriveTechnology => ConsumerTechnology.Unknown; public virtual VehicleDeclarationType VehicleDeclarationType { get; } - public virtual Dictionary<PowertrainPosition, List<Tuple<Volt, TableData>>> ElectricMotorTorqueLimits => null; + public virtual IDictionary<PowertrainPosition, IList<Tuple<Volt, TableData>>> ElectricMotorTorqueLimits => null; public virtual TableData BoostingLimitations => null; @@ -551,7 +551,7 @@ namespace TUGraz.VectoCore.InputData.FileIO.XML.Declaration.DataProvider public virtual ConsumerTechnology? DoorDriveTechnology => ConsumerTechnology.Unknown; public virtual VehicleDeclarationType VehicleDeclarationType { get; } - public virtual Dictionary<PowertrainPosition, List<Tuple<Volt, TableData>>> ElectricMotorTorqueLimits { get; } + public virtual IDictionary<PowertrainPosition, IList<Tuple<Volt, TableData>>> ElectricMotorTorqueLimits { get; } public virtual TableData BoostingLimitations { get; } public virtual string VehicleTypeApprovalNumber { get; } public virtual IVehicleComponentsDeclaration Components => _components ?? (_components = ComponentReader.ComponentInputData); @@ -808,7 +808,7 @@ namespace TUGraz.VectoCore.InputData.FileIO.XML.Declaration.DataProvider #endregion - public override Dictionary<PowertrainPosition, List<Tuple<Volt, TableData>>> ElectricMotorTorqueLimits + public override IDictionary<PowertrainPosition, IList<Tuple<Volt, TableData>>> ElectricMotorTorqueLimits => ElementExists(XMLNames.ElectricMotorTorqueLimits) ? ReadElectricMotorTorqueLimits() : null; #region Overrides of XMLDeclarationVehicleDataProviderV20 @@ -820,10 +820,10 @@ namespace TUGraz.VectoCore.InputData.FileIO.XML.Declaration.DataProvider #endregion - private Dictionary<PowertrainPosition, List<Tuple<Volt, TableData>>> ReadElectricMotorTorqueLimits() + private IDictionary<PowertrainPosition, IList<Tuple<Volt, TableData>>> ReadElectricMotorTorqueLimits() { var torqueLimitNodes = GetNodes(XMLNames.ElectricMotorTorqueLimits); - var motorTorqueLimits = new Dictionary<PowertrainPosition, List<Tuple<Volt, TableData>>>(); + var motorTorqueLimits = new Dictionary<PowertrainPosition, IList<Tuple<Volt, TableData>>>(); foreach (XmlNode torqueLimitNode in torqueLimitNodes) { diff --git a/VectoCore/VectoCore/InputData/FileIO/XML/Declaration/DataProvider/XMLElectricStorageSystemDeclarationInputData.cs b/VectoCore/VectoCore/InputData/FileIO/XML/Declaration/DataProvider/XMLElectricStorageSystemDeclarationInputData.cs index d2555cb1c6..ad83f62a6e 100644 --- a/VectoCore/VectoCore/InputData/FileIO/XML/Declaration/DataProvider/XMLElectricStorageSystemDeclarationInputData.cs +++ b/VectoCore/VectoCore/InputData/FileIO/XML/Declaration/DataProvider/XMLElectricStorageSystemDeclarationInputData.cs @@ -7,6 +7,7 @@ using TUGraz.VectoCommon.Resources; using TUGraz.VectoCommon.Utils; using TUGraz.VectoCore.InputData.FileIO.XML.Declaration.Interfaces; using TUGraz.VectoCore.InputData.FileIO.XML.Declaration.Reader; +using TUGraz.VectoCore.InputData.Reader.ComponentData; using TUGraz.VectoCore.Utils; namespace TUGraz.VectoCore.InputData.FileIO.XML.Declaration.DataProvider @@ -106,10 +107,10 @@ namespace TUGraz.VectoCore.InputData.FileIO.XML.Declaration.DataProvider #region Implementation of IBatteryPackDeclarationInputData public virtual double? MinSOC => - ElementExists(XMLNames.Battery_SOCmin) ? GetDouble(XMLNames.Battery_SOCmin) : (double?)null; + ElementExists(XMLNames.Battery_SOCmin) ? GetDouble(XMLNames.Battery_SOCmin) / 100 : (double?)null; public virtual double? MaxSOC => - ElementExists(XMLNames.Battery_SOCmax) ? GetDouble(XMLNames.Battery_SOCmax) : (double?)null; + ElementExists(XMLNames.Battery_SOCmax) ? GetDouble(XMLNames.Battery_SOCmax) / 100 : (double?)null; public virtual BatteryType BatteryType => GetString(XMLNames.REESS_BatteryType).ParseEnum<BatteryType>(); public virtual AmpereSecond Capacity => GetDouble(XMLNames.REESS_RatedCapacity).SI(Unit.SI.Ampere.Hour).Cast<AmpereSecond>(); @@ -122,11 +123,11 @@ namespace TUGraz.VectoCore.InputData.FileIO.XML.Declaration.DataProvider public virtual TableData InternalResistanceCurve => ReadTableData(XMLNames.REESS_InternalResistanceCurve, XMLNames.REESS_MapEntry, new Dictionary<string, string> { - {XMLNames.REESS_InternalResistanceCurve_SoC, XMLNames.REESS_InternalResistanceCurve_SoC}, - {XMLNames.REESS_InternalResistanceCurve_R2, XMLNames.REESS_InternalResistanceCurve_R2}, - {XMLNames.REESS_InternalResistanceCurve_R10, XMLNames.REESS_InternalResistanceCurve_R10}, - {XMLNames.REESS_InternalResistanceCurve_R20, XMLNames.REESS_InternalResistanceCurve_R20}, - {XMLNames.REESS_InternalResistanceCurve_R120, XMLNames.REESS_InternalResistanceCurve_R120} + {BatteryInternalResistanceReader.Fields.StateOfCharge, XMLNames.REESS_InternalResistanceCurve_SoC}, + {BatteryInternalResistanceReader.Fields.InternalResistance_2, XMLNames.REESS_InternalResistanceCurve_R2}, + {BatteryInternalResistanceReader.Fields.InternalResistance_10, XMLNames.REESS_InternalResistanceCurve_R10}, + {BatteryInternalResistanceReader.Fields.InternalResistance_20, XMLNames.REESS_InternalResistanceCurve_R20}, + {BatteryInternalResistanceReader.Fields.InternalResistance_120, XMLNames.REESS_InternalResistanceCurve_R120} }); public virtual TableData VoltageCurve => ReadTableData(XMLNames.REESS_OCV, XMLNames.REESS_MapEntry, diff --git a/VectoCore/VectoCore/InputData/FileIO/XML/Declaration/DataProvider/v24/XMLDeclarationHeavyLorryVehicleDataProvider.cs b/VectoCore/VectoCore/InputData/FileIO/XML/Declaration/DataProvider/v24/XMLDeclarationHeavyLorryVehicleDataProvider.cs index 4b0bed4c08..a8f7717978 100644 --- a/VectoCore/VectoCore/InputData/FileIO/XML/Declaration/DataProvider/v24/XMLDeclarationHeavyLorryVehicleDataProvider.cs +++ b/VectoCore/VectoCore/InputData/FileIO/XML/Declaration/DataProvider/v24/XMLDeclarationHeavyLorryVehicleDataProvider.cs @@ -232,7 +232,7 @@ namespace TUGraz.VectoCore.InputData.FileIO.XML.Declaration.DataProvider.v24 public override IList<ITorqueLimitInputData> TorqueLimits => null; - public override Dictionary<PowertrainPosition, List<Tuple<Volt, TableData>>> ElectricMotorTorqueLimits => null; + public override IDictionary<PowertrainPosition, IList<Tuple<Volt, TableData>>> ElectricMotorTorqueLimits => null; public override TableData BoostingLimitations => null; #endregion diff --git a/VectoCore/VectoCore/InputData/FileIO/XML/Declaration/Reader/Impl/XMLDeclarationMultistageInputReader.cs b/VectoCore/VectoCore/InputData/FileIO/XML/Declaration/Reader/Impl/XMLDeclarationMultistageInputReader.cs index c8bbb71626..d7409a81fd 100644 --- a/VectoCore/VectoCore/InputData/FileIO/XML/Declaration/Reader/Impl/XMLDeclarationMultistageInputReader.cs +++ b/VectoCore/VectoCore/InputData/FileIO/XML/Declaration/Reader/Impl/XMLDeclarationMultistageInputReader.cs @@ -502,7 +502,7 @@ namespace TUGraz.VectoCore.InputData.FileIO.XML.Declaration.Reader.Impl public VehicleDeclarationType VehicleDeclarationType => _manufacturingStages?.First().Vehicle.VehicleDeclarationType ?? default(VehicleDeclarationType); - public Dictionary<PowertrainPosition, List<Tuple<Volt, TableData>>> ElectricMotorTorqueLimits => throw new NotImplementedException(); + public IDictionary<PowertrainPosition, IList<Tuple<Volt, TableData>>> ElectricMotorTorqueLimits => throw new NotImplementedException(); public TableData BoostingLimitations => throw new NotImplementedException(); #endregion diff --git a/VectoCore/VectoCore/InputData/FileIO/XML/Engineering/DataProvider/XMLEngineeringVehicleDataProvider.cs b/VectoCore/VectoCore/InputData/FileIO/XML/Engineering/DataProvider/XMLEngineeringVehicleDataProvider.cs index 74c63b6ab0..3515153724 100644 --- a/VectoCore/VectoCore/InputData/FileIO/XML/Engineering/DataProvider/XMLEngineeringVehicleDataProvider.cs +++ b/VectoCore/VectoCore/InputData/FileIO/XML/Engineering/DataProvider/XMLEngineeringVehicleDataProvider.cs @@ -148,7 +148,7 @@ namespace TUGraz.VectoCore.InputData.FileIO.XML.Engineering.DataProvider public ConsumerTechnology? DoorDriveTechnology => ConsumerTechnology.Unknown; public virtual VehicleDeclarationType VehicleDeclarationType { get; } - public Dictionary<PowertrainPosition, List<Tuple<Volt, TableData>>> ElectricMotorTorqueLimits => null; + public IDictionary<PowertrainPosition, IList<Tuple<Volt, TableData>>> ElectricMotorTorqueLimits => null; public TableData BoostingLimitations => null; diff --git a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/EngineeringDataAdapter.cs b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/EngineeringDataAdapter.cs index 9248c30bfc..e506ec9a26 100644 --- a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/EngineeringDataAdapter.cs +++ b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/EngineeringDataAdapter.cs @@ -897,9 +897,9 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter }; } - public List<Tuple<PowertrainPosition, ElectricMotorData>> CreateElectricMachines( + public IList<Tuple<PowertrainPosition, ElectricMotorData>> CreateElectricMachines( IElectricMachinesEngineeringInputData electricMachines, - Dictionary<PowertrainPosition, List<Tuple<Volt, TableData>>> torqueLimits, Volt averageVoltage, + IDictionary<PowertrainPosition, IList<Tuple<Volt, TableData>>> torqueLimits, Volt averageVoltage, GearList gearlist = null) { if (electricMachines == null) { @@ -923,7 +923,7 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter private ElectricMotorData CreateElectricMachine(PowertrainPosition powertrainPosition, IElectricMotorEngineeringInputData motorData, int count, double ratio, double[] ratioPerGear, double efficiency, TableData adcLossMap, - List<Tuple<Volt, TableData>> torqueLimits, Volt averageVoltage, GearList gearList) + IList<Tuple<Volt, TableData>> torqueLimits, Volt averageVoltage, GearList gearList) { var voltageLevels = new List<ElectricMotorVoltageLevelData>(); @@ -958,7 +958,7 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter EfficiencyData = new VoltageLevelData() { VoltageLevels = voltageLevels}, EMDragCurve = ElectricMotorDragCurveReader.Create(motorData.DragCurve, count), Inertia = motorData.Inertia * count, - OverloadRegenerationFactor = motorData.OverloadRecoveryFactor, + OverloadRecoveryFactor = motorData.OverloadRecoveryFactor, RatioADC = ratio, RatioPerGear = ratioPerGear, TransmissionLossMap = lossMap, @@ -1218,7 +1218,7 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter EfficiencyData = new VoltageLevelData() { VoltageLevels = voltageLevels }, IEPCDragCurves = dragCurves, Inertia = iepc.Inertia * count, - OverloadRegenerationFactor = iepc.OverloadRecoveryFactor, + OverloadRecoveryFactor = iepc.OverloadRecoveryFactor, RatioADC = 1, RatioPerGear = null, TransmissionLossMap = TransmissionLossMapReader.CreateEmADCLossMap(1.0, 1.0, "EM ADC LossMap Eff"), diff --git a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/HeavyLorry/DeclarationDataAdapterHeavyLorry.cs b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/HeavyLorry/DeclarationDataAdapterHeavyLorry.cs index 2c4de96055..6f3e5f2882 100644 --- a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/HeavyLorry/DeclarationDataAdapterHeavyLorry.cs +++ b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/HeavyLorry/DeclarationDataAdapterHeavyLorry.cs @@ -39,13 +39,16 @@ using TUGraz.VectoCommon.Utils; using TUGraz.VectoCore.Configuration; using TUGraz.VectoCore.InputData.Reader.ComponentData; using TUGraz.VectoCore.InputData.Reader.DataObjectAdapter.SimulationComponents; +using TUGraz.VectoCore.InputData.Reader.DataObjectAdapter.SimulationComponents.StrategyDataAdapter; using TUGraz.VectoCore.InputData.Reader.ShiftStrategy; using TUGraz.VectoCore.Models.Declaration; using TUGraz.VectoCore.Models.Simulation.Data; using TUGraz.VectoCore.Models.SimulationComponent; using TUGraz.VectoCore.Models.SimulationComponent.Data; +using TUGraz.VectoCore.Models.SimulationComponent.Data.Battery; using TUGraz.VectoCore.Models.SimulationComponent.Data.Engine; using TUGraz.VectoCore.Models.SimulationComponent.Data.Gearbox; +using TUGraz.VectoCore.Models.SimulationComponent.Impl; using TUGraz.VectoCore.Utils; namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter.HeavyLorry @@ -62,6 +65,7 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter.HeavyLorry private readonly IRetarderDataAdapter _retarderDataAdapter = new RetarderDataAdapter(); private readonly IAirdragDataAdapter _airdragDataAdapter = new AirdragDataAdapter(); private readonly IPTODataAdapter _ptoDataAdapter = new PTODataAdapterLorry(); + private IAngledriveDataAdapter _angleDriveDataAdapter = new AngledriveDataAdapter(); public DriverData CreateDriverData() { return _driverDataAdapter.CreateDriverData(); @@ -75,6 +79,29 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter.HeavyLorry loading.Value.Item2, allowVocational); } + public virtual IList<Tuple<PowertrainPosition, ElectricMotorData>> CreateElectricMachines( + IElectricMachinesDeclarationInputData electricMachines, + IDictionary<PowertrainPosition, IList<Tuple<Volt, TableData>>> torqueLimits, Volt averageVoltage, + GearList gears = null) + { + throw new NotImplementedException(); + } + + public virtual BatterySystemData CreateBatteryData(IElectricStorageSystemDeclarationInputData componentsElectricStorage) + { + throw new NotImplementedException(); + } + + public virtual SuperCapData CreateSuperCapData(IElectricStorageSystemDeclarationInputData componentsElectricStorage) + { + throw new NotImplementedException(); + } + + public virtual HybridStrategyParameters CreateHybridStrategy(BatterySystemData runDataBatteryData, SuperCapData runDataSuperCapData) + { + throw new NotImplementedException(); + } + public virtual AirdragData CreateAirdragData(IAirdragDeclarationInputData airdragData, Mission mission, Segment segment) { @@ -86,9 +113,10 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter.HeavyLorry return _axleGearDataAdapter.CreateAxleGearData(axlegearData); } - public virtual AngledriveData CreateAngledriveData(IAngledriveInputData angledriveData) + + public AngledriveData CreateAngledriveData(IAngledriveInputData data) { - throw new NotImplementedException(); + return _angleDriveDataAdapter.CreateAngledriveData(data, false); } public virtual CombustionEngineData CreateEngineData(IVehicleDeclarationInputData vehicle, @@ -104,12 +132,15 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter.HeavyLorry throw new NotImplementedException(); } - public abstract ShiftStrategyParameters CreateGearshiftData(GearboxData gbx, double axleRatio, - PerSecond engineIdlingSpeed); + public virtual ShiftStrategyParameters CreateGearshiftData(GearboxData gbx, double axleRatio, + PerSecond engineIdlingSpeed) + { + throw new NotImplementedException(); + } - public RetarderData CreateRetarderData(IRetarderInputData retarderData) + public RetarderData CreateRetarderData(IRetarderInputData retarderData, PowertrainPosition position) { - return _retarderDataAdapter.CreateRetarderData(retarderData); + return _retarderDataAdapter.CreateRetarderData(retarderData, position); } public PTOData CreatePTOTransmissionData(IPTOTransmissionInputData ptoData) @@ -136,7 +167,6 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter.HeavyLorry private IEngineDataAdapter _engineDataAdapter = new CombustionEngineComponentDataAdapter(); private IGearboxDataAdapter _gearboxDataAdapter = new GearboxDataAdapter(new TorqueConverterDataAdapter()); - private IAngledriveDataAdapter _angleDriveDataAdapter = new AngledriveDataAdapter(); private IAuxiliaryDataAdapter _auxAdapter = new HeavyLorryAuxiliaryDataAdapter(); public override CombustionEngineData CreateEngineData( IVehicleDeclarationInputData vehicle, IEngineModeDeclarationInputData mode, Mission mission) @@ -161,10 +191,6 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter.HeavyLorry #endregion - public override AngledriveData CreateAngledriveData(IAngledriveInputData data) - { - return _angleDriveDataAdapter.CreateAngledriveData(data, false); - } public override IList<VectoRunData.AuxData> CreateAuxiliaryData( @@ -177,15 +203,49 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter.HeavyLorry } } - public abstract class SerialHybrid : LorryBase + public abstract class Hybrid : LorryBase { + private IEngineDataAdapter _engineDataAdapter = new CombustionEngineComponentDataAdapter(); + private ElectricMachinesDataAdapter _electricMachinesDataAdapter = new ElectricMachinesDataAdapter(); + private ElectricStorageAdapter _eletricStorageAdapter = new ElectricStorageAdapter(); + public override CombustionEngineData CreateEngineData( + IVehicleDeclarationInputData vehicle, IEngineModeDeclarationInputData mode, Mission mission) + { + return _engineDataAdapter.CreateEngineData(vehicle, mode, mission); + } + #region Overrides of LorryBase - public override ShiftStrategyParameters CreateGearshiftData(GearboxData gbx, double axleRatio, PerSecond engineIdlingSpeed) + public override IList<Tuple<PowertrainPosition, ElectricMotorData>> CreateElectricMachines( + IElectricMachinesDeclarationInputData electricMachines, + IDictionary<PowertrainPosition, IList<Tuple<Volt, TableData>>> torqueLimits, Volt averageVoltage, + GearList gears = null) { - throw new NotImplementedException(); + return _electricMachinesDataAdapter.CreateElectricMachines(electricMachines, torqueLimits, averageVoltage, + gears); + } + + public override BatterySystemData CreateBatteryData(IElectricStorageSystemDeclarationInputData batteryInputData) + { + return _eletricStorageAdapter.CreateBatteryData(batteryInputData); } + public override SuperCapData CreateSuperCapData(IElectricStorageSystemDeclarationInputData reessInputData) + { + return _eletricStorageAdapter.CreateSuperCapData(reessInputData); + } + + //public RetarderData CreateRetarderData + + #endregion + } + + public abstract class SerialHybrid : Hybrid + { + #region Overrides of LorryBase + + + public override IList<VectoRunData.AuxData> CreateAuxiliaryData(IAuxiliariesDeclarationInputData auxData, IBusAuxiliariesDeclarationData busAuxData, MissionType missionType, VehicleClass vehicleClass, Meter vehicleLength, int? numSteeredAxles) { @@ -195,8 +255,10 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter.HeavyLorry #endregion } - public abstract class ParallelHybrid : LorryBase + public abstract class ParallelHybrid : Hybrid { + private ParallelHybridStrategyParameterDataAdapter _hybridStrategyDataAdapter = + new ParallelHybridStrategyParameterDataAdapter(); #region Overrides of LorryBase public override ShiftStrategyParameters CreateGearshiftData(GearboxData gbx, double axleRatio, PerSecond engineIdlingSpeed) @@ -210,6 +272,11 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter.HeavyLorry throw new NotImplementedException(); } + public override HybridStrategyParameters CreateHybridStrategy(BatterySystemData runDataBatteryData, SuperCapData runDataSuperCapData) + { + return _hybridStrategyDataAdapter.CreateHybridStrategyParameters(runDataBatteryData, runDataSuperCapData); + } + #endregion } @@ -230,7 +297,26 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter.HeavyLorry #endregion } - public class HEV_S2 : SerialHybrid { } + + public class HEV_S2 : SerialHybrid + { + #region Overrides of LorryBase + public static readonly GearboxType[] SupportedGearboxTypes = + { GearboxType.AMT, GearboxType.ATPowerSplit, GearboxType.ATSerial, GearboxType.APTN }; + private GearboxDataAdapter _gearBoxDataAdaper = new GearboxDataAdapter(new TorqueConverterDataAdapter()); + public override GearboxData CreateGearboxData(IVehicleDeclarationInputData inputData, VectoRunData runData, + IShiftPolygonCalculator shiftPolygonCalc) + { + return _gearBoxDataAdaper.CreateGearboxData(inputData, runData, shiftPolygonCalc, SupportedGearboxTypes); + } + + public override ShiftStrategyParameters CreateGearshiftData(GearboxData gbx, double axleRatio, PerSecond engineIdlingSpeed) + { + return _gearBoxDataAdaper.CreateGearshiftData(gbx, axleRatio, engineIdlingSpeed); + } + + #endregion + } public class HEV_S3 : SerialHybrid { } public class HEV_S4 : SerialHybrid { } public class HEV_S_IEPC : SerialHybrid { } diff --git a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/HeavyLorry/DeclarationDataAdapterHeavyLorry_old.cs b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/HeavyLorry/DeclarationDataAdapterHeavyLorry_old.cs deleted file mode 100644 index feedd1a623..0000000000 --- a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/HeavyLorry/DeclarationDataAdapterHeavyLorry_old.cs +++ /dev/null @@ -1,104 +0,0 @@ -//using System; -//using System.Collections.Generic; -//using TUGraz.VectoCommon.InputData; -//using TUGraz.VectoCommon.Models; -//using TUGraz.VectoCommon.Utils; -//using TUGraz.VectoCore.InputData.Reader.ComponentData; -//using TUGraz.VectoCore.Models.Declaration; -//using TUGraz.VectoCore.Models.Simulation.Data; -//using TUGraz.VectoCore.Models.SimulationComponent; -//using TUGraz.VectoCore.Models.SimulationComponent.Data; - -//namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter.HeavyLorry -//{ - - - -// public partial class DeclarationDataAdapterHeavyLorry -// { -// [Obsolete("Use DeclarationDataAdapterHeavyLorry.Conventional instead, created automatically with NInject")] -// public DeclarationDataAdapterHeavyLorry() { } - -// private IDeclarationDataAdapter _declarationDataAdapterImplementation = new Conventional(); -// public static readonly GearboxType[] SupportedGearboxTypes = Conventional.SupportedGearboxTypes; - -// //public static List<CrossWindCorrectionCurveReader.CrossWindCorrectionEntry> GetDeclarationAirResistanceCurve( -// // string parameterSet, SquareMeter si, Meter meter) -// //{ -// // //return Conventional.GetDeclarationAirResistanceCurve(parameterSet, si, meter); -// //} - -// #region Implementation of IDeclarationDataAdapter - -// public DriverData CreateDriverData() -// { -// return _declarationDataAdapterImplementation.CreateDriverData(); -// } - -// public VehicleData CreateVehicleData(IVehicleDeclarationInputData vehicle, Segment segment, Mission mission, -// KeyValuePair<LoadingType, Tuple<Kilogram, double?>> loading, bool allowVocational) -// { -// return _declarationDataAdapterImplementation.CreateVehicleData(vehicle, segment, mission, loading, -// allowVocational); -// } - -// public AirdragData CreateAirdragData(IAirdragDeclarationInputData airdragData, Mission mission, Segment segment) -// { -// return _declarationDataAdapterImplementation.CreateAirdragData(airdragData, mission, segment); -// } - -// public AxleGearData CreateAxleGearData(IAxleGearInputData axlegearData) -// { -// return _declarationDataAdapterImplementation.CreateAxleGearData(axlegearData); -// } - -// public AngledriveData CreateAngledriveData(IAngledriveInputData angledriveData) -// { -// return _declarationDataAdapterImplementation.CreateAngledriveData(angledriveData); -// } - -// public CombustionEngineData CreateEngineData(IVehicleDeclarationInputData vehicle, -// IEngineModeDeclarationInputData engineMode, -// Mission mission) -// { -// return _declarationDataAdapterImplementation.CreateEngineData(vehicle, engineMode, mission); -// } - -// public GearboxData CreateGearboxData(IVehicleDeclarationInputData inputData, VectoRunData runData, -// IShiftPolygonCalculator shiftPolygonCalc) -// { -// return _declarationDataAdapterImplementation.CreateGearboxData(inputData, runData, shiftPolygonCalc); -// } - -// public ShiftStrategyParameters CreateGearshiftData(GearboxData gbx, double axleRatio, -// PerSecond engineIdlingSpeed) -// { -// return _declarationDataAdapterImplementation.CreateGearshiftData(gbx, axleRatio, engineIdlingSpeed); -// } - -// public RetarderData CreateRetarderData(IRetarderInputData retarderData) -// { -// return _declarationDataAdapterImplementation.CreateRetarderData(retarderData); -// } - -// public PTOData CreatePTOTransmissionData(IPTOTransmissionInputData ptoData) -// { -// return _declarationDataAdapterImplementation.CreatePTOTransmissionData(ptoData); -// } - -// public IList<VectoRunData.AuxData> CreateAuxiliaryData(IAuxiliariesDeclarationInputData auxData, -// IBusAuxiliariesDeclarationData busAuxData, -// MissionType missionType, VehicleClass vehicleClass, Meter vehicleLength, int? numSteeredAxles) -// { -// return _declarationDataAdapterImplementation.CreateAuxiliaryData(auxData, busAuxData, missionType, -// vehicleClass, vehicleLength, numSteeredAxles); -// } - -// public AxleGearData CreateDummyAxleGearData(IGearboxDeclarationInputData gbxData) -// { -// return _declarationDataAdapterImplementation.CreateDummyAxleGearData(gbxData); -// } - -// #endregion -// } -//} \ No newline at end of file diff --git a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/IDeclarationDataAdapter.cs b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/IDeclarationDataAdapter.cs index 83f7c24a64..cd3fb54430 100644 --- a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/IDeclarationDataAdapter.cs +++ b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/IDeclarationDataAdapter.cs @@ -8,6 +8,8 @@ using TUGraz.VectoCore.Models.Declaration; using TUGraz.VectoCore.Models.Simulation.Data; using TUGraz.VectoCore.Models.SimulationComponent; using TUGraz.VectoCore.Models.SimulationComponent.Data; +using TUGraz.VectoCore.Models.SimulationComponent.Data.Battery; +using TUGraz.VectoCore.Models.SimulationComponent.Impl; namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter { @@ -45,7 +47,7 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter PTOData CreatePTOTransmissionData(IPTOTransmissionInputData ptoData); - RetarderData CreateRetarderData(IRetarderInputData retarderData); + RetarderData CreateRetarderData(IRetarderInputData retarderData, PowertrainPosition position = PowertrainPosition.HybridPositionNotSet); ShiftStrategyParameters CreateGearshiftData(GearboxData gbx, double axleRatio, PerSecond engineIdlingSpeed); @@ -60,8 +62,12 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter IList<VectoRunData.AuxData> CreateAuxiliaryData(IAuxiliariesDeclarationInputData auxData, IBusAuxiliariesDeclarationData busAuxData, MissionType missionType, VehicleClass vehicleClass, Meter vehicleLength, int? numSteeredAxles); - - VehicleData CreateVehicleData(IVehicleDeclarationInputData vehicle, Segment segment, Mission mission, KeyValuePair<LoadingType, Tuple<Kilogram, double?>> loading, bool allowVocational); + + + IList<Tuple<PowertrainPosition, ElectricMotorData>> CreateElectricMachines(IElectricMachinesDeclarationInputData electricMachines, IDictionary<PowertrainPosition, IList<Tuple<Volt, TableData>>> torqueLimits, Volt averageVoltage, GearList gears = null); + BatterySystemData CreateBatteryData(IElectricStorageSystemDeclarationInputData componentsElectricStorage); + SuperCapData CreateSuperCapData(IElectricStorageSystemDeclarationInputData componentsElectricStorage); + HybridStrategyParameters CreateHybridStrategy(BatterySystemData runDataBatteryData, SuperCapData runDataSuperCapData); } public interface IPrimaryBusDeclarationDataAdapter : IDeclarationDataAdapter diff --git a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/PrimaryBus/DeclarationDataAdapterPrimaryBus.cs b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/PrimaryBus/DeclarationDataAdapterPrimaryBus.cs index d051be2fe3..532be24428 100644 --- a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/PrimaryBus/DeclarationDataAdapterPrimaryBus.cs +++ b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/PrimaryBus/DeclarationDataAdapterPrimaryBus.cs @@ -140,63 +140,107 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter.PrimaryBus #endregion } - public class HEV_S2 : PrimaryBusBase + public abstract class Hybrid : PrimaryBusBase { + private CombustionEngineComponentDataAdapter _engineDataAdapter = new CombustionEngineComponentDataAdapter(); + #region Overrides of PrimaryBusBase + + public override CombustionEngineData CreateEngineData(IVehicleDeclarationInputData vehicle, IEngineModeDeclarationInputData engineMode, + Mission mission) + { + return _engineDataAdapter.CreateEngineData(vehicle, engineMode, mission); + } + + + + #endregion } - public class HEV_S3 : PrimaryBusBase + public abstract class SerialHybrid : Hybrid { } - public class HEV_S4 : PrimaryBusBase + public class HEV_S2 : SerialHybrid { } - public class HEV_S_IEPC : PrimaryBusBase + public class HEV_S3 : SerialHybrid { } - public class HEV_P1 : PrimaryBusBase + public class HEV_S4 : SerialHybrid { } - public class HEV_P2 : PrimaryBusBase + public class HEV_S_IEPC : SerialHybrid { } - public class HEV_P2_5 : PrimaryBusBase + public abstract class ParallelHybrid : Hybrid { + private GearboxDataAdapter _gearboxDataAdapter = new GearboxDataAdapter(new TorqueConverterDataAdapter()); + public override GearboxData CreateGearboxData(IVehicleDeclarationInputData inputData, VectoRunData runData, + IShiftPolygonCalculator shiftPolygonCalc) + { + return _gearboxDataAdapter.CreateGearboxData(inputData, runData, shiftPolygonCalc, + supportedGearboxTypes: SupportedGearboxTypes); + } + public override ShiftStrategyParameters CreateGearshiftData(GearboxData gbx, double axleRatio, PerSecond engineIdlingSpeed) + { + return _gearboxDataAdapter.CreateGearshiftData(gbx, axleRatio, engineIdlingSpeed); + } } - public class HEV_P3 : PrimaryBusBase + public class HEV_P1 : ParallelHybrid { } - public class HEV_P4 : PrimaryBusBase + public class HEV_P2 : ParallelHybrid { } - public class PEV_E2 : PrimaryBusBase + public class HEV_P2_5 : ParallelHybrid + { + + } + + public class HEV_P3 : ParallelHybrid + { + + } + + public class HEV_P4 : ParallelHybrid + { + + } + + public abstract class BatteryElectric : PrimaryBusBase + { + + } + + + public class PEV_E2 : BatteryElectric { } - public class PEV_E3 : PrimaryBusBase + public class PEV_E3 : BatteryElectric { } - public class PEV_E4 : PrimaryBusBase + public class PEV_E4 : BatteryElectric { } diff --git a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/SimulationComponents/AuxiliaryDataAdapter.cs b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/SimulationComponents/AuxiliaryDataAdapter.cs index 388afe80d7..09cfb91903 100644 --- a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/SimulationComponents/AuxiliaryDataAdapter.cs +++ b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/SimulationComponents/AuxiliaryDataAdapter.cs @@ -42,6 +42,9 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter.SimulationComponen TechnologyBenefits SelectBenefitForFloorType(FloorType floorType, List<SSMTechnology> onVehicle); } + + + public abstract class AuxiliaryDataAdapter : ComponentDataAdapterBase, IAuxiliaryDataAdapter { public class ElectricConsumerEntry diff --git a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/SimulationComponents/BatteryDataAdapter.cs b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/SimulationComponents/BatteryDataAdapter.cs new file mode 100644 index 0000000000..35e85a25fc --- /dev/null +++ b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/SimulationComponents/BatteryDataAdapter.cs @@ -0,0 +1,137 @@ +using System; +using System.Linq; +using System.Security.Policy; +using TUGraz.VectoCommon.InputData; +using TUGraz.VectoCommon.Utils; +using TUGraz.VectoCore.InputData.Reader.ComponentData; +using TUGraz.VectoCore.Models.Declaration; +using TUGraz.VectoCore.Models.SimulationComponent.Data; +using TUGraz.VectoCore.Models.SimulationComponent.Data.Battery; +using TUGraz.VectoCore.Models.SimulationComponent.Impl; + +namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter.SimulationComponents +{ + public class ElectricStorageAdapter + { + public BatterySystemData CreateBatteryData(IElectricStorageSystemDeclarationInputData batteryInputData) + { + if (batteryInputData == null) + { + return null; + } + + var bat = batteryInputData.ElectricStorageElements.Where(x => x.REESSPack.StorageType == REESSType.Battery).ToArray(); + + if (bat.Length == 0) + { + return null; + } + + var retVal = new BatterySystemData(); + foreach (var entry in bat) + { + var b = entry.REESSPack as IBatteryPackDeclarationInputData; + if (b == null) + { + continue; + } + + //for (var i = 0; i < entry.Count; i++) { + var minSoc = DeclarationData.Battery.GetMinSoc(b.BatteryType); + if (b.MinSOC != null && b.MinSOC > minSoc) { + minSoc = b.MinSOC.Value; + } + var maxSoc = DeclarationData.Battery.GetMaxSoc(b.BatteryType); + if (b.MaxSOC != null && b.MaxSOC < maxSoc) { + maxSoc = b.MaxSOC.Value; + } + + var batteryData = new BatteryData() { + MinSOC = minSoc, + MaxSOC = maxSoc, + MaxCurrent = BatteryMaxCurrentReader.Create(b.MaxCurrentMap), + Capacity = b.Capacity, + InternalResistance = + BatteryInternalResistanceReader.Create(b.InternalResistanceCurve, false), + SOCMap = BatterySOCReader.Create(b.VoltageCurve), + }; + + retVal.Batteries.Add(Tuple.Create(entry.StringId, batteryData)); + //} + } + + + + retVal.InitialSoC = CalculateInitialSoc(retVal); + return retVal; + } + + private double CalculateInitialSoc(BatterySystemData battery) + { + var socLimits = battery.GetSocLimits(); + return (socLimits.MaxSoc - socLimits.MinSoc) / 2; + } + + public SuperCapData CreateSuperCapData(IElectricStorageSystemDeclarationInputData reessInputData) + { + if (reessInputData == null) + { + return null; + } + + var superCaps = reessInputData.ElectricStorageElements.Where(x => x.REESSPack.StorageType == REESSType.SuperCap).ToArray(); + + var superCap = superCaps.FirstOrDefault()?.REESSPack as ISuperCapDeclarationInputData; + + if (superCap == null) + { + return null; + } + + return new SuperCapData() + { + Capacity = superCaps.First().Count * superCap.Capacity, + InternalResistance = superCap.InternalResistance / superCaps.First().Count, + MinVoltage = superCap.MinVoltage * DeclarationData.SuperCap.SocMin, //Überschreiben prozent beziehen sich auf max voltage + MaxVoltage = superCap.MaxVoltage, + MaxCurrentCharge = superCap.MaxCurrentCharge, + MaxCurrentDischarge = -superCap.MaxCurrentDischarge, + InitialSoC = Math.Sqrt(Math.Pow(superCap.MaxVoltage.Value(), 2) - Math.Pow(superCap.MaxVoltage.Value(), 2)) / + superCap.MaxVoltage.Value() + }; + } + + + + } + + public static class BatterySystemHelper + { + public static Volt CalculateAverageVoltage(this BatterySystemData battery) + { + if (battery == null) + { + return null; + } + var tmpBattery = new BatterySystem(null, battery); + var min = tmpBattery.MinSoC; + var max = tmpBattery.MaxSoC; + var averageSoC = (min + max) / 2.0; + + tmpBattery.Initialize(averageSoC); + return tmpBattery.InternalVoltage; + } + + + public static (double MinSoc, double MaxSoc) GetSocLimits(this BatterySystemData battery) + { + if (battery == null) { + throw new ArgumentNullException(); + } + + var tmpBattery = new BatterySystem(null, battery); + return (tmpBattery.MinSoC, tmpBattery.MaxSoC); + } + } + +} \ No newline at end of file diff --git a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/SimulationComponents/ElectricMachinesDataAdapter.cs b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/SimulationComponents/ElectricMachinesDataAdapter.cs new file mode 100644 index 0000000000..80865bf1d6 --- /dev/null +++ b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/SimulationComponents/ElectricMachinesDataAdapter.cs @@ -0,0 +1,288 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using TUGraz.VectoCommon.Exceptions; +using TUGraz.VectoCommon.InputData; +using TUGraz.VectoCommon.Utils; +using TUGraz.VectoCore.InputData.Reader.ComponentData; +using TUGraz.VectoCore.Models.Declaration; +using TUGraz.VectoCore.Models.SimulationComponent.Data; +using TUGraz.VectoCore.Models.SimulationComponent.Data.ElectricMotor; +using TUGraz.VectoCore.Models.SimulationComponent.Impl; + +namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter.SimulationComponents +{ + public class ElectricMachinesDataAdapter + { + public IList<Tuple<PowertrainPosition, ElectricMotorData>> CreateElectricMachines( + IElectricMachinesDeclarationInputData electricMachines, + IDictionary<PowertrainPosition, IList<Tuple<Volt, TableData>>> torqueLimits, Volt averageVoltage, GearList gearlist = null) + { + var result = new List<Tuple<PowertrainPosition, ElectricMotorData>>(); + if (electricMachines == null) { + return null; + } + if (electricMachines.Entries.Select(x => x.Position).Where(x => x != PowertrainPosition.GEN).Distinct().Count() > 1) + { + throw new VectoException("multiple electric propulsion motors are not supported at the moment"); + } + + return electricMachines.Entries + .Select(x => Tuple.Create(x.Position, + CreateElectricMachine(x.Position, x.ElectricMachine, x.Count, x.RatioADC, x.RatioPerGear, x.MechanicalTransmissionEfficiency, + x.MechanicalTransmissionLossMap, torqueLimits?.First(t => t.Key == x.Position).Value, averageVoltage, gearlist))).ToList(); + + return result; + } + + private ElectricMotorData CreateElectricMachine(PowertrainPosition powertrainPosition, + IElectricMotorDeclarationInputData motorData, + int count, + double ratio, + double[] ratioPerGear, + double efficiency, + TableData adcLossMap, + IList<Tuple<Volt, TableData>> torqueLimits, + Volt averageVoltage, GearList gearList) + { + + var voltageLevels = new List<ElectricMotorVoltageLevelData>(); + + foreach (var entry in motorData.VoltageLevels.OrderBy(x => x.VoltageLevel)) + { + var fullLoadCurve = ElectricFullLoadCurveReader.Create(entry.FullLoadCurve, count); + var maxTorqueCurve = torqueLimits == null + ? null + : ElectricFullLoadCurveReader.Create( + torqueLimits.FirstOrDefault(x => x.Item1 == null || x.Item1.IsEqual(entry.VoltageLevel))?.Item2, count); + + var fullLoadCurveCombined = IntersectEMFullLoadCurves(fullLoadCurve, maxTorqueCurve); + + var vLevelData = powertrainPosition == PowertrainPosition.IHPC + ? CreateIHPCVoltageLevelData(count, entry, fullLoadCurveCombined, gearList) + : CreateEmVoltageLevelData(count, entry, fullLoadCurveCombined); + voltageLevels.Add(vLevelData); + + } + + if (averageVoltage == null) + { + // if no average voltage is provided (e.g. for supercap) use mean value of measured voltage maps + averageVoltage = (voltageLevels.Min(x => x.Voltage) + voltageLevels.Max(x => x.Voltage)) / 2.0; + } + + var lossMap = powertrainPosition == PowertrainPosition.IHPC + ? TransmissionLossMapReader.CreateEmADCLossMap(1.0, 1.0, "EM ADC IHPC LossMap Eff") + : adcLossMap != null + ? TransmissionLossMapReader.CreateEmADCLossMap(adcLossMap, ratio, "EM ADC LossMap") + : TransmissionLossMapReader.CreateEmADCLossMap(efficiency, ratio, "EM ADC LossMap Eff"); + + var retVal = new ElectricMotorData() + { + EfficiencyData = new VoltageLevelData() { VoltageLevels = voltageLevels }, + EMDragCurve = ElectricMotorDragCurveReader.Create(motorData.DragCurve, count), + Inertia = motorData.Inertia * count, + OverloadRecoveryFactor = DeclarationData.OverloadRecoveryFactor, + RatioADC = ratio, + RatioPerGear = ratioPerGear, + TransmissionLossMap = lossMap, + }; + retVal.Overload = CalculateOverloadData(motorData, count, retVal.EfficiencyData, averageVoltage); + return retVal; + } + + private static ElectricMotorFullLoadCurve IntersectEMFullLoadCurves(ElectricMotorFullLoadCurve fullLoadCurve, + ElectricMotorFullLoadCurve maxTorqueCurve) + { + if (maxTorqueCurve == null) + { + return fullLoadCurve; + } + + if (maxTorqueCurve.MaxSpeed.IsSmaller(fullLoadCurve.MaxSpeed)) + { + throw new VectoException("EM Torque limitation has to cover the whole speed range"); + } + + var motorSpeeds = fullLoadCurve.FullLoadEntries.Select(x => x.MotorSpeed) + .Concat(maxTorqueCurve.FullLoadEntries.Select(x => x.MotorSpeed)).ToList(); + // iterate over all segments in the full-load curve + foreach (var fldTuple in fullLoadCurve.FullLoadEntries.Pairwise()) + { + // find all grid points of max torque curve within the current segment of fld + var maxPtsWithinSegment = maxTorqueCurve.FullLoadEntries.Where(x => + x.MotorSpeed.IsGreaterOrEqual(fldTuple.Item1.MotorSpeed) && + x.MotorSpeed.IsSmallerOrEqual(fldTuple.Item2.MotorSpeed)).OrderBy(x => x.MotorSpeed).ToList(); + if (maxPtsWithinSegment.Count == 0) + { + // if grid pint is within, take the 'surrounding' segment + var segment = + maxTorqueCurve.FullLoadEntries.GetSection(x => x.MotorSpeed < fldTuple.Item1.MotorSpeed); + maxPtsWithinSegment = new[] { segment.Item1, segment.Item2 }.ToList(); + } + else + { + // add the point just before and just after the current list of points + if (maxPtsWithinSegment.Min(x => x.MotorSpeed).IsGreater(fldTuple.Item1.MotorSpeed)) + { + maxPtsWithinSegment.Add(maxTorqueCurve.FullLoadEntries.Last(x => + x.MotorSpeed.IsSmaller(fldTuple.Item1.MotorSpeed))); + } + + if (maxPtsWithinSegment.Max(x => x.MotorSpeed).IsSmaller(fldTuple.Item2.MotorSpeed)) + { + maxPtsWithinSegment.Add(maxTorqueCurve.FullLoadEntries.First(x => x.MotorSpeed.IsGreater(fldTuple.Item2.MotorSpeed))); + } + + maxPtsWithinSegment = maxPtsWithinSegment.OrderBy(x => x.MotorSpeed).ToList(); + } + + var fldEdgeDrive = + Edge.Create(new Point(fldTuple.Item1.MotorSpeed.Value(), fldTuple.Item1.FullDriveTorque.Value()), + new Point(fldTuple.Item2.MotorSpeed.Value(), fldTuple.Item2.FullDriveTorque.Value())); + var fldEdgeGenerate = + Edge.Create(new Point(fldTuple.Item1.MotorSpeed.Value(), fldTuple.Item1.FullGenerationTorque.Value()), + new Point(fldTuple.Item2.MotorSpeed.Value(), fldTuple.Item2.FullGenerationTorque.Value())); + foreach (var maxTuple in maxPtsWithinSegment.Pairwise()) + { + var maxEdgeDrive = + Edge.Create(new Point(maxTuple.Item1.MotorSpeed.Value(), maxTuple.Item1.FullDriveTorque.Value()), + new Point(maxTuple.Item2.MotorSpeed.Value(), maxTuple.Item2.FullDriveTorque.Value())); + if (!(maxEdgeDrive.SlopeXY - fldEdgeDrive.SlopeXY).IsEqual(0, 1e-12)) + { + // lines are not parallel + var nIntersectDrive = + ((fldEdgeDrive.OffsetXY - maxEdgeDrive.OffsetXY) / + (maxEdgeDrive.SlopeXY - fldEdgeDrive.SlopeXY)).SI<PerSecond>(); + if (nIntersectDrive.IsBetween(fldTuple.Item1.MotorSpeed, fldTuple.Item2.MotorSpeed)) + { + motorSpeeds.Add(nIntersectDrive); + } + } + + var maxEdgeGenerate = + Edge.Create(new Point(maxTuple.Item1.MotorSpeed.Value(), maxTuple.Item1.FullGenerationTorque.Value()), + new Point(maxTuple.Item2.MotorSpeed.Value(), maxTuple.Item2.FullGenerationTorque.Value())); + if (!((maxEdgeGenerate.SlopeXY - fldEdgeGenerate.SlopeXY).IsEqual(0, 1e-12))) + { + // lines are not parallel + var nIntersectGenerate = + ((fldEdgeGenerate.OffsetXY - maxEdgeGenerate.OffsetXY) / + (maxEdgeGenerate.SlopeXY - fldEdgeGenerate.SlopeXY)).SI<PerSecond>(); + + + if (nIntersectGenerate.IsBetween(fldTuple.Item1.MotorSpeed, fldTuple.Item2.MotorSpeed)) + { + motorSpeeds.Add(nIntersectGenerate); + } + } + } + } + + // create new full-load curve with values closest to zero. + return new ElectricMotorFullLoadCurve(motorSpeeds.OrderBy(x => x.Value()).Distinct().Select(x => + new ElectricMotorFullLoadCurve.FullLoadEntry() + { + MotorSpeed = x, + FullDriveTorque = VectoMath.Max(fullLoadCurve.FullLoadDriveTorque(x), + maxTorqueCurve.FullLoadDriveTorque(x)), + FullGenerationTorque = VectoMath.Min(fullLoadCurve.FullGenerationTorque(x), + maxTorqueCurve.FullGenerationTorque(x)), + }).ToList()); + } + + private ElectricMotorVoltageLevelData CreateIHPCVoltageLevelData(int count, IElectricMotorVoltageLevel entry, ElectricMotorFullLoadCurve fullLoadCurveCombined, GearList gearList) + { + if (gearList == null) + { + throw new VectoException("no gears provided for IHPC EM"); + } + + if (gearList.Count() != entry.PowerMap.Count) + { + throw new VectoException( + $"number of gears in transmission does not match gears in electric motor (IHPC) - {gearList.Count()}/{entry.PowerMap.Count}"); + } + var effMap = new Dictionary<uint, EfficiencyMap>(); + foreach (var gear in gearList) + { + effMap.Add(gear.Gear, ElectricMotorMapReader.Create(entry.PowerMap[(int)gear.Gear - 1].PowerMap, count)); + } + return new IEPCVoltageLevelData() + { + Voltage = entry.VoltageLevel, + FullLoadCurve = fullLoadCurveCombined, + EfficiencyMaps = effMap, + }; + } + + private static ElectricMotorVoltageLevelData CreateEmVoltageLevelData(int count, IElectricMotorVoltageLevel entry, ElectricMotorFullLoadCurve fullLoadCurveCombined) + { + return new ElectricMotorVoltageLevelData() + { + Voltage = entry.VoltageLevel, + + FullLoadCurve = fullLoadCurveCombined, + // DragCurve = ElectricMotorDragCurveReader.Create(entry.DragCurve, count), + EfficiencyMap = ElectricMotorMapReader.Create(entry.PowerMap.First().PowerMap, count), //PowerMap + }; + } + + private OverloadData CalculateOverloadData(IElectricMotorDeclarationInputData motorData, int count, VoltageLevelData voltageLevels, Volt averageVoltage) + { + + // if average voltage is outside of the voltage-level range, do not extrapolate but take the min voltage entry, or max voltage entry + if (averageVoltage < motorData.VoltageLevels.Min(x => x.VoltageLevel)) + { + return CalculateOverloadBuffer(motorData.VoltageLevels.First(), count, voltageLevels); + } + if (averageVoltage > motorData.VoltageLevels.Max(x => x.VoltageLevel)) + { + return CalculateOverloadBuffer(motorData.VoltageLevels.Last(), count, voltageLevels); + } + + var (vLow, vHigh) = motorData.VoltageLevels.OrderBy(x => x.VoltageLevel).GetSection(x => x.VoltageLevel < averageVoltage); + var ovlLo = CalculateOverloadBuffer(vLow, count, voltageLevels); + var ovlHi = CalculateOverloadBuffer(vHigh, count, voltageLevels); + + var retVal = new OverloadData() + { + OverloadBuffer = VectoMath.Interpolate(vLow.VoltageLevel, vHigh.VoltageLevel, ovlLo.OverloadBuffer, ovlHi.OverloadBuffer, averageVoltage), + ContinuousTorque = VectoMath.Interpolate(vLow.VoltageLevel, vHigh.VoltageLevel, ovlLo.ContinuousTorque, ovlHi.ContinuousTorque, averageVoltage), + ContinuousPowerLoss = VectoMath.Interpolate(vLow.VoltageLevel, vHigh.VoltageLevel, ovlLo.ContinuousPowerLoss, ovlHi.ContinuousPowerLoss, averageVoltage) + }; + return retVal; + } + + private OverloadData CalculateOverloadBuffer(IElectricMotorVoltageLevel voltageEntry, + int count, VoltageLevelData voltageLevels, Tuple<uint, double> gearUsedForMeasurement = null) + { + var gearRatioUsedForMeasurement = gearUsedForMeasurement?.Item2 ?? 1.0; + var gear = new GearshiftPosition(gearUsedForMeasurement?.Item1 ?? 1); + var continuousTorque = voltageEntry.ContinuousTorque * count / gearRatioUsedForMeasurement; + var continuousTorqueSpeed = voltageEntry.ContinuousTorqueSpeed * gearRatioUsedForMeasurement; + var overloadTorque = (voltageEntry.OverloadTorque ?? 0.SI<NewtonMeter>()) * count / gearRatioUsedForMeasurement; + var overloadTestSpeed = (voltageEntry.OverloadTestSpeed ?? 0.RPMtoRad()) * gearRatioUsedForMeasurement; + + + var peakElPwr = voltageLevels.LookupElectricPower(voltageEntry.VoltageLevel, overloadTestSpeed, -overloadTorque, gear, true) + .ElectricalPower; + var peakPwrLoss = -peakElPwr - overloadTorque * overloadTestSpeed; // losses need to be positive + + var contElPwr = voltageLevels.LookupElectricPower(voltageEntry.VoltageLevel, continuousTorqueSpeed, + -continuousTorque, gear).ElectricalPower ?? + voltageLevels.LookupElectricPower(voltageEntry.VoltageLevel, continuousTorqueSpeed, + voltageLevels.FullLoadDriveTorque(voltageEntry.VoltageLevel, continuousTorqueSpeed), + gear, true).ElectricalPower; + var continuousPowerLoss = -contElPwr - continuousTorque * continuousTorqueSpeed; // loss needs to be positive + var overloadBuffer = (peakPwrLoss - continuousPowerLoss) * voltageEntry.OverloadTime; + return new OverloadData() + { + OverloadBuffer = overloadBuffer, + ContinuousTorque = continuousTorque, + ContinuousPowerLoss = continuousPowerLoss + }; + } + } + +} \ No newline at end of file diff --git a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/SimulationComponents/EngineDataAdapter.cs b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/SimulationComponents/EngineDataAdapter.cs index c085e1e886..39c0521b2b 100644 --- a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/SimulationComponents/EngineDataAdapter.cs +++ b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/SimulationComponents/EngineDataAdapter.cs @@ -195,15 +195,20 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter.SimulationComponen }); } - retVal.Inertia = DeclarationData.Engine.EngineInertia(retVal.Displacement, gearbox.Type); + retVal.Inertia = DeclarationData.Engine.EngineInertia(retVal.Displacement, gearbox?.Type ?? GearboxType.NoGearbox); + //retVal.Inertia = engine.Inertia + + // (gbx != null && gbx.Type.AutomaticTransmission() + // ? (gbx.Type == GearboxType.APTN || gbx.Type == GearboxType.IHPC ? 0.SI<KilogramSquareMeter>() : torqueConverter.Inertia) + // : 0.SI<KilogramSquareMeter>()); + retVal.EngineStartTime = DeclarationData.Engine.DefaultEngineStartTime; var limits = vehicle.TorqueLimits?.ToDictionary(e => e.Gear) ?? new Dictionary<int, ITorqueLimitInputData>(); - var numGears = gearbox.Gears.Count; + var numGears = gearbox?.Gears.Count ?? 0; var fullLoadCurves = new Dictionary<uint, EngineFullLoadCurve>(numGears + 1); fullLoadCurves[0] = FullLoadCurveReader.Create(mode.FullLoadCurve, true); fullLoadCurves[0].EngineData = retVal; - foreach (var gear in gearbox.Gears) + foreach (var gear in gearbox?.Gears ?? new List<ITransmissionInputData>(0)) { var maxTorque = VectoMath.Min( GearboxDataAdapterBase.GbxMaxTorque(gear, numGears, fullLoadCurves[0].MaxTorque), diff --git a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/SimulationComponents/RetarderDataAdapter.cs b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/SimulationComponents/RetarderDataAdapter.cs index 9461ddf32f..a9d7062e11 100644 --- a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/SimulationComponents/RetarderDataAdapter.cs +++ b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/SimulationComponents/RetarderDataAdapter.cs @@ -11,11 +11,11 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter.SimulationComponen { public interface IRetarderDataAdapter { - RetarderData CreateRetarderData(IRetarderInputData retarder); + RetarderData CreateRetarderData(IRetarderInputData retarder, PowertrainPosition position = PowertrainPosition.HybridPositionNotSet); } public class RetarderDataAdapter : IRetarderDataAdapter { - public RetarderData CreateRetarderData(IRetarderInputData retarder) + public RetarderData CreateRetarderData(IRetarderInputData retarder, PowertrainPosition position) { return SetCommonRetarderData(retarder); } @@ -80,7 +80,7 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter.SimulationComponen public class GenericRetarderDataAdapter : IRetarderDataAdapter { private readonly GenericBusRetarderData _genericRetarderData = new GenericBusRetarderData(); - public RetarderData CreateRetarderData(IRetarderInputData retarder) + public RetarderData CreateRetarderData(IRetarderInputData retarder, PowertrainPosition position) { return _genericRetarderData.CreateGenericBusRetarderData(retarder); } diff --git a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/SimulationComponents/StrategyDataAdapter/HybridStrategyParameterDataAdapter.cs b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/SimulationComponents/StrategyDataAdapter/HybridStrategyParameterDataAdapter.cs new file mode 100644 index 0000000000..63b4e6b7eb --- /dev/null +++ b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/SimulationComponents/StrategyDataAdapter/HybridStrategyParameterDataAdapter.cs @@ -0,0 +1,62 @@ +using System; +using System.ComponentModel; +using TUGraz.VectoCommon.Exceptions; +using TUGraz.VectoCommon.Utils; +using TUGraz.VectoCore.InputData.Reader.DataObjectAdapter.HeavyLorry; +using TUGraz.VectoCore.Models.SimulationComponent.Data; +using TUGraz.VectoCore.Models.SimulationComponent.Data.Battery; +using TUGraz.VectoCore.Models.SimulationComponent.Impl; + +namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter.SimulationComponents.StrategyDataAdapter +{ + + public abstract class HybridStrategyDataAdapter{ + + } + + public class ParallelHybridStrategyParameterDataAdapter : HybridStrategyParameters + { + public HybridStrategyParameters CreateHybridStrategyParameters(BatterySystemData batterySystemData, SuperCapData superCap) + { + if (batterySystemData == null && superCap == null) { + return null; + } + if(batterySystemData != null && superCap != null) { + throw new VectoException("Supercap AND Batteries not supported"); + } + var result = new HybridStrategyParameters(); + if (batterySystemData != null) { + var tmpBatterySystem = new BatterySystem(null, batterySystemData); + result.MinSoC = tmpBatterySystem.MinSoC; + result.MaxSoC = tmpBatterySystem.MaxSoC; + result.TargetSoC = (result.MaxSoC - result.MinSoC) / 2; + } else { + result.MinSoC = superCap.MinVoltage / superCap.MaxVoltage; + result.MaxSoC = 1;// superCap.MaxVoltage / superCap.MaxVoltage; + + result.TargetSoC = Math.Sqrt(Math.Pow(superCap.MaxVoltage.Value(), 2) - Math.Pow(superCap.MaxVoltage.Value(), 2)) / + superCap.MaxVoltage.Value(); + } + + //TODO Move to DeclarationData.Hybridstrategy.Parallel + result.AuxReserveTime = 0.SI<Second>(); + result.AuxReserveChargeTime = 0.SI<Second>(); + result.MinICEOnTime = 10.SI<Second>(); + result.ICEStartPenaltyFactor = 0.1; + result.CostFactorSOCExponent = 1; + + + + return result; + } + } + + public class SerialHybridStrategyParameterDataAdapter : HybridStrategyParameters + { + public HybridStrategyParameters CreateHybridStrategyParameters(BatterySystemData batterySystemData, + SuperCapData superCap) + { + return new HybridStrategyParameters(); + } + } +} \ No newline at end of file diff --git a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/SimulationComponents/VehicleDataAdapter.cs b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/SimulationComponents/VehicleDataAdapter.cs index 73b5b2f50b..3844df0481 100644 --- a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/SimulationComponents/VehicleDataAdapter.cs +++ b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/SimulationComponents/VehicleDataAdapter.cs @@ -53,6 +53,7 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter.SimulationComponen CurbMass = data.CurbMassChassis, GrossVehicleMass = data.GrossVehicleMassRating, AirDensity = Physics.AirDensity, + }; return retVal; diff --git a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/SingleBus/DeclarationDataAdapterSingleBus.cs b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/SingleBus/DeclarationDataAdapterSingleBus.cs index bdafee1668..40f9d3592d 100644 --- a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/SingleBus/DeclarationDataAdapterSingleBus.cs +++ b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/SingleBus/DeclarationDataAdapterSingleBus.cs @@ -17,8 +17,6 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter.SingleBus { public abstract class DeclarationDataAdapterSingleBus { - - public abstract class SingleBusBase : ISingleBusDeclarationDataAdapter { public static readonly GearboxType[] SupportedGearboxTypes = @@ -126,7 +124,7 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter.SingleBus public class Conventional : SingleBusBase { } - public class Hybrid : SingleBusBase { } + public abstract class Hybrid : SingleBusBase { } public class SerialHybrid : Hybrid { } diff --git a/VectoCore/VectoCore/InputData/Reader/Impl/DeclarationMode/HeavyLorryRunDataFactory/DeclarationModeHeavyLorryRunDataFactory.cs b/VectoCore/VectoCore/InputData/Reader/Impl/DeclarationMode/HeavyLorryRunDataFactory/DeclarationModeHeavyLorryRunDataFactory.cs index 214155f6d1..8eb468caab 100644 --- a/VectoCore/VectoCore/InputData/Reader/Impl/DeclarationMode/HeavyLorryRunDataFactory/DeclarationModeHeavyLorryRunDataFactory.cs +++ b/VectoCore/VectoCore/InputData/Reader/Impl/DeclarationMode/HeavyLorryRunDataFactory/DeclarationModeHeavyLorryRunDataFactory.cs @@ -26,7 +26,6 @@ namespace TUGraz.VectoCore.InputData.Reader.Impl.DeclarationMode.HeavyLorryRunDa public IDeclarationInputDataProvider InputDataProvider { get; } public IDeclarationReport Report { get; } - protected Segment _segment; protected DriverData _driverdata; protected AirdragData _airdragData; protected AxleGearData _axlegearData; @@ -46,6 +45,52 @@ namespace TUGraz.VectoCore.InputData.Reader.Impl.DeclarationMode.HeavyLorryRunDa InputDataProvider = dataProvider; Report = report; } + /// <summary> + /// Sets <see cref="VectoRunData.Loading"/> + /// ,<see cref="VectoRunData.JobName"/> + /// ,<see cref="VectoRunData.JobType"/> + /// ,<see cref="VectoRunData.Mission"/> + /// ,<see cref="VectoRunData.Report"/> + /// ,<see cref="VectoRunData.ExecutionMode"/> + /// ,<see cref="VectoRunData.Cycle"/> + /// ,<see cref="VectoRunData.SimulationType"/> + /// ,<see cref="VectoRunData.InputData"/> + /// ,<see cref="VectoRunData.ModFileSuffix"/> + /// ,<see cref="VectoRunData.VehicleDesignSpeed"/> + /// ,<see cref="VectoRunData.InputDataHash"/> + /// </summary> + /// <param name="vehicle"></param> + /// <param name="modeIdx"></param> + /// <param name="mission"></param> + /// <param name="loading"></param> + /// <param name="engineModes"></param> + /// <param name="segment"></param> + /// <returns></returns> + protected VectoRunData CreateCommonRunData(IVehicleDeclarationInputData vehicle, int modeIdx, Mission mission, + KeyValuePair<LoadingType, Tuple<Kilogram, double?>> loading, + IList<IEngineModeDeclarationInputData> engineModes, + Segment segment) + { + var cycle = DeclarationData.CyclesCache.GetOrAdd(mission.MissionType, + _ => DrivingCycleDataReader.ReadFromStream(mission.CycleFile, CycleType.DistanceBased, "", false)); + var simulationRunData = new VectoRunData + { + Loading = loading.Key, + JobName = InputDataProvider.JobInputData.JobName, + JobType = vehicle.VehicleType, + Mission = mission, + Report = Report, + ExecutionMode = ExecutionMode.Declaration, + Cycle = new DrivingCycleProxy(cycle, mission.MissionType.ToString()), + SimulationType = SimulationType.DistanceCycle, + InputData = InputDataProvider, + ModFileSuffix = (engineModes.Count > 1 ? $"_EngineMode{modeIdx}_" : "") + loading.Key, + VehicleDesignSpeed = segment.DesignSpeed, + InputDataHash = InputDataProvider.XMLHash, + }; + return simulationRunData; + } + protected override void Initialize() { @@ -137,17 +182,7 @@ namespace TUGraz.VectoCore.InputData.Reader.Impl.DeclarationMode.HeavyLorryRunDa return segment; } - protected override VectoRunData CreateVectoRunData(IVehicleDeclarationInputData vehicle, int modeIdx, - Mission mission, KeyValuePair<LoadingType, Tuple<Kilogram, double?>> loading) - { - throw new NotImplementedException(); - } - - protected override IEnumerable<VectoRunData> GetNextRun() - { - throw new NotImplementedException(); - } #endregion } @@ -179,6 +214,8 @@ namespace TUGraz.VectoCore.InputData.Reader.Impl.DeclarationMode.HeavyLorryRunDa } } + + protected override VectoRunData CreateVectoRunData(IVehicleDeclarationInputData vehicle, int modeIdx, Mission mission, KeyValuePair<LoadingType, Tuple<Kilogram, double?>> loading) @@ -187,122 +224,95 @@ namespace TUGraz.VectoCore.InputData.Reader.Impl.DeclarationMode.HeavyLorryRunDa var engineModes = engine.EngineModes; var engineMode = engineModes[modeIdx]; - var cycle = DeclarationData.CyclesCache.GetOrAdd(mission.MissionType, - _ => DrivingCycleDataReader.ReadFromStream(mission.CycleFile, CycleType.DistanceBased, "", false)); + var simulationRunData = CreateCommonRunData(vehicle, modeIdx, mission, loading, engineModes, _segment); - var simulationRunData = new VectoRunData { - Loading = loading.Key, - VehicleData = DataAdapter.CreateVehicleData(vehicle, _segment, mission, loading, _allowVocational), - VehicleDesignSpeed = _segment.DesignSpeed, - AirdragData = DataAdapter.CreateAirdragData(vehicle.Components.AirdragInputData, mission, _segment), - EngineData = - DataAdapter.CreateEngineData(InputDataProvider.JobInputData.Vehicle, engineMode, - mission), // _engineData.Copy(), // a copy is necessary because every run has a different correction factor! - ElectricMachinesData = new List<Tuple<PowertrainPosition, ElectricMotorData>>(), - GearboxData = _gearboxData, - AxleGearData = _axlegearData, - AngledriveData = _angledriveData, - Aux = DataAdapter.CreateAuxiliaryData( - vehicle.Components.AuxiliaryInputData, - vehicle.Components.BusAuxiliaries, mission.MissionType, - _segment.VehicleClass, vehicle.Length, - vehicle.Components.AxleWheels.NumSteeredAxles), - Cycle = new DrivingCycleProxy(cycle, mission.MissionType.ToString()), - Retarder = _retarderData, - DriverData = _driverdata, - ExecutionMode = ExecutionMode.Declaration, - JobName = InputDataProvider.JobInputData.JobName, - ModFileSuffix = (engineModes.Count > 1 ? $"_EngineMode{modeIdx}_" : "") + loading.Key, - Report = Report, - Mission = mission, - PTO = mission.MissionType == MissionType.MunicipalUtility - ? _municipalPtoTransmissionData - : _ptoTransmissionData, - InputDataHash = InputDataProvider.XMLHash, - SimulationType = SimulationType.DistanceCycle, - GearshiftParameters = _gearshiftData, - InputData = InputDataProvider - }; + + + simulationRunData.VehicleData = + DataAdapter.CreateVehicleData(vehicle, _segment, mission, loading, _allowVocational); + + simulationRunData.AirdragData = + DataAdapter.CreateAirdragData(vehicle.Components.AirdragInputData, mission, _segment); + + simulationRunData.EngineData = + DataAdapter.CreateEngineData(InputDataProvider.JobInputData.Vehicle, engineMode, + mission); // _engineData.Copy(), // a copy is necessary because every run has a different correction factor! + + simulationRunData.ElectricMachinesData = new List<Tuple<PowertrainPosition, ElectricMotorData>>(); + simulationRunData.GearboxData = _gearboxData; + simulationRunData.AxleGearData = _axlegearData; + simulationRunData.AngledriveData = _angledriveData; + simulationRunData.Aux = DataAdapter.CreateAuxiliaryData( + vehicle.Components.AuxiliaryInputData, + vehicle.Components.BusAuxiliaries, mission.MissionType, + _segment.VehicleClass, vehicle.Length, + vehicle.Components.AxleWheels.NumSteeredAxles); + + simulationRunData.Retarder = _retarderData; + simulationRunData.DriverData = _driverdata; + simulationRunData.PTO = mission.MissionType == MissionType.MunicipalUtility + ? _municipalPtoTransmissionData + : _ptoTransmissionData; + + + + simulationRunData.GearshiftParameters = _gearshiftData; + + simulationRunData.EngineData.FuelMode = modeIdx; simulationRunData.VehicleData.VehicleClass = _segment.VehicleClass; simulationRunData.VehicleData.InputData = vehicle; return simulationRunData; } - #endregion - } - public class HEV_S2 : LorryBase - { - public HEV_S2(IDeclarationInputDataProvider dataProvider, IDeclarationReport report, - ILorryDeclarationDataAdapter declarationDataAdapter) : base(dataProvider, report, declarationDataAdapter) { } - } - public class HEV_S3 : LorryBase - { - public HEV_S3(IDeclarationInputDataProvider dataProvider, IDeclarationReport report, - ILorryDeclarationDataAdapter declarationDataAdapter) : base(dataProvider, report, declarationDataAdapter) { } + + #endregion } - public class HEV_S4 : LorryBase - { - public HEV_S4(IDeclarationInputDataProvider dataProvider, IDeclarationReport report, - ILorryDeclarationDataAdapter declarationDataAdapter) : base(dataProvider, report, declarationDataAdapter) { } - } - public class HEV_S_IEPC : LorryBase - { - public HEV_S_IEPC(IDeclarationInputDataProvider dataProvider, IDeclarationReport report, - ILorryDeclarationDataAdapter declarationDataAdapter) : base(dataProvider, report, declarationDataAdapter) { } - } - public class HEV_P1 : LorryBase + public abstract class BatteryElectric : LorryBase { - public HEV_P1(IDeclarationInputDataProvider dataProvider, IDeclarationReport report, - ILorryDeclarationDataAdapter declarationDataAdapter) : base(dataProvider, report, declarationDataAdapter) { } - } - - public class HEV_P2 : LorryBase - { - public HEV_P2(IDeclarationInputDataProvider dataProvider, IDeclarationReport report, - ILorryDeclarationDataAdapter declarationDataAdapter) : base(dataProvider, report, declarationDataAdapter) { } - } + public BatteryElectric(IDeclarationInputDataProvider dataProvider, IDeclarationReport report, + ILorryDeclarationDataAdapter declarationDataAdapter) : base(dataProvider, report, + declarationDataAdapter) + { - public class HEV_P2_5 : LorryBase - { - public HEV_P2_5(IDeclarationInputDataProvider dataProvider, IDeclarationReport report, - ILorryDeclarationDataAdapter declarationDataAdapter) : base(dataProvider, report, declarationDataAdapter) { } - } + } + #region Overrides of AbstractDeclarationVectoRunDataFactory - public class HEV_P3 : LorryBase - { - public HEV_P3(IDeclarationInputDataProvider dataProvider, IDeclarationReport report, - ILorryDeclarationDataAdapter declarationDataAdapter) : base(dataProvider, report, declarationDataAdapter) { } - } + protected override IEnumerable<VectoRunData> GetNextRun() + { + throw new NotImplementedException(); + } + protected override VectoRunData CreateVectoRunData(IVehicleDeclarationInputData vehicle, int modeIdx, Mission mission, + KeyValuePair<LoadingType, Tuple<Kilogram, double?>> loading) + { + throw new NotImplementedException(); + } - public class HEV_P4 : LorryBase - { - public HEV_P4(IDeclarationInputDataProvider dataProvider, IDeclarationReport report, - ILorryDeclarationDataAdapter declarationDataAdapter) : base(dataProvider, report, declarationDataAdapter) { } + #endregion } - public class PEV_E2 : LorryBase + public class PEV_E2 : BatteryElectric { public PEV_E2(IDeclarationInputDataProvider dataProvider, IDeclarationReport report, ILorryDeclarationDataAdapter declarationDataAdapter) : base(dataProvider, report, declarationDataAdapter) { } } - public class PEV_E3 : LorryBase + public class PEV_E3 : BatteryElectric { public PEV_E3(IDeclarationInputDataProvider dataProvider, IDeclarationReport report, ILorryDeclarationDataAdapter declarationDataAdapter) : base(dataProvider, report, declarationDataAdapter) { } } - public class PEV_E4 : LorryBase + public class PEV_E4 : BatteryElectric { public PEV_E4(IDeclarationInputDataProvider dataProvider, IDeclarationReport report, ILorryDeclarationDataAdapter declarationDataAdapter) : base(dataProvider, report, declarationDataAdapter) { } } - public class PEV_E_IEPC : LorryBase + public class PEV_E_IEPC : BatteryElectric { public PEV_E_IEPC(IDeclarationInputDataProvider dataProvider, IDeclarationReport report, ILorryDeclarationDataAdapter declarationDataAdapter) : base(dataProvider, report, declarationDataAdapter) { } @@ -312,6 +322,21 @@ namespace TUGraz.VectoCore.InputData.Reader.Impl.DeclarationMode.HeavyLorryRunDa { public Exempted(IDeclarationInputDataProvider dataProvider, IDeclarationReport report, ILorryDeclarationDataAdapter declarationDataAdapter) : base(dataProvider, report, declarationDataAdapter) { } + + #region Overrides of AbstractDeclarationVectoRunDataFactory + + protected override IEnumerable<VectoRunData> GetNextRun() + { + throw new NotImplementedException(); + } + + protected override VectoRunData CreateVectoRunData(IVehicleDeclarationInputData vehicle, int modeIdx, Mission mission, + KeyValuePair<LoadingType, Tuple<Kilogram, double?>> loading) + { + throw new NotImplementedException(); + } + + #endregion } } diff --git a/VectoCore/VectoCore/InputData/Reader/Impl/DeclarationMode/HeavyLorryRunDataFactory/DeclarationModeHeavyLorryRunDataFactory_Hybrid.cs b/VectoCore/VectoCore/InputData/Reader/Impl/DeclarationMode/HeavyLorryRunDataFactory/DeclarationModeHeavyLorryRunDataFactory_Hybrid.cs new file mode 100644 index 0000000000..13321328da --- /dev/null +++ b/VectoCore/VectoCore/InputData/Reader/Impl/DeclarationMode/HeavyLorryRunDataFactory/DeclarationModeHeavyLorryRunDataFactory_Hybrid.cs @@ -0,0 +1,155 @@ +using System; +using System.Collections.Generic; +using TUGraz.VectoCommon.InputData; +using TUGraz.VectoCommon.Utils; +using TUGraz.VectoCore.InputData.Reader.DataObjectAdapter; +using TUGraz.VectoCore.InputData.Reader.DataObjectAdapter.SimulationComponents; +using TUGraz.VectoCore.Models.Declaration; +using TUGraz.VectoCore.Models.Simulation.Data; +using TUGraz.VectoCore.OutputData; + +namespace TUGraz.VectoCore.InputData.Reader.Impl.DeclarationMode.HeavyLorryRunDataFactory +{ + public abstract partial class DeclarationModeHeavyLorryRunDataFactory + { + public abstract class Hybrid : LorryBase + { + public Hybrid(IDeclarationInputDataProvider dataProvider, IDeclarationReport report, + ILorryDeclarationDataAdapter declarationDataAdapter) : base(dataProvider, report, + declarationDataAdapter) + { + + } + + #region Overrides of AbstractDeclarationVectoRunDataFactory + + protected override IEnumerable<VectoRunData> GetNextRun() + { + var vehicle = InputDataProvider.JobInputData.Vehicle; + + var engine = InputDataProvider.JobInputData.Vehicle.Components.EngineInputData; + var engineModes = engine.EngineModes; + + for (var modeIdx = 0; modeIdx < engineModes.Count; modeIdx++) + { + foreach (var mission in _segment.Missions) + { + if (mission.MissionType.IsEMS() && + engine.RatedPowerDeclared.IsSmaller(DeclarationData.MinEnginePowerForEMS)) + { + continue; + } + + foreach (var loading in mission.Loadings) + { + var simulationRunData = CreateVectoRunData(vehicle, modeIdx, mission, loading); + yield return simulationRunData; + } + } + } + } + + protected override VectoRunData CreateVectoRunData(IVehicleDeclarationInputData vehicle, int modeIdx, Mission mission, + KeyValuePair<LoadingType, Tuple<Kilogram, double?>> loading) + { + throw new NotImplementedException(); + } + + #endregion + } + + public class HEV_S2 : Hybrid + { + public HEV_S2(IDeclarationInputDataProvider dataProvider, IDeclarationReport report, + ILorryDeclarationDataAdapter declarationDataAdapter) : base(dataProvider, report, + declarationDataAdapter) + { + + } + + #region Overrides of Hybrid + + protected override VectoRunData CreateVectoRunData(IVehicleDeclarationInputData vehicle, int modeIdx, Mission mission, + KeyValuePair<LoadingType, Tuple<Kilogram, double?>> loading) + { + + var engine = InputDataProvider.JobInputData.Vehicle.Components.EngineInputData; + var engineModes = engine.EngineModes; + var engineMode = engineModes[modeIdx]; + var runData = CreateCommonRunData(vehicle, modeIdx, mission, loading, engineModes, _segment); + runData.VehicleData = DataAdapter.CreateVehicleData(vehicle, _segment, mission, loading, _allowVocational); + runData.EngineData = DataAdapter.CreateEngineData(vehicle, engineMode, mission); + //TODO HM use updated value for InitialSOC + runData.BatteryData = DataAdapter.CreateBatteryData(vehicle.Components.ElectricStorage); + runData.SuperCapData = DataAdapter.CreateSuperCapData(vehicle.Components.ElectricStorage); + runData.ElectricMachinesData = DataAdapter.CreateElectricMachines(vehicle.Components.ElectricMachines, vehicle.ElectricMotorTorqueLimits, runData.BatteryData.CalculateAverageVoltage()); + runData.GearboxData = _gearboxData; + 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); + + + + + return runData; + } + + #endregion + } + + public class HEV_S3 : Hybrid + { + public HEV_S3(IDeclarationInputDataProvider dataProvider, IDeclarationReport report, + ILorryDeclarationDataAdapter declarationDataAdapter) : base(dataProvider, report, declarationDataAdapter) { } + } + + public class HEV_S4 : Hybrid + { + public HEV_S4(IDeclarationInputDataProvider dataProvider, IDeclarationReport report, + ILorryDeclarationDataAdapter declarationDataAdapter) : base(dataProvider, report, declarationDataAdapter) { } + } + + public class HEV_S_IEPC : Hybrid + { + public HEV_S_IEPC(IDeclarationInputDataProvider dataProvider, IDeclarationReport report, + ILorryDeclarationDataAdapter declarationDataAdapter) : base(dataProvider, report, declarationDataAdapter) { } + } + + public class HEV_P1 : Hybrid + { + public HEV_P1(IDeclarationInputDataProvider dataProvider, IDeclarationReport report, + ILorryDeclarationDataAdapter declarationDataAdapter) : base(dataProvider, report, declarationDataAdapter) { } + } + + public class HEV_P2 : Hybrid + { + public HEV_P2(IDeclarationInputDataProvider dataProvider, IDeclarationReport report, + ILorryDeclarationDataAdapter declarationDataAdapter) : base(dataProvider, report, declarationDataAdapter) { } + } + + public class HEV_P2_5 : Hybrid + { + public HEV_P2_5(IDeclarationInputDataProvider dataProvider, IDeclarationReport report, + ILorryDeclarationDataAdapter declarationDataAdapter) : base(dataProvider, report, declarationDataAdapter) { } + } + + public class HEV_P3 : Hybrid + { + public HEV_P3(IDeclarationInputDataProvider dataProvider, IDeclarationReport report, + ILorryDeclarationDataAdapter declarationDataAdapter) : base(dataProvider, report, declarationDataAdapter) { } + } + + public class HEV_P4 : Hybrid + { + public HEV_P4(IDeclarationInputDataProvider dataProvider, IDeclarationReport report, + ILorryDeclarationDataAdapter declarationDataAdapter) : base(dataProvider, report, declarationDataAdapter) { } + } + } +} \ No newline at end of file diff --git a/VectoCore/VectoCore/InputData/Reader/Impl/DeclarationMode/PrimaryBusRunDataFactory/DeclarationModePrimaryBusRunDataFactory.cs b/VectoCore/VectoCore/InputData/Reader/Impl/DeclarationMode/PrimaryBusRunDataFactory/DeclarationModePrimaryBusRunDataFactory.cs index 0cb8590fc5..dd59c02308 100644 --- a/VectoCore/VectoCore/InputData/Reader/Impl/DeclarationMode/PrimaryBusRunDataFactory/DeclarationModePrimaryBusRunDataFactory.cs +++ b/VectoCore/VectoCore/InputData/Reader/Impl/DeclarationMode/PrimaryBusRunDataFactory/DeclarationModePrimaryBusRunDataFactory.cs @@ -10,6 +10,7 @@ using TUGraz.VectoCore.InputData.Reader.DataObjectAdapter; using TUGraz.VectoCore.Models.Declaration; using TUGraz.VectoCore.Models.Simulation.Data; using TUGraz.VectoCore.Models.Simulation.Impl; +using TUGraz.VectoCore.Models.SimulationComponent; using TUGraz.VectoCore.Models.SimulationComponent.Data; using TUGraz.VectoCore.Models.SimulationComponent.Impl; using TUGraz.VectoCore.OutputData; @@ -18,8 +19,6 @@ namespace TUGraz.VectoCore.InputData.Reader.Impl.DeclarationMode.PrimaryBusRunDa { public abstract class DeclarationModePrimaryBusRunDataFactory { - - public abstract class PrimaryBusBase : AbstractDeclarationVectoRunDataFactory { #region Implementation of IVectoRunDataFactory @@ -108,30 +107,22 @@ namespace TUGraz.VectoCore.InputData.Reader.Impl.DeclarationMode.PrimaryBusRunDa _axlegearData = DataAdapter.CreateAxleGearData(InputDataProvider.JobInputData.Vehicle.Components.AxleGearInputData); } _angledriveData = DataAdapter.CreateAngledriveData(InputDataProvider.JobInputData.Vehicle.Components.AngledriveInputData); - var tmpRunData = new VectoRunData() - { - GearboxData = new GearboxData() - { - Type = vehicle.Components.GearboxInputData.Type, - } - }; - var tmpStrategy = PowertrainBuilder.GetShiftStrategy(new SimplePowertrainContainer(tmpRunData)); + var tmpEngine = DataAdapter.CreateEngineData( vehicle, vehicle.Components.EngineInputData.EngineModes[0], _segment.Missions.First()); - _gearboxData = DataAdapter.CreateGearboxData( - vehicle, new VectoRunData() { EngineData = tmpEngine, AxleGearData = _axlegearData, VehicleData = tempVehicle }, - tmpStrategy); + InitGearboxAndGearshiftData(vehicle, tmpEngine, tempVehicle); + _retarderData = DataAdapter.CreateRetarderData(vehicle.Components.RetarderInputData); _ptoTransmissionData = DataAdapter.CreatePTOTransmissionData(vehicle.Components.PTOTransmissionInputData); - //_municipalPtoTransmissionData = CreateDefaultPTOData(); - _gearshiftData = DataAdapter.CreateGearshiftData( - _gearboxData, _axlegearData.AxleGear.Ratio * (_angledriveData?.Angledrive.Ratio ?? 1.0), tmpEngine.IdleSpeed); } + protected abstract void InitGearboxAndGearshiftData(IVehicleDeclarationInputData vehicle, + CombustionEngineData tmpEngine, VehicleData tempVehicle); + #endregion protected override VectoRunData CreateVectoRunData( IVehicleDeclarationInputData vehicle, int modeIdx, Mission mission, KeyValuePair<LoadingType, Tuple<Kilogram, double?>> loading) @@ -187,6 +178,7 @@ namespace TUGraz.VectoCore.InputData.Reader.Impl.DeclarationMode.PrimaryBusRunDa InputDataHash = InputDataProvider.XMLHash, SimulationType = SimulationType.DistanceCycle, GearshiftParameters = _gearshiftData, + JobType = vehicle.VehicleType, }; simulationRunData.EngineData.FuelMode = modeIdx; simulationRunData.VehicleData.VehicleClass = _segment.VehicleClass; @@ -229,118 +221,203 @@ namespace TUGraz.VectoCore.InputData.Reader.Impl.DeclarationMode.PrimaryBusRunDa #endregion #region Overrides of AbstractDeclarationVectoRunDataFactory + protected override void InitGearboxAndGearshiftData(IVehicleDeclarationInputData vehicle, + CombustionEngineData tmpEngine, + VehicleData tempVehicle) + { + var tmpRunData = new VectoRunData() + { + GearboxData = new GearboxData() + { + Type = vehicle.Components.GearboxInputData.Type, + } + }; + var tmpStrategy = PowertrainBuilder.GetShiftStrategy(new SimplePowertrainContainer(tmpRunData)); + _gearboxData = DataAdapter.CreateGearboxData( + vehicle, new VectoRunData() { EngineData = tmpEngine, AxleGearData = _axlegearData, VehicleData = tempVehicle }, + tmpStrategy); + + _gearshiftData = DataAdapter.CreateGearshiftData( + _gearboxData, _axlegearData.AxleGear.Ratio * (_angledriveData?.Angledrive.Ratio ?? 1.0), tmpEngine.IdleSpeed); + } - #endregion } - public class HEV_S2 : PrimaryBusBase + public abstract class Hybrid : PrimaryBusBase + { + protected Hybrid(IDeclarationInputDataProvider dataProvider, IDeclarationReport report, IPrimaryBusDeclarationDataAdapter declarationDataAdapter) : base(dataProvider, report, declarationDataAdapter) { } + + protected override IEnumerable<VectoRunData> VectoRunDataHeavyBusPrimary() + { + var vehicle = DataProvider.JobInputData.Vehicle; + var engine = vehicle.Components.EngineInputData; + var engineModes = engine.EngineModes; + + for (var modeIdx = 0; modeIdx < engineModes.Count; modeIdx++) + { + foreach (var mission in _segment.Missions) + { + foreach (var loading in mission.Loadings) + { + var simulationRunData = CreateVectoRunData(vehicle, modeIdx, mission, loading); + if (simulationRunData == null) + { + continue; + } + yield return simulationRunData; + } + } + } + } + } + + public abstract class SerialHybrid : Hybrid + { + protected SerialHybrid(IDeclarationInputDataProvider dataProvider, IDeclarationReport report, + IPrimaryBusDeclarationDataAdapter declarationDataAdapter) : base(dataProvider, report, + declarationDataAdapter) + { + + } + + protected override void InitGearboxAndGearshiftData(IVehicleDeclarationInputData vehicle, + CombustionEngineData tmpEngine, + VehicleData tempVehicle) + { + //_gearboxData = ; + _gearshiftData = null; + } + } + + + public class HEV_S2 : SerialHybrid { public HEV_S2(IDeclarationInputDataProvider dataProvider, IDeclarationReport report, IPrimaryBusDeclarationDataAdapter declarationDataAdapter) : base(dataProvider, report, declarationDataAdapter) { } + //#region Overrides of PrimaryBusBase + + //protected override IEnumerable<VectoRunData> VectoRunDataHeavyBusPrimary() + //{ + // throw new NotImplementedException(); + //} + + //#endregion + + #region Overrides of PrimaryBusBase + + + + #endregion + #region Overrides of PrimaryBusBase - protected override IEnumerable<VectoRunData> VectoRunDataHeavyBusPrimary() - { - throw new NotImplementedException(); - } #endregion } - public class HEV_S3 : PrimaryBusBase + public class HEV_S3 : SerialHybrid { public HEV_S3(IDeclarationInputDataProvider dataProvider, IDeclarationReport report, IPrimaryBusDeclarationDataAdapter declarationDataAdapter) : base(dataProvider, report, declarationDataAdapter) { } #region Overrides of PrimaryBusBase - protected override IEnumerable<VectoRunData> VectoRunDataHeavyBusPrimary() - { - throw new NotImplementedException(); - } #endregion } - public class HEV_S4 : PrimaryBusBase + public class HEV_S4 : SerialHybrid { public HEV_S4(IDeclarationInputDataProvider dataProvider, IDeclarationReport report, IPrimaryBusDeclarationDataAdapter declarationDataAdapter) : base(dataProvider, report, declarationDataAdapter) { } #region Overrides of PrimaryBusBase - protected override IEnumerable<VectoRunData> VectoRunDataHeavyBusPrimary() - { - throw new NotImplementedException(); - } #endregion } - public class HEV_S_IEPC : PrimaryBusBase + public class HEV_S_IEPC : SerialHybrid { public HEV_S_IEPC(IDeclarationInputDataProvider dataProvider, IDeclarationReport report, IPrimaryBusDeclarationDataAdapter declarationDataAdapter) : base(dataProvider, report, declarationDataAdapter) { } #region Overrides of PrimaryBusBase + + #endregion + } + + public abstract class ParallelHybrid : PrimaryBusBase + { + protected ParallelHybrid(IDeclarationInputDataProvider dataProvider, IDeclarationReport report, IPrimaryBusDeclarationDataAdapter declarationDataAdapter) : base(dataProvider, report, declarationDataAdapter) { } + + #region Overrides of PrimaryBusBase + protected override IEnumerable<VectoRunData> VectoRunDataHeavyBusPrimary() { throw new NotImplementedException(); } + protected override void InitGearboxAndGearshiftData(IVehicleDeclarationInputData vehicle, + CombustionEngineData tmpEngine, + VehicleData tempVehicle) + { + + + } + + #endregion } - public class HEV_P1 : PrimaryBusBase + public class HEV_P1 : ParallelHybrid { public HEV_P1(IDeclarationInputDataProvider dataProvider, IDeclarationReport report, IPrimaryBusDeclarationDataAdapter declarationDataAdapter) : base(dataProvider, report, declarationDataAdapter) { } #region Overrides of PrimaryBusBase - protected override IEnumerable<VectoRunData> VectoRunDataHeavyBusPrimary() - { - throw new NotImplementedException(); - } #endregion } - public class HEV_P2 : PrimaryBusBase + public class HEV_P2 : ParallelHybrid { public HEV_P2(IDeclarationInputDataProvider dataProvider, IDeclarationReport report, IPrimaryBusDeclarationDataAdapter declarationDataAdapter) : base(dataProvider, report, declarationDataAdapter) { } #region Overrides of PrimaryBusBase - protected override IEnumerable<VectoRunData> VectoRunDataHeavyBusPrimary() - { - throw new NotImplementedException(); - } #endregion } - public class HEV_P2_5 : PrimaryBusBase + public class HEV_P2_5 : ParallelHybrid { public HEV_P2_5(IDeclarationInputDataProvider dataProvider, IDeclarationReport report, IPrimaryBusDeclarationDataAdapter declarationDataAdapter) : base(dataProvider, report, declarationDataAdapter) { } #region Overrides of PrimaryBusBase - protected override IEnumerable<VectoRunData> VectoRunDataHeavyBusPrimary() - { - throw new NotImplementedException(); - } #endregion } - public class HEV_P3 : PrimaryBusBase + public class HEV_P3 : ParallelHybrid { public HEV_P3(IDeclarationInputDataProvider dataProvider, IDeclarationReport report, IPrimaryBusDeclarationDataAdapter declarationDataAdapter) : base(dataProvider, report, declarationDataAdapter) { } #region Overrides of PrimaryBusBase + + #endregion + } + + public class HEV_P4 : ParallelHybrid + { + public HEV_P4(IDeclarationInputDataProvider dataProvider, IDeclarationReport report, IPrimaryBusDeclarationDataAdapter declarationDataAdapter) : base(dataProvider, report, declarationDataAdapter) { } + + #region Overrides of PrimaryBusBase + protected override IEnumerable<VectoRunData> VectoRunDataHeavyBusPrimary() { throw new NotImplementedException(); @@ -349,9 +426,9 @@ namespace TUGraz.VectoCore.InputData.Reader.Impl.DeclarationMode.PrimaryBusRunDa #endregion } - public class HEV_P4 : PrimaryBusBase + public abstract class BatteryElectric : PrimaryBusBase { - public HEV_P4(IDeclarationInputDataProvider dataProvider, IDeclarationReport report, IPrimaryBusDeclarationDataAdapter declarationDataAdapter) : base(dataProvider, report, declarationDataAdapter) { } + public BatteryElectric(IDeclarationInputDataProvider dataProvider, IDeclarationReport report, IPrimaryBusDeclarationDataAdapter declarationDataAdapter) : base(dataProvider, report, declarationDataAdapter) { } #region Overrides of PrimaryBusBase @@ -360,11 +437,18 @@ namespace TUGraz.VectoCore.InputData.Reader.Impl.DeclarationMode.PrimaryBusRunDa throw new NotImplementedException(); } + protected override void InitGearboxAndGearshiftData(IVehicleDeclarationInputData vehicle, + CombustionEngineData tmpEngine, + VehicleData tempVehicle) + { + throw new NotImplementedException(); + } + #endregion } - public class PEV_E2 : PrimaryBusBase + public class PEV_E2 : BatteryElectric { public PEV_E2(IDeclarationInputDataProvider dataProvider, IDeclarationReport report, IPrimaryBusDeclarationDataAdapter declarationDataAdapter) : base(dataProvider, report, declarationDataAdapter) { } @@ -378,7 +462,7 @@ namespace TUGraz.VectoCore.InputData.Reader.Impl.DeclarationMode.PrimaryBusRunDa #endregion } - public class PEV_E3 : PrimaryBusBase + public class PEV_E3 : BatteryElectric { public PEV_E3(IDeclarationInputDataProvider dataProvider, IDeclarationReport report, IPrimaryBusDeclarationDataAdapter declarationDataAdapter) : base(dataProvider, report, declarationDataAdapter) { } @@ -392,7 +476,7 @@ namespace TUGraz.VectoCore.InputData.Reader.Impl.DeclarationMode.PrimaryBusRunDa #endregion } - public class PEV_E4 : PrimaryBusBase + public class PEV_E4 : BatteryElectric { public PEV_E4(IDeclarationInputDataProvider dataProvider, IDeclarationReport report, IPrimaryBusDeclarationDataAdapter declarationDataAdapter) : base(dataProvider, report, declarationDataAdapter) { } @@ -406,7 +490,7 @@ namespace TUGraz.VectoCore.InputData.Reader.Impl.DeclarationMode.PrimaryBusRunDa #endregion } - public class PEV_E_IEPC : PrimaryBusBase + public class PEV_E_IEPC : BatteryElectric { public PEV_E_IEPC(IDeclarationInputDataProvider dataProvider, IDeclarationReport report, IPrimaryBusDeclarationDataAdapter declarationDataAdapter) : base(dataProvider, report, declarationDataAdapter) { } @@ -431,6 +515,13 @@ namespace TUGraz.VectoCore.InputData.Reader.Impl.DeclarationMode.PrimaryBusRunDa throw new NotImplementedException(); } + protected override void InitGearboxAndGearshiftData(IVehicleDeclarationInputData vehicle, + CombustionEngineData tmpEngine, + VehicleData tempVehicle) + { + throw new NotImplementedException(); + } + #endregion } } diff --git a/VectoCore/VectoCore/Models/Declaration/DeclarationData.cs b/VectoCore/VectoCore/Models/Declaration/DeclarationData.cs index cd37d6637d..b908450f98 100644 --- a/VectoCore/VectoCore/Models/Declaration/DeclarationData.cs +++ b/VectoCore/VectoCore/Models/Declaration/DeclarationData.cs @@ -1208,18 +1208,24 @@ namespace TUGraz.VectoCore.Models.Declaration } } + public static class SuperCap + { + public const double SocMin = 0.45; + } + + public static class Battery { /// <summary> /// Percentage of the maximum voltage of the battery /// </summary> - private const double SOCMinHP = 0.3; - private const double SOCMaxHP = 0.7; + private const double SOCMinHP = 0.2; + private const double SOCMaxHP = 0.8; - private const double SOCMinHE = 0.1; - private const double SOCMaxHE = 0.9; + private const double SOCMinHE = 0.05; + private const double SOCMaxHE = 0.95; - public static double GetDefaultMinSoc(BatteryType type) + public static double GetMinSoc(BatteryType type) { switch (type) { case BatteryType.HPBS: @@ -1233,7 +1239,8 @@ namespace TUGraz.VectoCore.Models.Declaration } } - public static double GetDefaultMaxSoc(BatteryType type) + + public static double GetMaxSoc(BatteryType type) { switch (type) { diff --git a/VectoCore/VectoCore/Models/Simulation/Data/VectoRunData.cs b/VectoCore/VectoCore/Models/Simulation/Data/VectoRunData.cs index 91a78f96b3..3ee80e9bab 100644 --- a/VectoCore/VectoCore/Models/Simulation/Data/VectoRunData.cs +++ b/VectoCore/VectoCore/Models/Simulation/Data/VectoRunData.cs @@ -128,7 +128,7 @@ namespace TUGraz.VectoCore.Models.Simulation.Data public AuxFanData FanDataVTP { get; internal set; } - public List<Tuple<PowertrainPosition, ElectricMotorData>> ElectricMachinesData { get; internal set; } + public IList<Tuple<PowertrainPosition, ElectricMotorData>> ElectricMachinesData { get; internal set; } public BatterySystemData BatteryData { get; internal set; } @@ -350,6 +350,7 @@ namespace TUGraz.VectoCore.Models.Simulation.Data } return null; } + } public class VTPData @@ -363,4 +364,5 @@ namespace TUGraz.VectoCore.Models.Simulation.Data public Meter FanDiameter; } + } \ No newline at end of file diff --git a/VectoCore/VectoCore/Models/SimulationComponent/Data/ElectricMotor/ElectricMotorData.cs b/VectoCore/VectoCore/Models/SimulationComponent/Data/ElectricMotor/ElectricMotorData.cs index 88f5c076d7..ef257670d0 100644 --- a/VectoCore/VectoCore/Models/SimulationComponent/Data/ElectricMotor/ElectricMotorData.cs +++ b/VectoCore/VectoCore/Models/SimulationComponent/Data/ElectricMotor/ElectricMotorData.cs @@ -15,7 +15,7 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Data public KilogramSquareMeter Inertia { get; internal set; } [SIRange(0, 1)] - public double OverloadRegenerationFactor { get; internal set; } + public double OverloadRecoveryFactor { get; internal set; } public double RatioADC { get; internal set; } diff --git a/VectoCore/VectoCore/Models/SimulationComponent/Impl/ElectricMotor.cs b/VectoCore/VectoCore/Models/SimulationComponent/Impl/ElectricMotor.cs index 88247fe0a3..208df1a28d 100644 --- a/VectoCore/VectoCore/Models/SimulationComponent/Impl/ElectricMotor.cs +++ b/VectoCore/VectoCore/Models/SimulationComponent/Impl/ElectricMotor.cs @@ -548,7 +548,7 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl } if (DeRatingActive) { - if (ThermalBuffer.IsSmallerOrEqual(ModelData.Overload.OverloadBuffer * ModelData.OverloadRegenerationFactor)) { + if (ThermalBuffer.IsSmallerOrEqual(ModelData.Overload.OverloadBuffer * ModelData.OverloadRecoveryFactor)) { DeRatingActive = false; } } else { diff --git a/VectoCore/VectoCore/OutputData/XML/DeclarationReports/VehicleInformationFile/VehicleInformationFile_0_1/PrimaryComponents/VIFElectricMotorTorqueLimitsType.cs b/VectoCore/VectoCore/OutputData/XML/DeclarationReports/VehicleInformationFile/VehicleInformationFile_0_1/PrimaryComponents/VIFElectricMotorTorqueLimitsType.cs index e7e4fc4ac4..5ab423295f 100644 --- a/VectoCore/VectoCore/OutputData/XML/DeclarationReports/VehicleInformationFile/VehicleInformationFile_0_1/PrimaryComponents/VIFElectricMotorTorqueLimitsType.cs +++ b/VectoCore/VectoCore/OutputData/XML/DeclarationReports/VehicleInformationFile/VehicleInformationFile_0_1/PrimaryComponents/VIFElectricMotorTorqueLimitsType.cs @@ -36,7 +36,7 @@ namespace TUGraz.VectoCore.OutputData.XML.DeclarationReports.VehicleInformationF electricMachine); } - private List<XElement> GetVoltageLevels(List<Tuple<Volt, TableData>> voltageLevels) + private IList<XElement> GetVoltageLevels(IList<Tuple<Volt, TableData>> voltageLevels) { var voltageEntries = new List<XElement>(); foreach (var voltageLevel in voltageLevels) diff --git a/VectoCore/VectoCore/Utils/Ninject/CombineArgumentsToNameInstanceProviders.cs b/VectoCore/VectoCore/Utils/Ninject/CombineArgumentsToNameInstanceProviders.cs index bd593b0387..5916afc3ab 100644 --- a/VectoCore/VectoCore/Utils/Ninject/CombineArgumentsToNameInstanceProviders.cs +++ b/VectoCore/VectoCore/Utils/Ninject/CombineArgumentsToNameInstanceProviders.cs @@ -68,7 +68,7 @@ namespace TUGraz.VectoCore.Utils.Ninject } catch (Exception e) { var name = GetName(methodInfo, arguments); - throw new VectoException("failed to create instance for '{1}' via '{0}' version '{2}' name'{3}'", e, methodInfo.Name, methodInfo.ReturnType.Name, arguments[0], name); + throw new VectoException("failed to create instance for '{1}' via '{0}' version '{2}' name'{3}'", e, methodInfo.Name, methodInfo.ReturnType.Name, arguments[0].ToString(), name); //throw e; } diff --git a/VectoCore/VectoCore/Utils/Ninject/VehicleTypeAndArchitectureStringHelper.cs b/VectoCore/VectoCore/Utils/Ninject/VehicleTypeAndArchitectureStringHelper.cs index ba319a1f6f..80901c3a64 100644 --- a/VectoCore/VectoCore/Utils/Ninject/VehicleTypeAndArchitectureStringHelper.cs +++ b/VectoCore/VectoCore/Utils/Ninject/VehicleTypeAndArchitectureStringHelper.cs @@ -249,6 +249,16 @@ namespace TUGraz.VectoCore.Utils.Ninject return hashCode; } } + + #region Overrides of ValueType + + public override string ToString() + { + return string.Join("\n", VehicleType, JobType, ArchId, Exempted ? "Exempted" : "Non Exempted", + IsSingleBus ? "Single Bus" : ""); + } + + #endregion } } } \ No newline at end of file diff --git a/VectoCore/VectoCore/VectoCore.csproj b/VectoCore/VectoCore/VectoCore.csproj index 161fb79169..e2e18071af 100644 --- a/VectoCore/VectoCore/VectoCore.csproj +++ b/VectoCore/VectoCore/VectoCore.csproj @@ -134,6 +134,7 @@ <ItemGroup> <Folder Include="InputData\Reader\DataObjectAdapter\CompletedBus\Generic\" /> + <Folder Include="InputData\Reader\DataObjectAdapter\SimulationComponents\StrategyDataAdapter\" /> </ItemGroup> </Project> \ No newline at end of file diff --git a/VectoCore/VectoCoreTest/Integration/Hybrid/SerialHybridTest.cs b/VectoCore/VectoCoreTest/Integration/Hybrid/SerialHybridTest.cs index 8a6f72a615..3f7206e64b 100644 --- a/VectoCore/VectoCoreTest/Integration/Hybrid/SerialHybridTest.cs +++ b/VectoCore/VectoCoreTest/Integration/Hybrid/SerialHybridTest.cs @@ -5,6 +5,7 @@ using System.Linq; using NUnit.Framework; using System.Data; using System.Reflection; +using System.Runtime.CompilerServices; using TUGraz.VectoCommon.Exceptions; using TUGraz.VectoCommon.InputData; using TUGraz.VectoCommon.Models; @@ -612,12 +613,12 @@ namespace TUGraz.VectoCore.Tests.Integration.Hybrid jobContainer.AddRun(run); return jobContainer; } - public static VehicleContainer CreateSerialHybridPowerTrain(DrivingCycleData cycleData, string modFileName, double initialBatCharge, SummaryDataContainer sumData, double pAuxEl, PowertrainPosition pos, double ratio, Kilogram payload = null, Watt maxDriveTrainPower = null, GearboxType gearboxType = GearboxType.NoGearbox, RetarderType retarderType = RetarderType.None) { + var gearboxData = CreateGearboxData(gearboxType); var axleGearData = CreateAxleGearData(gearboxType); @@ -632,8 +633,13 @@ namespace TUGraz.VectoCore.Tests.Integration.Hybrid var electricMotorData = MockSimulationDataFactory.CreateElectricMotorData(emFile, 2, pos, correctedRatio, 1); var genFile = GeneratorFile; - electricMotorData.AddRange( - MockSimulationDataFactory.CreateElectricMotorData(genFile, 1, PowertrainPosition.GEN, 2.6, 1)); + + foreach (var md in MockSimulationDataFactory.CreateElectricMotorData(genFile, 1, + PowertrainPosition.GEN, 2.6, 1)) { + electricMotorData.Add(md); + } + //electricMotorData.AddRange( + // MockSimulationDataFactory.CreateElectricMotorData(genFile, 1, PowertrainPosition.GEN, 2.6, 1)); var batFile = BatFile; var batteryData = MockSimulationDataFactory.CreateBatteryData(batFile, initialBatCharge); diff --git a/VectoCore/VectoCoreTest/Utils/MockDeclarationVehicleInputData.cs b/VectoCore/VectoCoreTest/Utils/MockDeclarationVehicleInputData.cs index 6c78f97dc7..e37abccbfd 100644 --- a/VectoCore/VectoCoreTest/Utils/MockDeclarationVehicleInputData.cs +++ b/VectoCore/VectoCoreTest/Utils/MockDeclarationVehicleInputData.cs @@ -64,7 +64,7 @@ namespace TUGraz.VectoCore.Tests.Utils public Meter EntranceHeight { get; } public ConsumerTechnology? DoorDriveTechnology { get; } public VehicleDeclarationType VehicleDeclarationType { get; } - public Dictionary<PowertrainPosition, List<Tuple<Volt, TableData>>> ElectricMotorTorqueLimits { get; } + public IDictionary<PowertrainPosition, IList<Tuple<Volt, TableData>>> ElectricMotorTorqueLimits { get; } public TableData BoostingLimitations { get; } public IVehicleComponentsDeclaration Components => this; public XmlNode XMLSource { get; } @@ -194,7 +194,7 @@ namespace TUGraz.VectoCore.Tests.Utils public IElectricMachinesEngineeringInputData ElectricMachines { get; set; } public IIEPCEngineeringInputData IEPCEngineeringInputData { get; } - Dictionary<PowertrainPosition, List<Tuple<Volt, TableData>>> IVehicleDeclarationInputData.ElectricMotorTorqueLimits => throw new NotImplementedException(); + IDictionary<PowertrainPosition, IList<Tuple<Volt, TableData>>> IVehicleDeclarationInputData.ElectricMotorTorqueLimits => throw new NotImplementedException(); #endregion } diff --git a/VectoCore/VectoCoreTest/Utils/MockSimulationDataFactory.cs b/VectoCore/VectoCoreTest/Utils/MockSimulationDataFactory.cs index 140c9e06bf..ea65332b74 100644 --- a/VectoCore/VectoCoreTest/Utils/MockSimulationDataFactory.cs +++ b/VectoCore/VectoCoreTest/Utils/MockSimulationDataFactory.cs @@ -200,19 +200,22 @@ namespace TUGraz.VectoCore.Tests.Utils return dao.CreateDriverData(engineeringJob.DriverInputData); } - public static List<Tuple<PowertrainPosition, ElectricMotorData>> CreateElectricMotorData(string file, int count, + public static IList<Tuple<PowertrainPosition, ElectricMotorData>> CreateElectricMotorData(string file, int count, PowertrainPosition pos, double ratio, double efficiency) { var inputData = JSONInputDataFactory.ReadElectricMotorData(file, false); - return new EngineeringDataAdapter().CreateElectricMachines(new MockElectricMachinesInputData() { - Entries = new[] { - new ElectricMachineEntry<IElectricMotorEngineeringInputData>() - { - Count = count, ElectricMachine = inputData, Position = pos, RatioADC = ratio, MechanicalTransmissionEfficiency = efficiency, - } - } - }, null, null); - } + + + return new EngineeringDataAdapter().CreateElectricMachines(new MockElectricMachinesInputData() + { + Entries = new[] { + new ElectricMachineEntry<IElectricMotorEngineeringInputData>() + { + Count = count, ElectricMachine = inputData, Position = pos, RatioADC = ratio, MechanicalTransmissionEfficiency = efficiency, + } + } + }, null, null); + } public static BatterySystemData CreateBatteryData(string file, double initialSoC) @@ -296,7 +299,7 @@ namespace TUGraz.VectoCore.Tests.Utils public Meter EntranceHeight { get; } public ConsumerTechnology? DoorDriveTechnology { get; } public VehicleDeclarationType VehicleDeclarationType { get; } - public Dictionary<PowertrainPosition, List<Tuple<Volt, TableData>>> ElectricMotorTorqueLimits { get; } + public IDictionary<PowertrainPosition, IList<Tuple<Volt, TableData>>> ElectricMotorTorqueLimits { get; } public TableData BoostingLimitations { get; } public string VehicleTypeApprovalNumber { get; } public ArchitectureID ArchitectureID { get; } diff --git a/VectoCore/VectoCoreTest/Utils/MockVehicleInputData.cs b/VectoCore/VectoCoreTest/Utils/MockVehicleInputData.cs index 632be8b00f..d52875e985 100644 --- a/VectoCore/VectoCoreTest/Utils/MockVehicleInputData.cs +++ b/VectoCore/VectoCoreTest/Utils/MockVehicleInputData.cs @@ -102,7 +102,7 @@ namespace TUGraz.VectoCore.Tests.Utils public VehicleDeclarationType VehicleDeclarationType { get; } - public Dictionary<PowertrainPosition, List<Tuple<Volt, TableData>>> ElectricMotorTorqueLimits { get; } + public IDictionary<PowertrainPosition, IList<Tuple<Volt, TableData>>> ElectricMotorTorqueLimits { get; } public TableData BoostingLimitations => throw new NotImplementedException(); -- GitLab