diff --git a/VectoCore/VectoCore/InputData/Reader/Impl/DeclarationModeHeavyLorryVectoRunDataFactory.cs b/VectoCore/VectoCore/InputData/Reader/Impl/DeclarationModeHeavyLorryVectoRunDataFactory.cs index 4983d306d8131105fb25b88cb6746cfea4280a3c..3682cce8bcf1fdeee25d2eadfcb8bf0b242e05b8 100644 --- a/VectoCore/VectoCore/InputData/Reader/Impl/DeclarationModeHeavyLorryVectoRunDataFactory.cs +++ b/VectoCore/VectoCore/InputData/Reader/Impl/DeclarationModeHeavyLorryVectoRunDataFactory.cs @@ -71,7 +71,7 @@ namespace TUGraz.VectoCore.InputData.Reader.Impl if (!segment.Found) { throw new VectoException( - "no segment found for vehicle configruation: vehicle category: {0}, axle configuration: {1}, GVMR: {2}", + "no segment found for vehicle configuration: vehicle category: {0}, axle configuration: {1}, GVMR: {2}", vehicle.VehicleCategory, vehicle.AxleConfiguration, vehicle.GrossVehicleMassRating); } diff --git a/VectoCore/VectoCore/InputData/Reader/Impl/EngineeringModeVectoRunDataFactory.cs b/VectoCore/VectoCore/InputData/Reader/Impl/EngineeringModeVectoRunDataFactory.cs index 49691939756ec7b921e7f2aeea8c6c0bc70720fc..09ada9253aad937fd50b8ef91f6884dce60bdcb6 100644 --- a/VectoCore/VectoCore/InputData/Reader/Impl/EngineeringModeVectoRunDataFactory.cs +++ b/VectoCore/VectoCore/InputData/Reader/Impl/EngineeringModeVectoRunDataFactory.cs @@ -199,24 +199,28 @@ namespace TUGraz.VectoCore.InputData.Reader.Impl var crossWindRequired = vehicle.Components.AirdragInputData.CrossWindCorrectionMode == CrossWindCorrectionMode.VAirBetaLookupTable; var angledriveData = dao.CreateAngledriveData(vehicle.Components.AngledriveInputData); - var ptoTransmissionData = dao.CreatePTOTransmissionData(vehicle.Components.PTOTransmissionInputData); + var ptoTransmissionData = + dao.CreatePTOTransmissionData(vehicle.Components.PTOTransmissionInputData); - if (InputDataProvider.JobInputData.Vehicle.PTO_DriveGear != null && - InputDataProvider.JobInputData.Vehicle.PTO_DriveEngineSpeed != null) { - driver.PTODriveMinSpeed = InputDataProvider.JobInputData.Vehicle.PTO_DriveEngineSpeed / - axlegearData.AxleGear.Ratio / - gearboxData.Gears[InputDataProvider.JobInputData.Vehicle.PTO_DriveGear.Gear].Ratio / - (angledriveData?.Angledrive.Ratio ?? 1.0) * vehicle.DynamicTyreRadius; - driver.PTODriveRoadsweepingGear = InputDataProvider.JobInputData.Vehicle.PTO_DriveGear; - engineData.PTORoadSweepEngineSpeed = InputDataProvider.JobInputData.Vehicle.PTO_DriveEngineSpeed; - } + if (InputDataProvider.JobInputData.Vehicle.PTO_DriveGear != null && + InputDataProvider.JobInputData.Vehicle.PTO_DriveEngineSpeed != null) { + driver.PTODriveMinSpeed = InputDataProvider.JobInputData.Vehicle.PTO_DriveEngineSpeed / + axlegearData.AxleGear.Ratio / + gearboxData.Gears[InputDataProvider.JobInputData.Vehicle.PTO_DriveGear.Gear].Ratio / + (angledriveData?.Angledrive.Ratio ?? 1.0) * vehicle.DynamicTyreRadius; + driver.PTODriveRoadsweepingGear = InputDataProvider.JobInputData.Vehicle.PTO_DriveGear; + engineData.PTORoadSweepEngineSpeed = + InputDataProvider.JobInputData.Vehicle.PTO_DriveEngineSpeed; + } - var ptoCycleWhileDrive = - InputDataProvider.JobInputData.Vehicle.Components.PTOTransmissionInputData.PTOCycleWhileDriving != null - ? DrivingCycleDataReader.ReadFromDataTable( - InputDataProvider.JobInputData.Vehicle.Components.PTOTransmissionInputData.PTOCycleWhileDriving, - "PTO During Drive", false) - : null; + var ptoCycleWhileDrive = + InputDataProvider.JobInputData.Vehicle.Components.PTOTransmissionInputData + .PTOCycleWhileDriving != null + ? DrivingCycleDataReader.ReadFromDataTable( + InputDataProvider.JobInputData.Vehicle.Components.PTOTransmissionInputData + .PTOCycleWhileDriving, + "PTO During Drive", false) + : null; var drivingCycle = CyclesCache.ContainsKey(cycle.CycleData.Source) @@ -235,9 +239,24 @@ namespace TUGraz.VectoCore.InputData.Reader.Impl : VectoSimulationJobType.ConventionalVehicle; var vehicleData = dao.CreateVehicleData(vehicle); - + + var gearshiftParams = dao.CreateGearshiftData( + gearboxData.Type, InputDataProvider.DriverInputData.GearshiftInputData, + axlegearData.AxleGear.Ratio * (angledriveData?.Angledrive.Ratio ?? 1.0), + engineData.IdleSpeed); + if (gearshiftParams == null) { + gearshiftParams = new ShiftStrategyParameters() { + StartSpeed = DeclarationData.GearboxTCU.StartSpeed, + StartAcceleration = DeclarationData.GearboxTCU.StartAcceleration, + TimeBetweenGearshifts = DeclarationData.Gearbox.MinTimeBetweenGearshifts, + DownshiftAfterUpshiftDelay = DeclarationData.Gearbox.DownshiftAfterUpshiftDelay, + UpshiftAfterDownshiftDelay = DeclarationData.Gearbox.UpshiftAfterDownshiftDelay, + UpshiftMinAcceleration = DeclarationData.Gearbox.UpshiftMinAcceleration, + }; + } var hybridParameters = jobType == VectoSimulationJobType.ParallelHybridVehicle - ? dao.CreateHybridStrategyParameters(InputDataProvider.JobInputData.HybridStrategyParameters, vehicle.MaxPropulsionTorque, engineData) + ? dao.CreateHybridStrategyParameters(InputDataProvider.JobInputData.HybridStrategyParameters, + vehicle.MaxPropulsionTorque, engineData) : null; yield return new VectoRunData { JobName = InputDataProvider.JobInputData.JobName, @@ -250,7 +269,8 @@ namespace TUGraz.VectoCore.InputData.Reader.Impl AirdragData = dao.CreateAirdragData(vehicle.Components.AirdragInputData, vehicle), DriverData = driver, Aux = dao.CreateAuxiliaryData(vehicle.Components.AuxiliaryInputData), - BusAuxiliaries = dao.CreateBusAuxiliariesData(vehicle.Components.AuxiliaryInputData, vehicleData), + BusAuxiliaries = + dao.CreateBusAuxiliariesData(vehicle.Components.AuxiliaryInputData, vehicleData), Retarder = dao.CreateRetarderData(vehicle.Components.RetarderInputData), PTO = ptoTransmissionData, Cycle = new DrivingCycleProxy(drivingCycle, cycle.Name), @@ -260,12 +280,12 @@ namespace TUGraz.VectoCore.InputData.Reader.Impl HybridStrategyParameters = hybridParameters, BatteryData = battery, SuperCapData = superCap, - SimulationType = SimulationType.DistanceCycle | SimulationType.MeasuredSpeedCycle | SimulationType.PWheel, - GearshiftParameters = dao.CreateGearshiftData( - gearboxData.Type, InputDataProvider.DriverInputData.GearshiftInputData, - axlegearData.AxleGear.Ratio * (angledriveData?.Angledrive.Ratio ?? 1.0), engineData.IdleSpeed), + SimulationType = SimulationType.DistanceCycle | SimulationType.MeasuredSpeedCycle | + SimulationType.PWheel, + GearshiftParameters = gearshiftParams, ShiftStrategy = InputDataProvider.JobInputData.ShiftStrategy, - ElectricAuxDemand = InputDataProvider.JobInputData.Vehicle.Components.AuxiliaryInputData.Auxiliaries.ElectricPowerDemand, + ElectricAuxDemand = InputDataProvider.JobInputData.Vehicle.Components.AuxiliaryInputData + .Auxiliaries.ElectricPowerDemand, }; } } diff --git a/VectoCore/VectoCore/Models/Simulation/Impl/PowertrainBuilder.cs b/VectoCore/VectoCore/Models/Simulation/Impl/PowertrainBuilder.cs index 18563668ef1926b06cda542e47ebfec9a8055daf..fe9b3ebeab70c1adb172d91ff7368ed58beb4ac0 100644 --- a/VectoCore/VectoCore/Models/Simulation/Impl/PowertrainBuilder.cs +++ b/VectoCore/VectoCore/Models/Simulation/Impl/PowertrainBuilder.cs @@ -891,7 +891,7 @@ namespace TUGraz.VectoCore.Models.Simulation.Impl } rdSwpAux = new RoadSweeperAuxiliary(container); aux.Add(Constants.Auxiliaries.IDs.PTORoadsweeping, (nEng, absTime, dt, dryRun) => rdSwpAux.PowerDemand(nEng, absTime, dt, dryRun)); - container.ModalData.AddAuxiliary(Constants.Auxiliaries.IDs.PTORoadsweeping, Constants.Auxiliaries.PowerPrefix + Constants.Auxiliaries.IDs.PTORoadsweeping); + container.ModalData?.AddAuxiliary(Constants.Auxiliaries.IDs.PTORoadsweeping, Constants.Auxiliaries.PowerPrefix + Constants.Auxiliaries.IDs.PTORoadsweeping); } if (data.ExecutionMode == ExecutionMode.Engineering && @@ -902,7 +902,7 @@ namespace TUGraz.VectoCore.Models.Simulation.Impl ptoDrive = new PTODriveAuxiliary(container, data.PTOCycleWhileDrive); aux.Add(Constants.Auxiliaries.IDs.PTODuringDrive, (nEng, absTime, dt, dryRun) => ptoDrive.PowerDemand(nEng, absTime, dt, dryRun)); - container.ModalData.AddAuxiliary(Constants.Auxiliaries.IDs.PTODuringDrive, Constants.Auxiliaries.PowerPrefix + Constants.Auxiliaries.IDs.PTODuringDrive); + container.ModalData?.AddAuxiliary(Constants.Auxiliaries.IDs.PTODuringDrive, Constants.Auxiliaries.PowerPrefix + Constants.Auxiliaries.IDs.PTODuringDrive); } if (data.PTO != null) { aux.AddConstant(Constants.Auxiliaries.IDs.PTOTransmission, diff --git a/VectoCore/VectoCore/Models/SimulationComponent/Impl/AMTShiftStrategy.cs b/VectoCore/VectoCore/Models/SimulationComponent/Impl/AMTShiftStrategy.cs index 4e006c0efda9597e5ec4ebe7cd1d587e1f51defa..27e93468bf953ed15502d8bb7da80de417129a6f 100644 --- a/VectoCore/VectoCore/Models/SimulationComponent/Impl/AMTShiftStrategy.cs +++ b/VectoCore/VectoCore/Models/SimulationComponent/Impl/AMTShiftStrategy.cs @@ -69,7 +69,7 @@ namespace TUGraz.VectoCore.Models.SimulationComponent.Impl var minEngineSpeed = (runData.EngineData.FullLoadCurves[0].RatedSpeed - runData.EngineData.IdleSpeed) * Constants.SimulationSettings.ClutchClosingSpeedNorm + runData.EngineData.IdleSpeed; - DesiredGearRoadsweeping = runData.DriverData.PTODriveRoadsweepingGear; + DesiredGearRoadsweeping = runData.DriverData?.PTODriveRoadsweepingGear; MaxStartGear = GearboxModelData.GearList.First(); foreach (var gear in GearboxModelData.GearList.Reverse()) { diff --git a/VectoCore/VectoCoreTest/Integration/RoadSweepers/RoadSweeperTests.cs b/VectoCore/VectoCoreTest/Integration/RoadSweepers/RoadSweeperTests.cs index 5c1be0e5d4a49fb192d3d1a5b363e7696b5bf9f7..47e8f8d7a33b641535fd9ff7c68e9e4126f8bdc4 100644 --- a/VectoCore/VectoCoreTest/Integration/RoadSweepers/RoadSweeperTests.cs +++ b/VectoCore/VectoCoreTest/Integration/RoadSweepers/RoadSweeperTests.cs @@ -234,7 +234,7 @@ namespace TUGraz.VectoCore.Tests.Integration.RoadSweepers Vehicle = job.JobInputData.Vehicle, DriverInputData = job.DriverInputData, Cycles = (new[] {cycle}).ToList(), - PTOCycleWhileDrive = job.JobInputData.Vehicle.Components.PTOTransmissionInputData.PTOCycleWhileDriving + PTOCycleWhileDrive = job.JobInputData.Vehicle.Components.PTOTransmissionInputData.PTOCycleWhileDriving, }; diff --git a/VectoCore/VectoCoreTest/Integration/SimulationRuns/FullPowertrain.cs b/VectoCore/VectoCoreTest/Integration/SimulationRuns/FullPowertrain.cs index 3077cc353d21079f42518c4b2dbf17a5d5ec7c18..a4e46f489499a0966fe906469d1b5214188ea992 100644 --- a/VectoCore/VectoCoreTest/Integration/SimulationRuns/FullPowertrain.cs +++ b/VectoCore/VectoCoreTest/Integration/SimulationRuns/FullPowertrain.cs @@ -89,6 +89,7 @@ namespace TUGraz.VectoCore.Tests.Integration.SimulationRuns var runData = new VectoRunData() { JobName = "Coach_FullPowertrain_SimpleGearbox", + DriverData = driverData, EngineData = engineData, AxleGearData = axleGearData, GearboxData = gearboxData, diff --git a/VectoCore/VectoCoreTest/Models/SimulationComponent/DriverTest.cs b/VectoCore/VectoCoreTest/Models/SimulationComponent/DriverTest.cs index 7ca6db0912915c113b13084adf5d409c6333f87c..4cf4702964c30721f842134ba2bd0d20c80972e2 100644 --- a/VectoCore/VectoCoreTest/Models/SimulationComponent/DriverTest.cs +++ b/VectoCore/VectoCoreTest/Models/SimulationComponent/DriverTest.cs @@ -87,6 +87,7 @@ namespace TUGraz.VectoCore.Tests.Models.SimulationComponent var fileWriter = new FileOutputWriter("Coach_MinimalPowertrain_Coasting"); var runData = new VectoRunData() { JobName = "Coach_MinimalPowertrain_Coasting", + DriverData = driverData, VehicleData = vehicleData, AirdragData = airdragData, EngineData = engineData, @@ -94,8 +95,10 @@ namespace TUGraz.VectoCore.Tests.Models.SimulationComponent }; var modData = new ModalDataContainer(runData, fileWriter, null); var vehicleContainer = new VehicleContainer(ExecutionMode.Engineering, modData) { - RunData = runData + RunData = runData, }; + var mockCycle = new MockDrivingCycle(vehicleContainer, null); + var driver = new Driver(vehicleContainer, driverData, new DefaultDriverStrategy(vehicleContainer)); var engine = new CombustionEngine(vehicleContainer, engineData); var clutch = new Clutch(vehicleContainer, engineData); @@ -153,6 +156,7 @@ namespace TUGraz.VectoCore.Tests.Models.SimulationComponent var runData = new VectoRunData() { JobName = "Coach_MinimalPowertrain_Coasting", + DriverData = driverData, VehicleData = vehicleData, EngineData = engineData, }; @@ -160,6 +164,8 @@ namespace TUGraz.VectoCore.Tests.Models.SimulationComponent var vehicleContainer = new VehicleContainer(ExecutionMode.Engineering, modData) { RunData = runData }; + var mockCycle = new MockDrivingCycle(vehicleContainer, null); + var driver = new Driver(vehicleContainer, driverData, new DefaultDriverStrategy(vehicleContainer)); var engine = new CombustionEngine(vehicleContainer, engineData); var clutch = new Clutch(vehicleContainer, engineData); @@ -225,13 +231,16 @@ namespace TUGraz.VectoCore.Tests.Models.SimulationComponent VehicleData = vehicleData, AirdragData = airdragData, EngineData = engineData, - ElectricMachinesData = new List<Tuple<PowertrainPosition, ElectricMotorData>>() + ElectricMachinesData = new List<Tuple<PowertrainPosition, ElectricMotorData>>(), + DriverData = driverData, }; var modData = new ModalDataContainer(runData, fileWriter, null); var vehicleContainer = new VehicleContainer(ExecutionMode.Engineering, modData) { RunData = runData }; + var cycleData = DrivingCycleDataReader.ReadFromStream("s,v,grad,stop\n0,0,0,10\n10,20,0,0\n20,21,0,0\n30,22,0,0\n40,23,0,0\n50,24,0,0\n60,25,0,0\n70,26,0,0\n80,27,0,0\n90,28,0,0\n100,29,0,0".ToStream(), CycleType.DistanceBased, "DummyCycle", false); + var cycle = new MockDrivingCycle(vehicleContainer, cycleData); var brakes = new Brakes(vehicleContainer); var driver = new Driver(vehicleContainer, driverData, new DefaultDriverStrategy(vehicleContainer)); @@ -274,20 +283,23 @@ namespace TUGraz.VectoCore.Tests.Models.SimulationComponent [TestCase] public void DriverAccelerationTest() { + var driverData = MockSimulationDataFactory.CreateDriverDataFromFile(JobFile); + var cycleData = DrivingCycleDataReader.ReadFromStream("s,v,grad,stop\n0,0,0,10\n10,20,0,0\n20,21,0,0\n30,22,0,0\n40,23,0,0\n50,24,0,0\n60,25,0,0\n70,26,0,0\n80,27,0,0\n90,28,0,0\n100,29,0,0".ToStream(), CycleType.DistanceBased, "DummyCycle", false); var vehicleContainer = new VehicleContainer(ExecutionMode.Engineering) { RunData = new VectoRunData() { - VehicleData = new VehicleData() { VehicleCategory = VehicleCategory.RigidTruck}, + DriverData = driverData, + Cycle = cycleData, + VehicleData = new VehicleData() { VehicleCategory = VehicleCategory.RigidTruck }, } }; var vehicle = new MockVehicle(vehicleContainer); - var driverData = MockSimulationDataFactory.CreateDriverDataFromFile(JobFile); + var cycle = new MockDrivingCycle(vehicleContainer, cycleData); var driver = new Driver(vehicleContainer, driverData, new DefaultDriverStrategy(vehicleContainer)); new MockEngine(vehicleContainer); new EngineOnlyGearboxInfo(vehicleContainer); new ATClutchInfo(vehicleContainer); - var cycle = new MockDrivingCycle(vehicleContainer, null); var brakes = new Brakes(vehicleContainer); driver.Connect(vehicle.OutPort()); @@ -349,9 +361,13 @@ namespace TUGraz.VectoCore.Tests.Models.SimulationComponent [TestCase] public void DriverDecelerationTest() { + var driverData = MockSimulationDataFactory.CreateDriverDataFromFile(JobFile); + var cycleData = DrivingCycleDataReader.ReadFromStream("s,v,grad,stop\n0,0,0,10\n10,20,0,0\n20,21,0,0\n30,22,0,0\n40,23,0,0\n50,24,0,0\n60,25,0,0\n70,26,0,0\n80,27,0,0\n90,28,0,0\n100,29,0,0\n110,20,0,0\n120,21,0,0\n130,22,0,0\n140,23,0,0\n150,24,0,0\n160,25,0,0\n170,26,0,0\n180,27,0,0\n190,28,0,0\n200,29,0,0".ToStream(), CycleType.DistanceBased, "DummyCycle", false); var vehicleContainer = new VehicleContainer(ExecutionMode.Engineering) { RunData = new VectoRunData() { - VehicleData = new VehicleData() { VehicleCategory = VehicleCategory.RigidTruck } + VehicleData = new VehicleData() { VehicleCategory = VehicleCategory.RigidTruck }, + Cycle = cycleData, + DriverData = driverData } }; var vehicle = new MockVehicle(vehicleContainer); @@ -359,13 +375,9 @@ namespace TUGraz.VectoCore.Tests.Models.SimulationComponent new EngineOnlyGearboxInfo(vehicleContainer); new ATClutchInfo(vehicleContainer); - var driverData = MockSimulationDataFactory.CreateDriverDataFromFile(JobFile); - var cycleData = DrivingCycleDataReader.ReadFromStream("s,v,grad,stop\n0,0,0,10\n10,20,0,0\n20,21,0,0\n30,22,0,0\n40,23,0,0\n50,24,0,0\n60,25,0,0\n70,26,0,0\n80,27,0,0\n90,28,0,0\n100,29,0,0\n110,20,0,0\n120,21,0,0\n130,22,0,0\n140,23,0,0\n150,24,0,0\n160,25,0,0\n170,26,0,0\n180,27,0,0\n190,28,0,0\n200,29,0,0".ToStream(), CycleType.DistanceBased, "DummyCycle", false); + var cycle = new MockDrivingCycle(vehicleContainer, cycleData); var brakes = new Brakes(vehicleContainer); - vehicleContainer.RunData = new VectoRunData() { - Cycle = cycleData, - DriverData = driverData - }; + var driver = new Driver(vehicleContainer, driverData, new DefaultDriverStrategy(vehicleContainer)); driver.Connect(vehicle.OutPort()); diff --git a/VectoCore/VectoCoreTest/Models/SimulationComponent/GearboxTest.cs b/VectoCore/VectoCoreTest/Models/SimulationComponent/GearboxTest.cs index 5ffd39c97b833ef72dae97285b630fb1666fdd2a..df4c5cff9fe53af99fd093a2b712e6aa8a715fc7 100644 --- a/VectoCore/VectoCoreTest/Models/SimulationComponent/GearboxTest.cs +++ b/VectoCore/VectoCoreTest/Models/SimulationComponent/GearboxTest.cs @@ -566,6 +566,7 @@ namespace TUGraz.VectoCore.Tests.Models.SimulationComponent public void Gearbox_ShiftUp(int gear, int newGear, double tq, double n, Type responseType) { var gearboxData = MockSimulationDataFactory.CreateGearboxDataFromFile(GearboxDataFile, EngineDataFile); + var cycleData = DrivingCycleDataReader.ReadFromStream("s,v,grad,stop\n0,0,0,10\n10,20,0,0\n20,21,0,0\n30,22,0,0\n40,23,0,0\n50,24,0,0\n60,25,0,0\n70,26,0,0\n80,27,0,0\n90,28,0,0\n100,29,0,0".ToStream(), CycleType.DistanceBased, "DummyCycle", false); var container = new MockVehicleContainer() { VehicleSpeed = 10.SI<MeterPerSecond>(), DriverBehavior = DrivingBehavior.Driving, @@ -576,8 +577,13 @@ namespace TUGraz.VectoCore.Tests.Models.SimulationComponent TotalMass = 19000.SI<Kilogram>(), EngineSpeed = n.SI<PerSecond>(), RunData = GetDummyRunData(gearboxData), + CycleData = new CycleData() { + LeftSample = cycleData.Entries.First(), + }, HasCombustionEngine = true }; + var cycle = new MockDrivingCycle(container, cycleData); + var gearbox = new Gearbox(container, new AMTShiftStrategy(container)); var port = new MockTnOutPort() { EngineN95hSpeed = 2000.RPMtoRad() }; container.EngineInfo = port;