Code development platform for open source projects from the European Union institutions

Skip to content
Snippets Groups Projects
Commit 70c9f0fe authored by Harald MARTINI's avatar Harald MARTINI
Browse files

implemented generic soc with deterioration for PEV, OVC-HEV, NOVC-HEV

parent 47071aba
No related branches found
No related tags found
No related merge requests found
Showing with 187 additions and 64 deletions
...@@ -90,7 +90,7 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter.HeavyLorry ...@@ -90,7 +90,7 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter.HeavyLorry
throw new NotImplementedException(); throw new NotImplementedException();
} }
public virtual BatterySystemData CreateBatteryData(IElectricStorageSystemDeclarationInputData componentsElectricStorage) public virtual BatterySystemData CreateBatteryData(IElectricStorageSystemDeclarationInputData componentsElectricStorage, VectoSimulationJobType jobType, bool ovc)
{ {
throw new NotImplementedException(); throw new NotImplementedException();
} }
...@@ -247,9 +247,9 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter.HeavyLorry ...@@ -247,9 +247,9 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter.HeavyLorry
gears); gears);
} }
public override BatterySystemData CreateBatteryData(IElectricStorageSystemDeclarationInputData batteryInputData) public override BatterySystemData CreateBatteryData(IElectricStorageSystemDeclarationInputData batteryInputData, VectoSimulationJobType jobType, bool ovc)
{ {
return _eletricStorageAdapter.CreateBatteryData(batteryInputData); return _eletricStorageAdapter.CreateBatteryData(batteryInputData, jobType, ovc);
} }
public override SuperCapData CreateSuperCapData(IElectricStorageSystemDeclarationInputData reessInputData) public override SuperCapData CreateSuperCapData(IElectricStorageSystemDeclarationInputData reessInputData)
...@@ -380,9 +380,9 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter.HeavyLorry ...@@ -380,9 +380,9 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter.HeavyLorry
return _electricMachineAdapter.CreateElectricMachines(electricMachines, torqueLimits, averageVoltage, gears); return _electricMachineAdapter.CreateElectricMachines(electricMachines, torqueLimits, averageVoltage, gears);
} }
public override BatterySystemData CreateBatteryData(IElectricStorageSystemDeclarationInputData componentsElectricStorage) public override BatterySystemData CreateBatteryData(IElectricStorageSystemDeclarationInputData componentsElectricStorage, VectoSimulationJobType jobType, bool ovc)
{ {
return _electricStorageAdapter.CreateBatteryData(batteryInputData: componentsElectricStorage); return _electricStorageAdapter.CreateBatteryData(batteryInputData: componentsElectricStorage, jobType: jobType, ovc: ovc);
} }
public override SuperCapData CreateSuperCapData(IElectricStorageSystemDeclarationInputData componentsElectricStorage) public override SuperCapData CreateSuperCapData(IElectricStorageSystemDeclarationInputData componentsElectricStorage)
......
...@@ -68,7 +68,7 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter ...@@ -68,7 +68,7 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter
IList<Tuple<PowertrainPosition, ElectricMotorData>> CreateElectricMachines(IElectricMachinesDeclarationInputData electricMachines, IDictionary<PowertrainPosition, IList<Tuple<Volt, TableData>>> torqueLimits, Volt averageVoltage, GearList gears = null); IList<Tuple<PowertrainPosition, ElectricMotorData>> CreateElectricMachines(IElectricMachinesDeclarationInputData electricMachines, IDictionary<PowertrainPosition, IList<Tuple<Volt, TableData>>> torqueLimits, Volt averageVoltage, GearList gears = null);
BatterySystemData CreateBatteryData(IElectricStorageSystemDeclarationInputData componentsElectricStorage); BatterySystemData CreateBatteryData(IElectricStorageSystemDeclarationInputData componentsElectricStorage, VectoSimulationJobType jobType, bool ovc);
SuperCapData CreateSuperCapData(IElectricStorageSystemDeclarationInputData componentsElectricStorage); SuperCapData CreateSuperCapData(IElectricStorageSystemDeclarationInputData componentsElectricStorage);
HybridStrategyParameters CreateHybridStrategy(BatterySystemData runDataBatteryData, SuperCapData runDataSuperCapData); HybridStrategyParameters CreateHybridStrategy(BatterySystemData runDataBatteryData, SuperCapData runDataSuperCapData);
ShiftStrategyParameters CreateDummyGearshiftStrategy(); ShiftStrategyParameters CreateDummyGearshiftStrategy();
......
...@@ -13,7 +13,8 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter.SimulationComponen ...@@ -13,7 +13,8 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter.SimulationComponen
{ {
public class ElectricStorageAdapter public class ElectricStorageAdapter
{ {
public BatterySystemData CreateBatteryData(IElectricStorageSystemDeclarationInputData batteryInputData) public BatterySystemData CreateBatteryData(IElectricStorageSystemDeclarationInputData batteryInputData,
VectoSimulationJobType jobType, bool ovc)
{ {
if (batteryInputData == null) if (batteryInputData == null)
{ {
...@@ -28,6 +29,7 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter.SimulationComponen ...@@ -28,6 +29,7 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter.SimulationComponen
} }
var retVal = new BatterySystemData(); var retVal = new BatterySystemData();
var genericSOC = DeclarationData.Battery.GenericSOC.Lookup(jobType, ovc);
foreach (var entry in batteries) foreach (var entry in batteries)
{ {
var b = entry.REESSPack as IBatteryPackDeclarationInputData; var b = entry.REESSPack as IBatteryPackDeclarationInputData;
...@@ -37,12 +39,13 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter.SimulationComponen ...@@ -37,12 +39,13 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter.SimulationComponen
} }
//for (var i = 0; i < entry.Count; i++) { //for (var i = 0; i < entry.Count; i++) {
var minSoc = DeclarationData.Battery.GetMinSoc(b.BatteryType); var minSoc = genericSOC.SOCMin;
if (b.MinSOC != null && b.MinSOC > minSoc) { if (b.MinSOC != null && b.MinSOC > minSoc) {
minSoc = b.MinSOC.Value; minSoc = b.MinSOC.Value;
} }
var maxSoc = DeclarationData.Battery.GetMaxSoc(b.BatteryType);
if (b.MaxSOC != null && b.MaxSOC < maxSoc) { var maxSoc = genericSOC.SOCMax;
if (b.MaxSOC != null && b.MaxSOC < maxSoc && b.MaxSOC > b.MinSOC) {
maxSoc = b.MaxSOC.Value; maxSoc = b.MaxSOC.Value;
} }
......
...@@ -333,7 +333,7 @@ namespace TUGraz.VectoCore.InputData.Reader.Impl.DeclarationMode.HeavyLorryRunDa ...@@ -333,7 +333,7 @@ namespace TUGraz.VectoCore.InputData.Reader.Impl.DeclarationMode.HeavyLorryRunDa
result.AirdragData = result.AirdragData =
DataAdapter.CreateAirdragData(vehicle.Components.AirdragInputData, mission, _segment); DataAdapter.CreateAirdragData(vehicle.Components.AirdragInputData, mission, _segment);
result.DriverData = DataAdapter.CreateDriverData(_segment); result.DriverData = DataAdapter.CreateDriverData(_segment);
result.BatteryData = DataAdapter.CreateBatteryData(componentsElectricStorage: vehicle.Components.ElectricStorage); result.BatteryData = DataAdapter.CreateBatteryData(componentsElectricStorage: vehicle.Components.ElectricStorage, vehicle.VehicleType, true);
result.SuperCapData = DataAdapter.CreateSuperCapData(componentsElectricStorage: vehicle.Components.ElectricStorage); result.SuperCapData = DataAdapter.CreateSuperCapData(componentsElectricStorage: vehicle.Components.ElectricStorage);
result.ElectricMachinesData = DataAdapter.CreateElectricMachines(vehicle.Components.ElectricMachines, vehicle.ElectricMotorTorqueLimits, result.BatteryData.CalculateAverageVoltage(), null); result.ElectricMachinesData = DataAdapter.CreateElectricMachines(vehicle.Components.ElectricMachines, vehicle.ElectricMotorTorqueLimits, result.BatteryData.CalculateAverageVoltage(), null);
result.AngledriveData = DataAdapter.CreateAngledriveData(vehicle.Components.AngledriveInputData); result.AngledriveData = DataAdapter.CreateAngledriveData(vehicle.Components.AngledriveInputData);
......
...@@ -87,7 +87,7 @@ namespace TUGraz.VectoCore.InputData.Reader.Impl.DeclarationMode.HeavyLorryRunDa ...@@ -87,7 +87,7 @@ namespace TUGraz.VectoCore.InputData.Reader.Impl.DeclarationMode.HeavyLorryRunDa
var runData = CreateCommonRunData(vehicle, mission, loading, _segment, engineModes, modeIdx.Value); var runData = CreateCommonRunData(vehicle, mission, loading, _segment, engineModes, modeIdx.Value);
runData.VehicleData = DataAdapter.CreateVehicleData(vehicle, _segment, mission, loading, _allowVocational); runData.VehicleData = DataAdapter.CreateVehicleData(vehicle, _segment, mission, loading, _allowVocational);
runData.EngineData = DataAdapter.CreateEngineData(vehicle, engineMode, mission); runData.EngineData = DataAdapter.CreateEngineData(vehicle, engineMode, mission);
runData.BatteryData = DataAdapter.CreateBatteryData(vehicle.Components.ElectricStorage); runData.BatteryData = DataAdapter.CreateBatteryData(vehicle.Components.ElectricStorage, vehicle.VehicleType, vehicle.OvcHev);
runData.SuperCapData = DataAdapter.CreateSuperCapData(vehicle.Components.ElectricStorage); runData.SuperCapData = DataAdapter.CreateSuperCapData(vehicle.Components.ElectricStorage);
runData.ElectricMachinesData = DataAdapter.CreateElectricMachines(vehicle.Components.ElectricMachines, vehicle.ElectricMotorTorqueLimits, runData.BatteryData.CalculateAverageVoltage()); runData.ElectricMachinesData = DataAdapter.CreateElectricMachines(vehicle.Components.ElectricMachines, vehicle.ElectricMotorTorqueLimits, runData.BatteryData.CalculateAverageVoltage());
runData.GearboxData = _gearboxData; runData.GearboxData = _gearboxData;
......
...@@ -1225,6 +1225,8 @@ namespace TUGraz.VectoCore.Models.Declaration ...@@ -1225,6 +1225,8 @@ namespace TUGraz.VectoCore.Models.Declaration
public static class Battery public static class Battery
{ {
public static GenericSOC GenericSOC = new GenericSOC();
/// <summary> /// <summary>
/// Percentage of the maximum voltage of the battery /// Percentage of the maximum voltage of the battery
/// </summary> /// </summary>
......
using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using TUGraz.VectoCommon.InputData;
using TUGraz.VectoCommon.Utils;
using TUGraz.VectoCore.InputData.Reader.Impl;
using TUGraz.VectoCore.Utils;
namespace TUGraz.VectoCore.Models.Declaration
{
public class GenericSOC : LookupData<VectoSimulationJobType, bool, GenericSOC.GenericSOCData>
{
protected override string ResourceId => DeclarationData.DeclarationDataResourcePrefix + ".GenericSOC.csv";
protected override string ErrorMessage => "GenericSOC Lookup Error: no value found. Key: '{0}'";
private double _factor = 1d/100;
public struct GenericSOCData
{
public double SOCMin;
public double SOCMax;
public double GenericDetorioration;
}
public GenericSOC()
{
}
#region Overrides of LookupData
#region Overrides of LookupData<VectoSimulationJobType,bool,GenericSOCData>
public override GenericSOCData Lookup(VectoSimulationJobType jobType, bool ovc)
{
return base.Lookup(jobType, ovc);
}
#endregion
protected override void ParseData(DataTable table)
{
foreach (DataRow row in table.Rows) {
var architecture = row["architecture"];
switch (architecture) {
case "PEV":
CreatePEVEntries(row);
break;
case "HEV":
CreateHEVEntries(row);
break;
default:
throw new ArgumentOutOfRangeException();
}
}
}
#endregion
private void CreatePEVEntries(DataRow row)
{
var architectures = new VectoSimulationJobType[] {
VectoSimulationJobType.BatteryElectricVehicle,
VectoSimulationJobType.IEPC_E
};
var val = GenericSocData(row);
foreach (var archs in architectures) {
Data.Add(new Tuple<VectoSimulationJobType, bool>(archs, row.ParseBoolean("ovc")), val);
}
}
private GenericSOCData GenericSocData(DataRow row)
{
var val = new GenericSOCData() {
SOCMin = row.ParseDouble("genericsocmin") * _factor,
SOCMax = row.ParseDouble("genericsocmax") * _factor,
GenericDetorioration = row.ParseDouble("genericdeterioration") * _factor,
};
return val;
}
private void CreateHEVEntries(DataRow row)
{
var val = GenericSocData(row);
var architectures = new VectoSimulationJobType[] {
VectoSimulationJobType.ParallelHybridVehicle,
VectoSimulationJobType.SerialHybridVehicle,
VectoSimulationJobType.IHPC,
VectoSimulationJobType.IEPC_S
};
foreach (var archs in architectures)
{
Data.Add(new Tuple<VectoSimulationJobType, bool>(archs, row.ParseBoolean("ovc")), val);
}
}
}
}
using System.Collections.Generic; using System;
using System.Collections.Generic;
using System.Data; using System.Data;
using System.Linq; using System.Linq;
using System.Runtime.InteropServices.ComTypes; using System.Runtime.InteropServices.ComTypes;
...@@ -6,6 +7,7 @@ using Castle.Core.Resource; ...@@ -6,6 +7,7 @@ using Castle.Core.Resource;
using Moq; using Moq;
using NLog.LayoutRenderers; using NLog.LayoutRenderers;
using NUnit.Framework; using NUnit.Framework;
using TUGraz.VectoCommon.Exceptions;
using TUGraz.VectoCommon.InputData; using TUGraz.VectoCommon.InputData;
using TUGraz.VectoCommon.Utils; using TUGraz.VectoCommon.Utils;
using TUGraz.VectoCore.InputData.FileIO.XML.Declaration.DataProvider; using TUGraz.VectoCore.InputData.FileIO.XML.Declaration.DataProvider;
...@@ -27,73 +29,53 @@ public class BatteryDataAdapterTest ...@@ -27,73 +29,53 @@ public class BatteryDataAdapterTest
} }
[TestCase(null, null, 0.0725, 0.9275, 0.8550)] //PEV
public void PEVBatteryDataAdapterTest( [TestCase(null, null, 0.0725, 0.9275, 0.8550, VectoSimulationJobType.BatteryElectricVehicle, true)]
[TestCase(null, null, 0.0725, 0.9275, 0.8550, VectoSimulationJobType.BatteryElectricVehicle, false)]
//HEV Ovc
[TestCase(0.23, 0.77, 0.2435, 0.7565, 0.5130, VectoSimulationJobType.SerialHybridVehicle, true)]
[TestCase(null, null, 0.1675, 0.8325, 0.6650, VectoSimulationJobType.SerialHybridVehicle, true)]
[TestCase(0.05, 0.97, 0.1675, 0.8325, 0.6650, VectoSimulationJobType.SerialHybridVehicle, true)]
//HEV Non Ovc
[TestCase(0.40, 0.60, 0.4050, 0.5950, 0.1900, VectoSimulationJobType.SerialHybridVehicle, false)]
[TestCase(null, null, 0.2625, 0.7375, 0.4750, VectoSimulationJobType.SerialHybridVehicle, false)]
[TestCase(0.15, 0.85, 0.2625, 0.7375, 0.4750, VectoSimulationJobType.SerialHybridVehicle, false)]
public void GenericSOCTest(
double inputMinSoc, double inputMinSoc,
double inputMaxSoc, double inputMaxSoc,
double expectedMinSoc, double expectedMinSoc,
double expectedMaxSoc, double expectedMaxSoc,
double usableSocRange) double usableSocRange, VectoSimulationJobType vectoSimulationJobType, bool ovc)
{ {
var elStorage = CreateElectricStorage(null, null);
var inputData = CreateElectricStorageSystem(elStorage.Object);
var elStorage = CreateElectricStorage(inputMinSoc, inputMaxSoc);
var inputData = CreateElectricStorageSystem(elStorage.Object);
var batteryData = _electricStorageAdapter.CreateBatteryData(inputData.Object);
Assert.AreEqual(1, batteryData.Batteries.Count);
var battery = batteryData.Batteries.FirstOrDefault().Item2;
Assert.IsTrue(battery.MinSOC.IsEqual(expectedMinSoc));
Assert.IsTrue(battery.MaxSOC.IsEqual(expectedMaxSoc ));
Assert.IsTrue(usableSocRange.IsEqual(battery.GetUsableSocRange()), $"Invalid {nameof(usableSocRange)} expected {usableSocRange} got {battery.GetUsableSocRange()}"); BatterySystemData batteryData;
if (vectoSimulationJobType == VectoSimulationJobType.BatteryElectricVehicle && !ovc) {
} Assert.Throws<VectoException>(() => _electricStorageAdapter.CreateBatteryData(inputData.Object, vectoSimulationJobType, ovc));
Assert.Pass();
}
private static Mock<IElectricStorageDeclarationInputData> CreateElectricStorage(double? minSoc, double? maxSoc) batteryData = _electricStorageAdapter.CreateBatteryData(inputData.Object, vectoSimulationJobType, ovc);
{
var elStorage = new Mock<IElectricStorageDeclarationInputData>();
var ressPack = new Mock<IBatteryPackDeclarationInputData>();
ressPack.Setup(m => m.Capacity).Returns((1000).SI<AmpereSecond>());
ressPack.Setup(m => m.MinSOC).Returns(() => minSoc);
ressPack.Setup(m => m.MaxSOC).Returns(() => maxSoc);
ressPack.Setup(m => m.MaxCurrentMap).Returns(
GetMockTableData(new[] {
new[]{"0.0", "0.0", "0.0"},
new[]{"0.0", "0.0", "0.0"},
new[]{"0.0", "0.0", "0.0"}
}));
ressPack.Setup(m => m.InternalResistanceCurve).Returns( Assert.AreEqual(1, batteryData.Batteries.Count);
GetMockTableData(new[] {
new[]{"0.0", "0.0"},
new[]{"0.0", "0.0"},
new[]{"0.0", "0.0"}
}));
ressPack.Setup(m => m.VoltageCurve).Returns(
GetMockTableData(new[] {
new[]{"0.0", "0.0"},
new[]{"0.0", "0.0"},
new[]{"0.0", "0.0"}
}));
elStorage.Setup(m => m.REESSPack).Returns(() => ressPack.Object);
return elStorage;
}
[TestCase]
public void OVCHevBatteryDataAdapterTest()
{
} var battery = batteryData.Batteries.FirstOrDefault().Item2;
[TestCase] Assert.IsTrue(battery.MinSOC.IsEqual(expectedMinSoc), $"Expected: {expectedMinSoc}, Actual{battery.MinSOC}");
public void NonOVCHevBatteryDataAdapterTest() Assert.IsTrue(battery.MaxSOC.IsEqual(expectedMaxSoc), $"Expected: {expectedMaxSoc}, Actual{battery.MaxSOC}");
{
Assert.IsTrue(usableSocRange.IsEqual(battery.GetUsableSocRange()),
$"Invalid {nameof(usableSocRange)} expected {usableSocRange} got {battery.GetUsableSocRange()}");
} }
Mock<IElectricStorageSystemDeclarationInputData> CreateElectricStorageSystem(params IElectricStorageDeclarationInputData[] elStorageInputData) Mock<IElectricStorageSystemDeclarationInputData> CreateElectricStorageSystem(params IElectricStorageDeclarationInputData[] elStorageInputData)
...@@ -122,6 +104,39 @@ public class BatteryDataAdapterTest ...@@ -122,6 +104,39 @@ public class BatteryDataAdapterTest
} }
private static Mock<IElectricStorageDeclarationInputData> CreateElectricStorage(double? minSoc, double? maxSoc)
{
var elStorage = new Mock<IElectricStorageDeclarationInputData>();
var ressPack = new Mock<IBatteryPackDeclarationInputData>();
ressPack.Setup(m => m.Capacity).Returns((1000).SI<AmpereSecond>());
ressPack.Setup(m => m.MinSOC).Returns(() => minSoc);
ressPack.Setup(m => m.MaxSOC).Returns(() => maxSoc);
ressPack.Setup(m => m.MaxCurrentMap).Returns(
GetMockTableData(new[] {
new[]{"0.0", "0.0", "0.0"},
new[]{"0.0", "0.0", "0.0"},
new[]{"0.0", "0.0", "0.0"}
}));
ressPack.Setup(m => m.InternalResistanceCurve).Returns(
GetMockTableData(new[] {
new[]{"0.0", "0.0"},
new[]{"0.0", "0.0"},
new[]{"0.0", "0.0"}
}));
ressPack.Setup(m => m.VoltageCurve).Returns(
GetMockTableData(new[] {
new[]{"0.0", "0.0"},
new[]{"0.0", "0.0"},
new[]{"0.0", "0.0"}
}));
elStorage.Setup(m => m.REESSPack).Returns(() => ressPack.Object);
return elStorage;
}
} }
internal static class BatteryDataExtension internal static class BatteryDataExtension
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment