diff --git a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/CompletedBus/Generic/DeclarationDataAdapterGenericCompletedBus.cs b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/CompletedBus/Generic/DeclarationDataAdapterGenericCompletedBus.cs index 0c82d81701065806307988bf3d8ffa5aa8b8c8e0..d81f854fc74751975731275256259552efeaa73a 100644 --- a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/CompletedBus/Generic/DeclarationDataAdapterGenericCompletedBus.cs +++ b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/CompletedBus/Generic/DeclarationDataAdapterGenericCompletedBus.cs @@ -175,7 +175,7 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter.CompletedBus.Gener public abstract class Hybrid : CompletedBusDeclarationBase { - private ElectricStorageAdapter _eletricStorageAdapter = new ElectricStorageAdapter(); + private IElectricStorageAdapter _eletricStorageAdapter = new ElectricStorageAdapter(); #region Overrides of CompletedBusDeclarationBase @@ -242,7 +242,7 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter.CompletedBus.Gener public abstract class BatteryElectric : CompletedBusDeclarationBase { - private readonly ElectricStorageAdapter _electricStorageAdapter = null; + private readonly IElectricStorageAdapter _electricStorageAdapter = new GenericElectricStorageDataAdapter(); protected override IEngineDataAdapter EngineDataAdapter => throw new NotImplementedException(); diff --git a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/HeavyLorry/DeclarationDataAdapterHeavyLorry.cs b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/HeavyLorry/DeclarationDataAdapterHeavyLorry.cs index 674e24c4623ce1a1aec935f25d81bd3dd61b53d9..076cc8106d18a9e53e8753e92cf1cc16bc944767 100644 --- a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/HeavyLorry/DeclarationDataAdapterHeavyLorry.cs +++ b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/HeavyLorry/DeclarationDataAdapterHeavyLorry.cs @@ -243,7 +243,7 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter.HeavyLorry public abstract class Hybrid : LorryBase { - private ElectricStorageAdapter _eletricStorageAdapter = new ElectricStorageAdapter(); + private IElectricStorageAdapter _eletricStorageAdapter = new ElectricStorageAdapter(); protected IAuxiliaryDataAdapter _auxAdapter = new HeavyLorryAuxiliaryDataAdapter(); protected override IEngineDataAdapter EngineDataAdapter { get; } = new CombustionEngineComponentDataAdapter(); @@ -310,7 +310,7 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter.HeavyLorry protected override GearboxType[] SupportedGearboxTypes { get; } //private readonly GearboxDataAdapter _gearboxDataAdapter = new GearboxDataAdapter(null); - private readonly ElectricStorageAdapter _electricStorageAdapter = new ElectricStorageAdapter(); + private readonly IElectricStorageAdapter _electricStorageAdapter = new ElectricStorageAdapter(); private readonly ElectricMachinesDataAdapter _electricMachineAdapter = new ElectricMachinesDataAdapter(); private readonly HeavyLorryPEVAuxiliaryDataAdapter diff --git a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/IDeclarationDataAdapter.cs b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/IDeclarationDataAdapter.cs index 1153cd700bf3dc62017777b5b82d0800f282d329..42c94698a47b406eaed43ce23a8d5931345fa10f 100644 --- a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/IDeclarationDataAdapter.cs +++ b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/IDeclarationDataAdapter.cs @@ -34,9 +34,15 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter List<Tuple<PowertrainPosition, ElectricMotorData>> CreateIEPCElectricMachines( IIEPCDeclarationInputData iepc, Volt averageVoltage); - } - public interface ILorryDeclarationDataAdapter : IDeclarationDataAdapter + IList<Tuple<PowertrainPosition, ElectricMotorData>> CreateElectricMachines(IElectricMachinesDeclarationInputData electricMachines, IDictionary<PowertrainPosition, IList<Tuple<Volt, TableData>>> torqueLimits, Volt averageVoltage, GearList gears = null); + + void CreateREESSData(IElectricStorageSystemDeclarationInputData componentsElectricStorage, + VectoSimulationJobType jobType, bool ovc, Action<BatterySystemData> setBatteryData, + Action<SuperCapData> setSuperCapData); + } + + public interface ILorryDeclarationDataAdapter : IDeclarationDataAdapter { DriverData CreateDriverData(Segment segment); @@ -68,11 +74,6 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter Meter vehicleLength, int? numSteeredAxles, VectoSimulationJobType jobType); - IList<Tuple<PowertrainPosition, ElectricMotorData>> CreateElectricMachines(IElectricMachinesDeclarationInputData electricMachines, IDictionary<PowertrainPosition, IList<Tuple<Volt, TableData>>> torqueLimits, Volt averageVoltage, GearList gears = null); - - void CreateREESSData(IElectricStorageSystemDeclarationInputData componentsElectricStorage, - VectoSimulationJobType jobType, bool ovc, Action<BatterySystemData> setBatteryData, - Action<SuperCapData> setSuperCapData); //BatterySystemData CreateBatteryData(IElectricStorageSystemDeclarationInputData componentsElectricStorage, // VectoSimulationJobType jobType, @@ -122,12 +123,6 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter AirdragData CreateAirdragData(IAirdragDeclarationInputData airdragData, Mission mission, Segment segment); - IList<Tuple<PowertrainPosition, ElectricMotorData>> CreateElectricMachines(IElectricMachinesDeclarationInputData electricMachines, IDictionary<PowertrainPosition, IList<Tuple<Volt, TableData>>> torqueLimits, Volt averageVoltage, GearList gears = null); - - void CreateREESSData(IElectricStorageSystemDeclarationInputData componentsElectricStorage, - VectoSimulationJobType jobType, bool ovc, Action<BatterySystemData> setBatteryData, - Action<SuperCapData> setSuperCapData); - HybridStrategyParameters CreateHybridStrategy(BatterySystemData runDataBatteryData, SuperCapData runDataSuperCapData, Kilogram vehicleMass, VectoRunData.OvcHevMode ovcMode, LoadingType loading, VehicleClass vehicleClass, MissionType missionType); @@ -164,10 +159,6 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter IAuxiliaryConfig CreateBusAuxiliariesData( Mission mission, IVehicleDeclarationInputData primaryVehicle, IVehicleDeclarationInputData completedVehicle, VectoRunData runData); - void CreateREESSData(IElectricStorageSystemDeclarationInputData componentsElectricStorage, - VectoSimulationJobType jobType, bool ovc, Action<BatterySystemData> setBatteryData, - Action<SuperCapData> setSuperCapData); - HybridStrategyParameters CreateHybridStrategy(BatterySystemData runDataBatteryData, SuperCapData runDataSuperCapData, Kilogram vehicleMass, VectoRunData.OvcHevMode ovcMode, LoadingType loading, VehicleClass vehicleClass, MissionType missionType); diff --git a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/PrimaryBus/DeclarationDataAdapterPrimaryBus.cs b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/PrimaryBus/DeclarationDataAdapterPrimaryBus.cs index 12cd0c6d031ad895269f4ca11cd3b1a3abb1b538..e130263dcfe2cb853363a285720854e84eb0b956 100644 --- a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/PrimaryBus/DeclarationDataAdapterPrimaryBus.cs +++ b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/PrimaryBus/DeclarationDataAdapterPrimaryBus.cs @@ -190,7 +190,7 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter.PrimaryBus public abstract class Hybrid : PrimaryBusBase { - private ElectricStorageAdapter _eletricStorageAdapter = new ElectricStorageAdapter(); + private IElectricStorageAdapter _eletricStorageAdapter = new ElectricStorageAdapter(); #region Overrides of PrimaryBusBase @@ -291,7 +291,7 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter.PrimaryBus public abstract class BatteryElectric : PrimaryBusBase { - private readonly ElectricStorageAdapter _electricStorageAdapter = new ElectricStorageAdapter(); + private readonly IElectricStorageAdapter _electricStorageAdapter = new ElectricStorageAdapter(); #region Overrides of PrimaryBusBase diff --git a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/SimulationComponents/BatteryDataAdapter.cs b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/SimulationComponents/BatteryDataAdapter.cs index afe3abdeebe831709e2894569f7bd95c608d29d5..623075264d37f2d9a7285f72d291f5b4a3337023 100644 --- a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/SimulationComponents/BatteryDataAdapter.cs +++ b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/SimulationComponents/BatteryDataAdapter.cs @@ -5,28 +5,28 @@ using TUGraz.VectoCommon.Exceptions; using TUGraz.VectoCommon.InputData; using TUGraz.VectoCommon.Utils; using TUGraz.VectoCore.InputData.Reader.ComponentData; +using TUGraz.VectoCore.InputData.Reader.DataObjectAdapter.SimulationComponents.Interfaces; using TUGraz.VectoCore.Models.Declaration; +using TUGraz.VectoCore.Models.GenericModelData; using TUGraz.VectoCore.Models.SimulationComponent.Data; using TUGraz.VectoCore.Models.SimulationComponent.Data.ElectricComponents.Battery; using TUGraz.VectoCore.Models.SimulationComponent.Impl; namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter.SimulationComponents { - public class ElectricStorageAdapter + public class ElectricStorageAdapter : IElectricStorageAdapter { public BatterySystemData CreateBatteryData(IElectricStorageSystemDeclarationInputData batteryInputData, VectoSimulationJobType jobType, bool ovc) { - if (batteryInputData == null) - { + if (batteryInputData == null) { return null; } var batteries = batteryInputData.ElectricStorageElements.Where(x => x.REESSPack.StorageType == REESSType.Battery).ToArray(); - if (batteries.Length == 0) - { + if (batteries.Length == 0) { return null; } @@ -115,7 +115,41 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter.SimulationComponen } - + } + + public class GenericElectricStorageDataAdapter : IElectricStorageAdapter + { + protected GenericBusBatteryData busBattery = new GenericBusBatteryData(); + protected GenericBusSuperCapData busSuperCap = new GenericBusSuperCapData(); + + #region Implementation of IElectricStorageAdapter + + public BatterySystemData CreateBatteryData(IElectricStorageSystemDeclarationInputData batteryInputData, + VectoSimulationJobType jobType, bool ovc) + { + if (batteryInputData == null) { + return null; + } + return busBattery.CreateBatteryData(batteryInputData, jobType, ovc); + } + + 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 busSuperCap.CreateGenericSuperCapData(superCap); + } + + #endregion } public static class BatterySystemHelper diff --git a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/SimulationComponents/Interfaces/IElectricStorageAdapter.cs b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/SimulationComponents/Interfaces/IElectricStorageAdapter.cs new file mode 100644 index 0000000000000000000000000000000000000000..f343a62bd42f64cbb02da5e784a19755359539c1 --- /dev/null +++ b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/SimulationComponents/Interfaces/IElectricStorageAdapter.cs @@ -0,0 +1,14 @@ +using TUGraz.VectoCommon.InputData; +using TUGraz.VectoCore.Models.SimulationComponent.Data.ElectricComponents.Battery; + +namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter.SimulationComponents.Interfaces +{ + public interface IElectricStorageAdapter + { + BatterySystemData CreateBatteryData(IElectricStorageSystemDeclarationInputData batteryInputData, + VectoSimulationJobType jobType, + bool ovc); + + SuperCapData CreateSuperCapData(IElectricStorageSystemDeclarationInputData reessInputData); + } +} \ No newline at end of file diff --git a/VectoCore/VectoCore/InputData/Reader/Impl/AbstractDeclarationVectoRunDataFactory.cs b/VectoCore/VectoCore/InputData/Reader/Impl/AbstractDeclarationVectoRunDataFactory.cs index 426b95a1e6558c6bb7f0c0008e791aba8c02d748..81deeecbcf2de46662028383df0c4bd46eaab597 100644 --- a/VectoCore/VectoCore/InputData/Reader/Impl/AbstractDeclarationVectoRunDataFactory.cs +++ b/VectoCore/VectoCore/InputData/Reader/Impl/AbstractDeclarationVectoRunDataFactory.cs @@ -79,5 +79,31 @@ namespace TUGraz.VectoCore.InputData.Reader.Impl { protected abstract VectoRunData GetPowertrainConfigForReportInit(); - } + /// <summary> + /// Super caps are not allowed for ovc hevs or pevs + /// </summary> + protected void CheckSuperCap(IVehicleDeclarationInputData vehicle) + { + if (vehicle.VehicleType == VectoSimulationJobType.BatteryElectricVehicle || vehicle.OvcHev) { + if (vehicle.Components.ElectricStorage.ElectricStorageElements.Any(e => + e.REESSPack.StorageType == REESSType.SuperCap)) { + throw new VectoException("Super caps are not allowed for OVC-HEVs or PEVs"); + } + } + + if (vehicle.Components.ElectricStorage?.ElectricStorageElements == null) { + return; + } + + var hasSuperCap = vehicle.Components.ElectricStorage.ElectricStorageElements.Any(e => + e.REESSPack.StorageType == REESSType.SuperCap); + var hasBattery = vehicle.Components.ElectricStorage.ElectricStorageElements.Any(e => + e.REESSPack.StorageType == REESSType.Battery); + + if (hasSuperCap && hasBattery) { + //Already handled by XML Schema + throw new VectoException("Super caps AND batteries are not supported"); + } + } + } } \ No newline at end of file diff --git a/VectoCore/VectoCore/InputData/Reader/Impl/DeclarationMode/CompletedBusRunDataFactory/DeclarationModeCompletedBusRunDataFactory.cs b/VectoCore/VectoCore/InputData/Reader/Impl/DeclarationMode/CompletedBusRunDataFactory/DeclarationModeCompletedBusRunDataFactory.cs index 34628c81eeb553d5519b6bee8f75f582c530c23f..cee210f4fdcff22632f79b794b229b91e14b89ca 100644 --- a/VectoCore/VectoCore/InputData/Reader/Impl/DeclarationMode/CompletedBusRunDataFactory/DeclarationModeCompletedBusRunDataFactory.cs +++ b/VectoCore/VectoCore/InputData/Reader/Impl/DeclarationMode/CompletedBusRunDataFactory/DeclarationModeCompletedBusRunDataFactory.cs @@ -9,6 +9,7 @@ using TUGraz.VectoCommon.Utils; using TUGraz.VectoCore.InputData.Reader.ComponentData; using TUGraz.VectoCore.InputData.Reader.DataObjectAdapter; using TUGraz.VectoCore.InputData.Reader.DataObjectAdapter.HeavyLorry; +using TUGraz.VectoCore.InputData.Reader.DataObjectAdapter.SimulationComponents; using TUGraz.VectoCore.Models.Declaration; using TUGraz.VectoCore.Models.Simulation.Data; using TUGraz.VectoCore.Models.Simulation.Impl; @@ -65,121 +66,41 @@ namespace TUGraz.VectoCore.InputData.Reader.Impl.DeclarationMode.CompletedBusRun } - protected virtual VectoRunData CreateVectoRunDataGeneric(Mission mission, - KeyValuePair<LoadingType, Tuple<Kilogram, double?>> loading, Segment primarySegment, int? modeIdx) - { - var cycle = DeclarationData.CyclesCache.GetOrAdd(mission.MissionType, - _ => DrivingCycleDataReader.ReadFromStream(mission.CycleFile, CycleType.DistanceBased, "", false)); - - var primaryBusAuxiliaries = PrimaryVehicle.Components.BusAuxiliaries; + protected abstract VectoRunData CreateVectoRunDataGeneric(Mission mission, + KeyValuePair<LoadingType, Tuple<Kilogram, double?>> loading, Segment primarySegment, int? modeIdx); - var simulationRunData = new VectoRunData { - InputData = DataProvider.MultistageJobInputData, - Loading = loading.Key, - VehicleData = - DataAdapterGeneric.CreateVehicleData(PrimaryVehicle, primarySegment, mission, loading, false), - AirdragData = DataAdapterGeneric.CreateAirdragData(null, mission, new Segment()), - EngineData = DataAdapterGeneric.CreateEngineData(PrimaryVehicle, modeIdx.Value, mission), - ElectricMachinesData = new List<Tuple<PowertrainPosition, ElectricMotorData>>(), - //GearboxData = _gearboxData, - AxleGearData = DataAdapterGeneric.CreateAxleGearData(PrimaryVehicle.Components.AxleGearInputData), - AngledriveData = DataAdapterGeneric.CreateAngledriveData(PrimaryVehicle.Components.AngledriveInputData) , - Aux = DataAdapterGeneric.CreateAuxiliaryData(PrimaryVehicle.Components.AuxiliaryInputData, - primaryBusAuxiliaries, mission.MissionType, primarySegment.VehicleClass, - mission.BusParameter.VehicleLength, - PrimaryVehicle.Components.AxleWheels.NumSteeredAxles, PrimaryVehicle.VehicleType), - Cycle = new DrivingCycleProxy(cycle, mission.MissionType.ToString()), - Retarder = DataAdapterGeneric.CreateRetarderData(PrimaryVehicle.Components.RetarderInputData), - DriverData = DriverData, - ExecutionMode = ExecutionMode.Declaration, - JobName = DataProvider.MultistageJobInputData.JobInputData.ManufacturingStages.Last().Vehicle - .Identifier, - ModFileSuffix = $"_{_segment.VehicleClass.GetClassNumber()}-Generic_{loading.Key}", - Report = Report, - Mission = mission, - InputDataHash = DataProvider.MultistageJobInputData.XMLHash, - SimulationType = SimulationType.DistanceCycle, - VehicleDesignSpeed = _segment.DesignSpeed, - MaxChargingPower = PrimaryVehicle.MaxChargingPower, - //GearshiftParameters = _gearshiftData, - }; - simulationRunData.EngineData.FuelMode = 0; - simulationRunData.VehicleData.VehicleClass = _segment.VehicleClass; - simulationRunData.BusAuxiliaries = - DataAdapterGeneric.CreateBusAuxiliariesData(mission, PrimaryVehicle, CompletedVehicle, simulationRunData); - var shiftStrategyName = - PowertrainBuilder.GetShiftStrategyName(PrimaryVehicle.Components.GearboxInputData.Type, - PrimaryVehicle.VehicleType); - simulationRunData.GearboxData = DataAdapterGeneric.CreateGearboxData(PrimaryVehicle, simulationRunData, - ShiftPolygonCalculator.Create(shiftStrategyName, simulationRunData.GearshiftParameters)); - simulationRunData.GearshiftParameters = - DataAdapterGeneric.CreateGearshiftData( - simulationRunData.GearboxData, - (simulationRunData.AxleGearData?.AxleGear.Ratio ?? 1.0) * - (simulationRunData.AngledriveData?.Angledrive.Ratio ?? 1.0), - PrimaryVehicle.EngineIdleSpeed - ); - return simulationRunData; - } + protected abstract VectoRunData CreateVectoRunDataSpecific(Mission mission, + KeyValuePair<LoadingType, Tuple<Kilogram, double?>> loading, int? modeIdx); - protected virtual VectoRunData CreateVectoRunDataSpecific(Mission mission, - KeyValuePair<LoadingType, Tuple<Kilogram, double?>> loading, int? modeIdx) + protected virtual VectoRunData CreateCommonRunData(Mission mission, KeyValuePair<LoadingType, Tuple<Kilogram, double?>> loading, string modSuffix) { var cycle = DeclarationData.CyclesCache.GetOrAdd(mission.MissionType, _ => DrivingCycleDataReader.ReadFromStream(mission.CycleFile, CycleType.DistanceBased, "", false)); + CheckSuperCap(PrimaryVehicle); + var simulationRunData = new VectoRunData { InputData = DataProvider.MultistageJobInputData, Loading = loading.Key, - VehicleData = DataAdapterSpecific.CreateVehicleData(PrimaryVehicle, CompletedVehicle, _segment, - mission, loading), - AirdragData = DataAdapterSpecific.CreateAirdragData(CompletedVehicle, mission), - EngineData = DataAdapterGeneric.CreateEngineData(PrimaryVehicle, modeIdx.Value, mission), - ElectricMachinesData = new List<Tuple<PowertrainPosition, ElectricMotorData>>(), - //GearboxData = _gearboxData, - AxleGearData = DataAdapterGeneric.CreateAxleGearData(PrimaryVehicle.Components.AxleGearInputData), - AngledriveData = DataAdapterGeneric.CreateAngledriveData(PrimaryVehicle.Components.AngledriveInputData), - Aux = DataAdapterSpecific.CreateAuxiliaryData(PrimaryVehicle.Components.AuxiliaryInputData, - PrimaryVehicle.Components.BusAuxiliaries, mission.MissionType, _segment.VehicleClass, - CompletedVehicle.Length, - PrimaryVehicle.Components.AxleWheels.NumSteeredAxles, PrimaryVehicle.VehicleType), Cycle = new DrivingCycleProxy(cycle, mission.MissionType.ToString()), - Retarder = DataAdapterGeneric.CreateRetarderData(PrimaryVehicle.Components.RetarderInputData), DriverData = DriverData, ExecutionMode = ExecutionMode.Declaration, JobName = DataProvider.MultistageJobInputData.JobInputData.ManufacturingStages.Last().Vehicle .Identifier, //?!? Jobname - ModFileSuffix = $"_{_segment.VehicleClass.GetClassNumber()}-Specific_{loading.Key}", + ModFileSuffix = $"_{_segment.VehicleClass.GetClassNumber()}-{modSuffix}_{loading.Key}", Report = Report, Mission = mission, InputDataHash = DataProvider.MultistageJobInputData.XMLHash, // right hash?!? SimulationType = SimulationType.DistanceCycle, VehicleDesignSpeed = _segment.DesignSpeed, MaxChargingPower = PrimaryVehicle.MaxChargingPower, - //GearshiftParameters = _gearshiftData, }; - simulationRunData.EngineData.FuelMode = 0; - simulationRunData.VehicleData.VehicleClass = _segment.VehicleClass; - simulationRunData.BusAuxiliaries = - DataAdapterSpecific.CreateBusAuxiliariesData(mission, PrimaryVehicle, CompletedVehicle, - simulationRunData); - var shiftStrategyName = - PowertrainBuilder.GetShiftStrategyName(PrimaryVehicle.Components.GearboxInputData.Type, - PrimaryVehicle.VehicleType); - simulationRunData.GearboxData = DataAdapterGeneric.CreateGearboxData(PrimaryVehicle, simulationRunData, - ShiftPolygonCalculator.Create(shiftStrategyName, simulationRunData.GearshiftParameters)); - simulationRunData.GearshiftParameters = - DataAdapterGeneric.CreateGearshiftData( - simulationRunData.GearboxData, - (simulationRunData.AxleGearData?.AxleGear.Ratio ?? 1.0) * - (simulationRunData.AngledriveData?.Angledrive.Ratio ?? 1.0), - PrimaryVehicle.EngineIdleSpeed - ); return simulationRunData; } - protected virtual Segment GetPrimarySegment(IVehicleDeclarationInputData primaryVehicle) + + protected virtual Segment GetPrimarySegment(IVehicleDeclarationInputData primaryVehicle) { var primarySegment = DeclarationData.PrimaryBusSegments.Lookup( primaryVehicle.VehicleCategory, primaryVehicle.AxleConfiguration, primaryVehicle.Articulated); @@ -217,6 +138,7 @@ namespace TUGraz.VectoCore.InputData.Reader.Impl.DeclarationMode.CompletedBusRun yield return simulationRunData; } + protected override VectoRunData CreateVectoRunData(IVehicleDeclarationInputData vehicle, Mission mission, KeyValuePair<LoadingType, Tuple<Kilogram, double?>> loading, int? modeIdx = null, VectoRunData.OvcHevMode ovcMode = VectoRunData.OvcHevMode.NotApplicable) { @@ -262,7 +184,8 @@ namespace TUGraz.VectoCore.InputData.Reader.Impl.DeclarationMode.CompletedBusRun } #endregion - } + protected abstract void CreateGearboxAndGearshiftData(VectoRunData runData); + } public class Conventional : CompletedBusBase { @@ -293,9 +216,97 @@ namespace TUGraz.VectoCore.InputData.Reader.Impl.DeclarationMode.CompletedBusRun } } - } + protected override VectoRunData CreateVectoRunDataGeneric(Mission mission, KeyValuePair<LoadingType, Tuple<Kilogram, double?>> loading, Segment primarySegment, int? modeIdx) + { + var simulationRunData = CreateCommonRunData(mission, loading, "Generic"); + + var primaryBusAuxiliaries = PrimaryVehicle.Components.BusAuxiliaries; + + simulationRunData.VehicleData = + DataAdapterGeneric.CreateVehicleData(PrimaryVehicle, primarySegment, mission, loading, false); + simulationRunData.AirdragData = DataAdapterGeneric.CreateAirdragData(null, mission, new Segment()); + simulationRunData.EngineData = + DataAdapterGeneric.CreateEngineData(PrimaryVehicle, modeIdx.Value, mission); + simulationRunData.ElectricMachinesData = new List<Tuple<PowertrainPosition, ElectricMotorData>>(); + simulationRunData.AxleGearData = + DataAdapterGeneric.CreateAxleGearData(PrimaryVehicle.Components.AxleGearInputData); + simulationRunData.AngledriveData = + DataAdapterGeneric.CreateAngledriveData(PrimaryVehicle.Components.AngledriveInputData); + simulationRunData.Aux = DataAdapterGeneric.CreateAuxiliaryData( + PrimaryVehicle.Components.AuxiliaryInputData, primaryBusAuxiliaries, mission.MissionType, + primarySegment.VehicleClass, mission.BusParameter.VehicleLength, + PrimaryVehicle.Components.AxleWheels.NumSteeredAxles, PrimaryVehicle.VehicleType); + simulationRunData.Retarder = + DataAdapterGeneric.CreateRetarderData(PrimaryVehicle.Components.RetarderInputData); + + simulationRunData.EngineData.FuelMode = 0; + simulationRunData.VehicleData.VehicleClass = _segment.VehicleClass; + simulationRunData.BusAuxiliaries = + DataAdapterGeneric.CreateBusAuxiliariesData(mission, PrimaryVehicle, CompletedVehicle, simulationRunData); + var shiftStrategyName = + PowertrainBuilder.GetShiftStrategyName(PrimaryVehicle.Components.GearboxInputData.Type, + PrimaryVehicle.VehicleType); + simulationRunData.GearboxData = DataAdapterGeneric.CreateGearboxData(PrimaryVehicle, simulationRunData, + ShiftPolygonCalculator.Create(shiftStrategyName, simulationRunData.GearshiftParameters)); + simulationRunData.GearshiftParameters = + DataAdapterGeneric.CreateGearshiftData( + simulationRunData.GearboxData, + (simulationRunData.AxleGearData?.AxleGear.Ratio ?? 1.0) * + (simulationRunData.AngledriveData?.Angledrive.Ratio ?? 1.0), + PrimaryVehicle.EngineIdleSpeed); + return simulationRunData; + } - public abstract class Hybrid : CompletedBusBase + protected override VectoRunData CreateVectoRunDataSpecific(Mission mission, + KeyValuePair<LoadingType, Tuple<Kilogram, double?>> loading, int? modeIdx) + { + var simulationRunData = CreateCommonRunData(mission, loading, "Specific"); + + simulationRunData.VehicleData = DataAdapterSpecific.CreateVehicleData(PrimaryVehicle, + CompletedVehicle, _segment, mission, loading); + simulationRunData.AirdragData = DataAdapterSpecific.CreateAirdragData(CompletedVehicle, mission); + simulationRunData.EngineData = + DataAdapterGeneric.CreateEngineData(PrimaryVehicle, modeIdx.Value, mission); + simulationRunData.ElectricMachinesData = new List<Tuple<PowertrainPosition, ElectricMotorData>>(); + simulationRunData.AxleGearData = + DataAdapterGeneric.CreateAxleGearData(PrimaryVehicle.Components.AxleGearInputData); + simulationRunData.AngledriveData = + DataAdapterGeneric.CreateAngledriveData(PrimaryVehicle.Components.AngledriveInputData); + simulationRunData.Aux = DataAdapterSpecific.CreateAuxiliaryData( + PrimaryVehicle.Components.AuxiliaryInputData, + PrimaryVehicle.Components.BusAuxiliaries, mission.MissionType, _segment.VehicleClass, + CompletedVehicle.Length, PrimaryVehicle.Components.AxleWheels.NumSteeredAxles, PrimaryVehicle.VehicleType); + simulationRunData.Retarder = DataAdapterGeneric.CreateRetarderData(PrimaryVehicle.Components.RetarderInputData); + simulationRunData.EngineData.FuelMode = 0; + simulationRunData.VehicleData.VehicleClass = _segment.VehicleClass; + simulationRunData.BusAuxiliaries = + DataAdapterSpecific.CreateBusAuxiliariesData(mission, PrimaryVehicle, CompletedVehicle, + simulationRunData); + + CreateGearboxAndGearshiftData(simulationRunData); + return simulationRunData; + } + + + protected override void CreateGearboxAndGearshiftData(VectoRunData runData) + { + var shiftStrategyName = + PowertrainBuilder.GetShiftStrategyName(PrimaryVehicle.Components.GearboxInputData.Type, + PrimaryVehicle.VehicleType); + runData.GearboxData = DataAdapterGeneric.CreateGearboxData(PrimaryVehicle, runData, + ShiftPolygonCalculator.Create(shiftStrategyName, runData.GearshiftParameters)); + runData.GearshiftParameters = + DataAdapterGeneric.CreateGearshiftData( + runData.GearboxData, + (runData.AxleGearData?.AxleGear.Ratio ?? 1.0) * + (runData.AngledriveData?.Angledrive.Ratio ?? 1.0), + PrimaryVehicle.EngineIdleSpeed + ); + + } + } + + public abstract class Hybrid : CompletedBusBase { protected Hybrid(IMultistageVIFInputData dataProvider, IDeclarationReport report, ISpecificCompletedBusDeclarationDataAdapter dataAdapterSpecific, @@ -323,7 +334,26 @@ namespace TUGraz.VectoCore.InputData.Reader.Impl.DeclarationMode.CompletedBusRun } } } - } + + #region Overrides of CompletedBusBase + + protected override VectoRunData CreateVectoRunDataGeneric(Mission mission, KeyValuePair<LoadingType, Tuple<Kilogram, double?>> loading, Segment primarySegment, int? modeIdx) + { + throw new NotImplementedException("dummy implementation"); + } + + protected override VectoRunData CreateVectoRunDataSpecific(Mission mission, KeyValuePair<LoadingType, Tuple<Kilogram, double?>> loading, int? modeIdx) + { + throw new NotImplementedException("dummy implementation"); + } + + protected override void CreateGearboxAndGearshiftData(VectoRunData runData) + { + throw new NotImplementedException("dummy implementation"); + } + + #endregion + } public abstract class SerialHybrid : Hybrid @@ -350,15 +380,18 @@ namespace TUGraz.VectoCore.InputData.Reader.Impl.DeclarationMode.CompletedBusRun #endregion } - public class HEV_S3 : SerialHybrid + + public class HEV_S3 : SerialHybrid { public HEV_S3(IMultistageVIFInputData dataProvider, IDeclarationReport report, ISpecificCompletedBusDeclarationDataAdapter dataAdapterSpecific, IGenericCompletedBusDeclarationDataAdapter dataAdapterGeneric) : base(dataProvider, report, dataAdapterSpecific, dataAdapterGeneric) { } } - public class HEV_S4 : SerialHybrid + + public class HEV_S4 : SerialHybrid { public HEV_S4(IMultistageVIFInputData dataProvider, IDeclarationReport report, ISpecificCompletedBusDeclarationDataAdapter dataAdapterSpecific, IGenericCompletedBusDeclarationDataAdapter dataAdapterGeneric) : base(dataProvider, report, dataAdapterSpecific, dataAdapterGeneric) { } } - public class HEV_S_IEPC : SerialHybrid + + public class HEV_S_IEPC : SerialHybrid { public HEV_S_IEPC(IMultistageVIFInputData dataProvider, IDeclarationReport report, ISpecificCompletedBusDeclarationDataAdapter dataAdapterSpecific, IGenericCompletedBusDeclarationDataAdapter dataAdapterGeneric) : base(dataProvider, report, dataAdapterSpecific, dataAdapterGeneric) { } } @@ -375,19 +408,23 @@ namespace TUGraz.VectoCore.InputData.Reader.Impl.DeclarationMode.CompletedBusRun { public HEV_P1(IMultistageVIFInputData dataProvider, IDeclarationReport report, ISpecificCompletedBusDeclarationDataAdapter dataAdapterSpecific, IGenericCompletedBusDeclarationDataAdapter dataAdapterGeneric) : base(dataProvider, report, dataAdapterSpecific, dataAdapterGeneric) { } } - public class HEV_P2 : ParallelHybrid + + public class HEV_P2 : ParallelHybrid { public HEV_P2(IMultistageVIFInputData dataProvider, IDeclarationReport report, ISpecificCompletedBusDeclarationDataAdapter dataAdapterSpecific, IGenericCompletedBusDeclarationDataAdapter dataAdapterGeneric) : base(dataProvider, report, dataAdapterSpecific, dataAdapterGeneric) { } } - public class HEV_P2_5 : ParallelHybrid + + public class HEV_P2_5 : ParallelHybrid { public HEV_P2_5(IMultistageVIFInputData dataProvider, IDeclarationReport report, ISpecificCompletedBusDeclarationDataAdapter dataAdapterSpecific, IGenericCompletedBusDeclarationDataAdapter dataAdapterGeneric) : base(dataProvider, report, dataAdapterSpecific, dataAdapterGeneric) { } } - public class HEV_P3 : ParallelHybrid + + public class HEV_P3 : ParallelHybrid { public HEV_P3(IMultistageVIFInputData dataProvider, IDeclarationReport report, ISpecificCompletedBusDeclarationDataAdapter dataAdapterSpecific, IGenericCompletedBusDeclarationDataAdapter dataAdapterGeneric) : base(dataProvider, report, dataAdapterSpecific, dataAdapterGeneric) { } } - public class HEV_P4 : ParallelHybrid + + public class HEV_P4 : ParallelHybrid { public HEV_P4(IMultistageVIFInputData dataProvider, IDeclarationReport report, ISpecificCompletedBusDeclarationDataAdapter dataAdapterSpecific, IGenericCompletedBusDeclarationDataAdapter dataAdapterGeneric) : base(dataProvider, report, dataAdapterSpecific, dataAdapterGeneric) { } } @@ -410,7 +447,76 @@ namespace TUGraz.VectoCore.InputData.Reader.Impl.DeclarationMode.CompletedBusRun } } } - } + + protected override VectoRunData CreateVectoRunDataGeneric(Mission mission, KeyValuePair<LoadingType, Tuple<Kilogram, double?>> loading, Segment primarySegment, int? modeIdx) + { + throw new NotImplementedException(); + } + + protected override VectoRunData CreateVectoRunDataSpecific(Mission mission, + KeyValuePair<LoadingType, Tuple<Kilogram, double?>> loading, int? modeIdx) + { + var result = CreateCommonRunData(mission, loading, "Specific"); + + DataAdapterGeneric.CreateREESSData( + componentsElectricStorage: PrimaryVehicle.Components.ElectricStorage, + PrimaryVehicle.VehicleType, + true, + (bs) => result.BatteryData = bs, + (sc) => result.SuperCapData = sc); + + if (PrimaryVehicle.VehicleType == VectoSimulationJobType.IEPC_E) { + result.ElectricMachinesData = DataAdapterGeneric.CreateIEPCElectricMachines(PrimaryVehicle.Components.IEPC, + result.BatteryData.CalculateAverageVoltage()); + } else { + result.ElectricMachinesData = DataAdapterGeneric.CreateElectricMachines(PrimaryVehicle.Components.ElectricMachines, + PrimaryVehicle.ElectricMotorTorqueLimits, result.BatteryData.CalculateAverageVoltage(), null); + } + + result.VehicleData = DataAdapterSpecific.CreateVehicleData(PrimaryVehicle, CompletedVehicle, _segment, + mission, loading); + result.AirdragData = DataAdapterSpecific.CreateAirdragData(CompletedVehicle, mission); + if (AxleGearRequired() || PrimaryVehicle.Components.AxleGearInputData != null) { + result.AxleGearData = + DataAdapterGeneric.CreateAxleGearData(PrimaryVehicle.Components.AxleGearInputData); + } + + result.AngledriveData = + DataAdapterGeneric.CreateAngledriveData(PrimaryVehicle.Components.AngledriveInputData); + result.Aux = DataAdapterSpecific.CreateAuxiliaryData(PrimaryVehicle.Components.AuxiliaryInputData, + PrimaryVehicle.Components.BusAuxiliaries, mission.MissionType, _segment.VehicleClass, + CompletedVehicle.Length, PrimaryVehicle.Components.AxleWheels.NumSteeredAxles, + PrimaryVehicle.VehicleType); + result.Retarder = DataAdapterGeneric.CreateRetarderData(PrimaryVehicle.Components.RetarderInputData); + result.MaxChargingPower = PrimaryVehicle.MaxChargingPower; + + result.EngineData.FuelMode = 0; + result.VehicleData.VehicleClass = _segment.VehicleClass; + result.BusAuxiliaries = + DataAdapterSpecific.CreateBusAuxiliariesData(mission, PrimaryVehicle, CompletedVehicle, + result); + + CreateGearboxAndGearshiftData(result); + return result; + } + + + protected virtual bool AxleGearRequired() + { + return InputDataProvider.JobInputData.Vehicle.ArchitectureID != ArchitectureID.E4; + } + + protected override void CreateGearboxAndGearshiftData(VectoRunData runData) + { + if (PrimaryVehicle.ArchitectureID == ArchitectureID.E2) { + throw new ArgumentException(); + } + runData.GearshiftParameters = new ShiftStrategyParameters() { + StartSpeed = DeclarationData.GearboxTCU.StartSpeed, + StartAcceleration = DeclarationData.GearboxTCU.StartAcceleration + }; + } + } public class PEV_E2 : BatteryElectric { @@ -457,6 +563,21 @@ namespace TUGraz.VectoCore.InputData.Reader.Impl.DeclarationMode.CompletedBusRun InputData = DataProvider.MultistageJobInputData }; } - } + + protected override VectoRunData CreateVectoRunDataGeneric(Mission mission, KeyValuePair<LoadingType, Tuple<Kilogram, double?>> loading, Segment primarySegment, int? modeIdx) + { + throw new NotImplementedException(); + } + + protected override VectoRunData CreateVectoRunDataSpecific(Mission mission, KeyValuePair<LoadingType, Tuple<Kilogram, double?>> loading, int? modeIdx) + { + throw new NotImplementedException(); + } + + protected override void CreateGearboxAndGearshiftData(VectoRunData runData) + { + throw new NotImplementedException(); + } + } } } \ 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 4dbed2f775c4deea86d30669543e7cf14fae5eaf..2c44ac4a234eb2c08a25ab1fee8ff03d27dc533a 100644 --- a/VectoCore/VectoCore/InputData/Reader/Impl/DeclarationMode/PrimaryBusRunDataFactory/DeclarationModePrimaryBusRunDataFactory.cs +++ b/VectoCore/VectoCore/InputData/Reader/Impl/DeclarationMode/PrimaryBusRunDataFactory/DeclarationModePrimaryBusRunDataFactory.cs @@ -115,33 +115,6 @@ namespace TUGraz.VectoCore.InputData.Reader.Impl.DeclarationMode.PrimaryBusRunDa return simulationRunData; } - /// <summary> - /// Super caps are not allowed for ovc hevs or pevs - /// </summary> - protected void CheckSuperCap(IVehicleDeclarationInputData vehicle) - { - if (vehicle.VehicleType == VectoSimulationJobType.BatteryElectricVehicle || vehicle.OvcHev) { - if (vehicle.Components.ElectricStorage.ElectricStorageElements.Any(e => - e.REESSPack.StorageType == REESSType.SuperCap)) { - throw new VectoException("Super caps are not allowed for OVC-HEVs or PEVs"); - } - } - - if (vehicle.Components.ElectricStorage?.ElectricStorageElements == null) { - return; - } - - var hasSuperCap = vehicle.Components.ElectricStorage.ElectricStorageElements.Any(e => - e.REESSPack.StorageType == REESSType.SuperCap); - var hasBattery = vehicle.Components.ElectricStorage.ElectricStorageElements.Any(e => - e.REESSPack.StorageType == REESSType.Battery); - - if (hasSuperCap && hasBattery) { - //Already handled by XML Schema - throw new VectoException("Super caps AND batteries are not supported"); - } - } - protected abstract void CreateGearboxAndGearshiftData(IVehicleDeclarationInputData vehicle, VectoRunData runData); diff --git a/VectoCore/VectoCore/Mockup/Simulation/RundataFactories/CompletedBusRunDataFactory.cs b/VectoCore/VectoCore/Mockup/Simulation/RundataFactories/CompletedBusRunDataFactory.cs index 2c8e67e9bdf35bf3967352d7057b34cb0f7177a6..7da1b00ab1f02ccece9e030e8256b10df2c9a601 100644 --- a/VectoCore/VectoCore/Mockup/Simulation/RundataFactories/CompletedBusRunDataFactory.cs +++ b/VectoCore/VectoCore/Mockup/Simulation/RundataFactories/CompletedBusRunDataFactory.cs @@ -167,7 +167,12 @@ namespace TUGraz.VectoMockup.Simulation.RundataFactories //return base.CreateVectoRunDataSpecific(mission, loading, modeIdx); } - private IEnumerable<VectoRunData> CreateVectoRunDataForMissions(int modeIdx, string fuelMode) + protected override void CreateGearboxAndGearshiftData(VectoRunData runData) + { + throw new NotImplementedException(); + } + + private IEnumerable<VectoRunData> CreateVectoRunDataForMissions(int modeIdx, string fuelMode) { var InputDataProvider = DataProvider.MultistageJobInputData; foreach (var mission in _segment.Missions) { @@ -237,7 +242,7 @@ namespace TUGraz.VectoMockup.Simulation.RundataFactories GearboxData = PrimaryBusMockupRunDataFactory.CreateMockupGearboxData(PrimaryVehicle), AxleGearData = PrimaryBusMockupRunDataFactory.CreateMockupAxleGearData(PrimaryVehicle) }; - return base.CreateVectoRunDataGeneric(mission, loading, primarySegment, modeIdx); + //return base.CreateVectoRunDataGeneric(mission, loading, primarySegment, modeIdx); } //#endregion diff --git a/VectoCore/VectoCore/Models/GenericModelData/GenericBusBatteryData.cs b/VectoCore/VectoCore/Models/GenericModelData/GenericBusBatteryData.cs index 2104199e16cc1e9e0c5a81d81ac1da0c83b75778..5c8c05599e227ba1a1b13a7a767cbf5d5a4d950d 100644 --- a/VectoCore/VectoCore/Models/GenericModelData/GenericBusBatteryData.cs +++ b/VectoCore/VectoCore/Models/GenericModelData/GenericBusBatteryData.cs @@ -6,6 +6,8 @@ using TUGraz.VectoCommon.InputData; using TUGraz.VectoCommon.Resources; using TUGraz.VectoCommon.Utils; using TUGraz.VectoCore.InputData.Reader.ComponentData; +using TUGraz.VectoCore.InputData.Reader.DataObjectAdapter.SimulationComponents; +using TUGraz.VectoCore.Models.Declaration; using TUGraz.VectoCore.Models.SimulationComponent.Data.ElectricComponents.Battery; using TUGraz.VectoCore.Utils; @@ -13,7 +15,8 @@ namespace TUGraz.VectoCore.Models.GenericModelData { public class GenericBusBatteryData { - public BatterySystemData CreateBatteryData(IElectricStorageSystemDeclarationInputData batteryData, double initialSOC) + public BatterySystemData CreateBatteryData(IElectricStorageSystemDeclarationInputData batteryData, VectoSimulationJobType jobType, + bool ovc) { var currentBatteryData = batteryData.ElectricStorageElements .Where(x => x.REESSPack.StorageType == REESSType.Battery).ToList(); @@ -21,32 +24,47 @@ namespace TUGraz.VectoCore.Models.GenericModelData if (currentBatteryData.Count == 0) return null; - return new BatterySystemData - { - InitialSoC = initialSOC, - Batteries = GetBatteries(currentBatteryData) + var retVal = new BatterySystemData { + Batteries = GetBatteries(currentBatteryData, jobType, ovc) }; + var limits = retVal.GetSocLimits(); + retVal.InitialSoC = (limits.MaxSoc + limits.MinSoc) / 2; + return retVal; } - private List<Tuple<int, BatteryData>> GetBatteries(List<IElectricStorageDeclarationInputData> currentBatteries) + private List<Tuple<int, BatteryData>> GetBatteries(List<IElectricStorageDeclarationInputData> currentBatteries, VectoSimulationJobType jobType, + bool ovc) { var result = new List<Tuple<int, BatteryData>>(); foreach (var currentBattery in currentBatteries) { var entry = new Tuple<int, BatteryData>(currentBattery.StringId, - GetBatteryData(currentBattery.REESSPack as IBatteryPackDeclarationInputData)); + GetBatteryData(currentBattery.REESSPack as IBatteryPackDeclarationInputData, jobType, ovc)); result.Add(entry); } return result; } - private BatteryData GetBatteryData(IBatteryPackDeclarationInputData battery) + private BatteryData GetBatteryData(IBatteryPackDeclarationInputData battery, VectoSimulationJobType jobType, + bool ovc) { - return new BatteryData { - MinSOC = battery.MinSOC ?? double.NaN, - MaxSOC = battery.MaxSOC ?? double.NaN, - MaxCurrent = BatteryMaxCurrentReader.Create(battery.MaxCurrentMap), + var genericSOC = DeclarationData.Battery.GenericSOC.Lookup(jobType, ovc); + var minSoc = genericSOC.SOCMin; + if (battery.MinSOC != null && battery.MinSOC > minSoc) { + minSoc = battery.MinSOC.Value; + } + + var maxSoc = genericSOC.SOCMax; + if (battery.MaxSOC != null && battery.MaxSOC < maxSoc && battery.MaxSOC > battery.MinSOC) { + maxSoc = battery.MaxSOC.Value; + } + return new BatteryData { + MinSOC = maxSoc * ((1d / 2) * DeclarationData.Battery.GenericDeterioration) + + minSoc * (1 - (1d / 2) * DeclarationData.Battery.GenericDeterioration), + MaxSOC = (maxSoc * (1 - (1d / 2) * DeclarationData.Battery.GenericDeterioration) + + minSoc * ((1d / 2) * DeclarationData.Battery.GenericDeterioration)), + MaxCurrent = BatteryMaxCurrentReader.Create(battery.MaxCurrentMap), Capacity = battery.Capacity, InternalResistance = GetGenericInternalResistanceMap(battery), SOCMap = BatterySOCReader.Create(battery.VoltageCurve) diff --git a/VectoCore/VectoCore/Models/GenericModelData/GenericBusSuperCapData.cs b/VectoCore/VectoCore/Models/GenericModelData/GenericBusSuperCapData.cs index 63ad0c3aa48f4fd8b8f818cdb241b2776543fb08..22bfc0862312a32863e3111df3f93f6dbe20e40c 100644 --- a/VectoCore/VectoCore/Models/GenericModelData/GenericBusSuperCapData.cs +++ b/VectoCore/VectoCore/Models/GenericModelData/GenericBusSuperCapData.cs @@ -1,4 +1,5 @@ -using TUGraz.VectoCommon.InputData; +using System; +using TUGraz.VectoCommon.InputData; using TUGraz.VectoCommon.Utils; using TUGraz.VectoCore.Models.SimulationComponent.Data.ElectricComponents.Battery; @@ -10,20 +11,23 @@ namespace TUGraz.VectoCore.Models.GenericModelData public static Volt ReferenceMaximumVoltage = 2.7.SI<Volt>(); public static Farad CapacitanceReference = 3000.SI<Farad>(); - public SuperCapData CreateGenericSuperCapData(ISuperCapDeclarationInputData superCapData, double initialSoc) + public SuperCapData CreateGenericSuperCapData(ISuperCapDeclarationInputData superCapData) { if (superCapData == null) return null; - return new SuperCapData { + var retVal = new SuperCapData { InternalResistance = GetInternalResistance(superCapData), MaxVoltage = superCapData.MaxVoltage, MinVoltage = superCapData.MinVoltage, MaxCurrentDischarge = superCapData.MaxCurrentDischarge, MaxCurrentCharge = superCapData.MaxCurrentCharge, Capacity = superCapData.Capacity, - InitialSoC = initialSoc + //InitialSoC = initialSoc }; + retVal.InitialSoC = Math.Sqrt(Math.Pow(retVal.MaxVoltage.Value(), 2) - Math.Pow(retVal.MinVoltage.Value(), 2)) / + retVal.MaxVoltage.Value(); + return retVal; } private Ohm GetInternalResistance(ISuperCapDeclarationInputData superCapData) diff --git a/VectoCore/VectoCoreTest/Models/Declaration/TestGenericBusEMotorData.cs b/VectoCore/VectoCoreTest/Models/Declaration/TestGenericBusEMotorData.cs index a96fd3e5ed1ae0d38fd941669ebc1bed2335da84..aa0f8a89f3b41c357336f3591e402184948f062f 100644 --- a/VectoCore/VectoCoreTest/Models/Declaration/TestGenericBusEMotorData.cs +++ b/VectoCore/VectoCoreTest/Models/Declaration/TestGenericBusEMotorData.cs @@ -151,21 +151,21 @@ namespace TUGraz.VectoCore.Tests.Models.Declaration Assert.AreEqual(2, ihpcData.EfficiencyData.VoltageLevels.Count); } - [TestCase(@"TestData\XML\XMLVIFBusReport\IEPC_completedBus_2.VIF_Report_2.xml", 0.1)] + [TestCase(@"TestData\XML\XMLVIFBusReport\IEPC_completedBus_2.VIF_Report_2.xml", 0.5)] public void TestGenericBatteryData(string vifFilePath, double initialSoC) { var multistepBusInputData = xmlInputReader.Create(vifFilePath) as IMultistepBusInputDataProvider; var electricStorage = multistepBusInputData.JobInputData.PrimaryVehicle.Vehicle.Components.ElectricStorage; var genericBusBatteryData = new GenericBusBatteryData(); - var batterySystemData = genericBusBatteryData.CreateBatteryData(electricStorage, initialSoC); + var batterySystemData = genericBusBatteryData.CreateBatteryData(electricStorage, VectoSimulationJobType.BatteryElectricVehicle, true); Assert.AreEqual(initialSoC, batterySystemData.InitialSoC); Assert.AreEqual(2, batterySystemData.Batteries.Count); var battery0 = batterySystemData.Batteries[0]; - Assert.AreEqual(0.80, battery0.Item2.MaxSOC, 1e-6); - Assert.AreEqual(0.20, battery0.Item2.MinSOC, 1e-6); + Assert.AreEqual(0.9275, battery0.Item2.MaxSOC, 1e-6); + Assert.AreEqual(0.0725, battery0.Item2.MinSOC, 1e-6); Assert.AreEqual(72, battery0.Item2.Capacity.AsAmpHour); Assert.AreEqual(2, battery0.Item2.InternalResistance.Entries.Length); @@ -183,8 +183,8 @@ namespace TUGraz.VectoCore.Tests.Models.Declaration Assert.AreEqual(resistance, battery0.Item2.InternalResistance.Entries[1].Resistance[2].Item2.Value()); var battery1 = batterySystemData.Batteries[1]; - Assert.AreEqual(0.80, battery1.Item2.MaxSOC, 1e-6); - Assert.AreEqual(0.20, battery1.Item2.MinSOC, 1e-6); + Assert.AreEqual(0.9275, battery1.Item2.MaxSOC, 1e-6); + Assert.AreEqual(0.0725, battery1.Item2.MinSOC, 1e-6); Assert.AreEqual(72, battery1.Item2.Capacity.AsAmpHour); Assert.AreEqual(2, battery1.Item2.InternalResistance.Entries.Length); @@ -203,12 +203,12 @@ namespace TUGraz.VectoCore.Tests.Models.Declaration } - [TestCase(@"TestData\Hybrids\Hyb_P2_Group2SuperCapOvl\SuperCap.vreess", 0.1)] + [TestCase(@"TestData\Hybrids\Hyb_P2_Group2SuperCapOvl\SuperCap.vreess", 1)] public void TestGenericSuperCapData(string superCapFilePath, double initialSoC) { var superCap = JSONInputDataFactory.ReadREESSData(superCapFilePath, false) as ISuperCapDeclarationInputData; var genericBusSuperCapData = new GenericBusSuperCapData(); - var superCapData = genericBusSuperCapData.CreateGenericSuperCapData(superCap, initialSoC); + var superCapData = genericBusSuperCapData.CreateGenericSuperCapData(superCap); Assert.AreEqual(37.0, superCapData.Capacity.Value()); Assert.AreEqual(0, superCapData.MinVoltage.Value());