diff --git a/VectoCore/VectoCore/InputData/Reader/ComponentData/MaxPropulsionTorqueReader.cs b/VectoCore/VectoCore/InputData/Reader/ComponentData/MaxBoostingTorqueReader.cs similarity index 97% rename from VectoCore/VectoCore/InputData/Reader/ComponentData/MaxPropulsionTorqueReader.cs rename to VectoCore/VectoCore/InputData/Reader/ComponentData/MaxBoostingTorqueReader.cs index 04059dc77a58c92321098f06c98d1898026c589e..2ecfeab1b85f39af8876f377206f8de5dd4f12c3 100644 --- a/VectoCore/VectoCore/InputData/Reader/ComponentData/MaxPropulsionTorqueReader.cs +++ b/VectoCore/VectoCore/InputData/Reader/ComponentData/MaxBoostingTorqueReader.cs @@ -9,7 +9,7 @@ using TUGraz.VectoCore.Utils; namespace TUGraz.VectoCore.InputData.Reader.ComponentData { - public static class MaxPropulsionTorqueReader + public static class MaxBoostingTorqueReader { public static VehicleMaxPropulsionTorque Read(Stream str) { diff --git a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/AbstractSimulationDataAdapter.cs b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/AbstractSimulationDataAdapter.cs index e83f1144be87f1fe477c08802e4fff584305e064..ee158ff44112b5907d16e087d0f98ad71a73585a 100644 --- a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/AbstractSimulationDataAdapter.cs +++ b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/AbstractSimulationDataAdapter.cs @@ -383,7 +383,7 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter /// <summary> - /// Intersects full load curves. + /// Intersects ICE full load curves. /// </summary> /// <param name="engineCurve"></param> /// <param name="maxTorque"></param> @@ -446,6 +446,65 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter }; return flc; } + + + /// <summary> + /// Intersects max torque curve. + /// </summary> + /// <param name="maxTorqueEntries"></param> + /// <param name="maxTorque"></param> + /// <returns>A combined EngineFullLoadCurve with the minimum full load torque over all inputs curves.</returns> + internal static IList<VehicleMaxPropulsionTorque.FullLoadEntry> IntersectMaxPropulsionTorqueCurve(IList<VehicleMaxPropulsionTorque.FullLoadEntry> maxTorqueEntries, NewtonMeter maxTorque) + { + if (maxTorque == null) { + return maxTorqueEntries; + } + + var entries = new List<VehicleMaxPropulsionTorque.FullLoadEntry>(); + var firstEntry = maxTorqueEntries.First(); + if (firstEntry.FullDriveTorque < maxTorque) { + entries.Add(maxTorqueEntries.First()); + } else { + entries.Add(new VehicleMaxPropulsionTorque.FullLoadEntry { + MotorSpeed = firstEntry.MotorSpeed, + FullDriveTorque = maxTorque, + }); + } + foreach (var entry in maxTorqueEntries.Pairwise(Tuple.Create)) { + if (entry.Item1.FullDriveTorque <= maxTorque && entry.Item2.FullDriveTorque <= maxTorque) { + // segment is below maxTorque line -> use directly + entries.Add(entry.Item2); + } else if (entry.Item1.FullDriveTorque > maxTorque && entry.Item2.FullDriveTorque > maxTorque) { + // segment is above maxTorque line -> add limited entry + entries.Add(new VehicleMaxPropulsionTorque.FullLoadEntry { + MotorSpeed = entry.Item2.MotorSpeed, + FullDriveTorque = maxTorque, + }); + } else { + // segment intersects maxTorque line -> add new entry at intersection + var edgeFull = Edge.Create( + new Point(entry.Item1.MotorSpeed.Value(), entry.Item1.FullDriveTorque.Value()), + new Point(entry.Item2.MotorSpeed.Value(), entry.Item2.FullDriveTorque.Value())); + + var intersectionX = (maxTorque.Value() - edgeFull.OffsetXY) / edgeFull.SlopeXY; + if (!entries.Any(x => x.MotorSpeed.IsEqual(intersectionX)) && !intersectionX.IsEqual(entry.Item2.MotorSpeed.Value())) { + entries.Add(new VehicleMaxPropulsionTorque.FullLoadEntry { + MotorSpeed = intersectionX.SI<PerSecond>(), + FullDriveTorque = maxTorque, + }); + } + + entries.Add(new VehicleMaxPropulsionTorque.FullLoadEntry { + MotorSpeed = entry.Item2.MotorSpeed, + FullDriveTorque = entry.Item2.FullDriveTorque > maxTorque ? maxTorque : entry.Item2.FullDriveTorque, + + }); + } + } + + + return entries; + } } } diff --git a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/EngineeringDataAdapter.cs b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/EngineeringDataAdapter.cs index 72af4e340603f92f8f2878e6aeadd2a73b99bd2a..03f1f44856b69c40da3c5f121cfad4162a6ba998 100644 --- a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/EngineeringDataAdapter.cs +++ b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/EngineeringDataAdapter.cs @@ -348,6 +348,7 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter var gearData = new GearData { ShiftPolygon = shiftPolygon, MaxSpeed = gear.MaxInputSpeed, + MaxTorque = gear.MaxTorque, Ratio = gear.Ratio, LossMap = lossMap, }; @@ -827,12 +828,12 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter var retVal = new BatterySystemData(); foreach (var entry in bat) { - var b = entry.REESSPack as IBatteryPackDeclarationInputData; - if (b == null) { - continue; - } + var b = entry.REESSPack as IBatteryPackDeclarationInputData; + if (b == null) { + continue; + } - for (var i = 0; i < entry.Count; i++) { + for (var i = 0; i < entry.Count; i++) { retVal.Batteries.Add(Tuple.Create(entry.StringId, new BatteryData() { MinSOC = b.MinSOC.Value, MaxSOC = b.MaxSOC.Value, @@ -917,9 +918,9 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter Voltage = entry.VoltageLevel, FullLoadCurve = fullLoadCurveCombined, - // DragCurve = ElectricMotorDragCurveReader.Create(entry.DragCurve, count), - EfficiencyMap = ElectricMotorMapReader.Create(entry.PowerMap.First().PowerMap, count), //PowerMap - }); + // DragCurve = ElectricMotorDragCurveReader.Create(entry.DragCurve, count), + EfficiencyMap = ElectricMotorMapReader.Create(entry.PowerMap.First().PowerMap, count), //PowerMap + }); } if (averageVoltage == null) { @@ -995,13 +996,13 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter } public HybridStrategyParameters CreateHybridStrategyParameters( - IHybridStrategyParameters hybridStrategyParameters, - TableData maxPropulsionTorque, CombustionEngineData combustionEngineData) + IEngineeringJobInputData jobInputData, + CombustionEngineData combustionEngineData, GearboxData gearboxData) { - VehicleMaxPropulsionTorque torqueLimit = maxPropulsionTorque == null - ? null - : CreateMaxPropulsionTorque(maxPropulsionTorque, combustionEngineData); + var hybridStrategyParameters = jobInputData.HybridStrategyParameters; + var torqueLimit = CreateMaxPropulsionTorque(jobInputData.Vehicle, combustionEngineData, gearboxData); + var retVal = new HybridStrategyParameters() { EquivalenceFactorDischarge = hybridStrategyParameters.EquivalenceFactorDischarge, EquivalenceFactorCharge = hybridStrategyParameters.EquivalenceFactorCharge, @@ -1019,34 +1020,74 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter return retVal; } - private VehicleMaxPropulsionTorque CreateMaxPropulsionTorque(TableData maxPropulsionTorque, CombustionEngineData engineData) + protected internal static Dictionary<GearshiftPosition, VehicleMaxPropulsionTorque> CreateMaxPropulsionTorque(IVehicleEngineeringInputData vehicleInputData, CombustionEngineData engineData, GearboxData gearboxData) { - var offset = MaxPropulsionTorqueReader.Create(maxPropulsionTorque); - var belowIdle = offset.FullLoadEntries.Where(x => x.MotorSpeed < engineData.IdleSpeed).ToList(); - - var entries = belowIdle.Select(fullLoadEntry => new VehicleMaxPropulsionTorque.FullLoadEntry() - { MotorSpeed = fullLoadEntry.MotorSpeed, FullDriveTorque = fullLoadEntry.FullDriveTorque }) - .Concat( - engineData.FullLoadCurves[0].FullLoadEntries.Where(x => x.EngineSpeed > engineData.IdleSpeed) - .Select(fullLoadCurveEntry => + + // engine data contains full-load curves already cropped with max gearbox torque and max ICE torque (vehicle level) + + var maxBoostingTorque = vehicleInputData.BoostingLimitations; + var offset = maxBoostingTorque == null ? null : MaxBoostingTorqueReader.Create(maxBoostingTorque); + var belowIdle = offset?.FullLoadEntries.Where(x => x.MotorSpeed < engineData.IdleSpeed).ToList(); + + var retVal = new Dictionary<GearshiftPosition, VehicleMaxPropulsionTorque>(); + var isP3OrP4Hybrid = vehicleInputData.Components.ElectricMachines.Entries.Select(x => x.Position) + .Any(x => x == PowertrainPosition.HybridP3 || x == PowertrainPosition.HybridP4); + foreach (var key in engineData.FullLoadCurves.Keys) { + if (key == 0) { + continue; + } + if (maxBoostingTorque == null) { + if (gearboxData.Gears[key].MaxTorque == null) { + continue; + } + // don't know what to do... + // idea 1: apply gearbox limit for whole speed range + // idea 2: use em max torque as boosting limitation + var gbxLimit = new[] { + new VehicleMaxPropulsionTorque.FullLoadEntry() + { MotorSpeed = 0.RPMtoRad(), FullDriveTorque = gearboxData.Gears[key].MaxTorque }, + new VehicleMaxPropulsionTorque.FullLoadEntry() { + MotorSpeed = engineData.FullLoadCurves[0].N95hSpeed * 1.1, + FullDriveTorque = gearboxData.Gears[key].MaxTorque + } + }.ToList(); + retVal[new GearshiftPosition(key)] = new VehicleMaxPropulsionTorque(gbxLimit); + continue; + } + + // case boosting limit is defined, gearbox limit can be defined or not (handled in Intersect method) + + // entries contains ICE full-load curve with the boosting torque added. handles ICE speeds below idle + var entries = belowIdle.Select(fullLoadEntry => new VehicleMaxPropulsionTorque.FullLoadEntry() + { MotorSpeed = fullLoadEntry.MotorSpeed, FullDriveTorque = fullLoadEntry.FullDriveTorque }) + .Concat( + engineData.FullLoadCurves[key].FullLoadEntries.Where(x => x.EngineSpeed > engineData.IdleSpeed) + .Select(fullLoadCurveEntry => + new VehicleMaxPropulsionTorque.FullLoadEntry() { + MotorSpeed = fullLoadCurveEntry.EngineSpeed, + FullDriveTorque = fullLoadCurveEntry.TorqueFullLoad + + VectoMath.Max( + offset?.FullLoadDriveTorque(fullLoadCurveEntry.EngineSpeed), + 0.SI<NewtonMeter>()) + })) + .Concat( + new[] { engineData.IdleSpeed, engineData.IdleSpeed - 0.1.RPMtoRad() }.Select(x => new VehicleMaxPropulsionTorque.FullLoadEntry() { - MotorSpeed = fullLoadCurveEntry.EngineSpeed, - FullDriveTorque = fullLoadCurveEntry.TorqueFullLoad + - VectoMath.Max( - offset.FullLoadDriveTorque(fullLoadCurveEntry.EngineSpeed), + MotorSpeed = x, + FullDriveTorque = engineData.FullLoadCurves[0].FullLoadStationaryTorque(x) + + VectoMath.Max(offset?.FullLoadDriveTorque(x), 0.SI<NewtonMeter>()) })) - .Concat( - new[] { engineData.IdleSpeed, engineData.IdleSpeed - 0.1.RPMtoRad() }.Select(x => - new VehicleMaxPropulsionTorque.FullLoadEntry() { - MotorSpeed = x, - FullDriveTorque = engineData.FullLoadCurves[0].FullLoadStationaryTorque(x) + - VectoMath.Max(offset.FullLoadDriveTorque(x), - 0.SI<NewtonMeter>()) - })) - .OrderBy(x => x.MotorSpeed).ToList(); - - return new VehicleMaxPropulsionTorque(entries); + .OrderBy(x => x.MotorSpeed).ToList(); + + // if no gearbox limit is defined, MaxTorque is null; + // in case of P3 or P4, do not apply gearbox limit to propulsion limit as ICE is already cropped with max torque + var gearboxTorqueLimit = isP3OrP4Hybrid ? null : gearboxData.Gears[key].MaxTorque; + retVal[new GearshiftPosition(key)] = new VehicleMaxPropulsionTorque(IntersectMaxPropulsionTorqueCurve(entries, gearboxTorqueLimit)); + + } + + return retVal; } } } diff --git a/VectoCore/VectoCore/InputData/Reader/Impl/EngineeringModeVectoRunDataFactory.cs b/VectoCore/VectoCore/InputData/Reader/Impl/EngineeringModeVectoRunDataFactory.cs index e40b9957e28e4ee4d098b97fa4f8e484519b417f..5afe571678dd687776015c3fd2c27f05cd3ef9ac 100644 --- a/VectoCore/VectoCore/InputData/Reader/Impl/EngineeringModeVectoRunDataFactory.cs +++ b/VectoCore/VectoCore/InputData/Reader/Impl/EngineeringModeVectoRunDataFactory.cs @@ -191,8 +191,8 @@ namespace TUGraz.VectoCore.InputData.Reader.Impl var vehicleData = dao.CreateVehicleData(vehicle); - var hybridParameters = dao.CreateHybridStrategyParameters(InputDataProvider.JobInputData.HybridStrategyParameters, - null, engineData); + var hybridParameters = dao.CreateHybridStrategyParameters(InputDataProvider.JobInputData, + engineData, gearboxData); yield return new VectoRunData { JobName = InputDataProvider.JobInputData.JobName, JobType = jobType, @@ -412,8 +412,7 @@ namespace TUGraz.VectoCore.InputData.Reader.Impl } var hybridParameters = jobType == VectoSimulationJobType.ParallelHybridVehicle - ? dao.CreateHybridStrategyParameters(InputDataProvider.JobInputData.HybridStrategyParameters, - vehicle.BoostingLimitations, engineData) + ? dao.CreateHybridStrategyParameters(InputDataProvider.JobInputData, engineData, gearboxData) : null; yield return new VectoRunData { JobName = InputDataProvider.JobInputData.JobName, diff --git a/VectoCore/VectoCore/Models/SimulationComponent/Data/HybridStrategyParameters.cs b/VectoCore/VectoCore/Models/SimulationComponent/Data/HybridStrategyParameters.cs index 13b66e4008ad65ca6aae88310f9e6eabb07f3c12..8be989c132b866ac889225214b7da7efef833f80 100644 --- a/VectoCore/VectoCore/Models/SimulationComponent/Data/HybridStrategyParameters.cs +++ b/VectoCore/VectoCore/Models/SimulationComponent/Data/HybridStrategyParameters.cs @@ -1,5 +1,7 @@ -using TUGraz.VectoCommon.InputData; +using System.Collections.Generic; +using TUGraz.VectoCommon.InputData; using TUGraz.VectoCommon.Utils; +using TUGraz.VectoCore.Models.SimulationComponent.Impl; namespace TUGraz.VectoCore.Models.SimulationComponent.Data { public class HybridStrategyParameters @@ -20,7 +22,8 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Data { public Second MinICEOnTime { get; set; } - public VehicleMaxPropulsionTorque MaxPropulsionTorque { get; set; } + public Dictionary<GearshiftPosition, VehicleMaxPropulsionTorque> MaxPropulsionTorque { get; set; } + public double ICEStartPenaltyFactor { get; set; } //public Watt MaxDrivetrainPower { get; set; } diff --git a/VectoCore/VectoCore/Models/SimulationComponent/Data/VehicleMaxPropulsionTorque.cs b/VectoCore/VectoCore/Models/SimulationComponent/Data/VehicleMaxPropulsionTorque.cs index f95321dd4c3bc9f752f966a0bce51782dcbfd0e8..82dce7fb54198c3f8debd6a247619bddbd0a1edf 100644 --- a/VectoCore/VectoCore/Models/SimulationComponent/Data/VehicleMaxPropulsionTorque.cs +++ b/VectoCore/VectoCore/Models/SimulationComponent/Data/VehicleMaxPropulsionTorque.cs @@ -8,9 +8,9 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Data { public class VehicleMaxPropulsionTorque { - internal readonly List<FullLoadEntry> FullLoadEntries; + internal readonly IList<FullLoadEntry> FullLoadEntries; - internal VehicleMaxPropulsionTorque(List<FullLoadEntry> entries) + internal VehicleMaxPropulsionTorque(IList<FullLoadEntry> entries) { FullLoadEntries = entries; } diff --git a/VectoCore/VectoCore/Models/SimulationComponent/Impl/HybridController.cs b/VectoCore/VectoCore/Models/SimulationComponent/Impl/HybridController.cs index 606bba2cd7ee27458722abae998951a03de5c039..069781313de40b1d8b0123d2cd3ec4232e7415e6 100644 --- a/VectoCore/VectoCore/Models/SimulationComponent/Impl/HybridController.cs +++ b/VectoCore/VectoCore/Models/SimulationComponent/Impl/HybridController.cs @@ -439,9 +439,9 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl response.Engine.DynamicFullLoadTorque; //EnginePowerRequest - response.DeltaFullLoad; var reserve = 1 - response.Engine.TorqueOutDemand / fullLoadPower; - if (_runData != null && _runData.HybridStrategyParameters.MaxPropulsionTorque != null) { + if (_runData != null && _runData.HybridStrategyParameters.MaxPropulsionTorque?.GetVECTOValueOrDefault(gear) != null) { var tqRequest = response.Gearbox.InputTorque; - var maxTorque = _runData.HybridStrategyParameters.MaxPropulsionTorque.FullLoadDriveTorque(response.Gearbox.InputSpeed); + var maxTorque = _runData.HybridStrategyParameters.MaxPropulsionTorque[gear].FullLoadDriveTorque(response.Gearbox.InputSpeed); reserve = 1 - VectoMath.Min(response.Engine.TorqueOutDemand / fullLoadPower, tqRequest / maxTorque); } diff --git a/VectoCore/VectoCore/Models/SimulationComponent/Strategies/HybridStrategy.cs b/VectoCore/VectoCore/Models/SimulationComponent/Strategies/HybridStrategy.cs index de58d4542de3366a7dbe08229c9d7e5ace2a9ef6..aa1f6f553724be10172dc5382de4714380dc529b 100644 --- a/VectoCore/VectoCore/Models/SimulationComponent/Strategies/HybridStrategy.cs +++ b/VectoCore/VectoCore/Models/SimulationComponent/Strategies/HybridStrategy.cs @@ -602,15 +602,15 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Strategies public virtual IHybridStrategyResponse Request(Second absTime, Second dt, NewtonMeter outTorque, PerSecond outAngularVelocity, bool dryRun) { - - if (DataBus.DriverInfo.DrivingAction == DrivingAction.Accelerate && StrategyParameters.MaxPropulsionTorque != null && DataBus.GearboxInfo.TCLocked) { - var nextGear = DataBus.VehicleInfo.VehicleStopped + var nextGear = DataBus.VehicleInfo.VehicleStopped + ? Controller.ShiftStrategy.NextGear + : !DataBus.GearboxInfo.GearEngaged(absTime) ? Controller.ShiftStrategy.NextGear - : !DataBus.GearboxInfo.GearEngaged(absTime) - ? Controller.ShiftStrategy.NextGear - : PreviousState.GearboxEngaged - ? DataBus.GearboxInfo.Gear - : Controller.ShiftStrategy.NextGear; + : PreviousState.GearboxEngaged + ? DataBus.GearboxInfo.Gear + : Controller.ShiftStrategy.NextGear; + if (DataBus.DriverInfo.DrivingAction == DrivingAction.Accelerate && StrategyParameters.MaxPropulsionTorque?.GetVECTOValueOrDefault(nextGear) != null && DataBus.GearboxInfo.TCLocked) { + var emOff = new HybridStrategyResponse { CombustionEngineOn = DataBus.EngineInfo.EngineOn, // AllowICEOff(absTime), GearboxInNeutral = false, @@ -628,7 +628,7 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Strategies if (testRequest.Gearbox.InputSpeed < DataBus.EngineInfo.EngineN95hSpeed) { var emPos = ModelData.ElectricMachinesData.First().Item1; var tqRequest = GetGearboxInTorqueLimitedVehiclePorpTorque(testRequest, emPos); //testRequest.Gearbox.InputTorque; - var maxTorque = StrategyParameters.MaxPropulsionTorque.FullLoadDriveTorque(testRequest.Gearbox.InputSpeed); + var maxTorque = StrategyParameters.MaxPropulsionTorque[nextGear].FullLoadDriveTorque(testRequest.Gearbox.InputSpeed); if (!dryRun) { CurrentState.MaxGbxTq = maxTorque; @@ -755,14 +755,14 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Strategies // } //} - if (dryRun && DataBus.DriverInfo.DrivingAction == DrivingAction.Accelerate && StrategyParameters.MaxPropulsionTorque != null) { + if (dryRun && DataBus.DriverInfo.DrivingAction == DrivingAction.Accelerate && StrategyParameters.MaxPropulsionTorque?.GetVECTOValueOrDefault(response.Gearbox.Gear) != null) { var dryRunResponse = response as ResponseDryRun; if (response.Engine.EngineOn && dryRunResponse.DeltaFullLoad.IsSmallerOrEqual(0) && dryRunResponse.DeltaDragLoad.IsGreaterOrEqual(0) && LimitedGbxTorque) { // during this request the torque at gbx-in was limited - engine is ok and a seaerch operation is going on // overwrite delta value... var maxTorque = - StrategyParameters.MaxPropulsionTorque.FullLoadDriveTorque(response.Gearbox.InputSpeed); + StrategyParameters.MaxPropulsionTorque[response.Gearbox.Gear].FullLoadDriveTorque(response.Gearbox.InputSpeed); var emPos = ModelData.ElectricMachinesData.First().Item1; @@ -871,7 +871,7 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Strategies var candidates = new Dictionary<GearshiftPosition, Tuple<Watt, IResponse>>(); var maxTorqueGbxIn = - StrategyParameters.MaxPropulsionTorque.FullLoadDriveTorque(emOffResponse.Gearbox.InputSpeed); + StrategyParameters.MaxPropulsionTorque[gear].FullLoadDriveTorque(emOffResponse.Gearbox.InputSpeed); candidates[emOffResponse.Gearbox.Gear] = Tuple.Create(maxTorqueGbxIn * emOffResponse.Gearbox.InputSpeed, emOffResponse); foreach (var nextGear in GearList.IterateGears(firstGear, lastGear)) { if (candidates.ContainsKey(nextGear)) { @@ -892,8 +892,10 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Strategies } var testRequest = RequestDryRun(absTime, dt, outTorque, outAngularVelocity, nextGear, emOff); if (testRequest != null && testRequest.Engine.EngineSpeed < ModelData.EngineData.FullLoadCurves[0].NTq99hSpeed) { - var maxGbxTorque = StrategyParameters.MaxPropulsionTorque.FullLoadDriveTorque(testRequest.Gearbox.InputSpeed); - candidates[nextGear] = Tuple.Create(maxGbxTorque * testRequest.Gearbox.InputSpeed, testRequest); + var maxGbxTorque = StrategyParameters.MaxPropulsionTorque?.GetVECTOValueOrDefault(nextGear).FullLoadDriveTorque(testRequest.Gearbox.InputSpeed); + candidates[nextGear] = maxGbxTorque != null + ? Tuple.Create(maxGbxTorque * testRequest.Gearbox.InputSpeed, testRequest) + : Tuple.Create(testRequest.Gearbox.InputTorque * testRequest.Gearbox.InputSpeed, testRequest); } } @@ -2153,10 +2155,10 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Strategies } if (DataBus.DriverInfo.DrivingAction == DrivingAction.Accelerate && - StrategyParameters.MaxPropulsionTorque != null) { + StrategyParameters.MaxPropulsionTorque?.GetVECTOValueOrDefault(resp.Gearbox.Gear) != null) { var tqRequest = resp.Gearbox.InputTorque; var maxTorque = - StrategyParameters.MaxPropulsionTorque.FullLoadDriveTorque(resp.Gearbox.InputSpeed); + StrategyParameters.MaxPropulsionTorque[resp.Gearbox.Gear].FullLoadDriveTorque(resp.Gearbox.InputSpeed); if (((tqRequest - maxTorque) * resp.Gearbox.InputSpeed).IsGreater(0, Constants.SimulationSettings.LineSearchTolerance)) { tmp.IgnoreReason |= HybridConfigurationIgnoreReason.MaxPropulsionTorqueExceeded; } diff --git a/VectoCore/VectoCore/Models/SimulationComponent/Strategies/SerialHybridStrategy.cs b/VectoCore/VectoCore/Models/SimulationComponent/Strategies/SerialHybridStrategy.cs index 2949a0d18f3dd0ce37a0729209ea06b44ea812be..6dc54150222a701e57c4b8b32f1e93714aa045de 100644 --- a/VectoCore/VectoCore/Models/SimulationComponent/Strategies/SerialHybridStrategy.cs +++ b/VectoCore/VectoCore/Models/SimulationComponent/Strategies/SerialHybridStrategy.cs @@ -510,7 +510,7 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Strategies return null; } - if (DataBus.VehicleInfo.VehicleSpeed.IsSmallerOrEqual(ModelData.GearboxData.DisengageWhenHaltingSpeed) && emOutTorque.IsSmaller(0)) { + if (ModelData.GearboxData != null && DataBus.VehicleInfo.VehicleSpeed.IsSmallerOrEqual(ModelData.GearboxData.DisengageWhenHaltingSpeed) && emOutTorque.IsSmaller(0)) { return null; } @@ -572,7 +572,8 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Strategies GenSetOperatingPoint maxPowerGenset, Second dt) { var reqBatteryPower = maxPowerGenset.ElectricPower + drivetrainDemand.ElectricPowerDemand; - if (DataBus.BatteryInfo.StateOfCharge.IsEqual(StrategyParameters.MinSoC, 0.01) && reqBatteryPower < 0 && drivetrainDemand.ElectricPowerDemand < drivetrainDemand.Response.ElectricSystem.MaxPowerDrive) { + if (DataBus.BatteryInfo.StateOfCharge.IsEqual(StrategyParameters.MinSoC, 0.01) && reqBatteryPower < 0 && + drivetrainDemand.ElectricPowerDemand < drivetrainDemand.Response.ElectricSystem.MaxPowerDrive) { return StateMachineState.Acc_S3; } diff --git a/VectoCore/VectoCore/Utils/DictionaryExtensionMethods.cs b/VectoCore/VectoCore/Utils/DictionaryExtensionMethods.cs index f1f22de6c418c13b34f5d1a777b01639112cca06..6a73586de115af7f99d4f0dde068df37c0e1e2ef 100644 --- a/VectoCore/VectoCore/Utils/DictionaryExtensionMethods.cs +++ b/VectoCore/VectoCore/Utils/DictionaryExtensionMethods.cs @@ -41,7 +41,7 @@ namespace TUGraz.VectoCore.Utils { internal static class DictionaryExtensionMethods { - public static object GetValueOrNull<TKey, TValue>(this IDictionary<TKey, TValue> dictionary, TKey key) => + public static object GetValueOrDBNull<TKey, TValue>(this IDictionary<TKey, TValue> dictionary, TKey key) => dictionary.TryGetValue(key, out var value) ? (object)value : DBNull.Value; public static TValue GetValueOrZero<TKey, TValue>(this IDictionary<TKey, TValue> dictionary, TKey key) diff --git a/VectoCore/VectoCore/Utils/IterationStatistics.cs b/VectoCore/VectoCore/Utils/IterationStatistics.cs index 3668647971f04fe4d9b988d160a611cd9c47966a..48aa503560f17caceabf0830eaa02e02c73a211c 100644 --- a/VectoCore/VectoCore/Utils/IterationStatistics.cs +++ b/VectoCore/VectoCore/Utils/IterationStatistics.cs @@ -106,24 +106,24 @@ namespace TUGraz.VectoCore.Utils row["StepDuration"] = entry.Duration.TotalMilliseconds; if (entry.Values.ContainsKey("DistanceRun")) { - row["Distance"] = entry.Values["DistanceRun"].GetValueOrNull("Distance"); - row["Time"] = entry.Values["DistanceRun"].GetValueOrNull("Time"); - row["StepIterationCount"] = entry.Values["DistanceRun"].GetValueOrNull("Iterations"); + row["Distance"] = entry.Values["DistanceRun"].GetValueOrDBNull("Distance"); + row["Time"] = entry.Values["DistanceRun"].GetValueOrDBNull("Time"); + row["StepIterationCount"] = entry.Values["DistanceRun"].GetValueOrDBNull("Iterations"); } if (entry.Values.ContainsKey("Driver")) { - row["NumDriverRequests"] = entry.Values["Driver"].GetValueOrNull("Requests"); - row["NumAccelActions"] = entry.Values["Driver"].GetValueOrNull("Accelerate"); - row["NumBrakeActions"] = entry.Values["Driver"].GetValueOrNull("Brake"); - row["NumCoastActions"] = entry.Values["Driver"].GetValueOrNull("Coast"); - row["NumRollActions"] = entry.Values["Driver"].GetValueOrNull("Roll"); - row["SearchOPIterations"] = entry.Values["Driver"].GetValueOrNull("SearchOperatingPoint"); - row["SearchBrakeIterations"] = entry.Values["Driver"].GetValueOrNull("SearchBrakingPower"); + row["NumDriverRequests"] = entry.Values["Driver"].GetValueOrDBNull("Requests"); + row["NumAccelActions"] = entry.Values["Driver"].GetValueOrDBNull("Accelerate"); + row["NumBrakeActions"] = entry.Values["Driver"].GetValueOrDBNull("Brake"); + row["NumCoastActions"] = entry.Values["Driver"].GetValueOrDBNull("Coast"); + row["NumRollActions"] = entry.Values["Driver"].GetValueOrDBNull("Roll"); + row["SearchOPIterations"] = entry.Values["Driver"].GetValueOrDBNull("SearchOperatingPoint"); + row["SearchBrakeIterations"] = entry.Values["Driver"].GetValueOrDBNull("SearchBrakingPower"); } if (entry.Values.ContainsKey("Gearbox")) { - row["NumGearboxRequests"] = entry.Values["Gearbox"].GetValueOrNull("Requests"); + row["NumGearboxRequests"] = entry.Values["Gearbox"].GetValueOrDBNull("Requests"); } if (entry.Values.ContainsKey("CombustionEngine")) { - row["NumEngineRequests"] = entry.Values["CombustionEngine"].GetValueOrNull("Requests"); + row["NumEngineRequests"] = entry.Values["CombustionEngine"].GetValueOrDBNull("Requests"); } table.Rows.Add(row); } diff --git a/VectoCore/VectoCoreTest/Integration/Hybrid/ParallelHybridTest.cs b/VectoCore/VectoCoreTest/Integration/Hybrid/ParallelHybridTest.cs index 02a72ebcf106e7769d466becb27a9f34796d8cc8..5cdbf6683c2c58658031875bfb2144991cd30c90 100644 --- a/VectoCore/VectoCoreTest/Integration/Hybrid/ParallelHybridTest.cs +++ b/VectoCore/VectoCoreTest/Integration/Hybrid/ParallelHybridTest.cs @@ -10,6 +10,7 @@ using TUGraz.VectoCore.Configuration; using TUGraz.VectoCore.InputData.FileIO.JSON; using TUGraz.VectoCore.InputData.Impl; 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; @@ -315,7 +316,7 @@ namespace TUGraz.VectoCore.Tests.Integration.Hybrid var graphWriter = GetGraphWriter(new[] { ModalResultField.P_electricMotor_mech_P2 }); var cycleData = string.Format( @" 0, 0, {1}, 3 - 700, {0}, {1}, 0", vmax, slope); + 1200, {0}, {1}, 0", vmax, slope); var cycle = SimpleDrivingCycles.CreateCycleData(cycleData); var modFilename = $"SimpleParallelHybrid-P2_acc_{vmax}-{initialSoC}_{slope}.vmod"; @@ -338,23 +339,121 @@ namespace TUGraz.VectoCore.Tests.Integration.Hybrid graphWriter.Write(modFilename); } + [ + TestCase(80, 0.7, 5, TestName = "P2 Hybrid GbxTqLimit DriveOff 80km/h SoC: 0.7, UH 5%"), + ] + public void P2HybridDriveOffGbxTqLimit(double vmax, double initialSoC, double slope) + { + var graphWriter = GetGraphWriter(new[] { ModalResultField.P_electricMotor_mech_P2 }); + var cycleData = string.Format( + @" 0, 0, {1}, 3 + 1200, {0}, {1}, 0", vmax, slope); + var cycle = SimpleDrivingCycles.CreateCycleData(cycleData); + + var modFilename = $"SimpleParallelHybrid-P2_acc_{vmax}-{initialSoC}_{slope}_gbxLimit-2300.vmod"; + const PowertrainPosition pos = PowertrainPosition.HybridP2; + var job = CreateEngineeringRun( + cycle, modFilename, initialSoC, pos, 1.0, largeMotor: true, maxGearboxTorque: 2370.SI<NewtonMeter>()); + var run = job.Runs.First().Run; + + var hybridController = (HybridController)((VehicleContainer)run.GetContainer()).HybridController; + Assert.NotNull(hybridController); + + var modData = ((ModalDataContainer)((VehicleContainer)run.GetContainer()).ModData).Data; + + //run.Run(); + job.Execute(); + job.WaitFinished(); + Assert.IsTrue(run.FinishedWithoutErrors); + + Assert.IsTrue(modData.Rows.Count > 0); + graphWriter.Write(modFilename); + } [ - TestCase(80, 0.7, 5, 320, TestName = "P2 Hybrid DriveOff 80km/h SoC: 0.7, UH 5% MaxPWR: 320kW"), - + TestCase(80, 0.7, 5, 0, TestName = "P2 Hybrid BoostingLimit 0Nm DriveOff 80km/h SoC: 0.7, UH 5%"), + TestCase(80, 0.7, 5, 100, TestName = "P2 Hybrid BoostingLimit 100Nm DriveOff 80km/h SoC: 0.7, UH 5%"), ] - public void P2HybridDriveOffLimitPwr(double vmax, double initialSoC, double slope, double maxPwrkW) + public void P2HybridDriveOffBoostingLimitLimit(double vmax, double initialSoC, double slope, double boostingLimit) { var graphWriter = GetGraphWriter(new[] { ModalResultField.P_electricMotor_mech_P2 }); var cycleData = string.Format( @" 0, 0, {1}, 3 - 700, {0}, {1}, 0", vmax, slope); + 1200, {0}, {1}, 0", vmax, slope); var cycle = SimpleDrivingCycles.CreateCycleData(cycleData); - var modFilename = $"SimpleParallelHybrid-P2_acc_{vmax}-{initialSoC}_{slope}_maxPwr-{maxPwrkW}.vmod"; + var modFilename = $"SimpleParallelHybrid-P2_acc_{vmax}-{initialSoC}_{slope}_boostingLimit-{boostingLimit}.vmod"; const PowertrainPosition pos = PowertrainPosition.HybridP2; var job = CreateEngineeringRun( - cycle, modFilename, initialSoC, pos, 1.0, largeMotor: true, maxDriveTrainPower: (maxPwrkW * 1000).SI<Watt>()); + cycle, modFilename, initialSoC, pos, 1.0, largeMotor: true, boostingLimit: boostingLimit.SI<NewtonMeter>()); + var run = job.Runs.First().Run; + + var hybridController = (HybridController)((VehicleContainer)run.GetContainer()).HybridController; + Assert.NotNull(hybridController); + + var modData = ((ModalDataContainer)((VehicleContainer)run.GetContainer()).ModData).Data; + + //run.Run(); + job.Execute(); + job.WaitFinished(); + Assert.IsTrue(run.FinishedWithoutErrors); + + Assert.IsTrue(modData.Rows.Count > 0); + graphWriter.Write(modFilename); + } + + + [ + TestCase(80, 0.7, 5, 100, TestName = "P2 Hybrid BoostingAndGbxLimit 150Nm DriveOff 80km/h SoC: 0.7, UH 5%"), + ] + public void P2HybridDriveOffBoostingAndGbxLimit(double vmax, double initialSoC, double slope, double boostingLimit) + { + var graphWriter = GetGraphWriter(new[] { ModalResultField.P_electricMotor_mech_P2 }); + var cycleData = string.Format( + @" 0, 0, {1}, 3 + 1200, {0}, {1}, 0", vmax, slope); + var cycle = SimpleDrivingCycles.CreateCycleData(cycleData); + + var modFilename = $"SimpleParallelHybrid-P2_acc_{vmax}-{initialSoC}_{slope}_boostingAndGbxLimit-{boostingLimit}.vmod"; + const PowertrainPosition pos = PowertrainPosition.HybridP2; + var job = CreateEngineeringRun( + cycle, modFilename, initialSoC, pos, 1.0, largeMotor: true, boostingLimit: boostingLimit.SI<NewtonMeter>(), maxGearboxTorque: 2370.SI<NewtonMeter>()); + var run = job.Runs.First().Run; + + var hybridController = (HybridController)((VehicleContainer)run.GetContainer()).HybridController; + Assert.NotNull(hybridController); + + var modData = ((ModalDataContainer)((VehicleContainer)run.GetContainer()).ModData).Data; + + //run.Run(); + job.Execute(); + job.WaitFinished(); + Assert.IsTrue(run.FinishedWithoutErrors); + + Assert.IsTrue(modData.Rows.Count > 0); + graphWriter.Write(modFilename); + } + + [ + TestCase(80, 0.7, 5, 100, TestName = "P2 Hybrid BoostingAndGbxLimit TopTorque 150Nm DriveOff 80km/h SoC: 0.7, UH 5%"), + ] + public void P2HybridDriveOffBoostingAndGbxLimitTopTorque(double vmax, double initialSoC, double slope, double boostingLimit) + { + var graphWriter = GetGraphWriter(new[] { ModalResultField.P_electricMotor_mech_P2 }); + var cycleData = string.Format( + @" 0, 0, {1}, 3 + 1200, {0}, {1}, 0 + 1201, {0}, {2}, 0 + 2000, {0}, {2}, 0", vmax, slope, 7.2); + var cycle = SimpleDrivingCycles.CreateCycleData(cycleData); + + var modFilename = $"SimpleParallelHybrid-P2_acc_{vmax}-{initialSoC}_{slope}_boostingAndGbxLimitTopTorque-{boostingLimit}.vmod"; + const PowertrainPosition pos = PowertrainPosition.HybridP2; + var job = CreateEngineeringRun( + cycle, modFilename, initialSoC, pos, 1.0, largeMotor: true, + boostingLimit: boostingLimit.SI<NewtonMeter>(), maxGearboxTorque: 2370.SI<NewtonMeter>(), + topTorque: 2000.SI<NewtonMeter>()); + var run = job.Runs.First().Run; var hybridController = (HybridController)((VehicleContainer)run.GetContainer()).HybridController; @@ -526,25 +625,97 @@ namespace TUGraz.VectoCore.Tests.Integration.Hybrid public const string Group5TestJob = @"TestData\Hybrids\GenericVehicle_Group5_P2\P2 Group 5.vecto"; + public const string Group5TestJob_GbxTqLimit = @"TestData\Hybrids\GenericVehicle_Group5_P2\P2 Group 5_GbxTqLimit.vecto"; + + public const string Group5TestJob_BoostingLimit = @"TestData\Hybrids\GenericVehicle_Group5_P2\P2 Group 5_BoostingLimit.vecto"; + + public const string Group5TestJob_BoostingAndGbxLimit = @"TestData\Hybrids\GenericVehicle_Group5_P2\P2 Group 5_BoostingAndGbxLimit.vecto"; + + public const string Group5TestJob_BoostingAndGbxLimitTopTorque = @"TestData\Hybrids\GenericVehicle_Group5_P2\P2 Group 5_BoostingAndGbxLimitTopTorque.vecto"; + + public const string Group5TestJob_BoostingLimitTopTorque = @"TestData\Hybrids\GenericVehicle_Group5_P2\P2 Group 5_BoostingLimitTopTorque.vecto"; + public const string Group5TestJob_BatterySystem = @"TestData\Hybrids\GenericVehicle_Group5_P2_BatSystem\P2 Group 5.vecto"; public const string Group5TestJob_BatterySystem2 = @"TestData\Hybrids\GenericVehicle_Group5_P2_BatSystem\P2 Group 5_2.vecto"; [ - TestCase(Group5TestJob, 0, TestName = "P2 Hybrid Group 5 DriveCycle LongHaul"), - TestCase(Group5TestJob, 1, TestName = "P2 Hybrid Group 5 DriveCycle Coach"), - TestCase(Group5TestJob, 2, TestName = "P2 Hybrid Group 5 DriveCycle Construction"), - TestCase(Group5TestJob, 3, TestName = "P2 Hybrid Group 5 DriveCycle HeavyUrban"), - TestCase(Group5TestJob, 4, TestName = "P2 Hybrid Group 5 DriveCycle Interurban"), - TestCase(Group5TestJob, 5, TestName = "P2 Hybrid Group 5 DriveCycle MunicipalUtility"), - TestCase(Group5TestJob, 6, TestName = "P2 Hybrid Group 5 DriveCycle RegionalDelivery"), - TestCase(Group5TestJob, 7, TestName = "P2 Hybrid Group 5 DriveCycle Suburban"), - TestCase(Group5TestJob, 8, TestName = "P2 Hybrid Group 5 DriveCycle Urban"), - TestCase(Group5TestJob, 9, TestName = "P2 Hybrid Group 5 DriveCycle UrbanDelivery"), + TestCase(Group5TestJob, 0, TestName = "P2 Hybrid Group 5 DriveCycle LongHaul"), + TestCase(Group5TestJob, 1, TestName = "P2 Hybrid Group 5 DriveCycle Coach"), + TestCase(Group5TestJob, 2, TestName = "P2 Hybrid Group 5 DriveCycle Construction"), + TestCase(Group5TestJob, 3, TestName = "P2 Hybrid Group 5 DriveCycle HeavyUrban"), + TestCase(Group5TestJob, 4, TestName = "P2 Hybrid Group 5 DriveCycle Interurban"), + TestCase(Group5TestJob, 5, TestName = "P2 Hybrid Group 5 DriveCycle MunicipalUtility"), + TestCase(Group5TestJob, 6, TestName = "P2 Hybrid Group 5 DriveCycle RegionalDelivery"), + TestCase(Group5TestJob, 7, TestName = "P2 Hybrid Group 5 DriveCycle Suburban"), + TestCase(Group5TestJob, 8, TestName = "P2 Hybrid Group 5 DriveCycle Urban"), + TestCase(Group5TestJob, 9, TestName = "P2 Hybrid Group 5 DriveCycle UrbanDelivery"), + ] + [ + TestCase(Group5TestJob_GbxTqLimit, 0, TestName = "P2 Hybrid Group 5 GbxTqLimit DriveCycle LongHaul"), + TestCase(Group5TestJob_GbxTqLimit, 1, TestName = "P2 Hybrid Group 5 GbxTqLimit DriveCycle Coach"), + TestCase(Group5TestJob_GbxTqLimit, 2, TestName = "P2 Hybrid Group 5 GbxTqLimit DriveCycle Construction"), + TestCase(Group5TestJob_GbxTqLimit, 3, TestName = "P2 Hybrid Group 5 GbxTqLimit DriveCycle HeavyUrban"), + TestCase(Group5TestJob_GbxTqLimit, 4, TestName = "P2 Hybrid Group 5 GbxTqLimit DriveCycle Interurban"), + TestCase(Group5TestJob_GbxTqLimit, 5, TestName = "P2 Hybrid Group 5 GbxTqLimit DriveCycle MunicipalUtility"), + TestCase(Group5TestJob_GbxTqLimit, 6, TestName = "P2 Hybrid Group 5 GbxTqLimit DriveCycle RegionalDelivery"), + TestCase(Group5TestJob_GbxTqLimit, 7, TestName = "P2 Hybrid Group 5 GbxTqLimit DriveCycle Suburban"), + TestCase(Group5TestJob_GbxTqLimit, 8, TestName = "P2 Hybrid Group 5 GbxTqLimit DriveCycle Urban"), + TestCase(Group5TestJob_GbxTqLimit, 9, TestName = "P2 Hybrid Group 5 GbxTqLimit DriveCycle UrbanDelivery"), + ] + [ + TestCase(Group5TestJob_BoostingLimit, 0, TestName = "P2 Hybrid Group 5 BoostingLimit DriveCycle LongHaul"), + TestCase(Group5TestJob_BoostingLimit, 1, TestName = "P2 Hybrid Group 5 BoostingLimit DriveCycle Coach"), + TestCase(Group5TestJob_BoostingLimit, 2, TestName = "P2 Hybrid Group 5 BoostingLimit DriveCycle Construction"), + TestCase(Group5TestJob_BoostingLimit, 3, TestName = "P2 Hybrid Group 5 BoostingLimit DriveCycle HeavyUrban"), + TestCase(Group5TestJob_BoostingLimit, 4, TestName = "P2 Hybrid Group 5 BoostingLimit DriveCycle Interurban"), + TestCase(Group5TestJob_BoostingLimit, 5, TestName = "P2 Hybrid Group 5 BoostingLimit DriveCycle MunicipalUtility"), + TestCase(Group5TestJob_BoostingLimit, 6, TestName = "P2 Hybrid Group 5 BoostingLimit DriveCycle RegionalDelivery"), + TestCase(Group5TestJob_BoostingLimit, 7, TestName = "P2 Hybrid Group 5 BoostingLimit DriveCycle Suburban"), + TestCase(Group5TestJob_BoostingLimit, 8, TestName = "P2 Hybrid Group 5 BoostingLimit DriveCycle Urban"), + TestCase(Group5TestJob_BoostingLimit, 9, TestName = "P2 Hybrid Group 5 BoostingLimit DriveCycle UrbanDelivery"), + ] + [ + TestCase(Group5TestJob_BoostingAndGbxLimit, 0, TestName = "P2 Hybrid Group 5 BoostingAndGbxLimit DriveCycle LongHaul"), + TestCase(Group5TestJob_BoostingAndGbxLimit, 1, TestName = "P2 Hybrid Group 5 BoostingAndGbxLimit DriveCycle Coach"), + TestCase(Group5TestJob_BoostingAndGbxLimit, 2, TestName = "P2 Hybrid Group 5 BoostingAndGbxLimit DriveCycle Construction"), + TestCase(Group5TestJob_BoostingAndGbxLimit, 3, TestName = "P2 Hybrid Group 5 BoostingAndGbxLimit DriveCycle HeavyUrban"), + TestCase(Group5TestJob_BoostingAndGbxLimit, 4, TestName = "P2 Hybrid Group 5 BoostingAndGbxLimit DriveCycle Interurban"), + TestCase(Group5TestJob_BoostingAndGbxLimit, 5, TestName = "P2 Hybrid Group 5 BoostingAndGbxLimit DriveCycle MunicipalUtility"), + TestCase(Group5TestJob_BoostingAndGbxLimit, 6, TestName = "P2 Hybrid Group 5 BoostingAndGbxLimit DriveCycle RegionalDelivery"), + TestCase(Group5TestJob_BoostingAndGbxLimit, 7, TestName = "P2 Hybrid Group 5 BoostingAndGbxLimit DriveCycle Suburban"), + TestCase(Group5TestJob_BoostingAndGbxLimit, 8, TestName = "P2 Hybrid Group 5 BoostingAndGbxLimit DriveCycle Urban"), + TestCase(Group5TestJob_BoostingAndGbxLimit, 9, TestName = "P2 Hybrid Group 5 BoostingAndGbxLimit DriveCycle UrbanDelivery"), + ] + [ + TestCase(Group5TestJob_BoostingAndGbxLimitTopTorque, 0, TestName = "P2 Hybrid Group 5 BoostingAndGbxLimit TopTorque DriveCycle LongHaul"), + TestCase(Group5TestJob_BoostingAndGbxLimitTopTorque, 1, TestName = "P2 Hybrid Group 5 BoostingAndGbxLimit TopTorque DriveCycle Coach"), + TestCase(Group5TestJob_BoostingAndGbxLimitTopTorque, 2, TestName = "P2 Hybrid Group 5 BoostingAndGbxLimit TopTorque DriveCycle Construction"), + TestCase(Group5TestJob_BoostingAndGbxLimitTopTorque, 3, TestName = "P2 Hybrid Group 5 BoostingAndGbxLimit TopTorque DriveCycle HeavyUrban"), + TestCase(Group5TestJob_BoostingAndGbxLimitTopTorque, 4, TestName = "P2 Hybrid Group 5 BoostingAndGbxLimit TopTorque DriveCycle Interurban"), + TestCase(Group5TestJob_BoostingAndGbxLimitTopTorque, 5, TestName = "P2 Hybrid Group 5 BoostingAndGbxLimit TopTorque DriveCycle MunicipalUtility"), + TestCase(Group5TestJob_BoostingAndGbxLimitTopTorque, 6, TestName = "P2 Hybrid Group 5 BoostingAndGbxLimit TopTorque DriveCycle RegionalDelivery"), + TestCase(Group5TestJob_BoostingAndGbxLimitTopTorque, 7, TestName = "P2 Hybrid Group 5 BoostingAndGbxLimit TopTorque DriveCycle Suburban"), + TestCase(Group5TestJob_BoostingAndGbxLimitTopTorque, 8, TestName = "P2 Hybrid Group 5 BoostingAndGbxLimit TopTorque DriveCycle Urban"), + TestCase(Group5TestJob_BoostingAndGbxLimitTopTorque, 9, TestName = "P2 Hybrid Group 5 BoostingAndGbxLimit TopTorque DriveCycle UrbanDelivery"), + ] + [ + TestCase(Group5TestJob_BoostingLimitTopTorque, 0, TestName = "P2 Hybrid Group 5 BoostingLimit TopTorque DriveCycle LongHaul"), + TestCase(Group5TestJob_BoostingLimitTopTorque, 1, TestName = "P2 Hybrid Group 5 BoostingLimit TopTorque DriveCycle Coach"), + TestCase(Group5TestJob_BoostingLimitTopTorque, 2, TestName = "P2 Hybrid Group 5 BoostingLimit TopTorque DriveCycle Construction"), + TestCase(Group5TestJob_BoostingLimitTopTorque, 3, TestName = "P2 Hybrid Group 5 BoostingLimit TopTorque DriveCycle HeavyUrban"), + TestCase(Group5TestJob_BoostingLimitTopTorque, 4, TestName = "P2 Hybrid Group 5 BoostingLimit TopTorque DriveCycle Interurban"), + TestCase(Group5TestJob_BoostingLimitTopTorque, 5, TestName = "P2 Hybrid Group 5 BoostingLimit TopTorque DriveCycle MunicipalUtility"), + TestCase(Group5TestJob_BoostingLimitTopTorque, 6, TestName = "P2 Hybrid Group 5 BoostingLimit TopTorque DriveCycle RegionalDelivery"), + TestCase(Group5TestJob_BoostingLimitTopTorque, 7, TestName = "P2 Hybrid Group 5 BoostingLimit TopTorque DriveCycle Suburban"), + TestCase(Group5TestJob_BoostingLimitTopTorque, 8, TestName = "P2 Hybrid Group 5 BoostingLimit TopTorque DriveCycle Urban"), + TestCase(Group5TestJob_BoostingLimitTopTorque, 9, TestName = "P2 Hybrid Group 5 BoostingLimit TopTorque DriveCycle UrbanDelivery"), ] public void P2HybridGroup5DriveCycle(string jobFile, int cycleIdx) { RunHybridJob(jobFile, cycleIdx); } + + [ TestCase(Group5TestJob_BatterySystem, 0, TestName = "P2 Hybrid Group 5 BatterySystem DriveCycle LongHaul"), TestCase(Group5TestJob_BatterySystem, 1, TestName = "P2 Hybrid Group 5 BatterySystem DriveCycle Coach"), @@ -1368,14 +1539,14 @@ namespace TUGraz.VectoCore.Tests.Integration.Hybrid public static JobContainer CreateEngineeringRun(DrivingCycleData cycleData, string modFileName, double initialSoc, PowertrainPosition pos, double ratio, bool largeMotor = false, double pAuxEl = 0, - Kilogram payload = null, Watt maxDriveTrainPower = null, GearboxType gearboxType = GearboxType.NoGearbox) + Kilogram payload = null, GearboxType gearboxType = GearboxType.NoGearbox, + NewtonMeter maxGearboxTorque = null, NewtonMeter boostingLimit = null, NewtonMeter topTorque = null) { var fileWriter = new FileOutputWriter(Path.GetFileNameWithoutExtension(modFileName)); var sumData = new SummaryDataContainer(fileWriter); var jobContainer = new JobContainer(sumData); var container = CreateParallelHybridPowerTrain( - cycleData, modFileName, initialSoc, largeMotor, sumData, pAuxEl, pos, ratio, payload, - maxDriveTrainPower, gearboxType); + cycleData, modFileName, initialSoc, largeMotor, sumData, pAuxEl, pos, ratio, payload, gearboxType, maxGearboxTorque, boostingLimit, topTorque); var run = new DistanceRun(container); jobContainer.AddRun(run); return jobContainer; @@ -1391,7 +1562,9 @@ namespace TUGraz.VectoCore.Tests.Integration.Hybrid public static VehicleContainer CreateParallelHybridPowerTrain(DrivingCycleData cycleData, string modFileName, double initialBatCharge, bool largeMotor, SummaryDataContainer sumData, double pAuxEl, - PowertrainPosition pos, double ratio, Kilogram payload = null, Watt maxDriveTrainPower = null, GearboxType gearboxType = GearboxType.NoGearbox) + PowertrainPosition pos, double ratio, Kilogram payload = null, + GearboxType gearboxType = GearboxType.NoGearbox, NewtonMeter maxGearboxTorque = null, + NewtonMeter boostingLimit = null, NewtonMeter topTorque = null) { var gearboxData = CreateGearboxData(gearboxType); var axleGearData = CreateAxleGearData(gearboxType); @@ -1408,7 +1581,7 @@ namespace TUGraz.VectoCore.Tests.Integration.Hybrid //batteryData.TargetSoC = 0.5; var engineData = MockSimulationDataFactory.CreateEngineDataFromFile( - Truck40tPowerTrain.EngineFile, gearboxData.Gears.Count); + Truck40tPowerTrain.EngineFile, gearboxData.Gears.Count, topTorque); foreach (var entry in gearboxData.Gears) { entry.Value.ShiftPolygon = DeclarationData.Gearbox.ComputeEfficiencyShiftPolygon( @@ -1433,9 +1606,32 @@ namespace TUGraz.VectoCore.Tests.Integration.Hybrid EngineData = engineData, BatteryData = batteryData, GearshiftParameters = CreateGearshiftData(gearboxData, axleGearData.AxleGear.Ratio, engineData.IdleSpeed), - HybridStrategyParameters = CreateHybridStrategyData(maxDriveTrainPower), + HybridStrategyParameters = CreateHybridStrategyData(), ElectricAuxDemand = pAuxEl.SI<Watt>() }; + var mockVehicleInput = new MockEngineeringVehicleInputData() { }; + mockVehicleInput.ElectricMachines = new MockElectricMachinesInputData() { + Entries = new List<ElectricMachineEntry<IElectricMotorEngineeringInputData>>() { + new ElectricMachineEntry<IElectricMotorEngineeringInputData>() { + Position = pos + } + } + }; + if (boostingLimit != null) { + mockVehicleInput.BoostingLimitations = VectoCSVFile.ReadStream( + $"n, T_drive\n0, {boostingLimit.Value()}\n1000, {boostingLimit.Value()}".ToStream()); + runData.HybridStrategyParameters.MaxPropulsionTorque = + EngineeringDataAdapter.CreateMaxPropulsionTorque(mockVehicleInput, engineData, + gearboxData); + } + if (maxGearboxTorque != null) { + foreach (var gear in gearboxData.Gears) { + gear.Value.MaxTorque = maxGearboxTorque; + } + runData.HybridStrategyParameters.MaxPropulsionTorque = + EngineeringDataAdapter.CreateMaxPropulsionTorque(mockVehicleInput, engineData, + gearboxData); + } var fileWriter = new FileOutputWriter(modFileName); var modDataFilter = new IModalDataFilter[] { }; //new IModalDataFilter[] { new ActualModalDataFilter(), }; var modData = new ModalDataContainer(runData, fileWriter, null, modDataFilter) @@ -1506,7 +1702,7 @@ namespace TUGraz.VectoCore.Tests.Integration.Hybrid return container; } - private static HybridStrategyParameters CreateHybridStrategyData(Watt maxDriveTrainPower) + private static HybridStrategyParameters CreateHybridStrategyData() { return new HybridStrategyParameters() { EquivalenceFactorDischarge = 2.5, diff --git a/VectoCore/VectoCoreTest/TestData/Hybrids/GenericVehicle_Group5_P2/P2 Group 5_GbxTqLimit.vecto b/VectoCore/VectoCoreTest/TestData/Hybrids/GenericVehicle_Group5_P2/P2 Group 5_GbxTqLimit.vecto new file mode 100644 index 0000000000000000000000000000000000000000..2fed58464c3fc7ca09dae981ecc889c17f12bd60 --- /dev/null +++ b/VectoCore/VectoCoreTest/TestData/Hybrids/GenericVehicle_Group5_P2/P2 Group 5_GbxTqLimit.vecto @@ -0,0 +1,64 @@ +{ + "Header": { + "CreatedBy": "", + "Date": "2020-08-24T13:41:04.1591616Z", + "AppVersion": "3", + "FileVersion": 8 + }, + "Body": { + "SavedInDeclMode": false, + "EngineOnlyMode": false, + "VehicleFile": "Vehicle\\Group5_HEV.vveh", + "EngineFile": "VKM\\Engine_325kW_12.7l.veng", + "GearboxFile": "Transmission\\AMT_12_TqLimit2500.vgbx", + "TCU": "Transmission\\AMT_12.vgbx", + "ShiftStrategy": "TUGraz.VectoCore.Models.SimulationComponent.Impl.AMTShiftStrategy", + "HybridStrategyParams": "ElectricMotor\\Inputdaten P2 Group 5\\Electric components\\Hybrid_Parameters.vhctl", + "AuxiliaryAssembly": "Classic", + "AuxiliaryVersion": "CLASSIC", + "AdvancedAuxiliaryFilePath": "", + "Aux": [], + "Padd": 3000.0, + "Padd_electric": 0.0, + "VACC": "Vehicle\\Truck.vacc", + "EngineStopStartAtVehicleStopThreshold": 0.0, + "EngineStopStartMaxOffTimespan": 1000.0, + "EngineStopStartUtilityFactor": 0.0, + "EcoRollMinSpeed": 0.0, + "EcoRollActivationDelay": 0.0, + "EcoRollUnderspeedThreshold": 0.0, + "EcoRollMaxAcceleration": 0.0, + "PCCEnableSpeed": 0.0, + "PCCMinSpeed": 0.0, + "PCCUnderspeed": 0.0, + "PCCOverSpeed": 5.0, + "PCCPreviewDistanceUC1": 0.0, + "PCCPreviewDistanceUC2": 0.0, + "LAC": { + "Enabled": true, + "PreviewDistanceFactor": 10.0, + "DF_offset": 2.5, + "DF_scaling": 1.5, + "DF_targetSpeedLookup": "", + "Df_velocityDropLookup": "", + "MinSpeed": 50.0 + }, + "OverSpeedEcoRoll": { + "Mode": "Overspeed", + "MinSpeed": 50.0, + "OverSpeed": 2.5 + }, + "Cycles": [ + "LongHaul", + "Coach", + "Construction", + "HeavyUrban", + "Interurban", + "MunicipalUtility", + "RegionalDelivery", + "Suburban", + "Urban", + "UrbanDelivery" + ] + } +} \ No newline at end of file diff --git a/VectoCore/VectoCoreTest/TestData/Hybrids/GenericVehicle_Group5_P2/Transmission/AMT_12_TqLimit2500.vgbx b/VectoCore/VectoCoreTest/TestData/Hybrids/GenericVehicle_Group5_P2/Transmission/AMT_12_TqLimit2500.vgbx new file mode 100644 index 0000000000000000000000000000000000000000..30205aa8a09beafbd2fe76d6f39b4b4e16f3ea45 --- /dev/null +++ b/VectoCore/VectoCoreTest/TestData/Hybrids/GenericVehicle_Group5_P2/Transmission/AMT_12_TqLimit2500.vgbx @@ -0,0 +1,117 @@ +{ + "Header": { + "CreatedBy": "", + "Date": "2020-08-21T09:25:38.1210499Z", + "AppVersion": "3", + "FileVersion": 6 + }, + "Body": { + "SavedInDeclMode": false, + "ModelName": "tractor_12gear_example", + "Inertia": 0.0, + "TracInt": 1.0, + "Gears": [ + { + "Ratio": 2.64, + "LossMap": "Axle_4x2_Tractor.vtlm" + }, + { + "Ratio": 14.93, + "LossMap": "Gear_1.vtlm", + "ShiftPolygon": "", + "MaxTorque": "2500", + "MaxSpeed": "" + }, + { + "Ratio": 11.64, + "LossMap": "Gear_2.vtlm", + "ShiftPolygon": "", + "MaxTorque": "2500", + "MaxSpeed": "" + }, + { + "Ratio": 9.02, + "LossMap": "Gear_3.vtlm", + "ShiftPolygon": "", + "MaxTorque": "2500", + "MaxSpeed": "" + }, + { + "Ratio": 7.04, + "LossMap": "Gear_4.vtlm", + "ShiftPolygon": "", + "MaxTorque": "2500", + "MaxSpeed": "" + }, + { + "Ratio": 5.64, + "LossMap": "Gear_5.vtlm", + "ShiftPolygon": "", + "MaxTorque": "2500", + "MaxSpeed": "" + }, + { + "Ratio": 4.4, + "LossMap": "Gear_6.vtlm", + "ShiftPolygon": "", + "MaxTorque": "2500", + "MaxSpeed": "" + }, + { + "Ratio": 3.39, + "LossMap": "Gear_7.vtlm", + "ShiftPolygon": "", + "MaxTorque": "2500", + "MaxSpeed": "" + }, + { + "Ratio": 2.65, + "LossMap": "Gear_8.vtlm", + "ShiftPolygon": "", + "MaxTorque": "2500", + "MaxSpeed": "" + }, + { + "Ratio": 2.05, + "LossMap": "Gear_9.vtlm", + "ShiftPolygon": "", + "MaxTorque": "2500", + "MaxSpeed": "" + }, + { + "Ratio": 1.6, + "LossMap": "Gear_10.vtlm", + "ShiftPolygon": "", + "MaxTorque": "2500", + "MaxSpeed": "" + }, + { + "Ratio": 1.28, + "LossMap": "Gear_11.vtlm", + "ShiftPolygon": "", + "MaxTorque": "2500", + "MaxSpeed": "" + }, + { + "Ratio": 1.0, + "LossMap": "Gear_12.vtlm", + "ShiftPolygon": "", + "MaxTorque": "2500", + "MaxSpeed": "" + } + ], + "TqReserve": 20.0, + "ShiftTime": 2.0, + "StartTqReserve": 20.0, + "StartSpeed": 2.0, + "StartAcc": 0.6, + "GearboxType": "AMT", + "TorqueConverter": { + "Enabled": false + }, + "DownshiftAfterUpshiftDelay": 6.0, + "UpshiftAfterDownshiftDelay": 6.0, + "UpshiftMinAcceleration": 0.1, + "PowershiftShiftTime": 0.8 + } +} \ No newline at end of file diff --git a/VectoCore/VectoCoreTest/Utils/MockDeclarationVehicleInputData.cs b/VectoCore/VectoCoreTest/Utils/MockDeclarationVehicleInputData.cs index be422960bd1be27ab79709f744f9be9f797295ad..afee0cfbe743cbf87a6e9c4943458f2f5e1b7beb 100644 --- a/VectoCore/VectoCoreTest/Utils/MockDeclarationVehicleInputData.cs +++ b/VectoCore/VectoCoreTest/Utils/MockDeclarationVehicleInputData.cs @@ -119,7 +119,7 @@ namespace TUGraz.VectoCore.Tests.Utils public bool Articulated { get; } public Meter Height { get; } public TableData ElectricMotorTorqueLimits { get; } - public TableData BoostingLimitations { get; } + public TableData BoostingLimitations { get; set; } public Meter Length { get; set; } public Meter Width { get; set; } public Meter EntranceHeight { get; } diff --git a/VectoCore/VectoCoreTest/Utils/MockSimulationDataFactory.cs b/VectoCore/VectoCoreTest/Utils/MockSimulationDataFactory.cs index 3c89b0fe245d6ff336d47210ff3a40fc8fda3aec..89cb4aa357f7538fa59d723c3af9793f7f735d98 100644 --- a/VectoCore/VectoCoreTest/Utils/MockSimulationDataFactory.cs +++ b/VectoCore/VectoCoreTest/Utils/MockSimulationDataFactory.cs @@ -151,6 +151,26 @@ namespace TUGraz.VectoCore.Tests.Utils return engineData; } + public static CombustionEngineData CreateEngineDataFromFile(string engineFile, int numGears, NewtonMeter topTorque) + { + var dao = new EngineeringDataAdapter(); + var engineInput = JSONInputDataFactory.ReadEngine(engineFile); + var vehicleInput = new MockEngineeringVehicleInputData() { + EngineInputData = engineInput, + }; + var engineData = dao.CreateEngineData(vehicleInput, engineInput.EngineModes.First()); + for (uint i = 1; i <= numGears; i++) { + if (i < numGears) { + engineData.FullLoadCurves[i] = + AbstractSimulationDataAdapter.IntersectFullLoadCurves(engineData.FullLoadCurves[0], topTorque); + } else { + engineData.FullLoadCurves[i] = engineData.FullLoadCurves[0]; + } + } + + return engineData; + } + public static VehicleData CreateVehicleDataFromFile(string vehicleDataFile) { var dao = new EngineeringDataAdapter(); @@ -199,6 +219,8 @@ namespace TUGraz.VectoCore.Tests.Utils var inputData = JSONInputDataFactory.ReadREESSData(file, false); return new EngineeringDataAdapter().CreateBatteryData(new MockBatteryInputData() {REESSPack = inputData}, initialSoC); } + + } public class MockComponentsTest : IVehicleComponentsDeclaration diff --git a/VectoCore/VectoCoreTest/bin/Debug/TestData/Integration/Buses/FactorMethod/primary_heavyBus group42_SmartPS.RSLT_VIF.xml b/VectoCore/VectoCoreTest/bin/Debug/TestData/Integration/Buses/FactorMethod/primary_heavyBus group42_SmartPS.RSLT_VIF.xml deleted file mode 100644 index c953f429177e094f02dfd04e86fa2c484abeabaa..0000000000000000000000000000000000000000 --- a/VectoCore/VectoCoreTest/bin/Debug/TestData/Integration/Buses/FactorMethod/primary_heavyBus group42_SmartPS.RSLT_VIF.xml +++ /dev/null @@ -1,604 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<VectoOutputMultistep xmlns:di="http://www.w3.org/2000/09/xmldsig#" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:vif0.1="urn:tugraz:ivt:VectoAPI:DeclarationOutput:VehicleInterimFile:v0.1" xmlns:v2.0="urn:tugraz:ivt:VectoAPI:DeclarationDefinitions:v2.0" xmlns:v2.1="urn:tugraz:ivt:VectoAPI:DeclarationDefinitions:v2.1" xmlns:v2.3="urn:tugraz:ivt:VectoAPI:DeclarationDefinitions:v2.3" xmlns:v2.8="urn:tugraz:ivt:VectoAPI:DeclarationDefinitions:v2.4" xsi:schemaLocation="urn:tugraz:ivt:VectoAPI:DeclarationOutput:VehicleInterimFile:v0.1 V:\VectoCore\VectoCore\Resources\XSD/VectoOutputMultistep.0.1.xsd" xmlns="urn:tugraz:ivt:VectoAPI:DeclarationOutput:VehicleInterimFile:v0.1"> - <PrimaryVehicle> - <Data id="VEH-bce95de06ff54c85bca9" xsi:type="PrimaryVehicleDataType" xmlns="urn:tugraz:ivt:VectoAPI:DeclarationOutput:VehicleInterimFile:v0.1"> - <Vehicle xsi:type="VehiclePIFType"> - <ManufacturerPrimaryVehicle>Generic Truck Manufacturer</ManufacturerPrimaryVehicle> - <ManufacturerAddressPrimaryVehicle>Street, ZIP City</ManufacturerAddressPrimaryVehicle> - <Model>Generic Model Primary</Model> - <VIN>VEH-1234567890_SmartPS</VIN> - <Date>2017-02-15T11:00:00Z</Date> - <LegislativeCategory>M3</LegislativeCategory> - <ChassisConfiguration>Bus</ChassisConfiguration> - <AxleConfiguration>6x2</AxleConfiguration> - <Articulated>false</Articulated> - <TechnicalPermissibleMaximumLadenMass>25000</TechnicalPermissibleMaximumLadenMass> - <IdlingSpeed>600</IdlingSpeed> - <RetarderType>Transmission Output Retarder</RetarderType> - <RetarderRatio>1.000</RetarderRatio> - <AngledriveType>None</AngledriveType> - <ZeroEmissionVehicle>false</ZeroEmissionVehicle> - <vif0.1:ADAS xsi:type="ADAS_Conventional_Type" xmlns="urn:tugraz:ivt:VectoAPI:DeclarationDefinitions:v2.4"> - <EngineStopStart>false</EngineStopStart> - <EcoRollWithoutEngineStop>false</EcoRollWithoutEngineStop> - <EcoRollWithEngineStop>false</EcoRollWithEngineStop> - <PredictiveCruiseControl>none</PredictiveCruiseControl> - </vif0.1:ADAS> - <vif0.1:TorqueLimits xsi:type="TorqueLimitsType" xmlns="urn:tugraz:ivt:VectoAPI:DeclarationDefinitions:v2.0"> - <Entry gear="6" maxTorque="1800" /> - <Entry gear="1" maxTorque="2500" /> - <Entry gear="12" maxTorque="1900" /> - </vif0.1:TorqueLimits> - <Components xsi:type="VehicleComponentsPIFType"> - <Engine> - <Data xsi:type="EngineDataPIFType"> - <Manufacturer>Generic Engine Manufacturer Primary</Manufacturer> - <Model>Bus 6x2 Engine</Model> - <CertificationNumber>e12*0815/8051*2017/05E0000*00</CertificationNumber> - <Date>2017-02-15T11:00:00Z</Date> - <AppVersion>VectoEngine x.y</AppVersion> - <Displacement>12730</Displacement> - <RatedSpeed>1800</RatedSpeed> - <RatedPower>325032</RatedPower> - <MaxEngineTorque>2134</MaxEngineTorque> - <WHRType> - <v2.3:MechanicalOutputICE>false</v2.3:MechanicalOutputICE> - <v2.3:MechanicalOutputDrivetrain>false</v2.3:MechanicalOutputDrivetrain> - <v2.3:ElectricalOutput>false</v2.3:ElectricalOutput> - </WHRType> - <Mode> - <IdlingSpeed>600</IdlingSpeed> - <FullLoadAndDragCurve> - <Entry engineSpeed="600.00" maxTorque="1188.00" dragTorque="-138.00" /> - <Entry engineSpeed="800.00" maxTorque="1661.00" dragTorque="-143.00" /> - <Entry engineSpeed="1000.00" maxTorque="2134.00" dragTorque="-152.00" /> - <Entry engineSpeed="1200.00" maxTorque="2134.00" dragTorque="-165.00" /> - <Entry engineSpeed="1400.00" maxTorque="2134.00" dragTorque="-187.00" /> - <Entry engineSpeed="1600.00" maxTorque="1928.00" dragTorque="-217.00" /> - <Entry engineSpeed="1800.00" maxTorque="1722.00" dragTorque="-244.00" /> - <Entry engineSpeed="2000.00" maxTorque="1253.00" dragTorque="-278.00" /> - <Entry engineSpeed="2100.00" maxTorque="1019.00" dragTorque="-296.00" /> - <Entry engineSpeed="2200.00" maxTorque="0.00" dragTorque="-314.00" /> - </FullLoadAndDragCurve> - <Fuels> - <FuelType>Diesel CI</FuelType> - </Fuels> - </Mode> - </Data> - </Engine> - <Transmission> - <Data xsi:type="TransmissionDataPIFType"> - <Manufacturer>Generic Gearbox Manufacturer Primary</Manufacturer> - <Model>Generic 40t Long Haul Truck Gearbox Primary</Model> - <MainCertificationMethod>Standard values</MainCertificationMethod> - <Date>2017-01-11T11:00:00Z</Date> - <AppVersion>3.0.1</AppVersion> - <TransmissionType>AMT</TransmissionType> - <Gears xsi:type="TransmissionGearsPIFType"> - <Gear number="1"> - <Ratio>14.930</Ratio> - <MaxTorque>1900</MaxTorque> - <MaxSpeed>2000</MaxSpeed> - </Gear> - <Gear number="2"> - <Ratio>11.640</Ratio> - <MaxTorque>1900</MaxTorque> - <MaxSpeed>2000</MaxSpeed> - </Gear> - <Gear number="3"> - <Ratio>9.020</Ratio> - <MaxSpeed>2000</MaxSpeed> - </Gear> - <Gear number="4"> - <Ratio>7.040</Ratio> - <MaxSpeed>2000</MaxSpeed> - </Gear> - <Gear number="5"> - <Ratio>5.640</Ratio> - <MaxSpeed>2000</MaxSpeed> - </Gear> - <Gear number="6"> - <Ratio>4.400</Ratio> - <MaxSpeed>2000</MaxSpeed> - </Gear> - <Gear number="7"> - <Ratio>3.390</Ratio> - <MaxSpeed>2000</MaxSpeed> - </Gear> - <Gear number="8"> - <Ratio>2.650</Ratio> - <MaxSpeed>2000</MaxSpeed> - </Gear> - <Gear number="9"> - <Ratio>2.050</Ratio> - <MaxSpeed>2000</MaxSpeed> - </Gear> - <Gear number="10"> - <Ratio>1.600</Ratio> - <MaxSpeed>2000</MaxSpeed> - </Gear> - <Gear number="11"> - <Ratio>1.280</Ratio> - <MaxSpeed>2000</MaxSpeed> - </Gear> - <Gear number="12"> - <Ratio>1.000</Ratio> - </Gear> - </Gears> - </Data> - </Transmission> - <Axlegear> - <Data xsi:type="AxlegearDataPIFType"> - <Manufacturer>Generic Gearbox Manufacturer</Manufacturer> - <Model>Generic 40t Long Haul Truck AxleGear Primary</Model> - <CertificationMethod>Standard values</CertificationMethod> - <Date>2017-01-11T11:00:00Z</Date> - <AppVersion>3.0.1</AppVersion> - <LineType>Single portal axle</LineType> - <Ratio>2.590</Ratio> - </Data> - </Axlegear> - <AxleWheels> - <Data xsi:type="AxleWheelsDataPIFType"> - <Axles> - <Axle axleNumber="1" xmlns:v2.0="urn:tugraz:ivt:VectoAPI:DeclarationDefinitions:v2.0" xsi:type="v2.0:AxleDataDeclarationType"> - <v2.0:AxleType>VehicleNonDriven</v2.0:AxleType> - <v2.0:TwinTyres>false</v2.0:TwinTyres> - <v2.0:Steered>true</v2.0:Steered> - <v2.0:Tyre> - <v2.0:Data id="WHL-5432198760-315-70-R22.5" xsi:type="v2.0:TyreDataDeclarationType"> - <v2.0:Manufacturer>Generic Wheels Manufacturer</v2.0:Manufacturer> - <v2.0:Model>Generic Wheel</v2.0:Model> - <v2.0:CertificationNumber>e12*0815/8051*2017/05E0000*00</v2.0:CertificationNumber> - <v2.0:Date>2017-01-11T14:00:00Z</v2.0:Date> - <v2.0:AppVersion>Tyre Generation App 1.0</v2.0:AppVersion> - <v2.0:Dimension>315/70 R22.5</v2.0:Dimension> - <v2.0:RRCDeclared>0.0055</v2.0:RRCDeclared> - <v2.0:FzISO>31300</v2.0:FzISO> - </v2.0:Data> - <v2.0:Signature> - <di:Reference URI="#WHL-5432198760-315-70-R22.5" xmlns:di="http://www.w3.org/2000/09/xmldsig#"> - <di:Transforms> - <di:Transform Algorithm="urn:vecto:xml:2017:canonicalization" /> - <di:Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#" /> - </di:Transforms> - <di:DigestMethod Algorithm="http://www.w3.org/2001/04/xmlenc#sha256" /> - <di:DigestValue>4TkUGQTX8tevHOU9Cj9uyCFuI/aqcEYlo/gyVjVQmv0=</di:DigestValue> - </di:Reference> - </v2.0:Signature> - </v2.0:Tyre> - </Axle> - <Axle axleNumber="2" xmlns:v2.0="urn:tugraz:ivt:VectoAPI:DeclarationDefinitions:v2.0" xsi:type="v2.0:AxleDataDeclarationType"> - <v2.0:AxleType>VehicleDriven</v2.0:AxleType> - <v2.0:TwinTyres>true</v2.0:TwinTyres> - <v2.0:Steered>false</v2.0:Steered> - <v2.0:Tyre> - <v2.0:Data id="WHL-5432198760-315-70-R22.5" xsi:type="v2.0:TyreDataDeclarationType"> - <v2.0:Manufacturer>Generic Wheels Manufacturer</v2.0:Manufacturer> - <v2.0:Model>Generic Wheel</v2.0:Model> - <v2.0:CertificationNumber>e12*0815/8051*2017/05E0000*00</v2.0:CertificationNumber> - <v2.0:Date>2017-01-11T14:00:00Z</v2.0:Date> - <v2.0:AppVersion>Tyre Generation App 1.0</v2.0:AppVersion> - <v2.0:Dimension>315/70 R22.5</v2.0:Dimension> - <v2.0:RRCDeclared>0.0063</v2.0:RRCDeclared> - <v2.0:FzISO>31300</v2.0:FzISO> - </v2.0:Data> - <v2.0:Signature> - <di:Reference URI="#WHL-5432198760-315-70-R22.5" xmlns:di="http://www.w3.org/2000/09/xmldsig#"> - <di:Transforms> - <di:Transform Algorithm="urn:vecto:xml:2017:canonicalization" /> - <di:Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#" /> - </di:Transforms> - <di:DigestMethod Algorithm="http://www.w3.org/2001/04/xmlenc#sha256" /> - <di:DigestValue>KljvtvGUUQ/L7MiLVAqU+bckL5PNDNNwdeLH9kUVrfM=</di:DigestValue> - </di:Reference> - </v2.0:Signature> - </v2.0:Tyre> - </Axle> - <Axle axleNumber="3" xmlns:v2.0="urn:tugraz:ivt:VectoAPI:DeclarationDefinitions:v2.0" xsi:type="v2.0:AxleDataDeclarationType"> - <v2.0:AxleType>VehicleNonDriven</v2.0:AxleType> - <v2.0:TwinTyres>false</v2.0:TwinTyres> - <v2.0:Steered>false</v2.0:Steered> - <v2.0:Tyre> - <v2.0:Data id="WHL-5432198760-315-70-R22.5" xsi:type="v2.0:TyreDataDeclarationType"> - <v2.0:Manufacturer>Generic Wheels Manufacturer</v2.0:Manufacturer> - <v2.0:Model>Generic Wheel</v2.0:Model> - <v2.0:CertificationNumber>e12*0815/8051*2017/05E0000*00</v2.0:CertificationNumber> - <v2.0:Date>2017-01-11T14:00:00Z</v2.0:Date> - <v2.0:AppVersion>Tyre Generation App 1.0</v2.0:AppVersion> - <v2.0:Dimension>315/70 R22.5</v2.0:Dimension> - <v2.0:RRCDeclared>0.0055</v2.0:RRCDeclared> - <v2.0:FzISO>31300</v2.0:FzISO> - </v2.0:Data> - <v2.0:Signature> - <di:Reference URI="#WHL-5432198760-315-70-R22.5" xmlns:di="http://www.w3.org/2000/09/xmldsig#"> - <di:Transforms> - <di:Transform Algorithm="urn:vecto:xml:2017:canonicalization" /> - <di:Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#" /> - </di:Transforms> - <di:DigestMethod Algorithm="http://www.w3.org/2001/04/xmlenc#sha256" /> - <di:DigestValue>4TkUGQTX8tevHOU9Cj9uyCFuI/aqcEYlo/gyVjVQmv0=</di:DigestValue> - </di:Reference> - </v2.0:Signature> - </v2.0:Tyre> - </Axle> - </Axles> - </Data> - </AxleWheels> - <Auxiliaries> - <Data xsi:type="AuxiliaryDataPIFType"> - <Fan> - <Technology>Hydraulic driven - Constant displacement pump</Technology> - </Fan> - <SteeringPump> - <Technology axleNumber="1">Variable displacement elec. controlled</Technology> - </SteeringPump> - <ElectricSystem> - <AlternatorTechnology>conventional</AlternatorTechnology> - </ElectricSystem> - <PneumaticSystem> - <SizeOfAirSupply>Large Supply 2-stage</SizeOfAirSupply> - <CompressorDrive>electrically</CompressorDrive> - <Clutch>none</Clutch> - <CompressorRatio>1.000</CompressorRatio> - <SmartCompressionSystem>true</SmartCompressionSystem> - <SmartRegenerationSystem>false</SmartRegenerationSystem> - <AirsuspensionControl>electronically</AirsuspensionControl> - <PneumaticSCRReagentDosing>true</PneumaticSCRReagentDosing> - </PneumaticSystem> - <HVAC> - <AdjustableCoolantThermostat>true</AdjustableCoolantThermostat> - <EngineWasteGasHeatExchanger>true</EngineWasteGasHeatExchanger> - </HVAC> - </Data> - </Auxiliaries> - </Components> - </Vehicle> - <InputDataSignature> - <di:Reference URI="#VEH-PrimaryBus_SmartPS"> - <di:Transforms> - <di:Transform Algorithm="urn:vecto:xml:2017:canonicalization" /> - <di:Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#" /> - </di:Transforms> - <di:DigestMethod Algorithm="http://www.w3.org/2001/04/xmlenc#sha256" /> - <di:DigestValue>JKmEGO5ChZ+EWf9fu/yxJQldo/kvXaJnmhgcz2YQTpU=</di:DigestValue> - </di:Reference> - </InputDataSignature> - <ManufacturerRecordSignature> - <di:Reference URI="#RESULT-75ce50bbcc114a1a8fa8"> - <di:Transforms> - <di:Transform Algorithm="urn:vecto:xml:2017:canonicalization" /> - <di:Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#" /> - </di:Transforms> - <di:DigestMethod Algorithm="http://www.w3.org/2001/04/xmlenc#sha256" /> - <di:DigestValue>nFutXxdSkqt7h2WAMbnJuL50CjfABdvcu9V30e0y1NI=</di:DigestValue> - </di:Reference> - </ManufacturerRecordSignature> - <Results> - <Status>success</Status> - <Result status="success"> - <VehicleGroup>P33SD</VehicleGroup> - <Mission>Heavy Urban</Mission> - <SimulationParameters> - <TotalVehicleMass unit="kg">15527.52</TotalVehicleMass> - <Payload unit="kg">1352.52</Payload> - <PassengerCount>19.89</PassengerCount> - <FuelMode>single fuel mode</FuelMode> - </SimulationParameters> - <Fuel type="Diesel CI"> - <EnergyConsumption unit="MJ/km">21.18710</EnergyConsumption> - </Fuel> - <CO2 unit="g/km">1553.06</CO2> - </Result> - <Result status="success"> - <VehicleGroup>P33SD</VehicleGroup> - <Mission>Heavy Urban</Mission> - <SimulationParameters> - <TotalVehicleMass unit="kg">20937.60</TotalVehicleMass> - <Payload unit="kg">6762.60</Payload> - <PassengerCount>99.45</PassengerCount> - <FuelMode>single fuel mode</FuelMode> - </SimulationParameters> - <Fuel type="Diesel CI"> - <EnergyConsumption unit="MJ/km">25.36235</EnergyConsumption> - </Fuel> - <CO2 unit="g/km">1859.11</CO2> - </Result> - <Result status="success"> - <VehicleGroup>P33SD</VehicleGroup> - <Mission>Urban</Mission> - <SimulationParameters> - <TotalVehicleMass unit="kg">15527.52</TotalVehicleMass> - <Payload unit="kg">1352.52</Payload> - <PassengerCount>19.89</PassengerCount> - <FuelMode>single fuel mode</FuelMode> - </SimulationParameters> - <Fuel type="Diesel CI"> - <EnergyConsumption unit="MJ/km">16.73089</EnergyConsumption> - </Fuel> - <CO2 unit="g/km">1226.41</CO2> - </Result> - <Result status="success"> - <VehicleGroup>P33SD</VehicleGroup> - <Mission>Urban</Mission> - <SimulationParameters> - <TotalVehicleMass unit="kg">20937.60</TotalVehicleMass> - <Payload unit="kg">6762.60</Payload> - <PassengerCount>99.45</PassengerCount> - <FuelMode>single fuel mode</FuelMode> - </SimulationParameters> - <Fuel type="Diesel CI"> - <EnergyConsumption unit="MJ/km">20.22898</EnergyConsumption> - </Fuel> - <CO2 unit="g/km">1482.83</CO2> - </Result> - <Result status="success"> - <VehicleGroup>P33SD</VehicleGroup> - <Mission>Suburban</Mission> - <SimulationParameters> - <TotalVehicleMass unit="kg">15527.52</TotalVehicleMass> - <Payload unit="kg">1352.52</Payload> - <PassengerCount>19.89</PassengerCount> - <FuelMode>single fuel mode</FuelMode> - </SimulationParameters> - <Fuel type="Diesel CI"> - <EnergyConsumption unit="MJ/km">14.37825</EnergyConsumption> - </Fuel> - <CO2 unit="g/km">1053.96</CO2> - </Result> - <Result status="success"> - <VehicleGroup>P33SD</VehicleGroup> - <Mission>Suburban</Mission> - <SimulationParameters> - <TotalVehicleMass unit="kg">20937.60</TotalVehicleMass> - <Payload unit="kg">6762.60</Payload> - <PassengerCount>99.45</PassengerCount> - <FuelMode>single fuel mode</FuelMode> - </SimulationParameters> - <Fuel type="Diesel CI"> - <EnergyConsumption unit="MJ/km">17.62230</EnergyConsumption> - </Fuel> - <CO2 unit="g/km">1291.75</CO2> - </Result> - <Result status="success"> - <VehicleGroup>P33SD</VehicleGroup> - <Mission>Interurban</Mission> - <SimulationParameters> - <TotalVehicleMass unit="kg">15469.51</TotalVehicleMass> - <Payload unit="kg">1294.51</Payload> - <PassengerCount>18.23</PassengerCount> - <FuelMode>single fuel mode</FuelMode> - </SimulationParameters> - <Fuel type="Diesel CI"> - <EnergyConsumption unit="MJ/km">11.83195</EnergyConsumption> - </Fuel> - <CO2 unit="g/km">867.31</CO2> - </Result> - <Result status="success"> - <VehicleGroup>P33SD</VehicleGroup> - <Mission>Interurban</Mission> - <SimulationParameters> - <TotalVehicleMass unit="kg">18411.57</TotalVehicleMass> - <Payload unit="kg">4236.57</Payload> - <PassengerCount>59.67</PassengerCount> - <FuelMode>single fuel mode</FuelMode> - </SimulationParameters> - <Fuel type="Diesel CI"> - <EnergyConsumption unit="MJ/km">13.25049</EnergyConsumption> - </Fuel> - <CO2 unit="g/km">971.29</CO2> - </Result> - <Result status="success"> - <VehicleGroup>P33DD</VehicleGroup> - <Mission>Heavy Urban</Mission> - <SimulationParameters> - <TotalVehicleMass unit="kg">16303.29</TotalVehicleMass> - <Payload unit="kg">1578.29</Payload> - <PassengerCount>23.21</PassengerCount> - <FuelMode>single fuel mode</FuelMode> - </SimulationParameters> - <Fuel type="Diesel CI"> - <EnergyConsumption unit="MJ/km">22.69048</EnergyConsumption> - </Fuel> - <CO2 unit="g/km">1663.26</CO2> - </Result> - <Result status="success"> - <VehicleGroup>P33DD</VehicleGroup> - <Mission>Heavy Urban</Mission> - <SimulationParameters> - <TotalVehicleMass unit="kg">22616.43</TotalVehicleMass> - <Payload unit="kg">7891.43</Payload> - <PassengerCount>116.05</PassengerCount> - <FuelMode>single fuel mode</FuelMode> - </SimulationParameters> - <Fuel type="Diesel CI"> - <EnergyConsumption unit="MJ/km">27.91380</EnergyConsumption> - </Fuel> - <CO2 unit="g/km">2046.14</CO2> - </Result> - <Result status="success"> - <VehicleGroup>P33DD</VehicleGroup> - <Mission>Urban</Mission> - <SimulationParameters> - <TotalVehicleMass unit="kg">16303.29</TotalVehicleMass> - <Payload unit="kg">1578.29</Payload> - <PassengerCount>23.21</PassengerCount> - <FuelMode>single fuel mode</FuelMode> - </SimulationParameters> - <Fuel type="Diesel CI"> - <EnergyConsumption unit="MJ/km">17.89886</EnergyConsumption> - </Fuel> - <CO2 unit="g/km">1312.02</CO2> - </Result> - <Result status="success"> - <VehicleGroup>P33DD</VehicleGroup> - <Mission>Urban</Mission> - <SimulationParameters> - <TotalVehicleMass unit="kg">22616.43</TotalVehicleMass> - <Payload unit="kg">7891.43</Payload> - <PassengerCount>116.05</PassengerCount> - <FuelMode>single fuel mode</FuelMode> - </SimulationParameters> - <Fuel type="Diesel CI"> - <EnergyConsumption unit="MJ/km">22.22866</EnergyConsumption> - </Fuel> - <CO2 unit="g/km">1629.41</CO2> - </Result> - <Result status="success"> - <VehicleGroup>P33DD</VehicleGroup> - <Mission>Suburban</Mission> - <SimulationParameters> - <TotalVehicleMass unit="kg">16303.29</TotalVehicleMass> - <Payload unit="kg">1578.29</Payload> - <PassengerCount>23.21</PassengerCount> - <FuelMode>single fuel mode</FuelMode> - </SimulationParameters> - <Fuel type="Diesel CI"> - <EnergyConsumption unit="MJ/km">15.31725</EnergyConsumption> - </Fuel> - <CO2 unit="g/km">1122.79</CO2> - </Result> - <Result status="success"> - <VehicleGroup>P33DD</VehicleGroup> - <Mission>Suburban</Mission> - <SimulationParameters> - <TotalVehicleMass unit="kg">22616.43</TotalVehicleMass> - <Payload unit="kg">7891.43</Payload> - <PassengerCount>116.05</PassengerCount> - <FuelMode>single fuel mode</FuelMode> - </SimulationParameters> - <Fuel type="Diesel CI"> - <EnergyConsumption unit="MJ/km">19.28148</EnergyConsumption> - </Fuel> - <CO2 unit="g/km">1413.37</CO2> - </Result> - <Result status="success"> - <VehicleGroup>P34SD</VehicleGroup> - <Mission>Interurban</Mission> - <SimulationParameters> - <TotalVehicleMass unit="kg">16467.68</TotalVehicleMass> - <Payload unit="kg">1254.68</Payload> - <PassengerCount>17.67</PassengerCount> - <FuelMode>single fuel mode</FuelMode> - </SimulationParameters> - <Fuel type="Diesel CI"> - <EnergyConsumption unit="MJ/km">11.94624</EnergyConsumption> - </Fuel> - <CO2 unit="g/km">875.68</CO2> - </Result> - <Result status="success"> - <VehicleGroup>P34SD</VehicleGroup> - <Mission>Interurban</Mission> - <SimulationParameters> - <TotalVehicleMass unit="kg">19319.21</TotalVehicleMass> - <Payload unit="kg">4106.21</Payload> - <PassengerCount>57.83</PassengerCount> - <FuelMode>single fuel mode</FuelMode> - </SimulationParameters> - <Fuel type="Diesel CI"> - <EnergyConsumption unit="MJ/km">13.32545</EnergyConsumption> - </Fuel> - <CO2 unit="g/km">976.78</CO2> - </Result> - <Result status="success"> - <VehicleGroup>P34SD</VehicleGroup> - <Mission>Coach</Mission> - <SimulationParameters> - <TotalVehicleMass unit="kg">16490.49</TotalVehicleMass> - <Payload unit="kg">1277.49</Payload> - <PassengerCount>17.99</PassengerCount> - <FuelMode>single fuel mode</FuelMode> - </SimulationParameters> - <Fuel type="Diesel CI"> - <EnergyConsumption unit="MJ/km">8.71857</EnergyConsumption> - </Fuel> - <CO2 unit="g/km">639.09</CO2> - </Result> - <Result status="success"> - <VehicleGroup>P34SD</VehicleGroup> - <Mission>Coach</Mission> - <SimulationParameters> - <TotalVehicleMass unit="kg">18406.72</TotalVehicleMass> - <Payload unit="kg">3193.72</Payload> - <PassengerCount>44.98</PassengerCount> - <FuelMode>single fuel mode</FuelMode> - </SimulationParameters> - <Fuel type="Diesel CI"> - <EnergyConsumption unit="MJ/km">9.20204</EnergyConsumption> - </Fuel> - <CO2 unit="g/km">674.53</CO2> - </Result> - <Result status="success"> - <VehicleGroup>P34DD</VehicleGroup> - <Mission>Interurban</Mission> - <SimulationParameters> - <TotalVehicleMass unit="kg">19588.08</TotalVehicleMass> - <Payload unit="kg">1738.08</Payload> - <PassengerCount>24.48</PassengerCount> - <FuelMode>single fuel mode</FuelMode> - </SimulationParameters> - <Fuel type="Diesel CI"> - <EnergyConsumption unit="MJ/km">13.58782</EnergyConsumption> - </Fuel> - <CO2 unit="g/km">996.02</CO2> - </Result> - <Result status="success"> - <VehicleGroup>P34DD</VehicleGroup> - <Mission>Interurban</Mission> - <SimulationParameters> - <TotalVehicleMass unit="kg">23643.60</TotalVehicleMass> - <Payload unit="kg">5793.60</Payload> - <PassengerCount>81.60</PassengerCount> - <FuelMode>single fuel mode</FuelMode> - </SimulationParameters> - <Fuel type="Diesel CI"> - <EnergyConsumption unit="MJ/km">15.57745</EnergyConsumption> - </Fuel> - <CO2 unit="g/km">1141.86</CO2> - </Result> - <Result status="success"> - <VehicleGroup>P34DD</VehicleGroup> - <Mission>Coach</Mission> - <SimulationParameters> - <TotalVehicleMass unit="kg">19703.95</TotalVehicleMass> - <Payload unit="kg">1853.95</Payload> - <PassengerCount>26.11</PassengerCount> - <FuelMode>single fuel mode</FuelMode> - </SimulationParameters> - <Fuel type="Diesel CI"> - <EnergyConsumption unit="MJ/km">9.82883</EnergyConsumption> - </Fuel> - <CO2 unit="g/km">720.47</CO2> - </Result> - <Result status="success"> - <VehicleGroup>P34DD</VehicleGroup> - <Mission>Coach</Mission> - <SimulationParameters> - <TotalVehicleMass unit="kg">22484.88</TotalVehicleMass> - <Payload unit="kg">4634.88</Payload> - <PassengerCount>65.28</PassengerCount> - <FuelMode>single fuel mode</FuelMode> - </SimulationParameters> - <Fuel type="Diesel CI"> - <EnergyConsumption unit="MJ/km">10.56696</EnergyConsumption> - </Fuel> - <CO2 unit="g/km">774.58</CO2> - </Result> - </Results> - <ApplicationInformation> - <SimulationToolVersion>0.7.7.2547-DEV !!NOT FOR CERTIFICATION!!</SimulationToolVersion> - <Date>2022-02-04T13:12:27.6775278Z</Date> - </ApplicationInformation> - </Data> - <Signature> - <di:Reference URI="#VEH-bce95de06ff54c85bca9"> - <di:Transforms> - <di:Transform Algorithm="urn:vecto:xml:2017:canonicalization" /> - <di:Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#" /> - </di:Transforms> - <di:DigestMethod Algorithm="http://www.w3.org/2001/04/xmlenc#sha256" /> - <di:DigestValue>3nwxGv2EIt273Cowtnqnd99NijSf4E6945LbLgs886M=</di:DigestValue> - </di:Reference> - </Signature> - </PrimaryVehicle> -</VectoOutputMultistep> \ No newline at end of file