diff --git a/VectoCore/VectoCore/Models/SimulationComponent/IAuxPort.cs b/VectoCore/VectoCore/Models/SimulationComponent/IAuxPort.cs index 3574b1494107089a62144b209aa4483886bb713f..8ffddbf456c1cf2f3f9c42112a21cddca1f8df29 100644 --- a/VectoCore/VectoCore/Models/SimulationComponent/IAuxPort.cs +++ b/VectoCore/VectoCore/Models/SimulationComponent/IAuxPort.cs @@ -49,9 +49,9 @@ namespace TUGraz.VectoCore.Models.SimulationComponent NewtonMeter TorqueDemand(Second absTime, Second dt, NewtonMeter torquePowerTrain, PerSecond angularSpeed, bool dryRun = false); - Watt PowerDemandEngineOn(Second time, Second simulationInterval, PerSecond engineSpeed); + Watt PowerDemandESSEngineOn(Second time, Second simulationInterval, PerSecond engineSpeed); - Watt PowerDemandEngineOff(Second absTime, Second dt); + Watt PowerDemandESSEngineOff(Second absTime, Second dt); } } \ 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 4cda44042f6f7989a09b001ca35aeffd8b444d4d..334cba46251a326d7868be32923877fdc1867b1a 100644 --- a/VectoCore/VectoCore/Models/SimulationComponent/Impl/BusAuxiliariesAdapter.cs +++ b/VectoCore/VectoCore/Models/SimulationComponent/Impl/BusAuxiliariesAdapter.cs @@ -119,12 +119,12 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl AdditionalAux?.Initialize(torque, angularSpeed); DCDCConverter?.Initialize(); PreviousState.PowerDemand = GetBusAuxPowerDemand(0.SI<Second>(), 1.SI<Second>(), torque, angularSpeed) + - (AdditionalAux?.PowerDemandEngineOn(0.SI<Second>(), 1.SI<Second>(), angularSpeed) ?? 0.SI<Watt>()); + (AdditionalAux?.PowerDemandESSEngineOn(0.SI<Second>(), 1.SI<Second>(), angularSpeed) ?? 0.SI<Watt>()); return PreviousState.PowerDemand / angularSpeed; } - public NewtonMeter TorqueDemand(Second absTime, Second dt, NewtonMeter torquePowerTrain, PerSecond angularSpeed, bool dryRun = false) + public virtual NewtonMeter TorqueDemand(Second absTime, Second dt, NewtonMeter torquePowerTrain, PerSecond angularSpeed, bool dryRun = false) { CurrentState.AngularSpeed = angularSpeed; CurrentState.dt = dt; @@ -135,26 +135,55 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl signals.VehicleStopped = false; CurrentState.PowerDemand = GetBusAuxPowerDemand(absTime, dt, torquePowerTrain, angularSpeed, dryRun) + - (AdditionalAux?.PowerDemandEngineOn(0.SI<Second>(), 1.SI<Second>(), angularSpeed) ?? 0.SI<Watt>()); + (AdditionalAux?.PowerDemandESSEngineOn(0.SI<Second>(), 1.SI<Second>(), angularSpeed) ?? 0.SI<Watt>()); var avgAngularSpeed = (CurrentState.AngularSpeed + PreviousState.AngularSpeed) / 2.0; return CurrentState.PowerDemand / avgAngularSpeed; } - public Watt PowerDemandEngineOn(Second time, Second simulationInterval, PerSecond engineSpeed) + public virtual Watt PowerDemandESSEngineOn(Second time, Second simulationInterval, PerSecond engineSpeed) { var signals = Auxiliaries.Signals; - signals.EngineStopped = false; - signals.VehicleStopped = false; + signals.EngineStopped = false; + signals.VehicleStopped = DataBus.VehicleInfo.VehicleStopped; + + var busAuxPwrICEOn = GetBusAuxPowerDemand(time, simulationInterval, 0.SI<NewtonMeter>(), engineSpeed, true); + var esICEOnLoad = Auxiliaries.ElectricPowerConsumerSum; + + signals.EngineStopped = true; + var busAuxPwrICEOff = GetBusAuxPowerDemand(time, simulationInterval, 0.SI<NewtonMeter>(), engineSpeed, true); + var esICEOffLoad = Auxiliaries.ElectricPowerConsumerSum; + + // if busAuxPwrICEOn and busAuxPwrICEOff are different the battery is empty and the mechanical power is the difference + // if both are equal we need to add the difference between ES ICE On and ES ICE Off power demand (the latter is corrected by ES correction) + var esMech = (busAuxPwrICEOn - busAuxPwrICEOff).IsEqual(0) + ? (esICEOnLoad - esICEOffLoad) / AuxCfg.ElectricalUserInputsConfig.AlternatorGearEfficiency / + AuxCfg.ElectricalUserInputsConfig.AlternatorMap.GetEfficiency(0.RPMtoRad(), 0.SI<Ampere>()) + : 0.SI<Watt>(); + + return busAuxPwrICEOff + esMech - Auxiliaries.ElectricPowerDemandMech + (busAuxPwrICEOn - busAuxPwrICEOff) + + (AdditionalAux?.PowerDemandESSEngineOn(0.SI<Second>(), 1.SI<Second>(), engineSpeed) ?? + 0.SI<Watt>()); + } + + protected virtual Watt ComputePowerDemand(Second time, Second simulationInterval, PerSecond engineSpeed, bool includeESBaseLoad = true) + { + var signals = Auxiliaries.Signals; + //signals.EngineStopped = true; + //signals.VehicleStopped = DataBus.VehicleInfo.VehicleStopped; + var esBaseLoad = Auxiliaries.ElectricPowerConsumerSum; + + //signals.EngineStopped = false; + //signals.VehicleStopped = false; var retVal = GetBusAuxPowerDemand(time, simulationInterval, 0.SI<NewtonMeter>(), engineSpeed, true) + - (AdditionalAux?.PowerDemandEngineOn(0.SI<Second>(), 1.SI<Second>(), engineSpeed) ?? 0.SI<Watt>()); + (AdditionalAux?.PowerDemandESSEngineOn(0.SI<Second>(), 1.SI<Second>(), engineSpeed) ?? 0.SI<Watt>()); if (!SmartElectricSystem) { return retVal; } //var batteryPwr = ElectricStorage.SOC * AuxCfg.ElectricalUserInputsConfig.ElectricStorageCapacity / simulationInterval; - var esSum = Auxiliaries.ElectricPowerConsumerSum; + var esSum = Auxiliaries.ElectricPowerConsumerSum - esBaseLoad; //if (batteryPwr < esSum) { retVal += (esSum ) / AuxCfg.ElectricalUserInputsConfig.AlternatorGearEfficiency / AuxCfg.ElectricalUserInputsConfig.AlternatorMap.GetEfficiency(0.RPMtoRad(), 0.SI<Ampere>()); @@ -163,40 +192,33 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl return retVal; } - public Watt PowerDemandEngineOff(Second absTime, Second dt) + public virtual Watt PowerDemandESSEngineOff(Second absTime, Second dt) { - CurrentState.AngularSpeed = DataBus.EngineInfo.EngineIdleSpeed; - CurrentState.dt = dt; + //CurrentState.AngularSpeed = DataBus.EngineInfo.EngineIdleSpeed; + //CurrentState.dt = dt; var signals = Auxiliaries.Signals; - //// set internal state of power demand as if ICE is on - multiplied by (1-ESS_UF) - //signals.EngineStopped = false; - //signals.VehicleStopped = false; - - //// get busaux PowerDemand without additional Auxiliaries first. - //var conventionalAux = AdditionalAux; - //AdditionalAux = null; signals.EngineStopped = !DataBus.EngineCtl.CombustionEngineOn; signals.VehicleStopped = DataBus.VehicleInfo.VehicleStopped; var busAuxPowerDemand = GetBusAuxPowerDemand( - absTime, dt, 0.SI<NewtonMeter>(), DataBus.EngineInfo.EngineIdleSpeed); - //AdditionalAux = conventionalAux; - - CurrentState.PowerDemand = ((AdditionalAux?.PowerDemandEngineOn(absTime, dt, DataBus.EngineInfo.EngineIdleSpeed) ?? 0.SI<Watt>()) + - busAuxPowerDemand) * (1 - EngineStopStartUtilityFactor); - //CurrentState.ESPowerGeneratedICE_On = Auxiliaries.ElectricPowerGenerated; - //CurrentState.ESPowerMech = Auxiliaries.ElectricPowerDemandMech; - // - + absTime, dt, 0.SI<NewtonMeter>(), DataBus.EngineInfo.EngineIdleSpeed) - Auxiliaries.ElectricPowerDemandMech; + //AdditionalAux = conventionalAux; + + CurrentState.PowerDemand = ((AdditionalAux?.PowerDemandESSEngineOn(absTime, dt, DataBus.EngineInfo.EngineIdleSpeed) ?? 0.SI<Watt>()) + + busAuxPowerDemand) * (1 - EngineStopStartUtilityFactor); + //CurrentState.ESPowerGeneratedICE_On = Auxiliaries.ElectricPowerGenerated; + //CurrentState.ESPowerMech = Auxiliaries.ElectricPowerDemandMech; + // + - //busAuxPowerDemand = GetBusAuxPowerDemand( - // absTime, dt, 0.SI<NewtonMeter>(), DataBus.EngineInfo.EngineIdleSpeed); - //AdditionalAux = conventionalAux; + //busAuxPowerDemand = GetBusAuxPowerDemand( + // absTime, dt, 0.SI<NewtonMeter>(), DataBus.EngineInfo.EngineIdleSpeed); + //AdditionalAux = conventionalAux; - return EngineStopStartUtilityFactor * (busAuxPowerDemand + (AdditionalAux?.PowerDemandEngineOff(absTime, dt) ?? 0.SI<Watt>())); + return EngineStopStartUtilityFactor * (busAuxPowerDemand + (AdditionalAux?.PowerDemandESSEngineOff(absTime, dt) ?? 0.SI<Watt>())); } @@ -210,13 +232,13 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl essUtilityFactor = 1 - EngineStopStartUtilityFactor; } - //var signals = Auxiliaries.Signals; - //signals.EngineStopped = !DataBus.IgnitionOn; - //signals.VehicleStopped = DataBus.VehicleStopped; + var signals = Auxiliaries.Signals; + signals.EngineStopped = !DataBus.EngineCtl.CombustionEngineOn; + signals.VehicleStopped = DataBus.VehicleInfo.VehicleStopped; - // cycleStep has to be called here and not in DoCommit, write is called before Commit! - //var oldSOC = Auxiliaries.BatterySOC; - Auxiliaries.CycleStep(CurrentState.dt, DataBus.EngineCtl.CombustionEngineOn ? 1.0 : EngineStopStartUtilityFactor); + // cycleStep has to be called here and not in DoCommit, write is called before Commit! + //var oldSOC = Auxiliaries.BatterySOC; + Auxiliaries.CycleStep(CurrentState.dt, DataBus.EngineCtl.CombustionEngineOn ? 1.0 : EngineStopStartUtilityFactor); //var newSOC = Auxiliaries.BatterySOC; //CurrentState.TotalFuelConsumption = Auxiliaries.TotalFuel; @@ -249,7 +271,7 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl ? Auxiliaries.ElectricPowerConsumerSum : Auxiliaries.ElectricPowerGenerated); container[ModalResultField.P_busAux_ES_sum_mech] = - essUtilityFactor * (Auxiliaries.ElectricPowerConsumerSum - batteryPwr) / + essUtilityFactor * (Auxiliaries.ElectricPowerConsumerSum + batteryPwr) / AuxCfg.ElectricalUserInputsConfig.AlternatorGearEfficiency / AuxCfg.ElectricalUserInputsConfig.AlternatorMap.GetEfficiency(0.RPMtoRad(), 0.SI<Ampere>()); diff --git a/VectoCore/VectoCore/Models/SimulationComponent/Impl/CombustionEngine.cs b/VectoCore/VectoCore/Models/SimulationComponent/Impl/CombustionEngine.cs index dbd298ab144b642db67b6501d8351b26174da6d3..fd4d86c13873aa0c53d4b5a34c27da1005453bfe 100644 --- a/VectoCore/VectoCore/Models/SimulationComponent/Impl/CombustionEngine.cs +++ b/VectoCore/VectoCore/Models/SimulationComponent/Impl/CombustionEngine.cs @@ -657,7 +657,7 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl public bool EngineOn { get; set; } - public Watt AuxPowerEngineOff { get; set; } + //public Watt AuxPowerEngineOff { get; set; } } protected internal class CombustionEngineIdleController : LoggingObject, IIdleController diff --git a/VectoCore/VectoCore/Models/SimulationComponent/Impl/EngineAuxiliary.cs b/VectoCore/VectoCore/Models/SimulationComponent/Impl/EngineAuxiliary.cs index 805ac1b940ac415aba9a970671a806b7dfb72495..0ceb2ce33e9ba04bd3fe0705d4fc930e74cc7f60 100644 --- a/VectoCore/VectoCore/Models/SimulationComponent/Impl/EngineAuxiliary.cs +++ b/VectoCore/VectoCore/Models/SimulationComponent/Impl/EngineAuxiliary.cs @@ -133,7 +133,7 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl return 0.SI<NewtonMeter>(); } - public Watt PowerDemandEngineOff(Second absTime, Second dt) + public Watt PowerDemandESSEngineOff(Second absTime, Second dt) { var auxiliarieIgnoredDuringVehicleStop = new[] { @@ -169,7 +169,7 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl return engineOffDemand; //powerDemands.Sum(kv => kv.Value); } - public Watt PowerDemandEngineOn(Second absTime, Second dt, PerSecond engineSpeed) + public Watt PowerDemandESSEngineOn(Second absTime, Second dt, PerSecond engineSpeed) { return ComputePowerDemand(engineSpeed, absTime, dt, true); } diff --git a/VectoCore/VectoCore/Models/SimulationComponent/Impl/StopStartCombustionEngine.cs b/VectoCore/VectoCore/Models/SimulationComponent/Impl/StopStartCombustionEngine.cs index 6fce8459ee66fee16f6d18ca6b1c9e3f970fa2c6..45e6fd86a036b4840970c0687642a2a9ced969fd 100644 --- a/VectoCore/VectoCore/Models/SimulationComponent/Impl/StopStartCombustionEngine.cs +++ b/VectoCore/VectoCore/Models/SimulationComponent/Impl/StopStartCombustionEngine.cs @@ -90,10 +90,11 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl { CurrentState.EnginePower = 0.SI<Watt>(); CurrentState.dt = dt; - if (!dryRun) { + //if (!dryRun) { //EngineAux.TorqueDemand(absTime, dt, 0.SI<NewtonMeter>(), 0.SI<NewtonMeter>(), ModelData.IdleSpeed); - CurrentState.AuxPowerEngineOff = EngineAux.PowerDemandEngineOff(absTime, dt); - } else { + //CurrentState.AuxPowerEngineOff = EngineAux.PowerDemandEngineOff(absTime, dt); + //} else { + if (dryRun) { return new ResponseDryRun(this) { DeltaFullLoad = 0.SI<Watt>(), DeltaDragLoad = 0.SI<Watt>(), @@ -113,6 +114,7 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl { }; } + EngineAux?.TorqueDemand(absTime, dt, outTorque, outAngularVelocity, dryRun); return new ResponseSuccess(this) { Engine = { TorqueOutDemand = outTorque, @@ -182,11 +184,12 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl { container[ModalResultField.ICEOn] = CurrentState.EngineOn; - var auxDemandPwr = EngineAux.PowerDemandEngineOn(time, simulationInterval, ModelData.IdleSpeed); - var auxDemandTq = auxDemandPwr / ModelData.IdleSpeed; + var auxDemandPwrICEOn = EngineAux.PowerDemandESSEngineOn(time, simulationInterval, ModelData.IdleSpeed); + var auxDemandPwrICEOff = EngineAux.PowerDemandESSEngineOff(time, simulationInterval); + var auxDemandTq = auxDemandPwrICEOn / ModelData.IdleSpeed; - container[ModalResultField.P_aux_ESS_mech_ice_off] = (CurrentState.AuxPowerEngineOff ?? 0.SI<Watt>()); - container[ModalResultField.P_aux_ESS_mech_ice_on] = (auxDemandPwr ?? 0.SI<Watt>()); + container[ModalResultField.P_aux_ESS_mech_ice_off] = (auxDemandPwrICEOff ?? 0.SI<Watt>()); + container[ModalResultField.P_aux_ESS_mech_ice_on] = (auxDemandPwrICEOn ?? 0.SI<Watt>()); WriteWHRPowerEngineOff(container, ModelData.IdleSpeed, auxDemandTq); diff --git a/VectoCore/VectoCoreTest/Models/EngineeringMode/EngineeringModeBusAuxTest.cs b/VectoCore/VectoCoreTest/Models/EngineeringMode/EngineeringModeBusAuxTest.cs index 7853613203473406d63b6476562b554c5084f62b..fe3104d983db62c3e2332eb9f0dd1c21e0dc2fec 100644 --- a/VectoCore/VectoCoreTest/Models/EngineeringMode/EngineeringModeBusAuxTest.cs +++ b/VectoCore/VectoCoreTest/Models/EngineeringMode/EngineeringModeBusAuxTest.cs @@ -1,14 +1,42 @@ -using System.IO; +using System; +using System.Collections.Generic; +using System.Data; +using System.IO; using System.Linq; using Ninject; using NUnit.Framework; using NUnit.Framework.Internal; +using TUGraz.VectoCommon.BusAuxiliaries; +using TUGraz.VectoCommon.InputData; using TUGraz.VectoCommon.Models; +using TUGraz.VectoCommon.Utils; +using TUGraz.VectoCore.Configuration; using TUGraz.VectoCore.InputData.FileIO.JSON; using TUGraz.VectoCore.InputData.FileIO.XML; +using TUGraz.VectoCore.InputData.Reader.ComponentData; +using TUGraz.VectoCore.InputData.Reader.DataObjectAdapter; +using TUGraz.VectoCore.InputData.Reader.Impl; +using TUGraz.VectoCore.Models.BusAuxiliaries; +using TUGraz.VectoCore.Models.BusAuxiliaries.DownstreamModules.Impl.Electrics; +using TUGraz.VectoCore.Models.BusAuxiliaries.DownstreamModules.Impl.HVAC; +using TUGraz.VectoCore.Models.BusAuxiliaries.DownstreamModules.Impl.Pneumatics; +using TUGraz.VectoCore.Models.BusAuxiliaries.Interfaces.DownstreamModules.Electrics; +using TUGraz.VectoCore.Models.Connector.Ports.Impl; +using TUGraz.VectoCore.Models.Declaration; +using TUGraz.VectoCore.Models.Simulation; +using TUGraz.VectoCore.Models.Simulation.Data; +using TUGraz.VectoCore.Models.Simulation.DataBus; using TUGraz.VectoCore.Models.Simulation.Impl; +using TUGraz.VectoCore.Models.SimulationComponent; +using TUGraz.VectoCore.Models.SimulationComponent.Data; +using TUGraz.VectoCore.Models.SimulationComponent.Data.Gearbox; +using TUGraz.VectoCore.Models.SimulationComponent.Impl; using TUGraz.VectoCore.OutputData; using TUGraz.VectoCore.OutputData.FileIO; +using TUGraz.VectoCore.Tests.Models.SimulationComponent; +using TUGraz.VectoCore.Tests.Utils; +using TUGraz.VectoCore.Utils; +using Wheels = TUGraz.VectoCore.Models.SimulationComponent.Impl.Wheels; namespace TUGraz.VectoCore.Tests.Models.EngineeringMode { @@ -41,6 +69,9 @@ namespace TUGraz.VectoCore.Tests.Models.EngineeringMode const string JobFile_C3a = @"TestData\Hybrids\BusAuxEngineeringMode\InterurbanBus_ENG_BusAux_C3a.vecto"; const string JobFile_C3b = @"TestData\Hybrids\BusAuxEngineeringMode\InterurbanBus_ENG_BusAux_C3b.vecto"; + + private const string JobRoeck_BusAux_B = + @"J:\TE-Em\Emissionsmodelle\VECTO\Arbeitsordner\AAUX\Check bus aux electrical system configurations\System type B\Citybus_P0-APT-S-175kW-6.8l_B\Citybus_P0_B.vecto"; [ TestCase(JobFile, 0, TestName = "InterurbanBus ENG BusAux NonSmart Interurban"), TestCase(JobFile, 1, TestName = "InterurbanBus ENG BusAux NonSmart Coach"), @@ -80,10 +111,15 @@ namespace TUGraz.VectoCore.Tests.Models.EngineeringMode TestCase(JobFile_C1, 0, TestName = "InterurbanBus ENG BusAux C1 Interurban"), + TestCase(JobRoeck_BusAux_B, 0, "dev", TestName = "Roeck Citybus P0 Type B"), ] - public void InterurbanBus_BusAuxTest(string jobFile, int runIdx) + public void InterurbanBus_BusAuxTest(string jobFile, int runIdx, string outPath = null) { - var writer = new FileOutputWriter(jobFile); + var outFile = Path.Combine(Path.GetDirectoryName(jobFile), outPath, Path.GetFileName(jobFile)); + if (!Directory.Exists(Path.GetDirectoryName(outFile))) { + Directory.CreateDirectory(Path.GetDirectoryName(outFile)); + } + var writer = new FileOutputWriter(outFile); var inputData = Path.GetExtension(jobFile) == ".xml" ? xmlInputReader.CreateDeclaration(jobFile) //? new XMLDeclarationInputDataProvider(relativeJobPath, true) @@ -114,5 +150,431 @@ namespace TUGraz.VectoCore.Tests.Models.EngineeringMode jobContainer.Execute(); jobContainer.WaitFinished(); } + + + // ########################################################## + + // Case B: Smart ES + + // driving, ICE on, battery not empty + // driving, ICE on, battery empty + // driving, ICE off, battery not empty + // driving, ICE off, battery empty + // standstill, ICE on, battery not empty + // standstill, ICE on, battery empty + // standstill, ICE off, battery not empty + // standstill, ICE off, battery empty + // braking, battery not full + // braking, battery full + + public const double AlternatorEfficiency = 0.7; + public const double DCDCEfficiency = 0.97; + + public const double MaxAlternatorPower = 4000.0; + + public const double I_Base = 25.0; + public const double I_ICEOff_dr = 20.0; + public const double I_ICEOff_stop = 10.0; + + public const double P_aux_m_Base = 900; + public const double P_aux_m_ICEOff_dr = 750; + public const double P_aux_m_ICEOff_st = 300; + + public const double PowernetVoltage = 28.3; + public const double P_ES_base = I_Base * PowernetVoltage; // 707,5 W + public const double P_ES_ICEOff_dr = I_ICEOff_dr * PowernetVoltage; // 566 W + public const double P_ES_ICEOff_stop = I_ICEOff_stop * PowernetVoltage; // 283 W + + public const double P_PS_off_600 = 524.3 / 0.97; //540.5154639 W + public const double P_PS_off_1000 = 775.75 / 0.97; // 799.742268 W + + public static WattSecond ElectricStorageCapacity = 28.3.SI(Unit.SI.Watt.Hour).Cast<WattSecond>(); + + [TestCase(DrivingBehavior.Accelerating, true, 0, + P_aux_m_Base + P_PS_off_1000 + P_ES_base / AlternatorEfficiency, P_ES_base, P_ES_base, P_ES_base / AlternatorEfficiency, 0, 0, + TestName = "BusAux Case A (1); driving, ICE on")] + [TestCase(DrivingBehavior.Accelerating, false, 0, + 0, 0, P_ES_ICEOff_dr, 0, P_aux_m_ICEOff_dr + P_PS_off_600, + P_aux_m_Base + P_PS_off_600 + (P_ES_base - P_ES_ICEOff_dr) / AlternatorEfficiency, + TestName = "BusAux Case A (2); driving, ICE off")] + [TestCase(DrivingBehavior.Halted, true, 0, + P_aux_m_Base + P_PS_off_600 + P_ES_base / AlternatorEfficiency, P_ES_base, P_ES_base, + P_ES_base / AlternatorEfficiency, 0, 0, + TestName = "BusAux Case A (3); standstill, ICE on")] + [TestCase(DrivingBehavior.Halted, false, 0, + 0, 0, P_ES_ICEOff_stop, 0, P_aux_m_ICEOff_st + P_PS_off_600, + P_PS_off_600 + P_aux_m_Base + (P_ES_base - P_ES_ICEOff_stop) / AlternatorEfficiency, + TestName = "BusAux Case A (4); standstill, ICE off")] + [TestCase(DrivingBehavior.Braking, true, 0, + P_aux_m_Base + P_PS_off_1000 + P_ES_base / AlternatorEfficiency, P_ES_base, P_ES_base, + P_ES_base / AlternatorEfficiency, 0, 0, + TestName = "BusAux Case A (5); braking, ICE on")] + public void TestBusAux_Case_A(DrivingBehavior drivingBehavior, bool iceOn, double batterySoC, + double P_auxMech_expected, double P_busAux_ES_gen_expected, double P_busAux_ES_consumer_sum_expected, + double P_busAux_ES_mech, + double P_aux_ESS_mech_ICE_off_expected, double P_aux_ESS_mech_ICE_on_expected) + { + TestBusAux_Casees(AlternatorType.Conventional, drivingBehavior, iceOn, batterySoC, P_auxMech_expected, P_busAux_ES_gen_expected, P_busAux_ES_consumer_sum_expected, P_busAux_ES_mech, P_aux_ESS_mech_ICE_off_expected, P_aux_ESS_mech_ICE_on_expected); + } + + + [TestCase(DrivingBehavior.Accelerating, true, 0.5, + P_aux_m_Base + P_PS_off_1000, 0, P_ES_base, 0, 0, 0, + TestName = "BusAux Case B (1); driving, ICE on, battery not empty")] + [TestCase(DrivingBehavior.Accelerating, true, 0, + P_aux_m_Base + P_PS_off_1000 + P_ES_base / AlternatorEfficiency, P_ES_base, P_ES_base, + P_ES_base / AlternatorEfficiency, 0, 0, + TestName = "BusAux Case B (2); driving, ICE on, battery empty")] + [TestCase(DrivingBehavior.Accelerating, false, 0.5, + 0, 0, P_ES_ICEOff_dr, 0, P_aux_m_ICEOff_dr + P_PS_off_600, + P_aux_m_Base + P_PS_off_600 + (P_ES_base - P_ES_ICEOff_dr) / AlternatorEfficiency, + TestName = "BusAux Case B (3); driving, ICE off, battery not empty")] + [TestCase(DrivingBehavior.Accelerating, false, 0, + 0, 0, P_ES_ICEOff_dr, 0, P_aux_m_ICEOff_dr + P_PS_off_600, + P_aux_m_Base + P_PS_off_600 + (P_ES_base - P_ES_ICEOff_dr) / AlternatorEfficiency, + TestName = "BusAux Case B (4); driving, ICE off, battery empty")] + [TestCase(DrivingBehavior.Halted, true, 0.5, + P_aux_m_Base + P_PS_off_600, 0, P_ES_base, 0, 0, 0, + TestName = "BusAux Case B (5); standstill, ICE on, battery not empty")] + [TestCase(DrivingBehavior.Halted, true, 0, + P_aux_m_Base + P_PS_off_600 + P_ES_base / AlternatorEfficiency, P_ES_base, P_ES_base, + P_ES_base / AlternatorEfficiency, 0, 0, + TestName = "BusAux Case B (6); standstill, ICE on, battery empty")] + [TestCase(DrivingBehavior.Halted, false, 0.5, + 0, 0, P_ES_ICEOff_stop, 0, P_aux_m_ICEOff_st + P_PS_off_600, + P_PS_off_600 + P_aux_m_Base + (P_ES_base - P_ES_ICEOff_stop) / AlternatorEfficiency, + TestName = "BusAux Case B (7); standstill, ICE off, battery not empty")] + [TestCase(DrivingBehavior.Halted, false, 0, + 0, 0, P_ES_ICEOff_stop, 0, P_aux_m_ICEOff_st + P_PS_off_600, + P_PS_off_600 + P_aux_m_Base + (P_ES_base - P_ES_ICEOff_stop) / AlternatorEfficiency, + TestName = "BusAux Case B (8); standstill, ICE off, battery empty")] + [TestCase(DrivingBehavior.Braking, true, 0.5, + P_aux_m_Base + P_PS_off_1000 + MaxAlternatorPower / AlternatorEfficiency, MaxAlternatorPower, P_ES_base, + MaxAlternatorPower / AlternatorEfficiency, 0, 0, + TestName = "BusAux Case B (9); braking, ICE on, battery not full")] + [TestCase(DrivingBehavior.Braking, true, 1, + P_aux_m_Base + P_PS_off_1000 + P_ES_base / AlternatorEfficiency, P_ES_base, P_ES_base, + P_ES_base / AlternatorEfficiency, 0, 0, + TestName = "BusAux Case B (10); braking, ICE on, battery full")] + public void TestBusAux_Case_B(DrivingBehavior drivingBehavior, bool iceOn, double batterySoC, + double P_auxMech_expected, double P_busAux_ES_gen_expected, double P_busAux_ES_consumer_sum_expected, + double P_busAux_ES_mech, + double P_aux_ESS_mech_ICE_off_expected, double P_aux_ESS_mech_ICE_on_expected) + { + TestBusAux_Casees(AlternatorType.Smart, drivingBehavior, iceOn, batterySoC, P_auxMech_expected, P_busAux_ES_gen_expected, P_busAux_ES_consumer_sum_expected, P_busAux_ES_mech, P_aux_ESS_mech_ICE_off_expected, P_aux_ESS_mech_ICE_on_expected); + } + + public void TestBusAux_Casees(AlternatorType alternatorType, DrivingBehavior drivingBehavior, bool iceOn, + double batterySoC, + double P_auxMech_expected, double P_busAux_ES_gen_expected, double P_busAux_ES_consumer_sum_expected, + double P_busAux_ES_mech, + double P_aux_ESS_mech_ICE_off_expected, double P_aux_ESS_mech_ICE_on_expected) + { + + var container = CreatePowerTrain(batterySoC, alternatorType); + + container.VehicleStopped = drivingBehavior == DrivingBehavior.Halted; + container.VehicleSpeed = drivingBehavior == DrivingBehavior.Halted + ? 0.KMPHtoMeterPerSecond() + : 30.KMPHtoMeterPerSecond(); + container.DriverBehavior = drivingBehavior; + container.DrivingAction = drivingBehavior == DrivingBehavior.Halted + ? DrivingAction.Halt + : (drivingBehavior == DrivingBehavior.Braking ? DrivingAction.Brake : DrivingAction.Accelerate); + container.EngineSpeed = drivingBehavior == DrivingBehavior.Halted ? 600.RPMtoRad() : 1000.RPMtoRad(); + container.EngineCtl.CombustionEngineOn = iceOn; + + + var ice = container.Components.First(x => x is ICombustionEngine) as StopStartCombustionEngine; + Assert.NotNull(ice); + + var modData = container.ModalData as ModalDataContainer; + Assert.NotNull(modData); + + var absTime = 0.SI<Second>(); + var dt = 1.SI<Second>(); + IResponse response = null; + switch (drivingBehavior) { + case DrivingBehavior.Halted: + container.Gear = new GearshiftPosition(0); + ice.CombustionEngineOn = iceOn; + response = ice.Request(absTime, dt, 0.SI<NewtonMeter>(), 600.RPMtoRad(), false); + break; + case DrivingBehavior.Accelerating: + case DrivingBehavior.Driving: + container.Gear = new GearshiftPosition(3); + ice.CombustionEngineOn = iceOn; + response = ice.Request(absTime, dt, 0.SI<NewtonMeter>(), iceOn ? 1000.RPMtoRad() : 600.RPMtoRad(), false); + break; + case DrivingBehavior.Braking: + container.Gear = new GearshiftPosition(3); + container.BrakePower = 50e3.SI<Watt>(); + ice.CombustionEngineOn = iceOn; + response = ice.Request(absTime, dt, 0.SI<NewtonMeter>(), iceOn ? 1000.RPMtoRad() : 600.RPMtoRad(), false); + break; + default: + throw new ArgumentOutOfRangeException(nameof(drivingBehavior), drivingBehavior, null); + } + + Assert.NotNull(response); + Assert.IsAssignableFrom<ResponseSuccess>(response); + + container.CommitSimulationStep(absTime, dt); + modData.CommitSimulationStep(); + + Assert.AreEqual(1, modData.Data.Rows.Count); + + var row = modData.Data.Rows[0]; + + Assert.AreEqual(iceOn, row.Field<bool>(ModalResultField.ICEOn.GetName()), ModalResultField.ICEOn.GetName()); + Assert.AreEqual(P_auxMech_expected, row.Field<SI>(ModalResultField.P_aux_mech.GetName()).Value(), 1e-3, ModalResultField.P_aux_mech.GetName()); + Assert.AreEqual(P_busAux_ES_gen_expected, row.Field<SI>(ModalResultField.P_busAux_ES_generated.GetName()).Value(), 1e-3, ModalResultField.P_busAux_ES_generated.GetName()); + Assert.AreEqual(P_busAux_ES_consumer_sum_expected, row.Field<SI>(ModalResultField.P_busAux_ES_consumer_sum.GetName()).Value(), 1e-3, ModalResultField.P_busAux_ES_consumer_sum.GetName()); + Assert.AreEqual(P_busAux_ES_consumer_sum_expected, row.Field<SI>(ModalResultField.P_busAux_ES_other.GetName()).Value(), 1e-3, ModalResultField.P_busAux_ES_other.GetName()); + Assert.AreEqual(P_busAux_ES_mech, row.Field<SI>(ModalResultField.P_busAux_ES_sum_mech.GetName()).Value(), 1e-3, ModalResultField.P_busAux_ES_sum_mech.GetName()); + + Assert.AreEqual(P_aux_ESS_mech_ICE_off_expected, row.Field<SI>(ModalResultField.P_aux_ESS_mech_ice_off.GetName()).Value(), 1e-3, ModalResultField.P_aux_ESS_mech_ice_off.GetName()); + Assert.AreEqual(P_aux_ESS_mech_ICE_on_expected, row.Field<SI>(ModalResultField.P_aux_ESS_mech_ice_on.GetName()).Value(), 1e-3, ModalResultField.P_aux_ESS_mech_ice_on.GetName()); + + } + + public const string EngineFileHigh = @"TestData\Components\24t Coach_high.veng"; + + public static MockVehicleContainer CreatePowerTrain(double initialSoC, AlternatorType alternatorType) + { + //var gearboxData = CreateGearboxData(); + var engineData = MockSimulationDataFactory.CreateEngineDataFromFile(EngineFileHigh, 6); + //var axleGearData = CreateAxleGearData(); + var vehicleData = CreateVehicleData(3300.SI<Kilogram>()); + //var airdragData = CreateAirdragData(); + //var driverData = CreateDriverData(AccelerationFile); + + var cycleData = DrivingCycleDataReader.ReadFromStream("s,v,grad,stop\n0,0,0,10\n10,20,0,0\n20,21,0,0\n30,22,0,0\n40,23,0,0\n50,24,0,0\n60,25,0,0\n70,26,0,0\n80,27,0,0\n90,28,0,0\n100,29,0,0".ToStream(), CycleType.DistanceBased, "DummyCycle", false); + + var runData = new VectoRunData() { + JobRunId = 0, + VehicleData = vehicleData, + EngineData = engineData, + ElectricMachinesData = new List<Tuple<PowertrainPosition, ElectricMotorData>>(), + SimulationType = SimulationType.DistanceCycle, + Cycle = cycleData, + BusAuxiliaries = CreateBusAuxData(alternatorType, vehicleData), + Aux = CreateAuxiliaryData(P_aux_m_Base.SI<Watt>(), P_aux_m_ICEOff_dr.SI<Watt>(), P_aux_m_ICEOff_st.SI<Watt>()) + }; + + var modData = new ModalDataContainer(runData, null, null) { + WriteModalResults = false + }; + + var container = new MockVehicleContainer() { + CycleData = new CycleData() { LeftSample = cycleData.Entries.First()}, + ModalData = modData, + HasCombustionEngine = true, + HasElectricMotor = false, + }; + var engine = new StopStartCombustionEngine(container, engineData); + + + container.EngineInfo = engine; + + var conventionalAux = CreateAuxiliaries(runData.Aux, container); + var aux = new BusAuxiliariesAdapter(container, runData.BusAuxiliaries, conventionalAux); + + var auxCfg = runData.BusAuxiliaries; + var electricStorage = auxCfg.ElectricalUserInputsConfig.AlternatorType == AlternatorType.Smart + ? new SimpleBattery(container, auxCfg.ElectricalUserInputsConfig.ElectricStorageCapacity, auxCfg.ElectricalUserInputsConfig.StoredEnergyEfficiency, initialSoC) + : (ISimpleBattery)new NoBattery(container); + aux.ElectricStorage = electricStorage; + engine.Connect(aux.Port()); + + + return container; + } + + private static IAuxPort CreateAuxiliaries(IEnumerable<VectoRunData.AuxData> auxDataList, + IVehicleContainer container) + { + var aux = new EngineAuxiliary(container); + foreach (var auxData in auxDataList) { + // id's in upper case + var id = auxData.ID.ToUpper(); + + switch (auxData.DemandType) { + case AuxiliaryDemandType.Constant: + aux.AddConstant(id, auxData.PowerDemand); + break; + default: + throw new ArgumentOutOfRangeException("AuxiliaryDemandType", auxData.DemandType.ToString()); + } + + container.ModalData?.AddAuxiliary(id); + } + + return aux; + } + + private static IList<VectoRunData.AuxData> CreateAuxiliaryData(Watt pwrICEOn, Watt pwrICEOffDriving, Watt pwrICEOffStandstill) + { + var baseDemand = pwrICEOffStandstill; + var stpDemand = pwrICEOffDriving - pwrICEOffStandstill; + var fanDemand = pwrICEOn - pwrICEOffDriving; + + var auxList = new List<VectoRunData.AuxData>() { + new VectoRunData.AuxData { ID = Constants.Auxiliaries.IDs.ENG_AUX_MECH_BASE, DemandType = AuxiliaryDemandType.Constant, PowerDemand = baseDemand}, + new VectoRunData.AuxData { ID = Constants.Auxiliaries.IDs.ENG_AUX_MECH_STP, DemandType = AuxiliaryDemandType.Constant, PowerDemand = stpDemand}, + new VectoRunData.AuxData { ID = Constants.Auxiliaries.IDs.ENG_AUX_MECH_FAN, DemandType = AuxiliaryDemandType.Constant, PowerDemand = fanDemand}, + }; + + return auxList; + } + + private static AuxiliaryConfig CreateBusAuxData(AlternatorType alternatorType, VehicleData vehicleData) + { + var CompressorMap = "TestData/Integration/BusAuxiliaries/DEFAULT_2-Cylinder_1-Stage_650ccm.ACMP"; + var AverageAirDemand = 0.0.SI<NormLiterPerSecond>(); + var SmartAirCompression = false; + var GearRatio = 1.0; + + var BatteryEfficiency = 1.0; + var ESSupplyFromHEVREESS = false; + //var AlternatorType = VectoCommon.Models.AlternatorType.Smart; + var ElectricPowerDemand = 0.0.SI<Watt>(); + var MechanicalPowerDemand = 0.0.SI<Watt>(); + var AuxHeaterPower = 0.0.SI<Watt>(); + var AverageHeatingDemand = 0.0.SI<Joule>(); + + var retVal = new AuxiliaryConfig() { + //InputData = auxInputData.BusAuxiliariesData, + ElectricalUserInputsConfig = new ElectricsUserInputsConfig() { + PowerNetVoltage = Constants.BusAuxiliaries.ElectricSystem.PowernetVoltage, + //StoredEnergyEfficiency = Constants.BusAuxiliaries.ElectricSystem.StoredEnergyEfficiency, + ResultCardIdle = new DummyResultCard(), + ResultCardOverrun = new DummyResultCard(), + ResultCardTraction = new DummyResultCard(), + AlternatorGearEfficiency = Constants.BusAuxiliaries.ElectricSystem.AlternatorGearEfficiency, + DoorActuationTimeSecond = Constants.BusAuxiliaries.ElectricalConsumers.DoorActuationTimeSecond, + AlternatorMap = new SimpleAlternator(AlternatorEfficiency) { + Technologies = new List<string>() { "engineering mode" } + }, + AlternatorType = alternatorType, + ConnectESToREESS = ESSupplyFromHEVREESS, + DCDCEfficiency = DCDCEfficiency, + MaxAlternatorPower = MaxAlternatorPower.SI<Watt>(), + ElectricStorageCapacity = ElectricStorageCapacity ?? 0.SI<WattSecond>(), + StoredEnergyEfficiency = BatteryEfficiency, + ElectricalConsumers = GetElectricConsumers(I_Base.SI<Ampere>(), I_ICEOff_dr.SI<Ampere>(), I_ICEOff_stop.SI<Ampere>()), + }, + PneumaticAuxillariesConfig = new PneumaticsConsumersDemand() { + AdBlueInjection = 0.SI<NormLiterPerSecond>(), + AirControlledSuspension = AverageAirDemand, + Braking = 0.SI<NormLiterPerKilogram>(), + BreakingWithKneeling = 0.SI<NormLiterPerKilogramMeter>(), + DeadVolBlowOuts = 0.SI<PerSecond>(), + DeadVolume = 0.SI<NormLiter>(), + NonSmartRegenFractionTotalAirDemand = 0, + SmartRegenFractionTotalAirDemand = 0, + OverrunUtilisationForCompressionFraction = + Constants.BusAuxiliaries.PneumaticConsumersDemands.OverrunUtilisationForCompressionFraction, + DoorOpening = 0.SI<NormLiter>(), + StopBrakeActuation = 0.SI<NormLiterPerKilogram>(), + }, + PneumaticUserInputsConfig = new PneumaticUserInputsConfig() { + CompressorMap = + new CompressorMap(CompressorMapReader.Create(VectoCSVFile.Read(CompressorMap), 1.0), + "engineering mode", ""), + CompressorGearEfficiency = Constants.BusAuxiliaries.PneumaticUserConfig.CompressorGearEfficiency, + CompressorGearRatio = GearRatio, + SmartAirCompression = SmartAirCompression, + SmartRegeneration = false, + KneelingHeight = 0.SI<Meter>(), + AirSuspensionControl = ConsumerTechnology.Pneumatically, + AdBlueDosing = ConsumerTechnology.Electrically, + Doors = ConsumerTechnology.Electrically + }, + Actuations = new Actuations() { + Braking = 0, + Kneeling = 0, + ParkBrakeAndDoors = 0, + CycleTime = 1.SI<Second>() + }, + SSMInputs = new SSMEngineeringInputs() { + MechanicalPower = MechanicalPowerDemand, + ElectricPower = ElectricPowerDemand, + AuxHeaterPower = AuxHeaterPower, + HeatingDemand = AverageHeatingDemand, + AuxHeaterEfficiency = Constants.BusAuxiliaries.SteadyStateModel.AuxHeaterEfficiency, + FuelEnergyToHeatToCoolant = Constants.BusAuxiliaries.Heater.FuelEnergyToHeatToCoolant, + CoolantHeatTransferredToAirCabinHeater = + Constants.BusAuxiliaries.Heater.CoolantHeatTransferredToAirCabinHeater, + }, + VehicleData = vehicleData, + }; + + return retVal; + } + + private static Dictionary<string, ElectricConsumerEntry> GetElectricConsumers(Ampere currentDemand, Ampere currentDemandEngineOffDriving, Ampere currentDemandEngineOffStandstill) + { + var retVal = new Dictionary<string, ElectricConsumerEntry>(); + + var iBase = currentDemandEngineOffStandstill; + var iSP = currentDemandEngineOffDriving - + currentDemandEngineOffStandstill; + var iFan = currentDemand - currentDemandEngineOffDriving; + + retVal["BaseLoad"] = new ElectricConsumerEntry() { + Current = iBase, + BaseVehicle = true + }; + retVal[Constants.Auxiliaries.IDs.SteeringPump] = new ElectricConsumerEntry() { + Current = iSP, + ActiveDuringEngineStopStandstill = false, + }; + retVal[Constants.Auxiliaries.IDs.Fan] = new ElectricConsumerEntry() { + Current = iFan, + ActiveDuringEngineStopStandstill = false, + ActiveDuringEngineStopDriving = false, + }; + return retVal; + } + + + + private static VehicleData CreateVehicleData(Kilogram loading) + { + var axles = new List<Axle> { + new Axle { + AxleWeightShare = 0.4375, + Inertia = 21.66667.SI<KilogramSquareMeter>(), + RollResistanceCoefficient = 0.0055, + TwinTyres = false, + TyreTestLoad = 62538.75.SI<Newton>() + }, + new Axle { + AxleWeightShare = 0.375, + Inertia = 10.83333.SI<KilogramSquareMeter>(), + RollResistanceCoefficient = 0.0065, + TwinTyres = true, + TyreTestLoad = 52532.55.SI<Newton>() + }, + new Axle { + AxleWeightShare = 0.1875, + Inertia = 21.66667.SI<KilogramSquareMeter>(), + RollResistanceCoefficient = 0.0055, + TwinTyres = false, + TyreTestLoad = 62538.75.SI<Newton>() + } + }; + return new VehicleData { + AirDensity = DeclarationData.AirDensity, + AxleConfiguration = AxleConfiguration.AxleConfig_6x2, + CurbMass = 15700.SI<Kilogram>(), + Loading = loading, + DynamicTyreRadius = 0.52.SI<Meter>(), + AxleData = axles, + SavedInDeclarationMode = false + }; + } + } } \ No newline at end of file diff --git a/VectoCore/VectoCoreTest/Utils/MockVehicleContainer.cs b/VectoCore/VectoCoreTest/Utils/MockVehicleContainer.cs index b1b64a846bb56a8a38f01667a2bafa3dc350ed39..06d288301fa8b5d61ed60fb65fe8b617ed49ccef 100644 --- a/VectoCore/VectoCoreTest/Utils/MockVehicleContainer.cs +++ b/VectoCore/VectoCoreTest/Utils/MockVehicleContainer.cs @@ -403,8 +403,8 @@ namespace TUGraz.VectoCore.Tests.Utils set; } - public bool HasElectricMotor { get; } - public PowertrainPosition[] ElectricMotorPositions { get; } + public bool HasElectricMotor { get; set; } + public PowertrainPosition[] ElectricMotorPositions { get; set; } #endregion } diff --git a/VectoCore/VectoCoreTest/VectoCoreTest.csproj b/VectoCore/VectoCoreTest/VectoCoreTest.csproj index ea343f7b54d81d2390adc478c7b53521f5e2a31f..440b0b8fcdf237a7b70142f2cb9377d800135219 100644 --- a/VectoCore/VectoCoreTest/VectoCoreTest.csproj +++ b/VectoCore/VectoCoreTest/VectoCoreTest.csproj @@ -1055,9 +1055,6 @@ <None Include="TestData\Hybrids\GenericVehicle_Group5_P3_APT\Hybrid_Parameters.vhctl"> <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> </None> - <None Include="TestData\Hybrids\GenericVehicle_Group5_P3_APT\LongHaul.vdri"> - <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> - </None> <None Include="TestData\Hybrids\GenericVehicle_Group5_P3_APT\MaxCurrent.vimax"> <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> </None> @@ -1079,9 +1076,6 @@ <None Include="TestData\Hybrids\GenericVehicle_Group5_P3_APT\P3 APT Group 5_noESS.vecto"> <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> </None> - <None Include="TestData\Hybrids\GenericVehicle_Group5_P3_APT\RegionalDelivery.vdri"> - <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> - </None> <None Include="TestData\Hybrids\GenericVehicle_Group5_P3_APT\ShiftParameters.vtcu"> <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> </None> @@ -3952,14 +3946,14 @@ <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> </None> <None Include="TestData\Integration\VTPMode\DualFuelVehicle\vtp_cycle_2Hz.vdri"> - <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> - </None> + <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> + </None> <None Include="TestData\Integration\VTPMode\GenericVehicle XMLJob PTO\class_5_generic vehicle_DECL.vecto"> <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> </None> <None Include="TestData\Integration\VTPMode\GenericVehicle XMLJob PTO\VTP_rural_2Hz.vdri"> - <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> - </None> + <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> + </None> <None Include="TestData\Integration\VTPMode\DualFuelVehicle\VTP_DualFuel.vecto"> <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> </None> @@ -5124,44 +5118,44 @@ <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> </Content> <Content Include="TestData\Integration\MediumLorries\vecto_vehicle-medium_lorry.xml"> - <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> - </Content> + <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> + </Content> <Content Include="TestData\Integration\VTPMode\GenericVehicle XMLJob PTO\Tractor_4x2_vehicle-class-5_Generic vehicle.RSLT_MANUFACTURER.xml"> <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> </Content> <Content Include="TestData\Integration\MediumLorries\vecto_vehicle-medium_lorry-Van.xml"> - <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> - </Content> + <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> + </Content> <Content Include="TestData\Integration\VTPMode\GenericVehicle XMLJob PTO\Tractor_4x2_vehicle-class-5_Generic vehicle.xml"> <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> </Content> - <Content Include="TestData\Integration\MediumLorries\vecto_vehicle-medium_lorryFWD.xml"> - <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> - </Content> + <Content Include="TestData\Integration\MediumLorries\vecto_vehicle-medium_lorryFWD.xml"> + <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> + </Content> <Content Include="TestData\Integration\VTPMode\GenericVehicle\CityBus_AT_Ser_2TC.xml"> <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> </Content> <Content Include="TestData\Integration\ShiftStrategyV2\SampleVehicles\Rigid Truck_4x2_vehicle-class-1_EURO6_2018.xml"> - <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> - </Content> + <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> + </Content> <Content Include="TestData\Integration\VTPMode\GenericVehicle\Rigid Truck_4x2_vehicle-class-3_EURO6_2018.MANUFACTURER.xml"> <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> </Content> <Content Include="TestData\Integration\ShiftStrategyV2\SampleVehicles\Rigid Truck_4x2_vehicle-class-2_EURO6_2018.xml"> - <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> - </Content> + <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> + </Content> <Content Include="TestData\Integration\VTPMode\GenericVehicle\Rigid Truck_4x2_vehicle-class-3_EURO6_2018.xml"> <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> </Content> <Content Include="TestData\Integration\ShiftStrategyV2\SampleVehicles\Rigid Truck_4x2_vehicle-class-3_EURO6_2018.xml"> - <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> - </Content> + <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> + </Content> <Content Include="TestData\Integration\VTPMode\GenericVehicle_CNG\Tractor_4x2_vehicle-class-5_Generic vehicle.RSLT_MANUFACTURER.xml"> <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> </Content> <Content Include="TestData\Integration\ShiftStrategyV2\SampleVehicles\Rigid Truck_4x2_vehicle-class-4_EURO6_2018.xml"> - <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> - </Content> + <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> + </Content> <Content Include="TestData\Integration\VTPMode\GenericVehicle_CNG\Tractor_4x2_vehicle-class-5_Generic vehicle.xml"> <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> </Content>