From 2518fc62a9bb5fffbb242bce4de61bab3211786d Mon Sep 17 00:00:00 2001
From: Stefanos Doumpoulakis <dubulak@gmail.com>
Date: Thu, 9 Jan 2025 14:34:29 +0200
Subject: [PATCH] feat: new battery and supercap readers (#872)

---
 .../Lorries/Group5_HEV_P2_supercap.xml        | 38 +++++---
 ...ectricStorageSystemDeclarationInputData.cs | 97 ++++++++++++++++++-
 .../XMLDeclarationInputDataV26InjectModule.cs | 23 +++++
 .../XMLDeclarationReaderInjectModule.cs       |  3 +-
 .../Reader/Impl/XMLComponentReader.cs         |  9 +-
 .../Models/Declaration/SpecificResistances.cs | 67 +++++++++++++
 .../ElectricComponents/Battery/BatteryData.cs |  5 +
 .../Declaration/SpecificResistances.csv       |  3 +
 .../XSD/VectoDeclarationDefinitions.2.6.xsd   |  2 +-
 VectoCore/VectoCore/Utils/XMLDefinitions.cs   |  3 +-
 10 files changed, 226 insertions(+), 24 deletions(-)
 create mode 100644 VectoCore/VectoCore/InputData/FileIO/XML/Declaration/NinjectModules/XMLDeclarationInputDataV26InjectModule.cs
 create mode 100644 VectoCore/VectoCore/Models/Declaration/SpecificResistances.cs
 create mode 100644 VectoCore/VectoCore/Resources/Declaration/SpecificResistances.csv

diff --git a/Generic Vehicles/Declaration Mode/xEV XML Jobs/Lorries/Group5_HEV_P2_supercap.xml b/Generic Vehicles/Declaration Mode/xEV XML Jobs/Lorries/Group5_HEV_P2_supercap.xml
index 9721a6509c..23351fee0c 100644
--- a/Generic Vehicles/Declaration Mode/xEV XML Jobs/Lorries/Group5_HEV_P2_supercap.xml	
+++ b/Generic Vehicles/Declaration Mode/xEV XML Jobs/Lorries/Group5_HEV_P2_supercap.xml	
@@ -1,5 +1,15 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<tns:VectoInputDeclaration xmlns="urn:tugraz:ivt:VectoAPI:DeclarationDefinitions:v2.4" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" schemaVersion="2.0" xmlns:tns="urn:tugraz:ivt:VectoAPI:DeclarationInput:v2.0" xmlns:di="http://www.w3.org/2000/09/xmldsig#" xsi:schemaLocation="urn:tugraz:ivt:VectoAPI:DeclarationJob V:\VectoCore\VectoCore\Resources\XSD/VectoDeclarationJob.xsd" xmlns:v1.0="urn:tugraz:ivt:VectoAPI:DeclarationDefinitions:v1.0" 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.4="urn:tugraz:ivt:VectoAPI:DeclarationDefinitions:v2.4">
+<tns:VectoInputDeclaration 
+	xmlns="urn:tugraz:ivt:VectoAPI:DeclarationDefinitions:v2.4" 
+	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
+	schemaVersion="2.0" 
+	xmlns:tns="urn:tugraz:ivt:VectoAPI:DeclarationInput:v2.0" 
+	xmlns:di="http://www.w3.org/2000/09/xmldsig#" 
+	xsi:schemaLocation="urn:tugraz:ivt:VectoAPI:DeclarationJob V:\VectoCore\VectoCore\Resources\XSD/VectoDeclarationJob.xsd" 
+	xmlns:v1.0="urn:tugraz:ivt:VectoAPI:DeclarationDefinitions:v1.0" 
+	xmlns:v2.0="urn:tugraz:ivt:VectoAPI:DeclarationDefinitions:v2.0"  
+	xmlns:v2.3="urn:tugraz:ivt:VectoAPI:DeclarationDefinitions:v2.3" 
+	xmlns:v2.6="urn:tugraz:ivt:VectoAPI:DeclarationDefinitions:v2.6">
 	<v2.0:Vehicle xsi:type="Vehicle_HEV-Px_HeavyLorryDeclarationType" id="Group5_HEV_P2_sc">
 		<Manufacturer>TU Graz</Manufacturer>
 		<ManufacturerAddress>Inffeldgasse 19</ManufacturerAddress>
@@ -2219,19 +2229,19 @@
 			</ElectricMachine>
 			<ElectricEnergyStorage>
 				<Capacitor>
-					<Data xsi:type="v2.3:CapacitorSystemDataType" id="CAP-qwertz">
-						<v2.3:Manufacturer>SuperCAP Factory</v2.3:Manufacturer>
-						<v2.3:Model>Super cap 7000</v2.3:Model>
-						<v2.3:CertificationNumber>123456789</v2.3:CertificationNumber>
-						<v2.3:Date>2017-01-01T00:00:00Z</v2.3:Date>
-						<v2.3:AppVersion>aaaaa</v2.3:AppVersion>
-						<v2.3:CertificationMethod>Measured</v2.3:CertificationMethod>
-						<v2.3:Capacitance>37.00</v2.3:Capacitance>
-						<v2.3:InternalResistance>5.00</v2.3:InternalResistance>
-						<v2.3:MinVoltage>100.00</v2.3:MinVoltage>
-						<v2.3:MaxVoltage>900.00</v2.3:MaxVoltage>
-						<v2.3:MaxChargingCurrent>2200.00</v2.3:MaxChargingCurrent>
-						<v2.3:MaxDischargingCurrent>2200.00</v2.3:MaxDischargingCurrent>
+					<Data xsi:type="v2.6:CapacitorSystemDataType" id="CAP-qwertz">
+						<v2.6:Manufacturer>SuperCAP Factory</v2.6:Manufacturer>
+						<v2.6:Model>Super cap 7000</v2.6:Model>
+						<v2.6:CertificationNumber>123456789</v2.6:CertificationNumber>
+						<v2.6:Date>2017-01-01T00:00:00Z</v2.6:Date>
+						<v2.6:AppVersion>aaaaa</v2.6:AppVersion>
+						<v2.6:CertificationMethod>Measured</v2.6:CertificationMethod>
+						<v2.6:Capacitance>37.00</v2.6:Capacitance>
+						<v2.6:InternalResistance>5000.00</v2.6:InternalResistance>
+						<v2.6:MinVoltage>100.00</v2.6:MinVoltage>
+						<v2.6:MaxVoltage>900.00</v2.6:MaxVoltage>
+						<v2.6:MaxChargingCurrent>2200.00</v2.6:MaxChargingCurrent>
+						<v2.6:MaxDischargingCurrent>2200.00</v2.6:MaxDischargingCurrent>
 					</Data>
 					<Signature>
 						<di:Reference>
diff --git a/VectoCore/VectoCore/InputData/FileIO/XML/Declaration/DataProvider/XMLElectricStorageSystemDeclarationInputData.cs b/VectoCore/VectoCore/InputData/FileIO/XML/Declaration/DataProvider/XMLElectricStorageSystemDeclarationInputData.cs
index b837673929..614e6280ac 100644
--- a/VectoCore/VectoCore/InputData/FileIO/XML/Declaration/DataProvider/XMLElectricStorageSystemDeclarationInputData.cs
+++ b/VectoCore/VectoCore/InputData/FileIO/XML/Declaration/DataProvider/XMLElectricStorageSystemDeclarationInputData.cs
@@ -211,7 +211,10 @@ namespace TUGraz.VectoCore.InputData.FileIO.XML.Declaration.DataProvider
 		public const string XSD_TYPE = "BatterySystemStandardValuesDataType";
 		public static readonly string QUALIFIED_XSD_TYPE = XMLHelper.CombineNamespace(NAMESPACE_URI.NamespaceName, XSD_TYPE);
 
-		public XMLBatteryPackDeclarationInputDataStandardV23(XmlNode componentNode, string sourceFile) : base(componentNode, sourceFile) { }
+		public XMLBatteryPackDeclarationInputDataStandardV23(XmlNode componentNode, string sourceFile) : base(componentNode, sourceFile) 
+		{
+			throw new VectoException($"{XSD_TYPE} v2.3 is no longer supported. Use newer version instead.");
+		}
 
 		#region Overrides of AbstractBatteryPackDeclarationInputDataProvider
 
@@ -284,9 +287,79 @@ namespace TUGraz.VectoCore.InputData.FileIO.XML.Declaration.DataProvider
 		#endregion
 	}
 
