diff --git a/VectoCommon/VectoCommon/InputData/DeclarationInputData.cs b/VectoCommon/VectoCommon/InputData/DeclarationInputData.cs index 0616a430fb7b31fdf8a272f0fb873503affbb172..556164df237d25e206c5992a102e2f5b8d0c3b2e 100644 --- a/VectoCommon/VectoCommon/InputData/DeclarationInputData.cs +++ b/VectoCommon/VectoCommon/InputData/DeclarationInputData.cs @@ -1236,6 +1236,7 @@ namespace TUGraz.VectoCommon.InputData P2_5, P3, P4, + P_IHPC, S2, S3, S4, diff --git a/VectoCore/VectoCore/Configuration/Constants.cs b/VectoCore/VectoCore/Configuration/Constants.cs index 726dd7ae3cf493ae82aeeb98c52c6ac62d050387..5895f7c3c45d08d3e9306af1c071ae3479c96c9a 100644 --- a/VectoCore/VectoCore/Configuration/Constants.cs +++ b/VectoCore/VectoCore/Configuration/Constants.cs @@ -334,8 +334,10 @@ namespace TUGraz.VectoCore.Configuration public static readonly Meter GearboxLookaheadForAccelerationEstimation = 100.SI<Meter>(); public static readonly Kilogram MaximumGrossVehicleMass = 40000.SI<Kilogram>(); + public static readonly Kilogram MaximumGrossVehicleMassOVCHev_NaturalGas = 41000.SI<Kilogram>(); public static readonly Kilogram MaximumGrossVehicleMassPEV = 42000.SI<Kilogram>(); public static readonly Kilogram MaximumGrossVehicleMassEMS = 60000.SI<Kilogram>(); + public static readonly Kilogram MaximumGrossVehicleMassEMS_OVCHev_NaturalGas = 61000.SI<Kilogram>(); public static readonly Kilogram MaximumGrossVehicleMassEMS_PEV = 62000.SI<Kilogram>(); public static readonly MeterPerSecond HighwaySpeedThreshold = 70.KMPHtoMeterPerSecond(); diff --git a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/DeclarationDataAdapterNinjectModule.cs b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/DeclarationDataAdapterNinjectModule.cs index 1e629a88f58e50529e726191bfa5cac4bc6c0d37..0c8349f9ec449342000a84445c6c18ed12da0d7e 100644 --- a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/DeclarationDataAdapterNinjectModule.cs +++ b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/DeclarationDataAdapterNinjectModule.cs @@ -53,6 +53,9 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter Bind<ILorryDeclarationDataAdapter>().To<DeclarationDataAdapterHeavyLorry.HEV_P4>() .WhenInjectedExactlyInto<DeclarationModeHeavyLorryRunDataFactory.HEV_P4>(); + Bind<ILorryDeclarationDataAdapter>().To<DeclarationDataAdapterHeavyLorry.HEV_P2>() + .WhenInjectedExactlyInto<DeclarationModeHeavyLorryRunDataFactory.HEV_P_IHPC>(); + Bind<ILorryDeclarationDataAdapter>().To<DeclarationDataAdapterHeavyLorry.PEV_E2>() .WhenInjectedExactlyInto<DeclarationModeHeavyLorryRunDataFactory.PEV_E2>(); diff --git a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/SimulationComponents/ElectricMachinesDataAdapter.cs b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/SimulationComponents/ElectricMachinesDataAdapter.cs index 8c8951f18c337c8e869d5999a13be5b83c000978..d02868a0c7a52f00bbaed4d3847435a54b8c20ee 100644 --- a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/SimulationComponents/ElectricMachinesDataAdapter.cs +++ b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/SimulationComponents/ElectricMachinesDataAdapter.cs @@ -3,16 +3,208 @@ using System.Collections.Generic; using System.Linq; using TUGraz.VectoCommon.Exceptions; using TUGraz.VectoCommon.InputData; +using TUGraz.VectoCommon.Models; using TUGraz.VectoCommon.Utils; +using TUGraz.VectoCore.InputData.FileIO.XML.Declaration.DataProvider; 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; +using TUGraz.VectoCore.Utils.Ninject; namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter.SimulationComponents { + internal abstract class StandardValuesInputData + { + /// <summary> + /// Wraps the standard value input data and overrides the voltage level + /// </summary> + internal class StandardValueVoltageLevelInputData : IElectricMotorVoltageLevel + { + + public StandardValueVoltageLevelInputData(IElectricMotorVoltageLevel inputData, Volt voltageLevel) + { + _electricMotorVoltageLevelImplementation = inputData; + _voltageLevel = voltageLevel; + } + private IElectricMotorVoltageLevel _electricMotorVoltageLevelImplementation; + private Volt _voltageLevel; + + public Volt VoltageLevel => _voltageLevel; + + + #region Implementation of IElectricMotorVoltageLevel + + + + public NewtonMeter ContinuousTorque => _electricMotorVoltageLevelImplementation.ContinuousTorque; + + public PerSecond ContinuousTorqueSpeed => _electricMotorVoltageLevelImplementation.ContinuousTorqueSpeed; + + public NewtonMeter OverloadTorque => _electricMotorVoltageLevelImplementation.OverloadTorque; + + public PerSecond OverloadTestSpeed => _electricMotorVoltageLevelImplementation.OverloadTestSpeed; + + public Second OverloadTime => _electricMotorVoltageLevelImplementation.OverloadTime; + + public TableData FullLoadCurve => _electricMotorVoltageLevelImplementation.FullLoadCurve; + + public IList<IElectricMotorPowerMap> PowerMap => _electricMotorVoltageLevelImplementation.PowerMap; + + #endregion + } + + internal class StandardValueIEPCInputData : IIEPCDeclarationInputData + { + private IIEPCDeclarationInputData _iiepcDeclarationInputDataImplementation; + private IList<IElectricMotorVoltageLevel> _voltageLevels = new List<IElectricMotorVoltageLevel>(); + + /// <summary> + /// Wraps the inputData and creates new voltage levels based on the voltage level provided in the input data + /// </summary> + /// <param name="inputData"></param> + /// <param name="voltageLevels"></param> + /// <exception cref="ArgumentException"></exception> + public StandardValueIEPCInputData(IIEPCDeclarationInputData inputData, params Volt[] voltageLevels) + { + _iiepcDeclarationInputDataImplementation = inputData; + if (inputData.CertificationMethod != CertificationMethod.StandardValues) { + throw new ArgumentException("Only for standard value certification"); + } + + foreach (var voltageLevel in voltageLevels) { + _voltageLevels.Add(new StandardValueVoltageLevelInputData(inputData.VoltageLevels.First(), voltageLevel)); + } + + } + + public IList<IElectricMotorVoltageLevel> VoltageLevels => _voltageLevels; + + #region Implementation of IComponentInputData + + public DataSource DataSource => _iiepcDeclarationInputDataImplementation.DataSource; + + public bool SavedInDeclarationMode => _iiepcDeclarationInputDataImplementation.SavedInDeclarationMode; + + public string Manufacturer => _iiepcDeclarationInputDataImplementation.Manufacturer; + + public string Model => _iiepcDeclarationInputDataImplementation.Model; + + public DateTime Date => _iiepcDeclarationInputDataImplementation.Date; + + public string AppVersion => _iiepcDeclarationInputDataImplementation.AppVersion; + + public CertificationMethod CertificationMethod => _iiepcDeclarationInputDataImplementation.CertificationMethod; + + public string CertificationNumber => _iiepcDeclarationInputDataImplementation.CertificationNumber; + + public DigestData DigestValue => _iiepcDeclarationInputDataImplementation.DigestValue; + + #endregion + + #region Implementation of IIEPCDeclarationInputData + + public ElectricMachineType ElectricMachineType => _iiepcDeclarationInputDataImplementation.ElectricMachineType; + + public Watt R85RatedPower => _iiepcDeclarationInputDataImplementation.R85RatedPower; + + public KilogramSquareMeter Inertia => _iiepcDeclarationInputDataImplementation.Inertia; + + public bool DifferentialIncluded => _iiepcDeclarationInputDataImplementation.DifferentialIncluded; + + public bool DesignTypeWheelMotor => _iiepcDeclarationInputDataImplementation.DesignTypeWheelMotor; + + public int? NrOfDesignTypeWheelMotorMeasured => _iiepcDeclarationInputDataImplementation.NrOfDesignTypeWheelMotorMeasured; + + public IList<IGearEntry> Gears => _iiepcDeclarationInputDataImplementation.Gears; + + + + public IList<IDragCurve> DragCurves => _iiepcDeclarationInputDataImplementation.DragCurves; + + public TableData Conditioning => _iiepcDeclarationInputDataImplementation.Conditioning; + + #endregion + } + + internal class StandardValuesEmInputData : IElectricMotorDeclarationInputData + { + private IElectricMotorDeclarationInputData _electricMotorDeclarationInputDataImplementation; + + private IList<IElectricMotorVoltageLevel> _voltageLevels = new List<IElectricMotorVoltageLevel>(); + + /// <summary> + /// Wraps the inputData and creates new voltage levels based on the voltage level provided in the input data + /// </summary> + /// <param name="inputData"></param> + /// <param name="voltageLevels"></param> + /// <exception cref="ArgumentException"></exception> + public StandardValuesEmInputData(IElectricMotorDeclarationInputData inputData, params Volt[] voltageLevels) + { + _electricMotorDeclarationInputDataImplementation = inputData; + if (inputData.CertificationMethod != CertificationMethod.StandardValues) + { + throw new ArgumentException("Only for standard value certification"); + } + + foreach (var voltageLevel in voltageLevels) + { + _voltageLevels.Add(new StandardValueVoltageLevelInputData(inputData.VoltageLevels.First(), voltageLevel)); + } + + } + + + #region Implementation of IComponentInputData + + public DataSource DataSource => _electricMotorDeclarationInputDataImplementation.DataSource; + + public bool SavedInDeclarationMode => _electricMotorDeclarationInputDataImplementation.SavedInDeclarationMode; + + public string Manufacturer => _electricMotorDeclarationInputDataImplementation.Manufacturer; + + public string Model => _electricMotorDeclarationInputDataImplementation.Model; + + public DateTime Date => _electricMotorDeclarationInputDataImplementation.Date; + + public string AppVersion => _electricMotorDeclarationInputDataImplementation.AppVersion; + + public CertificationMethod CertificationMethod => _electricMotorDeclarationInputDataImplementation.CertificationMethod; + + public string CertificationNumber => _electricMotorDeclarationInputDataImplementation.CertificationNumber; + + public DigestData DigestValue => _electricMotorDeclarationInputDataImplementation.DigestValue; + + #endregion + + #region Implementation of IElectricMotorDeclarationInputData + + public ElectricMachineType ElectricMachineType => _electricMotorDeclarationInputDataImplementation.ElectricMachineType; + + public Watt R85RatedPower => _electricMotorDeclarationInputDataImplementation.R85RatedPower; + + public KilogramSquareMeter Inertia => _electricMotorDeclarationInputDataImplementation.Inertia; + + public bool DcDcConverterIncluded => _electricMotorDeclarationInputDataImplementation.DcDcConverterIncluded; + + public string IHPCType => _electricMotorDeclarationInputDataImplementation.IHPCType; + + public IList<IElectricMotorVoltageLevel> VoltageLevels => _electricMotorDeclarationInputDataImplementation.VoltageLevels; + + public TableData DragCurve => _electricMotorDeclarationInputDataImplementation.DragCurve; + + public TableData Conditioning => _electricMotorDeclarationInputDataImplementation.Conditioning; + + #endregion + } + } + + + + + public class ElectricMachinesDataAdapter { public IList<Tuple<PowertrainPosition, ElectricMotorData>> CreateElectricMachines( @@ -66,7 +258,10 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter.SimulationComponen Volt averageVoltage, GearList gearList) { - + if (motorData.CertificationMethod == CertificationMethod.StandardValues) { + //Fake one very low voltage level and one very high for standard values + motorData = new StandardValuesInputData.StandardValuesEmInputData(motorData, 1.SI<Volt>(), 10E9.SI<Volt>()); + } var voltageLevels = new List<ElectricMotorVoltageLevelData>(); foreach (var entry in motorData.VoltageLevels.OrderBy(x => x.VoltageLevel)) @@ -260,12 +455,21 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter.SimulationComponen } } + public List<Tuple<PowertrainPosition, ElectricMotorData>> CreateIEPCElectricMachines(IIEPCDeclarationInputData iepc, Volt averageVoltage) { if (iepc == null) { return null; } + if (iepc.CertificationMethod == CertificationMethod.StandardValues) + { + //Fake one very low voltage level and one very high for standard values + iepc = new StandardValuesInputData.StandardValueIEPCInputData(iepc, 1.SI<Volt>(), 10E9.SI<Volt>()); + } + + + var pos = PowertrainPosition.IEPC; var count = iepc.DesignTypeWheelMotor && iepc.NrOfDesignTypeWheelMotorMeasured == 1 ? 2 : 1; @@ -278,7 +482,13 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter.SimulationComponen var voltageLevels = new List<ElectricMotorVoltageLevelData>(); - foreach (var entry in iepc.VoltageLevels.OrderBy(x => x.VoltageLevel)) + var inputDataVoltageLevels = iepc.CertificationMethod != CertificationMethod.StandardValues + ? iepc.VoltageLevels.OrderBy(x => x.VoltageLevel).AsEnumerable() + : new List<IElectricMotorVoltageLevel>() { + iepc.VoltageLevels.First(), iepc.VoltageLevels.First() + }; + + foreach (var entry in inputDataVoltageLevels) { var effMap = new Dictionary<uint, EfficiencyMap>(); var fldCurve = @@ -291,12 +501,17 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter.SimulationComponen } voltageLevels.Add(new IEPCVoltageLevelData() { - Voltage = entry.VoltageLevel, + + Voltage = iepc.CertificationMethod != CertificationMethod.StandardValues ? entry.VoltageLevel : null, //No voltagelevel is provided for standard values FullLoadCurve = fldCurve, EfficiencyMaps = effMap, }); } + voltageLevels.First().Voltage = 1.SI<Volt>(); + voltageLevels.Last().Voltage = 10E9.SI<Volt>(); + + var dragCurves = new Dictionary<uint, DragCurve>(); if (iepc.DragCurves.Count > 1) { @@ -334,21 +549,22 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter.SimulationComponen } private OverloadData CalculateOverloadData(IIEPCDeclarationInputData iepc, int count, - VoltageLevelData voltageLevels, Volt averageVoltage, Tuple<uint, double> gearRatioUsedForMeasurement) + VoltageLevelData voltageLevel, Volt averageVoltage, Tuple<uint, double> gearRatioUsedForMeasurement) { + // 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 < iepc.VoltageLevels.Min(x => x.VoltageLevel)) { - return CalculateOverloadBuffer(iepc.VoltageLevels.First(), count, voltageLevels, gearRatioUsedForMeasurement); + return CalculateOverloadBuffer(iepc.VoltageLevels.First(), count, voltageLevel, gearRatioUsedForMeasurement); } if (averageVoltage > iepc.VoltageLevels.Max(x => x.VoltageLevel)) { - return CalculateOverloadBuffer(iepc.VoltageLevels.Last(), count, voltageLevels, gearRatioUsedForMeasurement); + return CalculateOverloadBuffer(iepc.VoltageLevels.Last(), count, voltageLevel, gearRatioUsedForMeasurement); } var (vLow, vHigh) = iepc.VoltageLevels.OrderBy(x => x.VoltageLevel).GetSection(x => x.VoltageLevel < averageVoltage); - var ovlLo = CalculateOverloadBuffer(vLow, count, voltageLevels, gearRatioUsedForMeasurement); - var ovlHi = CalculateOverloadBuffer(vHigh, count, voltageLevels, gearRatioUsedForMeasurement); + var ovlLo = CalculateOverloadBuffer(vLow, count, voltageLevel, gearRatioUsedForMeasurement); + var ovlHi = CalculateOverloadBuffer(vHigh, count, voltageLevel, gearRatioUsedForMeasurement); var retVal = new OverloadData() { @@ -360,22 +576,22 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter.SimulationComponen } - private OverloadData CalculateOverloadData(IElectricMotorDeclarationInputData motorData, int count, VoltageLevelData voltageLevels, Volt averageVoltage) + private OverloadData CalculateOverloadData(IElectricMotorDeclarationInputData motorData, int count, VoltageLevelData voltageLevel, 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); + return CalculateOverloadBuffer(motorData.VoltageLevels.First(), count, voltageLevel); } if (averageVoltage > motorData.VoltageLevels.Max(x => x.VoltageLevel)) { - return CalculateOverloadBuffer(motorData.VoltageLevels.Last(), count, voltageLevels); + return CalculateOverloadBuffer(motorData.VoltageLevels.Last(), count, voltageLevel); } 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 ovlLo = CalculateOverloadBuffer(vLow, count, voltageLevel); + var ovlHi = CalculateOverloadBuffer(vHigh, count, voltageLevel); var retVal = new OverloadData() { @@ -387,7 +603,7 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter.SimulationComponen } private OverloadData CalculateOverloadBuffer(IElectricMotorVoltageLevel voltageEntry, - int count, VoltageLevelData voltageLevels, Tuple<uint, double> gearUsedForMeasurement = null) + int count, VoltageLevelData voltageLevel, Tuple<uint, double> gearUsedForMeasurement = null) { var gearRatioUsedForMeasurement = gearUsedForMeasurement?.Item2 ?? 1.0; var gear = new GearshiftPosition(gearUsedForMeasurement?.Item1 ?? 1); @@ -397,7 +613,7 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter.SimulationComponen var overloadTestSpeed = (voltageEntry.OverloadTestSpeed ?? 0.RPMtoRad()) * gearRatioUsedForMeasurement; - var peakElPwr = voltageLevels.LookupElectricPower(voltageEntry.VoltageLevel, + var peakElPwr = voltageLevel.LookupElectricPower(voltageEntry.VoltageLevel, overloadTestSpeed, -overloadTorque, gear, @@ -405,10 +621,10 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter.SimulationComponen .ElectricalPower; var peakPwrLoss = -peakElPwr - overloadTorque * overloadTestSpeed; // losses need to be positive - var contElPwr = voltageLevels.LookupElectricPower(voltageEntry.VoltageLevel, continuousTorqueSpeed, + var contElPwr = voltageLevel.LookupElectricPower(voltageEntry.VoltageLevel, continuousTorqueSpeed, -continuousTorque, gear).ElectricalPower ?? - voltageLevels.LookupElectricPower(voltageEntry.VoltageLevel, continuousTorqueSpeed, - voltageLevels.FullLoadDriveTorque(voltageEntry.VoltageLevel, continuousTorqueSpeed), + voltageLevel.LookupElectricPower(voltageEntry.VoltageLevel, continuousTorqueSpeed, + voltageLevel.FullLoadDriveTorque(voltageEntry.VoltageLevel, continuousTorqueSpeed), gear, true).ElectricalPower; var continuousPowerLoss = -contElPwr - continuousTorque * continuousTorqueSpeed; // loss needs to be positive var overloadBuffer = (peakPwrLoss - continuousPowerLoss) * voltageEntry.OverloadTime; diff --git a/VectoCore/VectoCore/InputData/Reader/Impl/DeclarationMode/HeavyLorryRunDataFactory/DeclarationModeHeavyLorryRunDataFactory.cs b/VectoCore/VectoCore/InputData/Reader/Impl/DeclarationMode/HeavyLorryRunDataFactory/DeclarationModeHeavyLorryRunDataFactory.cs index 1879cfcac1e019974882c95cfbf21f7a603b4e56..7975950d17d6c832f5ab8f1a6a274d81aecd50bf 100644 --- a/VectoCore/VectoCore/InputData/Reader/Impl/DeclarationMode/HeavyLorryRunDataFactory/DeclarationModeHeavyLorryRunDataFactory.cs +++ b/VectoCore/VectoCore/InputData/Reader/Impl/DeclarationMode/HeavyLorryRunDataFactory/DeclarationModeHeavyLorryRunDataFactory.cs @@ -163,13 +163,16 @@ namespace TUGraz.VectoCore.InputData.Reader.Impl.DeclarationMode.HeavyLorryRunDa protected Segment GetSegment(IVehicleDeclarationInputData vehicle, bool batteryElectric = false) { _allowVocational = true; + var ng = vehicle.Components.EngineInputData?.EngineModes.Any(e => + e.Fuels.Any(f => f.FuelType.IsOneOf(FuelType.LPGPI, FuelType.NGCI, FuelType.NGPI))) ?? false; + var ovcHev = vehicle.OvcHev; Segment segment; try { segment = DeclarationData.TruckSegments.Lookup( vehicle.VehicleCategory, batteryElectric, vehicle.AxleConfiguration, vehicle.GrossVehicleMassRating, vehicle.CurbMassChassis, - vehicle.VocationalVehicle); + vehicle.VocationalVehicle, ng, ovcHev); } catch (VectoException) { @@ -177,7 +180,7 @@ namespace TUGraz.VectoCore.InputData.Reader.Impl.DeclarationMode.HeavyLorryRunDa segment = DeclarationData.TruckSegments.Lookup( vehicle.VehicleCategory, batteryElectric, vehicle.AxleConfiguration, vehicle.GrossVehicleMassRating, vehicle.CurbMassChassis, - false); + false, ng, ovcHev); } if (!segment.Found) diff --git a/VectoCore/VectoCore/InputData/Reader/Impl/DeclarationMode/HeavyLorryRunDataFactory/DeclarationModeHeavyLorryRunDataFactory_Hybrid.cs b/VectoCore/VectoCore/InputData/Reader/Impl/DeclarationMode/HeavyLorryRunDataFactory/DeclarationModeHeavyLorryRunDataFactory_Hybrid.cs index 3b94ea8957d0ee77e3e59946a02b1def7484549e..bda414eb6074fdcd06dc2ea3126eccb8e80eb487 100644 --- a/VectoCore/VectoCore/InputData/Reader/Impl/DeclarationMode/HeavyLorryRunDataFactory/DeclarationModeHeavyLorryRunDataFactory_Hybrid.cs +++ b/VectoCore/VectoCore/InputData/Reader/Impl/DeclarationMode/HeavyLorryRunDataFactory/DeclarationModeHeavyLorryRunDataFactory_Hybrid.cs @@ -457,5 +457,16 @@ namespace TUGraz.VectoCore.InputData.Reader.Impl.DeclarationMode.HeavyLorryRunDa public HEV_P4(IDeclarationInputDataProvider dataProvider, IDeclarationReport report, ILorryDeclarationDataAdapter declarationDataAdapter) : base(dataProvider, report, declarationDataAdapter) { } } + + public class HEV_P_IHPC : HEV_P2 + { + + public HEV_P_IHPC(IDeclarationInputDataProvider dataProvider, IDeclarationReport report, + ILorryDeclarationDataAdapter declarationDataAdapter) : base(dataProvider, report, + declarationDataAdapter) + { + + } + } } } \ No newline at end of file diff --git a/VectoCore/VectoCore/InputData/Reader/VectoRunDataFactoryNinjectModule.cs b/VectoCore/VectoCore/InputData/Reader/VectoRunDataFactoryNinjectModule.cs index 17f13e5b5ca41d8175341a465b7431217e0ac9f8..d70f70dd1867932da4286d9ff11498d9a4adb19b 100644 --- a/VectoCore/VectoCore/InputData/Reader/VectoRunDataFactoryNinjectModule.cs +++ b/VectoCore/VectoCore/InputData/Reader/VectoRunDataFactoryNinjectModule.cs @@ -54,6 +54,7 @@ namespace TUGraz.VectoCore.InputData.Reader #region Lorries + Bind<IVectoRunDataFactory>().To<DeclarationModeHeavyLorryRunDataFactory.Conventional>().Named( _vehicleStringHelper.GetName(VehicleCategoryHelper.Lorry, VectoSimulationJobType.ConventionalVehicle)); @@ -94,6 +95,10 @@ namespace TUGraz.VectoCore.InputData.Reader _vehicleStringHelper.GetName(VehicleCategoryHelper.Lorry, VectoSimulationJobType.ParallelHybridVehicle, ArchitectureID.P4)); + Bind<IVectoRunDataFactory>().To<DeclarationModeHeavyLorryRunDataFactory.HEV_P_IHPC>().Named( + _vehicleStringHelper.GetName(VehicleCategoryHelper.Lorry, VectoSimulationJobType.IHPC, + ArchitectureID.P_IHPC)); + Bind<IVectoRunDataFactory>().To<DeclarationModeHeavyLorryRunDataFactory.PEV_E2>().Named( _vehicleStringHelper.GetName(VehicleCategoryHelper.Lorry, VectoSimulationJobType.BatteryElectricVehicle, ArchitectureID.E2)); diff --git a/VectoCore/VectoCore/Models/Declaration/TruckSegments.cs b/VectoCore/VectoCore/Models/Declaration/TruckSegments.cs index a69fc0621e753c99e8d55e9bbf1555cf3ae3bccd..d9abe40dfdcc17d6d89f63cd3be2a190879c5add 100644 --- a/VectoCore/VectoCore/Models/Declaration/TruckSegments.cs +++ b/VectoCore/VectoCore/Models/Declaration/TruckSegments.cs @@ -61,7 +61,7 @@ namespace TUGraz.VectoCore.Models.Declaration Kilogram grossVehicleMassRating, Kilogram curbWeight, bool vocational) { - return Lookup(vehicleCategory, axleConfiguration, grossVehicleMassRating, curbWeight, vocational, false, false); + return Lookup(vehicleCategory, axleConfiguration, grossVehicleMassRating, curbWeight, vocational, false, false, false, false); } public VehicleCategory[] GetVehicleCategories(bool declarationOnly = true) @@ -82,16 +82,16 @@ namespace TUGraz.VectoCore.Models.Declaration .Select(row => AxleConfigurationHelper.Parse(row.Field<string>("axleconf."))).Distinct(); } - public Segment Lookup( - VehicleCategory vehicleCategory, bool isBatteryElectric, AxleConfiguration axleConfiguration, - Kilogram grossVehicleMassRating, Kilogram curbWeight, bool vocational) + public Segment Lookup(VehicleCategory vehicleCategory, bool isBatteryElectric, + AxleConfiguration axleConfiguration, + Kilogram grossVehicleMassRating, Kilogram curbWeight, bool vocational, bool hasNgFuel, bool isOvcHev) { - return Lookup(vehicleCategory, axleConfiguration, grossVehicleMassRating, curbWeight, vocational,false, isBatteryElectric); + return Lookup(vehicleCategory, axleConfiguration, grossVehicleMassRating, curbWeight, vocational,false, isBatteryElectric, hasNgFuel, isOvcHev); } - public Segment Lookup( - VehicleCategory vehicleCategory, AxleConfiguration axleConfiguration, - Kilogram grossVehicleMassRating, Kilogram curbWeight, bool vocational, bool considerInvalid, bool isBatteryElectric) + public Segment Lookup(VehicleCategory vehicleCategory, AxleConfiguration axleConfiguration, + Kilogram grossVehicleMassRating, Kilogram curbWeight, bool vocational, bool considerInvalid, + bool isBatteryElectric, bool hasNgFuel, bool isOvcHev) { var row = GetSegmentDataRow(vehicleCategory, axleConfiguration, grossVehicleMassRating, vocational, considerInvalid); if (row == null) { @@ -110,7 +110,7 @@ namespace TUGraz.VectoCore.Models.Declaration RessourceHelper.ReadStream( DeclarationData.DeclarationDataResourcePrefix + ".VACC." + row.Field<string>(".vaccfile")), - Missions = CreateMissions(grossVehicleMassRating, curbWeight, row, vehicleHeight, isBatteryElectric), + Missions = CreateMissions(grossVehicleMassRating, curbWeight, row, vehicleHeight, isBatteryElectric, hasNgFuel:hasNgFuel, isOvcHev), DesignSpeed = row.ParseDouble("designspeed").KMPHtoMeterPerSecond(), //GrossVehicleMassRating = grossVehicleMassRating, @@ -188,7 +188,7 @@ namespace TUGraz.VectoCore.Models.Declaration } private static Mission[] CreateMissions(Kilogram grossVehicleWeight, Kilogram curbWeight, DataRow row, - Meter vehicleHeight, bool isBatteryElectric) + Meter vehicleHeight, bool isBatteryElectric, bool hasNgFuel, bool isOvcHev) { var missionTypes = Enum.GetValues(typeof(MissionType)).Cast<MissionType>(); var missions = new List<Mission>(); @@ -198,14 +198,29 @@ namespace TUGraz.VectoCore.Models.Declaration var trailers = GetTrailers(row, missionType); Kilogram maxGVW; + + if (missionType.IsEMS()) { - maxGVW = isBatteryElectric - ? Constants.SimulationSettings.MaximumGrossVehicleMassEMS_PEV - : Constants.SimulationSettings.MaximumGrossVehicleMassEMS; + if (isBatteryElectric) { + maxGVW = Constants.SimulationSettings.MaximumGrossVehicleMassEMS_PEV; + } else if(hasNgFuel || isOvcHev) { + maxGVW = Constants.SimulationSettings.MaximumGrossVehicleMassEMS_OVCHev_NaturalGas; + } else { + maxGVW = Constants.SimulationSettings.MaximumGrossVehicleMassEMS; + } } else { - maxGVW = isBatteryElectric - ? Constants.SimulationSettings.MaximumGrossVehicleMassPEV - : Constants.SimulationSettings.MaximumGrossVehicleMass; + if (isBatteryElectric) + { + maxGVW = Constants.SimulationSettings.MaximumGrossVehicleMassPEV; + } + else if (hasNgFuel || isOvcHev) + { + maxGVW = Constants.SimulationSettings.MaximumGrossVehicleMassOVCHev_NaturalGas; + } + else + { + maxGVW = Constants.SimulationSettings.MaximumGrossVehicleMass; + } } diff --git a/VectoCore/VectoCoreTest/InputData/RunDataFactory/RunDataFactoryFactoryTest.cs b/VectoCore/VectoCoreTest/InputData/RunDataFactory/RunDataFactoryFactoryTest.cs index ecfcb9212b048682746e04eedd2100e993fa54fe..6d7e561d754a65643ea3f5ddee50ca3ab8065fb8 100644 --- a/VectoCore/VectoCoreTest/InputData/RunDataFactory/RunDataFactoryFactoryTest.cs +++ b/VectoCore/VectoCoreTest/InputData/RunDataFactory/RunDataFactoryFactoryTest.cs @@ -183,6 +183,19 @@ namespace TUGraz.VectoCore.Tests.InputData.RunDataFactory CreateRunDataFactory(input, typeof(DeclarationModeHeavyLorryRunDataFactory.HEV_P4), expectedDataAdapter); } + [TestCase()] + //[TestCase(typeof(DeclarationDataAdapterHeavyLorry.HEV_))] + public void HEV_P_IHPC_HeavyLorryTest(Type expectedDataAdapter = null) + { + var input = new Mock<IDeclarationInputDataProvider>() + .HEV(ArchitectureID.P_IHPC) + .Lorry(); + CreateRunDataFactory(input, typeof(DeclarationModeHeavyLorryRunDataFactory.HEV_P_IHPC), expectedDataAdapter); + } + + + + [TestCase()] [TestCase(typeof(DeclarationDataAdapterHeavyLorry.PEV_E2))] @@ -634,11 +647,8 @@ namespace TUGraz.VectoCore.Tests.InputData.RunDataFactory internal static Mock<IDeclarationInputDataProvider> HEV(this Mock<IDeclarationInputDataProvider> mock, ArchitectureID arch) { - var type = arch.ToString().StartsWith("P") - ? VectoSimulationJobType.ParallelHybridVehicle - : VectoSimulationJobType.SerialHybridVehicle; - + VectoSimulationJobType type; switch (arch) { case ArchitectureID.P1: case ArchitectureID.P2: @@ -647,6 +657,9 @@ namespace TUGraz.VectoCore.Tests.InputData.RunDataFactory case ArchitectureID.P4: type = VectoSimulationJobType.ParallelHybridVehicle; break; + case ArchitectureID.P_IHPC: + type = VectoSimulationJobType.IHPC; + break; case ArchitectureID.S2: case ArchitectureID.S3: case ArchitectureID.S4: diff --git a/VectoCore/VectoCoreTest/Integration/Declaration/HeavyLorry/HeavyLorrySimulation.cs b/VectoCore/VectoCoreTest/Integration/Declaration/HeavyLorry/HeavyLorrySimulation.cs index a6dfba3cb8029f18243fadb2abd579182f7ba770..f8ea61004dbde16fdef881ea365ea168cdaf2e9e 100644 --- a/VectoCore/VectoCoreTest/Integration/Declaration/HeavyLorry/HeavyLorrySimulation.cs +++ b/VectoCore/VectoCoreTest/Integration/Declaration/HeavyLorry/HeavyLorrySimulation.cs @@ -275,7 +275,7 @@ public class HeavyLorrySimulation [TestCase(Group5_HEV_P3_OVC, 20)] [TestCase(Group5_HEV_P4_OVC, 20)] [TestCase(Group5_HEV_P2_5_OVC, 20)] - [TestCase(@"E:\MARTINI\source\hm_vecto-dev\VectoCore\VectoCoreTest\TestData\Integration\DeclarationMode\V24_DeclarationMode\HeavyLorry\P-HEV\Group5_HEV_IHPC.xml", 20)] + [TestCase(@"HeavyLorry\P-HEV\Group5_HEV_IHPC.xml", 20)] public void PHEV_ChargeDepleting(string jobFile, int nrRuns) { diff --git a/VectoCore/VectoCoreTest/TestData/Integration/DeclarationMode/V24_DeclarationMode/HeavyLorry/P-HEV/Group5_HEV_P2_5_ovc.xml b/VectoCore/VectoCoreTest/TestData/Integration/DeclarationMode/V24_DeclarationMode/HeavyLorry/P-HEV/Group5_HEV_P2_5_ovc.xml index ba7a850eb6d2b30865ada9b86b5d32f990f74674..bee701752a8467db014814ce12706a9282909743 100644 --- a/VectoCore/VectoCoreTest/TestData/Integration/DeclarationMode/V24_DeclarationMode/HeavyLorry/P-HEV/Group5_HEV_P2_5_ovc.xml +++ b/VectoCore/VectoCoreTest/TestData/Integration/DeclarationMode/V24_DeclarationMode/HeavyLorry/P-HEV/Group5_HEV_P2_5_ovc.xml @@ -2188,35 +2188,20 @@ </di:Reference> </v2.3:Signature> </ElectricMachineSystem> - <ADC> - <v2.3:Data xsi:type="v2.3:ADCDataDeclarationType" id="ADC34533"> - <v2.3:Manufacturer>ADC Manufacturer</v2.3:Manufacturer> - <v2.3:Model>Some ADC Model</v2.3:Model> - <v2.3:CertificationNumber>CertNmbr23451</v2.3:CertificationNumber> - <v2.3:Date>2022-01-01T00:00:00Z</v2.3:Date> - <v2.3:AppVersion>ADC Declaration App</v2.3:AppVersion> - <v2.3:Ratio>1.000</v2.3:Ratio> - <v2.3:CertificationMethod>Option 2</v2.3:CertificationMethod> - <v2.3:TorqueLossMap> - <v2.3:Entry inputSpeed='0.00' inputTorque='-50000.00' torqueLoss='0.00'/> - <v2.3:Entry inputSpeed='0.00' inputTorque='-200.00' torqueLoss='0.00'/> - <v2.3:Entry inputSpeed='0.00' inputTorque='0.00' torqueLoss='0.00'/> - <v2.3:Entry inputSpeed='0.00' inputTorque='200.00' torqueLoss='0.00'/> - <v2.3:Entry inputSpeed='0.00' inputTorque='50000.00' torqueLoss='0.00'/> - <v2.3:Entry inputSpeed='5000.00' inputTorque='-50000.00' torqueLoss='0.00'/> - <v2.3:Entry inputSpeed='5000.00' inputTorque='-1253.00' torqueLoss='0.00'/> - <v2.3:Entry inputSpeed='5000.00' inputTorque='0.00' torqueLoss='0.00'/> - <v2.3:Entry inputSpeed='5000.00' inputTorque='1253.00' torqueLoss='0.00'/> - <v2.3:Entry inputSpeed='5000.00' inputTorque='50000.00' torqueLoss='0.00'/> - </v2.3:TorqueLossMap> - </v2.3:Data> - <v2.3:Signature> - <di:Reference> - <di:DigestMethod Algorithm=""></di:DigestMethod> - <di:DigestValue>DummyDigestValue</di:DigestValue> - </di:Reference> - </v2.3:Signature> - </ADC> + <P2.5GearRatios> + <Ratio gear="1">1.025</Ratio> + <Ratio gear="2">0.813</Ratio> + <Ratio gear="3">1.026</Ratio> + <Ratio gear="4">0.813</Ratio> + <Ratio gear="5">1.026</Ratio> + <Ratio gear="6">0.813</Ratio> + <Ratio gear="7">1.025</Ratio> + <Ratio gear="8">0.813</Ratio> + <Ratio gear="9">1.026</Ratio> + <Ratio gear="10">0.813</Ratio> + <Ratio gear="11">1.026</Ratio> + <Ratio gear="12">0.813</Ratio> + </P2.5GearRatios> </ElectricMachine> <ElectricEnergyStorage> <Battery>