diff --git a/VectoCore/VectoCore/InputData/FileIO/XML/Declaration/DataProvider/XMLDeclarationVehicleDataProvider.cs b/VectoCore/VectoCore/InputData/FileIO/XML/Declaration/DataProvider/XMLDeclarationVehicleDataProvider.cs index 29c5840b343aae89e852eeee13dbb4efb18726b6..dceb6d9d50d113abc5435f8fa5a104d33fa6fed1 100644 --- a/VectoCore/VectoCore/InputData/FileIO/XML/Declaration/DataProvider/XMLDeclarationVehicleDataProvider.cs +++ b/VectoCore/VectoCore/InputData/FileIO/XML/Declaration/DataProvider/XMLDeclarationVehicleDataProvider.cs @@ -817,7 +817,7 @@ namespace TUGraz.VectoCore.InputData.FileIO.XML.Declaration.DataProvider public override TankSystem? TankSystem { - get { return GetString(XMLNames.Vehicle_NgTankSystem).ParseEnum<TankSystem>(); } + get { return ElementExists(XMLNames.Vehicle_NgTankSystem) ? GetString(XMLNames.Vehicle_NgTankSystem).ParseEnum<TankSystem>() : (TankSystem?)null; } } public override int NumberOfPassengersLowerDeck diff --git a/VectoCore/VectoCore/Models/BusAuxiliaries/BusAuxiliaries.cs b/VectoCore/VectoCore/Models/BusAuxiliaries/BusAuxiliaries.cs index eb60207f4049016ee70dbdfd06c8794d5272729f..830ca75cd998b320297dd374373aec0cda4bf5a3 100644 --- a/VectoCore/VectoCore/Models/BusAuxiliaries/BusAuxiliaries.cs +++ b/VectoCore/VectoCore/Models/BusAuxiliaries/BusAuxiliaries.cs @@ -286,7 +286,11 @@ namespace TUGraz.VectoCore.Models.BusAuxiliaries ? M7.SmartElectricalAndPneumaticAuxAltPowerGenAtCrank : M7.SmartElectricalOnlyAuxAltPowerGenAtCrank) * M0.AlternatorsEfficiency * auxConfig.ElectricalUserInputsConfig.AlternatorGearEfficiency; - ElectricStorage.Request((generatedElPower - ElectricPowerConsumerSum) * essFactor, seconds); + var energy = (generatedElPower - ElectricPowerConsumerSum) * essFactor * seconds; + var maxCharge = (ElectricStorage.SOC - 1) * ElectricStorage.Capacity; + var maxDischarge = ElectricStorage.SOC * ElectricStorage.Capacity; + var batEnergy = energy.LimitTo(maxCharge, maxDischarge); + ElectricStorage.Request(batEnergy); } Signals.CurrentCycleTimeInSeconds += seconds.Value(); } catch (Exception ex) { diff --git a/VectoCore/VectoCore/Models/BusAuxiliaries/DownstreamModules/Impl/Electrics/SimpleBattery.cs b/VectoCore/VectoCore/Models/BusAuxiliaries/DownstreamModules/Impl/Electrics/SimpleBattery.cs index 2353d3424cd040ec5d31fe1aa2fcf6a5681c6704..a7b5b9fc981d6b79a5c8a25736ce51e396d87420 100644 --- a/VectoCore/VectoCore/Models/BusAuxiliaries/DownstreamModules/Impl/Electrics/SimpleBattery.cs +++ b/VectoCore/VectoCore/Models/BusAuxiliaries/DownstreamModules/Impl/Electrics/SimpleBattery.cs @@ -1,9 +1,10 @@ -using TUGraz.VectoCommon.Utils; +using TUGraz.VectoCommon.Models; +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 class SimpleBattery : LoggingObject, ISimpleBattery { public SimpleBattery(WattSecond capacity, double soc = 0.9) { @@ -18,9 +19,17 @@ namespace TUGraz.VectoCore.Models.BusAuxiliaries.DownstreamModules.Impl.Electric #endregion - public void Request(Watt watt, Second seconds) + public void Request(WattSecond energy) { - SOC += watt * seconds / Capacity; + SOC += energy / Capacity; + if (SOC > 1) { + Log.Warn("SOC > 1!"); + SOC = 1; + } + if (SOC < 0) { + Log.Warn("SOC < 0!"); + SOC = 0; + } } } } diff --git a/VectoCore/VectoCore/Models/BusAuxiliaries/Interfaces/DownstreamModules/Electrics/ISimpleBattery.cs b/VectoCore/VectoCore/Models/BusAuxiliaries/Interfaces/DownstreamModules/Electrics/ISimpleBattery.cs index 8bb6bf9eb9c03fe36827705cb5ac241cb3dfe2c9..c33d28d8f08fdd26bccfd74a604c548d2b1ffe09 100644 --- a/VectoCore/VectoCore/Models/BusAuxiliaries/Interfaces/DownstreamModules/Electrics/ISimpleBattery.cs +++ b/VectoCore/VectoCore/Models/BusAuxiliaries/Interfaces/DownstreamModules/Electrics/ISimpleBattery.cs @@ -4,6 +4,6 @@ namespace TUGraz.VectoCore.Models.BusAuxiliaries.Interfaces.DownstreamModules.El public interface ISimpleBattery { double SOC { get; } WattSecond Capacity { get; } - void Request(Watt watt, Second seconds); + void Request(WattSecond energy); } } \ No newline at end of file diff --git a/VectoCore/VectoCore/Models/SimulationComponent/Impl/BusAuxiliariesAdapter.cs b/VectoCore/VectoCore/Models/SimulationComponent/Impl/BusAuxiliariesAdapter.cs index 3d83f90df5bec6c576ee1c445c06fafdface4cce..0212cc41b9c1760bee98f058cd6c5e4bfca10285 100644 --- a/VectoCore/VectoCore/Models/SimulationComponent/Impl/BusAuxiliariesAdapter.cs +++ b/VectoCore/VectoCore/Models/SimulationComponent/Impl/BusAuxiliariesAdapter.cs @@ -54,6 +54,7 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl private double EngineStopStartUtilityFactor; private bool SmartElectricSystem; + private IAuxiliaryConfig AuxCfg; //private readonly FuelConsumptionAdapter _fcMapAdapter; @@ -67,7 +68,7 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl PreviousState = new BusAuxState { AngularSpeed = container.EngineIdleSpeed }; AdditionalAux = additionalAux; - + AuxCfg = auxiliaryConfig; DataBus = container; var tmpAux = new BusAuxiliaries.BusAuxiliaries(container.ModalData); @@ -123,7 +124,20 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl var signals = Auxiliaries.Signals; signals.EngineStopped = false; signals.VehicleStopped = false; - return GetBusAuxPowerDemand(time, simulationInterval, 0.SI<NewtonMeter>(), 0.SI<NewtonMeter>(), engineSpeed, true); + var retVal = GetBusAuxPowerDemand(time, simulationInterval, 0.SI<NewtonMeter>(), 0.SI<NewtonMeter>(), engineSpeed, true); + + if (!SmartElectricSystem) { + return retVal; + } + + var batteryPwr = Auxiliaries.BatterySOC * AuxCfg.ElectricalUserInputsConfig.ElectricStorageCapacity / simulationInterval; + var esSum = Auxiliaries.ElectricPowerConsumerSum; + //if (batteryPwr < esSum) { + retVal += (esSum ) / AuxCfg.ElectricalUserInputsConfig.AlternatorGearEfficiency / + AuxCfg.ElectricalUserInputsConfig.AlternatorMap.GetEfficiency(0.RPMtoRad(), 0.SI<Ampere>()); + //} + + return retVal; } public Watt PowerDemandEngineOff(Second absTime, Second dt) @@ -145,7 +159,8 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl CurrentState.PowerDemand = ((AdditionalAux?.PowerDemandEngineOn(absTime, dt, DataBus.EngineIdleSpeed) ?? 0.SI<Watt>()) + busAuxPowerDemand) * (1 - EngineStopStartUtilityFactor); - + //CurrentState.ESPowerGeneratedICE_On = Auxiliaries.ElectricPowerGenerated; + //CurrentState.ESPowerMech = Auxiliaries.ElectricPowerDemandMech; // signals.EngineStopped = !DataBus.IgnitionOn; signals.VehicleStopped = DataBus.VehicleStopped; @@ -158,15 +173,21 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl } - protected internal virtual void DoWriteModalResults(IModalDataContainer container) + protected internal virtual void DoWriteModalResults(Second absTime, Second dt, IModalDataContainer container) { var essUtilityFactor = 1.0; if (!DataBus.IgnitionOn) { essUtilityFactor = 1 - EngineStopStartUtilityFactor; } + //var signals = Auxiliaries.Signals; + //signals.EngineStopped = !DataBus.IgnitionOn; + //signals.VehicleStopped = DataBus.VehicleStopped; + // cycleStep has to be called here and not in DoCommit, write is called before Commit! - Auxiliaries.CycleStep(CurrentState.dt, essUtilityFactor); + var oldSOC = Auxiliaries.BatterySOC; + Auxiliaries.CycleStep(CurrentState.dt, EngineStopStartUtilityFactor); + var newSOC = Auxiliaries.BatterySOC; //CurrentState.TotalFuelConsumption = Auxiliaries.TotalFuel; container[ModalResultField.P_aux] = CurrentState.PowerDemand; @@ -179,6 +200,16 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl if (SmartElectricSystem) { container[ModalResultField.BatterySOC] = Auxiliaries.BatterySOC * 100.0; + + container[ModalResultField.P_busAux_ES_generated] = essUtilityFactor * Auxiliaries.ElectricPowerConsumerSum; + container[ModalResultField.P_busAux_ES_sum_mech] = essUtilityFactor * Auxiliaries.ElectricPowerConsumerSum / + AuxCfg.ElectricalUserInputsConfig.AlternatorGearEfficiency / + AuxCfg.ElectricalUserInputsConfig.AlternatorMap.GetEfficiency(0.RPMtoRad(), 0.SI<Ampere>()); + + var batteryPwr = (oldSOC - newSOC) * AuxCfg.ElectricalUserInputsConfig.ElectricStorageCapacity / dt; + if (batteryPwr.IsSmaller(Auxiliaries.ElectricPowerConsumerSum * EngineStopStartUtilityFactor)) { + // add to P_aux_ES + } } container[ModalResultField.Nl_busAux_PS_consumer] = Auxiliaries.PSDemandConsumer; diff --git a/VectoCore/VectoCore/Models/SimulationComponent/Impl/CombustionEngine.cs b/VectoCore/VectoCore/Models/SimulationComponent/Impl/CombustionEngine.cs index aec905d30536b4a0e08f12dc5b76485911c2f0e9..88a9cc41e2a67fcdb0a232c0c6f3083e50a1be20 100644 --- a/VectoCore/VectoCore/Models/SimulationComponent/Impl/CombustionEngine.cs +++ b/VectoCore/VectoCore/Models/SimulationComponent/Impl/CombustionEngine.cs @@ -423,7 +423,7 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl //var fcAAUX = fcWHTC; var advancedAux = EngineAux as BusAuxiliariesAdapter; if (advancedAux != null) { - advancedAux.DoWriteModalResults(container); + advancedAux.DoWriteModalResults(time, simulationInterval ,container); //fcAAUX = advancedAux.AAuxFuelConsumption; } var fcFinal = fcWHTC; // fcAAUX; diff --git a/VectoCore/VectoCore/Models/SimulationComponent/Impl/StopStartCombustionEngine.cs b/VectoCore/VectoCore/Models/SimulationComponent/Impl/StopStartCombustionEngine.cs index 3d042f6bb016631f7d1cb413b6c09aed6693347e..d26d5089cd27d6db016407427d55941fac91c8a8 100644 --- a/VectoCore/VectoCore/Models/SimulationComponent/Impl/StopStartCombustionEngine.cs +++ b/VectoCore/VectoCore/Models/SimulationComponent/Impl/StopStartCombustionEngine.cs @@ -127,7 +127,7 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl { var advancedAux = EngineAux as BusAuxiliariesAdapter; if (advancedAux != null) { //throw new VectoException("Engine Stop/Start with advanced auxiliaries not supported!"); - advancedAux.DoWriteModalResults(container); + advancedAux.DoWriteModalResults(time, simulationInterval, container); //fcAAUX = advancedAux.AAuxFuelConsumption; } diff --git a/VectoCore/VectoCoreTest/Integration/BusAuxiliaries/AuxDemandTest.cs b/VectoCore/VectoCoreTest/Integration/BusAuxiliaries/AuxDemandTest.cs index 8bc8e3596668b96c8e83b01acb576df910f64f80..b48074fe15e729b86a70a0b7fd8c28de8ef569dd 100644 --- a/VectoCore/VectoCoreTest/Integration/BusAuxiliaries/AuxDemandTest.cs +++ b/VectoCore/VectoCoreTest/Integration/BusAuxiliaries/AuxDemandTest.cs @@ -97,7 +97,7 @@ namespace TUGraz.VectoCore.Tests.Integration.BusAuxiliaries var torque = busAux.TorqueDemand(0.SI<Second>(), 1.SI<Second>(), engineDrivelinePower / engineSpeed, (internalPower * 1000).SI<Watt>() / engineSpeed, engineSpeed); Assert.AreEqual(6087.03221, (torque * engineSpeed).Value(), 1e-3); - busAux.DoWriteModalResults(modalData); + busAux.DoWriteModalResults(0.SI<Second>(), 1.SI<Second>(), modalData); busAux.DoCommitSimulationStep(); } @@ -110,7 +110,7 @@ namespace TUGraz.VectoCore.Tests.Integration.BusAuxiliaries var torque = busAux.TorqueDemand(0.SI<Second>(), 1.SI<Second>(), engineDrivelinePower / engineSpeed, (internalPower * 1000).SI<Watt>() / engineSpeed, engineSpeed); Assert.AreEqual(8954.1429, (torque * engineSpeed).Value(), 1e-3); - busAux.DoWriteModalResults(modalData); + busAux.DoWriteModalResults(0.SI<Second>(), 1.SI<Second>(), modalData); busAux.DoCommitSimulationStep(); } @@ -123,7 +123,7 @@ namespace TUGraz.VectoCore.Tests.Integration.BusAuxiliaries var torque = busAux.TorqueDemand(0.SI<Second>(), 1.SI<Second>(), engineDrivelinePower / engineSpeed, (internalPower * 1000).SI<Watt>() / engineSpeed, engineSpeed); Assert.AreEqual(6087.03221, (torque * engineSpeed).Value(), 1e-3); - busAux.DoWriteModalResults(modalData); + busAux.DoWriteModalResults(0.SI<Second>(), 1.SI<Second>(), modalData); busAux.DoCommitSimulationStep(); }