+	public class XMLBatteryPackDeclarationInputDataStandardV26 : AbstractBatteryPackDeclarationInputDataProvider
+	{
+        public static readonly XNamespace NAMESPACE_URI = XMLDefinitions.DECLARATION_DEFINITIONS_NAMESPACE_URI_V26;
+        public const string XSD_TYPE = "BatterySystemStandardValuesDataType";
+        public static readonly string QUALIFIED_XSD_TYPE = XMLHelper.CombineNamespace(NAMESPACE_URI.NamespaceName, XSD_TYPE);
+
+		private SpecificResistances _specificResistances;
+
+        public XMLBatteryPackDeclarationInputDataStandardV26(XmlNode componentNode, string sourceFile) : base(componentNode, sourceFile) 
+		{
+			_specificResistances = new SpecificResistances();
+        }
+
+        protected override XNamespace NamespaceURI => NAMESPACE_URI;
+
+        protected override TableData GetMaxCurrentMap()
+        {
+            var entries = base.GetMaxCurrentMap();
+
+			var requiredEntrySoCs = new List<int>() { 0, 30, 80, 100 };
+
+			foreach (var soc in requiredEntrySoCs)
+			{
+                if (!entries.AsEnumerable().Any(z => z.Field<string>(XMLNames.REESS_CurrentLimits_SoC).ToInt() == soc))
+				{
+					throw new VectoException($"Battery does not contain Current Limit entry for SoC: {soc}");
+                }
+            }
+
+			return entries;
+        }
+
+        protected override TableData GetInternalResistanceCurve()
+        {
+			const int SoC = 50;
+			
+			var mapSoC = BatterySOCReader.Create(VoltageCurve);
+			if (!mapSoC.ContainsSoC(SoC / 100))
+			{
+				throw new VectoException($"Battery SoC map does not contain entry with SoC: {SoC}");
+			}
+
+            var vNom = mapSoC.Lookup(SoC / 100);
+			var minCells = vNom / 4.0.SI<Volt>();
+			var maxCells = vNom / 3.0.SI<Volt>();
+
+            var resistances = base.GetInternalResistanceCurve();
+            var specificResistanceData = _specificResistances.Lookup(BatteryType);
+
+            DataRow rowSoC = resistances.AsEnumerable().First(x => x.ParseDouble(0) == SoC);
+
+            for (var i = 1; i < resistances.Columns.Count; i++)
+            {
+				var resistance = rowSoC.ParseDouble(i);
+				var resistanceName = resistances.Columns[i].ColumnName;
+
+                var specificResistance = specificResistanceData.GetValue(resistanceName);
+				var cellResistance = specificResistance / Capacity.AsAmpHour;
 
+                var minResistance = cellResistance * minCells.Value();
+				var maxResistance = cellResistance * maxCells.Value();
 
-	public class XMLBatteryPackDeclarationDeclarationInputDataV24 : AbstractCommonComponentType,
+				if ((resistance < minResistance) || (resistance > maxResistance))
+				{
+					Log.Warn($@"Battery {resistanceName}: {resistance}, for SoC: {SoC}, out of range [{minResistance.ToString("N2")}, {maxResistance.ToString("N2")}]");
+				}
+            }
+
+            return resistances;
+        }
+    }
+
+    public class XMLBatteryPackDeclarationDeclarationInputDataV24 : AbstractCommonComponentType,
 		IXMLBatteryPackDeclarationInputData
 	{
 		public static readonly XNamespace NAMESPACE_URI = XMLDefinitions.DECLARATION_DEFINITIONS_NAMESPACE_URI_V24;
@@ -401,9 +474,12 @@ namespace TUGraz.VectoCore.InputData.FileIO.XML.Declaration.DataProvider
 		public const string XSD_TYPE = "REESSCapacitorType";
 		public static readonly string QUALIFIED_XSD_TYPE = XMLHelper.CombineNamespace(NAMESPACE_URI.NamespaceName, XSD_TYPE);
 		
-		public XMLSuperCapDeclarationInputDataV24(XmlNode componentNode, string sourceFile) : base(componentNode, sourceFile)
+		public XMLSuperCapDeclarationInputDataV24(XmlNode componentNode, string sourceFile, bool disallowed = true) : base(componentNode, sourceFile)
 		{
-			//SourceType = DataSourceType.XMLEmbedded;
+			if (disallowed)
+			{
+				throw new VectoException($"Capacitor v2.3 is no longer supported. Use newer version instead.");
+			}
 		}
 		
 		#region Implementation of IREESSPackInputData
@@ -454,6 +530,17 @@ namespace TUGraz.VectoCore.InputData.FileIO.XML.Declaration.DataProvider
 		#endregion
 	}
 
