Code development platform for open source projects from the European Union institutions :large_blue_circle: EU Login authentication by SMS has been phased out. To see alternatives please check here

Skip to content
Snippets Groups Projects
Commit b0e498f2 authored by Markus Quaritsch's avatar Markus Quaritsch
Browse files

allowing multiple electric motors at a single position - combine full-load...

allowing multiple electric motors at a single position - combine full-load curve, drag curve and map accordingly, new parameter mechancial efficiency
calculate max vehicle speed for BEVs
adapt driver strategy to handle BEVs
added testcase and new model data for BEV tests
parent 9012715e
Branches
Tags
No related merge requests found
Showing
with 468 additions and 86 deletions
...@@ -709,6 +709,10 @@ namespace TUGraz.VectoCommon.InputData ...@@ -709,6 +709,10 @@ namespace TUGraz.VectoCommon.InputData
public int Count { get; set; } public int Count { get; set; }
public PowertrainPosition Position { get; set; } public PowertrainPosition Position { get; set; }
public double Ratio { get; set; }
public double MechanicalEfficiency { get; set; }
} }
public interface IElectricStorageDeclarationInputData public interface IElectricStorageDeclarationInputData
......
...@@ -38,5 +38,11 @@ namespace TUGraz.VectoCommon.InputData { ...@@ -38,5 +38,11 @@ namespace TUGraz.VectoCommon.InputData {
{ {
return pos.ToString().Replace(HybridPrefix, "").Replace(BatteryElectriPrefix, ""); return pos.ToString().Replace(HybridPrefix, "").Replace(BatteryElectriPrefix, "");
} }
public static bool IsBatteryElectric(this PowertrainPosition pos)
{
return pos == PowertrainPosition.BatteryElectricB2 || pos == PowertrainPosition.BatteryElectricB3 ||
pos == PowertrainPosition.BatteryElectricB4;
}
} }
} }
\ No newline at end of file
...@@ -9,7 +9,7 @@ namespace TUGraz.VectoCore.InputData.Reader.ComponentData ...@@ -9,7 +9,7 @@ namespace TUGraz.VectoCore.InputData.Reader.ComponentData
{ {
public static class ElectricFullLoadCurveReader public static class ElectricFullLoadCurveReader
{ {
public static ElectricFullLoadCurve Create(DataTable data) public static ElectricFullLoadCurve Create(DataTable data, double ratio, int count, double efficiency)
{ {
if (data.Columns.Count < 3) { if (data.Columns.Count < 3) {
throw new VectoException("Motor FullLoadCurve Data must contain at least 3 columns"); throw new VectoException("Motor FullLoadCurve Data must contain at least 3 columns");
...@@ -27,9 +27,9 @@ namespace TUGraz.VectoCore.InputData.Reader.ComponentData ...@@ -27,9 +27,9 @@ namespace TUGraz.VectoCore.InputData.Reader.ComponentData
return new ElectricFullLoadCurve( return new ElectricFullLoadCurve(
(from DataRow row in data.Rows (from DataRow row in data.Rows
select new ElectricFullLoadCurve.FullLoadEntry { select new ElectricFullLoadCurve.FullLoadEntry {
MotorSpeed = row.ParseDouble(Fields.MotorSpeed).RPMtoRad(), MotorSpeed = row.ParseDouble(Fields.MotorSpeed).RPMtoRad() / ratio,
FullDriveTorque = row.ParseDouble(Fields.DrivingTorque).SI<NewtonMeter>(), FullDriveTorque = row.ParseDouble(Fields.DrivingTorque).SI<NewtonMeter>() * count * ratio * efficiency,
FullGenerationTorque = row.ParseDouble(Fields.GenerationTorque).SI<NewtonMeter>() FullGenerationTorque = row.ParseDouble(Fields.GenerationTorque).SI<NewtonMeter>() * count * ratio / efficiency
}).ToList()); }).ToList());
} }
...@@ -51,7 +51,7 @@ namespace TUGraz.VectoCore.InputData.Reader.ComponentData ...@@ -51,7 +51,7 @@ namespace TUGraz.VectoCore.InputData.Reader.ComponentData
public static class ElectricMotorDragCurveReader public static class ElectricMotorDragCurveReader
{ {
public static DragCurve Create(DataTable data) public static DragCurve Create(DataTable data, double ratio, int count, double efficiency)
{ {
if (data.Columns.Count < 2) { if (data.Columns.Count < 2) {
throw new VectoException("Drag Curve must contain at least 2 columns"); throw new VectoException("Drag Curve must contain at least 2 columns");
...@@ -66,8 +66,8 @@ namespace TUGraz.VectoCore.InputData.Reader.ComponentData ...@@ -66,8 +66,8 @@ namespace TUGraz.VectoCore.InputData.Reader.ComponentData
data.Columns[1].ColumnName = Fields.DragTorque; data.Columns[1].ColumnName = Fields.DragTorque;
} }
return new DragCurve(data.AsEnumerable().Cast<DataRow>().Select(x => new DragCurve.DragLoadEntry() { return new DragCurve(data.AsEnumerable().Cast<DataRow>().Select(x => new DragCurve.DragLoadEntry() {
MotorSpeed = x.ParseDouble(Fields.MotorSpeed).RPMtoRad(), MotorSpeed = x.ParseDouble(Fields.MotorSpeed).RPMtoRad() / ratio,
DragTorque = x.ParseDouble(Fields.DragTorque).SI<NewtonMeter>() DragTorque = x.ParseDouble(Fields.DragTorque).SI<NewtonMeter>() * ratio * count / efficiency
}).ToList()); }).ToList());
} }
......
...@@ -12,12 +12,12 @@ using TUGraz.VectoCore.Utils; ...@@ -12,12 +12,12 @@ using TUGraz.VectoCore.Utils;
namespace TUGraz.VectoCore.InputData.Reader.ComponentData { namespace TUGraz.VectoCore.InputData.Reader.ComponentData {
public static class ElectricMotorMapReader public static class ElectricMotorMapReader
{ {
public static EfficiencyMap Create(Stream data) public static EfficiencyMap Create(Stream data, double ratio, int count, double efficiency)
{ {
return Create(VectoCSVFile.ReadStream(data)); return Create(VectoCSVFile.ReadStream(data), ratio, count, efficiency);
} }
public static EfficiencyMap Create(DataTable data) public static EfficiencyMap Create(DataTable data, double ratio, int count, double efficiency)
{ {
var headerValid = HeaderIsValid(data.Columns); var headerValid = HeaderIsValid(data.Columns);
if (!headerValid) if (!headerValid)
...@@ -30,13 +30,21 @@ namespace TUGraz.VectoCore.InputData.Reader.ComponentData { ...@@ -30,13 +30,21 @@ namespace TUGraz.VectoCore.InputData.Reader.ComponentData {
data.Columns[1].ColumnName = Fields.Torque; data.Columns[1].ColumnName = Fields.Torque;
data.Columns[2].ColumnName = Fields.PowerElectrical; data.Columns[2].ColumnName = Fields.PowerElectrical;
} }
var delaunayMap = new DelaunayMap("ElectricMotorEfficiencyMap Mechanicla to Electric"); var delaunayMap = new DelaunayMap("ElectricMotorEfficiencyMap Mechanical to Electric");
foreach (DataRow row in data.Rows) foreach (DataRow row in data.Rows)
{ {
try try
{ {
var entry = CreateEntry(row); var entry = CreateEntry(row);
delaunayMap.AddPoint(-entry.Torque.Value(), entry.MotorSpeed.Value(), -entry.PowerElectrical.Value()); if (entry.Torque.IsGreaterOrEqual(0)) {
delaunayMap.AddPoint(-entry.Torque.Value() * count * ratio * efficiency,
entry.MotorSpeed.Value() / ratio,
-entry.PowerElectrical.Value() * count);
} else {
delaunayMap.AddPoint(-entry.Torque.Value() * count * ratio / efficiency,
entry.MotorSpeed.Value() / ratio,
-entry.PowerElectrical.Value() * count);
}
} }
catch (Exception e) catch (Exception e)
{ {
......
...@@ -650,19 +650,17 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter ...@@ -650,19 +650,17 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter
} }
return electricMachines.Entries return electricMachines.Entries
.Select(x => Tuple.Create(x.Position, CreateElectricMachine(x.ElectricMachine, x.Count))).ToList(); .Select(x => Tuple.Create(x.Position, CreateElectricMachine(x.ElectricMachine, x.Count, x.Ratio, x.MechanicalEfficiency))).ToList();
} }
private ElectricMotorData CreateElectricMachine(IElectricMotorEngineeringInputData motorData, int count) private ElectricMotorData CreateElectricMachine(IElectricMotorEngineeringInputData motorData, int count,
double ratio, double efficiency)
{ {
if (count > 1) {
throw new VectoException("Multiple electric motors at a position are currently not supported");
}
return new ElectricMotorData() { return new ElectricMotorData() {
FullLoadCurve = ElectricFullLoadCurveReader.Create(motorData.FullLoadCurve), FullLoadCurve = ElectricFullLoadCurveReader.Create(motorData.FullLoadCurve, ratio, count, efficiency),
DragCurve = ElectricMotorDragCurveReader.Create(motorData.DragCurve), DragCurve = ElectricMotorDragCurveReader.Create(motorData.DragCurve, ratio, count, efficiency),
EfficiencyMap = ElectricMotorMapReader.Create(motorData.EfficiencyMap), EfficiencyMap = ElectricMotorMapReader.Create(motorData.EfficiencyMap, ratio, count, efficiency),
Inertia = motorData.Inertia Inertia = motorData.Inertia,
}; };
} }
} }
......
...@@ -402,6 +402,9 @@ namespace TUGraz.VectoCore.Models.Simulation.Data ...@@ -402,6 +402,9 @@ namespace TUGraz.VectoCore.Models.Simulation.Data
[ModalResultField(typeof(SI), caption: "P_em-B4_mech [kW]", outputFactor: 1e-3)] [ModalResultField(typeof(SI), caption: "P_em-B4_mech [kW]", outputFactor: 1e-3)]
P_electricMotor_mech_B4, P_electricMotor_mech_B4,
[ModalResultField(typeof(SI), caption: "P_em-B3_mech [kW]", outputFactor: 1e-3)]
P_electricMotor_mech_B3,
// --> // -->
[ModalResultField(typeof(SI), caption: "P_bat_T [kW]", outputFactor: 1e-3)] P_battery_terminal, [ModalResultField(typeof(SI), caption: "P_bat_T [kW]", outputFactor: 1e-3)] P_battery_terminal,
......
...@@ -84,6 +84,8 @@ namespace TUGraz.VectoCore.Models.Simulation.DataBus ...@@ -84,6 +84,8 @@ namespace TUGraz.VectoCore.Models.Simulation.DataBus
{ {
bool HasCombustionEngine { get; } bool HasCombustionEngine { get; }
//PowertrainArchitecture A bool HasElectricMotor { get; }
PowertrainPosition[] ElectricMotorPositions { get; }
} }
} }
\ No newline at end of file
...@@ -9,5 +9,7 @@ namespace TUGraz.VectoCore.Models.Simulation.DataBus ...@@ -9,5 +9,7 @@ namespace TUGraz.VectoCore.Models.Simulation.DataBus
PerSecond ElectricMotorSpeed { get; } PerSecond ElectricMotorSpeed { get; }
PowertrainPosition Position { get; } PowertrainPosition Position { get; }
PerSecond MaxSpeed { get; }
Watt DragPower(PerSecond electricMotorSpeed);
} }
} }
\ No newline at end of file
...@@ -236,6 +236,11 @@ namespace TUGraz.VectoCore.Models.Simulation.Impl ...@@ -236,6 +236,11 @@ namespace TUGraz.VectoCore.Models.Simulation.Impl
public virtual bool HasElectricMotor { get; private set; } public virtual bool HasElectricMotor { get; private set; }
public PowertrainPosition[] ElectricMotorPositions
{
get { return ElectricMotors.Keys.ToArray(); }
}
public virtual bool HasCombustionEngine { get; private set; } public virtual bool HasCombustionEngine { get; private set; }
public virtual bool HasGearbox { get; private set; } public virtual bool HasGearbox { get; private set; }
......
...@@ -6,6 +6,7 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Data { ...@@ -6,6 +6,7 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Data {
public class EfficiencyMap public class EfficiencyMap
{ {
private readonly DelaunayMap _efficiencyMapMech2El; private readonly DelaunayMap _efficiencyMapMech2El;
private PerSecond _maxSpeed;
protected internal EfficiencyMap(DelaunayMap efficiencyMapMech2El) protected internal EfficiencyMap(DelaunayMap efficiencyMapMech2El)
{ {
...@@ -109,6 +110,10 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Data { ...@@ -109,6 +110,10 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Data {
if (batPower.IsEqual(0, 1e-3)) { if (batPower.IsEqual(0, 1e-3)) {
return null; return null;
} }
if (avgSpeed.IsGreaterOrEqual(MaxSpeed)) {
return 0.SI<NewtonMeter>();
}
var retVal = SearchAlgorithm.Search( var retVal = SearchAlgorithm.Search(
maxEmTorque, elPowerMaxEM.ElectricalPower, maxEmTorque * 0.1, maxEmTorque, elPowerMaxEM.ElectricalPower, maxEmTorque * 0.1,
getYValue: x => { getYValue: x => {
...@@ -123,5 +128,10 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Data { ...@@ -123,5 +128,10 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Data {
return retVal; return retVal;
} }
protected PerSecond MaxSpeed
{
get { return _maxSpeed ?? (_maxSpeed = _efficiencyMapMech2El.Entries.Select(x => x.Y).Max().RPMtoRad()); }
}
} }
} }
\ No newline at end of file
...@@ -12,5 +12,6 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Data ...@@ -12,5 +12,6 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Data
public KilogramSquareMeter Inertia { get; internal set; } public KilogramSquareMeter Inertia { get; internal set; }
public DragCurve DragCurve { get; internal set; } public DragCurve DragCurve { get; internal set; }
} }
} }
\ No newline at end of file
...@@ -680,12 +680,19 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl ...@@ -680,12 +680,19 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl
var rollResistanceForce = Driver.DataBus.VehicleInfo.RollingResistance( var rollResistanceForce = Driver.DataBus.VehicleInfo.RollingResistance(
((targetAltitude - vehicleAltitude) / (actionEntry.Distance - Driver.DataBus.MileageCounter.Distance)) ((targetAltitude - vehicleAltitude) / (actionEntry.Distance - Driver.DataBus.MileageCounter.Distance))
.Value().SI<Radian>()); .Value().SI<Radian>());
var engineDragLoss = Driver.DataBus.EngineInfo.EngineDragPower(Driver.DataBus.EngineInfo.EngineSpeed); var engineDragLoss = Driver.DataBus.PowertrainInfo.HasCombustionEngine
var gearboxLoss = Driver.DataBus.GearboxInfo.GearboxLoss(); ? Driver.DataBus.EngineInfo.EngineDragPower(Driver.DataBus.EngineInfo.EngineSpeed)
var axleLoss = Driver.DataBus.AxlegearInfo.AxlegearLoss(); : 0.SI<Watt>();
var emDragLoss = Driver.DataBus.PowertrainInfo.HasElectricMotor
? Driver.DataBus.PowertrainInfo.ElectricMotorPositions.Select(x => Driver.DataBus.ElectricMotorInfo(x).DragPower(Driver.DataBus.ElectricMotorInfo(x).ElectricMotorSpeed)).Sum() // Driver.DataBus.ElectricMotorInfo()
: 0.SI<Watt>();
var gearboxLoss = Driver.DataBus.GearboxInfo?.GearboxLoss() ?? 0.SI<Watt>();
var axleLoss = Driver.DataBus.AxlegearInfo?.AxlegearLoss() ?? 0.SI<Watt>();
var coastingResistanceForce = airDragForce + rollResistanceForce + var coastingResistanceForce = airDragForce + rollResistanceForce +
(gearboxLoss + axleLoss - engineDragLoss) / vehicleSpeed; (gearboxLoss + axleLoss + emDragLoss - (engineDragLoss)) / vehicleSpeed;
var coastingDecisionFactor = Driver.DriverData.LookAheadCoasting.LookAheadDecisionFactor.Lookup( var coastingDecisionFactor = Driver.DriverData.LookAheadCoasting.LookAheadDecisionFactor.Lookup(
targetSpeed, targetSpeed,
...@@ -1001,7 +1008,7 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl ...@@ -1001,7 +1008,7 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl
first = Driver.DrivingActionAccelerate(absTime, ds, targetVelocity, gradient); first = Driver.DrivingActionAccelerate(absTime, ds, targetVelocity, gradient);
debug.Add(new { action = "Coast:(Success & Acc<0) -> Accelerate", first }); debug.Add(new { action = "Coast:(Success & Acc<0) -> Accelerate", first });
} }
if (!DataBus.EngineInfo.EngineOn && first is ResponseOverload) { if (DataBus.PowertrainInfo.HasCombustionEngine && !DataBus.EngineInfo.EngineOn && first is ResponseOverload) {
first = Driver.DrivingActionAccelerate(absTime, ds, targetVelocity, gradient); first = Driver.DrivingActionAccelerate(absTime, ds, targetVelocity, gradient);
debug.Add(new { action = "Coast:(Overload & ICE off) -> Accelerate", first }); debug.Add(new { action = "Coast:(Overload & ICE off) -> Accelerate", first });
} }
......
...@@ -20,6 +20,7 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl ...@@ -20,6 +20,7 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl
protected IElectricSystem ElectricPower; protected IElectricSystem ElectricPower;
protected IElectricMotorControl Control; protected IElectricMotorControl Control;
protected ElectricMotorData ModelData; protected ElectricMotorData ModelData;
private PerSecond _maxSpeed;
public ElectricMotor(IVehicleContainer container, ElectricMotorData data, IElectricMotorControl control, PowertrainPosition position) : base(container) public ElectricMotor(IVehicleContainer container, ElectricMotorData data, IElectricMotorControl control, PowertrainPosition position) : base(container)
{ {
...@@ -30,6 +31,15 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl ...@@ -30,6 +31,15 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl
} }
public PowertrainPosition Position { get; } public PowertrainPosition Position { get; }
public PerSecond MaxSpeed
{
get { return _maxSpeed ?? (_maxSpeed = ModelData.FullLoadCurve.FullLoadEntries.MaxBy(x => x.MotorSpeed).MotorSpeed); }
}
public Watt DragPower(PerSecond electricMotorSpeed)
{
return ModelData.DragCurve.Lookup(electricMotorSpeed) * electricMotorSpeed;
}
public IResponse Initialize(NewtonMeter outTorque, PerSecond outAngularVelocity) public IResponse Initialize(NewtonMeter outTorque, PerSecond outAngularVelocity)
{ {
......
...@@ -32,6 +32,7 @@ ...@@ -32,6 +32,7 @@
using System; using System;
using System.Linq; using System.Linq;
using TUGraz.VectoCommon.Exceptions; using TUGraz.VectoCommon.Exceptions;
using TUGraz.VectoCommon.InputData;
using TUGraz.VectoCommon.Models; using TUGraz.VectoCommon.Models;
using TUGraz.VectoCommon.Utils; using TUGraz.VectoCommon.Utils;
using TUGraz.VectoCore.Configuration; using TUGraz.VectoCore.Configuration;
...@@ -62,12 +63,41 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl ...@@ -62,12 +63,41 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl
AirdragData.CrossWindCorrectionCurve.SetDataBus(container); AirdragData.CrossWindCorrectionCurve.SetDataBus(container);
} }
var model = container.RunData; var model = container.RunData;
if (container.PowertrainInfo.HasCombustionEngine) {
if (model?.GearboxData == null || model.AxleGearData == null) { if (model?.GearboxData == null || model.AxleGearData == null) {
return; return;
} }
MaxVehicleSpeed = model.EngineData.FullLoadCurves[0].N95hSpeed / MaxVehicleSpeed = model.EngineData.FullLoadCurves[0].N95hSpeed /
model.GearboxData.Gears[model.GearboxData.Gears.Keys.Max()].Ratio / model.AxleGearData.AxleGear.Ratio / model.GearboxData.Gears[model.GearboxData.Gears.Keys.Max()].Ratio /
(model.AngledriveData?.Angledrive.Ratio ?? 1.0) * model.VehicleData.DynamicTyreRadius * 0.995; model.AxleGearData.AxleGear.Ratio /
(model.AngledriveData?.Angledrive.Ratio
?? 1.0) * model.VehicleData.DynamicTyreRadius * 0.995;
}
if (model.ElectricMachinesData != null && model.ElectricMachinesData.Count > 0) {
var positions = model.ElectricMachinesData.Select(x => x.Item1).ToArray();
if (positions.Length > 1) {
throw new VectoException("Multiple electrical machines are currently not supported");
}
var pos = positions.First();
if (pos.IsBatteryElectric()) {
var maxEMSpeed = model.ElectricMachinesData.Find(x => x.Item1 == pos).Item2.FullLoadCurve
.FullLoadEntries.Max(x => x.MotorSpeed); // DataBus.ElectricMotorInfo(pos).MaxSpeed;
var ratio = 1.0;
if (pos == PowertrainPosition.BatteryElectricB3) {
ratio = model.AxleGearData.AxleGear.Ratio;
}
if (pos == PowertrainPosition.BatteryElectricB2) {
ratio = model.GearboxData.Gears[model.GearboxData.Gears.Keys.Max()].Ratio *
model.AxleGearData.AxleGear.Ratio *
(model.AngledriveData?.Angledrive.Ratio ?? 1.0);
}
MaxVehicleSpeed = maxEMSpeed / ratio * model.VehicleData.DynamicTyreRadius * 0.995;
}
}
} }
......
...@@ -61,7 +61,7 @@ namespace TUGraz.VectoCore.Tests.FileIO ...@@ -61,7 +61,7 @@ namespace TUGraz.VectoCore.Tests.FileIO
Assert.AreEqual("401.07", fld.Rows[0][ElectricFullLoadCurveReader.Fields.DrivingTorque]); Assert.AreEqual("401.07", fld.Rows[0][ElectricFullLoadCurveReader.Fields.DrivingTorque]);
Assert.AreEqual("-401.07", fld.Rows[0][ElectricFullLoadCurveReader.Fields.GenerationTorque]); Assert.AreEqual("-401.07", fld.Rows[0][ElectricFullLoadCurveReader.Fields.GenerationTorque]);
var fldMap = ElectricFullLoadCurveReader.Create(fld); var fldMap = ElectricFullLoadCurveReader.Create(fld, 1, 1, 1);
Assert.AreEqual(-401.07, fldMap.FullLoadDriveTorque(0.RPMtoRad()).Value()); Assert.AreEqual(-401.07, fldMap.FullLoadDriveTorque(0.RPMtoRad()).Value());
Assert.AreEqual(401.07, fldMap.FullGenerationTorque(0.RPMtoRad()).Value()); Assert.AreEqual(401.07, fldMap.FullGenerationTorque(0.RPMtoRad()).Value());
...@@ -70,10 +70,44 @@ namespace TUGraz.VectoCore.Tests.FileIO ...@@ -70,10 +70,44 @@ namespace TUGraz.VectoCore.Tests.FileIO
Assert.AreEqual("-800", pwr.Rows[0][ElectricMotorMapReader.Fields.Torque]); Assert.AreEqual("-800", pwr.Rows[0][ElectricMotorMapReader.Fields.Torque]);
Assert.AreEqual("9.8449", pwr.Rows[0][ElectricMotorMapReader.Fields.PowerElectrical]); Assert.AreEqual("9.8449", pwr.Rows[0][ElectricMotorMapReader.Fields.PowerElectrical]);
var pwrMap = ElectricMotorMapReader.Create(pwr); var pwrMap = ElectricMotorMapReader.Create(pwr, 1, 1, 1);
Assert.AreEqual(-10171.0, pwrMap.LookupElectricPower(-0.RPMtoRad(), -800.SI<NewtonMeter>()).ElectricalPower.Value()); Assert.AreEqual(-10171.0, pwrMap.LookupElectricPower(-0.RPMtoRad(), -800.SI<NewtonMeter>()).ElectricalPower.Value());
Assert.AreEqual(-20430.186, pwrMap.LookupElectricPower(120.RPMtoRad(), -800.SI<NewtonMeter>()).ElectricalPower.Value(), 1e-3);
} }
[TestCase()]
public void TestReadElectricMotorAggregation()
{
var inputProvider =
JSONInputDataFactory.ReadElectricMotorData(@"TestData\Hybrids\ElectricMotor\GenericEMotor.vem", false);
Assert.AreEqual(0.15, inputProvider.Inertia.Value(), 1e-6);
var fld = inputProvider.FullLoadCurve;
Assert.AreEqual("0", fld.Rows[0][ElectricFullLoadCurveReader.Fields.MotorSpeed]);
Assert.AreEqual("401.07", fld.Rows[0][ElectricFullLoadCurveReader.Fields.DrivingTorque]);
Assert.AreEqual("-401.07", fld.Rows[0][ElectricFullLoadCurveReader.Fields.GenerationTorque]);
var fldMap = ElectricFullLoadCurveReader.Create(fld, 22.6, 2, 0.97);
Assert.AreEqual(-17584.51308 , fldMap.FullLoadDriveTorque(0.RPMtoRad()).Value(), 1e-3);
Assert.AreEqual(18689.03505, fldMap.FullGenerationTorque(0.RPMtoRad()).Value(), 1e-3);
Assert.AreEqual(-17584.51308, fldMap.FullLoadDriveTorque(50.RPMtoRad()).Value(), 1e-3);
Assert.AreEqual(18689.03505, fldMap.FullGenerationTorque(50.RPMtoRad()).Value(), 1e-3);
var pwr = inputProvider.EfficiencyMap;
Assert.AreEqual("0", pwr.Rows[0][ElectricMotorMapReader.Fields.MotorSpeed]);
Assert.AreEqual("-800", pwr.Rows[0][ElectricMotorMapReader.Fields.Torque]);
Assert.AreEqual("9.8449", pwr.Rows[0][ElectricMotorMapReader.Fields.PowerElectrical]);
var pwrMap = ElectricMotorMapReader.Create(pwr, 22.6, 2, 0.97);
Assert.AreEqual(-146.469, pwrMap.LookupElectricPower(-0.RPMtoRad(), -800.SI<NewtonMeter>()).ElectricalPower.Value(), 1e-3);
Assert.AreEqual(-20773.997, pwrMap.LookupElectricPower(120.RPMtoRad(), -800.SI<NewtonMeter>()).ElectricalPower.Value(), 1e-3);
}
[TestCase()] [TestCase()]
public void TestReadHybridVehicle() public void TestReadHybridVehicle()
......
...@@ -88,7 +88,7 @@ namespace TUGraz.VectoCore.Tests.Integration.Hybrid ...@@ -88,7 +88,7 @@ namespace TUGraz.VectoCore.Tests.Integration.Hybrid
var modFilename = string.Format("SimpleParallelHybrid-P2_acc_{0}-{1}_{2}.vmod", vmax, initialSoC, slope); var modFilename = string.Format("SimpleParallelHybrid-P2_acc_{0}-{1}_{2}.vmod", vmax, initialSoC, slope);
const PowertrainPosition pos = PowertrainPosition.HybridP2; const PowertrainPosition pos = PowertrainPosition.HybridP2;
var run = CreateEngineeringRun( var run = CreateEngineeringRun(
cycle, modFilename, initialSoC, pos, largeMotor: true); cycle, modFilename, initialSoC, pos, 1.0, largeMotor: true);
var hybridController = (HybridController)((VehicleContainer)run.GetContainer()).HybridController; var hybridController = (HybridController)((VehicleContainer)run.GetContainer()).HybridController;
Assert.NotNull(hybridController); Assert.NotNull(hybridController);
...@@ -136,7 +136,7 @@ namespace TUGraz.VectoCore.Tests.Integration.Hybrid ...@@ -136,7 +136,7 @@ namespace TUGraz.VectoCore.Tests.Integration.Hybrid
var modFilename = string.Format("SimpleParallelHybrid-P2_constant_{0}-{1}_{2}_{3}.vmod", vmax, initialSoC, slope, pAuxEl); var modFilename = string.Format("SimpleParallelHybrid-P2_constant_{0}-{1}_{2}_{3}.vmod", vmax, initialSoC, slope, pAuxEl);
const PowertrainPosition pos = PowertrainPosition.HybridP2; const PowertrainPosition pos = PowertrainPosition.HybridP2;
var run = CreateEngineeringRun( var run = CreateEngineeringRun(
cycle, modFilename, initialSoC, pos, largeMotor: true, pAuxEl: pAuxEl); cycle, modFilename, initialSoC, pos, 1.0, largeMotor: true, pAuxEl: pAuxEl);
var hybridController = (HybridController)((VehicleContainer)run.GetContainer()).HybridController; var hybridController = (HybridController)((VehicleContainer)run.GetContainer()).HybridController;
Assert.NotNull(hybridController); Assert.NotNull(hybridController);
...@@ -180,7 +180,7 @@ namespace TUGraz.VectoCore.Tests.Integration.Hybrid ...@@ -180,7 +180,7 @@ namespace TUGraz.VectoCore.Tests.Integration.Hybrid
var modFilename = string.Format("SimpleParallelHybrid-P2_cycle_{0}-{1}_{2}_{3}.vmod", declarationMission, initialSoC, payload, pAuxEl); var modFilename = string.Format("SimpleParallelHybrid-P2_cycle_{0}-{1}_{2}_{3}.vmod", declarationMission, initialSoC, payload, pAuxEl);
const PowertrainPosition pos = PowertrainPosition.HybridP2; const PowertrainPosition pos = PowertrainPosition.HybridP2;
var run = CreateEngineeringRun( var run = CreateEngineeringRun(
cycle, modFilename, initialSoC, pos, largeMotor: true, pAuxEl: pAuxEl, payload: payload.SI<Kilogram>()); cycle, modFilename, initialSoC, pos, 1.0, largeMotor: true, pAuxEl: pAuxEl, payload: payload.SI<Kilogram>());
var hybridController = (HybridController)((VehicleContainer)run.GetContainer()).HybridController; var hybridController = (HybridController)((VehicleContainer)run.GetContainer()).HybridController;
Assert.NotNull(hybridController); Assert.NotNull(hybridController);
...@@ -248,7 +248,7 @@ namespace TUGraz.VectoCore.Tests.Integration.Hybrid ...@@ -248,7 +248,7 @@ namespace TUGraz.VectoCore.Tests.Integration.Hybrid
var modFilename = string.Format("SimpleParallelHybrid-P2_stop_{0}-{1}_{2}.vmod", vmax, initialSoC, slope); var modFilename = string.Format("SimpleParallelHybrid-P2_stop_{0}-{1}_{2}.vmod", vmax, initialSoC, slope);
const PowertrainPosition pos = PowertrainPosition.HybridP2; const PowertrainPosition pos = PowertrainPosition.HybridP2;
var run = CreateEngineeringRun( var run = CreateEngineeringRun(
cycle, modFilename, initialSoC, pos, largeMotor: true); cycle, modFilename, initialSoC, pos, 1.0, largeMotor: true);
var hybridController = (HybridController)((VehicleContainer)run.GetContainer()).HybridController; var hybridController = (HybridController)((VehicleContainer)run.GetContainer()).HybridController;
Assert.NotNull(hybridController); Assert.NotNull(hybridController);
...@@ -301,7 +301,7 @@ namespace TUGraz.VectoCore.Tests.Integration.Hybrid ...@@ -301,7 +301,7 @@ namespace TUGraz.VectoCore.Tests.Integration.Hybrid
var modFilename = string.Format("SimpleParallelHybrid-P3_constant_{0}-{1}_{2}_{3}.vmod", vmax, initialSoC, slope, pAuxEl); var modFilename = string.Format("SimpleParallelHybrid-P3_constant_{0}-{1}_{2}_{3}.vmod", vmax, initialSoC, slope, pAuxEl);
const PowertrainPosition pos = PowertrainPosition.HybridP3; const PowertrainPosition pos = PowertrainPosition.HybridP3;
var run = CreateEngineeringRun( var run = CreateEngineeringRun(
cycle, modFilename, initialSoC, pos, largeMotor: true, pAuxEl: pAuxEl); cycle, modFilename, initialSoC, pos, 1.0, largeMotor: true, pAuxEl: pAuxEl);
var hybridController = (HybridController)((VehicleContainer)run.GetContainer()).HybridController; var hybridController = (HybridController)((VehicleContainer)run.GetContainer()).HybridController;
Assert.NotNull(hybridController); Assert.NotNull(hybridController);
...@@ -339,7 +339,7 @@ namespace TUGraz.VectoCore.Tests.Integration.Hybrid ...@@ -339,7 +339,7 @@ namespace TUGraz.VectoCore.Tests.Integration.Hybrid
var modFilename = string.Format("SimpleParallelHybrid-P3_acc_{0}-{1}_{2}.vmod", vmax, initialSoC, slope); var modFilename = string.Format("SimpleParallelHybrid-P3_acc_{0}-{1}_{2}.vmod", vmax, initialSoC, slope);
const PowertrainPosition pos = PowertrainPosition.HybridP3; const PowertrainPosition pos = PowertrainPosition.HybridP3;
var run = CreateEngineeringRun( var run = CreateEngineeringRun(
cycle, modFilename, initialSoC, pos, largeMotor: true); cycle, modFilename, initialSoC, pos, 1.0, largeMotor: true);
var hybridController = (HybridController)((VehicleContainer)run.GetContainer()).HybridController; var hybridController = (HybridController)((VehicleContainer)run.GetContainer()).HybridController;
Assert.NotNull(hybridController); Assert.NotNull(hybridController);
...@@ -372,7 +372,7 @@ namespace TUGraz.VectoCore.Tests.Integration.Hybrid ...@@ -372,7 +372,7 @@ namespace TUGraz.VectoCore.Tests.Integration.Hybrid
var modFilename = string.Format("SimpleParallelHybrid-P3_stop_{0}-{1}_{2}.vmod", vmax, initialSoC, slope); var modFilename = string.Format("SimpleParallelHybrid-P3_stop_{0}-{1}_{2}.vmod", vmax, initialSoC, slope);
const PowertrainPosition pos = PowertrainPosition.HybridP3; const PowertrainPosition pos = PowertrainPosition.HybridP3;
var run = CreateEngineeringRun( var run = CreateEngineeringRun(
cycle, modFilename, initialSoC, pos, largeMotor: true); cycle, modFilename, initialSoC, pos, 1.0, largeMotor: true);
var hybridController = (HybridController)((VehicleContainer)run.GetContainer()).HybridController; var hybridController = (HybridController)((VehicleContainer)run.GetContainer()).HybridController;
Assert.NotNull(hybridController); Assert.NotNull(hybridController);
...@@ -414,7 +414,7 @@ namespace TUGraz.VectoCore.Tests.Integration.Hybrid ...@@ -414,7 +414,7 @@ namespace TUGraz.VectoCore.Tests.Integration.Hybrid
var modFilename = string.Format("SimpleParallelHybrid-P3_cycle_{0}-{1}_{2}_{3}.vmod", declarationMission, initialSoC, payload, pAuxEl); var modFilename = string.Format("SimpleParallelHybrid-P3_cycle_{0}-{1}_{2}_{3}.vmod", declarationMission, initialSoC, payload, pAuxEl);
const PowertrainPosition pos = PowertrainPosition.HybridP3; const PowertrainPosition pos = PowertrainPosition.HybridP3;
var run = CreateEngineeringRun( var run = CreateEngineeringRun(
cycle, modFilename, initialSoC, pos, largeMotor: true, pAuxEl: pAuxEl, payload: payload.SI<Kilogram>()); cycle, modFilename, initialSoC, pos, 1.0, largeMotor: true, pAuxEl: pAuxEl, payload: payload.SI<Kilogram>());
var hybridController = (HybridController)((VehicleContainer)run.GetContainer()).HybridController; var hybridController = (HybridController)((VehicleContainer)run.GetContainer()).HybridController;
Assert.NotNull(hybridController); Assert.NotNull(hybridController);
...@@ -469,7 +469,7 @@ namespace TUGraz.VectoCore.Tests.Integration.Hybrid ...@@ -469,7 +469,7 @@ namespace TUGraz.VectoCore.Tests.Integration.Hybrid
var modFilename = string.Format("SimpleParallelHybrid-P4_constant_{0}-{1}_{2}_{3}.vmod", vmax, initialSoC, slope, pAuxEl); var modFilename = string.Format("SimpleParallelHybrid-P4_constant_{0}-{1}_{2}_{3}.vmod", vmax, initialSoC, slope, pAuxEl);
const PowertrainPosition pos = PowertrainPosition.HybridP4; const PowertrainPosition pos = PowertrainPosition.HybridP4;
var run = CreateEngineeringRun( var run = CreateEngineeringRun(
cycle, modFilename, initialSoC, pos, largeMotor: true, pAuxEl: pAuxEl); cycle, modFilename, initialSoC, pos, 1.0, largeMotor: true, pAuxEl: pAuxEl);
var hybridController = (HybridController)((VehicleContainer)run.GetContainer()).HybridController; var hybridController = (HybridController)((VehicleContainer)run.GetContainer()).HybridController;
Assert.NotNull(hybridController); Assert.NotNull(hybridController);
...@@ -507,7 +507,7 @@ namespace TUGraz.VectoCore.Tests.Integration.Hybrid ...@@ -507,7 +507,7 @@ namespace TUGraz.VectoCore.Tests.Integration.Hybrid
var modFilename = string.Format("SimpleParallelHybrid-P4_acc_{0}-{1}_{2}.vmod", vmax, initialSoC, slope); var modFilename = string.Format("SimpleParallelHybrid-P4_acc_{0}-{1}_{2}.vmod", vmax, initialSoC, slope);
const PowertrainPosition pos = PowertrainPosition.HybridP4; const PowertrainPosition pos = PowertrainPosition.HybridP4;
var run = CreateEngineeringRun( var run = CreateEngineeringRun(
cycle, modFilename, initialSoC, pos, largeMotor: true); cycle, modFilename, initialSoC, pos, 1.0, largeMotor: true);
var hybridController = (HybridController)((VehicleContainer)run.GetContainer()).HybridController; var hybridController = (HybridController)((VehicleContainer)run.GetContainer()).HybridController;
Assert.NotNull(hybridController); Assert.NotNull(hybridController);
...@@ -540,7 +540,7 @@ namespace TUGraz.VectoCore.Tests.Integration.Hybrid ...@@ -540,7 +540,7 @@ namespace TUGraz.VectoCore.Tests.Integration.Hybrid
var modFilename = string.Format("SimpleParallelHybrid-P4_stop_{0}-{1}_{2}.vmod", vmax, initialSoC, slope); var modFilename = string.Format("SimpleParallelHybrid-P4_stop_{0}-{1}_{2}.vmod", vmax, initialSoC, slope);
const PowertrainPosition pos = PowertrainPosition.HybridP4; const PowertrainPosition pos = PowertrainPosition.HybridP4;
var run = CreateEngineeringRun( var run = CreateEngineeringRun(
cycle, modFilename, initialSoC, pos, largeMotor: true); cycle, modFilename, initialSoC, pos, 1.0, largeMotor: true);
var hybridController = (HybridController)((VehicleContainer)run.GetContainer()).HybridController; var hybridController = (HybridController)((VehicleContainer)run.GetContainer()).HybridController;
Assert.NotNull(hybridController); Assert.NotNull(hybridController);
...@@ -558,11 +558,11 @@ namespace TUGraz.VectoCore.Tests.Integration.Hybrid ...@@ -558,11 +558,11 @@ namespace TUGraz.VectoCore.Tests.Integration.Hybrid
// ================================================= // =================================================
public static VectoRun CreateEngineeringRun(DrivingCycleData cycleData, string modFileName, double initialSoc, PowertrainPosition pos, bool largeMotor = false, public static VectoRun CreateEngineeringRun(DrivingCycleData cycleData, string modFileName, double initialSoc, PowertrainPosition pos, double ratio, bool largeMotor = false,
SummaryDataContainer sumData = null, double pAuxEl = 0, Kilogram payload = null) SummaryDataContainer sumData = null, double pAuxEl = 0, Kilogram payload = null)
{ {
var container = CreateParallelHybridPowerTrain( var container = CreateParallelHybridPowerTrain(
cycleData, Path.GetFileNameWithoutExtension(modFileName), initialSoc, largeMotor, sumData, pAuxEl, pos, payload); cycleData, Path.GetFileNameWithoutExtension(modFileName), initialSoc, largeMotor, sumData, pAuxEl, pos, ratio, payload);
return new DistanceRun(container); return new DistanceRun(container);
} }
...@@ -575,7 +575,7 @@ namespace TUGraz.VectoCore.Tests.Integration.Hybrid ...@@ -575,7 +575,7 @@ namespace TUGraz.VectoCore.Tests.Integration.Hybrid
} }
public static VehicleContainer CreateParallelHybridPowerTrain(DrivingCycleData cycleData, string modFileName, public static VehicleContainer CreateParallelHybridPowerTrain(DrivingCycleData cycleData, string modFileName,
double initialBatCharge, bool largeMotor, SummaryDataContainer sumData, double pAuxEl, PowertrainPosition pos, Kilogram payload = null) double initialBatCharge, bool largeMotor, SummaryDataContainer sumData, double pAuxEl, PowertrainPosition pos, double ratio, Kilogram payload = null)
{ {
var fileWriter = new FileOutputWriter(modFileName); var fileWriter = new FileOutputWriter(modFileName);
var modDataFilter = new IModalDataFilter[] { }; //new IModalDataFilter[] { new ActualModalDataFilter(), }; var modDataFilter = new IModalDataFilter[] { }; //new IModalDataFilter[] { new ActualModalDataFilter(), };
...@@ -593,7 +593,7 @@ namespace TUGraz.VectoCore.Tests.Integration.Hybrid ...@@ -593,7 +593,7 @@ namespace TUGraz.VectoCore.Tests.Integration.Hybrid
var driverData = CreateDriverData(AccelerationFile, true); var driverData = CreateDriverData(AccelerationFile, true);
var electricMotorData = var electricMotorData =
MockSimulationDataFactory.CreateElectricMotorData(largeMotor ? MotorFile240kW : MotorFile, pos); MockSimulationDataFactory.CreateElectricMotorData(largeMotor ? MotorFile240kW : MotorFile, 1, pos, ratio, 1);
var batteryData = MockSimulationDataFactory.CreateBatteryData(BatFile, initialBatCharge); var batteryData = MockSimulationDataFactory.CreateBatteryData(BatFile, initialBatCharge);
//batteryData.TargetSoC = 0.5; //batteryData.TargetSoC = 0.5;
......
...@@ -26,10 +26,10 @@ namespace TUGraz.VectoCore.Tests.Models.SimulationComponentData { ...@@ -26,10 +26,10 @@ namespace TUGraz.VectoCore.Tests.Models.SimulationComponentData {
JSONInputDataFactory.ReadElectricMotorData(@"TestData\Hybrids\ElectricMotor\GenericEMotor.vem", false); JSONInputDataFactory.ReadElectricMotorData(@"TestData\Hybrids\ElectricMotor\GenericEMotor.vem", false);
var fld = inputProvider.FullLoadCurve; var fld = inputProvider.FullLoadCurve;
var fldMap = ElectricFullLoadCurveReader.Create(fld); var fldMap = ElectricFullLoadCurveReader.Create(fld, 1.0, 1, 1.0);
var pwr = inputProvider.EfficiencyMap; var pwr = inputProvider.EfficiencyMap;
var pwrMap = ElectricMotorMapReader.Create(pwr); var pwrMap = ElectricMotorMapReader.Create(pwr, 1.0, 1, 1.0);
var maxEmPwr = batPwr < 0 var maxEmPwr = batPwr < 0
? fldMap.FullLoadDriveTorque(emSpeed.RPMtoRad()) ? fldMap.FullLoadDriveTorque(emSpeed.RPMtoRad())
...@@ -51,10 +51,10 @@ namespace TUGraz.VectoCore.Tests.Models.SimulationComponentData { ...@@ -51,10 +51,10 @@ namespace TUGraz.VectoCore.Tests.Models.SimulationComponentData {
JSONInputDataFactory.ReadElectricMotorData(@"TestData\Hybrids\ElectricMotor\GenericEMotor.vem", false); JSONInputDataFactory.ReadElectricMotorData(@"TestData\Hybrids\ElectricMotor\GenericEMotor.vem", false);
var fld = inputProvider.FullLoadCurve; var fld = inputProvider.FullLoadCurve;
var fldMap = ElectricFullLoadCurveReader.Create(fld); var fldMap = ElectricFullLoadCurveReader.Create(fld, 1.0, 1, 1.0);
var pwr = inputProvider.EfficiencyMap; var pwr = inputProvider.EfficiencyMap;
var pwrMap = ElectricMotorMapReader.Create(pwr); var pwrMap = ElectricMotorMapReader.Create(pwr, 1.0, 1, 1.0);
var maxEmPwr = batPwr < 0 var maxEmPwr = batPwr < 0
? fldMap.FullLoadDriveTorque(emSpeed.RPMtoRad()) ? fldMap.FullLoadDriveTorque(emSpeed.RPMtoRad())
......
{
"Header": {
"CreatedBy": " ()",
"Date": "2016-10-13T08:54:28.7387223Z",
"AppVersion": "3",
"FileVersion": 1
},
"Body": {
"SavedInDeclMode": false,
"Model": "Generic Battery",
"InternalResistance": 0.04,
"SOC_min": 10,
"SOC_max": 90,
"MaxCurrentFactor": 5,
"Capacity": 324,
"SOC": [
[ 0, 673.5 ],
[ 10, 700.2 ],
[ 20, 715.4 ],
[ 30, 723.6 ],
[ 40, 727.7 ],
[ 50, 730.0 ],
[ 60, 731.6 ],
[ 70, 733.8 ],
[ 80, 737.1 ],
[ 90, 742.2 ],
[ 100, 750.2 ]
]
}
}
\ No newline at end of file
n [rpm] , T_drag [Nm]
0 , 6.06
7363.77 , 30.31
\ No newline at end of file
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment