Code development platform for open source projects from the European Union institutions :large_blue_circle: EU Login authentication by SMS will be completely phased out by mid-2025. To see alternatives please check here

Skip to content
Snippets Groups Projects
Commit b432ad50 authored by Harald Martini's avatar Harald Martini
Browse files

added voltage level check in electric machine data adapter

parent 13a0c967
No related branches found
No related tags found
No related merge requests found
Showing
with 739 additions and 67 deletions
......@@ -774,10 +774,14 @@ namespace TUGraz.VectoCommon.InputData
NewtonMeter OverloadTorque { get; }
PerSecond OverloadTestSpeed { get; } //TestSpeedOverloadTorque
Second OverloadTime { get; } //OverloadDuration
TableData FullLoadCurve { get; } //MaxTorqueCurve
/// <summary>
/// OverloadDuration
/// </summary>
Second OverloadTime { get; }
/// <summary>
/// MaxTorqueCurve
/// </summary>
TableData FullLoadCurve { get; }
IList<IElectricMotorPowerMap> PowerMap { get; }
}
......
......@@ -9,6 +9,7 @@ using TUGraz.VectoCore.Models.Declaration;
using TUGraz.VectoCore.Models.SimulationComponent.Data;
using TUGraz.VectoCore.Models.SimulationComponent.Data.ElectricMotor;
using TUGraz.VectoCore.Models.SimulationComponent.Impl;
using TUGraz.VectoCore.OutputData.XML.DeclarationReports.VehicleInformationFile.VehicleInformationFile_0_1.Components;
namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter.SimulationComponents
{
......@@ -18,7 +19,6 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter.SimulationComponen
IElectricMachinesDeclarationInputData electricMachines,
IDictionary<PowertrainPosition, IList<Tuple<Volt, TableData>>> torqueLimits, Volt averageVoltage, GearList gearlist = null)
{
var result = new List<Tuple<PowertrainPosition, ElectricMotorData>>();
if (electricMachines == null) {
return null;
}
......@@ -26,13 +26,31 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter.SimulationComponen
{
throw new VectoException("multiple electric propulsion motors are not supported at the moment");
}
CheckTorqueLimits(electricMachines, torqueLimits);
return electricMachines.Entries
.Select(x => Tuple.Create(x.Position,
CreateElectricMachine(x.Position, x.ElectricMachine, x.Count, x.RatioADC, x.RatioPerGear, x.MechanicalTransmissionEfficiency,
x.MechanicalTransmissionLossMap, torqueLimits?.First(t => t.Key == x.Position).Value, averageVoltage, gearlist))).ToList();
.Select(m => Tuple.Create(m.Position,
CreateElectricMachine(m.Position, m.ElectricMachine, m.Count, m.RatioADC, m.RatioPerGear, m.MechanicalTransmissionEfficiency,
m.MechanicalTransmissionLossMap, torqueLimits?.First(t => t.Key == m.Position).Value, averageVoltage, gearlist))).ToList();
return result;
}
private void CheckTorqueLimits(IElectricMachinesDeclarationInputData electricMachines, IDictionary<PowertrainPosition, IList<Tuple<Volt, TableData>>> torqueLimits)
{
foreach (var torqueLimit in torqueLimits.OrderBy(x => x.Key)) {
//E-machines at position
foreach(var eMachine in electricMachines.Entries.Where(e => e.Position == torqueLimit.Key).Select(e => e.ElectricMachine))
{
foreach (var torqueLimitVoltageLevel in torqueLimit.Value.Select(tl => tl.Item1)) {
if (eMachine.VoltageLevels.All(vl => vl.VoltageLevel != torqueLimitVoltageLevel)) {
throw new VectoException(
$"Voltage level {torqueLimitVoltageLevel} not found in {eMachine.ElectricMachineType} at position {torqueLimit.Key}");
}
}
}
}
}
private ElectricMotorData CreateElectricMachine(PowertrainPosition powertrainPosition,
......
......@@ -80,7 +80,9 @@ namespace TUGraz.VectoCore.InputData.Reader.Impl {
protected abstract void Initialize();
protected abstract VectoRunData CreateVectoRunData(IVehicleDeclarationInputData vehicle, int modeIdx, Mission mission, KeyValuePair<LoadingType, Tuple<Kilogram, double?>> loading);
protected abstract VectoRunData CreateVectoRunData(IVehicleDeclarationInputData vehicle, int modeIdx,
Mission mission, KeyValuePair<LoadingType, Tuple<Kilogram, double?>> loading,
VectoRunData.OvcHevMode ovcMode = VectoRunData.OvcHevMode.NotApplicable);
protected virtual void InitializeReport()
{
......
......@@ -103,8 +103,7 @@ namespace TUGraz.VectoCore.InputData.Reader.Impl.DeclarationMode.HeavyLorryRunDa
_segment = GetSegment(vehicle);
_driverdata = DataAdapter.CreateDriverData();
_driverdata.AccelerationCurve = AccelerationCurveReader.ReadFromStream(_segment.AccelerationFile);
var tempVehicle = DataAdapter.CreateVehicleData(vehicle, _segment, _segment.Missions.First(),
_segment.Missions.First().Loadings.First(), _allowVocational);
_airdragData = DataAdapter.CreateAirdragData(vehicle.Components.AirdragInputData,
_segment.Missions.First(), _segment);
if (InputDataProvider.JobInputData.Vehicle.AxleConfiguration.AxlegearIncludedInGearbox())
......@@ -116,29 +115,40 @@ namespace TUGraz.VectoCore.InputData.Reader.Impl.DeclarationMode.HeavyLorryRunDa
_axlegearData = DataAdapter.CreateAxleGearData(InputDataProvider.JobInputData.Vehicle.Components.AxleGearInputData);
}
_angledriveData = DataAdapter.CreateAngledriveData(InputDataProvider.JobInputData.Vehicle.Components.AngledriveInputData);
var tmpRunData = new VectoRunData()
{
GearboxData = new GearboxData()
{
SetGearboxData(vehicle);
_retarderData = DataAdapter.CreateRetarderData(vehicle.Components.RetarderInputData);
_ptoTransmissionData = DataAdapter.CreatePTOTransmissionData(vehicle.Components.PTOTransmissionInputData);
_municipalPtoTransmissionData = PTODataAdapterLorry.DefaultPTOData();
}
private void SetGearboxData(IVehicleDeclarationInputData vehicle)
{
if (vehicle.Components.GearboxInputData == null) {
return;
}
var tmpRunData = new VectoRunData() {
GearboxData = new GearboxData() {
Type = vehicle.Components.GearboxInputData.Type,
}
};
var tempVehicle = DataAdapter.CreateVehicleData(vehicle, _segment, _segment.Missions.First(),
_segment.Missions.First().Loadings.First(), _allowVocational);
var tmpStrategy = PowertrainBuilder.GetShiftStrategy(new SimplePowertrainContainer(tmpRunData));
var tmpEngine = DataAdapter.CreateEngineData(
vehicle, vehicle.Components.EngineInputData.EngineModes[0], _segment.Missions.First());
_gearboxData = DataAdapter.CreateGearboxData(
vehicle, new VectoRunData() { EngineData = tmpEngine, AxleGearData = _axlegearData, VehicleData = tempVehicle },
tmpStrategy);
_retarderData = DataAdapter.CreateRetarderData(vehicle.Components.RetarderInputData);
_ptoTransmissionData = DataAdapter.CreatePTOTransmissionData(vehicle.Components.PTOTransmissionInputData);
_municipalPtoTransmissionData = PTODataAdapterLorry.DefaultPTOData();
_gearshiftData = DataAdapter.CreateGearshiftData(
_gearboxData, _axlegearData.AxleGear.Ratio * (_angledriveData?.Angledrive.Ratio ?? 1.0), tmpEngine.IdleSpeed);
_gearboxData, _axlegearData.AxleGear.Ratio * (_angledriveData?.Angledrive.Ratio ?? 1.0),
tmpEngine.IdleSpeed);
}
#region Implementation of IVectoRunDataFactory
public IEnumerable<VectoRunData> NextRun()
......@@ -217,8 +227,10 @@ namespace TUGraz.VectoCore.InputData.Reader.Impl.DeclarationMode.HeavyLorryRunDa
protected override VectoRunData CreateVectoRunData(IVehicleDeclarationInputData vehicle, int modeIdx, Mission mission,
KeyValuePair<LoadingType, Tuple<Kilogram, double?>> loading)
protected override VectoRunData CreateVectoRunData(IVehicleDeclarationInputData vehicle, int modeIdx,
Mission mission,
KeyValuePair<LoadingType, Tuple<Kilogram, double?>> loading,
VectoRunData.OvcHevMode ovcMode = VectoRunData.OvcHevMode.NotApplicable)
{
var engine = InputDataProvider.JobInputData.Vehicle.Components.EngineInputData;
var engineModes = engine.EngineModes;
......@@ -285,8 +297,10 @@ namespace TUGraz.VectoCore.InputData.Reader.Impl.DeclarationMode.HeavyLorryRunDa
{
throw new NotImplementedException();
}
protected override VectoRunData CreateVectoRunData(IVehicleDeclarationInputData vehicle, int modeIdx, Mission mission,
KeyValuePair<LoadingType, Tuple<Kilogram, double?>> loading)
protected override VectoRunData CreateVectoRunData(IVehicleDeclarationInputData vehicle, int modeIdx,
Mission mission,
KeyValuePair<LoadingType, Tuple<Kilogram, double?>> loading,
VectoRunData.OvcHevMode ovcMode = VectoRunData.OvcHevMode.NotApplicable)
{
throw new NotImplementedException();
}
......@@ -330,8 +344,10 @@ namespace TUGraz.VectoCore.InputData.Reader.Impl.DeclarationMode.HeavyLorryRunDa
throw new NotImplementedException();
}
protected override VectoRunData CreateVectoRunData(IVehicleDeclarationInputData vehicle, int modeIdx, Mission mission,
KeyValuePair<LoadingType, Tuple<Kilogram, double?>> loading)
protected override VectoRunData CreateVectoRunData(IVehicleDeclarationInputData vehicle, int modeIdx,
Mission mission,
KeyValuePair<LoadingType, Tuple<Kilogram, double?>> loading,
VectoRunData.OvcHevMode ovcMode = VectoRunData.OvcHevMode.NotApplicable)
{
throw new NotImplementedException();
}
......
......@@ -42,15 +42,22 @@ namespace TUGraz.VectoCore.InputData.Reader.Impl.DeclarationMode.HeavyLorryRunDa
foreach (var loading in mission.Loadings)
{
var simulationRunData = CreateVectoRunData(vehicle, modeIdx, mission, loading);
yield return simulationRunData;
if (vehicle.OvcHev) {
yield return CreateVectoRunData(vehicle, modeIdx, mission, loading, VectoRunData.OvcHevMode.ChargeDepleting);
yield return CreateVectoRunData(vehicle, modeIdx, mission, loading, VectoRunData.OvcHevMode.ChargeSustaining);
} else {
yield return CreateVectoRunData(vehicle, modeIdx, mission, loading);
}
}
}
}
}
protected override VectoRunData CreateVectoRunData(IVehicleDeclarationInputData vehicle, int modeIdx, Mission mission,
KeyValuePair<LoadingType, Tuple<Kilogram, double?>> loading)
protected override VectoRunData CreateVectoRunData(IVehicleDeclarationInputData vehicle, int modeIdx,
Mission mission,
KeyValuePair<LoadingType, Tuple<Kilogram, double?>> loading,
VectoRunData.OvcHevMode ovcMode = VectoRunData.OvcHevMode.NotApplicable)
{
throw new NotImplementedException();
}
......@@ -58,19 +65,17 @@ namespace TUGraz.VectoCore.InputData.Reader.Impl.DeclarationMode.HeavyLorryRunDa
#endregion
}
public class HEV_S2 : Hybrid
public class SerialHybrid : Hybrid
{
public HEV_S2(IDeclarationInputDataProvider dataProvider, IDeclarationReport report,
ILorryDeclarationDataAdapter declarationDataAdapter) : base(dataProvider, report,
declarationDataAdapter)
{
}
public SerialHybrid(IDeclarationInputDataProvider dataProvider, IDeclarationReport report, ILorryDeclarationDataAdapter declarationDataAdapter) : base(dataProvider, report, declarationDataAdapter) { }
#region Overrides of Hybrid
protected override VectoRunData CreateVectoRunData(IVehicleDeclarationInputData vehicle, int modeIdx, Mission mission,
KeyValuePair<LoadingType, Tuple<Kilogram, double?>> loading)
protected override VectoRunData CreateVectoRunData(IVehicleDeclarationInputData vehicle, int modeIdx,
Mission mission,
KeyValuePair<LoadingType, Tuple<Kilogram, double?>> loading,
VectoRunData.OvcHevMode ovcMode = VectoRunData.OvcHevMode.NotApplicable)
{
var engine = InputDataProvider.JobInputData.Vehicle.Components.EngineInputData;
......@@ -79,44 +84,48 @@ namespace TUGraz.VectoCore.InputData.Reader.Impl.DeclarationMode.HeavyLorryRunDa
var runData = CreateCommonRunData(vehicle, modeIdx, mission, loading, engineModes, _segment);
runData.VehicleData = DataAdapter.CreateVehicleData(vehicle, _segment, mission, loading, _allowVocational);
runData.EngineData = DataAdapter.CreateEngineData(vehicle, engineMode, mission);
//TODO HM use updated value for InitialSOC
runData.BatteryData = DataAdapter.CreateBatteryData(vehicle.Components.ElectricStorage);
runData.SuperCapData = DataAdapter.CreateSuperCapData(vehicle.Components.ElectricStorage);
runData.ElectricMachinesData = DataAdapter.CreateElectricMachines(vehicle.Components.ElectricMachines, vehicle.ElectricMotorTorqueLimits, runData.BatteryData.CalculateAverageVoltage());
runData.GearboxData = _gearboxData;
runData.AirdragData = _airdragData;
runData.AngledriveData = _angledriveData;
runData.HybridStrategyParameters =
DataAdapter.CreateHybridStrategy(runData.BatteryData, runData.SuperCapData);
runData.Aux = DataAdapter.CreateAuxiliaryData(vehicle.Components.AuxiliaryInputData,
vehicle.Components.BusAuxiliaries,
mission.MissionType,
_segment.VehicleClass,
vehicle.Length,
vehicle.Components.AxleWheels.NumSteeredAxles);
runData.HybridStrategyParameters = DataAdapter.CreateHybridStrategy(runData.BatteryData, runData.SuperCapData);
runData.Aux = DataAdapter.CreateAuxiliaryData(vehicle.Components.AuxiliaryInputData, vehicle.Components.BusAuxiliaries, mission.MissionType, _segment.VehicleClass, vehicle.Length, vehicle.Components.AxleWheels.NumSteeredAxles);
return runData;
}
#endregion
}
public class ParallelHybrid : Hybrid
{
public ParallelHybrid(IDeclarationInputDataProvider dataProvider, IDeclarationReport report, ILorryDeclarationDataAdapter declarationDataAdapter) : base(dataProvider, report, declarationDataAdapter) { }
}
public class HEV_S2 : SerialHybrid
{
public HEV_S2(IDeclarationInputDataProvider dataProvider, IDeclarationReport report,
ILorryDeclarationDataAdapter declarationDataAdapter) : base(dataProvider, report,
declarationDataAdapter)
{ }
}
public class HEV_S3 : Hybrid
public class HEV_S3 : SerialHybrid
{
public HEV_S3(IDeclarationInputDataProvider dataProvider, IDeclarationReport report,
ILorryDeclarationDataAdapter declarationDataAdapter) : base(dataProvider, report, declarationDataAdapter) { }
}
public class HEV_S4 : Hybrid
public class HEV_S4 : SerialHybrid
{
public HEV_S4(IDeclarationInputDataProvider dataProvider, IDeclarationReport report,
ILorryDeclarationDataAdapter declarationDataAdapter) : base(dataProvider, report, declarationDataAdapter) { }
}
public class HEV_S_IEPC : Hybrid
public class HEV_S_IEPC : SerialHybrid
{
public HEV_S_IEPC(IDeclarationInputDataProvider dataProvider, IDeclarationReport report,
ILorryDeclarationDataAdapter declarationDataAdapter) : base(dataProvider, report, declarationDataAdapter) { }
......
......@@ -124,8 +124,9 @@ namespace TUGraz.VectoCore.InputData.Reader.Impl.DeclarationMode.PrimaryBusRunDa
CombustionEngineData tmpEngine, VehicleData tempVehicle);
#endregion
protected override VectoRunData CreateVectoRunData(
IVehicleDeclarationInputData vehicle, int modeIdx, Mission mission, KeyValuePair<LoadingType, Tuple<Kilogram, double?>> loading)
protected override VectoRunData CreateVectoRunData(IVehicleDeclarationInputData vehicle, int modeIdx,
Mission mission, KeyValuePair<LoadingType, Tuple<Kilogram, double?>> loading,
VectoRunData.OvcHevMode ovcMode = VectoRunData.OvcHevMode.NotApplicable)
{
if (InputDataProvider.JobInputData.Vehicle.ExemptedVehicle)
{
......
......@@ -54,9 +54,17 @@ using DriverData = TUGraz.VectoCore.Models.SimulationComponent.Data.DriverData;
namespace TUGraz.VectoCore.Models.Simulation.Data
{
[CustomValidation(typeof(VectoRunData), "ValidateRunData")]
public class VectoRunData : SimulationComponentData
{
public enum OvcHevMode
{
NotApplicable,
ChargeSustaining,
ChargeDepleting,
}
public VectoRunData()
{
......
......@@ -35,17 +35,17 @@
<ElectricMachine>
<Position>2</Position>
<VoltageLevel>
<Voltage>100</Voltage>
<Voltage>400</Voltage>
<MaxTorqueCurve>
<v2.3:Entry outShaftSpeed="0.00" maxTorque="200.00" minTorque="-200.00"/>
<v2.3:Entry outShaftSpeed="1000.00" maxTorque="300.00" minTorque="-300.00"/>
<v2.3:Entry outShaftSpeed="4000.00" maxTorque="300.00" minTorque="-300.00"/>
</MaxTorqueCurve>
</VoltageLevel>
<VoltageLevel>
<Voltage>500</Voltage>
<Voltage>600</Voltage>
<MaxTorqueCurve>
<v2.3:Entry outShaftSpeed="0.00" maxTorque="200.00" minTorque="-200.00"/>
<v2.3:Entry outShaftSpeed="1000.00" maxTorque="300.00" minTorque="-300.00"/>
<v2.3:Entry outShaftSpeed="4000.00" maxTorque="300.00" minTorque="-300.00"/>
</MaxTorqueCurve>
</VoltageLevel>
</ElectricMachine>
......@@ -53,17 +53,17 @@
<ElectricMachine>
<Position>GEN</Position>
<VoltageLevel>
<Voltage>100</Voltage>
<Voltage>400</Voltage>
<MaxTorqueCurve>
<v2.3:Entry outShaftSpeed="0.00" maxTorque="200.00" minTorque="-200.00"/>
<v2.3:Entry outShaftSpeed="1000.00" maxTorque="300.00" minTorque="-300.00"/>
<v2.3:Entry outShaftSpeed="4000.00" maxTorque="300.00" minTorque="-300.00"/>
</MaxTorqueCurve>
</VoltageLevel>
<VoltageLevel>
<Voltage>500</Voltage>
<Voltage>600</Voltage>
<MaxTorqueCurve>
<v2.3:Entry outShaftSpeed="0.00" maxTorque="200.00" minTorque="-200.00"/>
<v2.3:Entry outShaftSpeed="1000.00" maxTorque="300.00" minTorque="-300.00"/>
<v2.3:Entry outShaftSpeed="4000.00" maxTorque="300.00" minTorque="-300.00"/>
</MaxTorqueCurve>
</VoltageLevel>
</ElectricMachine>
......
......@@ -42,6 +42,7 @@ namespace TUGraz.VectoCore.Tests.XML
[TestCase(@"HeavyLorry\Conventional_heavyLorry_AMT.xml"),
TestCase(@"HeavyLorry\HEV-S_heavyLorry_AMT_S2.xml"),
TestCase(@"HeavyLorry\HEV-S_heavyLorry_AMT_S2_ovc.xml"),
TestCase(@"HeavyLorry\HEV-S_heavyLorry_IEPC-S.xml"),
TestCase(@"HeavyLorry\HEV-S_heavyLorry_S3.xml"),
TestCase(@"HeavyLorry\HEV-S_heavyLorry_S4.xml"),
......@@ -53,6 +54,7 @@ namespace TUGraz.VectoCore.Tests.XML
TestCase(@"HeavyLorry\PEV_heavyLorry_E4.xml"),
TestCase(@"MediumLorry\Conventional_mediumLorry_AMT.xml"),
TestCase(@"MediumLorry\HEV-S_mediumLorry_AMT_S2.xml"),
TestCase(@"MediumLorry\HEV-S_mediumLorry_AMT_S2_ovc.xml"),
TestCase(@"MediumLorry\HEV-S_mediumLorry_IEPC-S.xml"),
TestCase(@"MediumLorry\HEV-S_mediumLorry_S3.xml"),
TestCase(@"MediumLorry\HEV-S_mediumLorry_S4.xml"),
......@@ -87,6 +89,7 @@ namespace TUGraz.VectoCore.Tests.XML
ReadDeclarationJob(jobFile);
}
[TestCase(@"CompletedBus\Conventional_completedBus_1.xml"),
TestCase(@"CompletedBus\HEV_completedBus_1.xml"),
TestCase(@"CompletedBus\IEPC_completedBus_1.xml"),
......
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