+	public class XMLSuperCapDeclarationInputDataV26 : XMLSuperCapDeclarationInputDataV24
+	{
+        public static new readonly XNamespace NAMESPACE_URI = XMLDefinitions.DECLARATION_DEFINITIONS_NAMESPACE_URI_V26;
+        public const string XSD_TYPE = "CapacitorSystemDataType";
+        public static new readonly string QUALIFIED_XSD_TYPE = XMLHelper.CombineNamespace(NAMESPACE_URI.NamespaceName, XSD_TYPE);
+
+        public XMLSuperCapDeclarationInputDataV26(XmlNode componentNode, string sourceFile) : base(componentNode, sourceFile, false)
+        {}
+
+        public override Ohm InternalResistance => GetDouble(XMLNames.Capacitor_InternalResistance).SI(Unit.SI.Milli.Ohm).Cast<Ohm>();
+    }
 
 	// ---------------------------------------------------------------------------------------
 
@@ -465,7 +552,7 @@ namespace TUGraz.VectoCore.InputData.FileIO.XML.Declaration.DataProvider
 		public static readonly string QUALIFIED_XSD_TYPE =
 			XMLHelper.CombineNamespace(NAMESPACE_URI.NamespaceName, XSD_TYPE);
 
-		public XMLSuperCapDeclarationInputDataV01(XmlNode componentNode, string sourceFile) : base(componentNode, sourceFile) { }
+		public XMLSuperCapDeclarationInputDataV01(XmlNode componentNode, string sourceFile) : base(componentNode, sourceFile, false) { }
 
 		#region Overrides of XMLSuperCapDeclarationInputDataV24
 
