diff --git a/.gitignore b/.gitignore index 83d5f953f1ebd2d9f2b795519129f9cd7e2ef0a1..1e56170040718eb8de84cd9612d3b86f5562cc7c 100644 --- a/.gitignore +++ b/.gitignore @@ -224,3 +224,4 @@ Documentation/VehiclesReleaseComparisonDeclarationMode/**/*.vsum /VectoCommon/VectoCommon/InputData/BusInputData.cd /.idea/.idea.VECTO/.idea +/Generic Vehicles/Engineering Mode/GenericIHPC/6SpeedGbx/EM_Maps.xlsx diff --git a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/HeavyLorry/DeclarationDataAdapterHeavyLorry.cs b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/HeavyLorry/DeclarationDataAdapterHeavyLorry.cs index 4c956cc9eea2d9c8cbfbbb2730a895a4386e6a6e..b0a5e4dbff3b1191259222e022b46e629c0adabf 100644 --- a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/HeavyLorry/DeclarationDataAdapterHeavyLorry.cs +++ b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/HeavyLorry/DeclarationDataAdapterHeavyLorry.cs @@ -366,8 +366,8 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter.HeavyLorry private PTODataAdapterLorry _ptoAdapterLorry = new PTODataAdapterLorry(); protected override GearboxType[] SupportedGearboxTypes => new[] { GearboxType.AMT, GearboxType.ATPowerSplit, GearboxType.ATSerial }; - //private IGearboxDataAdapter _gearboxDataAdapter = new GearboxDataAdapter(new TorqueConverterDataAdapter()); - private GearboxDataAdapter _gearboxDataAdapter = new GearboxDataAdapter(null); + private IGearboxDataAdapter _gearboxDataAdapter = new GearboxDataAdapter(new TorqueConverterDataAdapter()); + //private GearboxDataAdapter _gearboxDataAdapter = new GearboxDataAdapter(null); //private ElectricStorageAdapter _electricStorageAdapter = new ElectricStorageAdapter(); #region Overrides of LorryBase diff --git a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/SimulationComponents/ElectricMachinesDataAdapter.cs b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/SimulationComponents/ElectricMachinesDataAdapter.cs index d02868a0c7a52f00bbaed4d3847435a54b8c20ee..a73638a3d5fa72904f076d67e920f8ad9bca95aa 100644 --- a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/SimulationComponents/ElectricMachinesDataAdapter.cs +++ b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/SimulationComponents/ElectricMachinesDataAdapter.cs @@ -156,6 +156,8 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter.SimulationComponen } + public IList<IElectricMotorVoltageLevel> VoltageLevels => _voltageLevels; + #region Implementation of IComponentInputData @@ -191,7 +193,7 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter.SimulationComponen public string IHPCType => _electricMotorDeclarationInputDataImplementation.IHPCType; - public IList<IElectricMotorVoltageLevel> VoltageLevels => _electricMotorDeclarationInputDataImplementation.VoltageLevels; + public TableData DragCurve => _electricMotorDeclarationInputDataImplementation.DragCurve; @@ -211,18 +213,26 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter.SimulationComponen IElectricMachinesDeclarationInputData electricMachines, IDictionary<PowertrainPosition, IList<Tuple<Volt, TableData>>> torqueLimits, Volt averageVoltage, GearList gearlist = null) { + + 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"); } + + + + CheckTorqueLimitVoltageLevels(electricMachines, torqueLimits); return electricMachines.Entries .Select(m => Tuple.Create(m.Position, - CreateElectricMachine(m.Position, m.ElectricMachine, m.Count, m.ADC?.Ratio ?? 1.0, m.RatioPerGear, + CreateElectricMachine(m.Position, m.ElectricMachine, m.Count, m.RatioADC, m.RatioPerGear, m.MechanicalTransmissionLossMap, torqueLimits?.FirstOrDefault(t => t.Key == m.Position).Value, averageVoltage, gearlist))).ToList(); } @@ -275,7 +285,7 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter.SimulationComponen var fullLoadCurveCombined = IntersectEMFullLoadCurves(fullLoadCurve, maxTorqueCurve); try { - var vLevelData = powertrainPosition == PowertrainPosition.IHPC + var vLevelData = motorData.IsIHPC() ? CreateIHPCVoltageLevelData(count, entry, fullLoadCurveCombined, gearList) : CreateEmVoltageLevelData(count, entry, fullLoadCurveCombined); voltageLevels.Add(vLevelData); @@ -482,13 +492,8 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter.SimulationComponen var voltageLevels = new List<ElectricMotorVoltageLevelData>(); - 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) + foreach (var entry in iepc.VoltageLevels.OrderBy(x => x.VoltageLevel).AsEnumerable()) { var effMap = new Dictionary<uint, EfficiencyMap>(); var fldCurve = diff --git a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/SimulationComponents/GearBoxDataAdapter.cs b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/SimulationComponents/GearBoxDataAdapter.cs index 3ea0b1f1e4aaf54c5ae2146c3c07bf179aec4fb7..e558f05d57c16d473b71b5c741add1b80598e2bf 100644 --- a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/SimulationComponents/GearBoxDataAdapter.cs +++ b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/SimulationComponents/GearBoxDataAdapter.cs @@ -377,7 +377,8 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter.SimulationComponen } retVal.Gears = gears; - if (retVal.Type.AutomaticTransmission()) + + if (retVal.Type.AutomaticTransmission() && retVal.Type != GearboxType.APTN && retVal.Type != GearboxType.IHPC) { var ratio = double.IsNaN(retVal.Gears[1].Ratio) ? 1 diff --git a/VectoCore/VectoCore/InputData/Reader/Impl/DeclarationMode/HeavyLorryRunDataFactory/DeclarationModeHeavyLorryRunDataFactory.cs b/VectoCore/VectoCore/InputData/Reader/Impl/DeclarationMode/HeavyLorryRunDataFactory/DeclarationModeHeavyLorryRunDataFactory.cs index 7975950d17d6c832f5ab8f1a6a274d81aecd50bf..15d02bc33cb5a58d17a75bac09d38dca7ed9b545 100644 --- a/VectoCore/VectoCore/InputData/Reader/Impl/DeclarationMode/HeavyLorryRunDataFactory/DeclarationModeHeavyLorryRunDataFactory.cs +++ b/VectoCore/VectoCore/InputData/Reader/Impl/DeclarationMode/HeavyLorryRunDataFactory/DeclarationModeHeavyLorryRunDataFactory.cs @@ -195,6 +195,9 @@ namespace TUGraz.VectoCore.InputData.Reader.Impl.DeclarationMode.HeavyLorryRunDa #endregion + + protected abstract bool AxleGearRequired(); + } public sealed class Conventional : LorryBase @@ -311,6 +314,13 @@ namespace TUGraz.VectoCore.InputData.Reader.Impl.DeclarationMode.HeavyLorryRunDa ShiftPolygonCalculator.Create(shiftStrategyName, runData.GearshiftParameters)); } + protected override bool AxleGearRequired() + { + return true; + } + + + #endregion } @@ -318,6 +328,15 @@ namespace TUGraz.VectoCore.InputData.Reader.Impl.DeclarationMode.HeavyLorryRunDa public abstract class BatteryElectric : LorryBase { + #region Overrides of LorryBase + + protected override bool AxleGearRequired() + { + return InputDataProvider.JobInputData.Vehicle.ArchitectureID != ArchitectureID.E4; + } + + #endregion + public BatteryElectric(IDeclarationInputDataProvider dataProvider, IDeclarationReport report, ILorryDeclarationDataAdapter declarationDataAdapter) : base(dataProvider, report, declarationDataAdapter) @@ -379,7 +398,7 @@ namespace TUGraz.VectoCore.InputData.Reader.Impl.DeclarationMode.HeavyLorryRunDa result.AngledriveData = DataAdapter.CreateAngledriveData(vehicle.Components.AngledriveInputData); - if (vehicle.ArchitectureID != ArchitectureID.E4) { + if (AxleGearRequired()) { result.AxleGearData = DataAdapter.CreateAxleGearData(vehicle.Components.AxleGearInputData); } @@ -502,6 +521,38 @@ namespace TUGraz.VectoCore.InputData.Reader.Impl.DeclarationMode.HeavyLorryRunDa } + protected override bool AxleGearRequired() + { + var vehicle = InputDataProvider.JobInputData.Vehicle; + var iepcInput = vehicle.Components.IEPC; + var axleGearRequired = !iepcInput.DifferentialIncluded && !iepcInput.DesignTypeWheelMotor; + if (axleGearRequired && vehicle.Components.AxleGearInputData == null) + { + throw new VectoException( + $"Axlegear reqhired for selected type of IEPC! DifferentialIncluded: {iepcInput.DifferentialIncluded}, DesignTypeWheelMotor: {iepcInput.DesignTypeWheelMotor}"); + } + + var numGearsPowermap = + iepcInput.VoltageLevels.Select(x => Tuple.Create(x.VoltageLevel, x.PowerMap.Count)).ToArray(); + var gearCount = iepcInput.Gears.Count; + var numGearsDrag = iepcInput.DragCurves.Count; + + if (numGearsPowermap.Any(x => x.Item2 != gearCount)) + { + throw new VectoException( + $"Number of gears for voltage levels does not match! PowerMaps: {numGearsPowermap.Select(x => $"{x.Item1}: {x.Item2}").Join()}; Gear count: {gearCount}"); + } + + if (numGearsDrag > 1 && numGearsDrag != gearCount) + { + throw new VectoException( + $"Number of gears drag curve does not match gear count! DragCurve {numGearsDrag}; Gear count: {gearCount}"); + } + + return axleGearRequired; + + } + #region Overrides of BatteryElectric protected override void CreateGearboxAndGearshiftData(IVehicleDeclarationInputData vehicle, VectoRunData runData) @@ -561,6 +612,14 @@ namespace TUGraz.VectoCore.InputData.Reader.Impl.DeclarationMode.HeavyLorryRunDa #endregion + #region Overrides of LorryBase + + protected override bool AxleGearRequired() + { + 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 index bda414eb6074fdcd06dc2ea3126eccb8e80eb487..fa2139e19df884fb6edf5fc1a8c0b5c5222aed50 100644 --- a/VectoCore/VectoCore/InputData/Reader/Impl/DeclarationMode/HeavyLorryRunDataFactory/DeclarationModeHeavyLorryRunDataFactory_Hybrid.cs +++ b/VectoCore/VectoCore/InputData/Reader/Impl/DeclarationMode/HeavyLorryRunDataFactory/DeclarationModeHeavyLorryRunDataFactory_Hybrid.cs @@ -75,6 +75,14 @@ namespace TUGraz.VectoCore.InputData.Reader.Impl.DeclarationMode.HeavyLorryRunDa public class SerialHybrid : Hybrid { + #region Overrides of LorryBase + + protected override bool AxleGearRequired() + { + return InputDataProvider.JobInputData.Vehicle.Components.AxleGearInputData != null; + } + + #endregion public SerialHybrid(IDeclarationInputDataProvider dataProvider, IDeclarationReport report, ILorryDeclarationDataAdapter declarationDataAdapter) : base(dataProvider, report, @@ -127,7 +135,7 @@ namespace TUGraz.VectoCore.InputData.Reader.Impl.DeclarationMode.HeavyLorryRunDa iepcData.ForEach(iepc => runData.ElectricMachinesData.Add(iepc)); } - if (vehicle.Components.AxleGearInputData != null) { + if (AxleGearRequired()) { runData.AxleGearData = DataAdapter.CreateAxleGearData(vehicle.Components.AxleGearInputData); } @@ -193,6 +201,8 @@ namespace TUGraz.VectoCore.InputData.Reader.Impl.DeclarationMode.HeavyLorryRunDa _segment = GetSegment(InputDataProvider.JobInputData.Vehicle, false); } + + #endregion } @@ -227,9 +237,7 @@ namespace TUGraz.VectoCore.InputData.Reader.Impl.DeclarationMode.HeavyLorryRunDa DataAdapter.CreateREESSData(vehicle.Components.ElectricStorage, vehicle.VehicleType, vehicle.OvcHev, ((batteryData) => runData.BatteryData = batteryData), ((sCdata => runData.SuperCapData = sCdata))); - runData.ElectricMachinesData = DataAdapter.CreateElectricMachines( - vehicle.Components.ElectricMachines, vehicle.ElectricMotorTorqueLimits, - runData.BatteryData.CalculateAverageVoltage()); + @@ -245,6 +253,9 @@ namespace TUGraz.VectoCore.InputData.Reader.Impl.DeclarationMode.HeavyLorryRunDa CreateGearboxAndGearshiftData(vehicle, runData); + runData.ElectricMachinesData = DataAdapter.CreateElectricMachines( + vehicle.Components.ElectricMachines, vehicle.ElectricMotorTorqueLimits, + runData.BatteryData.CalculateAverageVoltage(), runData.GearboxData.GearList); runData.HybridStrategyParameters = DataAdapter.CreateHybridStrategy(runData.BatteryData, runData.SuperCapData, runData.VehicleData.TotalVehicleMass, ovcMode, loading.Key, runData.VehicleData.VehicleClass, mission.MissionType); @@ -307,6 +318,10 @@ namespace TUGraz.VectoCore.InputData.Reader.Impl.DeclarationMode.HeavyLorryRunDa ShiftPolygonCalculator.Create(shiftStrategyName, runData.GearshiftParameters)); } + protected override bool AxleGearRequired() + { + return true; + } #endregion #endregion @@ -364,18 +379,9 @@ namespace TUGraz.VectoCore.InputData.Reader.Impl.DeclarationMode.HeavyLorryRunDa } - #region Overrides of SerialHybrid - - protected override VectoRunData CreateVectoRunData(IVehicleDeclarationInputData vehicle, Mission mission, KeyValuePair<LoadingType, Tuple<Kilogram, double?>> loading, - int? modeIdx, VectoRunData.OvcHevMode ovcMode = VectoRunData.OvcHevMode.NotApplicable) - { - AxleGearRequired(); - return base.CreateVectoRunData(vehicle, mission, loading, modeIdx, ovcMode); - } - - #endregion + #region Overrides of LorryBase - private bool AxleGearRequired() + protected override bool AxleGearRequired() { var vehicle = InputDataProvider.JobInputData.Vehicle; var iepcInput = vehicle.Components.IEPC; @@ -406,6 +412,19 @@ namespace TUGraz.VectoCore.InputData.Reader.Impl.DeclarationMode.HeavyLorryRunDa return axleGearRequired; } + #endregion + + #region Overrides of SerialHybrid + + protected override VectoRunData CreateVectoRunData(IVehicleDeclarationInputData vehicle, Mission mission, KeyValuePair<LoadingType, Tuple<Kilogram, double?>> loading, + int? modeIdx, VectoRunData.OvcHevMode ovcMode = VectoRunData.OvcHevMode.NotApplicable) + { + AxleGearRequired(); + return base.CreateVectoRunData(vehicle, mission, loading, modeIdx, ovcMode); + } + + #endregion + #region Overrides of SerialHybrid protected override void CreateGearboxAndGearshiftData(IVehicleDeclarationInputData vehicle, VectoRunData runData) diff --git a/VectoCore/VectoCoreTest/Integration/Declaration/HeavyLorry/HeavyLorrySimulation.cs b/VectoCore/VectoCoreTest/Integration/Declaration/HeavyLorry/HeavyLorrySimulation.cs index 0666a4e0d5c1cca546787932382feedcc180586d..9105e8792172b6ae229e0216da584f22169b6ff0 100644 --- a/VectoCore/VectoCoreTest/Integration/Declaration/HeavyLorry/HeavyLorrySimulation.cs +++ b/VectoCore/VectoCoreTest/Integration/Declaration/HeavyLorry/HeavyLorrySimulation.cs @@ -427,7 +427,7 @@ public class HeavyLorrySimulation [TestCase(@"HeavyLorry\PEV\PEV_heavyLorry_AMT_E2.xml", 6)] [TestCase(Group5_PEV_E3,10)] [TestCase(@"HeavyLorry\PEV\Group5_ PEV_E4.xml",10)] - [TestCase(@"HeavyLorry\PEV\PEV_heavyLorry_E4_standardValues.xml", 10)] + [TestCase(@"HeavyLorry\PEV\PEV_heavyLorry_E4_standardValues.xml", 6)] [TestCase(@"HeavyLorry\PEV\Group5_ PEV_IEPC_E.xml",10)] public void PEV(string jobFile, int nrRuns) {