diff --git a/Documentation/User Manual Source/material User Manual.pptx b/Documentation/User Manual Source/material User Manual.pptx index a3f5a0a78e18a538105222dac7fd93bbaca9f2f0..2d28b13f895c7b8ba85633cf3eb3d2411b28106a 100644 Binary files a/Documentation/User Manual Source/material User Manual.pptx and b/Documentation/User Manual Source/material User Manual.pptx differ diff --git a/Generic Vehicles/Engineering Mode/GenericIEPC/IEPC_Gbx3Speed/Axlegear.vgbx b/Generic Vehicles/Engineering Mode/GenericIEPC/IEPC_Gbx3Speed/Axlegear.vgbx index 8c4b5d9467fc9de8c168253de67633e521e24a0f..96a5496c2e5141440ff16906fcf3c3554e0503d3 100644 --- a/Generic Vehicles/Engineering Mode/GenericIEPC/IEPC_Gbx3Speed/Axlegear.vgbx +++ b/Generic Vehicles/Engineering Mode/GenericIEPC/IEPC_Gbx3Speed/Axlegear.vgbx @@ -21,7 +21,7 @@ "StartTqReserve": 20.0, "StartSpeed": 2.22222222222222, "StartAcc": 0.8, - "GearboxType": "AMT", + "GearboxType": "IEPC", "TorqueConverter": { "Enabled": false }, diff --git a/VECTO/GUI/VectoJobForm.vb b/VECTO/GUI/VectoJobForm.vb index 24f05e99539b69f13b1e1a961667ed776dd5a2d7..2a1ffb8d412bddc3c08cb27b145476d1e3139c4e 100644 --- a/VECTO/GUI/VectoJobForm.vb +++ b/VECTO/GUI/VectoJobForm.vb @@ -484,7 +484,7 @@ Public Class VectoJobForm Else TbENG.Text = "" End If - If (JobType <> VectoSimulationJobType.BatteryElectricVehicle AndAlso inputData.JobInputData.Vehicle.Components.GearboxInputData IsNot Nothing) Then + If (JobType <> VectoSimulationJobType.BatteryElectricVehicle orelse inputData.JobInputData.Vehicle.Components.GearboxInputData IsNot Nothing) Then TbGBX.Text = GetRelativePath(inputData.JobInputData.Vehicle.Components.GearboxInputData.DataSource.SourceFile, _basePath) Else TbGBX.Text = "" @@ -1190,7 +1190,11 @@ Public Class VectoJobForm If gearbox Is Nothing Then Return - TbGbxTxt.Text = $"{gearbox.Gears.Count}-Speed {gearbox.Type.ShortName()} {gearbox.Model}" + if (JobType = VectoSimulationJobType.IEPC_E OrElse JobType = VectoSimulationJobType.IEPC_S) Then + TbGbxTxt.Text = $"IEPC {gearbox.Model}" + else + TbGbxTxt.Text = $"{gearbox.Gears.Count}-Speed {gearbox.Type.ShortName()} {gearbox.Model}" + End If If Cfg.DeclMode Then For i = 1 To gearbox.Gears.Count diff --git a/VECTO/GUI/VehicleForm.Designer.vb b/VECTO/GUI/VehicleForm.Designer.vb index fe2600c7fd2ee8d95399dfa3c39a395c6b60708b..57014cc2535049434105d389039072b15149aabd 100644 --- a/VECTO/GUI/VehicleForm.Designer.vb +++ b/VECTO/GUI/VehicleForm.Designer.vb @@ -2047,7 +2047,7 @@ Partial Class VehicleForm Me.gbPropulsionTorque.Size = New System.Drawing.Size(604, 80) Me.gbPropulsionTorque.TabIndex = 2 Me.gbPropulsionTorque.TabStop = false - Me.gbPropulsionTorque.Text = "Propulsion Torque Limit" + Me.gbPropulsionTorque.Text = "Boosting Torque Limits" ' 'btnPropulsionTorqueLimit ' diff --git a/VECTO/GUI/VehicleForm.vb b/VECTO/GUI/VehicleForm.vb index f0eeab8f8baff1444a04eac4c92116682a461002..1783d6aaaae0051ee8ce52b29bf3979fdc6934ec 100644 --- a/VECTO/GUI/VehicleForm.vb +++ b/VECTO/GUI/VehicleForm.vb @@ -698,6 +698,12 @@ Public Class VehicleForm gbEMTorqueLimits.Enabled = False tcVehicleComponents.TabPages.Remove(tpTorqueLimits) + 'ADAS --------------------------------------------------------------------- + cbEngineStopStart.Visible = False + cbAtEcoRollReleaseLockupClutch.Visible = False + pnEcoRoll.Visible = False + cbEcoRoll.SelectedIndex = 0 + 'PTO gbPTO.Enabled = False pnPTO.Enabled = false @@ -710,6 +716,12 @@ Public Class VehicleForm gbEMTorqueLimits.Enabled = False tcVehicleComponents.TabPages.Remove(tpTorqueLimits) + 'ADAS --------------------------------------------------------------------- + cbEngineStopStart.Visible = False + cbAtEcoRollReleaseLockupClutch.Visible = False + pnEcoRoll.Visible = False + cbEcoRoll.SelectedIndex = 0 + 'PTO gbPTO.Enabled = False pnPTO.Enabled = false diff --git a/VectoCommon/VectoCommon/Models/GearboxType.cs b/VectoCommon/VectoCommon/Models/GearboxType.cs index bedc03bf0a1f245ac0031fde00238a33269366b8..b10f2acc2edaeb7ced1c902c3b08f6ae5e5fbcd8 100644 --- a/VectoCommon/VectoCommon/Models/GearboxType.cs +++ b/VectoCommon/VectoCommon/Models/GearboxType.cs @@ -70,7 +70,7 @@ namespace TUGraz.VectoCommon.Models [DebuggerStepThrough] public static bool AutomaticTransmission(this GearboxType type) => - type == GearboxType.ATPowerSplit || type == GearboxType.ATSerial || type == GearboxType.APTN; + type == GearboxType.ATPowerSplit || type == GearboxType.ATSerial || type == GearboxType.APTN || type == GearboxType.IHPC; [DebuggerStepThrough] public static bool ManualTransmission(this GearboxType type) => diff --git a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/EngineeringDataAdapter.cs b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/EngineeringDataAdapter.cs index b4099bce7110123711fd37563883652be267ef2b..33745b5cf809f44ea5f3249c1ae39d4ea11f6abf 100644 --- a/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/EngineeringDataAdapter.cs +++ b/VectoCore/VectoCore/InputData/Reader/DataObjectAdapter/EngineeringDataAdapter.cs @@ -210,7 +210,7 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter retVal.Inertia = engine.Inertia + (gbx != null && gbx.Type.AutomaticTransmission() - ? (gbx.Type == GearboxType.APTN ? 0.SI<KilogramSquareMeter>() : torqueConverter.Inertia) + ? (gbx.Type == GearboxType.APTN || gbx.Type == GearboxType.IHPC ? 0.SI<KilogramSquareMeter>() : torqueConverter.Inertia) : 0.SI<KilogramSquareMeter>()); retVal.EngineStartTime = engine.EngineStartTime ?? DeclarationData.Engine.DefaultEngineStartTime; var limits = torqueLimits.ToDictionary(e => e.Gear); @@ -333,7 +333,7 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter SetEngineeringData(gearbox, gearshiftData, retVal); - var hasTorqueConverter = retVal.Type.AutomaticTransmission() && retVal.Type != GearboxType.APTN; + var hasTorqueConverter = retVal.Type.AutomaticTransmission() && retVal.Type != GearboxType.APTN && retVal.Type != GearboxType.IHPC; var gearDifferenceRatio = hasTorqueConverter && gearbox.Gears.Count > 2 ? gearbox.Gears[0].Ratio / gearbox.Gears[1].Ratio @@ -431,8 +431,7 @@ namespace TUGraz.VectoCore.InputData.Reader.DataObjectAdapter IGearboxEngineeringInputData gearbox, IGearshiftEngineeringInputData gearshiftData, GearboxData retVal) { retVal.Inertia = gearbox.Type.ManualTransmission() ? gearbox.Inertia : 0.SI<KilogramSquareMeter>(); - retVal.TractionInterruption = gearbox.Type == GearboxType.APTN ? 0.SI<Second>() : gearbox.TractionInterruption; - + retVal.TractionInterruption = gearbox.Type == GearboxType.APTN || gearbox.Type == GearboxType.IHPC ? 0.SI<Second>() : gearbox.TractionInterruption; } public AxleGearData CreateAxleGearData(IAxleGearInputData data) diff --git a/VectoCore/VectoCore/InputData/Reader/Impl/EngineeringModeVectoRunDataFactory.cs b/VectoCore/VectoCore/InputData/Reader/Impl/EngineeringModeVectoRunDataFactory.cs index da4e2d0104c2110bc5c8d452f9f273c916f236bf..17625e41092ba0b2261a5d2bdd54e8dae53cf746 100644 --- a/VectoCore/VectoCore/InputData/Reader/Impl/EngineeringModeVectoRunDataFactory.cs +++ b/VectoCore/VectoCore/InputData/Reader/Impl/EngineeringModeVectoRunDataFactory.cs @@ -311,9 +311,9 @@ namespace TUGraz.VectoCore.InputData.Reader.Impl var crossWindRequired = vehicle.Components.AirdragInputData.CrossWindCorrectionMode == CrossWindCorrectionMode.VAirBetaLookupTable; - var ptoTransmissionData = dao.CreateBatteryElectricPTOTransmissionData(vehicle.Components.PTOTransmissionInputData); + var ptoTransmissionData = dao.CreateBatteryElectricPTOTransmissionData(vehicle.Components.PTOTransmissionInputData); - var drivingCycle = GetDrivingCycle(cycle, crossWindRequired); + var drivingCycle = GetDrivingCycle(cycle, crossWindRequired); var vehicleData = dao.CreateVehicleData(vehicle); yield return new VectoRunData @@ -329,8 +329,8 @@ namespace TUGraz.VectoCore.InputData.Reader.Impl Aux = dao.CreateAuxiliaryData(vehicle.Components.AuxiliaryInputData), BusAuxiliaries = dao.CreateBusAuxiliariesData(vehicle.Components.AuxiliaryInputData, vehicleData, VectoSimulationJobType.BatteryElectricVehicle), Retarder = dao.CreateRetarderData(vehicle.Components.RetarderInputData, powertrainPosition), - PTO = ptoTransmissionData, - Cycle = new DrivingCycleProxy(drivingCycle, cycle.Name), + PTO = ptoTransmissionData, + Cycle = new DrivingCycleProxy(drivingCycle, cycle.Name), ExecutionMode = ExecutionMode.Engineering, ElectricMachinesData = electricMachinesData, //HybridStrategyParameters = dao.CreateHybridStrategyParameters(InputDataProvider.JobInputData.HybridStrategyParameters), @@ -578,6 +578,10 @@ namespace TUGraz.VectoCore.InputData.Reader.Impl ? VectoSimulationJobType.ParallelHybridVehicle : VectoSimulationJobType.ConventionalVehicle; + if (powertrainPosition == PowertrainPosition.HybridP2 && gearboxData.Type.AutomaticTransmission()) { + throw new VectoException( + "Powertrain Architecture 'hybrid electric vehicle, P2' with AT transmission not supported"); + } var vehicleData = dao.CreateVehicleData(vehicle); var gearshiftParams = dao.CreateGearshiftData( diff --git a/VectoCore/VectoCore/Models/Simulation/Impl/PCCEcoRollEngineStopPreprocessor.cs b/VectoCore/VectoCore/Models/Simulation/Impl/PCCEcoRollEngineStopPreprocessor.cs index d2b1379ec1550d6139d663c702fa8d296f6cc1eb..1b6c4c75fbfd4bd1b5210f1c1a66119c29697cbc 100644 --- a/VectoCore/VectoCore/Models/Simulation/Impl/PCCEcoRollEngineStopPreprocessor.cs +++ b/VectoCore/VectoCore/Models/Simulation/Impl/PCCEcoRollEngineStopPreprocessor.cs @@ -125,7 +125,9 @@ namespace TUGraz.VectoCore.Models.Simulation.Impl var gradient = 0.SI<Radian>(); foreach (var motor in container.ElectricMotors.Values) { - ((motor as ElectricMotor).Control as DummyElectricMotorControl).EmTorque = null; + if ((motor as ElectricMotor).Control is DummyElectricMotorControl emCtl) { + emCtl.EmTorque = null; + } } var initialResponse = vehicle.Request(absTime, simulationInterval, acceleration, gradient); diff --git a/VectoCore/VectoCore/Models/Simulation/Impl/PowertrainBuilder.cs b/VectoCore/VectoCore/Models/Simulation/Impl/PowertrainBuilder.cs index f4f4561b5fbbc2f748b1e98231e658e449bc798b..f9fc271aaa8d4bc3cef25bd782d66669b349ecf8 100644 --- a/VectoCore/VectoCore/Models/Simulation/Impl/PowertrainBuilder.cs +++ b/VectoCore/VectoCore/Models/Simulation/Impl/PowertrainBuilder.cs @@ -1627,7 +1627,7 @@ namespace TUGraz.VectoCore.Models.Simulation.Impl private static IGearbox GetSimpleGearbox(IVehicleContainer container, VectoRunData runData) { - if (runData.GearboxData.Type.AutomaticTransmission() && runData.GearboxData.Type != GearboxType.APTN) { + if (runData.GearboxData.Type.AutomaticTransmission() && runData.GearboxData.Type != GearboxType.APTN && runData.GearboxData.Type != GearboxType.IHPC) { new ATClutchInfo(container); return new ATGearbox(container, null); } diff --git a/VectoCore/VectoCore/Models/SimulationComponent/Data/GearboxData.cs b/VectoCore/VectoCore/Models/SimulationComponent/Data/GearboxData.cs index 36384aae716e1f57ee561071ee5894ea66798b71..f93e0b4c043bd2a70946d05f09d6c39383429604 100644 --- a/VectoCore/VectoCore/Models/SimulationComponent/Data/GearboxData.cs +++ b/VectoCore/VectoCore/Models/SimulationComponent/Data/GearboxData.cs @@ -135,11 +135,11 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Data return new ValidationResult("Torque Converter can only be used with AT gearbox model"); } } else { - if (gearboxData.Type.AutomaticTransmission() && gearboxData.Type != GearboxType.APTN) { + if (gearboxData.Type.AutomaticTransmission() && gearboxData.Type != GearboxType.APTN && gearboxData.Type != GearboxType.IHPC) { return new ValidationResult("AT gearbox model requires torque converter"); } } - if (gearboxData.Type.AutomaticTransmission() && gearboxData.Type != GearboxType.APTN) { + if (gearboxData.Type.AutomaticTransmission() && gearboxData.Type != GearboxType.APTN && gearboxData.Type != GearboxType.IHPC) { gearboxData.TorqueConverterData.RequiredSpeedRatio = Math.Round(gearboxData.Gears[1].TorqueConverterRatio / gearboxData.Gears[1].Ratio, 4) * 0.95; result.AddRange(gearboxData.TorqueConverterData.Validate(mode, jobType, emPos, gearboxData.Type, emsMission)); diff --git a/VectoCore/VectoCore/Models/SimulationComponent/Impl/DefaultDriverStrategy.cs b/VectoCore/VectoCore/Models/SimulationComponent/Impl/DefaultDriverStrategy.cs index c29e39b125985a7d13abd1bc2b1a339ca52f4976..0683d8833c5b63eb0a19c6c705a09fcdb795349e 100644 --- a/VectoCore/VectoCore/Models/SimulationComponent/Impl/DefaultDriverStrategy.cs +++ b/VectoCore/VectoCore/Models/SimulationComponent/Impl/DefaultDriverStrategy.cs @@ -114,12 +114,25 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl if (ADAS.PredictiveCruiseControl != PredictiveCruiseControlType.None) { // create a dummy powertrain for pre-processing and estimations var testContainer = new SimplePowertrainContainer(data); - if (data.JobType != VectoSimulationJobType.BatteryElectricVehicle && data.JobType != VectoSimulationJobType.SerialHybridVehicle) - PowertrainBuilder.BuildSimplePowertrain(data, testContainer); - else { - PowertrainBuilder.BuildSimplePowertrainElectric(data, testContainer); - } + switch (data.JobType) { + case VectoSimulationJobType.BatteryElectricVehicle: + case VectoSimulationJobType.SerialHybridVehicle: + case VectoSimulationJobType.IEPC_E: + case VectoSimulationJobType.IEPC_S: + PowertrainBuilder.BuildSimplePowertrainElectric(data, testContainer); + break; + case VectoSimulationJobType.IHPC: + case VectoSimulationJobType.ParallelHybridVehicle: + PowertrainBuilder.BuildSimpleHybridPowertrain(data, testContainer); + break; + case VectoSimulationJobType.ConventionalVehicle: + PowertrainBuilder.BuildSimplePowertrain(data, testContainer); + break; + default: + throw new ArgumentOutOfRangeException(nameof(data.JobType)); + } + container.AddPreprocessor(new PCCSegmentPreprocessor(testContainer, PCCSegments, data?.DriverData.PCC)); } } @@ -425,7 +438,7 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl var axleLoss = DataBus.AxlegearInfo.AxlegearLoss(); var emDragLoss = CalculateElectricMotorDragLoss(); var iceDragLoss = 0.SI<Watt>(); - if (dataBus.GearboxInfo.GearboxType.AutomaticTransmission()) { + if (dataBus.GearboxInfo.GearboxType.AutomaticTransmission() && dataBus.GearboxInfo.GearboxType != GearboxType.IHPC) { if (ADAS.EcoRoll == EcoRollType.None && ATEcoRollReleaseLockupClutch) { iceDragLoss = DataBus.EngineInfo.EngineDragPower(DataBus.EngineInfo.EngineSpeed); } diff --git a/VectoCore/VectoCore/Models/SimulationComponent/Impl/HybridController.cs b/VectoCore/VectoCore/Models/SimulationComponent/Impl/HybridController.cs index 3b0b51dc8c526f0678ff790fe8c4423752bed34e..81a91730778d258669e80b1c3ab230f635acd7a3 100644 --- a/VectoCore/VectoCore/Models/SimulationComponent/Impl/HybridController.cs +++ b/VectoCore/VectoCore/Models/SimulationComponent/Impl/HybridController.cs @@ -38,9 +38,22 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl public HybridController(IVehicleContainer container, IHybridControlStrategy strategy, IElectricSystem es) : base(container) { _electricMotorCtl = new Dictionary<PowertrainPosition, ElectricMotorController>(); - _shiftStrategy = container.RunData.GearboxData.Type.AutomaticTransmission() - ? new HybridCtlATShiftStrategy(this, container) - : new HybridCtlShiftStrategy(this, container); + + switch (container.RunData.GearboxData.Type) { + case GearboxType.ATPowerSplit: + case GearboxType.ATSerial: + _shiftStrategy = new HybridCtlATShiftStrategy(this, container); + break; + case GearboxType.AMT: + _shiftStrategy = new HybridCtlShiftStrategy(this, container); + break; + case GearboxType.APTN: + case GearboxType.IHPC: + _shiftStrategy = new HybridCtlIHPCShiftStrategy(this, container); + break; + default: throw new ArgumentException($"Unsupported Gearbox type for Hybrid Controller: {container.RunData.GearboxData.Type}"); + } + _hybridStrategy = strategy; strategy.Controller = this; @@ -291,7 +304,7 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl protected GearshiftPosition _nextGear { get; set; } protected readonly GearList GearList; - private readonly VectoRunData _runData; + protected readonly VectoRunData _runData; public HybridCtlShiftStrategy(HybridController hybridController, IVehicleContainer container) : base( container) @@ -564,5 +577,84 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl return base.SpeedTooHighForEngine(gear, outAngularSpeed); } } + + ///======================================================================================= + + public class HybridCtlIHPCShiftStrategy : HybridCtlATShiftStrategy + { + protected new APTNGearbox _gearbox; + + public HybridCtlIHPCShiftStrategy(HybridController hybridController, IVehicleContainer container) : base(hybridController, container) { } + + public override IGearbox Gearbox { + get => _gearbox; + set => _gearbox = value as APTNGearbox ?? throw new VectoException("This shift strategy can't handle gearbox of type {0}", value.GetType()); + } + + public override GearshiftPosition InitGear(Second absTime, Second dt, NewtonMeter torque, PerSecond outAngularVelocity) + { + if (DataBus.VehicleInfo.VehicleSpeed.IsEqual(0)) { + return InitStartGear(absTime, torque, outAngularVelocity); + } + + foreach (var gear in Gears.Reverse()) { + var response = _gearbox.Initialize(absTime, gear, torque, outAngularVelocity); + + if (response.Engine.EngineSpeed > DataBus.EngineInfo.EngineRatedSpeed || response.Engine.EngineSpeed < DataBus.EngineInfo.EngineIdleSpeed) { + continue; + } + + if (!IsBelowDownShiftCurve(gear, response.Engine.PowerRequest / response.Engine.EngineSpeed, response.Engine.EngineSpeed)) { + _gearbox.Disengaged = false; + return gear; + } + } + + // fallback: start with first gear; + _gearbox.Disengaged = false; + return Gears.First(); + } + + public override void Disengage(Second absTime, Second dt, NewtonMeter outTorque, PerSecond outAngularVelocity) { } + + protected GearshiftPosition InitStartGear(Second absTime, NewtonMeter outTorque, PerSecond outAngularVelocity) + { + if (!DataBus.EngineCtl.CombustionEngineOn) { + return _nextGear; + } + + foreach (var gear in GearList.IterateGears(MaxStartGear, GearList.First())) { + //for (var gear = MaxStartGear; gear > 1; gear--) { + var inAngularSpeed = outAngularVelocity * GearboxModelData.Gears[gear.Gear].Ratio; + + var ratedSpeed = DataBus.EngineInfo.EngineRatedSpeed; + if (inAngularSpeed > ratedSpeed || inAngularSpeed.IsEqual(0)) { + continue; + } + + var response = _gearbox.Initialize(absTime, gear, outTorque, outAngularVelocity); + + var fullLoadPower = + response.Engine.DynamicFullLoadTorque; //EnginePowerRequest - response.DeltaFullLoad; + var reserve = 1 - response.Engine.TorqueOutDemand / fullLoadPower; + + if (_runData != null && _runData.HybridStrategyParameters.MaxPropulsionTorque?.GetVECTOValueOrDefault(gear) != null) { + var tqRequest = response.Gearbox.InputTorque; + var maxTorque = _runData.HybridStrategyParameters.MaxPropulsionTorque[gear].FullLoadDriveTorque(response.Gearbox.InputSpeed); + reserve = 1 - VectoMath.Min(response.Engine.TorqueOutDemand / fullLoadPower, tqRequest / maxTorque); + } + + if (response.Engine.EngineSpeed > DataBus.EngineInfo.EngineIdleSpeed && + reserve.IsGreaterOrEqual(0)) { + //reserve >= GearshiftParams.StartTorqueReserve) { + _nextGear = gear; + return gear; + } + } + + _nextGear = GearList.First(); + return _nextGear; + } + } } } \ No newline at end of file diff --git a/VectoCore/VectoCore/Models/SimulationComponent/Impl/IEPC.cs b/VectoCore/VectoCore/Models/SimulationComponent/Impl/IEPC.cs index 9fabd9458353d275e6d74db6be0283f0ce31b56a..64ab097e1aea9f8ca1aefffd4e3dc227e0964177 100644 --- a/VectoCore/VectoCore/Models/SimulationComponent/Impl/IEPC.cs +++ b/VectoCore/VectoCore/Models/SimulationComponent/Impl/IEPC.cs @@ -41,7 +41,7 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl{ container[ModalResultField.P_IEPC_el_, Position] = CurrentState.ElectricPowerToBattery; - container[ModalResultField.P_IEPC_electricMotorLoss_, Position] = (CurrentState.EmTorqueMap ?? 0.SI<NewtonMeter>()) * avgEMSpeed - CurrentState.ElectricPowerToBattery; + container[ModalResultField.P_IEPC_electricMotorLoss_, Position] = (CurrentState.DrivetrainInTorque - CurrentState.DrivetrainOutTorque) * avgDTSpeed - CurrentState.ElectricPowerToBattery; //container[ModalResultField.P_EM_TransmissionLoss_, Position] = CurrentState.TransmissionTorqueLoss * avgDTSpeed; diff --git a/VectoCore/VectoCore/Models/SimulationComponent/Strategies/HybridStrategy.cs b/VectoCore/VectoCore/Models/SimulationComponent/Strategies/HybridStrategy.cs index f752c820dee32c1ebe5c5d32ee99aee228e2f8a6..38e36b8cf9a9cdaef02709c0dec790d6404a75f1 100644 --- a/VectoCore/VectoCore/Models/SimulationComponent/Strategies/HybridStrategy.cs +++ b/VectoCore/VectoCore/Models/SimulationComponent/Strategies/HybridStrategy.cs @@ -421,46 +421,6 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Strategies } - //protected virtual bool? CheckUpshiftTcTc( - // Second absTime, Second dt, NewtonMeter outTorque, PerSecond outAngularVelocity, NewtonMeter inTorque, - // PerSecond inAngularVelocity, GearshiftPosition gear, GearData currentGear, IResponse response) - //{ - // // C -> C+1 - // var nextGearPos = GearList.Successor(gear); // GearboxModelData.Gears[gear + 1]; - // var nextGear = ModelData.GearboxData.Gears[nextGearPos.Gear]; - // var gearRatio = nextGear.TorqueConverterRatio / currentGear.TorqueConverterRatio; - // var minEngineSpeed = VectoMath.Min(700.RPMtoRad(), gearRatio * (DataBus.EngineInfo.EngineN80hSpeed - 150.RPMtoRad())); - - // var nextGearboxInSpeed = outAngularVelocity * nextGear.TorqueConverterRatio; - // var nextGearboxInTorque = outTorque / nextGear.TorqueConverterRatio; - // var shiftLosses = _gearbox.ComputeShiftLosses(outTorque, outAngularVelocity, nextGearPos) / - // ModelData.GearboxData.PowershiftShiftTime / nextGearboxInSpeed; - // nextGearboxInTorque += shiftLosses; - // var tcOperatingPoint = - // _gearbox.TorqueConverter.FindOperatingPoint(absTime, dt, nextGearboxInTorque, nextGearboxInSpeed); - - // var engineSpeedOverMin = tcOperatingPoint.InAngularVelocity.IsGreater(minEngineSpeed); - // var avgSpeed = (DataBus.EngineInfo.EngineSpeed + tcOperatingPoint.InAngularVelocity) / 2; - // var engineMaxTorque = DataBus.EngineInfo.EngineStationaryFullPower(avgSpeed) / avgSpeed; - // var engineInertiaTorque = Formulas.InertiaPower( - // DataBus.EngineInfo.EngineSpeed, tcOperatingPoint.InAngularVelocity, ModelData.EngineData.Inertia, dt) / avgSpeed; - // var engineTorqueBelowMax = - // tcOperatingPoint.InTorque.IsSmallerOrEqual(engineMaxTorque - engineInertiaTorque); - - // var reachableAcceleration = - // EstimateAcceleration( - // outAngularVelocity, outTorque, inAngularVelocity, inTorque, gear.Gear, response); // EstimateAccelerationForGear(gear + 1, outAngularVelocity); - // var minAcceleration = VectoMath.Min( - // ModelData.GearboxData.TorqueConverterData.CCUpshiftMinAcceleration, - // DataBus.DriverInfo.DriverAcceleration); - // var minAccelerationReachable = reachableAcceleration.IsGreaterOrEqual(minAcceleration); - - // if (engineSpeedOverMin && engineTorqueBelowMax && minAccelerationReachable) { - // return true; - // } - - // return null; - //} } // ===================================================== @@ -1102,7 +1062,7 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Strategies var endSpeed = DataBus.VehicleInfo.VehicleSpeed + DataBus.DriverInfo.DriverAcceleration * ModelData.GearboxData.TractionInterruption; if (EngineSpeedTooLow(response) - && DataBus.GearboxInfo.GearboxType.ManualTransmission() + && (DataBus.GearboxInfo.GearboxType.ManualTransmission() || DataBus.GearboxInfo.GearboxType == GearboxType.IHPC) && endSpeed.IsSmallerOrEqual(disengageSpeedThreshold, 0.1.KMPHtoMeterPerSecond())) { var responseEmOff = ResponseEmOff; responseEmOff.Gear = new GearshiftPosition(0); @@ -1234,7 +1194,9 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Strategies ? (maxRecuperationResponse as ResponseDryRun).DeltaDragLoadTorque : maxRecuperationResponse.Engine.TotalTorqueDemand - maxRecuperationResponse.Engine.DragTorque; - if (!maxRecuperationResponse.Engine.EngineOn && DataBus.GearboxInfo.GearboxType.AutomaticTransmission()) { + var isAPTWithTorqueConverter = DataBus.GearboxInfo.GearboxType.AutomaticTransmission() && + DataBus.GearboxInfo.GearboxType != GearboxType.IHPC; + if (!maxRecuperationResponse.Engine.EngineOn && isAPTWithTorqueConverter) { deltaDragTqMaxRecuperation = maxRecuperationResponse.Gearbox.InputTorque; } @@ -1278,7 +1240,7 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Strategies var deltaDragLoad = disengaged ? (r as ResponseDryRun).DeltaDragLoadTorque : r.Engine.TotalTorqueDemand - r.Engine.DragTorque; - if (!r.Engine.EngineOn && DataBus.GearboxInfo.GearboxType.AutomaticTransmission()) { + if (!r.Engine.EngineOn && isAPTWithTorqueConverter) { deltaDragLoad = r.Gearbox.InputTorque; } return deltaDragLoad; @@ -1299,7 +1261,7 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Strategies var deltaDragLoad = disengaged ? (r as ResponseDryRun).DeltaDragLoadTorque : r.Engine.TotalTorqueDemand - r.Engine.DragTorque; - if (!r.Engine.EngineOn && DataBus.GearboxInfo.GearboxType.AutomaticTransmission()) { + if (!r.Engine.EngineOn && isAPTWithTorqueConverter) { deltaDragLoad = r.Gearbox.InputTorque; } return deltaDragLoad.Value(); @@ -1321,7 +1283,19 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Strategies } }; entry.Response = RequestDryRun(absTime, dt, outTorque, outAngularVelocity, nextGear, entry.Setting); - eval.Add(entry); + if (entry.Response.ElectricSystem.ConsumerPower.IsGreater(0)) { + eval.Add(entry); + } else { + // for the found operating point, although recuperating no electric energy is generated. leave EM off + var off = ResponseEmOff; + if (vehiclespeedBelowThreshold && (emPos == PowertrainPosition.HybridP2 || emPos == PowertrainPosition.HybridP1)) { + off.Setting.GearboxInNeutral = true; + } else { + off.Setting.GearboxInNeutral = PreviousState.Solution?.Setting.GearboxInNeutral ?? false; + } + + eval.Add(off); + } } else { if (emRecuperationTq.IsGreater(0)) { eval.Add( @@ -1359,7 +1333,7 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Strategies return false; } - if (DataBus.GearboxInfo.GearboxType.AutomaticTransmission()) { + if (DataBus.GearboxInfo.GearboxType.AutomaticTransmission() && DataBus.GearboxInfo.GearboxType != GearboxType.IHPC) { return firstResponse.Engine.EngineOn ? firstResponse.Engine.EngineSpeed.IsSmaller(ModelData.EngineData.IdleSpeed) : (firstResponse.Gearbox.InputSpeed?.IsSmaller(ModelData.EngineData.IdleSpeed) ?? false); diff --git a/VectoCore/VectoCore/Models/SimulationComponent/Strategies/TestPowertrain.cs b/VectoCore/VectoCore/Models/SimulationComponent/Strategies/TestPowertrain.cs index 6e45b89d2204b9dc9f8869ec3b58a9af75e88b51..42c94ada790908d2e4738c008ef42098078168a5 100644 --- a/VectoCore/VectoCore/Models/SimulationComponent/Strategies/TestPowertrain.cs +++ b/VectoCore/VectoCore/Models/SimulationComponent/Strategies/TestPowertrain.cs @@ -81,7 +81,7 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Strategies } } - if (Gearbox != null && Gearbox.GearboxType.AutomaticTransmission() && Gearbox.GearboxType != GearboxType.APTN) { + if (Gearbox != null && Gearbox.GearboxType.AutomaticTransmission() && Gearbox.GearboxType != GearboxType.APTN && Gearbox.GearboxType != GearboxType.IHPC) { TorqueConverter = Container.TorqueConverterInfo as TorqueConverter; if (TorqueConverter == null) { throw new VectoException("Torque converter missing for automatic transmission: {0}", Container.TorqueConverterInfo?.GetType().FullName); diff --git a/VectoCore/VectoCore/OutputData/FileIO/JSONFileWriter.cs b/VectoCore/VectoCore/OutputData/FileIO/JSONFileWriter.cs index 6dc185bc8e07d0ab0375dad2af40644445078bd7..d74e5936b04e372a22cc2c44fd5aa9c3e33f866e 100644 --- a/VectoCore/VectoCore/OutputData/FileIO/JSONFileWriter.cs +++ b/VectoCore/VectoCore/OutputData/FileIO/JSONFileWriter.cs @@ -355,7 +355,7 @@ public class JSONFileWriter : IOutputFileWriter body.Add(JsonKeys.Gearbox_GearboxType, gbx.Type.ToString()); var torqueConverterDict = new Dictionary<string, object> { { "Enabled", torqueConverter != null && gbx.Type.AutomaticTransmission() } }; - if (gbx.Type.AutomaticTransmission() && gbx.Type != GearboxType.APTN) { + if (gbx.Type.AutomaticTransmission() && gbx.Type != GearboxType.APTN && gbx.Type != GearboxType.IHPC) { torqueConverterDict.Add("File", GetRelativePath(torqueConverter.TCData.Source, Path.GetDirectoryName(filename))); torqueConverterDict.Add(JsonKeys.Gearbox_TorqueConverter_ReferenceRPM, Math.Round(torqueConverter.ReferenceRPM.AsRPM, 4)); torqueConverterDict.Add(JsonKeys.Gearbox_TorqueConverter_Inertia, torqueConverter.Inertia.Value()); diff --git a/VectoCore/VectoCore/OutputData/SummaryDataContainer.cs b/VectoCore/VectoCore/OutputData/SummaryDataContainer.cs index 1933a89eb7c7351b8f83c89b69ec85aa39c8f753..7d73e77a65a93c756b4fd64bb89ca06e2e479109 100644 --- a/VectoCore/VectoCore/OutputData/SummaryDataContainer.cs +++ b/VectoCore/VectoCore/OutputData/SummaryDataContainer.cs @@ -660,7 +660,7 @@ namespace TUGraz.VectoCore.OutputData var eGbxOut = modData.TimeIntegral<WattSecond>(gbxOutSignal, x => x > 0); row[Fields.AVERAGE_GEARBOX_EFFICIENCY] = eGbxIn.IsEqual(0, 1e-9) ? 0 : (eGbxOut / eGbxIn).Value(); - if (runData.GearboxData != null && runData.GearboxData.Type.AutomaticTransmission() && runData.GearboxData.Type != GearboxType.APTN) { + if (runData.GearboxData != null && runData.GearboxData.Type.AutomaticTransmission() && runData.GearboxData.Type != GearboxType.APTN && runData.GearboxData.Type != GearboxType.IHPC) { var eTcIn = modData.TimeIntegral<WattSecond>(ModalResultField.P_TC_in, x => x > 0); var eTcOut = eGbxIn; row[Fields.AVERAGE_TORQUE_CONVERTER_EFFICIENCY_WITHOUT_LOCKUP] = eTcIn.IsEqual(0, 1e-9) ? 0 : (eTcOut / eTcIn).Value(); @@ -1116,7 +1116,7 @@ namespace TUGraz.VectoCore.OutputData row[Fields.GEAR_RATIO_LAST_GEAR] = data.Gears.Count > 0 ? (ConvertedSI)data.Gears.Last().Value.Ratio.SI<Scalar>() : (ConvertedSI)0.SI<Scalar>(); - if (data.Type != GearboxType.APTN) { + if (data.Type != GearboxType.APTN && data.Type != GearboxType.IHPC) { row[Fields.TORQUECONVERTER_MANUFACTURER] = data.TorqueConverterData.Manufacturer; row[Fields.TORQUECONVERTER_MODEL] = data.TorqueConverterData.ModelName; row[Fields.TORQUE_CONVERTER_CERTIFICATION_NUMBER] =