diff --git a/VectoCore/VectoCore/OutputData/SummaryDataContainer.cs b/VectoCore/VectoCore/OutputData/SummaryDataContainer.cs index 7a69faf093e6c94035e30fd0dcd67f9ff55a6667..38be1b2c9df90d7169955c1815aa4a6a1febbf5a 100644 --- a/VectoCore/VectoCore/OutputData/SummaryDataContainer.cs +++ b/VectoCore/VectoCore/OutputData/SummaryDataContainer.cs @@ -309,109 +309,10 @@ namespace TUGraz.VectoCore.OutputData var vehicleLoading = 0.SI<Kilogram>(); var cargoVolume = 0.SI<CubicMeter>(); - uint gearCount = 0u; + var gearCount = 0u; if (runData.Cycle.CycleType != CycleType.EngineOnly) { - row[VEHICLE_MANUFACTURER] = runData.VehicleData.Manufacturer; - row[VIN_NUMBER] = runData.VehicleData.VIN; - row[VEHICLE_MODEL] = runData.VehicleData.ModelName; - - row[HDV_CO2_VEHICLE_CLASS] = runData.VehicleData.VehicleClass.GetClassNumber(); - row[CURB_MASS] = runData.VehicleData.CurbWeight; - // - (runData.VehicleData.BodyAndTrailerWeight ?? 0.SI<Kilogram>()); - row[LOADING] = runData.VehicleData.Loading; - row[CARGO_VOLUME] = runData.VehicleData.CargoVolume; - - row[TOTAL_VEHICLE_MASS] = runData.VehicleData.TotalVehicleWeight; - row[ENGINE_MANUFACTURER] = runData.EngineData.Manufacturer; - row[ENGINE_MODEL] = runData.EngineData.ModelName; - row[ENGINE_FUEL_TYPE] = runData.EngineData.FuelType.GetLabel(); - row[ENGINE_RATED_POWER] = runData.EngineData.RatedPowerDeclared != null - ? runData.EngineData.RatedPowerDeclared.ConvertTo().Kilo.Watt - : runData.EngineData.FullLoadCurves[0].MaxPower.ConvertTo().Kilo.Watt; - row[ENGINE_IDLING_SPEED] = runData.EngineData.IdleSpeed.AsRPM.SI<Scalar>(); - row[ENGINE_RATED_SPEED] = runData.EngineData.RatedSpeedDeclared != null - ? runData.EngineData.RatedSpeedDeclared.AsRPM.SI<Scalar>() - : runData.EngineData.FullLoadCurves[0].RatedSpeed.AsRPM.SI<Scalar>(); - row[ENGINE_DISPLACEMENT] = runData.EngineData.Displacement.ConvertTo().Cubic.Centi.Meter; - - row[ENGINE_WHTC_URBAN] = runData.EngineData.WHTCUrban; - row[ENGINE_WHTC_RURAL] = runData.EngineData.WHTCRural; - row[ENGINE_WHTC_MOTORWAY] = runData.EngineData.WHTCMotorway; - row[ENGINE_BF_COLD_HOT] = runData.EngineData.ColdHotCorrectionFactor; - row[ENGINE_CF_REG_PER] = runData.EngineData.CorrectionFactorRegPer; - row[ENGINE_ACTUAL_CORRECTION_FACTOR] = runData.EngineData.FuelConsumptionCorrectionFactor; - - row[CD_x_A] = runData.AirdragData.CrossWindCorrectionCurve.AirDragArea; - - row[ROLLING_RESISTANCE_COEFFICIENT_WO_TRAILER] = - runData.VehicleData.RollResistanceCoefficientWithoutTrailer; - row[ROLLING_RESISTANCE_COEFFICIENT_W_TRAILER] = - runData.VehicleData.TotalRollResistanceCoefficient; - - row[R_DYN] = runData.VehicleData.DynamicTyreRadius; - - row[GEARBOX_MANUFACTURER] = runData.GearboxData.Manufacturer; - row[GEARBOX_MODEL] = runData.GearboxData.ModelName; - row[GEARBOX_TYPE] = runData.GearboxData.Type; - if (runData.GearboxData.Type.AutomaticTransmission()) { - row[GEAR_RATIO_FIRST_GEAR] = runData.GearboxData.Gears.Count > 0 - ? (double.IsNaN(runData.GearboxData.Gears.First().Value.Ratio) - ? runData.GearboxData.Gears.First().Value.TorqueConverterRatio.SI<Scalar>() - : runData.GearboxData.Gears.First().Value.Ratio.SI<Scalar>()) - : 0.SI<Scalar>(); - row[GEAR_RATIO_LAST_GEAR] = runData.GearboxData.Gears.Count > 0 - ? runData.GearboxData.Gears.Last().Value.Ratio.SI<Scalar>() - : 0.SI<Scalar>(); - row[TORQUECONVERTER_MANUFACTURER] = runData.GearboxData.TorqueConverterData.Manufacturer; - row[TORQUECONVERTER_MODEL] = runData.GearboxData.TorqueConverterData.ModelName; - } else { - row[GEAR_RATIO_FIRST_GEAR] = runData.GearboxData.Gears.Count > 0 - ? runData.GearboxData.Gears.First().Value.Ratio.SI<Scalar>() - : 0.SI<Scalar>(); - row[GEAR_RATIO_LAST_GEAR] = runData.GearboxData.Gears.Count > 0 - ? runData.GearboxData.Gears.Last().Value.Ratio.SI<Scalar>() - : 0.SI<Scalar>(); - row[TORQUECONVERTER_MANUFACTURER] = "n.a."; - row[TORQUECONVERTER_MODEL] = "n.a."; - } - row[RETARDER_TYPE] = runData.Retarder.Type.GetLabel(); - if (runData.Retarder.Type.IsDedicatedComponent()) { - row[RETARDER_MANUFACTURER] = runData.Retarder.Manufacturer; - row[RETARDER_MODEL] = runData.Retarder.ModelName; - } else { - row[RETARDER_MANUFACTURER] = "n.a."; - row[RETARDER_MODEL] = "n.a."; - } - - if (runData.AngledriveData != null) { - row[ANGLEDRIVE_MANUFACTURER] = runData.AngledriveData.Manufacturer; - row[ANGLEDRIVE_MODEL] = runData.AngledriveData.ModelName; - row[ANGLEDRIVE_RATIO] = runData.AngledriveData.Angledrive.Ratio; - } else { - row[ANGLEDRIVE_MANUFACTURER] = "n.a."; - row[ANGLEDRIVE_MODEL] = "n.a."; - row[ANGLEDRIVE_RATIO] = "n.a."; - } - - row[AXLE_MANUFACTURER] = runData.AxleGearData.Manufacturer; - row[AXLE_MODEL] = runData.AxleGearData.ModelName; - row[AXLE_RATIO] = runData.AxleGearData.AxleGear.Ratio.SI<Scalar>(); - - foreach (var aux in runData.Aux) { - if (aux.ID == Constants.Auxiliaries.IDs.PTOConsumer || aux.ID == Constants.Auxiliaries.IDs.PTOTransmission) { - continue; - } - var colName = string.Format(AUX_TECH_FORMAT, aux.ID); - - if (!Table.Columns.Contains(colName)) { - var col = Table.Columns.Add(colName, typeof(string)); - // move the new column to correct position - col.SetOrdinal(Table.Columns[CARGO_VOLUME].Ordinal); - } - - row[colName] = aux.Technology == null ? "" : string.Join("; ", aux.Technology); - } - + WriteFullPowertrain(runData, row); + cargoVolume = runData.VehicleData.CargoVolume; vehicleLoading = runData.VehicleData.Loading; gearCount = (uint)runData.GearboxData.Gears.Count; @@ -431,48 +332,10 @@ namespace TUGraz.VectoCore.OutputData row[SPEED] = speed.ConvertTo().Kilo.Meter.Per.Hour; } - row[ALTITUDE_DELTA] = modData.AltitudeDelta(); - - row[FCMAP_H] = modData.FCMapPerSecond().ConvertTo().Gramm.Per.Hour; - var fcMapPerMeter = modData.FCMapPerMeter(); - if (fcMapPerMeter != null) { - row[FCMAP_KM] = fcMapPerMeter.ConvertTo().Gramm.Per.Kilo.Meter; - } - - row[FCAUXC_H] = modData.FuelConsumptionAuxStartStopPerSecond().ConvertTo().Gramm.Per.Hour; - var fuelConsumptionAuxStartStopCorrected = modData.FuelConsumptionAuxStartStop(); - if (fuelConsumptionAuxStartStopCorrected != null) { - row[FCAUXC_KM] = fuelConsumptionAuxStartStopCorrected.ConvertTo().Gramm.Per.Kilo.Meter; - } - - row[FCWHTCC_H] = modData.FuelConsumptionWHTCPerSecond().ConvertTo().Gramm.Per.Hour; - var fuelConsumptionWHTCCorrected = modData.FuelConsumptionWHTC(); - if (fuelConsumptionWHTCCorrected != null) { - row[FCWHTCC_KM] = fuelConsumptionWHTCCorrected.ConvertTo().Gramm.Per.Kilo.Meter; - } - - row[FCAAUX_H] = modData.FuelConsumptionAAUXPerSecond().ConvertTo().Gramm.Per.Hour; - var fuelConsumptionAaux = modData.FuelConsumptionAAUX(); - if (fuelConsumptionAaux != null) { - row[FCAAUX_KM] = fuelConsumptionAaux.ConvertTo().Gramm.Per.Kilo.Meter; - } - - row[FCFINAL_H] = modData.FuelConsumptionFinalPerSecond().ConvertTo().Gramm.Per.Hour; - var fcfinal = modData.FuelConsumptionFinal(); - if (fcfinal != null) { - row[FCFINAL_KM] = fcfinal.ConvertTo().Gramm.Per.Kilo.Meter; - } - - var fcPer100lkm = modData.FuelConsumptionFinalLiterPer100Kilometer(); - row[FCFINAL_LITERPER100KM] = fcPer100lkm; - if (vehicleLoading != null && !vehicleLoading.IsEqual(0) && fcPer100lkm != null) { - row[FCFINAL_LITERPER100TKM] = fcPer100lkm / - vehicleLoading.ConvertTo().Ton; - } - if (cargoVolume > 0 && fcPer100lkm != null) { - row[FCFINAL_LiterPer100M3KM] = fcPer100lkm / cargoVolume; - } - + row[ALTITUDE_DELTA] = modData.AltitudeDelta(); + + WriteFuelconsumptionEntries(modData, row, vehicleLoading, cargoVolume); + var kilogramPerMeter = modData.CO2PerMeter(); if (kilogramPerMeter != null) { row[CO2_KM] = kilogramPerMeter.ConvertTo().Gramm.Per.Kilo.Meter; @@ -488,91 +351,260 @@ namespace TUGraz.VectoCore.OutputData row[P_FCMAP_POS] = modData.TotalPowerEnginePositiveAverage().ConvertTo().Kilo.Watt; - foreach (var aux in modData.Auxiliaries) { - string colName; - if (aux.Key == Constants.Auxiliaries.IDs.PTOConsumer || aux.Key == Constants.Auxiliaries.IDs.PTOTransmission) { - colName = string.Format(E_FORMAT, aux.Key); - } else { - colName = string.Format(E_AUX_FORMAT, aux.Key); - } - - if (!Table.Columns.Contains(colName)) { - var col = Table.Columns.Add(colName, typeof(SI)); - // move the new column to correct position - col.SetOrdinal(Table.Columns[E_AUX].Ordinal); - } - - row[colName] = modData.AuxiliaryWork(aux.Value).ConvertTo().Kilo.Watt.Hour; - } - - row[E_FCMAP_POS] = modData.TotalEngineWorkPositive().ConvertTo().Kilo.Watt.Hour; - row[E_FCMAP_NEG] = -modData.TotalEngineWorkNegative().ConvertTo().Kilo.Watt.Hour; - row[E_POWERTRAIN_INERTIA] = modData.PowerAccelerations().ConvertTo().Kilo.Watt.Hour; - row[E_AUX] = modData.WorkAuxiliaries().ConvertTo().Kilo.Watt.Hour; - row[E_CLUTCH_LOSS] = modData.WorkClutch().ConvertTo().Kilo.Watt.Hour; - row[E_TC_LOSS] = modData.WorkTorqueConverter().ConvertTo().Kilo.Watt.Hour; - row[E_SHIFT_LOSS] = modData.WorkGearshift().ConvertTo().Kilo.Watt.Hour; - row[E_GBX_LOSS] = modData.WorkGearbox().ConvertTo().Kilo.Watt.Hour; - row[E_RET_LOSS] = modData.WorkRetarder().ConvertTo().Kilo.Watt.Hour; - row[E_AXL_LOSS] = modData.WorkAxlegear().ConvertTo().Kilo.Watt.Hour; - row[E_ANGLE_LOSS] = modData.WorkAngledrive().ConvertTo().Kilo.Watt.Hour; - row[E_BRAKE] = modData.WorkTotalMechanicalBrake().ConvertTo().Kilo.Watt.Hour; - row[E_VEHICLE_INERTIA] = modData.WorkVehicleInertia().ConvertTo().Kilo.Watt.Hour; - row[E_AIR] = modData.WorkAirResistance().ConvertTo().Kilo.Watt.Hour; - row[E_ROLL] = modData.WorkRollingResistance().ConvertTo().Kilo.Watt.Hour; - row[E_GRAD] = modData.WorkRoadGradientResistance().ConvertTo().Kilo.Watt.Hour; + WriteAuxiliaries(modData, row); + WriteWorkEntries(modData, row); + //var acc = modData.AccelerationPer3Seconds(); - row[ACC] = modData.AccelerationAverage(); - row[ACC_POS] = modData.AccelerationsPositive(); - row[ACC_NEG] = modData.AccelerationsNegative(); - var accTimeShare = modData.AccelerationTimeShare(); - row[ACC_TIMESHARE] = accTimeShare; - var decTimeShare = modData.DecelerationTimeShare(); - row[DEC_TIMESHARE] = decTimeShare; - var cruiseTimeShare = modData.CruiseTimeShare(); - row[CRUISE_TIMESHARE] = cruiseTimeShare; - var stopTimeShare = modData.StopTimeShare(); - row[STOP_TIMESHARE] = stopTimeShare; - - row[MAX_SPEED] = modData.MaxSpeed().AsKmph.SI<Scalar>(); - row[MAX_ACCELERATION] = modData.MaxAcceleration(); - row[MAX_DECELERATION] = modData.MaxDeceleration(); - row[AVG_ENGINE_SPEED] = modData.AvgEngineSpeed().AsRPM.SI<Scalar>(); - row[MAX_ENGINE_SPEED] = modData.MaxEngineSpeed().AsRPM.SI<Scalar>(); - + WritePerformanceEntries(modData, row); + row[ENGINE_FULL_LOAD_TIME_SHARE] = modData.EngineMaxLoadTimeShare(); row[COASTING_TIME_SHARE] = modData.CoastingTimeShare(); row[BRAKING_TIME_SHARE] = modData.BrakingTimeShare(); + if (gearCount <= 0) { return; } - row[NUM_GEARSHIFTS] = modData.GearshiftCount(); - var timeSharePerGear = modData.TimeSharePerGear(gearCount); - - for (uint i = 0; i <= gearCount; i++) { - var colName = string.Format(TIME_SHARE_PER_GEAR_FORMAT, i); - if (!Table.Columns.Contains(colName)) { - Table.Columns.Add(colName, typeof(SI)); - } - row[colName] = timeSharePerGear[i]; - } - if (accTimeShare != null && decTimeShare != null && cruiseTimeShare != null) { - var shareSum = accTimeShare + decTimeShare + cruiseTimeShare + stopTimeShare; - if (!shareSum.IsEqual(100)) { - Log.Error( - "Sumfile Error: driving behavior timeshares must sum up to 100%: acc: {0}%, dec: {1}%, cruise: {2}%, stop: {3}%, sum: {4}%", - accTimeShare.ToOutputFormat(1, null, false), decTimeShare.ToOutputFormat(1, null, false), - cruiseTimeShare.ToOutputFormat(1, null, false), stopTimeShare.ToOutputFormat(1, null, false), - shareSum.ToOutputFormat(1, null, false)); - } - } - } - + WriteGearshiftStats(modData, row, gearCount); + } + + private static void WriteFuelconsumptionEntries(IModalDataContainer modData, DataRow row, Kilogram vehicleLoading, + CubicMeter cargoVolume) + { + row[FCMAP_H] = modData.FCMapPerSecond().ConvertTo().Gramm.Per.Hour; + var fcMapPerMeter = modData.FCMapPerMeter(); + if (fcMapPerMeter != null) { + row[FCMAP_KM] = fcMapPerMeter.ConvertTo().Gramm.Per.Kilo.Meter; + } + + row[FCAUXC_H] = modData.FuelConsumptionAuxStartStopPerSecond().ConvertTo().Gramm.Per.Hour; + var fuelConsumptionAuxStartStopCorrected = modData.FuelConsumptionAuxStartStop(); + if (fuelConsumptionAuxStartStopCorrected != null) { + row[FCAUXC_KM] = fuelConsumptionAuxStartStopCorrected.ConvertTo().Gramm.Per.Kilo.Meter; + } + + row[FCWHTCC_H] = modData.FuelConsumptionWHTCPerSecond().ConvertTo().Gramm.Per.Hour; + var fuelConsumptionWHTCCorrected = modData.FuelConsumptionWHTC(); + if (fuelConsumptionWHTCCorrected != null) { + row[FCWHTCC_KM] = fuelConsumptionWHTCCorrected.ConvertTo().Gramm.Per.Kilo.Meter; + } + + row[FCAAUX_H] = modData.FuelConsumptionAAUXPerSecond().ConvertTo().Gramm.Per.Hour; + var fuelConsumptionAaux = modData.FuelConsumptionAAUX(); + if (fuelConsumptionAaux != null) { + row[FCAAUX_KM] = fuelConsumptionAaux.ConvertTo().Gramm.Per.Kilo.Meter; + } + + row[FCFINAL_H] = modData.FuelConsumptionFinalPerSecond().ConvertTo().Gramm.Per.Hour; + var fcfinal = modData.FuelConsumptionFinal(); + if (fcfinal != null) { + row[FCFINAL_KM] = fcfinal.ConvertTo().Gramm.Per.Kilo.Meter; + } + + var fcPer100lkm = modData.FuelConsumptionFinalLiterPer100Kilometer(); + row[FCFINAL_LITERPER100KM] = fcPer100lkm; + if (vehicleLoading != null && !vehicleLoading.IsEqual(0) && fcPer100lkm != null) { + row[FCFINAL_LITERPER100TKM] = fcPer100lkm / + vehicleLoading.ConvertTo().Ton; + } + if (cargoVolume > 0 && fcPer100lkm != null) { + row[FCFINAL_LiterPer100M3KM] = fcPer100lkm / cargoVolume; + } + } + + private void WriteAuxiliaries(IModalDataContainer modData, DataRow row) + { + foreach (var aux in modData.Auxiliaries) { + string colName; + if (aux.Key == Constants.Auxiliaries.IDs.PTOConsumer || aux.Key == Constants.Auxiliaries.IDs.PTOTransmission) { + colName = string.Format(E_FORMAT, aux.Key); + } else { + colName = string.Format(E_AUX_FORMAT, aux.Key); + } + + if (!Table.Columns.Contains(colName)) { + var col = Table.Columns.Add(colName, typeof(SI)); + // move the new column to correct position + col.SetOrdinal(Table.Columns[E_AUX].Ordinal); + } + + row[colName] = modData.AuxiliaryWork(aux.Value).ConvertTo().Kilo.Watt.Hour; + } + } + + private void WriteGearshiftStats(IModalDataContainer modData, DataRow row, uint gearCount) + { + row[NUM_GEARSHIFTS] = modData.GearshiftCount(); + var timeSharePerGear = modData.TimeSharePerGear(gearCount); + + for (uint i = 0; i <= gearCount; i++) { + var colName = string.Format(TIME_SHARE_PER_GEAR_FORMAT, i); + if (!Table.Columns.Contains(colName)) { + Table.Columns.Add(colName, typeof(SI)); + } + row[colName] = timeSharePerGear[i]; + } + } + + private void WritePerformanceEntries(IModalDataContainer modData, DataRow row) + { + row[ACC] = modData.AccelerationAverage(); + row[ACC_POS] = modData.AccelerationsPositive(); + row[ACC_NEG] = modData.AccelerationsNegative(); + var accTimeShare = modData.AccelerationTimeShare(); + row[ACC_TIMESHARE] = accTimeShare; + var decTimeShare = modData.DecelerationTimeShare(); + row[DEC_TIMESHARE] = decTimeShare; + var cruiseTimeShare = modData.CruiseTimeShare(); + row[CRUISE_TIMESHARE] = cruiseTimeShare; + var stopTimeShare = modData.StopTimeShare(); + row[STOP_TIMESHARE] = stopTimeShare; + + row[MAX_SPEED] = modData.MaxSpeed().AsKmph.SI<Scalar>(); + row[MAX_ACCELERATION] = modData.MaxAcceleration(); + row[MAX_DECELERATION] = modData.MaxDeceleration(); + row[AVG_ENGINE_SPEED] = modData.AvgEngineSpeed().AsRPM.SI<Scalar>(); + row[MAX_ENGINE_SPEED] = modData.MaxEngineSpeed().AsRPM.SI<Scalar>(); + if (accTimeShare != null && decTimeShare != null && cruiseTimeShare != null) { + var shareSum = accTimeShare + decTimeShare + cruiseTimeShare + stopTimeShare; + if (!shareSum.IsEqual(100)) { + Log.Error( + "Sumfile Error: driving behavior timeshares must sum up to 100%: acc: {0}%, dec: {1}%, cruise: {2}%, stop: {3}%, sum: {4}%", + accTimeShare.ToOutputFormat(1, null, false), decTimeShare.ToOutputFormat(1, null, false), + cruiseTimeShare.ToOutputFormat(1, null, false), stopTimeShare.ToOutputFormat(1, null, false), + shareSum.ToOutputFormat(1, null, false)); + } + } + } + + private static void WriteWorkEntries(IModalDataContainer modData, DataRow row) + { + row[E_FCMAP_POS] = modData.TotalEngineWorkPositive().ConvertTo().Kilo.Watt.Hour; + row[E_FCMAP_NEG] = -modData.TotalEngineWorkNegative().ConvertTo().Kilo.Watt.Hour; + row[E_POWERTRAIN_INERTIA] = modData.PowerAccelerations().ConvertTo().Kilo.Watt.Hour; + row[E_AUX] = modData.WorkAuxiliaries().ConvertTo().Kilo.Watt.Hour; + row[E_CLUTCH_LOSS] = modData.WorkClutch().ConvertTo().Kilo.Watt.Hour; + row[E_TC_LOSS] = modData.WorkTorqueConverter().ConvertTo().Kilo.Watt.Hour; + row[E_SHIFT_LOSS] = modData.WorkGearshift().ConvertTo().Kilo.Watt.Hour; + row[E_GBX_LOSS] = modData.WorkGearbox().ConvertTo().Kilo.Watt.Hour; + row[E_RET_LOSS] = modData.WorkRetarder().ConvertTo().Kilo.Watt.Hour; + row[E_AXL_LOSS] = modData.WorkAxlegear().ConvertTo().Kilo.Watt.Hour; + row[E_ANGLE_LOSS] = modData.WorkAngledrive().ConvertTo().Kilo.Watt.Hour; + row[E_BRAKE] = modData.WorkTotalMechanicalBrake().ConvertTo().Kilo.Watt.Hour; + row[E_VEHICLE_INERTIA] = modData.WorkVehicleInertia().ConvertTo().Kilo.Watt.Hour; + row[E_AIR] = modData.WorkAirResistance().ConvertTo().Kilo.Watt.Hour; + row[E_ROLL] = modData.WorkRollingResistance().ConvertTo().Kilo.Watt.Hour; + row[E_GRAD] = modData.WorkRoadGradientResistance().ConvertTo().Kilo.Watt.Hour; + } + + private void WriteFullPowertrain(VectoRunData runData, DataRow row) + { + row[VEHICLE_MANUFACTURER] = runData.VehicleData.Manufacturer; + row[VIN_NUMBER] = runData.VehicleData.VIN; + row[VEHICLE_MODEL] = runData.VehicleData.ModelName; + + row[HDV_CO2_VEHICLE_CLASS] = runData.VehicleData.VehicleClass.GetClassNumber(); + row[CURB_MASS] = runData.VehicleData.CurbWeight; + // - (runData.VehicleData.BodyAndTrailerWeight ?? 0.SI<Kilogram>()); + row[LOADING] = runData.VehicleData.Loading; + row[CARGO_VOLUME] = runData.VehicleData.CargoVolume; + + row[TOTAL_VEHICLE_MASS] = runData.VehicleData.TotalVehicleWeight; + row[ENGINE_MANUFACTURER] = runData.EngineData.Manufacturer; + row[ENGINE_MODEL] = runData.EngineData.ModelName; + row[ENGINE_FUEL_TYPE] = runData.EngineData.FuelType.GetLabel(); + row[ENGINE_RATED_POWER] = runData.EngineData.RatedPowerDeclared != null + ? runData.EngineData.RatedPowerDeclared.ConvertTo().Kilo.Watt + : runData.EngineData.FullLoadCurves[0].MaxPower.ConvertTo().Kilo.Watt; + row[ENGINE_IDLING_SPEED] = runData.EngineData.IdleSpeed.AsRPM.SI<Scalar>(); + row[ENGINE_RATED_SPEED] = runData.EngineData.RatedSpeedDeclared != null + ? runData.EngineData.RatedSpeedDeclared.AsRPM.SI<Scalar>() + : runData.EngineData.FullLoadCurves[0].RatedSpeed.AsRPM.SI<Scalar>(); + row[ENGINE_DISPLACEMENT] = runData.EngineData.Displacement.ConvertTo().Cubic.Centi.Meter; + + row[ENGINE_WHTC_URBAN] = runData.EngineData.WHTCUrban; + row[ENGINE_WHTC_RURAL] = runData.EngineData.WHTCRural; + row[ENGINE_WHTC_MOTORWAY] = runData.EngineData.WHTCMotorway; + row[ENGINE_BF_COLD_HOT] = runData.EngineData.ColdHotCorrectionFactor; + row[ENGINE_CF_REG_PER] = runData.EngineData.CorrectionFactorRegPer; + row[ENGINE_ACTUAL_CORRECTION_FACTOR] = runData.EngineData.FuelConsumptionCorrectionFactor; + + row[CD_x_A] = runData.AirdragData.CrossWindCorrectionCurve.AirDragArea; + + row[ROLLING_RESISTANCE_COEFFICIENT_WO_TRAILER] = + runData.VehicleData.RollResistanceCoefficientWithoutTrailer; + row[ROLLING_RESISTANCE_COEFFICIENT_W_TRAILER] = + runData.VehicleData.TotalRollResistanceCoefficient; + + row[R_DYN] = runData.VehicleData.DynamicTyreRadius; + + row[GEARBOX_MANUFACTURER] = runData.GearboxData.Manufacturer; + row[GEARBOX_MODEL] = runData.GearboxData.ModelName; + row[GEARBOX_TYPE] = runData.GearboxData.Type; + if (runData.GearboxData.Type.AutomaticTransmission()) { + row[GEAR_RATIO_FIRST_GEAR] = runData.GearboxData.Gears.Count > 0 + ? (double.IsNaN(runData.GearboxData.Gears.First().Value.Ratio) + ? runData.GearboxData.Gears.First().Value.TorqueConverterRatio.SI<Scalar>() + : runData.GearboxData.Gears.First().Value.Ratio.SI<Scalar>()) + : 0.SI<Scalar>(); + row[GEAR_RATIO_LAST_GEAR] = runData.GearboxData.Gears.Count > 0 + ? runData.GearboxData.Gears.Last().Value.Ratio.SI<Scalar>() + : 0.SI<Scalar>(); + row[TORQUECONVERTER_MANUFACTURER] = runData.GearboxData.TorqueConverterData.Manufacturer; + row[TORQUECONVERTER_MODEL] = runData.GearboxData.TorqueConverterData.ModelName; + } else { + row[GEAR_RATIO_FIRST_GEAR] = runData.GearboxData.Gears.Count > 0 + ? runData.GearboxData.Gears.First().Value.Ratio.SI<Scalar>() + : 0.SI<Scalar>(); + row[GEAR_RATIO_LAST_GEAR] = runData.GearboxData.Gears.Count > 0 + ? runData.GearboxData.Gears.Last().Value.Ratio.SI<Scalar>() + : 0.SI<Scalar>(); + row[TORQUECONVERTER_MANUFACTURER] = "n.a."; + row[TORQUECONVERTER_MODEL] = "n.a."; + } + row[RETARDER_TYPE] = runData.Retarder.Type.GetLabel(); + if (runData.Retarder.Type.IsDedicatedComponent()) { + row[RETARDER_MANUFACTURER] = runData.Retarder.Manufacturer; + row[RETARDER_MODEL] = runData.Retarder.ModelName; + } else { + row[RETARDER_MANUFACTURER] = "n.a."; + row[RETARDER_MODEL] = "n.a."; + } + + if (runData.AngledriveData != null) { + row[ANGLEDRIVE_MANUFACTURER] = runData.AngledriveData.Manufacturer; + row[ANGLEDRIVE_MODEL] = runData.AngledriveData.ModelName; + row[ANGLEDRIVE_RATIO] = runData.AngledriveData.Angledrive.Ratio; + } else { + row[ANGLEDRIVE_MANUFACTURER] = "n.a."; + row[ANGLEDRIVE_MODEL] = "n.a."; + row[ANGLEDRIVE_RATIO] = "n.a."; + } + + row[AXLE_MANUFACTURER] = runData.AxleGearData.Manufacturer; + row[AXLE_MODEL] = runData.AxleGearData.ModelName; + row[AXLE_RATIO] = runData.AxleGearData.AxleGear.Ratio.SI<Scalar>(); + + foreach (var aux in runData.Aux) { + if (aux.ID == Constants.Auxiliaries.IDs.PTOConsumer || aux.ID == Constants.Auxiliaries.IDs.PTOTransmission) { + continue; + } + var colName = string.Format(AUX_TECH_FORMAT, aux.ID); + + if (!Table.Columns.Contains(colName)) { + var col = Table.Columns.Add(colName, typeof(string)); + // move the new column to correct position + col.SetOrdinal(Table.Columns[CARGO_VOLUME].Ordinal); + } + + row[colName] = aux.Technology == null ? "" : string.Join("; ", aux.Technology); + } + } + private static string ReplaceNotAllowedCharacters(string text) { return text.Replace('#', '_').Replace(',', '_').Replace('\n', '_').Replace('\r', '_');