diff --git a/VectoCore/VectoCore/InputData/FileIO/XML/Declaration/NinjectModules/XMLDeclarationInputDataV26InjectModule.cs b/VectoCore/VectoCore/InputData/FileIO/XML/Declaration/NinjectModules/XMLDeclarationInputDataV26InjectModule.cs
new file mode 100644
index 0000000000..2f2d87990c
--- /dev/null
+++ b/VectoCore/VectoCore/InputData/FileIO/XML/Declaration/NinjectModules/XMLDeclarationInputDataV26InjectModule.cs
@@ -0,0 +1,23 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using Ninject.Modules;
+using TUGraz.VectoCore.InputData.FileIO.XML.Declaration.DataProvider;
+using TUGraz.VectoCore.InputData.FileIO.XML.Declaration.Interfaces;
+
+namespace TUGraz.VectoCore.InputData.FileIO.XML.Declaration.NinjectModules
+{
+    public class XMLDeclarationInputDataV26InjectModule : NinjectModule
+    {
+        public override void Load()
+        {
+            Bind<IXMLBatteryPackDeclarationInputData>().To<XMLBatteryPackDeclarationInputDataStandardV26>()
+                .Named(XMLBatteryPackDeclarationInputDataStandardV26.QUALIFIED_XSD_TYPE);
+
+            Bind<IXMLSuperCapDeclarationInputData>().To<XMLSuperCapDeclarationInputDataV26>()
+                .Named(XMLSuperCapDeclarationInputDataV26.QUALIFIED_XSD_TYPE);
+        }
+    }
+}
diff --git a/VectoCore/VectoCore/InputData/FileIO/XML/Declaration/NinjectModules/XMLDeclarationReaderInjectModule.cs b/VectoCore/VectoCore/InputData/FileIO/XML/Declaration/NinjectModules/XMLDeclarationReaderInjectModule.cs
index bcf6935cf2..e0a0616134 100644
--- a/VectoCore/VectoCore/InputData/FileIO/XML/Declaration/NinjectModules/XMLDeclarationReaderInjectModule.cs
+++ b/VectoCore/VectoCore/InputData/FileIO/XML/Declaration/NinjectModules/XMLDeclarationReaderInjectModule.cs
@@ -54,7 +54,8 @@ namespace TUGraz.VectoCore.InputData.FileIO.XML.Declaration
 				new XMLDeclarationInputDataV23InjectModule(),
 				new XMLDeclarationInputDataV24InjectModule(),
 				new XMLDeclarationInputDataV25InjectModule(),
-				new XMLDeclarationInputDataMultistageV01InjectModule(), 
+                new XMLDeclarationInputDataV26InjectModule(),
+                new XMLDeclarationInputDataMultistageV01InjectModule(), 
 			});
 
 			#endregion
