diff --git a/VECTO/Input Files/cDRI.vb b/VECTO/Input Files/cDRI.vb index 1b5c00101a49bf780f6954cfc25e8c45715966b6..39f66437cc14f376210840b2984f24d43ee5c1dd 100644 --- a/VECTO/Input Files/cDRI.vb +++ b/VECTO/Input Files/cDRI.vb @@ -58,6 +58,9 @@ Public Class cDRI ''' <remarks></remarks> Public Pvorg As Boolean + + Public PwheelVorg As Boolean + ''' <summary> ''' True= Cycle includes additional auxiliary power demand (not to be confused with auxiliary supply power). Defined in ReadFile. ''' </summary> @@ -125,6 +128,7 @@ Public Class cDRI Nvorg = False Gvorg = False Pvorg = False + PwheelVorg = False tDim = -1 t0 = 1 'Default if no time steps are defined in driving cycle AuxDef = False @@ -196,6 +200,7 @@ Public Class cDRI DRIcheck.Add(tDriComp.s, False) DRIcheck.Add(tDriComp.StopTime, False) DRIcheck.Add(tDriComp.Torque, False) + DRIcheck.Add(tDriComp.Pwheel, False) If file.EndOfFile Then WorkerMsg(tMsgID.Err, "Driving cycle invalid!", MsgSrc) @@ -276,6 +281,7 @@ Public Class cDRI GradVorg = DRIcheck(tDriComp.Grad) VairVorg = DRIcheck(tDriComp.VairVres) And DRIcheck(tDriComp.VairBeta) Mvorg = DRIcheck(tDriComp.Torque) + PwheelVorg = DRIcheck(tDriComp.Pwheel) If Mvorg And Pvorg Then WorkerMsg(tMsgID.Warn, "Engine torque and power defined in cycle! Torque will be ignored!", MsgSrc) diff --git a/VECTO/MODcalc/cMOD.vb b/VECTO/MODcalc/cMOD.vb index 448d2008c62d568939e64a19547429beb4ccb627..4fb1cff2d3f642fb1b2af46db9d4d2d369a05181 100644 --- a/VECTO/MODcalc/cMOD.vb +++ b/VECTO/MODcalc/cMOD.vb @@ -618,18 +618,37 @@ Public Class cMOD If Not VEC.EngOnly Then - 'distance - dist += .Vh.V(t) - s.Append(Sepp & dist) + If DRI.Vvorg Then - 'Actual-speed. - s.Append(Sepp & .Vh.V(t) * 3.6) + 'distance + dist += .Vh.V(t) + s.Append(Sepp & dist) - 'Target-speed - s.Append(Sepp & .Vh.Vsoll(t) * 3.6) + 'Actual-speed. + s.Append(Sepp & .Vh.V(t) * 3.6) + + 'Target-speed + s.Append(Sepp & .Vh.Vsoll(t) * 3.6) + + 'Acc. + s.Append(Sepp & .Vh.a(t)) + + Else + + 'distance + s.Append(Sepp & "-") + + 'Actual-speed. + s.Append(Sepp & "-") + + 'Target-speed + s.Append(Sepp & "-") + + 'Acc. + s.Append(Sepp & "-") + + End If - 'Acc. - s.Append(Sepp & .Vh.a(t)) 'Slope s.Append(Sepp & .Grad(t)) diff --git a/VECTO/MODcalc/cPower.vb b/VECTO/MODcalc/cPower.vb index 957b6611191b215b31dfe161c1fb98c463e6dd90..7991eda4a389efc35df9714e2f220800dcbf254b 100644 --- a/VECTO/MODcalc/cPower.vb +++ b/VECTO/MODcalc/cPower.vb @@ -45,6 +45,9 @@ Public Class cPower Private EngSideInertia As Single + Private PwheelVorg As Boolean + + Public Function PreRun() As Boolean Dim i As Integer Dim i0 As Integer @@ -494,11 +497,13 @@ Public Class cPower MsgSrc = "Power/Calc" 'Abort if no speed given - If Not DRI.Vvorg Then - WorkerMsg(tMsgID.Err, "Driving cycle is not valid! Vehicle Speed required.", MsgSrc) + If Not DRI.Vvorg And Not (DRI.PwheelVorg And DRI.Nvorg And DRI.Gvorg) Then + WorkerMsg(tMsgID.Err, "Driving cycle is not valid! Vehicle Speed required or Pwheel + Gear + Engine Speed.", MsgSrc) Return False End If + PwheelVorg = DRI.PwheelVorg + 'Messages If Not Cfg.DistCorr Then WorkerMsg(tMsgID.Warn, "Distance Correction is disabled!", MsgSrc) @@ -572,7 +577,7 @@ Public Class cPower FirstSecItar = True 'Secondary Progressbar - ProgBarCtrl.ProgJobInt = CInt((100 / ProgBarShare) * jz / MODdata.tDim + (100 - 100 / ProgBarShare)) + ProgBarCtrl.ProgJobInt = CInt((100 / ProgBarShare) * (jz + 1) / (MODdata.tDim + 1) + (100 - 100 / ProgBarShare)) ' Determine State @@ -583,8 +588,11 @@ lbGschw: 'Calculate Speed​/Acceleration ------------------- 'Now through DRI-class - Vact = Vh.V(jz) - aact = Vh.a(jz) + + If Not PwheelVorg Then + Vact = Vh.V(jz) + aact = Vh.a(jz) + End If 'distance dist = dist0 + Vact @@ -642,23 +650,37 @@ lbGschw: End If '--------------- + + 'Power demand at wheels + Pwheel = fPwheel(jz, Vh.fGrad(dist)) + 'Determine Driving-state ------------------------- Pplus = False Pminus = False - - If Vact < 0.0001 Then - VehState0 = tVehState.Stopped + If PwheelVorg Then + Select Case Pwheel + Case Is > 0.0001 + VehState0 = tVehState.Acc + Case Is < -0.0001 + VehState0 = tVehState.Dec + Case Else + VehState0 = tVehState.Stopped + End Select Else - If aact >= 0.01 Then - VehState0 = tVehState.Acc - ElseIf aact < -0.01 Then - VehState0 = tVehState.Dec + If Vact < 0.0001 Then + VehState0 = tVehState.Stopped Else - VehState0 = tVehState.Cruise + If aact >= 0.01 Then + VehState0 = tVehState.Acc + ElseIf aact < -0.01 Then + VehState0 = tVehState.Dec + Else + VehState0 = tVehState.Cruise + End If End If + End If - Pwheel = fPwheel(jz, Vh.fGrad(dist)) Select Case Pwheel Case Is > 0.0001 @@ -699,7 +721,7 @@ lbGschw: Else 'Check whether Clutch will slip (important for Gear-shifting model): - If Not GBX.TCon AndAlso fnn(Vact, 1, False) < ClutchNorm And Pplus Then + If Not GBX.TCon AndAlso fnn(Vact, 1, False) < ClutchNorm And Pplus And Not PwheelVorg Then Clutch = tEngClutch.Slipping Else Clutch = tEngClutch.Closed @@ -737,7 +759,7 @@ lbGschw: Else - If Not GBX.TCon AndAlso fnn(Vact, Gear, False) < ClutchNorm And Pplus And Not VehState0 = tVehState.Dec Then + If Not GBX.TCon AndAlso fnn(Vact, Gear, False) < ClutchNorm And Pplus And Not VehState0 = tVehState.Dec And Not PwheelVorg Then Clutch = tEngClutch.Slipping Else Clutch = tEngClutch.Closed @@ -747,6 +769,12 @@ lbGschw: End If + + If PwheelVorg Then + nU = MODdata.nUvorg(jz) + Vact = fV(nU, Gear) + End If + If Gear = -1 Then WorkerMsg(tMsgID.Err, "Error in Gear Shift Model!", MsgSrc & "/t= " & jz + 1) Return False @@ -1135,7 +1163,10 @@ lb_nOK: 'Check whether P above Full-load => Reduce Speed If P > Pmax Then If EngState0 = tEngState.Load Or EngState0 = tEngState.FullLoad Then - If Vact > 0.01 Then + If PwheelVorg Then + MODdata.Vh.Pwheel(jz) *= 0.999 + GoTo lbGschw + ElseIf Vact > 0.01 Then Vh.ReduceSpeed(jz, 0.9999) FirstSecItar = False GoTo lbGschw @@ -1144,6 +1175,7 @@ lb_nOK: WorkerMsg(tMsgID.Err, "Engine full load too low for vehicle start! Road gradient = " & Vh.fGrad(dist) & "[%] at " & dist.ToString("#.0") & "[m]", MsgSrc & "/t= " & jz + 1) Return False End If + Else 'tEngState.Idle, tEngState.Stopped, tEngState.Drag If FirstSecItar Then If P > 0.1 Then WorkerMsg(tMsgID.Warn, "Pwheel > 0 but EngState undefined ?!", MsgSrc & "/t= " & jz + 1) @@ -1171,11 +1203,12 @@ lb_nOK: TracIntrIs = 1 End If - Vrollout = fRolloutSpeed(jz, TracIntrIs, Vh.fGrad(dist)) - - If Vrollout < Vact Or VehState0 <> tVehState.Dec Then Vh.SetSpeed(jz, Vrollout) + If Not PwheelVorg Then + Vrollout = fRolloutSpeed(jz, TracIntrIs, Vh.fGrad(dist)) + If Vrollout < Vact Or VehState0 <> tVehState.Dec Then Vh.SetSpeed(jz, Vrollout) + GoTo lbGschw + End If - GoTo lbGschw End If @@ -1224,10 +1257,18 @@ lb_nOK: MODdata.EngState.Add(EngState0) - MODdata.Pa.Add(fPaFZ(MODdata.Vh.V(jz), MODdata.Vh.a(jz))) - MODdata.Pair.Add(fPair(MODdata.Vh.V(jz), jz)) - MODdata.Proll.Add(fPr(MODdata.Vh.V(jz), Vh.fGrad(dist))) - MODdata.Pstg.Add(fPs(MODdata.Vh.V(jz), Vh.fGrad(dist))) + If DRI.PwheelVorg Then + MODdata.Pa.Add(0) + MODdata.Pair.Add(0) + MODdata.Proll.Add(0) + MODdata.Pstg.Add(0) + Else + MODdata.Pa.Add(fPaFZ(MODdata.Vh.V(jz), MODdata.Vh.a(jz))) + MODdata.Pair.Add(fPair(MODdata.Vh.V(jz), jz)) + MODdata.Proll.Add(fPr(MODdata.Vh.V(jz), Vh.fGrad(dist))) + MODdata.Pstg.Add(fPs(MODdata.Vh.V(jz), Vh.fGrad(dist))) + End If + MODdata.Pbrake.Add(Pbrake) MODdata.Psum.Add(Pwheel) MODdata.PauxSum.Add(Paux) @@ -1302,14 +1343,18 @@ lb_nOK: TracIntrIs = 1 End If - Vrollout = fRolloutSpeed(jz + 1, TracIntrIs, Vh.fGrad(dist)) - If Vrollout < Vh.V(jz + 1) Or VehState0 <> tVehState.Dec Then Vh.SetSpeed(jz + 1, Vrollout) + If Not PwheelVorg Then + Vrollout = fRolloutSpeed(jz + 1, TracIntrIs, Vh.fGrad(dist)) + If Vrollout < Vh.V(jz + 1) Or VehState0 <> tVehState.Dec Then Vh.SetSpeed(jz + 1, Vrollout) + End If End If End If - If Vh.Vsoll(jz) - Vact > 1.5 Then SecSpeedRed += 1 + If Not PwheelVorg Then + If Vh.Vsoll(jz) - Vact > 1.5 Then SecSpeedRed += 1 + End If LastGearChange = -1 @@ -2235,6 +2280,10 @@ lb10: Return U End Function + Private Function fV(ByVal nU As Single, ByVal Gear As Integer) As Single + Return nU * (2 * VEH.rdyn * Math.PI / 1000) / (60.0 * GBX.Igetr(0) * GBX.Igetr(Gear)) + End Function + Private Function fnUout(ByVal V As Single, ByVal Gear As Integer) As Single Return V * 60.0 * GBX.Igetr(0) * GBX.Igetr(Gear) / (2 * VEH.rdyn * Math.PI / 1000) End Function @@ -2245,7 +2294,11 @@ lb10: '--------------Power before Diff = At Wheel ------------- Private Function fPwheel(ByVal t As Integer, ByVal Grad As Single) As Single - Return fPr(MODdata.Vh.V(t), Grad) + fPair(MODdata.Vh.V(t), t) + fPaFZ(MODdata.Vh.V(t), MODdata.Vh.a(t)) + fPs(MODdata.Vh.V(t), Grad) + If PwheelVorg Then + Return MODdata.Vh.Pwheel(t) + Else + Return fPr(MODdata.Vh.V(t), Grad) + fPair(MODdata.Vh.V(t), t) + fPaFZ(MODdata.Vh.V(t), MODdata.Vh.a(t)) + fPs(MODdata.Vh.V(t), Grad) + End If End Function Private Function fPwheel(ByVal t As Integer, ByVal v As Single, ByVal a As Single, ByVal Grad As Single) As Single diff --git a/VECTO/MODcalc/cVh.vb b/VECTO/MODcalc/cVh.vb index ca257cd9ef4e611858121567667a1d1953bdf789..e83d0cc55cc0085cbb90de38a05a4bb2f25243d6 100644 --- a/VECTO/MODcalc/cVh.vb +++ b/VECTO/MODcalc/cVh.vb @@ -20,6 +20,7 @@ Public Class cVh Private lPadd As List(Of Single) Private lVairVres As List(Of Single) Private lVairBeta As List(Of Single) + Public Pwheel As List(Of Single) Public EcoRoll As List(Of Boolean) 'Calculated @@ -50,6 +51,7 @@ Public Class cVh Weg = New List(Of Double) lVairVres = New List(Of Single) lVairBeta = New List(Of Single) + Pwheel = New List(Of Single) EcoRoll = New List(Of Boolean) NoDistCorr = New List(Of Boolean) iAlt = 1 @@ -69,6 +71,7 @@ Public Class cVh lVairVres = Nothing lVairBeta = Nothing EcoRoll = Nothing + Pwheel = Nothing NoDistCorr = Nothing End Sub @@ -111,7 +114,7 @@ Public Class cVh End If 'Altitude / distance - If Not DRI.Scycle Then + If Not DRI.Scycle And DRI.Vvorg Then L = DRI.Values(tDriComp.Alt) lAlt0.Add(0) ls0.Add(lV0(0)) @@ -178,6 +181,13 @@ Public Class cVh End If + If DRI.PwheelVorg Then + L = DRI.Values(tDriComp.Pwheel) + For s = 0 To MODdata.tDim + Pwheel.Add(L(s)) + Next + End If + For s = 0 To MODdata.tDim EcoRoll.Add(False) NoDistCorr.Add(False) @@ -356,9 +366,17 @@ Public Class cVh End If End Sub - Public Sub DistCorrInit() + Public Function DistCorrInit() As Boolean Dim i As Int16 + If Not Cfg.DistCorr Then Return True + + If Not DRI.Vvorg Then + WorkerMsg(tMsgID.Err, "Distance Correction not possible without speed input!", "DistCorrInit") + Return False + End If + + WegX = 0 dWegIst = 0 @@ -368,11 +386,15 @@ Public Class cVh WegV.Add(lV0(i)) Next - End Sub + Return True + + End Function Public Function DistCorrection(ByVal t As Integer, ByVal VehState As tVehState) As Boolean Dim v As Single + If Not DRI.Vvorg Then Return False + v = lV(t) dWegIst += v @@ -441,6 +463,7 @@ Public Class cVh lGears.Insert(t, lGears(t)) lPadd.Insert(t, lPadd(t)) EcoRoll.Insert(t, EcoRoll(t)) + Pwheel.Insert(t, Pwheel(t)) NoDistCorr.Insert(t, NoDistCorr(t)) If DRI.VairVorg Then @@ -471,6 +494,7 @@ Public Class cVh lGears.Insert(t, lGears(t)) lPadd.Insert(t, lPadd(t)) EcoRoll.Insert(t, EcoRoll(t)) + Pwheel.Insert(t, Pwheel(t)) NoDistCorr.Insert(t, NoDistCorr(t)) If DRI.VairVorg Then @@ -503,6 +527,7 @@ Public Class cVh lGears.RemoveAt(t) lPadd.RemoveAt(t) EcoRoll.RemoveAt(t) + Pwheel.RemoveAt(t) NoDistCorr.RemoveAt(t) If DRI.VairVorg Then @@ -572,6 +597,8 @@ Public Class cVh Dim dh As Single Dim ds As Single + If Not DRI.Vvorg Then Return 0 + If ls0(0) >= s Then i = 1 GoTo lbInt diff --git a/VECTO/M_MAIN.vb b/VECTO/M_MAIN.vb index 026c9ab013fc4808284d45f280c4a1fab025fe94..a5a52c23f82912f3b183abdd61457a8b91200864 100644 --- a/VECTO/M_MAIN.vb +++ b/VECTO/M_MAIN.vb @@ -439,9 +439,11 @@ lbSkip0: If MsgOut Then WorkerMsg(tMsgID.Normal, "Driving Cycle Preprocessing", MsgSrc) - If Not MODdata.Px.PreRun Then - CyclAbrtedByErr = True - GoTo lbAusg + If DRI.Vvorg Then + If Not MODdata.Px.PreRun Then + CyclAbrtedByErr = True + GoTo lbAusg + End If End If If VECTOworker.CancellationPending Then GoTo lbAbort @@ -450,7 +452,10 @@ lbSkip0: If MsgOut Then WorkerMsg(tMsgID.Normal, "Vehicle Calc", MsgSrc) - MODdata.Vh.DistCorrInit() + If Not MODdata.Vh.DistCorrInit() Then + CyclAbrtedByErr = True + GoTo lbAusg + End If If Not MODdata.Px.Calc() Then CyclAbrtedByErr = True @@ -461,7 +466,7 @@ lbSkip0: If VECTOworker.CancellationPending Then GoTo lbAbort 'Calculate CycleKin (for erg/sum, etc.) - MODdata.CylceKin.Calc() + If DRI.Vvorg Then MODdata.CylceKin.Calc() End If '---------------------------------------------------------------------------- diff --git a/VECTO/VECTO_Global.vb b/VECTO/VECTO_Global.vb index eea957f9fb43dd98610b4e3f12d22afa10acaeac..ce805abd7c49e45da96c5592e9959cdc12615ca3 100644 --- a/VECTO/VECTO_Global.vb +++ b/VECTO/VECTO_Global.vb @@ -121,6 +121,8 @@ Module VECTO_Global Return tDriComp.Torque Case sKey.DRI.Alt Return tDriComp.Alt + Case sKey.DRI.Pwheel + Return tDriComp.Pwheel Case Else Return tDriComp.Undefined @@ -639,6 +641,7 @@ Public Class csKey Public s As String = "<S>" Public StopTime As String = "<STOP>" Public Torque As String = "<ME>" + Public Pwheel As String = "<PWHEEL>" End Class Public Class csKeyAux diff --git a/VECTO/VECTO_Types.vb b/VECTO/VECTO_Types.vb index a9e3c58457083dafcb1f7e7a7a6532438990d17d..7dd59020ab2b3c1426057877d28ead30662a6d1c 100644 --- a/VECTO/VECTO_Types.vb +++ b/VECTO/VECTO_Types.vb @@ -67,6 +67,7 @@ Public Enum tDriComp s StopTime Torque + Pwheel End Enum Public Enum tVehState diff --git a/VECTO/cVSUM.vb b/VECTO/cVSUM.vb index 1a580798b33a7e87c32829f332cdf6c6942f41f2..70f522d149589c8487b104927652c66da0ad66a4 100644 --- a/VECTO/cVSUM.vb +++ b/VECTO/cVSUM.vb @@ -89,18 +89,21 @@ Class cVSUM If Not VEC.EngOnly Then 'Average-Speed. calculation - sum = 0 - For t = 0 To t1 - sum += MODdata.Vh.V(t) - Next - Vquer = 3.6 * sum / (t1 + 1) - - VSUMentries("\\S").ValueString = (Vquer * (t1 + 1) / 3600) - VSUMentries("\\V").ValueString = Vquer + If DRI.Vvorg Then + sum = 0 + For t = 0 To t1 + sum += MODdata.Vh.V(t) + Next + Vquer = 3.6 * sum / (t1 + 1) - 'altitude change - VSUMentries("\\G").ValueString = MODdata.Vh.AltIntp(Vquer * (t1 + 1) / 3.6, False) - MODdata.Vh.AltIntp(0, False) + VSUMentries("\\S").ValueString = (Vquer * (t1 + 1) / 3600) + VSUMentries("\\V").ValueString = Vquer + 'altitude change + VSUMentries("\\G").ValueString = MODdata.Vh.AltIntp(Vquer * (t1 + 1) / 3.6, False) - MODdata.Vh.AltIntp(0, False) + + End If + 'Auxiliary energy consumption If VEC.AuxDef Then For Each key In VEC.AuxPaths.Keys @@ -118,33 +121,26 @@ Class cVSUM 'FC If MODdata.FCerror Then - If VEC.EngOnly Then - VSUMentries("FC_h").ValueString = "ERROR" - Else - VSUMentries("FC_km").ValueString = "ERROR" - End If + VSUMentries("FC_h").ValueString = "ERROR" + + If Not VEC.EngOnly Then VSUMentries("FC_km").ValueString = "ERROR" If MODdata.FCAUXcSet Then - If VEC.EngOnly Then - VSUMentries("FC-AUXc_h").ValueString = "ERROR" - Else - VSUMentries("FC-AUXc_km").ValueString = "ERROR" - End If + VSUMentries("FC-AUXc_h").ValueString = "ERROR" + If Not VEC.EngOnly Then VSUMentries("FC-AUXc_km").ValueString = "ERROR" End If If Cfg.DeclMode Then - If VEC.EngOnly Then - VSUMentries("FC-WHTCc_h").ValueString = "ERROR" - Else - VSUMentries("FC-WHTCc_km").ValueString = "ERROR" - End If + VSUMentries("FC-WHTCc_h").ValueString = "ERROR" + If Not VEC.EngOnly Then VSUMentries("FC-WHTCc_km").ValueString = "ERROR" End If Else - If VEC.EngOnly Then - VSUMentries("FC_h").ValueString = MODdata.FCavg - Else + VSUMentries("FC_h").ValueString = MODdata.FCavg + + If Not VEC.EngOnly And DRI.Vvorg Then + VSUMentries("FC_km").ValueString = (MODdata.FCavg / Vquer) VSUMentries("FCl_km").ValueString = (100 * MODdata.FCavgFinal / Vquer) / (Cfg.FuelDens * 1000) '[l/100km] @@ -160,26 +156,15 @@ Class cVSUM End If If MODdata.FCAUXcSet Then - If VEC.EngOnly Then - VSUMentries("FC-AUXc_h").ValueString = MODdata.FCavgAUXc - Else - VSUMentries("FC-AUXc_km").ValueString = (MODdata.FCavgAUXc / Vquer) - End If + VSUMentries("FC-AUXc_h").ValueString = MODdata.FCavgAUXc + If Not VEC.EngOnly Then VSUMentries("FC-AUXc_km").ValueString = (MODdata.FCavgAUXc / Vquer) End If If Cfg.DeclMode Then - If VEC.EngOnly Then - VSUMentries("FC-WHTCc_h").ValueString = MODdata.FCavgWHTCc - Else - VSUMentries("FC-WHTCc_km").ValueString = (MODdata.FCavgWHTCc / Vquer) - End If + VSUMentries("FC-WHTCc_h").ValueString = MODdata.FCavgWHTCc + If Not VEC.EngOnly Then VSUMentries("FC-WHTCc_km").ValueString = (MODdata.FCavgWHTCc / Vquer) End If - - - - - End If 'Power, Revolutions @@ -452,11 +437,7 @@ Class cVSUM End If End Sub - ''' <summary> - ''' Initializes the specified job file. - ''' </summary> - ''' <param name="JobFile">The job file.</param> - ''' <returns></returns> + Public Function Init(ByVal JobFile As String) As Boolean Dim JobFiles As New List(Of String) Dim str As String @@ -640,11 +621,12 @@ Class cVSUM Return False End Try - If VEC0.EngOnly Then - AddToVSUM("FC_h", "FC", "[g/h]") - AddToVSUM("FC-AUXc_h", "FC-AUXc", "[g/h]") - AddToVSUM("FC-WHTCc_h", "FC-WHTCc", "[g/h]") - Else + AddToVSUM("FC_h", "FCh", "[g/h]") + AddToVSUM("FC-AUXc_h", "FCh-AUXc", "[g/h]") + AddToVSUM("FC-WHTCc_h", "FCh-WHTCc", "[g/h]") + + If Not VEC0.EngOnly Then + AddToVSUM("FC_km", "FC", "[g/km]") AddToVSUM("FC-AUXc_km", "FC-AUXc", "[g/km]") AddToVSUM("FC-WHTCc_km", "FC-WHTCc", "[g/km]")