diff --git a/VectoCore/VectoCore/Models/Simulation/Impl/PCCEcoRollEngineStopPreprocessor.cs b/VectoCore/VectoCore/Models/Simulation/Impl/PCCEcoRollEngineStopPreprocessor.cs index d792f07dab1428327c79892bc422e8271b19aed9..08b4c46f50485ecf238590942056841a8424572e 100644 --- a/VectoCore/VectoCore/Models/Simulation/Impl/PCCEcoRollEngineStopPreprocessor.cs +++ b/VectoCore/VectoCore/Models/Simulation/Impl/PCCEcoRollEngineStopPreprocessor.cs @@ -86,6 +86,16 @@ namespace TUGraz.VectoCore.Models.Simulation.Impl modData?.Reset(); SlopeData[speed] = slope; } + + if (!SlopeData.ContainsKey(MaxSpeed)) { + vehicle.Initialize(MaxSpeed, 0.SI<Radian>()); + var slope = SearchSlope(vehicle, Container); + modData?.Reset(); + SlopeData[MaxSpeed] = slope; + } + + + } private void RunPreprocessingAMTGearbox(Gearbox gearbox, Vehicle vehicle) @@ -133,20 +143,25 @@ namespace TUGraz.VectoCore.Models.Simulation.Impl var acceleration = 0.SI<MeterPerSquareSecond>(); var absTime = 0.SI<Second>(); var gradient = 0.SI<Radian>(); + + foreach (var motor in container.ElectricMotors.Values) { + ((motor as ElectricMotor).Control as DummyElectricMotorControl).EmTorque = null; + } + var initialResponse = vehicle.Request(absTime, simulationInterval, acceleration, gradient); - var delta = initialResponse.Gearbox?.PowerRequest ?? (initialResponse.Engine?.PowerRequest ?? 0.SI<Watt>()) + (initialResponse.ElectricMotor?.PowerRequest ?? 0.SI<Watt>()); + var delta = initialResponse.Gearbox?.PowerRequest ?? initialResponse.ElectricMotor?.TotalTorqueDemand * initialResponse.ElectricMotor?.AvgDrivetrainSpeed; try { gradient = SearchAlgorithm.Search( gradient, delta, 0.1.SI<Radian>(), getYValue: response => { var r = (ResponseDryRun)response; - return r.Gearbox?.PowerRequest ?? (r.Engine?.PowerRequest ?? 0.SI<Watt>() + r.ElectricMotor?.PowerRequest ?? 0.SI<Watt>()); + return r.Gearbox?.PowerRequest ?? r.ElectricMotor?.TotalTorqueDemand * r.ElectricMotor?.AvgDrivetrainSpeed; }, evaluateFunction: grad => vehicle.Request(absTime, simulationInterval, acceleration, grad, true), criterion: response => { var r = (ResponseDryRun)response; - return (r.Gearbox?.PowerRequest ?? (r.Engine?.PowerRequest ?? 0.SI<Watt>()) + (r.ElectricMotor?.PowerRequest ?? 0.SI<Watt>())).Value(); + return (r.Gearbox?.PowerRequest ?? r.ElectricMotor?.TotalTorqueDemand * r.ElectricMotor?.AvgDrivetrainSpeed).Value(); } ); } catch (VectoSearchAbortedException) { diff --git a/VectoCore/VectoCore/Models/Simulation/Impl/PCCSegmentPreprocessor.cs b/VectoCore/VectoCore/Models/Simulation/Impl/PCCSegmentPreprocessor.cs index ccf73c17abea8d965dc8ad04b394cc8b97347178..ed71897e07d29fb60bc5cd281304333a786f33f5 100644 --- a/VectoCore/VectoCore/Models/Simulation/Impl/PCCSegmentPreprocessor.cs +++ b/VectoCore/VectoCore/Models/Simulation/Impl/PCCSegmentPreprocessor.cs @@ -36,15 +36,13 @@ namespace TUGraz.VectoCore.Models.Simulation.Impl var runData = Container.RunData; - var electricEngineDrag = runData.ElectricMachinesData.Sum(e => - e.Item2.EfficiencyData.VoltageLevels[0].DragCurve.Entries.Average(x => - (x.MotorSpeed * x.DragTorque).Value())).SI<Watt>(); + var combustionEngineDrag = runData.EngineData?.FullLoadCurves[0].FullLoadEntries.Average(x => (x.EngineSpeed * x.TorqueDrag).Value()).SI<Watt>() ?? 0.SI<Watt>(); - var engineDrag = electricEngineDrag + combustionEngineDrag; + var engineDrag = combustionEngineDrag; var slopeEngineDrag = 0.0; if (runData.GearboxData != null && runData.GearboxData.Type.AutomaticTransmission()) { if ((runData.VehicleData.ADAS.EcoRoll != EcoRollType.None && runData.GearboxData.ATEcoRollReleaseLockupClutch) || diff --git a/VectoCore/VectoCore/Models/Simulation/Impl/PowertrainBuilder.cs b/VectoCore/VectoCore/Models/Simulation/Impl/PowertrainBuilder.cs index 88b3996e4d92e09f6ed2676422cf18cebe2bd9dd..8fe1353bff1da902faeb23d8818a5f8bd8fb9300 100644 --- a/VectoCore/VectoCore/Models/Simulation/Impl/PowertrainBuilder.cs +++ b/VectoCore/VectoCore/Models/Simulation/Impl/PowertrainBuilder.cs @@ -804,7 +804,7 @@ namespace TUGraz.VectoCore.Models.Simulation.Impl aux.AddConstant("P_aux_el", data.ElectricAuxDemand ?? 0.SI<Watt>()); es.Connect(aux); - var ctl = new SimpleElectricMotorControl(); + var ctl = new DummyElectricMotorControl(); var powertrain = vehicle .AddComponent(new Wheels(container, data.VehicleData.DynamicTyreRadius, data.VehicleData.WheelsInertia)) .AddComponent(new Brakes(container)); @@ -1139,6 +1139,19 @@ namespace TUGraz.VectoCore.Models.Simulation.Impl } } + public class DummyElectricMotorControl : IElectricMotorControl + { + #region Implementation of IElectricMotorControl + + public NewtonMeter MechanicalAssistPower(Second absTime, Second dt, NewtonMeter outTorque, PerSecond prevOutAngularVelocity, PerSecond currOutAngularVelocity, NewtonMeter maxDriveTorque, NewtonMeter maxRecuperationTorque, PowertrainPosition position, bool dryRun) { + return EmTorque; + } + + public NewtonMeter EmTorque; + + #endregion + } + internal class DummyDriverInfo : VectoSimulationComponent, IDriverInfo diff --git a/VectoCore/VectoCore/Models/SimulationComponent/Impl/ElectricMotor.cs b/VectoCore/VectoCore/Models/SimulationComponent/Impl/ElectricMotor.cs index 804ed23585337455d1f5073b487740e654767cf5..ce2a7da88666c6ae658a157ebcdc022529a64c97 100644 --- a/VectoCore/VectoCore/Models/SimulationComponent/Impl/ElectricMotor.cs +++ b/VectoCore/VectoCore/Models/SimulationComponent/Impl/ElectricMotor.cs @@ -23,7 +23,7 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl { protected IElectricSystem ElectricPower; - protected IElectricMotorControl Control; + internal IElectricMotorControl Control { get; } protected ElectricMotorData ModelData; private PerSecond _maxSpeed; @@ -304,7 +304,6 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl Engine = { EngineSpeed = avgDtSpeed}, ElectricMotor = { ElectricMotorPowerMech = (inTorqueDt - outTorque) * avgDtSpeed, - TotalTorqueDemand = inTorqueDt, }, DeltaFullLoad = remainingPower, DeltaDragLoad = remainingPower, @@ -322,7 +321,6 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl retVal = new ResponseSuccess(this) { ElectricMotor = { ElectricMotorPowerMech = (inTorqueDt - outTorque) * avgDtSpeed, - TotalTorqueDemand = inTorqueDt }, Engine = { PowerRequest = 0.SI<Watt>(), @@ -347,9 +345,10 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl } else { retVal = NextComponent.Request(absTime, dt, inTorqueDt / ratio, outAngularVelocity * ratio, dryRun); retVal.ElectricMotor.ElectricMotorPowerMech = (inTorqueDt - outTorque) * avgDtSpeed; - retVal.ElectricMotor.TotalTorqueDemand = inTorqueDt; } + retVal.ElectricMotor.TotalTorqueDemand = inTorqueDt; + retVal.ElectricMotor.MaxDriveTorque = maxDriveTorqueDt; retVal.ElectricMotor.MaxDriveTorqueEM = maxDriveTorqueEm; retVal.ElectricMotor.MaxRecuperationTorque = maxRecuperationTorqueDt;