diff --git a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/SimulationComponents/ElectricMachinesDataAdapter.cs b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/SimulationComponents/ElectricMachinesDataAdapter.cs index 5585fae24faf9b12697fcbf7e674efb636f43d79..4c2a5c9b1e36c6e7dd0b8453e29ae134e57d1f69 100644 --- a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/SimulationComponents/ElectricMachinesDataAdapter.cs +++ b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/SimulationComponents/ElectricMachinesDataAdapter.cs @@ -20,7 +20,7 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter.SimulationComponen { public class ElectricMachinesDataAdapter : IElectricMachinesDataAdapter { - public IList<Tuple<PowertrainPosition, ElectricMotorData>> CreateElectricMachines( + public virtual IList<Tuple<PowertrainPosition, ElectricMotorData>> CreateElectricMachines( IElectricMachinesDeclarationInputData electricMachines, IDictionary<PowertrainPosition, IList<Tuple<Volt, TableData>>> torqueLimits, Volt averageVoltage, GearList gearlist = null) { @@ -255,7 +255,7 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter.SimulationComponen } - public List<Tuple<PowertrainPosition, ElectricMotorData>> CreateIEPCElectricMachines(IIEPCDeclarationInputData iepc, Volt averageVoltage) + public virtual List<Tuple<PowertrainPosition, ElectricMotorData>> CreateIEPCElectricMachines(IIEPCDeclarationInputData iepc, Volt averageVoltage) { if (iepc == null) { return null; @@ -331,7 +331,7 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter.SimulationComponen return new List<Tuple<PowertrainPosition, ElectricMotorData>>() { Tuple.Create<PowertrainPosition, ElectricMotorData>(pos, retVal) }; } - private OverloadData CalculateOverloadData(IIEPCDeclarationInputData iepc, int count, + protected OverloadData CalculateOverloadData(IIEPCDeclarationInputData iepc, int count, VoltageLevelData voltageLevel, Volt averageVoltage, Tuple<uint, double> gearRatioUsedForMeasurement) { @@ -356,7 +356,7 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter.SimulationComponen } - private OverloadData CalculateOverloadData(IElectricMotorDeclarationInputData motorData, int count, VoltageLevelData voltageLevel, Volt averageVoltage) + protected 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 @@ -415,13 +415,14 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter.SimulationComponen - public class GenericElectricMachinesDataAdapter : IElectricMachinesDataAdapter + public class GenericElectricMachinesDataAdapter : ElectricMachinesDataAdapter { - private GenericBusElectricMotorData GenercicEMotorData = new GenericBusElectricMotorData(); + private readonly GenericBusElectricMotorData _genericEMotorData = new GenericBusElectricMotorData(); + private GenericBusIEPCData _genericIepcData = new GenericBusIEPCData(); #region Implementation of IElectricMachinesDataAdapter - public IList<Tuple<PowertrainPosition, ElectricMotorData>> CreateElectricMachines(IElectricMachinesDeclarationInputData electricMachines, IDictionary<PowertrainPosition, IList<Tuple<Volt, TableData>>> torqueLimits, + public override IList<Tuple<PowertrainPosition, ElectricMotorData>> CreateElectricMachines(IElectricMachinesDeclarationInputData electricMachines, IDictionary<PowertrainPosition, IList<Tuple<Volt, TableData>>> torqueLimits, Volt averageVoltage, GearList gearlist = null) { if (electricMachines == null) { @@ -436,20 +437,43 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter.SimulationComponen CheckTorqueLimitVoltageLevels(electricMachines, torqueLimits); return electricMachines.Entries.Select(m => - Tuple.Create(m.Position, GenercicEMotorData.CreateGenericElectricMotorData(m, torqueLimits?.FirstOrDefault(t => t.Key == m.Position).Value, + Tuple.Create(m.Position, _genericEMotorData.CreateGenericElectricMotorData(m, torqueLimits?.FirstOrDefault(t => t.Key == m.Position).Value, averageVoltage))).ToList(); } - public List<Tuple<PowertrainPosition, ElectricMotorData>> CreateIEPCElectricMachines(IIEPCDeclarationInputData iepc, Volt averageVoltage) + public override List<Tuple<PowertrainPosition, ElectricMotorData>> CreateIEPCElectricMachines(IIEPCDeclarationInputData iepc, Volt averageVoltage) { - throw new NotImplementedException(); + if (iepc == null) { + return null; + } + + var pos = PowertrainPosition.IEPC; + var count = iepc.DesignTypeWheelMotor && iepc.NrOfDesignTypeWheelMotorMeasured == 1 ? 2 : 1; + var gearRatioUsedForMeasurement = iepc.Gears + .Select(x => new { x.GearNumber, x.Ratio, Diff = Math.Round(Math.Abs(x.Ratio - 1), 6) }).GroupBy(x => x.Diff) + .OrderBy(x => x.Key).First().OrderBy(x => x.Ratio).Reverse().First(); + var voltageLevels = new List<ElectricMotorVoltageLevelData>(); + var genericIEPCData = _genericIepcData.CreateIEPCElectricMotorData(iepc); + genericIEPCData.OverloadRecoveryFactor = DeclarationData.OverloadRecoveryFactor; + genericIEPCData.TransmissionLossMap = + TransmissionLossMapReader.CreateEmADCLossMap(1.0, 1.0, "EM ADC LossMap Eff"); + genericIEPCData.RatioADC = 1; + genericIEPCData.Overload = CalculateOverloadData(iepc, count, genericIEPCData.EfficiencyData, averageVoltage, + Tuple.Create((uint)gearRatioUsedForMeasurement.GearNumber, gearRatioUsedForMeasurement.Ratio)); + + + return new List<Tuple<PowertrainPosition, ElectricMotorData>>() { + Tuple.Create<PowertrainPosition, ElectricMotorData>(pos, genericIEPCData) + }; - } + + + } #endregion - private void CheckTorqueLimitVoltageLevels(IElectricMachinesDeclarationInputData electricMachines, + private void CheckTorqueLimitVoltageLevels(IElectricMachinesDeclarationInputData electricMachines, IDictionary<PowertrainPosition, IList<Tuple<Volt, TableData>>> torqueLimits) { if (torqueLimits == null) { diff --git a/VectoCore/VectoCore/InputData/Reader/Impl/DeclarationMode/CompletedBusRunDataFactory/DeclarationModeCompletedBusRunDataFactory.cs b/VectoCore/VectoCore/InputData/Reader/Impl/DeclarationMode/CompletedBusRunDataFactory/DeclarationModeCompletedBusRunDataFactory.cs index 91c78a71f646d9d4dab0b2f82d51814cd8f93338..83060c2f52b9f3cb9b22ba43fd566a0fc6092e32 100644 --- a/VectoCore/VectoCore/InputData/Reader/Impl/DeclarationMode/CompletedBusRunDataFactory/DeclarationModeCompletedBusRunDataFactory.cs +++ b/VectoCore/VectoCore/InputData/Reader/Impl/DeclarationMode/CompletedBusRunDataFactory/DeclarationModeCompletedBusRunDataFactory.cs @@ -435,15 +435,15 @@ namespace TUGraz.VectoCore.InputData.Reader.Impl.DeclarationMode.CompletedBusRun (bs) => rd.BatteryData = bs, (sc) => rd.SuperCapData = sc); + rd.ElectricMachinesData = DataAdapterGeneric.CreateElectricMachines(PrimaryVehicle.Components.ElectricMachines, + PrimaryVehicle.ElectricMotorTorqueLimits, rd.BatteryData.CalculateAverageVoltage(), null); + + if (PrimaryVehicle.VehicleType == VectoSimulationJobType.IEPC_S) { - rd.ElectricMachinesData = DataAdapterGeneric.CreateIEPCElectricMachines(PrimaryVehicle.Components.IEPC, + var iepcData = DataAdapterGeneric.CreateIEPCElectricMachines(PrimaryVehicle.Components.IEPC, rd.BatteryData.CalculateAverageVoltage()); - } - else - { - rd.ElectricMachinesData = DataAdapterGeneric.CreateElectricMachines(PrimaryVehicle.Components.ElectricMachines, - PrimaryVehicle.ElectricMotorTorqueLimits, rd.BatteryData.CalculateAverageVoltage(), null); + iepcData.ForEach(iepc => rd.ElectricMachinesData.Add(iepc)); } @@ -498,15 +498,16 @@ namespace TUGraz.VectoCore.InputData.Reader.Impl.DeclarationMode.CompletedBusRun (sc) => rd.SuperCapData = sc); + + rd.ElectricMachinesData = DataAdapterGeneric.CreateElectricMachines(PrimaryVehicle.Components.ElectricMachines, + PrimaryVehicle.ElectricMotorTorqueLimits, rd.BatteryData.CalculateAverageVoltage(), null); + + if (PrimaryVehicle.VehicleType == VectoSimulationJobType.IEPC_S) { - rd.ElectricMachinesData = DataAdapterGeneric.CreateIEPCElectricMachines(PrimaryVehicle.Components.IEPC, + var iepcData = DataAdapterGeneric.CreateIEPCElectricMachines(PrimaryVehicle.Components.IEPC, rd.BatteryData.CalculateAverageVoltage()); - } - else - { - rd.ElectricMachinesData = DataAdapterGeneric.CreateElectricMachines(PrimaryVehicle.Components.ElectricMachines, - PrimaryVehicle.ElectricMotorTorqueLimits, rd.BatteryData.CalculateAverageVoltage(), null); + iepcData.ForEach(iepc => rd.ElectricMachinesData.Add(iepc)); } rd.VehicleData = DataAdapterSpecific.CreateVehicleData(PrimaryVehicle, diff --git a/VectoCore/VectoCore/Models/Declaration/DeclarationData.cs b/VectoCore/VectoCore/Models/Declaration/DeclarationData.cs index 2fee0513ca2b664ce3b14829b8ef85ef1bec64db..03c598a1d83b04cbb08a33a7ecdb7d92ac96c668 100644 --- a/VectoCore/VectoCore/Models/Declaration/DeclarationData.cs +++ b/VectoCore/VectoCore/Models/Declaration/DeclarationData.cs @@ -51,6 +51,7 @@ using TUGraz.VectoCore.Models.SimulationComponent.Data.Engine; using TUGraz.VectoCore.Models.SimulationComponent.Data.Gearbox; using TUGraz.VectoCore.Utils; using TUGraz.VectoCore.Models.BusAuxiliaries.DownstreamModules.Impl.HVAC; +using TUGraz.VectoCore.Models.GenericModelData; using TUGraz.VectoCore.Models.Simulation.Data; using TUGraz.VectoCore.Models.Simulation.Impl; using TUGraz.VectoCore.Models.SimulationComponent.Data.ElectricComponents.Battery; @@ -60,7 +61,8 @@ using TUGraz.VectoCore.OutputData.XML; namespace TUGraz.VectoCore.Models.Declaration { - public static class DeclarationData + public static class + DeclarationData { /// <summary> /// The standard acceleration for gravity on earth. @@ -88,6 +90,7 @@ namespace TUGraz.VectoCore.Models.Declaration public static readonly HeatingVentilationAirConditioning HeatingVentilationAirConditioning = new HeatingVentilationAirConditioning(); + public static readonly PneumaticSystem PneumaticSystem = new PneumaticSystem(); public static readonly SteeringPump SteeringPump = new SteeringPump(); public static readonly SteeringPumpBus SteeringPumpBus = new SteeringPumpBus(); diff --git a/VectoCore/VectoCore/Models/GenericModelData/GenericBusElectricMotorData.cs b/VectoCore/VectoCore/Models/GenericModelData/GenericBusElectricMotorData.cs index e670179fab5f9507bdb2ee445c1225f28f6e29b1..53f0bd859caeb01096af5b03c98e14539dd82048 100644 --- a/VectoCore/VectoCore/Models/GenericModelData/GenericBusElectricMotorData.cs +++ b/VectoCore/VectoCore/Models/GenericModelData/GenericBusElectricMotorData.cs @@ -63,55 +63,13 @@ namespace TUGraz.VectoCore.Models.GenericModelData VoltageLevelData voltageLevel, Volt averageVoltage, Tuple<uint, double> gearRatioUsedForMeasurement) { return CalculateOverloadData(count, voltageLevel, averageVoltage, iepc.VoltageLevels, 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, voltageLevel, gearRatioUsedForMeasurement); - //} - //if (averageVoltage > iepc.VoltageLevels.Max(x => x.VoltageLevel)) - //{ - // 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, voltageLevel, gearRatioUsedForMeasurement); - //var ovlHi = CalculateOverloadBuffer(vHigh, count, voltageLevel, gearRatioUsedForMeasurement); - - //var retVal = new OverloadData() - //{ - // OverloadBuffer = VectoMath.Interpolate(vLow.VoltageLevel, vHigh.VoltageLevel, ovlLo.OverloadBuffer, ovlHi.OverloadBuffer, averageVoltage), - // ContinuousTorque = VectoMath.Interpolate(vLow.VoltageLevel, vHigh.VoltageLevel, ovlLo.ContinuousTorque, ovlHi.ContinuousTorque, averageVoltage), - // ContinuousPowerLoss = VectoMath.Interpolate(vLow.VoltageLevel, vHigh.VoltageLevel, ovlLo.ContinuousPowerLoss, ovlHi.ContinuousPowerLoss, averageVoltage) - //}; - //return retVal; - } + } private OverloadData CalculateOverloadData(IElectricMotorDeclarationInputData motorData, int count, VoltageLevelData voltageLevel, Volt averageVoltage) { return CalculateOverloadData(count, voltageLevel, averageVoltage, motorData.VoltageLevels); - //// 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, voltageLevel); - //} - //if (averageVoltage > motorData.VoltageLevels.Max(x => x.VoltageLevel)) - //{ - // 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, voltageLevel); - //var ovlHi = CalculateOverloadBuffer(vHigh, count, voltageLevel); - - //var retVal = new OverloadData() - //{ - // OverloadBuffer = VectoMath.Interpolate(vLow.VoltageLevel, vHigh.VoltageLevel, ovlLo.OverloadBuffer, ovlHi.OverloadBuffer, averageVoltage), - // ContinuousTorque = VectoMath.Interpolate(vLow.VoltageLevel, vHigh.VoltageLevel, ovlLo.ContinuousTorque, ovlHi.ContinuousTorque, averageVoltage), - // ContinuousPowerLoss = VectoMath.Interpolate(vLow.VoltageLevel, vHigh.VoltageLevel, ovlLo.ContinuousPowerLoss, ovlHi.ContinuousPowerLoss, averageVoltage) - //}; - //return retVal; - } + } private OverloadData CalculateOverloadData(int count, VoltageLevelData voltageLevel, Volt averageVoltage, IList<IElectricMotorVoltageLevel> electricMotorVoltageLevels, Tuple<uint, double> gearUsedForMeasurement = null) { diff --git a/VectoCore/VectoCore/Models/GenericModelData/GenericBusIHPCData.cs b/VectoCore/VectoCore/Models/GenericModelData/GenericBusIHPCData.cs index 126d5735836fe981929d8d3c85f8eafa1f5ff4c1..87b62dd823e20000be1be890e4a5c30b5d188527 100644 --- a/VectoCore/VectoCore/Models/GenericModelData/GenericBusIHPCData.cs +++ b/VectoCore/VectoCore/Models/GenericModelData/GenericBusIHPCData.cs @@ -14,6 +14,8 @@ namespace TUGraz.VectoCore.Models.GenericModelData { public class GenericBusIHPCData : GenericBusEMBase { + public const double GenericGearEfficiency = 0.925; + public GenericBusIHPCData() { GenericEfficiencyMap_ASM = @@ -113,7 +115,7 @@ namespace TUGraz.VectoCore.Models.GenericModelData result.Columns.Add(ElectricMotorMapReader.Fields.MotorSpeed); result.Columns.Add(ElectricMotorMapReader.Fields.Torque); result.Columns.Add(ElectricMotorMapReader.Fields.PowerElectrical); - + throw new Exception("Consider IHPC GenericGearEfficiency"); foreach (DataRow row in normalizedMap.Rows) { var motorSpeed = row.ParseDouble(MotorSpeedNorm) * ratedPoint.NRated; diff --git a/VectoCore/VectoCoreTest/Models/Declaration/TestGenericBusEMotorData.cs b/VectoCore/VectoCoreTest/Models/Declaration/TestGenericBusEMotorData.cs index 05ee026bb285ce18a1a5a1340d83060bf9252c9d..60cacc3b04c615492689f5bcc800d7b9d60245ac 100644 --- a/VectoCore/VectoCoreTest/Models/Declaration/TestGenericBusEMotorData.cs +++ b/VectoCore/VectoCoreTest/Models/Declaration/TestGenericBusEMotorData.cs @@ -133,7 +133,7 @@ namespace TUGraz.VectoCore.Tests.Models.Declaration var axleGear = multistepBusInputData.JobInputData.PrimaryVehicle.Vehicle.Components.AxleGearInputData; var genericIEPCData = new GenericBusIEPCData(); - var iepcMotorData = genericIEPCData.CreateIEPCElectricMotorData(iepcData, axleGear); + var iepcMotorData = genericIEPCData.CreateIEPCElectricMotorData(iepcData); Assert.AreEqual(1, iepcMotorData.EfficiencyData.VoltageLevels.Count); }