diff --git a/VectoCommon/VectoCommon/BusAuxiliaries/IAuxiliaryConfig.cs b/VectoCommon/VectoCommon/BusAuxiliaries/IAuxiliaryConfig.cs index f6c4aadbdf60637d2438a93888e85717588384e6..8a91493c767b504df40ed4a44273c8754fd6ab6a 100644 --- a/VectoCommon/VectoCommon/BusAuxiliaries/IAuxiliaryConfig.cs +++ b/VectoCommon/VectoCommon/BusAuxiliaries/IAuxiliaryConfig.cs @@ -38,7 +38,7 @@ namespace TUGraz.VectoCommon.BusAuxiliaries { //IFuelConsumptionMap FuelMap { get; } - ISignals Signals { get; } + //ISignals Signals { get; } // Persistance Functions //bool Save(string filePath); diff --git a/VectoCommon/VectoCommon/BusAuxiliaries/IElectricsUserInputsConfig.cs b/VectoCommon/VectoCommon/BusAuxiliaries/IElectricsUserInputsConfig.cs index 3ed13166bf000735cc5ba47c1c6f1cb869a83cef..57e7b1470ba6e612818a68e00a5aa411e4454185 100644 --- a/VectoCommon/VectoCommon/BusAuxiliaries/IElectricsUserInputsConfig.cs +++ b/VectoCommon/VectoCommon/BusAuxiliaries/IElectricsUserInputsConfig.cs @@ -93,5 +93,9 @@ namespace TUGraz.VectoCommon.BusAuxiliaries /// <returns>Stored Energy Efficiency</returns> /// <remarks></remarks> double StoredEnergyEfficiency { get; } + + Watt MaxAlternatorPower { get; } + + WattSecond ElectricStorageCapacity { get; } } } diff --git a/VectoCore/VectoCore/InputData/FileIO/JSON/JSONInputData.cs b/VectoCore/VectoCore/InputData/FileIO/JSON/JSONInputData.cs index 4bcbfa8db4e81d15e3b44ce09fd3be8af03ffc46..7a6f4467fe902268d7d7258ef6805f03cc36c0b6 100644 --- a/VectoCore/VectoCore/InputData/FileIO/JSON/JSONInputData.cs +++ b/VectoCore/VectoCore/InputData/FileIO/JSON/JSONInputData.cs @@ -965,4 +965,40 @@ namespace TUGraz.VectoCore.InputData.FileIO.JSON #endregion } + + + public class JSONInputDataSingleBusV6 : JSONFile, ISingleBusInputDataProvider + { + private readonly IXMLInputDataReader _xmlInputReader; + + public JSONInputDataSingleBusV6(JObject data, string filename, bool tolerateMissing = false) : base( + data, filename, tolerateMissing) + { + var kernel = new StandardKernel(new VectoNinjectModule()); + _xmlInputReader = kernel.Get<IXMLInputDataReader>(); + + var primaryInputData = Path.Combine(BasePath, Body.GetEx<string>("PrimaryVehicle")); + var completedInputData = Path.Combine(BasePath, Body.GetEx<string>("CompletedVehicle")); + + PrimaryVehicle = CreateReader(primaryInputData); + CompletedVehidle = CreateReader(completedInputData); + } + + private IVehicleDeclarationInputData CreateReader(string vehicleFileName) + { + if (Path.GetExtension(vehicleFileName) != ".xml") { + throw new VectoException("unsupported vehicle file format {0}", vehicleFileName); + } + + return _xmlInputReader.CreateDeclaration(vehicleFileName).JobInputData.Vehicle; + + } + + #region Implementation of ISingleBusInputDataProvider + + public IVehicleDeclarationInputData PrimaryVehicle { get; } + public IVehicleDeclarationInputData CompletedVehidle { get; } + + #endregion + } } diff --git a/VectoCore/VectoCore/InputData/Impl/InputData.cs b/VectoCore/VectoCore/InputData/Impl/InputData.cs index c943212056662cd3b6c18df1b40ef5997caa69ce..fa2a078cc3637deabe9875a5d1f9e4c3589b56ad 100644 --- a/VectoCore/VectoCore/InputData/Impl/InputData.cs +++ b/VectoCore/VectoCore/InputData/Impl/InputData.cs @@ -205,14 +205,7 @@ namespace TUGraz.VectoCore.InputData.Impl #endregion } - public class ResultCardDeclarationInputData : IResultCardDeclarationInputData - { - public IList<IResultCardEntry> Idle { get; internal set; } - public IList<IResultCardEntry> Traction { get; internal set; } - public IList<IResultCardEntry> Overrun { get; internal set; } - } - - + public class ResultInputData : IResultsInputData { public string Status { get; internal set; } diff --git a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/DeclarationDataAdapterPrimaryBus.cs b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/DeclarationDataAdapterPrimaryBus.cs index 71b4b48708608c9273037df31ebc7938e62eab0d..327f954329b4326c88470921412be568e4d94aa1 100644 --- a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/DeclarationDataAdapterPrimaryBus.cs +++ b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/DeclarationDataAdapterPrimaryBus.cs @@ -110,6 +110,8 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter ResultCardOverrun = new DummyResultCard(), ResultCardTraction = new DummyResultCard(), AlternatorGearEfficiency = Constants.BusAuxiliaries.ElectricSystem.AlternatorGearEfficiency, + MaxAlternatorPower = busAux.ElectricSupply.MaxAlternatorPower, + ElectricStorageCapacity = busAux.ElectricSupply.ElectricStorageCapacity }; } diff --git a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/DeclarationDataAdapterSingleBus.cs b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/DeclarationDataAdapterSingleBus.cs new file mode 100644 index 0000000000000000000000000000000000000000..20b224d8c6b9a5a78b859e676cb1b20883415c84 --- /dev/null +++ b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/DeclarationDataAdapterSingleBus.cs @@ -0,0 +1,89 @@ +using System; +using System.Collections.Generic; +using TUGraz.VectoCommon.BusAuxiliaries; +using TUGraz.VectoCommon.InputData; +using TUGraz.VectoCommon.Models; +using TUGraz.VectoCommon.Utils; +using TUGraz.VectoCore.Models.Declaration; +using TUGraz.VectoCore.Models.Simulation.Data; +using TUGraz.VectoCore.Models.SimulationComponent; +using TUGraz.VectoCore.Models.SimulationComponent.Data; + +namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter { + public class DeclarationDataAdapterSingleBus : IDeclarationDataAdapter { + + + #region Implementation of IDeclarationDataAdapter + + public DriverData CreateDriverData() + { + throw new NotImplementedException(); + } + + public VehicleData CreateVehicleData(IVehicleDeclarationInputData vehicle, Mission mission, Kilogram loading) + { + throw new NotImplementedException(); + } + + public AirdragData CreateAirdragData(IAirdragDeclarationInputData airdragData, Mission mission, Segment segment) + { + throw new NotImplementedException(); + } + + public AxleGearData CreateAxleGearData(IAxleGearInputData axlegearData) + { + throw new NotImplementedException(); + } + + public AngledriveData CreateAngledriveData(IAngledriveInputData angledriveData) + { + throw new NotImplementedException(); + } + + public CombustionEngineData CreateEngineData( + IVehicleDeclarationInputData vehicle, IEngineModeDeclarationInputData engineMode, Mission mission) + { + throw new NotImplementedException(); + } + + public GearboxData CreateGearboxData( + IVehicleDeclarationInputData inputData, VectoRunData runData, IShiftPolygonCalculator shiftPolygonCalc) + { + throw new NotImplementedException(); + } + + public ShiftStrategyParameters CreateGearshiftData(GearboxData gbx, double axleRatio, PerSecond engineIdlingSpeed) + { + throw new NotImplementedException(); + } + + public RetarderData CreateRetarderData(IRetarderInputData retarderData) + { + throw new NotImplementedException(); + } + + public PTOData CreatePTOTransmissionData(IPTOTransmissionInputData ptoData) + { + throw new NotImplementedException(); + } + + public IList<VectoRunData.AuxData> CreateAuxiliaryData( + IAuxiliariesDeclarationInputData auxData, IBusAuxiliariesDeclarationData busAuxData, MissionType missionType, + VehicleClass vehicleClass, Meter vehicleLength) + { + throw new NotImplementedException(); + } + + public AxleGearData CreateDummyAxleGearData(IGearboxDeclarationInputData gbxData) + { + throw new NotImplementedException(); + } + + #endregion + + public IAuxiliaryConfig CreateBusAuxiliariesData(Mission mission, IVehicleDeclarationInputData primaryVehicle, IVehicleDeclarationInputData completedVehicle, VectoRunData runData) + { + throw new NotImplementedException(); + } + } +} \ No newline at end of file diff --git a/VectoCore/VectoCore/InputData/Reader/Impl/DeclarationModeSingleBusVectoRunDataFactory.cs b/VectoCore/VectoCore/InputData/Reader/Impl/DeclarationModeSingleBusVectoRunDataFactory.cs new file mode 100644 index 0000000000000000000000000000000000000000..842ce0c36661ec3598391a5b94e532977071d843 --- /dev/null +++ b/VectoCore/VectoCore/InputData/Reader/Impl/DeclarationModeSingleBusVectoRunDataFactory.cs @@ -0,0 +1,75 @@ +using System.Collections.Generic; +using TUGraz.VectoCommon.InputData; +using TUGraz.VectoCommon.Models; +using TUGraz.VectoCommon.Utils; +using TUGraz.VectoCore.InputData; +using TUGraz.VectoCore.InputData.Reader.ComponentData; +using TUGraz.VectoCore.InputData.Reader.DataObjectAdapter; +using TUGraz.VectoCore.InputData.Reader.Impl; +using TUGraz.VectoCore.Models.Declaration; +using TUGraz.VectoCore.Models.Simulation.Data; +using TUGraz.VectoCore.Models.SimulationComponent.Data; +using TUGraz.VectoCore.OutputData; + +namespace TUGraz.VectoCore.Models.Simulation.Impl { + internal class DeclarationModeSingleBusVectoRunDataFactory : DeclarationModeBusVectoRunDataFactory + { + protected new DeclarationDataAdapterSingleBus _dao = new DeclarationDataAdapterSingleBus(); + private ISingleBusInputDataProvider _singleBusInputData; + + public DeclarationModeSingleBusVectoRunDataFactory(ISingleBusInputDataProvider singleBusInputData, IDeclarationReport report) : base(singleBusInputData, report) + { + _singleBusInputData = singleBusInputData; + } + + #region Implementation of IVectoRunDataFactory + + protected override IDeclarationDataAdapter DataAdapter { get { return _dao; } } + + + protected override VectoRunData CreateVectoRunData(IVehicleDeclarationInputData vehicle, int modeIdx, Mission mission, KeyValuePair<LoadingType, Kilogram> loading) + { + var engine = vehicle.Components.EngineInputData; + var engineModes = engine.EngineModes; + var engineMode = engineModes[modeIdx]; + DrivingCycleData cycle; + lock (CyclesCacheLock) { + if (CyclesCache.ContainsKey(mission.MissionType)) { + cycle = CyclesCache[mission.MissionType]; + } else { + cycle = DrivingCycleDataReader.ReadFromStream(mission.CycleFile, CycleType.DistanceBased, "", false); + CyclesCache.Add(mission.MissionType, cycle); + } + } + var simulationRunData = new VectoRunData { + Loading = loading.Key, + VehicleData = DataAdapter.CreateVehicleData(vehicle, mission, loading.Value), + AirdragData = _dao.CreateAirdragData(_singleBusInputData.CompletedVehicle.Components.AirdragInputData, mission, new Segment()), + EngineData = DataAdapter.CreateEngineData(InputDataProvider.JobInputData.Vehicle, engineMode, mission), + GearboxData = _gearboxData, + AxleGearData = _axlegearData, + AngledriveData = _angledriveData, + Aux = DataAdapter.CreateAuxiliaryData(vehicle.Components.AuxiliaryInputData, + vehicle.Components.BusAuxiliaries, mission.MissionType, _segment.VehicleClass, vehicle.Length ?? mission.BusParameter.VehicleLength), + Cycle = new DrivingCycleProxy(cycle, mission.MissionType.ToString()), + Retarder = _retarderData, + DriverData = _driverdata, + ExecutionMode = ExecutionMode.Declaration, + JobName = InputDataProvider.JobInputData.JobName, + ModFileSuffix = (engineModes.Count > 1 ? string.Format("_EngineMode{0}_", modeIdx) : "") + loading.Key.ToString(), + Report = Report, + Mission = mission, + InputDataHash = InputDataProvider.XMLHash, + SimulationType = SimulationType.DistanceCycle, + GearshiftParameters = _gearshiftData, + ShiftStrategy = InputDataProvider.JobInputData.ShiftStrategy + }; + simulationRunData.EngineData.FuelMode = modeIdx; + simulationRunData.VehicleData.VehicleClass = _segment.VehicleClass; + simulationRunData.BusAuxiliaries = _dao.CreateBusAuxiliariesData(mission, _singleBusInputData.PrimaryVehicle, _singleBusInputData.CompletedVehicle, simulationRunData); + return simulationRunData; + } + } + + #endregion +} diff --git a/VectoCore/VectoCore/Models/BusAuxiliaries/BusAuxiliaries.cs b/VectoCore/VectoCore/Models/BusAuxiliaries/BusAuxiliaries.cs index cddcc893d694ec12e667436a70ee1a27dc18f895..588955d56fb1964b3ec286e487578755184481cd 100644 --- a/VectoCore/VectoCore/Models/BusAuxiliaries/BusAuxiliaries.cs +++ b/VectoCore/VectoCore/Models/BusAuxiliaries/BusAuxiliaries.cs @@ -19,6 +19,7 @@ using TUGraz.VectoCore.Models.BusAuxiliaries.DownstreamModules.Impl.HVAC; using TUGraz.VectoCore.Models.BusAuxiliaries.DownstreamModules.Impl.Pneumatics; using TUGraz.VectoCore.Models.BusAuxiliaries.Interfaces; using TUGraz.VectoCore.Models.BusAuxiliaries.Interfaces.DownstreamModules; +using TUGraz.VectoCore.Models.BusAuxiliaries.Interfaces.DownstreamModules.Electrics; using TUGraz.VectoCore.Models.BusAuxiliaries.Util; namespace TUGraz.VectoCore.Models.BusAuxiliaries @@ -54,6 +55,9 @@ namespace TUGraz.VectoCore.Models.BusAuxiliaries private IM6 M6; private IM7 M7; private IM8 M8; + + private ISimpleBattery ElectricStorage; + //private IM9 M9; //private IM10 M10; //private IM11 M11; @@ -79,9 +83,11 @@ namespace TUGraz.VectoCore.Models.BusAuxiliaries //var BusDatabase = FilePathUtils.ResolveFilePath(vectoDirectory, auxConfig.HvacUserInputsConfig.BusDatabasePath); var ssmTool = new SSMTOOL(auxConfig.SSMInputs); + ElectricStorage = new SimpleBattery(auxCfg.ElectricalUserInputsConfig.ElectricStorageCapacity); M0 = new M00Impl(auxConfig.ElectricalUserInputsConfig, Signals, ssmTool.ElectricalWAdjusted); + M0_5 = new M0_5Impl( M0, auxConfig.ElectricalUserInputsConfig, Signals); @@ -95,11 +101,13 @@ namespace TUGraz.VectoCore.Models.BusAuxiliaries M4 = new M04Impl( compressorMap, auxConfig.PneumaticUserInputsConfig.CompressorGearRatio, auxConfig.PneumaticUserInputsConfig.CompressorGearEfficiency, Signals); - M5 = new M05Impl( - M0_5, auxConfig.ElectricalUserInputsConfig.PowerNetVoltage, - auxConfig.ElectricalUserInputsConfig.AlternatorGearEfficiency); + //M5 = new M05Impl( + // M0_5, auxConfig.ElectricalUserInputsConfig.PowerNetVoltage, + // auxConfig.ElectricalUserInputsConfig.AlternatorGearEfficiency); + M5 = new M05Impl_P0(M0, M1, M2, ElectricStorage, auxCfg.ElectricalUserInputsConfig, Signals); M6 = new M06Impl(auxCfg.ElectricalUserInputsConfig, M1, M2, M3, M4, M5, Signals); - M7 = new M07Impl(M5, M6, Signals); + M7 = new M07Impl( + M0, M1, M2, M5, M6, ElectricStorage, auxCfg.ElectricalUserInputsConfig.AlternatorGearEfficiency, Signals); M8 = new M08Impl(auxConfig, M1, M6, M7, Signals); //M9 = new M09Impl(M1, M4, M6, M8, fuelMap, auxConfig.PneumaticAuxillariesConfig, Signals); @@ -142,16 +150,14 @@ namespace TUGraz.VectoCore.Models.BusAuxiliaries public Watt ElectricPowerGenerated { get { - if (!auxConfig.ElectricalUserInputsConfig.SmartElectrical) { - return ElectricPowerConsumerSum; + if (auxConfig.ElectricalUserInputsConfig.SmartElectrical) { + var retVal = auxConfig.PneumaticUserInputsConfig.SmartAirCompression + ? M7.SmartElectricalAndPneumaticAuxAltPowerGenAtCrank + : M7.SmartElectricalOnlyAuxAltPowerGenAtCrank; + return retVal * M0.AlternatorsEfficiency * auxConfig.ElectricalUserInputsConfig.AlternatorGearEfficiency; } - var inIdle = Signals.Idle && (!Signals.ClutchEngaged || Signals.InNeutral); - return - (M6.OverrunFlag && Signals.ClutchEngaged && !Signals.InNeutral ? M6.SmartElecOnlyAltPowerGenAtCrank : 0.SI<Watt>()) - + (inIdle ? M5.AlternatorsGenerationPowerAtCrankIdle() : M5.AlternatorsGenerationPowerAtCrankTractionOn()) * - auxConfig.ElectricalUserInputsConfig.AlternatorGearEfficiency * - auxConfig.ElectricalUserInputsConfig.AlternatorMap.GetEfficiency(Signals.EngineSpeed, 0.SI<Ampere>()); + return M1.AveragePowerDemandAtAlternatorFromHVACElectrics + M2.AveragePowerDemandAtAlternatorFromElectrics; } } @@ -225,7 +231,8 @@ namespace TUGraz.VectoCore.Models.BusAuxiliaries get { return M1.AveragePowerDemandAtCrankFromHVACMechanicals; } } - + public double BatterySOC { get { return ElectricStorage.SOC; } } + public string AuxiliaryName { @@ -249,6 +256,12 @@ namespace TUGraz.VectoCore.Models.BusAuxiliaries //M9.CycleStep(seconds); //M10.CycleStep(seconds); //M11.CycleStep(seconds); + var generatedElPower = + (auxConfig.ElectricalUserInputsConfig.SmartElectrical && auxConfig.PneumaticUserInputsConfig.SmartAirCompression + ? M7.SmartElectricalAndPneumaticAuxAltPowerGenAtCrank + : M7.SmartElectricalOnlyAuxAltPowerGenAtCrank) * M0.AlternatorsEfficiency * + auxConfig.ElectricalUserInputsConfig.AlternatorGearEfficiency; + ElectricStorage.Request(generatedElPower - ElectricPowerConsumerSum, seconds); Signals.CurrentCycleTimeInSeconds += seconds.Value(); } catch (Exception ex) { diff --git a/VectoCore/VectoCore/Models/BusAuxiliaries/DownstreamModules/Impl/Electrics/ElectricsUserInputsConfig.cs b/VectoCore/VectoCore/Models/BusAuxiliaries/DownstreamModules/Impl/Electrics/ElectricsUserInputsConfig.cs index 82086e36c6fd4dbc29f89a849007304b277b29ce..cbd78ef7a77c71d1939417fd0605bc5942f28471 100644 --- a/VectoCore/VectoCore/Models/BusAuxiliaries/DownstreamModules/Impl/Electrics/ElectricsUserInputsConfig.cs +++ b/VectoCore/VectoCore/Models/BusAuxiliaries/DownstreamModules/Impl/Electrics/ElectricsUserInputsConfig.cs @@ -33,7 +33,8 @@ namespace TUGraz.VectoCore.Models.BusAuxiliaries.DownstreamModules.Impl.Electric public Ampere AverageCurrentDemandInclBaseLoad { get; set; } public Ampere AverageCurrentDemandWithoutBaseLoad { get; set; } - + public Watt MaxAlternatorPower { get; set; } + public WattSecond ElectricStorageCapacity { get; set; } } } diff --git a/VectoCore/VectoCore/Models/BusAuxiliaries/DownstreamModules/Impl/Electrics/M05Impl_P0.cs b/VectoCore/VectoCore/Models/BusAuxiliaries/DownstreamModules/Impl/Electrics/M05Impl_P0.cs new file mode 100644 index 0000000000000000000000000000000000000000..c6b904127488d87e120a82588bdee2844dbf55af --- /dev/null +++ b/VectoCore/VectoCore/Models/BusAuxiliaries/DownstreamModules/Impl/Electrics/M05Impl_P0.cs @@ -0,0 +1,72 @@ +using TUGraz.VectoCommon.BusAuxiliaries; +using TUGraz.VectoCommon.Utils; +using TUGraz.VectoCore.Models.BusAuxiliaries.Interfaces.DownstreamModules; +using TUGraz.VectoCore.Models.BusAuxiliaries.Interfaces.DownstreamModules.Electrics; + +namespace TUGraz.VectoCore.Models.BusAuxiliaries.DownstreamModules.Impl.Electrics +{ + public class M05Impl_P0 : IM5_SmartAlternatorSetGeneration + { + private IM2_AverageElectricalLoadDemand _m02; + private IM1_AverageHVACLoadDemand _m01; + private ISimpleBattery _bat; + private IM0_NonSmart_AlternatorsSetEfficiency _m00; + private ISignals _signals; + private double _alternatorGearEfficiency; + private Watt _maxAlternatorPower; + + public M05Impl_P0(IM0_NonSmart_AlternatorsSetEfficiency m0, IM1_AverageHVACLoadDemand m01, IM2_AverageElectricalLoadDemand m02, ISimpleBattery bat, IElectricsUserInputsConfig elCfg, ISignals signals) + { + _m00 = m0; + _m01 = m01; + _m02 = m02; + _bat = bat; + _maxAlternatorPower = elCfg.MaxAlternatorPower; + _alternatorGearEfficiency = elCfg.AlternatorGearEfficiency; + _signals = signals; + } + + #region Implementation of IAbstractModule + + public void ResetCalculations() + { + + } + + #endregion + + #region Implementation of IM5_SmartAlternatorSetGeneration + + public Watt AlternatorsGenerationPowerAtCrankIdle() + { + return (_m02.GetAveragePowerAtCrankFromElectrics() + _m01.AveragePowerDemandAtCrankFromHVACElectrics).LimitTo( + 0.SI<Watt>(), MaxAlternatorPowerAtCrank); + } + + public Watt AlternatorsGenerationPowerAtCrankTractionOn() + { + return (_m02.GetAveragePowerAtCrankFromElectrics() + _m01.AveragePowerDemandAtCrankFromHVACElectrics).LimitTo( + 0.SI<Watt>(), MaxAlternatorPowerAtCrank); + } + + public Watt AlternatorsGenerationPowerAtCrankOverrun() + { + return (_maxAlternatorPower / _m00.AlternatorsEfficiency / _alternatorGearEfficiency).LimitTo( + 0.SI<Watt>(), MaxAlternatorPowerAtCrank); + } + + #endregion + + private Watt MaxAlternatorPowerAtCrank + { + get { + var electricConsumer = _m01.AveragePowerDemandAtAlternatorFromHVACElectrics + + _m02.AveragePowerDemandAtAlternatorFromElectrics; + var maxBatChargePower = (1 - _bat.SOC) * _bat.Capacity / _signals.SimulationInterval + electricConsumer; + + return maxBatChargePower.LimitTo(0.SI<Watt>(), _maxAlternatorPower) / _m00.AlternatorsEfficiency / + _alternatorGearEfficiency; + } + } + } +} diff --git a/VectoCore/VectoCore/Models/BusAuxiliaries/DownstreamModules/Impl/Electrics/SimpleBattery.cs b/VectoCore/VectoCore/Models/BusAuxiliaries/DownstreamModules/Impl/Electrics/SimpleBattery.cs new file mode 100644 index 0000000000000000000000000000000000000000..2353d3424cd040ec5d31fe1aa2fcf6a5681c6704 --- /dev/null +++ b/VectoCore/VectoCore/Models/BusAuxiliaries/DownstreamModules/Impl/Electrics/SimpleBattery.cs @@ -0,0 +1,26 @@ +using TUGraz.VectoCommon.Utils; +using TUGraz.VectoCore.Models.BusAuxiliaries.Interfaces.DownstreamModules.Electrics; + +namespace TUGraz.VectoCore.Models.BusAuxiliaries.DownstreamModules.Impl.Electrics +{ + public class SimpleBattery : ISimpleBattery + { + public SimpleBattery(WattSecond capacity, double soc = 0.9) + { + Capacity = capacity; + SOC = soc; + } + + #region Implementation of ISimpleBattery + + public double SOC { get; private set; } + public WattSecond Capacity { get; } + + #endregion + + public void Request(Watt watt, Second seconds) + { + SOC += watt * seconds / Capacity; + } + } +} diff --git a/VectoCore/VectoCore/Models/BusAuxiliaries/DownstreamModules/Impl/M07Impl.cs b/VectoCore/VectoCore/Models/BusAuxiliaries/DownstreamModules/Impl/M07Impl.cs index cdaf1bad9eca6907fef0f806f08dfd48056d6bf3..9b4989b4af8a1ea937eb563fcf5db149cae1e094 100644 --- a/VectoCore/VectoCore/Models/BusAuxiliaries/DownstreamModules/Impl/M07Impl.cs +++ b/VectoCore/VectoCore/Models/BusAuxiliaries/DownstreamModules/Impl/M07Impl.cs @@ -1,6 +1,7 @@ using TUGraz.VectoCommon.BusAuxiliaries; using TUGraz.VectoCommon.Utils; using TUGraz.VectoCore.Models.BusAuxiliaries.Interfaces.DownstreamModules; +using TUGraz.VectoCore.Models.BusAuxiliaries.Interfaces.DownstreamModules.Electrics; namespace TUGraz.VectoCore.Models.BusAuxiliaries.DownstreamModules.Impl { @@ -14,22 +15,40 @@ namespace TUGraz.VectoCore.Models.BusAuxiliaries.DownstreamModules.Impl protected IM5_SmartAlternatorSetGeneration _m5; protected IM6 _m6; protected readonly ISignals _signals; + private ISimpleBattery _bat; + private IM2_AverageElectricalLoadDemand _m2; + private IM1_AverageHVACLoadDemand _m1; + private IM0_NonSmart_AlternatorsSetEfficiency _m0; + private double _alternatorGearEfficiency; - public M07Impl(IM5_SmartAlternatorSetGeneration m5, IM6 m6, ISignals signals) + public M07Impl(IM0_NonSmart_AlternatorsSetEfficiency m0, IM1_AverageHVACLoadDemand m1, IM2_AverageElectricalLoadDemand m2, IM5_SmartAlternatorSetGeneration m5, IM6 m6, ISimpleBattery bat, double alternatorGearEfficiency, ISignals signals) { _m5 = m5; _m6 = m6; _signals = signals; + _bat = bat; + _m0 = m0; + _m1 = m1; + _m2 = m2; + _alternatorGearEfficiency = alternatorGearEfficiency; } protected override void DoCalculate() { - var idle = _signals.EngineSpeed <= _signals.EngineIdleSpeed && - (!_signals.ClutchEngaged || _signals.InNeutral); + //var idle = _signals.EngineSpeed <= _signals.EngineIdleSpeed && + // (!_signals.ClutchEngaged || _signals.InNeutral); - var sw1 = idle - ? _m5.AlternatorsGenerationPowerAtCrankIdle() - : _m5.AlternatorsGenerationPowerAtCrankTractionOn(); + //var sw1 = idle + // ? _m5.AlternatorsGenerationPowerAtCrankIdle() + // : _m5.AlternatorsGenerationPowerAtCrankTractionOn(); + + var maxBatPower = _bat.SOC * _bat.Capacity / _signals.SimulationInterval; + var elConsumerPower = _m1.AveragePowerDemandAtAlternatorFromHVACElectrics + + _m2.AveragePowerDemandAtAlternatorFromElectrics; + + var sw1 = maxBatPower > elConsumerPower + ? 0.SI<Watt>() + : (elConsumerPower - maxBatPower) / _m0.AlternatorsEfficiency / _alternatorGearEfficiency; var c1 = _m6.OverrunFlag && _signals.ClutchEngaged && _signals.InNeutral == false; var sw2 = c1 ? _m6.SmartElecAndPneumaticAltPowerGenAtCrank : sw1; diff --git a/VectoCore/VectoCore/Models/BusAuxiliaries/Interfaces/DownstreamModules/Electrics/ISimpleBattery.cs b/VectoCore/VectoCore/Models/BusAuxiliaries/Interfaces/DownstreamModules/Electrics/ISimpleBattery.cs new file mode 100644 index 0000000000000000000000000000000000000000..8bb6bf9eb9c03fe36827705cb5ac241cb3dfe2c9 --- /dev/null +++ b/VectoCore/VectoCore/Models/BusAuxiliaries/Interfaces/DownstreamModules/Electrics/ISimpleBattery.cs @@ -0,0 +1,9 @@ +using TUGraz.VectoCommon.Utils; + +namespace TUGraz.VectoCore.Models.BusAuxiliaries.Interfaces.DownstreamModules.Electrics { + public interface ISimpleBattery { + double SOC { get; } + WattSecond Capacity { get; } + void Request(Watt watt, Second seconds); + } +} \ No newline at end of file diff --git a/VectoCore/VectoCore/Models/BusAuxiliaries/Interfaces/IBusAuxiliaries.cs b/VectoCore/VectoCore/Models/BusAuxiliaries/Interfaces/IBusAuxiliaries.cs index 249e1764b70808c21216020144e03b768370165a..154801d4f23549de3cfba6e5b27b9f6e5a0dd482 100644 --- a/VectoCore/VectoCore/Models/BusAuxiliaries/Interfaces/IBusAuxiliaries.cs +++ b/VectoCore/VectoCore/Models/BusAuxiliaries/Interfaces/IBusAuxiliaries.cs @@ -11,6 +11,7 @@ using TUGraz.VectoCommon.BusAuxiliaries; using TUGraz.VectoCommon.Utils; +using TUGraz.VectoCore.Models.Simulation.Data; namespace TUGraz.VectoCore.Models.BusAuxiliaries.Interfaces { @@ -104,6 +105,7 @@ namespace TUGraz.VectoCore.Models.BusAuxiliaries.Interfaces Watt PSPowerCompressorDragOnly { get; } Watt HVACMechanicalPowerConsumer { get; } Watt HVACMechanicalPowerGenerated { get; } + double BatterySOC { get; } ///// <summary> diff --git a/VectoCore/VectoCore/Models/Simulation/Data/ModalResultField.cs b/VectoCore/VectoCore/Models/Simulation/Data/ModalResultField.cs index a5ea09d349c669398aefaa7c981a3a0ab22165d0..d335e24b54c4b6d59bcdf673f1b261576c463568 100644 --- a/VectoCore/VectoCore/Models/Simulation/Data/ModalResultField.cs +++ b/VectoCore/VectoCore/Models/Simulation/Data/ModalResultField.cs @@ -288,6 +288,9 @@ namespace TUGraz.VectoCore.Models.Simulation.Data [ModalResultField(typeof(SI), caption: "P_busAux_HVACmech_gen [kW]", outputFactor: 1e-3)] P_busAux_HVACmech_gen, + [ModalResultField(typeof(double), caption:"Battery SoC")] BatterySOC, + + /// <summary> /// [-] true/false indicate whether torque converter is locked or not (only applicable for gears with TC) /// </summary> @@ -364,7 +367,7 @@ namespace TUGraz.VectoCore.Models.Simulation.Data [ModalResultField(typeof(SI), "P_WHR_el [kW]", outputFactor:1e-3)] P_WHR_el_map, [ModalResultField(typeof(SI), "P_WHR_el_corr [kW]", outputFactor: 1e-3)] P_WHR_el_corr, [ModalResultField(typeof(SI), "P_WHR_mech [kW]", outputFactor: 1e-3)] P_WHR_mech_map, - [ModalResultField(typeof(SI), "P_WHR_mech_corr [kW]", outputFactor: 1e-3)] P_WHR_mech_corr + [ModalResultField(typeof(SI), "P_WHR_mech_corr [kW]", outputFactor: 1e-3)] P_WHR_mech_corr, } [AttributeUsage(AttributeTargets.Field)] diff --git a/VectoCore/VectoCore/Models/SimulationComponent/Impl/BusAuxiliariesAdapter.cs b/VectoCore/VectoCore/Models/SimulationComponent/Impl/BusAuxiliariesAdapter.cs index a9bdd2c1e85dc8f105decb3bebf950a0572f97cc..f3d397b1a38fb7e9f2addef2065481abdf83392c 100644 --- a/VectoCore/VectoCore/Models/SimulationComponent/Impl/BusAuxiliariesAdapter.cs +++ b/VectoCore/VectoCore/Models/SimulationComponent/Impl/BusAuxiliariesAdapter.cs @@ -160,6 +160,8 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl container[ModalResultField.P_busAux_ES_generated] = Auxiliaries.ElectricPowerGenerated; container[ModalResultField.P_busAux_ES_sum_mech] = Auxiliaries.ElectricPowerDemandMech; + container[ModalResultField.BatterySOC] = Auxiliaries.BatterySOC * 100.0; + container[ModalResultField.Nl_busAux_PS_consumer] = Auxiliaries.PSDemandConsumer; container[ModalResultField.Nl_busAux_PS_generated] = Auxiliaries.PSAirGenerated; container[ModalResultField.Nl_busAux_PS_generated_alwaysOn] = Auxiliaries.PSAirGeneratedAlwaysOn; diff --git a/VectoCore/VectoCore/OutputData/ModalDataContainer.cs b/VectoCore/VectoCore/OutputData/ModalDataContainer.cs index edc47df58c33ece71acac1a12c79cac43d095d89..4f57ddf918968d7fe0dfea3b1cd24b5d228543d5 100644 --- a/VectoCore/VectoCore/OutputData/ModalDataContainer.cs +++ b/VectoCore/VectoCore/OutputData/ModalDataContainer.cs @@ -404,6 +404,7 @@ namespace TUGraz.VectoCore.OutputData ModalResultField.P_busAux_ES_consumer_sum, ModalResultField.P_busAux_ES_sum_mech, ModalResultField.P_busAux_ES_generated, + ModalResultField.BatterySOC, ModalResultField.P_busAux_HVACmech_consumer, ModalResultField.P_busAux_HVACmech_gen, ModalResultField.Nl_busAux_PS_consumer, diff --git a/VectoCore/VectoCore/VectoCore.csproj b/VectoCore/VectoCore/VectoCore.csproj index 0c2b8ef23b2395234a8fe8164a1395c7e0cdd3c5..7cecd0a652b6825ba85aedd0a64a3025a1c4ee2b 100644 --- a/VectoCore/VectoCore/VectoCore.csproj +++ b/VectoCore/VectoCore/VectoCore.csproj @@ -275,6 +275,9 @@ <Compile Include="InputData\FileIO\XML\Declaration\IXMLDeclarationInputDataReader.cs" /> <Compile Include="InputData\FileIO\XML\IXMLInputDataReader.cs" /> <Compile Include="InputData\FileIO\XML\XMLInputDataNinjectModule.cs" /> + <Compile Include="Models\BusAuxiliaries\DownstreamModules\Impl\Electrics\SimpleBattery.cs" /> + <Compile Include="Models\BusAuxiliaries\Interfaces\DownstreamModules\Electrics\ISimpleBattery.cs" /> + <Compile Include="Models\BusAuxiliaries\DownstreamModules\Impl\Electrics\M05Impl_P0.cs" /> <Compile Include="Models\BusAuxiliaries\DownstreamModules\Impl\Electrics\SimpleAlternator.cs" /> <Compile Include="Models\BusAuxiliaries\DownstreamModules\Impl\HVAC\TechnologyBenefits.cs" /> <Compile Include="Models\Declaration\ADASCombination.cs" /> diff --git a/VectoCore/VectoCoreTest/TestData/XML/XMLReaderDeclaration/SchemaVersion2.6_Buses/vecto_vehicle-primary_heavyBus.xml b/VectoCore/VectoCoreTest/TestData/XML/XMLReaderDeclaration/SchemaVersion2.6_Buses/vecto_vehicle-primary_heavyBus.xml index e4a6d99d426647add3978e1b34e6667846d4fa50..d081ce1d2fefbcf295858909d41688071b5065a0 100644 --- a/VectoCore/VectoCoreTest/TestData/XML/XMLReaderDeclaration/SchemaVersion2.6_Buses/vecto_vehicle-primary_heavyBus.xml +++ b/VectoCore/VectoCoreTest/TestData/XML/XMLReaderDeclaration/SchemaVersion2.6_Buses/vecto_vehicle-primary_heavyBus.xml @@ -3265,9 +3265,9 @@ </SteeringPump> <ElectricSystem> <AlternatorTechnology ratio="1.000">default</AlternatorTechnology> - <SmartElectrics>false</SmartElectrics> - <MaxAlternatorPower>10000</MaxAlternatorPower> - <ElectricStorageCapacity>800</ElectricStorageCapacity> + <SmartElectrics>true</SmartElectrics> + <MaxAlternatorPower>15000</MaxAlternatorPower> + <ElectricStorageCapacity>50</ElectricStorageCapacity> </ElectricSystem> <PneumaticSystem> <SizeOfAirSupply>Large Supply 2-stage</SizeOfAirSupply>