From 6061b46e3a7320c8c604858311fb720b00f946e2 Mon Sep 17 00:00:00 2001 From: "VKMTHD\\haraldmartini" <harald.martini@student.tugraz.at> Date: Wed, 23 Nov 2022 09:53:04 +0100 Subject: [PATCH] updated data adapter --- .../EngineeringDataAdapter.cs | 12 ++-- .../DeclarationDataAdapterHeavyLorry.cs | 64 ++++++++++++++----- .../IDeclarationDataAdapter.cs | 5 +- .../Models/Connector/Ports/Impl/Response.cs | 6 +- .../SimulationComponent/Impl/AxleGear.cs | 5 +- .../Impl/BatteryElectricMotorController.cs | 3 +- .../SimulationComponent/Impl/ElectricMotor.cs | 19 +++--- .../Models/SimulationComponent/Impl/PEVPTO.cs | 53 ++++++++++----- 8 files changed, 112 insertions(+), 55 deletions(-) diff --git a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/EngineeringDataAdapter.cs b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/EngineeringDataAdapter.cs index afd6807124..d18eb2d5f5 100644 --- a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/EngineeringDataAdapter.cs +++ b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/EngineeringDataAdapter.cs @@ -430,21 +430,18 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter } private static void SetEngineeringData( - IGearboxEngineeringInputData gearbox, IGearshiftEngineeringInputData gearshiftData, GearboxData retVal) - { + IGearboxEngineeringInputData gearbox, IGearshiftEngineeringInputData gearshiftData, GearboxData retVal) { retVal.Inertia = gearbox.Type.ManualTransmission() ? gearbox.Inertia : 0.SI<KilogramSquareMeter>(); retVal.TractionInterruption = gearbox.Type == GearboxType.APTN || gearbox.Type == GearboxType.IHPC ? 0.SI<Second>() : gearbox.TractionInterruption; } - public AxleGearData CreateAxleGearData(IAxleGearInputData data) - { + public AxleGearData CreateAxleGearData(IAxleGearInputData data) { var retVal = SetCommonAxleGearData(data); retVal.AxleGear.LossMap = ReadAxleLossMap(data, true); return retVal; } - public AngledriveData CreateAngledriveData(IAngledriveInputData data) - { + public AngledriveData CreateAngledriveData(IAngledriveInputData data) { return DoCreateAngledriveData(data, true); } @@ -469,8 +466,7 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter return auxList; } - internal DriverData CreateDriverData(IDriverEngineeringInputData driver) - { + internal DriverData CreateDriverData(IDriverEngineeringInputData driver) { if (driver.SavedInDeclarationMode) { WarnEngineeringMode("DriverData"); } diff --git a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/HeavyLorry/DeclarationDataAdapterHeavyLorry.cs b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/HeavyLorry/DeclarationDataAdapterHeavyLorry.cs index 7079734f55..07a8260d7c 100644 --- a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/HeavyLorry/DeclarationDataAdapterHeavyLorry.cs +++ b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/HeavyLorry/DeclarationDataAdapterHeavyLorry.cs @@ -91,7 +91,7 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter.HeavyLorry } public abstract void CreateREESSData(IElectricStorageSystemDeclarationInputData componentsElectricStorage, - VectoSimulationJobType jobType, bool ovc, Action<BatterySystemData> action, + VectoSimulationJobType jobType, bool ovc, Action<BatterySystemData> setBatteryData, Action<SuperCapData> setSuperCapData); @@ -105,7 +105,8 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter.HeavyLorry throw new NotImplementedException(); } - public virtual HybridStrategyParameters CreateHybridStrategy(BatterySystemData runDataBatteryData, SuperCapData runDataSuperCapData) + public virtual HybridStrategyParameters CreateHybridStrategy(BatterySystemData runDataBatteryData, + SuperCapData runDataSuperCapData, Kilogram vehicleMass, VectoRunData.OvcHevMode ovcMode) { throw new NotImplementedException(); } @@ -232,7 +233,7 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter.HeavyLorry } public override void CreateREESSData(IElectricStorageSystemDeclarationInputData componentsElectricStorage, - VectoSimulationJobType jobType, bool ovc, Action<BatterySystemData> action, + VectoSimulationJobType jobType, bool ovc, Action<BatterySystemData> setBatteryData, Action<SuperCapData> setSuperCapData) { throw new NotImplementedException(); @@ -244,6 +245,7 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter.HeavyLorry private IEngineDataAdapter _engineDataAdapter = new CombustionEngineComponentDataAdapter(); private ElectricMachinesDataAdapter _electricMachinesDataAdapter = new ElectricMachinesDataAdapter(); private ElectricStorageAdapter _eletricStorageAdapter = new ElectricStorageAdapter(); + protected IAuxiliaryDataAdapter _auxAdapter = new HeavyLorryAuxiliaryDataAdapter(); public override CombustionEngineData CreateEngineData( IVehicleDeclarationInputData vehicle, IEngineModeDeclarationInputData mode, Mission mission) { @@ -271,6 +273,15 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter.HeavyLorry return _eletricStorageAdapter.CreateSuperCapData(reessInputData); } + public override IList<VectoRunData.AuxData> CreateAuxiliaryData(IAuxiliariesDeclarationInputData auxData, + IBusAuxiliariesDeclarationData busAuxData, + MissionType missionType, VehicleClass vehicleClass, Meter vehicleLength, int? numSteeredAxles, + VectoSimulationJobType jobType) + { + return _auxAdapter.CreateAuxiliaryData(auxData, busAuxData, missionType, vehicleClass, vehicleLength, + numSteeredAxles, jobType); + } + //public RetarderData CreateRetarderData #endregion @@ -285,12 +296,14 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter.HeavyLorry private SerialHybridStrategyParameterDataAdapter _hybridStrategyParameterData = new SerialHybridStrategyParameterDataAdapter(); - public override IList<VectoRunData.AuxData> CreateAuxiliaryData(IAuxiliariesDeclarationInputData auxData, - IBusAuxiliariesDeclarationData busAuxData, - MissionType missionType, VehicleClass vehicleClass, Meter vehicleLength, int? numSteeredAxles, - VectoSimulationJobType jobType) + protected ElectricStorageAdapter _electricStorageAdapter = new ElectricStorageAdapter(); + + + public override HybridStrategyParameters CreateHybridStrategy(BatterySystemData runDataBatteryData, + SuperCapData runDataSuperCapData, Kilogram vehicleMass, VectoRunData.OvcHevMode ovcMode) { - throw new NotImplementedException(); + return _hybridStrategyParameterData.CreateHybridStrategyParameters(runDataBatteryData, + runDataSuperCapData, vehicleMass, ovcMode); } #endregion @@ -310,9 +323,20 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter.HeavyLorry return null; } public override void CreateREESSData(IElectricStorageSystemDeclarationInputData componentsElectricStorage, - VectoSimulationJobType jobType, bool ovc, Action<BatterySystemData> action, Action<SuperCapData> setSuperCapData) + VectoSimulationJobType jobType, bool ovc, Action<BatterySystemData> setBatteryData, Action<SuperCapData> setSuperCapData) { - throw new NotImplementedException(); + var batteryData = _electricStorageAdapter.CreateBatteryData(componentsElectricStorage, jobType, ovc); + var superCapData = _electricStorageAdapter.CreateSuperCapData(componentsElectricStorage); + + + + if (superCapData != null && batteryData != null) + { + throw new VectoException("SuperCap AND Battery not supported"); + } + + setBatteryData(batteryData); + setSuperCapData(superCapData); } @@ -326,6 +350,7 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter.HeavyLorry private ParallelHybridStrategyParameterDataAdapter _hybridStrategyDataAdapter = new ParallelHybridStrategyParameterDataAdapter(); + private PTODataAdapterLorry _ptoAdapterLorry = new PTODataAdapterLorry(); protected override GearboxType[] SupportedGearboxTypes => new[] { GearboxType.AMT, GearboxType.ATPowerSplit, GearboxType.ATSerial }; private GearboxDataAdapter _gearboxDataAdapter = new GearboxDataAdapter(null); @@ -346,12 +371,13 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter.HeavyLorry } public override void CreateREESSData(IElectricStorageSystemDeclarationInputData componentsElectricStorage, - VectoSimulationJobType jobType, bool ovc, Action<BatterySystemData> action, Action<SuperCapData> setSuperCapData) + VectoSimulationJobType jobType, bool ovc, Action<BatterySystemData> setBatteryData, Action<SuperCapData> setSuperCapData) { throw new NotImplementedException(); } - public override HybridStrategyParameters CreateHybridStrategy(BatterySystemData runDataBatteryData, SuperCapData runDataSuperCapData) + public override HybridStrategyParameters CreateHybridStrategy(BatterySystemData runDataBatteryData, + SuperCapData runDataSuperCapData, Kilogram vehicleMass, VectoRunData.OvcHevMode ovcMode) { return _hybridStrategyDataAdapter.CreateHybridStrategyParameters(runDataBatteryData, runDataSuperCapData); } @@ -362,13 +388,13 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter.HeavyLorry public override PTOData CreatePTOCycleData(IGearboxDeclarationInputData gbx, IPTOTransmissionInputData pto) { - throw new NotImplementedException(); + return _ptoAdapterLorry.CreateDefaultPTOData(pto, gbx); } public override PTOData CreatePTOTransmissionData(IPTOTransmissionInputData ptoData, IGearboxDeclarationInputData gbx) { - throw new NotImplementedException(); + return _ptoAdapterLorry.CreatePTOTransmissionData(ptoData, gbx); } #endregion @@ -453,7 +479,8 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter.HeavyLorry public override PTOData CreatePTOTransmissionData(IPTOTransmissionInputData ptoData, IGearboxDeclarationInputData gbx) { - return _ptoDataAdapter.CreatePTOTransmissionData(ptoData, gbx); + var result = _ptoDataAdapter.CreatePTOTransmissionData(ptoData, gbx); + return result; } #endregion @@ -474,7 +501,8 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter.HeavyLorry return _gearBoxDataAdaper.CreateGearboxData(inputData, runData, shiftPolygonCalc, SupportedGearboxTypes); } - public override ShiftStrategyParameters CreateGearshiftData(double axleRatio, PerSecond engineIdlingSpeed, GearboxType gearboxType, int gearsCount) + public override ShiftStrategyParameters CreateGearshiftData(double axleRatio, PerSecond engineIdlingSpeed, + GearboxType gearboxType, int gearsCount) { return _gearBoxDataAdaper.CreateGearshiftData(axleRatio, engineIdlingSpeed, gearboxType, gearsCount); } @@ -511,6 +539,8 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter.HeavyLorry { GearboxType.AMT, GearboxType.ATPowerSplit, GearboxType.ATSerial, GearboxType.APTN }; #endregion + + } public class PEV_E3 : BatteryElectric { } public class PEV_E4 : BatteryElectric { } @@ -532,7 +562,7 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter.HeavyLorry } public override void CreateREESSData(IElectricStorageSystemDeclarationInputData componentsElectricStorage, - VectoSimulationJobType jobType, bool ovc, Action<BatterySystemData> action, Action<SuperCapData> setSuperCapData) + VectoSimulationJobType jobType, bool ovc, Action<BatterySystemData> setBatteryData, Action<SuperCapData> setSuperCapData) { throw new NotImplementedException(); } diff --git a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/IDeclarationDataAdapter.cs b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/IDeclarationDataAdapter.cs index dd731be03e..e8ef3e49ab 100644 --- a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/IDeclarationDataAdapter.cs +++ b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/IDeclarationDataAdapter.cs @@ -70,13 +70,14 @@ 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); void CreateREESSData(IElectricStorageSystemDeclarationInputData componentsElectricStorage, - VectoSimulationJobType jobType, bool ovc, Action<BatterySystemData> action, + VectoSimulationJobType jobType, bool ovc, Action<BatterySystemData> setBatteryData, Action<SuperCapData> setSuperCapData); BatterySystemData CreateBatteryData(IElectricStorageSystemDeclarationInputData componentsElectricStorage, VectoSimulationJobType jobType, bool ovc); SuperCapData CreateSuperCapData(IElectricStorageSystemDeclarationInputData componentsElectricStorage); - HybridStrategyParameters CreateHybridStrategy(BatterySystemData runDataBatteryData, SuperCapData runDataSuperCapData); + HybridStrategyParameters CreateHybridStrategy(BatterySystemData runDataBatteryData, + SuperCapData runDataSuperCapData, Kilogram vehicleMass, VectoRunData.OvcHevMode ovcMode); ShiftStrategyParameters CreateDummyGearshiftStrategy(); } diff --git a/VectoCore/VectoCore/Models/Connector/Ports/Impl/Response.cs b/VectoCore/VectoCore/Models/Connector/Ports/Impl/Response.cs index cc8874e06f..5c6b0f4ace 100644 --- a/VectoCore/VectoCore/Models/Connector/Ports/Impl/Response.cs +++ b/VectoCore/VectoCore/Models/Connector/Ports/Impl/Response.cs @@ -140,7 +140,11 @@ namespace TUGraz.VectoCore.Models.Connector.Ports.Impl [DebuggerDisplay("Overload({Delta,nq})")] public class ResponseOverload : AbstractResponse { - public Watt Delta { get; set; } + public Watt Delta + { + get; + set; + } public ResponseOverload(object source) : base(source) { } } diff --git a/VectoCore/VectoCore/Models/SimulationComponent/Impl/AxleGear.cs b/VectoCore/VectoCore/Models/SimulationComponent/Impl/AxleGear.cs index dc0116d06b..d8a66e3599 100644 --- a/VectoCore/VectoCore/Models/SimulationComponent/Impl/AxleGear.cs +++ b/VectoCore/VectoCore/Models/SimulationComponent/Impl/AxleGear.cs @@ -41,7 +41,10 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl { public class AxleGear : TransmissionComponent, IAxlegear, IUpdateable { - public AxleGear(IVehicleContainer container, AxleGearData modelData) : base(container, modelData.AxleGear) { } + public AxleGear(IVehicleContainer container, AxleGearData modelData) : base(container, modelData.AxleGear) + { + + } public override IResponse Initialize(NewtonMeter outTorque, PerSecond outAngularVelocity) { diff --git a/VectoCore/VectoCore/Models/SimulationComponent/Impl/BatteryElectricMotorController.cs b/VectoCore/VectoCore/Models/SimulationComponent/Impl/BatteryElectricMotorController.cs index 4a235dfd6d..f032bc3c80 100644 --- a/VectoCore/VectoCore/Models/SimulationComponent/Impl/BatteryElectricMotorController.cs +++ b/VectoCore/VectoCore/Models/SimulationComponent/Impl/BatteryElectricMotorController.cs @@ -36,7 +36,8 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl { : Formulas.InertiaPower(currOutAngularVelocity, prevOutAngularVelocity, ElectricMotorData.Inertia, dt) / avgSpeed; //var dragTorque = ElectricMotorData.DragCurve.Lookup() - return (-inertiaTorqueLoss); //.LimitTo(maxDriveTorque, maxRecuperationTorque); + //return ((-1)*(inertiaTorqueLoss + outTorque)).LimitTo(maxDriveTorque, maxRecuperationTorque ?? VectoMath.Max(maxDriveTorque, 0.SI<NewtonMeter>())); //.LimitTo(maxDriveTorque, maxRecuperationTorque); + return -inertiaTorqueLoss; } if (DataBus.DriverInfo.DrivingAction == DrivingAction.Coast || DataBus.DriverInfo.DrivingAction == DrivingAction.Roll) { diff --git a/VectoCore/VectoCore/Models/SimulationComponent/Impl/ElectricMotor.cs b/VectoCore/VectoCore/Models/SimulationComponent/Impl/ElectricMotor.cs index ae0251cdb3..220dc2a231 100644 --- a/VectoCore/VectoCore/Models/SimulationComponent/Impl/ElectricMotor.cs +++ b/VectoCore/VectoCore/Models/SimulationComponent/Impl/ElectricMotor.cs @@ -196,7 +196,9 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl var emTorqueDt = Control.MechanicalAssistPower(absTime, dt, outTorque, PreviousState.DrivetrainSpeed, outAngularVelocity, maxDriveTorqueDt, maxRecuperationTorqueDt, Position, dryRun); - var emTorque = emTorqueDt == null ? null : ConvertDrivetrainTorqueToEm(avgDtSpeed, emTorqueDt); + var emTorque = (emTorqueDt == null) + ? null + : ConvertDrivetrainTorqueToEm(avgDtSpeed, emTorqueDt); var emOff = emTorqueDt == null; if (!dryRun && !DataBus.IsTestPowertrain && emTorqueDt != null && NextComponent != null && (emTorque.IsSmaller(maxDriveTorqueEm ?? 0.SI<NewtonMeter>(), 1e-3) || @@ -238,13 +240,14 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl emTorque = 0.SI<NewtonMeter>(); } - if (Position == PowertrainPosition.BatteryElectricE2 && !DataBus.GearboxInfo.GearEngaged(absTime)) { - // electric motor is after the gearbox but no gear engaged - ignore inertia and drag... - emTorqueDt = 0.SI<NewtonMeter>(); - emTorque = 0.SI<NewtonMeter>(); - } + if (Position == PowertrainPosition.BatteryElectricE2 && !DataBus.GearboxInfo.GearEngaged(absTime)) + { + // electric motor is after the gearbox but no gear engaged - ignore inertia and drag... + emTorqueDt = 0.SI<NewtonMeter>(); + emTorque = 0.SI<NewtonMeter>(); + } - if (Position == PowertrainPosition.HybridP1 && !DataBus.EngineCtl.CombustionEngineOn) { + if (Position == PowertrainPosition.HybridP1 && !DataBus.EngineCtl.CombustionEngineOn) { // electric motor is directly connected to the ICE, ICE is off and EM is off - do not apply drag loss emTorqueDt = 0.SI<NewtonMeter>(); emTorque = 0.SI<NewtonMeter>(); @@ -263,7 +266,7 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl // inertia torque 'brakes' - electric motor has to provide this torque in addition (T_inertia > 0 when angular speed increases) // emTorque < 0 when propelling, emTorqueMap needs to be 'more negative' to provide torque for inertia // emTorque > 0 when recuperating, inertia 'brakes' in addition, emTorqueMap is decreased - var emTorqueMap = emTorque - inertiaTorqueEm ; + var emTorqueMap = emTorque - inertiaTorqueEm; if (emOff) { // not used later emTorqueMap = null; diff --git a/VectoCore/VectoCore/Models/SimulationComponent/Impl/PEVPTO.cs b/VectoCore/VectoCore/Models/SimulationComponent/Impl/PEVPTO.cs index 6fcfa4e524..930ba6d813 100644 --- a/VectoCore/VectoCore/Models/SimulationComponent/Impl/PEVPTO.cs +++ b/VectoCore/VectoCore/Models/SimulationComponent/Impl/PEVPTO.cs @@ -11,7 +11,7 @@ using TUGraz.VectoCore.OutputData; namespace TUGraz.VectoCore.Models.SimulationComponent.Impl { - public class PEVPTO : StatefulProviderComponent<PEVPTO.State, ITnOutPort, ITnInPort, ITnOutPort>, + public class PEVPtoTransm : StatefulProviderComponent<PEVPtoTransm.State, ITnOutPort, ITnInPort, ITnOutPort>, IPowerTrainComponent, ITnInPort, ITnOutPort { public class State @@ -23,7 +23,7 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl protected readonly Dictionary<string, Func<PerSecond, Second, Second, bool, NewtonMeter>> Auxiliaries = new Dictionary<string, Func<PerSecond, Second, Second, bool, NewtonMeter>>(); - public PEVPTO(IVehicleContainer container) : base(container) + public PEVPtoTransm(IVehicleContainer container) : base(container) { } @@ -58,21 +58,27 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl : outAngularVelocity; var torqueLoss = 0.SI<NewtonMeter>(); - if (!DataBus.GearboxInfo.GearEngaged(absTime)) { - var powerDemands = new Dictionary<string, NewtonMeter>(Auxiliaries.Count); - foreach (var aux in Auxiliaries) { - powerDemands[aux.Key] = 0.SI<NewtonMeter>(); - } - if (!dryRun) { - CurrentState.PowerDemands = powerDemands; - } - } else { - if (outAngularVelocity != null && !avgAngularSpeed.IsEqual(0)) { - torqueLoss = ComputeTorqueLoss(absTime, dt, avgAngularSpeed, dryRun); - } - } - - if (!dryRun) { + var alwaysConsiderPTOTransmLoss = false; //<---- debugging only //TODO: REMOVE + var gearEngaged = !DataBus.GearboxInfo.GearEngaged(absTime); + ////Always consider PTO_Transm_loss + + if (!DataBus.GearboxInfo.GearEngaged(absTime) && !alwaysConsiderPTOTransmLoss) + { + SetZeroPowerDemand(dryRun); + } + else + { + if (outAngularVelocity != null && !avgAngularSpeed.IsEqual(0)) + { + torqueLoss = ComputeTorqueLoss(absTime, dt, avgAngularSpeed, dryRun); + } + else + { + SetZeroPowerDemand(dryRun); + } + } + + if (!dryRun) { CurrentState.OutAngularVelocity = outAngularVelocity; } @@ -82,6 +88,19 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl #endregion + private void SetZeroPowerDemand(bool dryRun) + { + var powerDemands = new Dictionary<string, NewtonMeter>(Auxiliaries.Count); + foreach (var aux in Auxiliaries) + { + powerDemands[aux.Key] = 0.SI<NewtonMeter>(); + } + if (!dryRun) + { + CurrentState.PowerDemands = powerDemands; + } + } + private NewtonMeter ComputeTorqueLoss(Second absTime, Second dt, PerSecond avgAngularSpeed, bool dryRun) { var powerDemands = new Dictionary<string, NewtonMeter>(Auxiliaries.Count); -- GitLab