diff --git a/VectoCore/VectoCore/InputData/FileIO/XML/Declaration/Reader/Impl/XMLComponentReader.cs b/VectoCore/VectoCore/InputData/FileIO/XML/Declaration/Reader/Impl/XMLComponentReader.cs
index 44e4917f43..d8dc378eb3 100644
--- a/VectoCore/VectoCore/InputData/FileIO/XML/Declaration/Reader/Impl/XMLComponentReader.cs
+++ b/VectoCore/VectoCore/InputData/FileIO/XML/Declaration/Reader/Impl/XMLComponentReader.cs
@@ -615,7 +615,9 @@ namespace TUGraz.VectoCore.InputData.FileIO.XML.Declaration.Reader.Impl
 		public const string XSD_TYPE = "ElectricEnergyStorageType";
 		public static readonly string QUALIFIED_XSD_TYPE = XMLHelper.CombineNamespace(NAMESPACE_URI.NamespaceName, XSD_TYPE);
 
-		[Inject] public virtual IDeclarationInjectFactory Factory { protected get; set; }
+        public const double MINIMUM_CORRECTLY_PLACED_SUPERCAP_TYPE_VERSION = 2.6;
+
+        [Inject] public virtual IDeclarationInjectFactory Factory { protected get; set; }
 
 		public XMLREESSReaderV24(IXMLDeclarationVehicleData vehicle, XmlNode componentNode,
 			string sourceFile) : base( componentNode) { }
@@ -651,7 +653,10 @@ namespace TUGraz.VectoCore.InputData.FileIO.XML.Declaration.Reader.Impl
 		protected virtual ISuperCapDeclarationInputData SuperCapCreator(string version,
 			XmlNode componentNode, string sourcefile)
 		{
-			return Factory.CreateSuperCapDeclarationInputData(version, componentNode, sourcefile);
+            var dataNode = GetNode(XMLNames.ComponentDataWrapper, componentNode);
+            var dataVersion = XMLHelper.GetXsdType(dataNode.SchemaInfo.SchemaType);
+			var capVersion = XMLHelper.GetVersion(dataNode) >= MINIMUM_CORRECTLY_PLACED_SUPERCAP_TYPE_VERSION ? dataVersion : version;
+            return Factory.CreateSuperCapDeclarationInputData(capVersion, componentNode, sourcefile);
 		}
 
 		#endregion
diff --git a/VectoCore/VectoCore/Models/Declaration/SpecificResistances.cs b/VectoCore/VectoCore/Models/Declaration/SpecificResistances.cs
new file mode 100644
index 0000000000..6e48970da8
--- /dev/null
+++ b/VectoCore/VectoCore/Models/Declaration/SpecificResistances.cs
@@ -0,0 +1,67 @@
+using System;
+using System.Collections.Generic;
+using System.Data;
+using System.Linq;
+using System.Runtime.CompilerServices;
+using System.Text;
+using System.Threading.Tasks;
+using TUGraz.VectoCommon.InputData;
+using TUGraz.VectoCommon.Utils;
+using TUGraz.VectoCore.Utils;
+
+namespace TUGraz.VectoCore.Models.Declaration
+{
+    public class SpecificResistances : LookupData<BatteryType, SpecificResistances.SpecificResistancesData>
+    {
+        protected override string ResourceId => DeclarationData.DeclarationDataResourcePrefix + ".SpecificResistances.csv";
+        protected override string ErrorMessage => "SpecificResistances Lookup Error: no value found. Key: '{0}'";
+
+        public struct SpecificResistancesData 
+        {
+            public double Ri_2;
+            public double Ri_10;
+            public double Ri_20;
+            public double Ri_120;
+
+            public double GetValue(string variable)
+            {
+                var modifiedVariable = variable.Replace('-', '_');
+
+                switch (modifiedVariable)
+                {
+                    case nameof(Ri_2): return Ri_2;
+                    case nameof(Ri_10): return Ri_10;
+                    case nameof(Ri_20): return Ri_20;
+                    case nameof(Ri_120): return Ri_120;
+                    default: throw new ArgumentOutOfRangeException($"{variable} is not part of SpecificResistancesData");
+                }
+            }
+        }
+
+        public override SpecificResistancesData Lookup(BatteryType key)
+        {
+            return base.Lookup(key);
+        }
+
+        protected override void ParseData(DataTable table)
+        {
+            var ri120 = nameof(SpecificResistancesData.Ri_120).ToLower();
+
+            foreach (DataRow row in table.Rows)
+            {    
+                var val = new SpecificResistancesData()
+                {
+                    Ri_2 = row.ParseDouble(nameof(SpecificResistancesData.Ri_2).ToLower()),
+                    Ri_10 = row.ParseDouble(nameof(SpecificResistancesData.Ri_10).ToLower()),
+                    Ri_20 = row.ParseDouble(nameof(SpecificResistancesData.Ri_20).ToLower()),
+                    Ri_120 = !row.IsNull(ri120) && !String.IsNullOrWhiteSpace(row[ri120].ToString()) ? row.ParseDouble(ri120) : double.NaN
+                };
+
+                var type = (BatteryType)Enum.Parse(typeof(BatteryType), row["type"].ToString());
+
+                Data.Add(type, val);
+            }
+        }
+
+    }
+}
diff --git a/VectoCore/VectoCore/Models/SimulationComponent/Data/ElectricComponents/Battery/BatteryData.cs b/VectoCore/VectoCore/Models/SimulationComponent/Data/ElectricComponents/Battery/BatteryData.cs
index a30f9d9d6e..008ff5673c 100644
--- a/VectoCore/VectoCore/Models/SimulationComponent/Data/ElectricComponents/Battery/BatteryData.cs
+++ b/VectoCore/VectoCore/Models/SimulationComponent/Data/ElectricComponents/Battery/BatteryData.cs
@@ -140,6 +140,11 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Data.ElectricComponents.Ba
 				Entries[idx].BatteryVolts, soc);
 		}
 
