From d0eb7a8ab5b3aef3c17ed3e75bd2b951123ad674 Mon Sep 17 00:00:00 2001 From: Raphael Luz <luz@ivt.tugraz.at> Date: Tue, 26 Feb 2013 16:32:32 +0100 Subject: [PATCH] - AT/TC in development. Input parameters in DEV tab. See VECTO Changelog.txt for more details --- User Manual/GUI/VEH-Editor.html | 9 +- VECTO Changelog.txt | 10 +- VECTO/ApplicationEvents.vb | 3 - VECTO/GUI/F_MAINForm.vb | 4 +- VECTO/GUI/F_VEH.Designer.vb | 38 +- VECTO/GUI/F_VEH.resx | 10 +- VECTO/Input Files/cGBX.vb | 175 +++ VECTO/Input Files/cVEH.vb | 37 +- VECTO/MODcalc/cMOD.vb | 6 + VECTO/MODcalc/cPower.vb | 2405 ++++--------------------------- VECTO/M_MAIN.vb | 72 +- VECTO/VECTO.vbproj.user | 1 + VECTO/VECTO_Global.vb | 7 +- VECTO/cConfig.vb | 65 +- VECTO/cDEV.vb | 37 + 15 files changed, 658 insertions(+), 2221 deletions(-) diff --git a/User Manual/GUI/VEH-Editor.html b/User Manual/GUI/VEH-Editor.html index e12d66e6fd..567e0d5a0f 100644 --- a/User Manual/GUI/VEH-Editor.html +++ b/User Manual/GUI/VEH-Editor.html @@ -114,7 +114,9 @@ Wind Correction</span> (see below).<br> / Wheels</span><br> <div style="margin-left: 40px;">Rolling Resistance Coefficients (RRC) are configured per axle. <span style="font-weight: bold;">Max. axle weight [kg]</span> -is used to weighten each RRC value. Use the <img style="width: 16px; height: 16px;" alt="add" src="../pics/icons/plus-circle-icon.png"> and <img style="width: 16px; height: 16px;" alt="remove" src="../pics/icons/minus-circle-icon.png"> buttons to add or +is used to weighten each RRC value. RRC is normalized (Resistance Force +[N] / (m [kg] * g [m/s�]) with m being the sum of Curb Weight Vehicle, +Curb Weight Extra Trailer/Body and Loading).<br>Use the <img style="width: 16px; height: 16px;" alt="add" src="../pics/icons/plus-circle-icon.png"> and <img style="width: 16px; height: 16px;" alt="remove" src="../pics/icons/minus-circle-icon.png"> buttons to add or remove axles form the vehicle. Doubleclick entries to edit existing axle configurations.<br> <span style="font-weight: bold;"></span></div> @@ -186,7 +188,10 @@ with "<span style="font-weight: bold;">c</span> "</span><br> & Beta:</span><br> <div style="margin-left: 40px;">This mode requires an input file which defines the Cd Scaling Factor -depending on the Yaw Angle ("Beta", angle between vehicle longitudinal axis and direction of air velocity relative to the vehicle). Beta and the air velocity relative to the vehicle must be defined in the driving cycle +depending on the Yaw Angle ("Beta", angle between vehicle longitudinal +axis and direction of air velocity relative to the vehicle). Beta +and the air velocity relative to the vehicle must be defined +in the driving cycle (see below). <span style="color: rgb(51, 102, 255);"><span style="color: black;">The valid range for the Wind Angle (Beta)</span></span> goes from 0 (headwind) to 180 (tailwind). VECTO assumes symmetrical vehicle shape (sign of beta is ignored).<br> diff --git a/VECTO Changelog.txt b/VECTO Changelog.txt index 6a5f2d94f3..4465322357 100644 --- a/VECTO Changelog.txt +++ b/VECTO Changelog.txt @@ -4,8 +4,14 @@ VECTO ?.? (future release) - Engine Only Mode VECTO 1.1 x (current source - next release) - - +- Corrected comment line for wheels inertia and axle config in .vveh file +- Changed RRC unit in GUI from [-] to [N/N] +- User Manual updated + o Vehicle Editor: RRC +- Tranmission Loss Maps are not converted to n,Pe-Maps anymore. Should fix non-linear interpolation effects. +- Automatic Transmission / Torque Converter in development + + VECTO 1.1 beta - 06.02.2013 - New independent licensing dll replaces TUG's version - Speed values below 0.09km/h are set to 0km/h diff --git a/VECTO/ApplicationEvents.vb b/VECTO/ApplicationEvents.vb index 1f299c4225..23a7abeffe 100644 --- a/VECTO/ApplicationEvents.vb +++ b/VECTO/ApplicationEvents.vb @@ -20,8 +20,6 @@ Namespace My Dim i As Int16 Dim file As cFile_V3 - FirstTime = False - 'Paths MyAppPath = My.Application.Info.DirectoryPath & "\" MyConfPath = MyAppPath & "config\" @@ -32,7 +30,6 @@ Namespace My 'If folder does not exist: Create! If Not IO.Directory.Exists(MyConfPath) Then - FirstTime = True Try IO.Directory.CreateDirectory(MyConfPath) Catch ex As Exception diff --git a/VECTO/GUI/F_MAINForm.vb b/VECTO/GUI/F_MAINForm.vb index cdf6b41bc0..5eb4534911 100644 --- a/VECTO/GUI/F_MAINForm.vb +++ b/VECTO/GUI/F_MAINForm.vb @@ -572,7 +572,7 @@ Public Class F_MAINForm If Command() <> "" Then CmdLineCtrl(My.Application.CommandLineArgs) Else - If FirstTime Then + If Cfg.FirstRun Then If MsgBox("Welcome to VECTO!" & vbCrLf & vbCrLf & "Start Quick Start Guide?", MsgBoxStyle.YesNo, "Welcome") = MsgBoxResult.Yes Then If IO.File.Exists(MyAppPath & "User Manual\qsg\quickstartApp.html") Then System.Diagnostics.Process.Start(MyAppPath & "User Manual\qsg\quickstartApp.html") @@ -583,6 +583,8 @@ Public Class F_MAINForm End If End If + Cfg.FirstRun = False + End Sub 'Open file with PHEM diff --git a/VECTO/GUI/F_VEH.Designer.vb b/VECTO/GUI/F_VEH.Designer.vb index c569950cdc..960c6c7ed9 100644 --- a/VECTO/GUI/F_VEH.Designer.vb +++ b/VECTO/GUI/F_VEH.Designer.vb @@ -55,6 +55,8 @@ Partial Class F_VEH Me.ToolStripBtSaveAs = New System.Windows.Forms.ToolStripButton() Me.ToolStripSeparator3 = New System.Windows.Forms.ToolStripSeparator() Me.ToolStripBtSendTo = New System.Windows.Forms.ToolStripButton() + Me.ToolStripSeparator1 = New System.Windows.Forms.ToolStripSeparator() + Me.ToolStripButton1 = New System.Windows.Forms.ToolStripButton() Me.GroupBox7 = New System.Windows.Forms.GroupBox() Me.PnRt = New System.Windows.Forms.Panel() Me.Label45 = New System.Windows.Forms.Label() @@ -91,8 +93,6 @@ Partial Class F_VEH Me.GroupBox1 = New System.Windows.Forms.GroupBox() Me.GroupBox4 = New System.Windows.Forms.GroupBox() Me.PictureBox1 = New System.Windows.Forms.PictureBox() - Me.ToolStripSeparator1 = New System.Windows.Forms.ToolStripSeparator() - Me.ToolStripButton1 = New System.Windows.Forms.ToolStripButton() Me.GroupBox6.SuspendLayout() Me.ToolStrip1.SuspendLayout() Me.GroupBox7.SuspendLayout() @@ -244,7 +244,7 @@ Partial Class F_VEH Me.Label32.AutoSize = True Me.Label32.Location = New System.Drawing.Point(206, 184) Me.Label32.Name = "Label32" - Me.Label32.Size = New System.Drawing.Size(36, 13) + Me.Label32.Size = New System.Drawing.Size(43, 13) Me.Label32.TabIndex = 24 Me.Label32.Text = "[kgm²]" ' @@ -271,7 +271,7 @@ Partial Class F_VEH Me.Label38.AutoSize = True Me.Label38.Location = New System.Drawing.Point(235, 48) Me.Label38.Name = "Label38" - Me.Label38.Size = New System.Drawing.Size(24, 13) + Me.Label38.Size = New System.Drawing.Size(31, 13) Me.Label38.TabIndex = 24 Me.Label38.Text = "[m²]" ' @@ -390,6 +390,20 @@ Partial Class F_VEH Me.ToolStripBtSendTo.Text = "Send to GEN Editor" Me.ToolStripBtSendTo.ToolTipText = "Send to GEN Editor" ' + 'ToolStripSeparator1 + ' + Me.ToolStripSeparator1.Name = "ToolStripSeparator1" + Me.ToolStripSeparator1.Size = New System.Drawing.Size(6, 25) + ' + 'ToolStripButton1 + ' + Me.ToolStripButton1.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image + Me.ToolStripButton1.Image = Global.VECTO.My.Resources.Resources.Help_icon + Me.ToolStripButton1.ImageTransparentColor = System.Drawing.Color.Magenta + Me.ToolStripButton1.Name = "ToolStripButton1" + Me.ToolStripButton1.Size = New System.Drawing.Size(23, 22) + Me.ToolStripButton1.Text = "Help" + ' 'GroupBox7 ' Me.GroupBox7.Controls.Add(Me.PnRt) @@ -562,7 +576,7 @@ Partial Class F_VEH ' 'ColumnHeader9 ' - Me.ColumnHeader9.Text = "RRC [-]" + Me.ColumnHeader9.Text = "RRC [N/N]" Me.ColumnHeader9.Width = 79 ' 'ButAxlAdd @@ -749,20 +763,6 @@ Partial Class F_VEH Me.PictureBox1.TabIndex = 37 Me.PictureBox1.TabStop = False ' - 'ToolStripSeparator1 - ' - Me.ToolStripSeparator1.Name = "ToolStripSeparator1" - Me.ToolStripSeparator1.Size = New System.Drawing.Size(6, 25) - ' - 'ToolStripButton1 - ' - Me.ToolStripButton1.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image - Me.ToolStripButton1.Image = Global.VECTO.My.Resources.Resources.Help_icon - Me.ToolStripButton1.ImageTransparentColor = System.Drawing.Color.Magenta - Me.ToolStripButton1.Name = "ToolStripButton1" - Me.ToolStripButton1.Size = New System.Drawing.Size(23, 22) - Me.ToolStripButton1.Text = "Help" - ' 'F_VEH ' Me.AcceptButton = Me.ButOK diff --git a/VECTO/GUI/F_VEH.resx b/VECTO/GUI/F_VEH.resx index 075ba615e0..a086c6e101 100644 --- a/VECTO/GUI/F_VEH.resx +++ b/VECTO/GUI/F_VEH.resx @@ -112,18 +112,18 @@ <value>2.0</value> </resheader> <resheader name="reader"> - <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value> + <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value> </resheader> <resheader name="writer"> - <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value> + <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value> </resheader> - <metadata name="ToolStrip1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"> + <metadata name="ToolStrip1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"> <value>32, 17</value> </metadata> - <metadata name="StatusStrip1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"> + <metadata name="StatusStrip1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"> <value>142, 21</value> </metadata> - <assembly alias="System.Drawing" name="System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" /> + <assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" /> <data name="$this.Icon" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64"> <value> AAABAAEAICAAAAEAIACoEAAAFgAAACgAAAAgAAAAQAAAAAEAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA diff --git a/VECTO/Input Files/cGBX.vb b/VECTO/Input Files/cGBX.vb index 04b64d38bd..411e814b3f 100644 --- a/VECTO/Input Files/cGBX.vb +++ b/VECTO/Input Files/cGBX.vb @@ -29,6 +29,16 @@ Public Class cGBX Public gs_ShiftInside As Boolean 'Public gs_Type As tGearbox 'not used yet + 'Torque Converter Input + Public TCnu As New List(Of Single) + Public TCmu As New List(Of Single) + Public TCtorque As New List(Of Single) + Public TCdim As Integer + + 'Torque Converter Iteration Results + Public TCMin As Single + Public TCnUin As Single + Public Sub New() Dim i As Short @@ -185,6 +195,171 @@ Public Class cGBX End Function + Public Function TCinit() As Boolean + Dim file As New cFile_V3 + Dim MsgSrc As String + Dim line() As String + + MsgSrc = "GBX/TCinit" + + If Not file.OpenRead(DEV.TCfile) Then + WorkerMsg(tMsgID.Err, "Torque Converter file not found! (" & DEV.TCfile & ")", MsgSrc) + Return False + End If + + TCnu.Clear() + TCmu.Clear() + TCtorque.Clear() + TCdim = -1 + + Try + Do While Not file.EndOfFile + line = file.ReadLine + TCnu.Add(CSng(line(0))) + TCmu.Add(CSng(line(1))) + TCtorque.Add(CSng(line(2))) + TCdim += 1 + Loop + Catch ex As Exception + WorkerMsg(tMsgID.Err, "Error while reading Torque Converter file! (" & ex.Message & ")", MsgSrc) + Return False + End Try + + file.Close() + + 'Check if more then one point + If TCdim < 1 Then + WorkerMsg(tMsgID.Err, "More points in Torque Converter file needed!", MsgSrc) + Return False + End If + + Return True + + End Function + + Public Function TCiteration(ByVal nUout As Single, ByVal PeOut As Single) As Boolean + Dim nUin As Single + Dim Mout As Single + Dim VZ As Integer + Dim nUstep As Single + Dim lastErr As Single + + Dim nu As Single + Dim mu As Single + + Dim MoutCalc As Single + + Dim nUmin As Single + Dim nUmax As Single + + Dim Schub As Boolean + + 'Torque sign + If PeOut > 0 Then + Schub = False + Else + Schub = True + PeOut *= -1 + End If + + 'Power to torque + Mout = nPeToM(nUout, PeOut) + + 'rpm-limits + nUmin = nnormTonU(GBX.fGSnnDown(Mout)) + nUmax = nnormTonU(GBX.fGSnnUp(Mout)) + + 'Start values: Estimate torque converter state + nUin = nUout + + If nUin > nUmax Then nUin = nUmax + If nUin < nUmin Then nUin = nUmin + + nUstep = DEV.TCnUstep + VZ = 1 + lastErr = 99999 + + nu = nUout / nUin + mu = fTCmu(nu) + MoutCalc = fTCtorque(nu, nUin) * mu + + 'Iteration + Do While Math.Abs(MoutCalc - Mout) > DEV.TCiterPrec And nUstep > DEV.TCnUstepMin + nUin += VZ * nUstep + nu = nUout / nUin + mu = fTCmu(nu) + MoutCalc = fTCtorque(nu, nUin) * mu + If Math.Abs(MoutCalc - Mout) > lastErr Then + nUstep /= 2 + VZ *= -1 + End If + lastErr = Math.Abs(MoutCalc - Mout) + Loop + + TCMin = MoutCalc / mu + TCnUin = nUin + + Return True + + End Function + + Private Function fTCmu(ByVal nu As Single) As Single + Dim i As Int32 + + 'Extrapolation for x < x(1) + If TCnu(0) >= nu Then + If TCnu(0) > nu Then MODdata.ModErrors.TCextrapol = "nu= " & nu & " [n_out/n_in]" + i = 1 + GoTo lbInt + End If + + i = 0 + Do While TCnu(i) < nu And i < TCdim + i += 1 + Loop + + 'Extrapolation for x > x(imax) + If TCnu(i) < nu Then + MODdata.ModErrors.TCextrapol = "nu= " & nu & " [n_out/n_in]" + End If + +lbInt: + 'Interpolation + Return (nu - TCnu(i - 1)) * (TCmu(i) - TCmu(i - 1)) / (TCnu(i) - TCnu(i - 1)) + TCmu(i - 1) + + End Function + + Private Function fTCtorque(ByVal nu As Single, ByVal nUin As Single) As Single + Dim i As Int32 + Dim M0 As Single + + 'Extrapolation for x < x(1) + If TCnu(0) >= nu Then + If TCnu(0) > nu Then MODdata.ModErrors.TCextrapol = "nu= " & nu & " [n_out/n_in]" + i = 1 + GoTo lbInt + End If + + i = 0 + Do While TCnu(i) < nu And i < TCdim + i += 1 + Loop + + 'Extrapolation for x > x(imax) + If TCnu(i) < nu Then + MODdata.ModErrors.TCextrapol = "nu= " & nu & " [n_out/n_in]" + End If + +lbInt: + 'Interpolation + M0 = (nu - TCnu(i - 1)) * (TCtorque(i) - TCtorque(i - 1)) / (TCnu(i) - TCnu(i - 1)) + TCtorque(i - 1) + + Return M0 * (nUin / DEV.TCnUref) ^ 2 + + End Function + + + Public Function GSinit() As Boolean Dim file As cFile_V3 Dim line As String() diff --git a/VECTO/Input Files/cVEH.vb b/VECTO/Input Files/cVEH.vb index a69d087c03..49d47b5db7 100644 --- a/VECTO/Input Files/cVEH.vb +++ b/VECTO/Input Files/cVEH.vb @@ -352,7 +352,7 @@ lbError: file.WriteLine(CStr(siAquers)) 'file.WriteLine("c Engine rotational inertia [kg*m^2]") 'file.WriteLine(CStr(siI_mot)) - file.WriteLine("c Wheels equivalent rotational inertia [kg] (= I_wheel/rdyn^2)") + file.WriteLine("c Wheels inertia [kgm^2]") file.WriteLine(CStr(siI_wheels)) 'file.WriteLine("c Gearbox rotational inertia [kg*m^2]") 'file.WriteLine(CStr(siI_Getriebe)) @@ -416,6 +416,7 @@ lbError: 'Axle configuration - Update 16.10.2012 file.WriteLine("c Axle configurations") + file.WriteLine("c Max. axle weight [kg], RRC [N/N]") For Each sl In RRCs file.WriteLine(CStr(sl(0)), CStr(sl(1))) Next @@ -550,7 +551,8 @@ lbError: Try 'PHEM: n, PeIn, PeOut => x=n, y=PeOut, z=PeIn |@@| PHEM: n, PeIn, PeOut => x=n, y=PeOut, z=PeIn 'PHEM: GBmap0.AddPoints(CDbl(line(0)) * n_norm, CDbl(line(2)) * Pe_norm, CDbl(line(1)) * Pe_norm) |@@| PHEM: GBmap0.AddPoints(CDbl(line(0)) * n_norm, CDbl(line(2)) * Pe_norm, CDbl(line(1)) * Pe_norm) - 'VECTO: n, M_in, M_loss => x=n, y=PeOut, z=PeIn |@@| VECTO: n, M_in, M_loss => x=n, y=PeOut, z=PeIn + 'old version: VECTO: n, M_in, M_loss => x=n, y=PeOut, z=PeIn |@@| VECTO: n, M_in, M_loss => x=n, y=PeOut, z=PeIn + 'VECTO: n, M_in, M_loss => x=n, y=M_out, z=M_in nU = CDbl(line(0)) M_in = CDbl(line(1)) M_loss = CDbl(line(2)) @@ -561,7 +563,8 @@ lbError: M_out = M_in + M_loss End If - GBmap0.AddPoints(nU, nMtoPe(nU, M_out), nMtoPe(nU, M_in)) + 'old version: Power instead of torque: GBmap0.AddPoints(nU, nMtoPe(nU, M_out), nMtoPe(nU, M_in)) + GBmap0.AddPoints(nU, M_out, M_in) Catch ex As Exception WorkerMsg(tMsgID.Err, "Error during file read! Line number: " & l & " (" & path & ")", MsgSrc) file.Close() @@ -596,7 +599,7 @@ lbError: Dim i As Integer Dim Ab As Double Dim AbMin As Double - Dim iMin As Double + Dim iMin As Integer Dim PeOutX As Double Dim MsgSrc As String @@ -617,25 +620,25 @@ lbError: Try 'Interpolate with Original Values - PeIn = GBmap.Intpol(nU, PeOut) + PeIn = nMtoPe(nU, GBmap.Intpol(nU, nPeToM(nU, PeOut))) Catch ex As Exception 'If error: try extrapolation 'Search for the nearest Map point - AbMin = ((GBmap.ptList(0).X - nU) ^ 2 + (GBmap.ptList(0).Y - PeOut) ^ 2) ^ 0.5 + AbMin = ((GBmap.ptList(0).X - nU) ^ 2 + (GBmap.ptList(0).Y - nPeToM(nU, PeOut)) ^ 2) ^ 0.5 iMin = 0 For i = 1 To GBmap.ptDim - Ab = ((GBmap.ptList(i).X - nU) ^ 2 + (GBmap.ptList(i).Y - PeOut) ^ 2) ^ 0.5 + Ab = ((GBmap.ptList(i).X - nU) ^ 2 + (GBmap.ptList(i).Y - nPeToM(nU, PeOut)) ^ 2) ^ 0.5 If Ab < AbMin Then AbMin = Ab iMin = i End If Next - PeOutX = GBmap.ptList(iMin).Y - PeIn = GBmap.ptList(iMin).Z + PeOutX = nMtoPe(nU, GBmap.ptList(iMin).Y) + PeIn = nMtoPe(nU, GBmap.ptList(iMin).Z) 'Efficiency If PeOutX > 0 Then @@ -677,7 +680,7 @@ lbError: 'Calculate efficiency with PeIn for original PeOut PeIn = PeOut / WG - MODdata.ModErrors.TrLossMapExtr = "Gear= " & Gear & ", nU= " & nU.ToString("0.00") & " [U/min], MeOut=" & PToM(nU, PeOut).ToString("0.00") & " [Nm]" + MODdata.ModErrors.TrLossMapExtr = "Gear= " & Gear & ", nU= " & nU.ToString("0.00") & " [U/min], MeOut=" & nPeToM(nU, PeOut).ToString("0.00") & " [Nm]" End Try @@ -696,7 +699,7 @@ lbError: Dim i As Integer Dim Ab As Double Dim AbMin As Double - Dim iMin As Double + Dim iMin As Integer Dim PeInX As Double Dim MsgSrc As String @@ -718,25 +721,25 @@ lbError: Try 'Interpolate with original values - PeOut = GBmap.IntpolXZ(nU, PeIn) + PeOut = nMtoPe(nU, GBmap.IntpolXZ(nU, nPeToM(nU, PeIn))) Catch ex As Exception 'If error: try extrapolation 'Search for the nearest Map-point - AbMin = ((GBmap.ptList(0).X - nU) ^ 2 + (GBmap.ptList(0).Z - PeIn) ^ 2) ^ 0.5 + AbMin = ((GBmap.ptList(0).X - nU) ^ 2 + (GBmap.ptList(0).Z - nPeToM(nU, PeIn)) ^ 2) ^ 0.5 iMin = 0 For i = 1 To GBmap.ptDim - Ab = ((GBmap.ptList(i).X - nU) ^ 2 + (GBmap.ptList(i).Z - PeIn) ^ 2) ^ 0.5 + Ab = ((GBmap.ptList(i).X - nU) ^ 2 + (GBmap.ptList(i).Z - nPeToM(nU, PeIn)) ^ 2) ^ 0.5 If Ab < AbMin Then AbMin = Ab iMin = i End If Next - PeInX = GBmap.ptList(iMin).Z - PeOut = GBmap.ptList(iMin).Y + PeInX = nMtoPe(nU, GBmap.ptList(iMin).Z) + PeOut = nMtoPe(nU, GBmap.ptList(iMin).Y) 'Efficiency If PeOut > 0 Then @@ -774,7 +777,7 @@ lbError: 'Calculate efficiency with PeIn for original PeOut PeOut = PeIn * WG - MODdata.ModErrors.TrLossMapExtr = "Gear= " & Gear & ", nU= " & nU.ToString("0.00") & " [U/min], MeIn=" & PToM(nU, PeIn).ToString("0.00") & " [Nm] (fwd)" + MODdata.ModErrors.TrLossMapExtr = "Gear= " & Gear & ", nU= " & nU.ToString("0.00") & " [U/min], MeIn=" & nPeToM(nU, PeIn).ToString("0.00") & " [Nm] (fwd)" End Try diff --git a/VECTO/MODcalc/cMOD.vb b/VECTO/MODcalc/cMOD.vb index 49459253f1..4cad84bf8a 100644 --- a/VECTO/MODcalc/cMOD.vb +++ b/VECTO/MODcalc/cMOD.vb @@ -726,6 +726,7 @@ Public Class cMOD Public RtExtrapol As String Public DesMaxExtr As String Public GSextrapol As String + Public TCextrapol As String Public Sub New() ResetAll() @@ -754,6 +755,7 @@ Public Class cMOD CdExtrapol = "" RtExtrapol = "" GSextrapol = "" + TCextrapol = "" PxReset() End Sub @@ -804,6 +806,10 @@ Public Class cMOD WorkerMsg(tMsgID.Warn, "Extrapolation in Gear Shift Polygon file (" & GSextrapol & ")!", MsgSrc & "/t= " & Second) End If + If TCextrapol <> "" Then + WorkerMsg(tMsgID.Warn, "Extrapolation in Torque Converter file (" & TCextrapol & ")!", MsgSrc & "/t= " & Second) + End If + Return Abort End Function diff --git a/VECTO/MODcalc/cPower.vb b/VECTO/MODcalc/cPower.vb index 4c7b36c37e..dc66f75c73 100644 --- a/VECTO/MODcalc/cPower.vb +++ b/VECTO/MODcalc/cPower.vb @@ -665,8 +665,8 @@ lbGschw: 'Else ' Gear = fGearLKW(jz) 'End If - - If fnn(Vist, Gear, False) < Kuppln_norm And Pplus Then + + If Not DEV.ATmode AndAlso fnn(Vist, Gear, False) < Kuppln_norm And Pplus Then Clutch = tEngClutch.Slipping Else Clutch = tEngClutch.Closed @@ -678,8 +678,9 @@ lbGschw: End If Else + 'Check whether Clutch will slip (important for Gear-shifting model): - If fnn(Vist, 1, False) < Kuppln_norm And Pplus Then + If Not DEV.ATmode AndAlso fnn(Vist, 1, False) < Kuppln_norm And Pplus Then Clutch = tEngClutch.Slipping Else Clutch = tEngClutch.Closed @@ -715,13 +716,17 @@ lbGschw: 'Gear shifting-model / gear input can open Clutch If Gear < 1 Then + Clutch = tEngClutch.Opened + Else - If fnn(Vist, Gear, False) < Kuppln_norm And Pplus And Not VehState0 = tVehState.Dec Then + + If Not DEV.ATmode AndAlso fnn(Vist, Gear, False) < Kuppln_norm And Pplus And Not VehState0 = tVehState.Dec Then Clutch = tEngClutch.Slipping Else Clutch = tEngClutch.Closed End If + End If End If @@ -745,10 +750,13 @@ lbCheck: ''bICEKupOffen = bKupplOffen <= i need nothing more 'Falls vor Gangwahl festgestellt wurde, dass nicht KupplSchleif, dann bei zu niedriger Drehzahl runterschalten: |@@| If before?(vor) Gear-shift is detected that Clutch does not Lock, then Downshift at too low Revolutions: - If Clutch = tEngClutch.Closed Then - If fnn(Vist, Gear, False) < Kuppln_norm And Not VehState0 = tVehState.Dec And Gear > 1 Then Gear -= 1 + If Not DEV.ATmode Then + If Clutch = tEngClutch.Closed Then + If fnn(Vist, Gear, False) < Kuppln_norm And Not VehState0 = tVehState.Dec And Gear > 1 Then Gear -= 1 + End If End If + 'Check whether idling although Power > 0 ' wenn Leistung vor Diff > 0.1% von Nennleistung dann Korrigieren! |@@| when Power before?(vor) Diff > 0.1% of Nominal-power, then Correct! If Clutch = tEngClutch.Opened Then @@ -760,7 +768,8 @@ lbCheck: Gear = 1 End If - If fnn(Vist, Gear, False) < Kuppln_norm Then + + If Not DEV.ATmode AndAlso fnn(Vist, Gear, False) < Kuppln_norm Then Clutch = tEngClutch.Slipping Else Clutch = tEngClutch.Closed @@ -848,24 +857,42 @@ lbCheck: Else - nn = fnn(Vist, Gear, Clutch = tEngClutch.Slipping) + If DEV.ATmode And Gear = 1 Then + + PlossGB = fPlossGB(PvorD, Vist, Gear) + PlossDiff = fPlossDiff(PvorD, Vist) + PlossRt = fPlossRt(Vist, Gear) + PaGetr = fPaG(Vist, aist) + Pkup = PvorD + PlossGB + PlossDiff + PaGetr + PlossRt + + If Not GBX.TCiteration(fnUout(Vist, Gear), Pkup) Then + WorkerMsg(tMsgID.Err, "TC Iteration failed!", MsgSrc & "/t= " & jz + 1) + Return False + End If + + nn = (GBX.TCnUin - VEH.nLeerl) / (VEH.nNenn - VEH.nLeerl) - '*** Start: Revolutions Check + Else - 'Check whether Revolutions too high! => Upshift - Do While nn > 1.2 And Gear < VEH.ganganz - Gear += 1 nn = fnn(Vist, Gear, Clutch = tEngClutch.Slipping) - Loop - 'Check whether Revolutions too low with the Clutch closed - If Clutch = tEngClutch.Closed Then - If nn < 0.0001 Then - Gear -= 1 + '*** Start: Revolutions Check + + 'Check whether Revolutions too high! => Upshift + Do While nn > 1.2 And Gear < VEH.ganganz + Gear += 1 nn = fnn(Vist, Gear, Clutch = tEngClutch.Slipping) + Loop + + 'Check whether Revolutions too low with the Clutch closed + If Clutch = tEngClutch.Closed Then + If nn < 0.0001 Then + Gear -= 1 + nn = fnn(Vist, Gear, Clutch = tEngClutch.Slipping) + End If End If - End If + End If End If @@ -912,13 +939,22 @@ lb_nOK: PlossRt = 0 PaGetr = 0 Case tEngClutch.Closed - PlossGB = fPlossGB(PvorD, Vist, Gear) - PlossDiff = fPlossDiff(PvorD, Vist) - PlossRt = fPlossRt(Vist, Gear) - PaGetr = fPaG(Vist, aist) - Pkup = PvorD + PlossGB + PlossDiff + PaGetr + PlossRt - P = Pkup + Paux + PaMot - Case Else 'tEngClutch.Slipping + + If DEV.ATmode And Gear = 1 Then + + P = nMtoPe(nU, GBX.TCMin) + Paux + PaMot + + Else + + PlossGB = fPlossGB(PvorD, Vist, Gear) + PlossDiff = fPlossDiff(PvorD, Vist) + PlossRt = fPlossRt(Vist, Gear) + PaGetr = fPaG(Vist, aist) + Pkup = PvorD + PlossGB + PlossDiff + PaGetr + PlossRt + P = Pkup + Paux + PaMot + + End If + Case Else 'tEngClutch.Slipping: never in AT mode! PlossGB = fPlossGB(PvorD, Vist, Gear) PlossDiff = fPlossDiff(PvorD, Vist) PlossRt = fPlossRt(Vist, Gear) @@ -1031,2086 +1067,102 @@ lb_nOK: PlossDiff = fPlossDiffFwd(Pkup - PlossGB, Vist) PlossRt = fPlossRt(Vist, Gear) - Pbrake = PvorD - (Pkup - PlossGB - PlossDiff - PaGetr - PlossRt) - - EngState0 = tEngState.FullDrag - Else - Pbrake = 0 - End If - End If - End If - - 'Check or Abort (before Speed-reduce-iteration, otherwise it hangs) - If PHEMworker.CancellationPending Then Return True - - 'Check whether P above Full-load => Reduce Speed - If Pplus And P > Pmax Then - If EngState0 = tEngState.Load Or EngState0 = tEngState.FullLoad Then - If Vist > 0.01 Then - Select Case P / Pmax - Case Is > 1.6 - Vh.ReduceSpeed(jz, 0.99) - Case Is > 1.3 - Vh.ReduceSpeed(jz, 0.995) - Case Else - Vh.ReduceSpeed(jz, 0.999) - End Select - FirstSecItar = False - GoTo lbGschw - Else - 'ERROR: Speed Reduction brings nothing? ... - WorkerMsg(tMsgID.Err, "Speed reduction failed!", MsgSrc & "/t= " & jz + 1) - Return False - End If - Else 'tEngState.Idle, tEngState.Stopped, tEngState.Drag - 'ERROR: Engine not in Drivetrain ... can it be? - If FirstSecItar Then - If P > 0.1 Then WorkerMsg(tMsgID.Warn, "Pwheel > 0 but EngState undefined ?!", MsgSrc & "/t= " & jz + 1) - End If - End If - End If - - - 'Interruption of traction(Zugkraftunterbrechung) - If TracIntrI > 0 Then - - If Not TracIntrOn Then - - If jz > 0 AndAlso Gear > 0 AndAlso MODdata.Gear(jz - 1) > 0 AndAlso Gear <> MODdata.Gear(jz - 1) Then - - TracIntrGear = Gear - Gear = 0 - Clutch = tEngClutch.Opened - TracIntrIx = 0 - TracIntrOn = True - - If TracIntrIx + 1 = TracIntrI Then - ZgkrDt = VEH.TracIntrSi - CSng(TracIntrIx) - Else - ZgkrDt = 1 - End If - - Vrollout = fRolloutSpeed(jz, ZgkrDt) - - If Vrollout < Vist Or VehState0 <> tVehState.Dec Then Vh.SetSpeed(jz, Vrollout) - - GoTo lbGschw - - End If - - End If - - End If - - '-------------------------------------------------------------------------------------------------- - '------------------------- PNR -------------------------------------------------------------------- - '-------------------------------------------------------------------------------------------------- - ' Finish Second - - 'Start / Stop - Activation-Speed Control - If GEN.StartStop Then - If StStAus Then - If Not EngState0 = tEngState.Stopped Then - StStTx += 1 - If StStTx > GEN.StStT Then - StStTx = 1 - StStAus = False - End If - End If - Else - If EngState0 = tEngState.Stopped Then StStAus = True - End If - End If - - 'Write Modal-values Fields - MODdata.Pe.Add(P / VEH.Pnenn) - MODdata.nn.Add(nn) - MODdata.nU.Add(nU) - - MODdata.EngState.Add(EngState0) - - MODdata.Pa.Add(fPaFZ(MODdata.Vh.V(jz), MODdata.Vh.a(jz))) - MODdata.Pluft.Add(fPair(MODdata.Vh.V(jz), jz)) - MODdata.Proll.Add(fPr(MODdata.Vh.V(jz))) - MODdata.Pstg.Add(fPs(MODdata.Vh.V(jz), jz)) - MODdata.Pbrake.Add(Pbrake) - MODdata.Psum.Add(PvorD) - MODdata.PauxSum.Add(Paux) - - For Each AuxID As String In VEH.AuxRefs.Keys - MODdata.Paux(AuxID).Add(VEH.Paux(AuxID, jz, nU)) - Next - - MODdata.PlossGB.Add(PlossGB) - MODdata.PlossDiff.Add(PlossDiff) - MODdata.PlossRt.Add(PlossRt) - MODdata.PaEng.Add(PaMot) - MODdata.PaGB.Add(PaGetr) - - MODdata.VehState.Add(VehState0) - MODdata.Gear.Add(Gear) - - If Cfg.WegKorJa Then Vh.DistCorrection(jz, VehState0) - - 'Interruption of traction(Zugkraftunterbrechung) - If TracIntrTurnOff Then - - TracIntrOn = False - TracIntrTurnOff = False - - ElseIf TracIntrOn Then - - TracIntrIx += 1 - - If TracIntrIx = TracIntrI Then - - TracIntrTurnOff = True - - ElseIf jz < MODdata.tDim Then - - If TracIntrIx + 1 = TracIntrI Then - ZgkrDt = VEH.TracIntrSi - CSng(TracIntrIx) - Else - ZgkrDt = 1 - End If - - Vrollout = fRolloutSpeed(jz + 1, ZgkrDt) - If Vrollout < Vist Or VehState0 <> tVehState.Dec Then Vh.SetSpeed(jz + 1, Vrollout) - - End If - - End If - - If Vh.Vsoll(jz) - Vist > 1.5 Then SecSpeedRed += 1 - - - LastGearChange = -1 - For i = jz - 1 To 0 Step -1 - If MODdata.Gear(i) <> 0 Then - If MODdata.Gear(i) <> Gear Then - LastGearChange = i - Exit For - End If - End If - Next - - - LastClutch = Clutch - - 'Messages - If MODdata.ModErrors.MsgOutputAbort(jz + 1, MsgSrc) Then Return False - - If Clutch = tEngClutch.Closed And Nvorg Then - If Math.Abs(nU - fnU(Vist, Gear, False)) > 0.2 * VEH.nNenn Then - WorkerMsg(tMsgID.Warn, "Target rpm =" & nU & ", calculated rpm(gear " & Gear & ")= " & fnU(Vist, Gear, False), MsgSrc & "/t= " & jz + 1) - End If - End If - - - Loop Until jz >= MODdata.tDim - - '*********************************************************************************************** - '*********************************** Time loop END *********************************** - '*********************************************************************************************** - - 'Notify (When not ADVANCE) - If NotAdvMode Then - - If Cfg.WegKorJa Then - If MODdata.tDim > MODdata.tDimOgl Then WorkerMsg(tMsgID.Normal, "Cycle extended by " & MODdata.tDim - MODdata.tDimOgl & " seconds.", MsgSrc) - End If - - If SecSpeedRed > 0 Then WorkerMsg(tMsgID.Normal, "Speed reduction > 1.5 m/s in " & SecSpeedRed & " time steps.", MsgSrc) - - End If - - 'CleanUp - Vh = Nothing - - Return True - - End Function - - Public Function Eng_Calc() As Boolean - - Dim Pmr As Single - Dim t As Integer - Dim t1 As Integer - Dim PminN As Single - Dim PmaxN As Single - Dim nnDRI As List(Of Double) - Dim PeDRI As List(Of Double) - Dim PcorCount As Integer - Dim StdMode As Boolean - Dim NotAdvMode As Boolean - Dim MsgSrc As String - - MsgSrc = "Power/Eng_Calc" - - StdMode = (PHEMmode = tPHEMmode.ModeSTANDARD) - NotAdvMode = Not (PHEMmode = tPHEMmode.ModeADVANCE) - - 'Abort if Power/Revolutions not given - If Not (DRI.Nvorg And DRI.Pvorg) Then - WorkerMsg(tMsgID.Err, "Load cycle is not valid! rpm and load required.", MsgSrc) - Return False - End If - - PcorCount = 0 - t1 = MODdata.tDim - nnDRI = DRI.Values(tDriComp.nn) - PeDRI = DRI.Values(tDriComp.Pe) - - 'Drehzahlen vorher weil sonst scheitert die Pmr-Berechnung bei MODdata.nU(t + 1) |@@| Revolutions previously, otherwise Pmr-calculation fails at MODdata.nU(t + 1) - For t = 0 To t1 - 'Write Modal value Fields - ' Allocate MODdata.Pe - MODdata.nn.Add(nnDRI(t)) - MODdata.nU.Add(Math.Max(0, nnDRI(t) * (VEH.nNenn - VEH.nLeerl) + VEH.nLeerl)) - Next - - 'Power calculation - For t = 0 To t1 - - 'Secondary Progressbar - If NotAdvMode Then ProgBarCtrl.ProgJobInt = CInt(100 * t / t1) - - 'Reset the second-by-second Errors - MODdata.ModErrors.ResetAll() - - 'OLD and wrong because not time shifted: P_mr(jz) = 0.001 * (I_mot * 0.0109662 * (n(jz) * nnrom) * nnrom * (n(jz) - n(jz - 1))) / Pnrom - If t > 0 And t < t1 Then - Pmr = 0.001 * (VEH.I_mot * (2 * Math.PI / 60) ^ 2 * MODdata.nU(t) * 0.5 * (MODdata.nU(t + 1) - MODdata.nU(t - 1))) / VEH.Pnenn - Else - Pmr = 0 - End If - - 'Power of the Cycle corrected by P_clutch - MODdata.Pe.Add(PeDRI(t) + Pmr) - - 'Revolutions of the Cycle => Determined in Cycle-init - 'If Revolutions under idle, assume Engine is stopped - If MODdata.nn(t) < Cfg.nnormEngStop Then - EngState0 = tEngState.Stopped - Else - PminN = FLD.Pdrag(MODdata.nn(t)) / VEH.Pnenn - - If t = 0 Then - PmaxN = FLD.Pfull(MODdata.nn(t)) / VEH.Pnenn - Else - PmaxN = FLD.Pfull(MODdata.nn(t), MODdata.Pe(t - 1)) / VEH.Pnenn - End If - - 'If Pmax < 0 or Pmin > 0 then Abort with Error! - If PminN >= 0 AndAlso MODdata.Pe(t) < 0 Then - WorkerMsg(tMsgID.Err, "Pe_drag > 0! n_norm= " & MODdata.nn(t), MsgSrc & "/t= " & t + 1) - Return False - ElseIf PmaxN <= 0 AndAlso MODdata.Pe(t) > 0 Then - WorkerMsg(tMsgID.Err, "Pe_full < 0! n_norm= " & MODdata.nn(t), MsgSrc & "/t= " & t + 1) - Return False - End If - - 'FLD Check - If MODdata.Pe(t) > PmaxN Then - If MODdata.Pe(t) / PmaxN > 1.05 Then PcorCount += 1 - MODdata.Pe(t) = PmaxN - ElseIf MODdata.Pe(t) < PminN Then - If MODdata.Pe(t) / PminN > 1.05 Then PcorCount += 1 - MODdata.Pe(t) = PminN - End If - - Select Case MODdata.Pe(t) - Case Is > 0.0001 'Antrieb - If Math.Abs(MODdata.Pe(t) / PmaxN - 1) < 0.01 Then - EngState0 = tEngState.FullLoad - Else - EngState0 = tEngState.Load - End If - Case Is < -0.0001 'Schlepp - If MODdata.Pe(t) < 1.01 * PminN Then - EngState0 = tEngState.FullDrag - Else - EngState0 = tEngState.Drag - End If - Case Else - EngState0 = tEngState.Idle - End Select - End If - - MODdata.EngState.Add(EngState0) - - 'Notify - If MODdata.ModErrors.MsgOutputAbort(t + 1, MsgSrc) Then Return False - - Next - - If PcorCount > 0 Then WorkerMsg(tMsgID.Warn, "Power corrected (>5%) in " & PcorCount & " time steps.", MsgSrc) - - Return True - - End Function - - Public Function EV_Calc() As Boolean - - Dim M As Single - Dim nn As Single - Dim nU As Single - Dim omega_p As Single - Dim omega1 As Single, omega2 As Single - Dim TzyklOgl As Int32 - Dim jz As Integer - Dim Tzykl As Integer - - 'Start/Stop Control - Dim StStAus As Boolean - Dim StStTx As Single - - Dim Vh As cVh - - Dim Gear As Integer - Dim GnachV As Boolean - Dim PKWja As Boolean - - Dim P As Single - Dim Pkup As Single - Dim PaMot As Single - Dim PaGetr As Single - Dim Paux As Single - Dim Pbrake As Single - Dim PlossGB As Single - Dim PlossDiff As Single - Dim PlossRt As Single - - Dim Pmax As Single - Dim Pmin As Single - Dim PrekupMax As Single - Dim PbrakeRek As Single - - Dim PeBat0 As Single - Dim PiBat0 As Single - Dim PiEM As Single - - Dim GVset As Boolean - - 'WegKorrektur |@@| Route-correction - Dim WegIst As Single - Dim WegX As Integer - Dim SecSpeedRed As Integer - - Dim StdMode As Boolean - Dim NotAdvMode As Boolean - Dim MsgSrc As String - - MsgSrc = "Power/EV_Calc" - - StdMode = (PHEMmode = tPHEMmode.ModeSTANDARD) - NotAdvMode = Not (PHEMmode = tPHEMmode.ModeADVANCE) - - 'Abort if no speed given - If Not DRI.Vvorg Then - WorkerMsg(tMsgID.Err, "Driving cycle is not valid! Vehicle Speed required.", MsgSrc) - Return False - End If - - ' Initialize - Vh = MODdata.Vh - WegIst = 0 - WegX = 0 - SecSpeedRed = 0 - - - PeUL = VEH.Pnenn - - If Cfg.GnVorgab Then - Gvorg = DRI.Gvorg - Nvorg = DRI.Nvorg - Else - Gvorg = False - Nvorg = False - End If - PKWja = GEN.PKWja - StStAus = False - StStTx = 0 - - If GEN.izykwael = 4 Then - Kuppln_norm = 0.05 - KupplEta = 0.4 - Else - Kuppln_norm = 0.03 - KupplEta = 1 - End If - - 'Take WG-map from MAP and calculate Pi-list - PeL = MAP.LPe - nnL = MAP.Lnn - Ldim = PeL.Count - 1 - PiL = New List(Of Single) - WGL = New List(Of Single) - For jz = 0 To Ldim - WGL.Add(MAP.EmDefRef(tMapComp.Eta).RawVals(jz)) - If PeL(jz) > 0 Then 'Antrieb => 0 < Pe < Pi - PiL.Add(PeL(jz) / WGL(jz)) - ElseIf PeL(jz) < 0 Then 'Laden => 0 > Pi > Pe - PiL.Add(PeL(jz) * WGL(jz)) - Else - PiL.Add(0) - End If - Next - - 'Gear-shifting points for NEDC/FTP - Select Case GEN.izykwael - Case 0 'Nefzja = True - GnachV = True - Case 1 'Ftpja = True - GnachV = True - Case Else - GnachV = False - Aaufi = 0.3 - Baufi = 0.3 - Caufi = 0.4 - Aobi = 0.18 - Bobi = 0.28 - Cobi = 0.46 - End Select - - - 'Theoretical Maximum-speed [m/s] - GVmax = VEH.nNenn * VEH.Dreifen * Math.PI / (VEH.AchsI * VEH.Igetr(VEH.ganganz) * 60) - - jz = -1 - Tzykl = MODdata.tDim - TzyklOgl = Tzykl - - '*********************************************************************************************** - '*********************************** Time-loop **************************************** - '*********************************************************************************************** - - Do - jz += 1 - - GVset = False - - 'Secondary Progressbar - If NotAdvMode Then ProgBarCtrl.ProgJobInt = CInt(100 * jz / MODdata.tDim) - - ' Determine State - -lbGschw: - - 'Calculate Speed/Acceleration ------------------- - 'Now by DRI-class - Vist = Vh.V(jz) - aist = Vh.a(jz) - - 'If Speed over the theoretical Top-Speed => Reduce - If Vist > GVmax + 0.0001 And Not GVset Then - Vh.SetSpeed0(jz, GVmax) - GVset = True - GoTo lbGschw - End If - - 'From Power ----- - If aist < 0 Then - If (Vist < 0.025) Then - Vist = 0 - End If - End If - '--------------- - - PbrakeRek = 0 - - 'Determine Driving-state ------------------------- - Pplus = False - Pminus = False - - If Vist < 0.0001 Then - VehState0 = tVehState.Stopped - Else - If aist >= 0.01 Then - VehState0 = tVehState.Acc - ElseIf aist < -0.01 Then - VehState0 = tVehState.Dec - Else - VehState0 = tVehState.Cruise - End If - End If - - PvorD = fPvD(jz) - - Select Case PvorD - Case Is > 0.0001 - Pplus = True - Case Is < -0.0001 - Pminus = True - End Select - - 'Maximum allowable Battery-power - BAT.Bat_Pzul(jz) - PeBatMax = BAT.PmaxAntr - PeBatMin = BAT.PmaxLaden - - '************************************ Gear selection ************************************ - If VehState0 = tVehState.Stopped Then - Gear = 0 - Clutch = tEngClutch.Opened - Else - 'Check whether Clutch-lock (important for Gear-shifting model): - If fnn(Vist, 1, False) < Kuppln_norm And Pplus Then - Clutch = tEngClutch.Slipping - Else - Clutch = tEngClutch.Closed - End If - - If Gvorg Then - 'Gear-setting - Gear = Math.Min(Vh.GearVorg(jz), VEH.ganganz) - ElseIf Nvorg Then - 'Revolutions-setting - Gear = fGearByU(MODdata.nUvorg(jz), Vist) - ElseIf VEH.ganganz = 1 Then - Gear = 1 - Else - If GnachV Then - 'Gear from Speed is not supported here - WorkerMsg(tMsgID.Err, "Geary-By-Speed not supported in EV mode!", MsgSrc) - Return False - Else - 'Gear-shifting Model - Gear = fGearEV(jz) - - 'EV: No idle due to recuperation - If Gear = 0 Then Gear = 1 - End If - End If - End If - - If Gear = -1 Then - WorkerMsg(tMsgID.Err, "Error in Gear Shift Model!", MsgSrc & "/t= " & jz + 1) - Return False - End If - - If Gear < 1 Then Clutch = tEngClutch.Opened - - 'If regenerative braking is possible according to Wheel-power: Calculate PrekupMax - If Pminus And Clutch = tEngClutch.Closed Then - 'Calculate Maximum Recuperation-power (depending on Wheel-load/Friction-coefficient) - PrekupMax = fPrekupMax() - If PrekupMax > -0.000001 Then Clutch = tEngClutch.Opened - End If - - 'Falls vor Gangwahl festgestellt wurde, dass nicht KupplSchleif, dann bei zu niedriger Drehzahl runterschalten: |@@| If before Gear-selection it Clutch was not Locked, then Shift-down at too low a Revolutions: - If Clutch = tEngClutch.Closed Then - If fnn(Vist, Gear, False) < Kuppln_norm And Not VehState0 = tVehState.Dec And Gear > 1 Then Gear -= 1 - End If - - 'Check whether Idling although Power > 0 - ' When Power before Diff > 0.1% of Nominal-power then Correct! - If Clutch = tEngClutch.Opened Then - If PvorD > 0.001 * VEH.Pnenn Then - Gear = 1 - If fnn(Vist, Gear, False) < Kuppln_norm Then - Clutch = tEngClutch.Slipping - Else - Clutch = tEngClutch.Closed - End If - End If - End If - - '************************************ Revolutions ************************************ - - '*** If the Revolutions is specified (Gemess = 2) then the next block is skipped *** - If Nvorg Then - nn = (MODdata.nUvorg(jz) - VEH.nLeerl) / (VEH.nNenn - VEH.nLeerl) - GoTo lb_nOK - End If - -lb10: - - 'Revolutions drop when decoupling - If Clutch = tEngClutch.Opened Then - If jz = 0 Then - nn = 0 - Else - nn = MODdata.nn(jz - 1) - If nn <= 0.00001 Then GoTo lb_nOK - Pmin = FLD.Pdrag(nn) - nU = nn * (VEH.nNenn - VEH.nLeerl) + VEH.nLeerl - omega1 = nU * 2 * Math.PI / 60 - M = -Pmin * 1000 * 60 / (2 * Math.PI * nU) - omega_p = M / VEH.I_mot - omega2 = omega1 - omega_p - nU = Math.Max(VEH.nLeerl, omega2 * 60 / (2 * Math.PI)) - nn = (nU - VEH.nLeerl) / (VEH.nNenn - VEH.nLeerl) - End If - - Else - - nn = fnn(Vist, Gear, Clutch = tEngClutch.Slipping) - - '*** Start: Revolutions-Check if not specified - - 'Check whether Revolutions too high! => Upshift - Do While nn > 1 And Gear < VEH.ganganz - Gear += 1 - nn = fnn(Vist, Gear, Clutch = tEngClutch.Slipping) - Loop - - 'Check whether Revolutions too low with the Clutch-closed - If Clutch = tEngClutch.Closed Then - If nn < 0.001 Then - Gear = 0 - Clutch = tEngClutch.Opened - End If - End If - - End If - - -lb_nOK: - '************************************ Determine Engine-state ************************************ - ' nn fix is here! - nU = nn * (VEH.nNenn - VEH.nLeerl) + VEH.nLeerl - - 'Nebenverbrauch bestimmen (aus VEH und DRI) |@@| Determine next Consumption (from VEH and DRI) - Paux = fPaux(jz, nU) - - 'Engine-inertia - If Clutch = tEngClutch.Opened Then - If jz = 0 Then - PaMot = 0 - Else - 'Not optimal since jz-1 to jz not the right Interval - PaMot = (VEH.I_mot * (nU - MODdata.nU(jz - 1)) * 0.01096 * (nU + MODdata.nU(jz - 1) / 2)) * 0.001 - End If - Else - If Nvorg Then - 'Revolutions-setting - PaMot = (VEH.I_mot * MODdata.dnUvorg(jz) * 0.01096 * MODdata.nUvorg(jz)) * 0.001 - Else - PaMot = ((VEH.I_mot * (VEH.AchsI * VEH.Igetr(Gear) / (0.5 * VEH.Dreifen)) ^ 2) * aist * Vist) * 0.001 - End If - End If - - 'Total Engine-power - ' => Pantr - ' => P - ' => Pkup - Select Case Clutch - Case tEngClutch.Opened - P = PaMot - Pkup = 0 - PlossGB = 0 - PlossDiff = 0 - PlossRt = 0 - PaGetr = 0 - Case tEngClutch.Closed - PlossGB = fPlossGB(PvorD, Vist, Gear) - PlossDiff = fPlossDiff(PvorD, Vist) - PlossRt = fPlossRt(Vist, Gear) - PaGetr = fPaG(Vist, aist) - Pkup = PvorD + PlossGB + PlossDiff + PaGetr + PlossRt - P = Pkup + PaMot - Case tEngClutch.Slipping - PlossGB = fPlossGB(PvorD, Vist, Gear) - PlossDiff = fPlossDiff(PvorD, Vist) - PlossRt = fPlossRt(Vist, Gear) - PaGetr = fPaG(Vist, aist) - Pkup = (PvorD + PlossGB + PlossDiff + PaGetr + PlossRt) / KupplEta - P = Pkup + PaMot - End Select - - 'EngState - Select Case P - Case Is > 0.0001 'Antrieb - EngState0 = tEngState.Load - - Case Is < -0.0001 'Rekuperieren - EngState0 = tEngState.Drag - - Case Else 'Idle/Stop - EngState0 = tEngState.Stopped - End Select - - - '*************** Power distribution, etc. ****************** - - 'Full-load/Drag-curve - If EngState0 = tEngState.Stopped Then - Pmin = 0 - Pmax = 0 - PeBatMax = 0 - PeBatMax = 0 - nU = 0 - nn = (nU - VEH.nLeerl) / (VEH.nNenn - VEH.nLeerl) - Else - Pmax = fPeEMmax(nn) - Pmin = fPeEMmin(nn) - End If - - ' => Pbrake - Select Case EngState0 - Case tEngState.Load - Pbrake = 0 - If Math.Abs(P / Pmax - 1) < 0.02 Then EngState0 = tEngState.FullLoad - Case tEngState.Drag - - 'Calculate Maximum Recuperation power (depending on Wheel-load/Friction-coefficient) - 'PrekupMax = fPrekupMax() - - 'If RecupMax exceeded, then must recalculate Pe - If PrekupMax > PvorD And Clutch = tEngClutch.Closed Then - - 'PbrakeRek = power which must be additionally hampered mechanical overrun of RekupMax - 'wird schon oben nach Gangwahl erledigt: PbrakeRek = Pantr - PrekupMax |@@| is already done by top gear selection: PbrakeRek = Pantr - PrekupMax - - 'New EM-Power - P = PrekupMax + fPlossGB(PrekupMax, Vist, Gear) + fPlossDiff(PrekupMax, Vist) + fPaG(Vist, aist) + PaMot - - End If - - 'Check ob Leistung aufgenommen werden kann (abh. von FLD und Batterie). Bremsleistung berechnen. |@@| Check whether power can be added (depending on battery and FLD). Compute Braking Power. - If P < Pmin Then - Pbrake = P - Pmin - P = Pmin - EngState0 = tEngState.FullDrag - Else - Pbrake = 0 - End If - - 'Addup RekupMax-Braking-power - Pbrake += PbrakeRek - - Case Else 'tEngState.Idle, tEngState.Stopped - If PvorD < -0.00001 Then - Pbrake = PvorD - Else - Pbrake = 0 - End If - - End Select - - 'Check whether above Full-load => Speed-reduction - If Pplus And P > Pmax Then - If EngState0 = tEngState.Load Or EngState0 = tEngState.FullLoad Then - - 'When Pmax = 0 then Battery must be empty - If Pmax < 0.0001 Then GoTo lbBatLeer - - If Vist > 0.01 Then - Select Case P / Pmax - Case Is > 1.6 - Vh.ReduceSpeed(jz, 0.99) - Case Is > 1.3 - Vh.ReduceSpeed(jz, 0.995) - Case Else - Vh.ReduceSpeed(jz, 0.999) - End Select - GoTo lbGschw - Else - 'ERROR: Velocity reduction brings nothing? ... - WorkerMsg(tMsgID.Err, "P > Pmax ?!", MsgSrc) - Return False - End If - End If - End If - - '------------------------------------------------------- - '------------------------- PNR ------------------------- - '------------------------------------------------------- - ' Finish Second - - If PHEMworker.CancellationPending Then Return True - - '************************************************** - '******************** EM ************************** - If P = 0 Then - PiEM = 0 - Else - PiEM = fPifromPe(nn, P) - End If - - '************************************************** - '***************** Battery *********************** - If EngState0 = tEngState.Stopped Or P = 0 Then - PeBat0 = Paux - Else - PeBat0 = fPifromPe(nn, P) + Paux - End If - - BAT.Bat_Calc(PeBat0, jz) - - PiBat0 = PeBat0 + BAT.PbatV - - '************************************************* - '****** Write Modal-value Fields ************** - MODdata.Pe.Add(P / VEH.Pnenn) - MODdata.nn.Add(nn) - MODdata.nU.Add(nU) - MODdata.EngState.Add(EngState0) - MODdata.Pa.Add(fPaFZ(MODdata.Vh.V(jz), MODdata.Vh.a(jz))) - MODdata.Pluft.Add(fPair(MODdata.Vh.V(jz), jz)) - MODdata.Proll.Add(fPr(MODdata.Vh.V(jz))) - MODdata.Pstg.Add(fPs(MODdata.Vh.V(jz), jz)) - MODdata.Pbrake.Add(Pbrake) - MODdata.Psum.Add(PvorD) - MODdata.PauxSum.Add(Paux) - - For Each AuxID As String In VEH.AuxRefs.Keys - MODdata.Paux(AuxID).Add(VEH.Paux(AuxID, jz, nU)) - Next - - MODdata.PlossGB.Add(PlossGB) - MODdata.PlossDiff.Add(PlossDiff) - MODdata.PlossRt.Add(PlossRt) - MODdata.PaEng.Add(PaMot) - MODdata.PaGB.Add(PaGetr) - - MODdata.VehState.Add(VehState0) - MODdata.Gear.Add(Gear) - - PeEMot.Add(P) - PiEMot.Add(PiEM) - PeBat.Add(PeBat0) - PiBat.Add(PiBat0) - Ubat.Add(BAT.Ubat) - Ibat.Add(BAT.Ibat) - SOC.Add(BAT.SOC) - TempBat.Add(BAT.TempBat) - - If SOC(jz) <= BAT.SOC_MIN Then GoTo lbBatLeer - - If Cfg.WegKorJa Then Vh.DistCorrection(jz, VehState0) - - - If Vh.Vsoll(jz) - Vist > 1.5 Then SecSpeedRed += 1 - - 'Notify - If MODdata.ModErrors.MsgOutputAbort(jz + 1, MsgSrc) Then Return False - - Loop Until jz >= Tzykl - - '*********************************************************************************************** - '********************************* Time loop END ************************************* - '*********************************************************************************************** - - - 'Notify (not ADV) - If NotAdvMode Then - - If Cfg.WegKorJa Then - If MODdata.tDim > TzyklOgl Then WorkerMsg(tMsgID.Warn, "Cycle extended by " & MODdata.tDim - TzyklOgl & " seconds.", MsgSrc) - End If - - If SecSpeedRed > 0 Then WorkerMsg(tMsgID.Warn, "Speed reduction > 1.5 m/s in " & SecSpeedRed & " time steps.", MsgSrc) - - End If - - - GoTo lbDone - - - -lbBatLeer: - - 'TODO Error message etc - MODdata.tDim = jz - 1 - WorkerMsg(tMsgID.Warn, "SOC-Min reached! Calculation aborted!", MsgSrc) - -lbDone: - - 'CleanUp - Vh = Nothing - PeL = Nothing - PiL = Nothing - nnL = Nothing - WGL = Nothing - - Return True - - End Function - - Public Function HEV_Calc() As Boolean - - Dim M As Single - Dim nn As Single - Dim nU As Single - Dim omega_p As Single - Dim omega1 As Single, omega2 As Single - Dim TzyklOgl As Int32 - Dim jz As Integer - - Dim Vh As cVh - - Dim Gear As Integer - Dim GnachV As Boolean - Dim PKWja As Boolean - - Dim P As Single - Dim Pkup As Single - Dim PaGetr As Single - Dim ICEmin As Single - Dim ICEmax As Single - Dim Paux As Single - Dim Pbrake As Single - Dim PlossGB As Single - Dim PlossDiff As Single - Dim PlossRt As Single - - Dim GVset As Boolean - - 'Route(Weg) correction - Dim WegIst As Single - Dim WegX As Integer - - Dim SecSpeedRed As Integer - - Dim nU0 As Single - - 'HEV - Dim SOC0 As Single - Dim SOCo As Single - Dim SOCu As Single - Dim EMmin As Single - Dim EMmax As Single - - Dim BatLvl As tBatLvl - Dim ICElock As tICElock - Dim LockCount As Integer - - Dim PaICE As Single - Dim PaEM As Single - - Dim PeEV As Single - Dim PeICEonly As Single - Dim PeKomb As Single - - Dim FirstSec As Boolean - - Dim LastHEVmode As tHEVparMode - Dim LastHEVnotPossible As Boolean - Dim LastEngState As tEngState - Dim LastPeICE As Single - Dim StateChange As Boolean - - Dim ModeCheck As Dictionary(Of tHEVparMode, Boolean) - Dim EVcrit As Boolean - Dim HEVmode0 As tHEVparMode - Dim HEVmodeByKe As tHEVparMode - Dim NeedBoost As Boolean - Dim Under_vEVu As Boolean - Dim Under_vEVo As Boolean - - Dim KeA As Single - Dim KeG As Single - Dim KeSTE As Single - Dim KeFail As Boolean - Dim DeltaG As Single - Dim DeltaA As Single - - Dim Pel As Single - Dim PelStep As Single = 0.5 - Dim FCbasis As Single - Dim Pvkm As Single - Dim PvkmAlt As Single - Dim KeAmin As Single - Dim KeGmax As Single - Dim PelOpt As Single - Dim FCminus As Single - Dim FCplus As Single - Dim Pmot As Single - Dim Pbat As Single - Dim PeKeAoptEM As Single - Dim PeKeGoptEM As Single - Dim PeKeAoptICE As Single - Dim PeKeGoptICE As Single - Dim bAbort As Boolean - - Dim PeBat0 As Single - Dim PiBat0 As Single - - Dim PeICE As Single - Dim nnICE As Single - Dim nUICE As Single - - Dim PeEM As Single - Dim PiEM As Single - Dim nUEM As Single - - Dim PrekupMax As Single - - Dim ICEclutch As Boolean - Dim EMclutch As Boolean - - Dim StdMode As Boolean - Dim NotAdvMode As Boolean - Dim MsgSrc As String - - MsgSrc = "Power/HEV_Calc" - - StdMode = (PHEMmode = tPHEMmode.ModeSTANDARD) - NotAdvMode = Not (PHEMmode = tPHEMmode.ModeADVANCE) - - - ModeCheck = New Dictionary(Of tHEVparMode, Boolean) - ModeCheck.Add(tHEVparMode.Assist, False) - ModeCheck.Add(tHEVparMode.LPI, False) - ModeCheck.Add(tHEVparMode.EV, False) - ModeCheck.Add(tHEVparMode.ICEonly, False) - ModeCheck.Add(tHEVparMode.Rekup, False) - - 'Abort when no speed given - If Not DRI.Vvorg Then - WorkerMsg(tMsgID.Err, "Driving cycle is not valid! Vehicle Speed required.", MsgSrc) - Return False - End If - - ' Initialize - Vh = MODdata.Vh - If Cfg.GnVorgab Then - Gvorg = DRI.Gvorg - Nvorg = DRI.Nvorg - Else - Gvorg = False - Nvorg = False - End If - PKWja = GEN.PKWja - LockCount = 0 - WegIst = 0 - WegX = 0 - SecSpeedRed = 0 - - If GEN.izykwael = 4 Then - Kuppln_norm = 0.05 - KupplEta = 0.4 - Else - Kuppln_norm = 0.03 - KupplEta = 1 - End If - - 'Gear-shifting points for NEDC/FTP - Select Case GEN.izykwael - Case 0 'Nefzja = True - GnachV = True - avh(1) = 16 / 3.6 - avh(2) = 34.0 / 3.6 - avh(3) = 51 / 3.6 - avh(4) = 69 / 3.6 - If (VEH.ganganz = 5) Then - avh(5) = 180 / 3.6 - Else - avh(5) = 99 / 3.6 - avh(6) = 180 / 3.6 - End If - avl(1) = -5.0 / 3.6 - avl(2) = 0.1 / 3.6 - avl(3) = 34.0 / 3.6 - avl(4) = 34.0 / 3.6 - avl(5) = 60.0 / 3.6 - avl(6) = 60.0 / 3.6 - Case 1 'Ftpja = True - GnachV = True - avh(1) = 25 / 3.6 - avh(2) = 40 / 3.6 - avh(3) = 65 / 3.6 - avh(4) = 74 / 3.6 - avh(5) = 200 / 3.6 - avl(1) = 12.9 / 3.6 - avl(2) = 13.0 / 3.6 - avl(3) = 28 / 3.6 - avl(4) = 52 / 3.6 - avl(5) = 60 / 3.6 - avl(6) = 200 / 3.6 - Case Else - GnachV = False - 'Gear-shifting parameters initialization - Aaufi = 0.3 - Baufi = 0.3 - Caufi = 0.4 - Aobi = 0.18 - Bobi = 0.28 - Cobi = 0.46 - End Select - - 'Theoretical maximum speed [m/s] - GVmax = VEH.nNenn * VEH.Dreifen * Math.PI / (VEH.AchsI * VEH.Igetr(VEH.ganganz) * 60) - - 'HEV - SOC0 = BAT.SOC - FirstSec = True - StateChange = True - ICElock = tICElock.NoLock - LockCount = 0 - LastPeICE = 0 - LastHEVmode = tHEVparMode.Undefined - LastHEVnotPossible = True - LastEngState = tEngState.Idle - BatLvl = tBatLvl.OK - Under_vEVu = False - Under_vEVo = False - - jz = -1 - TzyklOgl = MODdata.tDim - - '*********************************************************************************************** - '*********************************** Time-loop **************************************** - '*********************************************************************************************** - - Do - jz += 1 - GVset = False - - 'Secondary Progressbar - If NotAdvMode Then ProgBarCtrl.ProgJobInt = CInt(100 * jz / MODdata.tDim) - - ' Determine State - -lbGschw: - - 'Speed / Acceleration calculation ------------------- - 'Now by DRI-class - Vist = Vh.V(jz) - aist = Vh.a(jz) - - 'If Speed over Theoretical-top-speed => Reduce - If Vist > GVmax + 0.0001 And Not GVset Then - Vh.SetSpeed0(jz, GVmax) - GVset = True - GoTo lbGschw - End If - - 'From Power ----- - If aist < 0 Then - If (Vist < 0.025) Then - 'Vh.SetSpeed(jz, 0) - 'GoTo lbGschw - Vist = 0 - End If - End If - '--------------- - - '******************************************************************************* - '*************************** Determine Driving-state ***************************** - - 'Determine Driving-state------------------------- - Pplus = False - Pminus = False - - If Vist < 0.0001 Then - VehState0 = tVehState.Stopped - Else - If aist >= 0.1 Then - VehState0 = tVehState.Acc - ElseIf aist < -0.1 Then - VehState0 = tVehState.Dec - Else - VehState0 = tVehState.Cruise - End If - End If - - - '******************************************************************************* - '************************************* HEV ************************************* - Select Case BatLvl - Case tBatLvl.Full, tBatLvl.High - SOCo = 0.95 * HEV.SOC_OW - SOCu = 0.95 * HEV.SOC_UW - Case tBatLvl.Empty, tBatLvl.Low - SOCo = 1.05 * HEV.SOC_OW - SOCu = 1.05 * HEV.SOC_UW - Case Else - SOCo = 1.05 * HEV.SOC_OW - SOCu = 0.95 * HEV.SOC_UW - End Select - - Select Case SOC0 - Case Is >= BAT.SOC_MAX - BatLvl = tBatLvl.Full - Case Is > SOCo - BatLvl = tBatLvl.High - Case Is > SOCu - BatLvl = tBatLvl.OK - Case Is > BAT.SOC_MIN - BatLvl = tBatLvl.Low - Case Else - BatLvl = tBatLvl.Empty - End Select - - ModeCheck(tHEVparMode.Assist) = False - ModeCheck(tHEVparMode.LPI) = False - ModeCheck(tHEVparMode.EV) = False - ModeCheck(tHEVparMode.ICEonly) = False - ModeCheck(tHEVparMode.Rekup) = False - NeedBoost = False - HEVmode0 = tHEVparMode.Undefined - ICEclutch = False - EMclutch = False - PeICE = 0 - PeEM = 0 - EVcrit = False - KeFail = False - - If Under_vEVu Then - If Vist >= 1.05 * HEV.vEVu Then Under_vEVu = False 'Größer-Gleich damit bei vEVu = 0 immer Under_vEVu = False - Else - If Vist < 0.95 * HEV.vEVu Then Under_vEVu = True - End If - - If Under_vEVo Then - If Vist >= 1.05 * HEV.vEVo Then Under_vEVo = False 'Größer-Gleich damit bei vEVo = 0 immer Under_vEVu = False - Else - If Vist < 0.95 * HEV.vEVo Then Under_vEVo = True - End If - - If Not FirstSec Then StateChange = (VehState0 <> MODdata.VehState(jz - 1)) - - '********************* PvorD = PanRad ************************ - - PvorD = fPvD(jz) - - Select Case PvorD - Case Is > 0.0001 - Pplus = True - Case Is < -0.0001 - Pminus = True - End Select - - '************************************ Gear selection ************************************ - If VehState0 = tVehState.Stopped Then - Gear = 0 - Clutch = tEngClutch.Opened - Else - 'Check whether Clutch Locks (important for Gear-shifting model): - If fnn(Vist, 1, False) < Kuppln_norm And Pplus Then - Clutch = tEngClutch.Slipping - Else - Clutch = tEngClutch.Closed - End If - - If Gvorg Then - 'Gear-settings - Gear = Math.Min(Vh.GearVorg(jz), VEH.ganganz) - ElseIf Nvorg Then - 'Revolutions-setting - Gear = fGearByU(MODdata.nUvorg(jz), Vist) - ElseIf VEH.ganganz = 1 Then - Gear = 1 - Else - If GnachV Then - 'Gear from Speed - Gear = fGearBySpeed(jz) - Else - 'Gear-shifting Model - If PKWja Then - Gear = fGearPKW(jz) - Else - Gear = fGearLKW(jz) - End If - End If - End If - End If - - If Gear = -1 Then - WorkerMsg(tMsgID.Err, "Error in Gear Shift Model!", MsgSrc & "/t= " & jz + 1) - Return False - End If - - 'Nebenverbrauch bestimmen (aus VEH und DRI) |@@| Determine next Consumption (from VEH and DRI) - Paux = fPaux(jz, 0) - - 'HEV-Teil kommt erst nach Gangwahl weil Getr./Diff-Loss den benötigt und EM zwischen ICE und GB liegt |@@| HEV-part comes after Gear-selection because Transmission/Diff-loss and requires the EM is between ICE and GB - If VehState0 = tVehState.Stopped Then - - PeICE = 0 - PeEM = 0 - ICEclutch = False - EMclutch = False - - 'Nebenverbrauch bestimmen (aus VEH und DRI) |@@| Determine next consumption (from VEH and DRI) - Paux = fPaux(jz, 0) - - Else - - If Nvorg Then - 'If Revolutions specified - nU = MODdata.nUvorg(jz) - Else - 'Otherwise from Vist and Gear - nU = fnU(Vist, Gear, Clutch = tEngClutch.Slipping) - End If - - 'Normalized Revolutions - nn = (nU - VEH.nLeerl) / (VEH.nNenn - VEH.nLeerl) - - 'Maximum power of the ICE - If jz = 0 Then - ICEmax = FLD.Pfull(nn) - Else - ICEmax = FLD.Pfull(nn, MODdata.Pe(jz - 1)) - End If - - ICEmin = FLD.Pdrag(nn) - - 'Nebenverbrauch bestimmen (aus VEH und DRI) |@@| Determine next consumption (from VEH and DRI) - Paux = fPaux(jz, nU) - - 'Maximum allowable Battery-power - BAT.Bat_Pzul(jz) - PeBatMax = Math.Max(BAT.PmaxAntr - Paux, 0) 'Paux reduziert maximale Entlade-Leistung - PeBatMin = Math.Min(BAT.PmaxLaden - Paux, 0) 'Paux erhöht (!) maximale Lade-Leistung - - 'Maximale EM-Leistung. (Batterieleistung limitiert EM-Leistung) |@@| Maximum EM-Power (Battery-power limited by EM power) - EMmax = EMO.PeMax(nU) - Do While EMO.PiEM(nU, EMmax) > PeBatMax - EMmax *= 0.995 - Loop - - EMmin = EMO.PeMin(nU) - Do While EMO.PiEM(nU, EMmax) < PeBatMin - EMmax *= 0.995 - Loop - - 'Leistung bis ICE/EM (= an Kupplung) berechnen |@@| Power to ICE/EM (= coupling to) get - PlossGB = fPlossGB(PvorD, Vist, Gear) - PlossDiff = fPlossDiff(PvorD, Vist) - PlossRt = fPlossRt(Vist, Gear) - PaGetr = fPaG(Vist, aist) - - 'Power to clutch - Pkup = PvorD + PlossGB + PlossDiff + PaGetr + PlossRt - - 'PaMot - If Nvorg Then - 'Revolutions-setting - PaICE = (VEH.I_mot * MODdata.dnUvorg(jz) * 0.01096 * MODdata.nUvorg(jz)) * 0.001 - PaEM = (EMO.I_mot * MODdata.dnUvorg(jz) * 0.01096 * MODdata.nUvorg(jz)) * 0.001 - Else - PaICE = ((VEH.I_mot * (VEH.AchsI * VEH.Igetr(Gear) / (0.5 * VEH.Dreifen)) ^ 2) * aist * Vist) * 0.001 - PaEM = ((EMO.I_mot * (VEH.AchsI * VEH.Igetr(Gear) / (0.5 * VEH.Dreifen)) ^ 2) * aist * Vist) * 0.001 - End If - - '***** Power required in EV-mode - ' Power to Clutch plus EM-inertia - PeEV = Pkup + PaEM - '! CAUTION: If ICE is engaged then PaICE must also be ! => Later in power distribution - - '***** Power required in the ICE+EM-operation - PeKomb = Pkup + PaICE + PaEM - - '***** Power required in ICE-operation - PeICEonly = Pkup + PaICE - - '***** Check whether EV possible - ' => Bat <> Low - ' => EM-Power >= Drivetrain-power - ' => v < vEVo - If BatLvl <> tBatLvl.Empty And BatLvl <> tBatLvl.Low And PeEV <= EMmax And Under_vEVo Then ModeCheck(tHEVparMode.EV) = True - - '***** If EV possible: check whether critical - If ModeCheck(tHEVparMode.EV) And PeEV > 0.9 * EMmax Then EVcrit = True - - '***** Check whether Assist / LPI / ICEonly is possible and if Boost is needed - ' => ICE-On must be possible (ICElock) - If ICElock <> tICElock.OffLock Then - - 'Assist / Boost - ' => SOC > MIN - If BatLvl <> tBatLvl.Empty Then - ModeCheck(tHEVparMode.Assist) = True - 'Boost - ' => ICE at Full-load - If PeICEonly > ICEmax Then NeedBoost = True - End If - - 'LPI - ' => Bat <> High - If BatLvl <> tBatLvl.High Then ModeCheck(tHEVparMode.LPI) = True - - 'ICEonly - ModeCheck(tHEVparMode.ICEonly) = True - - End If - - '***** Check whether Recuparation possible - ModeCheck(tHEVparMode.Rekup) = (BatLvl <> tBatLvl.Full) - Pbrake = 0 - - - '*********************************************************************************************** - '********************************* Driving-state distinction ********************************* - '*********************************************************************************************** - - If Pplus Then - - '**************************************************************************************** - '***************************** Transmission-Mode pre-selection ******************************** - - If NeedBoost Then - - 'if Boost necessary (and possible), then no Choice - HEVmode0 = tHEVparMode.Assist - - ElseIf ModeCheck(tHEVparMode.EV) Then - - 'EV mode when ... - If Not ModeCheck(tHEVparMode.ICEonly) Or Under_vEVu Or BatLvl = tBatLvl.High Then 'ICE nicht möglich, Vist unter EVu oder Batterieladung hoch - - HEVmode0 = tHEVparMode.EV - - End If - - Else - - 'If EV & ICE is not possible then EV-mode till ICE starts again .... should never happen because no ICE-shutdown when little SOC - If Not ModeCheck(tHEVparMode.ICEonly) Then - - HEVmode0 = tHEVparMode.EV - - End If - - End If - - - 'If use of HEV strategy: - ' Ke's calculation - If HEVmode0 = tHEVparMode.Undefined Then - - '************** Calculate optimal Ke's and Power for it ************ - - 'Emission/Consumption in g/h - FCbasis = MAP.GetSingleValue(tMapComp.FC, nn, PeICEonly / VEH.Pnenn) - - '*********************************************************************** - '******************************* KeSTE ********************************* - '*********************************************************************** - - 'KeSTE from STE-curve ... - KeSTE = HEV.STEintp(SOC0) - - - '*********************************************************************** - '******************************** KeA ********************************** - '*********************************************************************** - - If ModeCheck(tHEVparMode.Assist) Then - bAbort = False - Pel = 0 - PelOpt = 0 - PeKeAoptICE = 0 - KeAmin = 999999 - Do While Pel + PelStep < EMmax - Pel += PelStep - Pvkm = PeKomb - Pel - - 'Remain under Max-Pe - If Pvkm > ICEmax Then Continue Do - - 'If Pvkm negative: Calculation of the pure EM-transmission?(Betrieb) - If Pvkm <= 0 Then - - ' ...not valid if Batlvl <= Low or ICEonLock - If Not ModeCheck(tHEVparMode.EV) Or ICElock = tICElock.OnLock Then Exit Do - - 'EM-Power = P-Drivetrain - Pel = PeEV - Pvkm = 0 - - 'Consumption-reduction in g/h - FCminus = FCbasis - - 'Abort according to this calculation (more EM-power makes no sense because Drivetrain already pure electric) - bAbort = True - - Else - - 'Consumption-savings in g/h - FCminus = FCbasis - MAP.GetSingleValue(tMapComp.FC, nn, Pvkm / VEH.Pnenn) - - End If - - 'Power to electric motor in kW - Pmot = EMO.PiEM(nU, Pel) - - If Pmot > PeBatMax Then - If bAbort Then - Exit Do - Else - Continue Do - End If - End If - - 'Power in battery - Pbat = BAT.PiBat(Pmot) - - If Pbat = 0 Then Stop - - 'Div/0 and Sign checks - If FCminus > 0 Then - - 'KeA calculated in kWh/kg - KeA = 1000 * Pbat / FCminus - - 'Check whether Optimum - If KeA < KeAmin Then - KeAmin = KeA - PelOpt = Pel - PeKeAoptICE = Pvkm - End If - End If - - 'Abort when already reached pure EM-mode - If bAbort Then Exit Do - - Loop - - PeKeAoptEM = PelOpt - - KeA = KeAmin - - DeltaA = KeSTE - KeA - - Else - - DeltaA = -1 - - End If - - - '*********************************************************************** - '******************************** KeG ********************************** - '*********************************************************************** - - If ModeCheck(tHEVparMode.LPI) Then - bAbort = False - Pel = 0 - PelOpt = 0 - PeKeGoptICE = 0 - KeGmax = 0 - Do While Pel - PelStep > EMmin - - Pel -= PelStep - Pvkm = PeKomb - Pel - - 'If Pvkm at Full-load: - If Pvkm > 0.99 * ICEmax Then - - 'Put Pvkm on full load - Pvkm = 0.99F * ICEmax - - 'EM in generator-mode (Pges1 - Pvkm < 0) - Pel = PeKomb - Pvkm - - 'Abort after this pass because Generating more impossible - bAbort = True - - End If - - 'Additional consumption in g/h - FCplus = MAP.GetSingleValue(tMapComp.FC, nn, Pvkm / VEH.Pnenn) - FCbasis - - 'Power to Electric-motor in kW - Pmot = EMO.PiEM(nU, Pel) - - If Pmot < PeBatMin Then - If bAbort Then - Exit Do - Else - Continue Do - End If - End If - - 'Power in battery - Pbat = BAT.PiBat(Pmot) - - If Pbat = 0 Then Exit Do - - 'Div/0 and Sign checks - If FCplus > 0 Then - - 'Calculate KeG in kWh/kg - KeG = -1000 * Pbat / FCplus - - 'Check whether Optimum - If KeG > KeGmax Then - KeGmax = KeG - PelOpt = Pel - PeKeGoptICE = Pvkm - End If - - End If - - 'Abort when already reached VKM-full-load - If bAbort Then Exit Do - - Loop - - PeKeGoptEM = PelOpt - - KeG = KeGmax - - 'Abstand Eta zu Kurve berechnen |@@| Calculate Distance Eta from Curve - DeltaG = KeG - KeSTE - - Else - - DeltaG = -1 - - End If - - '*********************************************************************** - '********************** Evaluate KeSTE, Deltas ************************ - '*********************************************************************** - - If DeltaG < 0 And DeltaA < 0 Then - KeFail = True - Else - If (DeltaA > DeltaG) And ModeCheck(tHEVparMode.Assist) Then - HEVmodeByKe = tHEVparMode.Assist - ElseIf DeltaG > 0 And ModeCheck(tHEVparMode.LPI) Then - HEVmodeByKe = tHEVparMode.LPI - Else - KeFail = True - End If - End If - - If KeFail Then - If ModeCheck(tHEVparMode.EV) Then - If LastHEVmode = tHEVparMode.EV Or LastEngState = tEngState.Stopped Or LastEngState = tEngState.Idle Then - HEVmodeByKe = tHEVparMode.EV - Else - HEVmodeByKe = tHEVparMode.ICEonly - End If - Else - HEVmodeByKe = tHEVparMode.ICEonly - End If - End If - - - '*********************************************************************** - '************************* Operating strategy *************************** - '*********************************************************************** - - 'LastHEVmode-Check - If Not FirstSec Then - - - Select Case LastHEVmode - Case tHEVparMode.Undefined, tHEVparMode.Rekup - LastHEVnotPossible = True - PvkmAlt = 0 - Case Else - LastHEVnotPossible = Not ModeCheck(LastHEVmode) - - Select Case LastHEVmode - - Case tHEVparMode.Assist - PvkmAlt = PeKeAoptICE - Case tHEVparMode.LPI - PvkmAlt = PeKeGoptICE - Case Else ' tHEVparMode.ICEonly - PvkmAlt = PeICEonly - - End Select - - End Select - - End If - - '** Ke-mode used when ... - If HEVmodeByKe = LastHEVmode Or StateChange Or LastHEVnotPossible Then - - '...Same mode as before, change Driving-state or last mode impossible - HEVmode0 = HEVmodeByKe - - Else - - '...when Engine is not running - If LastEngState = tEngState.Stopped Then - - HEVmode0 = HEVmodeByKe - - '...if the PeICE Power-change is lowest with the new Mode - Else - - Select Case HEVmodeByKe - Case tHEVparMode.Assist - Pvkm = PeKeAoptICE - Case tHEVparMode.LPI - Pvkm = PeKeGoptICE - Case tHEVparMode.ICEonly - Pvkm = PeICEonly - End Select - - If Math.Abs(Pvkm - LastPeICE) < Math.Abs(PvkmAlt - LastPeICE) Then - HEVmode0 = HEVmodeByKe - Else - HEVmode0 = LastHEVmode - End If - - End If - - End If - - End If - - '******************************************************************************************** - '****************************** Distribute Power to each Mode ************************** - '******************************************************************************************** - - Select Case HEVmode0 - - Case tHEVparMode.EV - - 'EM assumes the entire Power - PeEM = PeEV - - 'Speed reduced if power is too high for EM or Bat - If PeEM > EMmax Or EMO.PiEM(nU, PeEM) > PeBatMax Then - Vh.ReduceSpeed(jz, 0.995) - GoTo lbGschw - End If - - 'If ICElock or EVcrit then ICE on (but disconnected) - If ICElock = tICElock.OnLock Or (EVcrit And ICElock <> tICElock.OffLock) Then - EngState0 = tEngState.Idle - Else - EngState0 = tEngState.Stopped - End If - - PeICE = 0 - - ICEclutch = False - EMclutch = True - - Case tHEVparMode.ICEonly - - 'ICE assumes the entire Drivetrain - If PeICEonly > ICEmax Then - Vh.ReduceSpeed(jz, 0.995) - GoTo lbGschw - End If - - PeEM = 0 - - PeICE = PeICEonly - - EngState0 = tEngState.Load - - ICEclutch = True - EMclutch = False - - Case tHEVparMode.Assist - - If NeedBoost Then - - If EMmax + PeKeAoptICE > PeKomb Then - - PeICE = PeKeAoptICE - PeEM = PeKomb - PeICE - - ElseIf EMmax + ICEmax > PeKomb Then - - PeICE = ICEmax - PeEM = PeKomb - PeICE - - Else - - Vh.ReduceSpeed(jz, 0.995) - GoTo lbGschw - - End If - - Else - - PeICE = PeKeAoptICE - PeEM = PeKeAoptEM - - End If - - EngState0 = tEngState.Load - - ICEclutch = True - EMclutch = True - - Case tHEVparMode.LPI - - PeICE = PeKeGoptICE - PeEM = PeKeGoptEM - - EngState0 = tEngState.Load - - ICEclutch = True - EMclutch = True - - End Select - - If EngState0 = tEngState.Load Then - If Math.Abs(P / ICEmax - 1) < 0.02 Then EngState0 = tEngState.FullLoad - End If - - ElseIf Pminus Then - - HEVmode0 = tHEVparMode.Rekup - - 'CAUTION: ICEclutch defaults to 'false' so here no more statements - - 'Calculate maximum Recuparation-Power - PrekupMax = fPrekupMax() - - If PrekupMax > PvorD Then 'Falls Rekup-Limit erreicht - - 'Mit PrekupMax auf EM/ICE zurück rechnen |@@| Calculate back PrecupMax from(auf) EM/ICE - PlossGB = fPlossGB(PrekupMax, Vist, Gear) - PlossDiff = fPlossDiff(PrekupMax, Vist) - PlossRt = fPlossRt(Vist, Gear) - Pkup = PvorD + PlossGB + PlossDiff + PaGetr + PlossRt - PeKomb = Pkup + PaICE + PaEM - PeICEonly = Pkup + PaICE - PeEV = Pkup + PaEM - - 'Den Rest gleich auf die Bremse |@@| The Residual equals that to(auf) the Brakes - Pbrake = PvorD - PrekupMax - - End If - - 'Default for ICE (so as to save the "Else" statement) - PeICE = 0 - EngState0 = tEngState.Stopped - - If ModeCheck(tHEVparMode.Rekup) Then 'Falls Rekuperation möglich... - - If ICElock = tICElock.OnLock Then 'Falls ICElock, dann ICE-Schub dazu wenn EM nicht ausreicht. Basis ist immer PeKomb - - 'Compute EM-power - PeEM = PeKomb - - If PeEM < EMmin Then 'Falls maximale EM-Max-Rekup überschritten... - - 'New EM-performance - PeEM = EMmin - - 'Residual power to ICE - PeICE = PeKomb - PeEM - EngState0 = tEngState.Drag - - 'If ICE over Drag-curve - If PeICE < ICEmin Then - - 'New ICE power - PeICE = ICEmin - - 'Rest to Brakes - Pbrake += PeKomb - PeEM - PeICE - - End If - - Else 'Falls EM-Max-Rekup nicht überschritten - - 'ICE is idle (because On-Lock) - EngState0 = tEngState.Idle - - End If - - ICEclutch = True - - Else 'Falls nicht ICElock, dann ICE-Schub nur dazu wenn ICE nicht aus. Basis ist PeEV - - 'Compute EM-power - PeEM = PeEV - - If PeEM < EMmin Then 'Falls maximale EM-Max-Rekup überschritten... - - 'New EM-performance - PeEM = EMmin - - If LastEngState <> tEngState.Stopped And PeKomb < EMmin Then 'Falls ICE nicht aus und kombinierte Leistung unter EM-Max-Rekup dann ICE in Schub - - 'ICE im Schubbetrieb |@@| ICE on the overrun - PeICE = PeKomb - PeEM - EngState0 = tEngState.Drag - - 'If ICE over Drag-curve - If PeICE < ICEmin Then - - 'New ICE-power - PeICE = ICEmin - - 'The rest to Brakes - Pbrake += PeKomb - PeEM - PeICE - - End If - - ICEclutch = True - - Else 'Falls ICE nicht verfügbar dann mechanisch dazu bremsen - - Pbrake += PeEV - PeEM - - End If - - End If - - End If - - EMclutch = True - - Else 'Falls Rekuperation nicht möglich - - If LastEngState <> tEngState.Stopped Then 'Falls ICE nicht aus dann Schub - - 'ICE on the Overrun(Schubbetrieb) - PeICE = PeICEonly - EngState0 = tEngState.Drag - - 'When ICE above Drag-curve - If PeICE < ICEmin Then - - 'New ICE-power - PeICE = ICEmin - - 'The rest of on Brakes - Pbrake += PeKomb - PeEM - PeICE - - End If - - Else 'Falls ICE aus dann alles mechanisch bremsen - - Pbrake = PvorD - - End If - - - End If - - If EngState0 = tEngState.Drag Then - If Math.Abs(P / ICEmin - 1) < 0.02 Then EngState0 = tEngState.FullDrag - End If - - Else - - 'Power zero - PeICE = 0 - PeEM = 0 - ICEclutch = False - EMclutch = False - - End If - - End If - - '************************************************************************************ - '****************************** Clutch and Revolutions ******************************* - '************************************************************************************ - - 'Main clutch => must already be known here! - 'If ICEclutch Then - ' If PeICE > 0 And fnn(Vist, Gear, False) < Kuppln_norm Then - ' Clutch = tEngClutch.Slipping - ' Else - ' Clutch = tEngClutch.Closed - ' End If - 'ElseIf EMclutch Then - ' Clutch = tEngClutch.Closed - 'Else - ' Clutch = tEngClutch.Opened - 'End If - - '************************************ ICE Revolutions************************************ - If ICEclutch Then - - nnICE = fnn(Vist, Gear, Clutch = tEngClutch.Slipping) - nUICE = nnICE * (VEH.nNenn - VEH.nLeerl) + VEH.nLeerl - - Else - - If EngState0 = tEngState.Stopped Then - nU0 = 0 - ElseIf EngState0 = tEngState.Idle Then - nU0 = VEH.nLeerl - Else - - Stop - - End If - - - If FirstSec Then - nUICE = nU0 - Else - - If Math.Abs(nU0 - MODdata.nU(jz - 1)) < 0.00001 Then - - nUICE = MODdata.nU(jz - 1) + Pbrake = PvorD - (Pkup - PlossGB - PlossDiff - PaGetr - PlossRt) + EngState0 = tEngState.FullDrag Else - - nUICE = MODdata.nU(jz - 1) - P = FLD.Pdrag(MODdata.nn(jz - 1)) - omega1 = nUICE * 2 * Math.PI / 60 - M = -P * 1000 * 60 / (2 * Math.PI * nUICE) - omega_p = M / VEH.I_mot - omega2 = omega1 - omega_p - nUICE = Math.Max(nU0, omega2 * 60 / (2 * Math.PI)) - + Pbrake = 0 End If - End If - - nnICE = (nUICE - VEH.nLeerl) / (VEH.nNenn - VEH.nLeerl) - End If - '************************************ EM Revolutions ************************************* - If EMclutch Then - nUEM = fnU(Vist, Gear, Clutch = tEngClutch.Slipping) - Else - nUEM = 0 + 'Check or Abort (before Speed-reduce-iteration, otherwise it hangs) + If PHEMworker.CancellationPending Then Return True + + 'Check whether P above Full-load => Reduce Speed + If Pplus And P > Pmax Then + If EngState0 = tEngState.Load Or EngState0 = tEngState.FullLoad Then + If Vist > 0.01 Then + Select Case P / Pmax + Case Is > 1.6 + Vh.ReduceSpeed(jz, 0.99) + Case Is > 1.3 + Vh.ReduceSpeed(jz, 0.995) + Case Else + Vh.ReduceSpeed(jz, 0.999) + End Select + FirstSecItar = False + GoTo lbGschw + Else + 'ERROR: Speed Reduction brings nothing? ... + WorkerMsg(tMsgID.Err, "Speed reduction failed!", MsgSrc & "/t= " & jz + 1) + Return False + End If + Else 'tEngState.Idle, tEngState.Stopped, tEngState.Drag + 'ERROR: Engine not in Drivetrain ... can it be? + If FirstSecItar Then + If P > 0.1 Then WorkerMsg(tMsgID.Warn, "Pwheel > 0 but EngState undefined ?!", MsgSrc & "/t= " & jz + 1) + End If + End If End If - '************************************************************************************** - '********************************* EM => Batterie ************************************* - '************************************************************************************** - PiEM = EMO.PiEM(nUEM, PeEM) + 'Interruption of traction(Zugkraftunterbrechung) + If TracIntrI > 0 Then - PeBat0 = Paux + PiEM + If Not TracIntrOn Then - BAT.Bat_Calc(PeBat0, jz) + If jz > 0 AndAlso Gear > 0 AndAlso MODdata.Gear(jz - 1) > 0 AndAlso Gear <> MODdata.Gear(jz - 1) Then - PiBat0 = PeBat0 + BAT.PbatV + TracIntrGear = Gear + Gear = 0 + Clutch = tEngClutch.Opened + TracIntrIx = 0 + TracIntrOn = True + If TracIntrIx + 1 = TracIntrI Then + ZgkrDt = VEH.TracIntrSi - CSng(TracIntrIx) + Else + ZgkrDt = 1 + End If - '------------------------------------------------------- - '------------------------- PNR ------------------------- - '------------------------------------------------------- + Vrollout = fRolloutSpeed(jz, ZgkrDt) - If PHEMworker.CancellationPending Then Return True + If Vrollout < Vist Or VehState0 <> tVehState.Dec Then Vh.SetSpeed(jz, Vrollout) - ' Finish Second + GoTo lbGschw - If FirstSec Then FirstSec = False + End If - 'ICE-Lock - ' ACHTUNG: Die beiden If-Schleifen nicht verbinden weil LockCount sich sonst verzählt |@@| CAUTION: The two If-Schleifen do not bind(verbiden) because LockCount is miscounted - If ICElock <> tICElock.NoLock Then - LockCount += 1 - If LockCount > GEN.StStT Then - LockCount = 0 - ICElock = tICElock.NoLock End If + End If - If ICElock = tICElock.NoLock Then - If EngState0 = tEngState.Stopped Then - If LastEngState <> tEngState.Stopped Then ICElock = tICElock.OffLock + '-------------------------------------------------------------------------------------------------- + '------------------------- PNR -------------------------------------------------------------------- + '-------------------------------------------------------------------------------------------------- + ' Finish Second + + 'Start / Stop - Activation-Speed Control + If GEN.StartStop Then + If StStAus Then + If Not EngState0 = tEngState.Stopped Then + StStTx += 1 + If StStTx > GEN.StStT Then + StStTx = 1 + StStAus = False + End If + End If Else - If LastEngState = tEngState.Stopped Then ICElock = tICElock.OnLock + If EngState0 = tEngState.Stopped Then StStAus = True End If End If 'Write Modal-values Fields - MODdata.Pe.Add(PeICE / VEH.Pnenn) - MODdata.nn.Add(nnICE) - MODdata.nU.Add(nUICE) + MODdata.Pe.Add(P / VEH.Pnenn) + MODdata.nn.Add(nn) + MODdata.nU.Add(nU) + MODdata.EngState.Add(EngState0) MODdata.Pa.Add(fPaFZ(MODdata.Vh.V(jz), MODdata.Vh.a(jz))) @@ -3128,50 +1180,83 @@ lbGschw: MODdata.PlossGB.Add(PlossGB) MODdata.PlossDiff.Add(PlossDiff) MODdata.PlossRt.Add(PlossRt) - MODdata.PaEng.Add(PaICE) + MODdata.PaEng.Add(PaMot) MODdata.PaGB.Add(PaGetr) MODdata.VehState.Add(VehState0) MODdata.Gear.Add(Gear) - PeEMot.Add(PeEM) - PiEMot.Add(PiEM) - PeBat.Add(PeBat0) - PiBat.Add(PiBat0) - Ubat.Add(BAT.Ubat) - Ibat.Add(BAT.Ibat) - SOC.Add(BAT.SOC) - TempBat.Add(BAT.TempBat) + If Cfg.WegKorJa Then Vh.DistCorrection(jz, VehState0) - SOC0 = BAT.SOC + 'Interruption of traction(Zugkraftunterbrechung) + If TracIntrTurnOff Then + TracIntrOn = False + TracIntrTurnOff = False - If Cfg.WegKorJa Then Vh.DistCorrection(jz, VehState0) + ElseIf TracIntrOn Then + + TracIntrIx += 1 + + If TracIntrIx = TracIntrI Then + + TracIntrTurnOff = True + + ElseIf jz < MODdata.tDim Then + If TracIntrIx + 1 = TracIntrI Then + ZgkrDt = VEH.TracIntrSi - CSng(TracIntrIx) + Else + ZgkrDt = 1 + End If + + Vrollout = fRolloutSpeed(jz + 1, ZgkrDt) + If Vrollout < Vist Or VehState0 <> tVehState.Dec Then Vh.SetSpeed(jz + 1, Vrollout) - LastEngState = EngState0 - LastHEVmode = HEVmode0 - LastPeICE = PeICE + End If + + End If If Vh.Vsoll(jz) - Vist > 1.5 Then SecSpeedRed += 1 - 'Notify + + LastGearChange = -1 + For i = jz - 1 To 0 Step -1 + If MODdata.Gear(i) <> 0 Then + If MODdata.Gear(i) <> Gear Then + LastGearChange = i + Exit For + End If + End If + Next + + + LastClutch = Clutch + + 'Messages If MODdata.ModErrors.MsgOutputAbort(jz + 1, MsgSrc) Then Return False + If Clutch = tEngClutch.Closed And Nvorg Then + If Math.Abs(nU - fnU(Vist, Gear, False)) > 0.2 * VEH.nNenn Then + WorkerMsg(tMsgID.Warn, "Target rpm =" & nU & ", calculated rpm(gear " & Gear & ")= " & fnU(Vist, Gear, False), MsgSrc & "/t= " & jz + 1) + End If + End If + + Loop Until jz >= MODdata.tDim '*********************************************************************************************** - '********************************* Time-loop END ************************************** + '*********************************** Time loop END *********************************** '*********************************************************************************************** - 'Notify (Not ADVANCE) + 'Notify (When not ADVANCE) If NotAdvMode Then If Cfg.WegKorJa Then - If MODdata.tDim > TzyklOgl Then WorkerMsg(tMsgID.Warn, "Cycle extended by " & MODdata.tDim - TzyklOgl & " seconds.", MsgSrc) + If MODdata.tDim > MODdata.tDimOgl Then WorkerMsg(tMsgID.Normal, "Cycle extended by " & MODdata.tDim - MODdata.tDimOgl & " seconds.", MsgSrc) End If - If SecSpeedRed > 0 Then WorkerMsg(tMsgID.Warn, "Speed reduction > 1.5 m/s in " & SecSpeedRed & " time steps.", MsgSrc) + If SecSpeedRed > 0 Then WorkerMsg(tMsgID.Normal, "Speed reduction > 1.5 m/s in " & SecSpeedRed & " time steps.", MsgSrc) End If @@ -3182,6 +1267,125 @@ lbGschw: End Function + Public Function Eng_Calc() As Boolean + + Dim Pmr As Single + Dim t As Integer + Dim t1 As Integer + Dim PminN As Single + Dim PmaxN As Single + Dim nnDRI As List(Of Double) + Dim PeDRI As List(Of Double) + Dim PcorCount As Integer + Dim StdMode As Boolean + Dim NotAdvMode As Boolean + Dim MsgSrc As String + + MsgSrc = "Power/Eng_Calc" + + StdMode = (PHEMmode = tPHEMmode.ModeSTANDARD) + NotAdvMode = Not (PHEMmode = tPHEMmode.ModeADVANCE) + + 'Abort if Power/Revolutions not given + If Not (DRI.Nvorg And DRI.Pvorg) Then + WorkerMsg(tMsgID.Err, "Load cycle is not valid! rpm and load required.", MsgSrc) + Return False + End If + + PcorCount = 0 + t1 = MODdata.tDim + nnDRI = DRI.Values(tDriComp.nn) + PeDRI = DRI.Values(tDriComp.Pe) + + 'Drehzahlen vorher weil sonst scheitert die Pmr-Berechnung bei MODdata.nU(t + 1) |@@| Revolutions previously, otherwise Pmr-calculation fails at MODdata.nU(t + 1) + For t = 0 To t1 + 'Write Modal value Fields + ' Allocate MODdata.Pe + MODdata.nn.Add(nnDRI(t)) + MODdata.nU.Add(Math.Max(0, nnDRI(t) * (VEH.nNenn - VEH.nLeerl) + VEH.nLeerl)) + Next + + 'Power calculation + For t = 0 To t1 + + 'Secondary Progressbar + If NotAdvMode Then ProgBarCtrl.ProgJobInt = CInt(100 * t / t1) + + 'Reset the second-by-second Errors + MODdata.ModErrors.ResetAll() + + 'OLD and wrong because not time shifted: P_mr(jz) = 0.001 * (I_mot * 0.0109662 * (n(jz) * nnrom) * nnrom * (n(jz) - n(jz - 1))) / Pnrom + If t > 0 And t < t1 Then + Pmr = 0.001 * (VEH.I_mot * (2 * Math.PI / 60) ^ 2 * MODdata.nU(t) * 0.5 * (MODdata.nU(t + 1) - MODdata.nU(t - 1))) / VEH.Pnenn + Else + Pmr = 0 + End If + + 'Power of the Cycle corrected by P_clutch + MODdata.Pe.Add(PeDRI(t) + Pmr) + + 'Revolutions of the Cycle => Determined in Cycle-init + 'If Revolutions under idle, assume Engine is stopped + If MODdata.nn(t) < Cfg.nnormEngStop Then + EngState0 = tEngState.Stopped + Else + PminN = FLD.Pdrag(MODdata.nn(t)) / VEH.Pnenn + + If t = 0 Then + PmaxN = FLD.Pfull(MODdata.nn(t)) / VEH.Pnenn + Else + PmaxN = FLD.Pfull(MODdata.nn(t), MODdata.Pe(t - 1)) / VEH.Pnenn + End If + + 'If Pmax < 0 or Pmin > 0 then Abort with Error! + If PminN >= 0 AndAlso MODdata.Pe(t) < 0 Then + WorkerMsg(tMsgID.Err, "Pe_drag > 0! n_norm= " & MODdata.nn(t), MsgSrc & "/t= " & t + 1) + Return False + ElseIf PmaxN <= 0 AndAlso MODdata.Pe(t) > 0 Then + WorkerMsg(tMsgID.Err, "Pe_full < 0! n_norm= " & MODdata.nn(t), MsgSrc & "/t= " & t + 1) + Return False + End If + + 'FLD Check + If MODdata.Pe(t) > PmaxN Then + If MODdata.Pe(t) / PmaxN > 1.05 Then PcorCount += 1 + MODdata.Pe(t) = PmaxN + ElseIf MODdata.Pe(t) < PminN Then + If MODdata.Pe(t) / PminN > 1.05 Then PcorCount += 1 + MODdata.Pe(t) = PminN + End If + + Select Case MODdata.Pe(t) + Case Is > 0.0001 'Antrieb + If Math.Abs(MODdata.Pe(t) / PmaxN - 1) < 0.01 Then + EngState0 = tEngState.FullLoad + Else + EngState0 = tEngState.Load + End If + Case Is < -0.0001 'Schlepp + If MODdata.Pe(t) < 1.01 * PminN Then + EngState0 = tEngState.FullDrag + Else + EngState0 = tEngState.Drag + End If + Case Else + EngState0 = tEngState.Idle + End Select + End If + + MODdata.EngState.Add(EngState0) + + 'Notify + If MODdata.ModErrors.MsgOutputAbort(t + 1, MsgSrc) Then Return False + + Next + + If PcorCount > 0 Then WorkerMsg(tMsgID.Warn, "Power corrected (>5%) in " & PcorCount & " time steps.", MsgSrc) + + Return True + + End Function + Private Function fRolloutSpeed(ByVal t As Integer, ByVal dt As Single) As Single Dim vstep As Double @@ -5019,6 +3223,11 @@ lb20: End If Return U End Function + + Private Function fnUout(ByVal V As Single, ByVal Gear As Integer) As Single + Return CSng(V * 60.0 * VEH.AchsI * VEH.Igetr(Gear) / (VEH.Dreifen * Math.PI)) + End Function + #End Region #Region "Leistungsberechnung" diff --git a/VECTO/M_MAIN.vb b/VECTO/M_MAIN.vb index 090ae6cb42..46882d61d0 100644 --- a/VECTO/M_MAIN.vb +++ b/VECTO/M_MAIN.vb @@ -34,7 +34,6 @@ Module M_MAIN Dim i As Integer Dim path0 As String - Dim LicErrorFeat As Short Dim JobAbortedByErr As Boolean Dim CyclAbrtedByErr As Boolean Dim MsgOut As Boolean @@ -68,16 +67,12 @@ Module M_MAIN MsgOut = (PHEMmode = tPHEMmode.ModeSTANDARD) 'License check - LicErrorFeat = 0 - If (PHEMmode = tPHEMmode.ModeBATCH) Then - If Not Lic.LicFeature(1) Then LicErrorFeat = 1 - ElseIf (PHEMmode = tPHEMmode.ModeADVANCE) Then - If Not Lic.LicFeature(2) Then LicErrorFeat = 2 - End If - If LicErrorFeat > 0 Then - WorkerMsg(tMsgID.Err, "Your license does not support the selected mode (" & LicErrorFeat & ")", MsgSrc) - GoTo lbErrBefore + If (PHEMmode = tPHEMmode.ModeBATCH) Then + If Not Lic.LicFeature(1) Then + WorkerMsg(tMsgID.Err, "Your license does not support BATCH mode!", MsgSrc) + GoTo lbErrBefore + End If End If If FilesDim = -1 Then @@ -203,29 +198,6 @@ lbADV: GoTo lbNextJob End If - 'Check if all the modes are licensed in the GEN file - LicErrorFeat = 0 - - If GEN.VehMode = tVehMode.HEV Then - If Not Lic.LicFeature(5) Then LicErrorFeat = 5 - ElseIf GEN.VehMode = tVehMode.EV Then - If Not Lic.LicFeature(6) Then LicErrorFeat = 6 - End If - - If GEN.CreateMap And Not Lic.LicFeature(3) Then LicErrorFeat = 3 - - If GEN.EngAnalysis And Not Lic.LicFeature(4) Then LicErrorFeat = 4 - - If (GEN.dynkorja And Not Lic.LicFeature(7)) Then LicErrorFeat = 7 - - If (GEN.EXSja And Not Lic.LicFeature(8)) Then LicErrorFeat = 8 - - If LicErrorFeat > 0 Then - WorkerMsg(tMsgID.Err, "Your license does not support the selected mode (" & LicErrorFeat & ")", MsgSrc) - JobAbortedByErr = True - GoTo lbNextJob - End If - 'If optimizer is active, then read parameters here If bOptOn Then OptInput() @@ -407,6 +379,14 @@ lbADV: GoTo lbNextJob End If + If DEV.ATmode Then + If Not GBX.TCinit Then + 'Error-notification within GSinit() + JobAbortedByErr = True + GoTo lbNextJob + End If + End If + If GEN.ModeHorEV Then If GEN.VehMode = tVehMode.EV Then @@ -421,10 +401,11 @@ lbADV: If MsgOut Then WorkerMsg(tMsgID.Normal, "EV Calc", MsgSrc) - If Not MODdata.Px.EV_Calc() Then - CyclAbrtedByErr = True - GoTo lbAusg - End If + '!!!!!!!! EV disabled !!!!!!!!! + 'If Not MODdata.Px.EV_Calc() Then + CyclAbrtedByErr = True + GoTo lbAusg + 'End If Else @@ -439,10 +420,11 @@ lbADV: If MsgOut Then WorkerMsg(tMsgID.Normal, "HEV Calc", MsgSrc) - If Not MODdata.Px.HEV_Calc() Then - CyclAbrtedByErr = True - GoTo lbAusg - End If + '!!!!!!!! HEV disabled !!!!!!!!! + 'If Not MODdata.Px.HEV_Calc() Then + CyclAbrtedByErr = True + GoTo lbAusg + 'End If End If @@ -455,12 +437,12 @@ lbADV: GoTo lbAusg End If - End If + End If - If PHEMworker.CancellationPending Then GoTo lbAbort + If PHEMworker.CancellationPending Then GoTo lbAbort - 'Calculate CycleKin (for erg/sum, etc.) - MODdata.CylceKin.Calc() + 'Calculate CycleKin (for erg/sum, etc.) + MODdata.CylceKin.Calc() End If '---------------------------------------------------------------------------- diff --git a/VECTO/VECTO.vbproj.user b/VECTO/VECTO.vbproj.user index 1d8c42a49b..fa7c614a4e 100644 --- a/VECTO/VECTO.vbproj.user +++ b/VECTO/VECTO.vbproj.user @@ -17,5 +17,6 @@ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' "> <StartArguments> </StartArguments> + <EnableUnmanagedDebugging>false</EnableUnmanagedDebugging> </PropertyGroup> </Project> \ No newline at end of file diff --git a/VECTO/VECTO_Global.vb b/VECTO/VECTO_Global.vb index 7bb1693c1e..f106ed8a61 100644 --- a/VECTO/VECTO_Global.vb +++ b/VECTO/VECTO_Global.vb @@ -2,7 +2,7 @@ Module VECTO_Global - Public Const VECTOvers As String = "1.1 beta" + Public Const VECTOvers As String = "1.1 beta 2" Public MyAppPath As String Public MyConfPath As String Public MyDeclPath As String @@ -51,7 +51,6 @@ Module VECTO_Global Public ProgBarCtrl As cProgBarCtrl Public SetCulture As Boolean 'Damit der Backgroundworker das richtige Format verwendet - Public FirstTime As Boolean Public Function nMtoPe(ByVal nU As Double, ByVal M As Double) As Double Return ((nU * 2 * Math.PI / 60) * M / 1000) @@ -67,7 +66,7 @@ Module VECTO_Global Return Pnorm * VEH.Pnenn * 1000 / (nU * 2 * Math.PI / 60) End Function - Public Function PToM(ByVal nU As Single, ByVal Pe As Double) As Single + Public Function nPeToM(ByVal nU As Single, ByVal Pe As Double) As Single Return Pe * 1000 / (nU * 2 * Math.PI / 60) End Function @@ -130,7 +129,7 @@ Module VECTO_Global x = sK.IndexOf("_") - If x = -1 Then Return tExsComp.Undefined + If x = -1 Then Return tAuxComp.Undefined sK = Left(sK, x + 1) diff --git a/VECTO/cConfig.vb b/VECTO/cConfig.vb index 9db078c0d7..2543c760d6 100644 --- a/VECTO/cConfig.vb +++ b/VECTO/cConfig.vb @@ -1,7 +1,7 @@ Public Class cConfig - Private Const FormatVersion As Short = 1 - Private FileVersion As Short + 'Private Const FormatVersion As Short = 1 + 'Private FileVersion As Short Public GnVorgab As Boolean Private sWorkDPath As String @@ -27,18 +27,20 @@ Public FuelDens As Single Public CO2perFC As Single + Public FirstRun As Boolean + Public Sub New() SetDefault() End Sub Public Function ConfigLOAD() As Boolean Dim c As New cFile_V3 - Dim txt As String + 'Dim txt As String SetDefault() If Not IO.File.Exists(MyConfPath & "settings.txt") Then - If Not FirstTime Then GUImsg(tMsgID.Err, "Config-file not found! Using default settings.") + If Not Cfg.FirstRun Then GUImsg(tMsgID.Err, "Config-file not found! Using default settings.") Return False End If @@ -46,26 +48,26 @@ '*** '*** First line: Version - txt = Trim(UCase(c.ReadLine(0))) - If Microsoft.VisualBasic.Left(txt, 1) = "V" Then - ' "Remove V'' => It remains the number - txt = txt.Replace("V", "") - If Not IsNumeric(txt) Then - 'If invalid version: Abort - GoTo lbEr - Else - 'Version settled - FileVersion = CInt(txt) - End If - Else - c.Close() - Return ReadOldFormat() - End If - - If FileVersion > FormatVersion Then - GUImsg(tMsgID.Err, "Config-file Version " & FileVersion & " incompatible with application version! Using default settings.") - Return False - End If + 'txt = Trim(UCase(c.ReadLine(0))) + 'If Microsoft.VisualBasic.Left(txt, 1) = "V" Then + ' ' "Remove V'' => It remains the number + ' txt = txt.Replace("V", "") + ' If Not IsNumeric(txt) Then + ' 'If invalid version: Abort + ' GoTo lbEr + ' Else + ' 'Version settled + ' FileVersion = CInt(txt) + ' End If + 'Else + ' c.Close() + ' Return ReadOldFormat() + 'End If + + 'If FileVersion > FormatVersion Then + ' GUImsg(tMsgID.Err, "Config-file Version " & FileVersion & " incompatible with application version! Using default settings.") + ' Return False + 'End If sWorkDPath = Trim(c.ReadLine(0)) If UCase(sWorkDPath) = sKey.HomePath Then @@ -113,6 +115,13 @@ FuelDens = CSng(c.ReadLine(0)) CO2perFC = CSng(c.ReadLine(0)) + If c.EndOfFile Then GoTo lbDone + + FirstRun = CBool(c.ReadLine(0)) + + +lbDone: + c.Close() Return True @@ -244,6 +253,8 @@ lbDone: WorkDirHome = False + FirstRun = True + End Sub Public Sub ConfigSAVE() @@ -251,7 +262,7 @@ lbDone: c.OpenWrite(MyConfPath & "settings.txt") 'Version - c.WriteLine("V" & FormatVersion) + 'c.WriteLine("V" & FormatVersion) c.WriteLine("c Working Directory Path") If WorkDirHome And UCase(Trim(sWorkDPath)) = UCase(Trim(MyAppPath)) Then @@ -302,6 +313,10 @@ lbDone: c.WriteLine("c CO2 per FC [kgCO2/kgFC]") c.WriteLine(CO2perFC.ToString) + c.WriteLine("c First Run (Show Quick Start Guide Prompt)") + c.WriteLine(Math.Abs(CInt(FirstRun))) + + c.Close() c = Nothing End Sub diff --git a/VECTO/cDEV.vb b/VECTO/cDEV.vb index 24fdb698c7..b1e7a96f78 100644 --- a/VECTO/cDEV.vb +++ b/VECTO/cDEV.vb @@ -9,6 +9,12 @@ Public Class cDEV Public GearCorrection As Boolean + Public ATmode As Boolean + Public TCiterPrec As Single + Public TCfile As String + Public TCnUstep As Single + Public TCnUstepMin As Single + Public TCnUref As Single '************************************************************************************************************** '************************************************************************************************************** @@ -117,6 +123,31 @@ Public Class cDEV MyOptions.Add("GearCorrection", Conf0) + Conf0 = New cDEVoption(tDEVconfType.tBoolean, "Automatic Transmission. TC file required.", False) + Conf0.BoolVal = False + MyOptions.Add("ATmode", Conf0) + + Conf0 = New cDEVoption(tDEVconfType.tStringVal, "TC file path") + Conf0.StringVal = "" + MyOptions.Add("TCfile", Conf0) + + Conf0 = New cDEVoption(tDEVconfType.tSingleVal, "TC reference rpm for input torque [1/min]") + Conf0.SingleVal = 1000 + MyOptions.Add("TCnUref", Conf0) + + Conf0 = New cDEVoption(tDEVconfType.tSingleVal, "TC iteration: target precision for torque ratio") + Conf0.SingleVal = 0.001 + MyOptions.Add("TCiterPrec", Conf0) + + Conf0 = New cDEVoption(tDEVconfType.tSingleVal, "TC iteration: start value for nU-step [1/min]") + Conf0.SingleVal = 100 + MyOptions.Add("TCnUstep", Conf0) + + Conf0 = New cDEVoption(tDEVconfType.tSingleVal, "TC iteration: lowest value for nU-step [1/min]") + Conf0.SingleVal = 0.01 + MyOptions.Add("TCnUstepMin", Conf0) + + '**************************** END: Parameters Configuration '***************************** '***************************************************************************************** '***************************************************************************************** @@ -128,6 +159,12 @@ Public Class cDEV 'Initialize the actual Config-Parameters from MyConfigs list Public Sub SetOptions() GearCorrection = MyOptions("GearCorrection").BoolVal + ATmode = MyOptions("ATmode").BoolVal + TCiterPrec = MyOptions("TCiterPrec").SingleVal + TCfile = MyOptions("TCfile").StringVal + TCnUstep = MyOptions("TCnUstep").SingleVal + TCnUstepMin = MyOptions("TCnUstepMin").SingleVal + TCnUref = MyOptions("TCnUref").SingleVal End Sub 'Demo for Delegate Function -- GitLab