Private Sub RunSysCalculator_Click()
DoCmd.Hourglass True
intCalculatorSelect = 2 'identifies specific calculator
Call ErasePolyResults 'deletes all previous records
from calculator results table
(tblsysPolyBattSelect)
Call sysPolyCalculation 'performs calculation
Me.sysSelectionList.SetFocus
Me.sysSelectionList.RowSource = "qrysysPolyBattSelect"
Me.sysSelectionList.Requery
DoCmd.Hourglass False
End Sub
Private Sub ErasePolyResults()
Dim i As Integer
Dim cmd As ADODB.Command
Dim strTable1 As String
Dim strTable2 As String
'Clears (deletes) data in calculation results table
Set cmd = New ADODB.Command
If intCalculatorSelect = 1 Then
strTable1 = "tblPolyResults"
strTable2 = "tblPolyBattSelect"
Else
strTable1 = "tblsysPolyResults"
strTable2 = "tblsysPolyBattSelect"
End If
With cmd
.ActiveConnection = cnnPoly
.CommandType = adCmdText
For i = 1 To 2
If i = 1 Then
.CommandText = _
"DELETE * FROM " & strTable1 & ";"
Else
.CommandText = _
"DELETE * FROM " & strTable2 & ";"
End If
.Execute
Next i
End With
Set cmd = Nothing
intCalculatorSelect = 0
End Sub
Sub sysPolyCalculation()
Dim syspolyResult As Double 'Variable to hold algorithm calculation results
Dim sysopTemp As Double
Dim sysopEOD As Double
Dim ctbatt As Long 'Loop counter for active battery polynomial constants
Dim cttime As Double 'Loop counter for requested minute iterations
Dim ctpowerloop As Double 'loop counter for system parallel string iterations
Dim intMinTime As Double 'var for lower limit of discharge time range
Dim intMaxTime As Double 'var for upper limit of discharge time range
Dim arrindex As Long 'Applies Current or Power polynomial contants to algorithm
Dim sysintPolyLoop As Integer 'Loop counter for Current/Power calculations
Dim intpower As Double 'energy to power conversion
sysopEOD = Me!SysEODVoltage.Value
intMinTime = Me!SysMinTime 'sets lower limit of discharge time range
intMaxTime = Me!SysMaxTime 'sets upper limit of discharge time range
'Converts "optemp" to centigrade for polynomial calculation if U.S. Customary
If Me!UnitOfMeasure.Value = 1 Then 'units selected on
Calculator screen
sysopTemp = Me!SysTemperature.Value
ElseIf Me!UnitOfMeasure.Value = 2 Then
sysopTemp = ((Me!SysTemperature.Value + 40) * 5 / 9) - 40
End If
DoCmd.GoToControl "sysSelectionList" 'Moves focus from "Run System Calculator' pushbutton
Me!RunSysCalculator.Enabled = False 'to allow disabling pushbutton
'Establish connection to polynomial calculation results lookup table
Set rstsysPolyResults = New ADODB.Recordset
With rstsysPolyResults
Set .ActiveConnection = cnnPoly
.CursorType = adOpenKeyset
.LockType = adLockOptimistic
.Open "tblsysPolyResults"
End With
'Algorithm for calculating current and power
For ctbatt = 1 To recordcount 'One record for each active battery
For cttime = intMinTime To intMaxTime 'requested discharge time
For sysintPolyLoop = 1 To 2 'First pass is for current(first 12 polynomial constants)
If sysintPolyLoop = 1 Then 'second pass is for power (second 12 polynomial constants)
arrindex = 0
Else
arrindex = 12
End If
syspolyResult = (10 ^ (((0.0000028 * sysopTemp ^ 2 + 0.0008392 * sysopTemp - 0.0186795) _
* ((Log(cttime)) / Log(10)) ^ 2) + ((-0.0000043 * sysopTemp ^ 2 - 0.0057009 _
* sysopTemp + 0.1231002) * (Log(cttime) / Log(10))) + (-0.000056 * sysopTemp ^ 2 _
+ 0.013331 * sysopTemp - 0.262505))) * avarData(1, ctbatt - 1) _
* 10 ^ ((avarData(2 + arrindex, ctbatt - 1) * sysopEOD ^ 2 _
+ avarData(3 + arrindex, ctbatt - 1) * sysopEOD + avarData(4 + arrindex, ctbatt - 1)) _
* (Log(cttime / 60) / Log(10)) ^ 3 + (avarData(5 + arrindex, ctbatt - 1) _
* sysopEOD ^ 2 + avarData(6 + arrindex, ctbatt - 1) * sysopEOD _
+ avarData(7 + arrindex, ctbatt - 1)) * (Log(cttime / 60) / Log(10)) ^ 2 _
+ (avarData(8 + arrindex, ctbatt - 1) * sysopEOD ^ 2 + avarData(9 + arrindex, ctbatt - 1) _
* sysopEOD + avarData(10 + arrindex, ctbatt - 1)) * (Log(cttime / 60) / Log(10)) _
+ avarData(11 + arrindex, ctbatt - 1) * sysopEOD ^ 2 + avarData(12 + arrindex, ctbatt - 1) _
* sysopEOD + avarData(13 + arrindex, ctbatt - 1))
If sysintPolyLoop = 1 Then
rstsysPolyResults.AddNew
rstsysPolyResults!Battery = avarData(0, ctbatt - 1)
rstsysPolyResults!Minutes = cttime
rstsysPolyResults!Current = syspolyResult 'Algorithm results for Current
rstsysPolyResults!Ah = syspolyResult * (cttime / 60) 'Algorithm results for amp-hours
Else
rstsysPolyResults!Energy = syspolyResult * Me![SysBattPerString] 'Algorithm results for Energy
rstsysPolyResults!Power = (syspolyResult / (cttime / 60)) * Me![SysBattPerString] 'Algorithm results for Power
intpower = ((syspolyResult / (cttime / 60)) * Me![SysBattPerString])
For ctpowerloop = 1 To 25
If intpower * ctpowerloop > Me![SysMaxPower] Then
rstsysPolyResults!Power2 = (syspolyResult / (cttime / 60)) * Me![SysBattPerString] * ctpowerloop
rstsysPolyResults!PwrStrings = ctpowerloop
rstsysPolyResults!Current2 = rstsysPolyResults!Current * ctpowerloop
rstsysPolyResults!Ah2 = rstsysPolyResults!Ah * ctpowerloop
rstsysPolyResults!Energy2 = rstsysPolyResults!Energy * ctpowerloop
Exit For
End If
Next ctpowerloop
rstsysPolyResults.Update
End If
Next sysintPolyLoop
Next cttime
Next ctbatt
rstsysPolyResults.Close
Set rstsysPolyResults = Nothing
End Sub