+		public bool ContainsSoC(double soc)
+		{
+			return Entries.Any(x => x.SOC.IsEqual(soc));
+		}
+
 		protected int FindIndex(double soc)
 		{
 			if (soc < Entries.First().SOC)
diff --git a/VectoCore/VectoCore/Resources/Declaration/SpecificResistances.csv b/VectoCore/VectoCore/Resources/Declaration/SpecificResistances.csv
new file mode 100644
index 0000000000..9b026f7a7a
--- /dev/null
+++ b/VectoCore/VectoCore/Resources/Declaration/SpecificResistances.csv
@@ -0,0 +1,3 @@
+Type, Ri_2, Ri_10, Ri_20, Ri_120
+HEBS, 210, 240, 270, 390
+HPBS, 40, 45, 50, 
\ No newline at end of file
diff --git a/VectoCore/VectoCore/Resources/XSD/VectoDeclarationDefinitions.2.6.xsd b/VectoCore/VectoCore/Resources/XSD/VectoDeclarationDefinitions.2.6.xsd
index a330a3055e..15b9aff84f 100644
--- a/VectoCore/VectoCore/Resources/XSD/VectoDeclarationDefinitions.2.6.xsd
+++ b/VectoCore/VectoCore/Resources/XSD/VectoDeclarationDefinitions.2.6.xsd
@@ -440,7 +440,7 @@
 					<xs:element name="CurrentLimits">
 						<xs:complexType>
 							<xs:sequence>
-								<xs:element name="Entry" type="v2.3:BatterySystemCurrentLimitsEntryType" minOccurs="2" maxOccurs="unbounded"/>
+								<xs:element name="Entry" type="v2.3:BatterySystemCurrentLimitsEntryType" minOccurs="4" maxOccurs="unbounded"/>
 							</xs:sequence>
 						</xs:complexType>
 					</xs:element>
diff --git a/VectoCore/VectoCore/Utils/XMLDefinitions.cs b/VectoCore/VectoCore/Utils/XMLDefinitions.cs
index c25b4ebb2f..7c6d79f032 100644
--- a/VectoCore/VectoCore/Utils/XMLDefinitions.cs
+++ b/VectoCore/VectoCore/Utils/XMLDefinitions.cs
@@ -102,9 +102,10 @@ namespace TUGraz.VectoCore.Utils
 
 		public const string DECLARATION_DEFINITIONS_NAMESPACE_URI_V24 = DECLARATION_NAMESPACE + ":v2.4";
 		public const string DECLARATION_DEFINITIONS_NAMESPACE_URI_V25 = DECLARATION_NAMESPACE + ":v2.5";
+        public const string DECLARATION_DEFINITIONS_NAMESPACE_URI_V26 = DECLARATION_NAMESPACE + ":v2.6";
 
 
-		public const string DECLARATION_INPUT_NAMESPACE = "urn:tugraz:ivt:VectoAPI:DeclarationInput";
+        public const string DECLARATION_INPUT_NAMESPACE = "urn:tugraz:ivt:VectoAPI:DeclarationInput";
 
 		public const string DECLARATION_INPUT_NAMESPACE_URI_V10 = DECLARATION_INPUT_NAMESPACE + ":v1.0";
 
-- 
GitLab