diff --git a/Directory.Build.props b/Directory.Build.props index 6c1e1f6d247a51eca5371da3464937d03a52dfa2..4a668d62634678f5f3ec5eae03185ad7be8765ea 100644 --- a/Directory.Build.props +++ b/Directory.Build.props @@ -2,14 +2,14 @@ <PropertyGroup> <!-- For a Release-Candidate uncomment the following line: --> - <!--<DefineConstants>RELEASE_CANDIDATE</DefineConstants>--> + <DefineConstants>RELEASE_CANDIDATE</DefineConstants> <!-- For a Release uncomment the following line: --> - <DefineConstants>CERTIFICATION_RELEASE</DefineConstants> + <!--<DefineConstants>CERTIFICATION_RELEASE</DefineConstants>--> <!-- Global VECTO Version --> - <MainProductVersion>4.2.1</MainProductVersion> - <!--<VersionSuffix>RC</VersionSuffix>--> + <MainProductVersion>4.2.2</MainProductVersion> + <VersionSuffix>RC</VersionSuffix> <!-- The following settings are used as default values for ALL projects --> <Days>$([System.DateTime]::UtcNow.Subtract($([System.DateTime]::new(2015,1,1))).Days)</Days> diff --git a/Documentation/User Manual Source/Release Notes Vecto4.x.pptx b/Documentation/User Manual Source/Release Notes Vecto4.x.pptx index 3e647fea72e37f4828dd27acb9548571677f1b70..8087c4f787ae8cfa2ffdad858ccc4faee46a666d 100644 Binary files a/Documentation/User Manual Source/Release Notes Vecto4.x.pptx and b/Documentation/User Manual Source/Release Notes Vecto4.x.pptx differ diff --git a/Documentation/User Manual Source/release notes vecto4.x.pdf b/Documentation/User Manual Source/release notes vecto4.x.pdf index c2147510e8188c8703f0ca33b2954cc6ce60c7f0..f4a1350608a293ae17d77cce361f97d83c780c1d 100644 Binary files a/Documentation/User Manual Source/release notes vecto4.x.pdf and b/Documentation/User Manual Source/release notes vecto4.x.pdf differ diff --git a/Documentation/User Manual/6-changelog/changelog.md b/Documentation/User Manual/6-changelog/changelog.md index be80d27558caabc4db21633080bf4b4d75410dce..bb642e21164b85b5c95edbefac52fc055428283e 100644 --- a/Documentation/User Manual/6-changelog/changelog.md +++ b/Documentation/User Manual/6-changelog/changelog.md @@ -1,5 +1,21 @@ # Changelog +**VECTO-4.2.2-RC** + +**Build 3539 (2024-09-09)** + +- Bugfixes + * CodeEU-710: Hashing tool check fail with VECTO version 3330 + * CodeEU-711: Hashing tool check fail with VECTO 4.1.3.3415 + * CodeEU-712: VECTO VTP error + * CodeEU-754: "Failed to find operating point"; "Failed to find mechanic power for given electric power" in E2 vehicle + * CodeEU-727: Failure in simulating HEV in different VECTO versions + * CodeEU-749: Double summary for electric vehicles + * CodeEU-542: IVECO confidential : BUG REPORT : CRW LE T7D VOITH NXT 5.63 + * CodeEU-663: IHPC: Failed to find operating point + * CodeEU-634: Article 10(2) issue - VIN YS2G6X20002202570 + * CodeEU-671: IHPC: simulation abort due to unexpected response + **VECTO-4.2.1** **Build 3469 (2024-07-01)** diff --git a/Documentation/User Manual/help.html b/Documentation/User Manual/help.html index f57b77a27006e4a45be30cbd2e9190b572c33b44..a5950fb955911a4d38ccb7ede340c9c3c4c0f0eb 100644 --- a/Documentation/User Manual/help.html +++ b/Documentation/User Manual/help.html @@ -10928,6 +10928,26 @@ stored as LOG_backup.txt.</p> </section> <section id="changelog" class="level1"> <h1>Changelog</h1> +<p><strong>VECTO-4.2.2-RC</strong></p> +<p><strong>Build 3539 (2024-09-09)</strong></p> +<ul> +<li>Bugfixes +<ul> +<li>CodeEU-710: Hashing tool check fail with VECTO version 3330</li> +<li>CodeEU-711: Hashing tool check fail with VECTO 4.1.3.3415</li> +<li>CodeEU-712: VECTO VTP error</li> +<li>CodeEU-754: “Failed to find operating point”; “Failed to find +mechanic power for given electric power” in E2 vehicle</li> +<li>CodeEU-727: Failure in simulating HEV in different VECTO +versions</li> +<li>CodeEU-749: Double summary for electric vehicles</li> +<li>CodeEU-542: IVECO confidential : BUG REPORT : CRW LE T7D VOITH NXT +5.63</li> +<li>CodeEU-663: IHPC: Failed to find operating point</li> +<li>CodeEU-634: Article 10(2) issue - VIN YS2G6X20002202570</li> +<li>CodeEU-671: IHPC: simulation abort due to unexpected response</li> +</ul></li> +</ul> <p><strong>VECTO-4.2.1</strong></p> <p><strong>Build 3469 (2024-07-01)</strong></p> <ul> diff --git a/VectoCommon/VectoHashing/VectoHash.cs b/VectoCommon/VectoHashing/VectoHash.cs index 5ee74a01ecb33ec90647393a87b960848a0dcd17..f7f838f3a00fd9ed94adbe9ed3e657a0c96a19f8 100644 --- a/VectoCommon/VectoHashing/VectoHash.cs +++ b/VectoCommon/VectoHashing/VectoHash.cs @@ -110,7 +110,7 @@ namespace TUGraz.VectoHashing public IList<VectoComponents> GetContainigComponents() { var retVal = new List<VectoComponents>(); - var rootName = Document.FirstChild.NextSibling.LocalName; + var rootName = Document.FirstChild.NextSibling?.LocalName ?? Document.FirstChild.LocalName; foreach (var component in EnumHelper.GetValues<VectoComponents>()) { // special treatment for REESS: can be either supercap or multiple batteries where the component node may contain several sub-components @@ -139,7 +139,7 @@ namespace TUGraz.VectoHashing public string ComputeHash(IEnumerable<string> canonicalization = null, string digestMethod = null) { - var isMultiStep = (Document.ChildNodes.Count > 0) + var isMultiStep = (Document.ChildNodes.Count > 1) && Document.ChildNodes[1].ChildNodes.Cast<XmlNode>().Any(x => x.LocalName == XMLNames.ManufacturingStep); var nodes = Document.SelectNodes(GetComponentQueryString(null, isMultiStep)); diff --git a/VectoCore/VectoCore/Models/Declaration/DeclarationData.cs b/VectoCore/VectoCore/Models/Declaration/DeclarationData.cs index b3d03e81198bd07c72ee2701da5f7efc85bc0b72..c63cc33d23eba71f4b76e9aecc4a7969606401d5 100644 --- a/VectoCore/VectoCore/Models/Declaration/DeclarationData.cs +++ b/VectoCore/VectoCore/Models/Declaration/DeclarationData.cs @@ -1865,6 +1865,10 @@ namespace TUGraz.VectoCore.Models.Declaration (1 - D32_utilityFactor) * csResult.FuelConsumptionFinal(x.FuelType).TotalFuelConsumptionCorrected)) .ToDictionary(x => x.Item1, x => x.Item2); + var fcPerMeter = cdResult.FuelData.Select(f => Tuple.Create(f, + (cdResult.FuelConsumptionFinal(f.FuelType).TotalFuelConsumptionCorrected / cdResult.Distance) * cdResult.WeightingFactor)) + .ToDictionary(x => x.Item1, x => x.Item2); + var retVal = new WeightedResult() { Status = cdResult.Status == VectoRun.Status.PrimaryBusSimulationIgnore || csResult.Status == VectoRun.Status.PrimaryBusSimulationIgnore ? VectoRun.Status.PrimaryBusSimulationIgnore : VectoRun.Status.Success, Distance = cdResult.Distance, @@ -1879,6 +1883,7 @@ namespace TUGraz.VectoCore.Models.Declaration UtilityFactor = D32_utilityFactor, ElectricEnergyConsumption = D36_electricEnergyConsumptionWeighted, FuelConsumption = D37_fuelConsumptionWeighted, + FuelConsumptionPerMeter = fcPerMeter, CO2PerMeter = (D32_utilityFactor * (cdResult.CO2Total / cdResult.Distance)) + ((1 - D32_utilityFactor) * (csResult.CO2Total / csResult.Distance)), @@ -2026,6 +2031,9 @@ namespace TUGraz.VectoCore.Models.Declaration entries.Sum(e => e.Weighted.FuelConsumption[f] * e.ChargeDepletingResult.WeightingFactor))) .ToDictionary(x => x.Item1, x => x.Item2), + FuelConsumptionPerMeter = fuels.Select(f => Tuple.Create(f, + entries.Sum(e => e.Weighted.FuelConsumptionPerMeter[f] * e.ChargeDepletingResult.WeightingFactor))) + .ToDictionary(x => x.Item1, x => x.Item2), ElectricEnergyConsumption = entries.Sum(e => e.Weighted.ElectricEnergyConsumption * e.ChargeDepletingResult.WeightingFactor), CO2PerMeter = entries.All(e => e.Weighted.CO2PerMeter != null) ? entries.Sum(e => (e.Weighted.CO2PerMeter) * e.ChargeDepletingResult.WeightingFactor) : null, ActualChargeDepletingRange = entries.Sum(e => e.Weighted.ActualChargeDepletingRange * e.ChargeDepletingResult.WeightingFactor), diff --git a/VectoCore/VectoCore/Models/SimulationComponent/Data/ElectricComponents/ElectricMotor/EfficiencyMap.cs b/VectoCore/VectoCore/Models/SimulationComponent/Data/ElectricComponents/ElectricMotor/EfficiencyMap.cs index 1382602db9435bcede67a7f0adc985e69babf54b..0c88bd112e543cf5c5f0ec2813c42045208fa7f3 100644 --- a/VectoCore/VectoCore/Models/SimulationComponent/Data/ElectricComponents/ElectricMotor/EfficiencyMap.cs +++ b/VectoCore/VectoCore/Models/SimulationComponent/Data/ElectricComponents/ElectricMotor/EfficiencyMap.cs @@ -46,7 +46,7 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Data.ElectricMotor public override string[] SerializedEntries { get { return _efficiencyMapMech2El.Entries.Select( - entry => $"{entry.Y.SI<PerSecond>().AsRPM} [rpm], {entry.X.SI<NewtonMeter>()}, {(entry.Z * entry.Y + entry.Y * entry.X).SI<Watt>()}") + entry => $"{entry.Y.SI<PerSecond>().AsRPM} [rpm], {entry.X.SI<NewtonMeter>()}, {(entry.Z * entry.Y + entry.Y * entry.X).SI<Watt>()} ({entry.Z.SI<NewtonMeter>()})") .ToArray(); } } @@ -169,16 +169,26 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Data.ElectricMotor // propelling if (retVal.IsSmaller(maxEmTorque)) { retVal = SearchTorqueForElectricPower(batPower, avgSpeed, maxEmTorque, elPowerMaxEM, 1e3, true); + if (retVal.IsSmaller(maxEmTorque)) { + // the line search does not yield a better solution, still 'above' max EM torque - battery power is sufficient + return null; + } } } else { // recuperating if (retVal.IsGreater(maxEmTorque)) { retVal = SearchTorqueForElectricPower(batPower, avgSpeed, maxEmTorque, elPowerMaxEM, 1e3, true); + if (retVal.IsGreater(maxEmTorque)) { + // the line search does not yield a better solution, still 'above' max EM torque - battery power is sufficient + return null; + } } - } + } return retVal; } catch (VectoSearchFailedException vsfe) { +#if DEBUG Log.Error("Failed to find mechanic power for given electric power! n_avg: {0} P_el: {1}; {2}", avgSpeed.AsRPM, batPower, vsfe.Message); +#endif } return null; diff --git a/VectoCore/VectoCore/Models/SimulationComponent/Impl/Driver.cs b/VectoCore/VectoCore/Models/SimulationComponent/Impl/Driver.cs index 2741b7e1f8a1ea75dc558589d4b429ba95e96eee..bbdc853b6994f9118cf0bc5442fd99c02c71dff3 100644 --- a/VectoCore/VectoCore/Models/SimulationComponent/Impl/Driver.cs +++ b/VectoCore/VectoCore/Models/SimulationComponent/Impl/Driver.cs @@ -1053,6 +1053,7 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl } try { + var forceLineSearch = DataBus.GearboxInfo.GearboxType.AutomaticTransmission() && !DataBus.GearboxInfo.TCLocked; DataBus.Brakes.BrakePower = SearchAlgorithm.Search(DataBus.Brakes.BrakePower, deltaPower, deltaPower.Abs() * (DataBus.GearboxInfo.GearboxType.AutomaticTransmission() ? 0.5 : 1), getYValue: result => { @@ -1073,7 +1074,7 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl criterion: result => { var response = (ResponseDryRun)result; var delta = DataBus.ClutchInfo.ClutchClosed(absTime) && DataBus.GearboxInfo.GearEngaged(absTime) - ? response.DeltaDragLoad + ? response.DeltaDragLoad * (forceLineSearch ? 1.1 : 1.0) // in case LineSearch is used, increase criteria to force more precision on the solution : response.Gearbox.PowerRequest; return delta.Value(); }, @@ -1088,7 +1089,7 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl return DataBus.GearboxInfo.GearboxType.AutomaticTransmission() && response.DeltaDragLoad.Value().IsSmallerOrEqual(-double.MaxValue / 20); }, - forceLineSearch: DataBus.GearboxInfo.GearboxType.AutomaticTransmission() && !DataBus.GearboxInfo.TCLocked, + forceLineSearch: forceLineSearch, searcher: this); return operatingPoint; diff --git a/VectoCore/VectoCore/Models/SimulationComponent/Impl/ElectricMotor.cs b/VectoCore/VectoCore/Models/SimulationComponent/Impl/ElectricMotor.cs index 25c0dc9e1cd87d2a4fd52e0536dddee7a8e2f2cb..54940db66bca88f8f867129661a145b2f8338ab4 100644 --- a/VectoCore/VectoCore/Models/SimulationComponent/Impl/ElectricMotor.cs +++ b/VectoCore/VectoCore/Models/SimulationComponent/Impl/ElectricMotor.cs @@ -486,9 +486,22 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl // has to be positive for recuperation - battery is full return null; } - var maxBatRecuperationTorque = maxBatPower.IsEqual(0, 1e-3) - ? ModelData.DragCurveLookup(avgSpeed, gear) - : ModelData.EfficiencyData.EfficiencyMapLookupTorque(volt, maxBatPower, avgSpeed, maxEmTorque, gear); + + NewtonMeter maxBatRecuperationTorque; + try { + maxBatRecuperationTorque = maxBatPower.IsEqual(0, 1e-3) + ? ModelData.DragCurveLookup(avgSpeed, gear) + : ModelData.EfficiencyData.EfficiencyMapLookupTorque(volt, maxBatPower, avgSpeed, maxEmTorque, + gear); + } catch (VectoException e) { + var pwr = ModelData.EfficiencyData.LookupElectricPower(volt, avgSpeed, maxEmTorque, gear); + if (pwr.ElectricalPower.IsSmaller(maxBatPower)) { + maxBatRecuperationTorque = maxEmTorque; + } else { + throw new VectoException("Failed to get max. recuperation torque", e); + } + } + var maxTorqueRecuperate = VectoMath.Min(maxEmTorque, maxBatRecuperationTorque); if (maxTorqueRecuperate < 0) { return null; diff --git a/VectoCore/VectoCore/Models/SimulationComponent/Impl/HybridController.cs b/VectoCore/VectoCore/Models/SimulationComponent/Impl/HybridController.cs index 6d49783a4723a5d0b2150e717720d5f51bf4f784..203368fbc5b857115f4bb659c0a3740a0776bbbc 100644 --- a/VectoCore/VectoCore/Models/SimulationComponent/Impl/HybridController.cs +++ b/VectoCore/VectoCore/Models/SimulationComponent/Impl/HybridController.cs @@ -155,6 +155,9 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl return gearShiftResponse; } + if (retryAfterGearshift) { + retryCount++; + } retry = retryAfterGearshift; if (!dryRun /*&& DataBus.VehicleInfo.VehicleStopped*/) { @@ -242,6 +245,11 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl _shiftStrategy.SetNextGear(strategySettings.NextGear); SelectedGear = strategySettings.NextGear; + if (DataBus.GearboxInfo.GearboxType == GearboxType.IHPC) { + retry = true; + return null; + } + if (!DataBus.GearboxInfo.GearboxType.AutomaticTransmission()) { return new ResponseGearShift(this); diff --git a/VectoCore/VectoCore/Models/SimulationComponent/Impl/Shiftstrategies/ATShiftStrategy.cs b/VectoCore/VectoCore/Models/SimulationComponent/Impl/Shiftstrategies/ATShiftStrategy.cs index 59d60bc0c8d2963b696c1b5f226312bed149f8ba..3eb19d0788b763e63ebcddf319cac2f9b606b132 100644 --- a/VectoCore/VectoCore/Models/SimulationComponent/Impl/Shiftstrategies/ATShiftStrategy.cs +++ b/VectoCore/VectoCore/Models/SimulationComponent/Impl/Shiftstrategies/ATShiftStrategy.cs @@ -199,7 +199,7 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl.Shiftstrategies // 3) 1C -> 0: disengange when negative T_out and positive T_in var gear1C = Gears.First().Equals(gear); - var disengageTOutNegativeAndTInPositive = DataBus.DriverInfo.DriverAcceleration <= 0 && gear1C && outTorque.IsSmaller(0) && + var disengageTOutNegativeAndTInPositive = DataBus.DriverInfo.DriverAcceleration < 0 && gear1C && outTorque.IsSmaller(0) && inTorque.IsGreater(0); var disengageTCEngineSpeedLowerIdle = braking && torqueNegative && gear1C && diff --git a/VectoCore/VectoCore/Models/SimulationComponent/Strategies/HybridStrategy.cs b/VectoCore/VectoCore/Models/SimulationComponent/Strategies/HybridStrategy.cs index 0867bac831e0642a1cd26731a963287492928fca..33b31fd3de8bf011d8ed567ac5eba9543cf8342a 100644 --- a/VectoCore/VectoCore/Models/SimulationComponent/Strategies/HybridStrategy.cs +++ b/VectoCore/VectoCore/Models/SimulationComponent/Strategies/HybridStrategy.cs @@ -55,9 +55,11 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Strategies TestPowertrain.Gearbox.Disengaged = !useNextGear.Engaged; TestPowertrain.Gearbox.DisengageGearbox = !useNextGear.Engaged; TestPowertrain.Gearbox._nextGear = NextGear; - TestPowertrain.Container.VehiclePort.Initialize(DataBus.VehicleInfo.VehicleSpeed, - DataBus.DrivingCycleInfo.RoadGradient ?? 0.SI<Radian>()); - + if (ModelData.GearboxData.TractionInterruption.IsGreater(0)) { + TestPowertrain.Container.VehiclePort.Initialize(DataBus.VehicleInfo.VehicleSpeed, + DataBus.DrivingCycleInfo.RoadGradient ?? 0.SI<Radian>()); + } + if (TestPowertrain.CombustionEngine.EngineAux is BusAuxiliariesAdapter busAux) { busAux.CurrentState.ExcessiveDragPower = ((DataBus.EngineInfo as CombustionEngine)?.EngineAux as BusAuxiliariesAdapter)?.CurrentState diff --git a/VectoCore/VectoCore/Resources/Declaration/CO2Standards/MissionProfileWeights.csv b/VectoCore/VectoCore/Resources/Declaration/CO2Standards/MissionProfileWeights.csv index 18307786e59b4a1bd3cfec7a7ee1bccecea96fcd..0eb39a06ce82d3dde77677453068fe248706c019 100644 --- a/VectoCore/VectoCore/Resources/Declaration/CO2Standards/MissionProfileWeights.csv +++ b/VectoCore/VectoCore/Resources/Declaration/CO2Standards/MissionProfileWeights.csv @@ -6,7 +6,7 @@ Weighting Group , LongHaul , LongHaul EMS , Regional Delivery , Regional Delive 4-UD , 0/0 , 0/0 , 0/0 , 0/0 , 0.5/0.5 , 0.25/0.25 , 0.25/0.25 , 0/0 , 0/0 , 0/0 , 0/0 , 0/0 4-RD , 0.05/0.05 , 0/0 , 0.45/0.45 , 0/0 , 0/0 , 0.25/0.25 , 0.25/0.25 , 0/0 , 0/0 , 0/0 , 0/0 , 0/0 4-LH , 0.45/0.45 , 0/0 , 0.05/0.05 , 0/0 , 0/0 , 0.25/0.25 , 0.25/0.25 , 0/0 , 0/0 , 0/0 , 0/0 , 0/0 -5-RD , 0.03/0.07 , 0/0 , 0.27/0.63 , 0/0 , 0/0 , 0/0 , 0/0 , 0/0 , 0/0 , 0/0 , 0/0 , 0/0 +5-RD , 0.03/0.07 , 0/0 , 0.27/0.63 , 0/0 , 0/0 , 0/0 , 0.5/0.5 , 0/0 , 0/0 , 0/0 , 0/0 , 0/0 5-LH , 0.27/0.63 , 0/0 , 0.03/0.07 , 0/0 , 0/0 , 0/0 , 0.5/0.5 , 0/0 , 0/0 , 0/0 , 0/0 , 0/0 9-RD , 0.03/0.07 , 0/0 , 0.27/0.63 , 0/0 , 0/0 , 0.25/0.25 , 0.25/0.25 , 0/0 , 0/0 , 0/0 , 0/0 , 0/0 9-LH , 0.27/0.63 , 0/0 , 0.03/0.07 , 0/0 , 0/0 , 0.25/0.25 , 0.25/0.25 , 0/0 , 0/0 , 0/0 , 0/0 , 0/0 diff --git a/VectoCore/VectoCore/Utils/SearchAlgorithm.cs b/VectoCore/VectoCore/Utils/SearchAlgorithm.cs index cdedbb4f0e93246fc6920ad073873c2e5cda071e..a9859c0e4675da96efe6095e201d338f7294cdc5 100644 --- a/VectoCore/VectoCore/Utils/SearchAlgorithm.cs +++ b/VectoCore/VectoCore/Utils/SearchAlgorithm.cs @@ -177,8 +177,9 @@ namespace TUGraz.VectoCore.Utils //iterationCount += 100; log.Debug("LineSearch could not find an operating point."); +#if DEBUG log.Error("Exceeded max iterations when searching for operating point!"); - +#endif WriteSearch(debug, "LineSearch.csv"); throw new VectoSearchFailedException("Failed to find operating point! points: {0}", debug.LocalData.Select(d => d.b).Join()); }