|
Hallo, ich habe ein Problem mit meinem Code in VBA, den ich im folgenden auch angebe. Und zwar bekomme ich für GET_ETA_MIX, GET_LAMBDA_MIX und GET_CP_MIX einzenln aufgerufen immer Werte, allerding erhaltre ich für GET_PRANDTL_MIX immer #NX. Ich habe schon auf verschiedenen wegen versuch den Fehler zu finden, bekomme es aber nicht hin dies ist der letzte Stand meines Codes, außerdem ist ganz unten noch meine letzte Debugg Ausgabe. Vielen Dank für eure Hilfe im Voraus.
'======================================================================
' THERMODYNAMISCHE BERECHNUNGEN FÜR REINSTOFFE UND GASGEMISCHE
'======================================================================
'
' Autor : Mira
' Version : 2.5
' Datum : 26.11.25
'
' Beschreibung:
' Dieses VBA-Modul stellt Funktionen zur Berechnung thermophysikalischer
' Stoffdaten von Gasen und Gasgemischen bereit. Grundlage sind
' Shomate-Gleichungen (NIST-Daten) und empirische Korrelationen aus dem VDI Wärmeatlas.
'
' Bereitgestellt werden u.a.:
' - Molare Masse
' - Cp, Enthalpie und Delta-H
' - Dichte
' - Dynamische Viskosität
' - Wärmeleitfähigkeit
' - Mischungsregeln (Wilke, Mason-Saxena)
' - Prandtl-Zahl
'
'======================================================================
' KONSTANTEN
'======================================================================
Public Const R_UNIV As Double = 8.314462618
' Universelle Gaskonstante [J/mol·K]
'======================================================================
' MOLARE MASSE FÜR EINZELKOMPONENTEN
'======================================================================
'
' Funktion: GET_MOLAR_MASS(species)
'
' Beschreibung:
' Gibt die molare Masse eines Stoffes in [kg/mol] zurück.
'
' Eingabe:
' species : String – chemische Formel (z.B. "CO2", "N2", "H2O")
'
' Ausgabe:
' molare Masse [kg/mol]
'
'======================================================================
Public Function GET_MOLAR_MASS(ByVal species As String) As Double
Select Case UCase(species)
Case "H2": GET_MOLAR_MASS = 0.00202
Case "O2": GET_MOLAR_MASS = 0.032
Case "N2": GET_MOLAR_MASS = 0.02801
Case "CO": GET_MOLAR_MASS = 0.02801
Case "CO2": GET_MOLAR_MASS = 0.04401
Case "H2O": GET_MOLAR_MASS = 0.01802
Case "CH4": GET_MOLAR_MASS = 0.01604
Case "NO": GET_MOLAR_MASS = 0.03001
Case "NO2": GET_MOLAR_MASS = 0.04601
Case "N2O4": GET_MOLAR_MASS = 0.09201
Case "SO2": GET_MOLAR_MASS = 0.06406
Case "AR": GET_MOLAR_MASS = 0.03995
Case Else: GET_MOLAR_MASS = CVErr(xlErrNA)
End Select
End Function
'======================================================================
' DICHTE EINES REINSTOFFS [kg/m³]
'======================================================================
'
' Funktion: GET_RHO(T, p, species)
'
' Beschreibung:
' Berechnet die Dichte eines idealen Gases über das ideale Gasgesetz:
' rho = p * M / (R * T)
'
' Eingabe:
' T : Temperatur [K]
' p : Druck [Pa]
' species : String – Stoffname
'
' Ausgabe:
' Dichte [kg/m³]
'
'======================================================================
Public Function GET_RHO(T As Double, p As Double, species As String) As Variant
On Error GoTo ErrHandler
Dim M As Double
M = GET_MOLAR_MASS(species)
GET_RHO = p * M / (R_UNIV * T)
Exit Function
ErrHandler:
GET_RHO = CVErr(xlErrNA)
End Function
'======================================================================
' VISKOSITÄT [Pa·s]
'======================================================================
'
' Funktion: GET_ETA(T, species)
'
' Beschreibung:
' Empirische Korrelation zur Temperaturabhängigkeit der
' dynamischen Viskosität.
'
' Eingabe:
' T : Temperatur [K]
' species : Stoffname
'
' Ausgabe:
' eta [Pa·s]
'
'======================================================================
Public Function GET_ETA(T As Double, ByVal species As String) As Variant
On Error GoTo ErrHandler
Dim A As Double, B As Double, c As Double, D As Double, E As Double
Select Case UCase(species)
Case "H2": A = 0.18024: B = 0.27174: c = -0.13395: D = 0.00585: E = -0.00104
Case "O2": A = -0.10257: B = 0.92625: c = -0.80657: D = 0.05113: E = -0.01295
Case "N2": A = -0.0102: B = 0.74785: c = -0.59037: D = 0.0323: E = -0.00673
Case "CO": A = 0.01384: B = 0.74306: c = -0.62996: D = 0.03948: E = -0.01032
Case "CO2": A = -0.18024: B = 0.65989: c = -0.37108: D = 0.01586: E = -0.003
Case "H2O": A = 0.64966: B = -0.15102: c = 1.15935: D = -0.1008: E = 0.031
Case "CH4": A = -0.07759: B = 0.50484: c = -0.43101: D = 0.03118: E = -0.00981
Case "NO": A = -0.09105: B = 0.84998: c = -0.71473: D = 0.0424: E = -0.0102
Case "NO2": A = -2.28505: B = 1.75834: c = -2.29768: D = 0.17134: E = -0.0492
Case "N2O4": A = -0.08683: B = 0.6745: c = -0.12834
Case "SO2": A = -0.13559: B = 0.5123: c = -0.11626
Case "AR": A = 0.16196: B = 0.81279: c = -0.41263: D = 0.01668: E = -0.00276
Case Else: GET_ETA = CVErr(xlErrNA): Exit Function
End Select
A = A * 10 ^ -5
B = B * 10 ^ -7
c = c * 10 ^ -10
D = D * 10 ^ -12
E = E * 10 ^ -15
GET_ETA = A + B * T + c * T ^ 2 + D * T ^ 3 + E * T ^ 4
Exit Function
ErrHandler:
GET_ETA = CVErr(xlErrNA)
End Function
'======================================================================
' WÄRMELEITFÄHIGKEIT [W/m·K]
'======================================================================
'
' Funktion: GET_LAMBDA(T, species)
'
' Beschreibung:
' Temperaturabhängige Wärmeleitfähigkeit nach empirischen
' Polynomfunktionen.
'
' Eingabe:
' T : Temperatur [K]
' species : Stoffname
'
' Ausgabe:
' lambda [W/m·K]
'
'======================================================================
Public Function GET_LAMBDA(T As Double, ByVal species As String) As Variant
On Error GoTo ErrHandler
Dim A As Double, B As Double, c As Double, D As Double, E As Double
Select Case UCase(species)
Case "H2": A = 0.651: B = 0.7673: c = -0.68705: D = 0.50651: E = -0.13854
Case "O2": A = -1.285: B = 0.10655: c = -0.05263: D = 0.02568: E = -0.00504
Case "N2": A = -0.133: B = 0.10149: c = -0.06065: D = 0.03361: E = -0.0071
Case "CO": A = -0.783: B = 0.10317: c = -0.06759: D = 0.03945: E = -0.00947
Case "CO2": A = -3.882: B = 0.05283: c = 0.07146: D = -0.07031: E = 0.01809
Case "H2O": A = 13.918: B = -0.04699: c = 0.258066: D = -0.183149: E = 0.055092
Case "CH4": A = 8.154: B = 0.00811: c = 0.35153: D = -0.33865: E = 0.14092
Case "NO": A = 0.144: B = 0.09295: c = -0.02601
Case "NO2": A = 66.085: B = -0.47937: c = 1.01124
Case "N2O4": A = 66.085: B = -0.47937: c = 1.01124
Case "SO2": A = 0.358: B = 0.01312: c = 0.06952: D = -0.03207: E = -0.0083
Case "AR": A = 4.303: B = 0.04728: c = -0.00778
Case Else: GET_LAMBDA = CVErr(xlErrNA): Exit Function
End Select
A = A * 10 ^ -3
B = B * 10 ^ -3
c = c * 10 ^ -6
D = D * 10 ^ -9
E = E * 10 ^ -12
GET_LAMBDA = A + B * T + c * T ^ 2 + D * T ^ 3 + E * T ^ 4
Exit Function
ErrHandler:
GET_LAMBDA = CVErr(xlErrNA)
End Function
'======================================================================
' SHOMATE-KOEFFIZIENTEN
'======================================================================
'
' Sub: GET_SHOMATE_COEFF(species, T, A, B, C, D, E, F)
'
' Beschreibung:
' Liefert die temperaturabhängigen Shomate-Koeffizienten für den
' angegebenen Stoff gemäß NIST-Datenbank.
'
'======================================================================
Private Sub GET_SHOMATE_COEFF(species As String, T As Double, _
ByRef A As Double, ByRef B As Double, ByRef c As Double, _
ByRef D As Double, ByRef E As Double, ByRef F As Double)
' Initialisieren
A = 0: B = 0: c = 0: D = 0: E = 0: F = 0: G = 0
Select Case UCase(species)
'------------------------------------------
' Kohlenmonoxid CO
'------------------------------------------
Case "CO"
If T >= 298 And T <= 1300 Then
A = 25.56759: B = 6.09613: c = 4.054656: D = -2.671301: E = 0.131021: F = -118.0089: G = 227.3665: H = -110.5271
ElseIf T > 1300 And T <= 6000 Then
A = 35.1507: B = 1.300095: c = -0.205921: D = 0.01355: E = -3.28278: F = -127.8375: G = 231.712: H = -110.5271
Else
Err.Raise vbObjectError + 1, "GET_SHOMATE_COEFF", "Temperatur außerhalb des gültigen Bereichs."
End If
'------------------------------------------
' Kohlendioxid CO2
'------------------------------------------
Case "CO2"
If T >= 298 And T <= 1200 Then
A = 24.99735: B = 55.18696: c = -33.69137: D = 7.948387: E = -0.136638: F = -403.6075: G = 228.2431: H = -393.5224
ElseIf T > 1200 And T <= 6000 Then
A = 58.16639: B = 2.720074: c = -0.492289: D = 0.038844: E = -6.447293: F = -425.9186: G = 263.6125: H = -393.5224
Else
Err.Raise vbObjectError + 1, "GET_SHOMATE_COEFF", "Temperatur außerhalb des gültigen Bereichs."
End If
'------------------------------------------
' Wasserstoff H2
'------------------------------------------
Case "H2"
If T >= 298 And T <= 1000 Then
A = 33.066178: B = -11.363417: c = 11.432816: D = -2.772874: E = -0.158558: F = -9.980797: G = 172.707974: H = 0
ElseIf T > 1000 And T <= 2500 Then
A = 18.563083: B = 12.257357: c = -2.859786: D = 0.268238: E = 1.97799: F = -1.147438: G = 156.288133: H = 0
ElseIf T > 2500 And T <= 6000 Then
A = 43.41356: B = -4.293079: c = 1.272428: D = -0.09876: E = -20.53386: F = -38.515158: G = 0
Else
Err.Raise vbObjectError + 1, "GET_SHOMATE_COEFF", "Temperatur außerhalb des gültigen Bereichs."
End If
'------------------------------------------
' Wasser H2O
'------------------------------------------
Case "H2O"
If T >= 500 And T <= 1700 Then
A = 30.092: B = 6.832514: c = 6.793435: D = -2.53448: E = 0.082139: F = -250.881: G = 223.3967: H = -241.8264
ElseIf T > 1700 And T <= 6000 Then
A = 41.96426: B = 8.622053: c = -1.49978: D = 0.098119: E = -11.15764: F = -272.1797: G = 219.7809: H = -241.8264
Else
Err.Raise vbObjectError + 1, "GET_SHOMATE_COEFF", "Temperatur außerhalb des gültigen Bereichs."
End If
'------------------------------------------
' Sauerstoff O2
'------------------------------------------
Case "O2"
If T >= 100 And T <= 700 Then
A = 31.32234: B = -20.23531: c = 57.86644: D = -36.50624: E = -0.007374: F = -8.903471: G = 246.7945: H = 0
ElseIf T > 700 And T <= 2000 Then
A = 30.03235: B = 8.772972: c = -3.988133: D = 0.788313: E = -0.741599: F = -11.32468: G = 236.1663: H = 0
ElseIf T > 2000 And T <= 6000 Then
A = 20.91111: B = 10.72071: c = -2.020498: D = 0.146449: E = 9.245722: F = 5.337651: G = 237.6185: H = 0
Else
Err.Raise vbObjectError + 1, "GET_SHOMATE_COEFF", "Temperatur außerhalb des gültigen Bereichs."
End If
'------------------------------------------
' Stickstoff N2
'------------------------------------------
Case "N2"
If T >= 100 And T <= 500 Then
A = 28.98641: B = 1.853978: c = -9.647459: D = 16.63537: E = 0.000117: F = -8.671914: G = 226.4168: H = 0
ElseIf T > 500 And T <= 2000 Then
A = 19.50583: B = 19.88705: c = -8.598535: D = 1.369784: E = 0.527601: F = -4.935202: G = 212.39: H = 0
ElseIf T > 2000 And T <= 6000 Then
A = 35.51872: B = 1.128728: c = -0.196103: D = 0.014662: E = -4.55376: F = -18.97091: G = 224.981: H = 0
Else
Err.Raise vbObjectError + 1, "GET_SHOMATE_COEFF", "Temperatur außerhalb des gültigen Bereichs."
End If
'------------------------------------------
' Stickstoffmonoxid NO
'------------------------------------------
Case "NO"
If T >= 298 And T <= 1200 Then
A = 23.83491: B = 12.58878: c = -1.139011: D = -1.497459: E = 0.214194: F = 83.35783: G = 237.1219: H = 90.29114
ElseIf T > 1200 And T <= 6000 Then
A = 35.99169: B = 0.95717: c = -0.148032: D = 0.009974: E = -3.004088: F = 73.10787: G = 246.1619: H = 90.29114
Else
Err.Raise vbObjectError + 1, "GET_SHOMATE_COEFF", "Temperatur außerhalb des gültigen Bereichs."
End If
'------------------------------------------
' Stickstoffdioxid NO2
'------------------------------------------
Case "NO2"
If T >= 298 And T <= 1200 Then
A = 16.10857: B = 75.89525: c = -54.3874: D = 14.30777: E = 0.239423: F = 26.17464: G = 240.5386: H = 33.09502
ElseIf T > 1200 And T <= 6000 Then
A = 56.82541: B = 0.738053: c = -0.144721: D = 0.009777: E = -5.459911: F = 2.846456: G = 290.5056: H = 33.09502
Else
Err.Raise vbObjectError + 1, "GET_SHOMATE_COEFF", "Temperatur außerhalb des gültigen Bereichs."
End If
'------------------------------------------
' Schwefeldioxid SO2
'------------------------------------------
Case "SO2"
If T >= 298 And T <= 1200 Then
A = 21.43049: B = 74.35094: c = -57.75217: D = 16.35534: E = 0.086731: F = -305.7688: G = 254.8872: H = -296.8422
ElseIf T > 1200 And T <= 6000 Then
A = 57.48188: B = 1.009328: c = -0.07629: D = 0.005174: E = -4.045401: F = -324.414: G = 302.7798: H = -296.8422
Else
Err.Raise vbObjectError + 1, "GET_SHOMATE_COEFF", "Temperatur außerhalb des gültigen Bereichs."
End If
'------------------------------------------
' Argon AR
'------------------------------------------
Case "AR"
If T >= 298 And T <= 6000 Then
A = 20.786: B = 0.0000002825911: c = -0.0000001464191: D = 0.000000010921331: E = -0.00000003661371: F = -6.19735: G = 179.999: H = 0
Else
Err.Raise vbObjectError + 1, "GET_SHOMATE_COEFF", "Temperatur außerhalb des gültigen Bereichs."
End If
'------------------------------------------
' Distickstofftetroxid N2O4
'------------------------------------------
Case "N2O4"
If T >= 500 And T <= 1000 Then
A = 34.05274: B = 191.9845: c = -151.0575: D = 44.3935: E = -0.158949: F = -8.893428: G = 293.7724: H = 9.078988
ElseIf T > 1000 And T <= 6000 Then
A = 128.622: B = 2.524345: c = -0.520883: D = 0.03663: E = -11.55704: F = -59.22619: G = 417.0444: H = 9.078988
Else
Err.Raise vbObjectError + 1, "GET_SHOMATE_COEFF", "Temperatur außerhalb des gültigen Bereichs."
End If
'------------------------------------------
' Methan CH4
'------------------------------------------
Case "CH4"
If T >= 298 And T <= 1300 Then
A = -0.703029: B = 108.4773: c = -42.52157: D = 5.862788: E = 0.678565: F = -76.84376: G = 158.7163: H = -74.8731
ElseIf T > 1300 And T <= 6000 Then
A = 85.81217: B = 11.26467: c = -2.114146: D = 0.13819: E = -26.42221: F = -153.5327: G = 224.4143: H = -74.8731
Else
Err.Raise vbObjectError + 1, "GET_SHOMATE_COEFF", "Temperatur außerhalb des gültigen Bereichs."
End If
'------------------------------------------
' Standard-Fall: unbekannter Stoff
'------------------------------------------
Case Else
A = 0: B = 0: c = 0: D = 0: E = 0: F = 0
End Select
End Sub
'======================================================================
' WÄRMEKAPAZITÄT CP [J/kg·K]
'======================================================================
'
' Funktion: GET_CP(T, species)
'
' Beschreibung:
' Berechnet die spezifische Wärmekapazität auf Massenbasis.
'
' Eingabe:
' T : Temperatur [K]
' species : Stoffname
'
' Ausgabe:
' cp [J/kg·K]
'
'======================================================================
Public Function GET_CP(T As Double, ByVal species As String) As Variant
On Error GoTo ErrHandler
Dim A As Double, B As Double, c As Double, D As Double, E As Double, F As Double
Dim Tred As Double
Tred = T / 1000
Call GET_SHOMATE_COEFF(species, T, A, B, c, D, E, F)
If A = 0 And B = 0 Then
GET_CP = CVErr(xlErrNA)
Exit Function
End If
cp = A + B * Tred + c * Tred ^ 2 + D * Tred ^ 3 + E / (Tred ^ 2)
M = GET_MOLAR_MASS(species)
GET_CP = cp / M
Exit Function
ErrHandler:
GET_CP = CVErr(xlErrNA)
End Function
'======================================================================
' MOLARE ENTHALPIE NACH DER SHOMATE-GLEICHUNG [J/mol]
'======================================================================
'
' Funktion: GET_H(T, species)
'
' Beschreibung:
' Berechnet die molare Enthalpie H eines Reinstoffs in [J/mol]
' nach der Shomate-Gleichung. Die Shomate-Koeffizienten werden
' temperaturabhängig über GET_SHOMATE_COEFF bestimmt.
'
' Eingabe:
' T : Temperatur [K]
' species : Stoffbezeichnung (z. B. "CO2", "H2O", "O2", ...)
'
' Ausgabe:
' H : Molare Enthalpie [J/mol]
'
' Quelle:
' NIST Chemistry WebBook – Shomate Equation
'
' Beispiel:
' H = GET_H(1000, "CO2")
'
'======================================================================
Public Function GET_H(T As Double, ByVal species As String) As Variant
On Error GoTo ErrHandler
Dim A As Double, B As Double, c As Double, D As Double, E As Double, F As Double
Dim Tred As Double
Dim H As Double
Tred = T / 1000
Call GET_SHOMATE_COEFF(species, T, A, B, c, D, E, F)
' Shomate-Gleichung: H [kJ/mol]
H = A * Tred + B * Tred ^ 2 / 2 + c * Tred ^ 3 / 3 + D * Tred ^ 4 / 4 - E / Tred + F
GET_H = H * 1000
Exit Function
ErrHandler:
GET_H = CVErr(xlErrNA)
End Function
'======================================================================
' DELTA-ENTHALPIE delta_H GEGEN 298,15 K [J/mol]
'======================================================================
'
' Funktion: GET_DELTA_H(T, species)
'
' Beschreibung:
' Berechnet die molare Enthalpiedifferenz delta_H = H(T) - H(298,15 K)
' in [J/mol] unter Verwendung der Shomate-Gleichung.
'
' Eingabe:
' T : Temperatur [K]
' species : Stoffbezeichnung (z. B. "CO2", "H2O", "O2", ...)
'
' Ausgabe:
' delta_H : Enthalpiedifferenz [J/mol]
'
' Beispiel:
' dH = GET_DELTA_H(1000, "H2O")
'
'======================================================================
Public Function GET_DELTA_H(T As Double, species As String) As Variant
On Error GoTo ErrHandler
Dim H_T As Double, H_ref As Double
H_T = GET_H(T, species)
If UCase(species) = "H2O" Then
' setzt referenztemperatur manuel
H_ref = -241826
Else
' Standard-Shomate-Referenz
H_ref = GET_H(298.15, species)
End If
GET_DELTA_H = H_T - H_ref
Exit Function
ErrHandler:
GET_DELTA_H = CVErr(xlErrNA)
End Function
'======================================================================
' PRANDTL-ZAHL FÜR REINSTOFFE [-]
'======================================================================
'
' Funktion: GET_PR(T, species)
'
' Beschreibung:
' Berechnet die dimensionslose Prandtl-Zahl eines Gases:
'
' Pr = (cp * eta) / lambda
'
' Dabei sind alle Größen auf Massenbasis:
' cp [J/kg·K], eta [Pa·s], lambda [W/m·K]
'
' Eingabe:
' T : Temperatur [K]
' species : Stoffbezeichnung (z. B. "CO2", "O2", "N2", ...)
'
' Ausgabe:
' Pr : Prandtl-Zahl [-]
'
' Beispiel:
' Pr = GET_PR(500, "CO2")
'
'======================================================================
Public Function GET_PR(T As Double, ByVal species As String) As Variant
On Error GoTo ErrHandler
Dim cp As Double, eta As Double, lam As Double
cp = GET_CP(T, species) ' [J/kg·K]
eta = GET_ETA(T, species) ' [Pa·s]
lam = GET_LAMBDA(T, species) ' [W/m·K]
GET_PR = (cp * eta) / lam
Exit Function
ErrHandler:
GET_PR = CVErr(xlErrNA)
End Function
Public Function To1DArray(v As Variant) As Variant
Dim arr() As Variant
Dim r As Long, c As Long, n As Long
' Falls kein Array ? einfach in Array packen
If Not IsArray(v) Then
To1DArray = Array(v)
Exit Function
End If
' zweidimensionales Excel-Range-Array?
If (LBound(v, 1) = 1 And LBound(v, 2) = 1) Then
' Bestimme Dimension
If UBound(v, 1) > 1 And UBound(v, 2) = 1 Then
' Spaltenvektor
ReDim arr(1 To UBound(v, 1))
For r = 1 To UBound(v, 1)
arr(r) = v(r, 1)
Next r
To1DArray = arr
Exit Function
ElseIf UBound(v, 2) > 1 And UBound(v, 1) = 1 Then
' Zeilenvektor
ReDim arr(1 To UBound(v, 2))
For c = 1 To UBound(v, 2)
arr(c) = v(1, c)
Next c
To1DArray = arr
Exit Function
End If
End If
' bereits 1D? ? direkt zurückgeben
If UBound(v) >= LBound(v) Then
To1DArray = v
Else
To1DArray = Array(v)
End If
End Function
'-----------------------------------------------------------
' MOLARE MASSE VON GEMISCHEN [kg/mol]
'-----------------------------------------------------------
Public Function GET_MOLAR_MASS_MIX(speciesList As Variant, yList As Variant) As Variant
On Error GoTo ErrHandler
Dim i As Long
Dim lb As Long, ub As Long
Dim Mmix As Double
' Bereinigung des Arrays
speciesList = To1DArray(speciesList)
yList = To1DArray(yList)
' Grenzen des Arrays ermitteln
lb = LBound(speciesList)
ub = UBound(speciesList)
' Schleife über die tatsächlichen Indizes
For i = lb To ub
Mmix = Mmix + yList(i) * GET_MOLAR_MASS(speciesList(i))
Next i
GET_MOLAR_MASS_MIX = Mmix
Exit Function
ErrHandler:
GET_MOLAR_MASS_MIX = CVErr(xlErrNA)
End Function
'======================================================================
' DICHTE VON GEMISCHEN [kg/m³]
'======================================================================
'
' Funktion: GET_RHO_MIX(T, P, speciesList, yList)
'
' Beschreibung:
' Berechnet die Dichte eines idealen Gasgemisches [kg/m³] nach dem
' idealen Gasgesetz. Die Berechnung erfolgt unter Annahme eines
' idealen Gases mit bekannter Temperatur, Druck und Zusammensetzung
' (Molanteile der Komponenten).
'
' Formel:
' rho_mix = p * M_mix / (R_univ * T)
'
' wobei:
' p = Druck [Pa]
' M_mix = mittlere molare Masse des Gemisches [kg/mol]
' R_univ = universelle Gaskonstante [J/mol·K]
' T = Temperatur [K]
'
' Eingabe:
' T - Temperatur [K]
' p - Druck [Pa]
' speciesList - Array der Stoffnamen (z. B. {"N2", "O2", "CO2"})
' yList - Array der Molanteile der jeweiligen Komponenten [-]
'
' Ausgabe:
' GET_RHO_MIX - Dichte des Gasgemisches [kg/m³]
'
' Hinweise:
' - Die Molanteile (yList) müssen sich zu 1 aufsummieren.
' - Die Funktion nutzt intern GET_MOLAR_MASS_MIX zur Ermittlung der
' mittleren molaren Masse.
' - Rückgabe: CVErr(xlErrNA), falls Eingaben ungültig oder
' Berechnung fehlschlägt.
'
' Beispiel:
' =GET_RHO_MIX(300; 101325; {"N2"; "O2"}; {0.79; 0.21})
'
'======================================================================
Public Function GET_RHO_MIX(T As Double, p As Double, speciesList As Variant, yList As Variant) As Variant
On Error GoTo ErrHandler
Dim i As Long, M_mix As Double, yi As Double, species As String
Dim r As Double, rho_mix As Double
' Bereinigung des Arrays
speciesList = To1DArray(speciesList)
yList = To1DArray(yList)
r = 8.31446261815324 ' J/mol/K
For i = LBound(speciesList) To UBound(speciesList)
species = CStr(speciesList(i))
yi = CDbl(yList(i))
M_mix = M_mix + yi * GET_MOLAR_MASS(species)
Next i
rho_mix = (p * M_mix) / (r * T)
GET_RHO_MIX = rho_mix
Exit Function
ErrHandler:
GET_RHO_MIX = CVErr(xlErrNA)
End Function
'======================================================================
' MISCHUNGSVISKOSITÄT NACH WILKE [Pa·s]
'======================================================================
'
' Funktion: GET_ETA_MIX(T, speciesList, yList)
'
' Beschreibung:
' Berechnet die dynamische Viskosität eines Gasgemisches
' nach der Wilke-Mischungsregel:
'
' eta_mix = S [ y_i * eta_i / (S y_j * F_ij) ]
'
' mit:
' F_ij = [ 1 + (eta_i/eta_j)^(1/2) * (M_j/M_i)^(1/4) ]² /
' [ v(8 * (1 + M_i/M_j)) ]
'
' Eingabe:
' T : Temperatur [K]
' speciesList : Zell-Array mit Stoffnamen
' yList : Molanteile der Komponenten
'
' Ausgabe:
' eta_mix : Dynamische Viskosität [Pa·s]
'
' Beispiel:
' eta_mix = GET_ETA_MIX(800, Array("CO2","H2O","N2"), Array(0.1,0.1,0.8))
'
'======================================================================
Public Function GET_ETA_MIX(T As Double, speciesList As Variant, yList As Variant) As Variant
On Error GoTo ErrHandler
Dim i As Long, j As Long
Dim eta() As Double, M() As Double, Phi() As Double
Dim denom As Double, sumOuter As Double
' 1) Normalisieren der Eingaben in 1D-Arrays
speciesList = To1DArray(speciesList)
yList = To1DArray(yList)
' 2) sichere Grenzen verwenden
Dim lb As Long, ub As Long
lb = LBound(speciesList): ub = UBound(speciesList)
ReDim eta(lb To ub)
ReDim M(lb To ub)
ReDim Phi(lb To ub, lb To ub)
sumOuter = 0#
' 3) Einzelwerte ermitteln und auf Errors prüfen
For i = lb To ub
Dim tmpEta As Variant, tmpM As Variant, yi As Double
Debug.Print "speciesList("; i; ") = "; speciesList(i)
Debug.Print "yList("; i; ") = "; yList(i)
tmpEta = GET_ETA(T, CStr(speciesList(i)))
Debug.Print "GET_ETA = "; tmpEta
If VarType(tmpEta) = vbError Then
GET_ETA_MIX = CVErr(xlErrNA)
Exit Function
End If
eta(i) = CDbl(tmpEta)
tmpM = GET_MOLAR_MASS(CStr(speciesList(i)))
If VarType(tmpM) = vbError Then
GET_ETA_MIX = CVErr(xlErrNA)
Exit Function
End If
M(i) = CDbl(tmpM)
' yList-Eintrag prüfen und konvertieren
If VarType(yList(i)) = vbError Then
GET_ETA_MIX = CVErr(xlErrNA)
Exit Function
End If
On Error Resume Next
Dim s As String
s = CStr(yList(i))
s = Replace(s, ",", ".") ' lokales Dezimalzeichen normalisieren
yi = CDbl(s)
If Err.Number <> 0 Then
Debug.Print "Fehler in CDbl(yList("; i; ")) ? "; yList(i)
Err.Clear
On Error GoTo ErrHandler
GET_ETA_MIX = CVErr(xlErrNA)
Exit Function
End If
On Error GoTo ErrHandler
' optional: du könntest hier prüfen, ob yi >= 0
Next i
' 4) Phi-Matrix bilden (Wilke)
For i = lb To ub
For j = lb To ub
If i = j Then
Phi(i, j) = 1#
Else
' zusätzliche Sicherheitsprüfungen gegen Division durch 0
If eta(j) = 0 Or M(i) = 0 Or M(j) = 0 Then
GET_ETA_MIX = CVErr(xlErrDiv0)
Exit Function
End If
Debug.Print "Phi("; i; ","; j; ") inputs: eta(i)="; eta(i); " eta(j)="; eta(j); " M(i)="; M(i); " M(j)="; M(j)
Phi(i, j) = ((1# + Sqr(eta(i) / eta(j)) * (M(j) / M(i)) ^ 0.25) ^ 2) / _
(Sqr(8# * (1# + M(i) / M(j))))
End If
Next j
Next i
' 5) Wilke-Summe
For i = lb To ub
denom = 0#
For j = lb To ub
denom = denom + CDbl(yList(j)) * Phi(i, j)
Next j
If denom = 0# Then
GET_ETA_MIX = CVErr(xlErrDiv0)
Exit Function
End If
sumOuter = sumOuter + CDbl(yList(i)) * eta(i) / denom
Next i
GET_ETA_MIX = sumOuter
Exit Function
ErrHandler:
GET_ETA_MIX = CVErr(xlErrNA)
End Function
'======================================================================
' MISCHUNGSWÄRMELEITFÄHIGKEIT NACH Wassiljeva-MASON–SAXENA [W/m·K]
'======================================================================
'
' Funktion: GET_LAMBDA_MIX(T, speciesList, yList)
'
' Beschreibung:
' Berechnet die Wärmeleitfähigkeit eines Gasgemisches nach
' der Methode von Wassiljeva-Mason-Saxena, analog zur Wilke-Formel:
'
' lambda_mix = S [ y_i * lambda_i / (S y_j * psi_ij) ]
'
' mit:
' psi_ij = [ 1 + (labda_i/lambda_j)^(1/2) * (M_j/M_i)^(1/4) ]² /
' [ v(8 * (1 + M_i/M_j)) ]
'
' Eingabe:
' T : Temperatur [K]
' speciesList : Zell-Array mit Stoffnamen
' yList : Molanteile der Komponenten
'
' Ausgabe:
' lambda_mix : Wärmeleitfähigkeit [W/m·K]
'
' Beispiel:
' lambda_mix = GET_LAMBDA_MIX(800, Array("CO2","H2O","N2"), Array(0.1,0.1,0.8))
'
'======================================================================
Public Function GET_LAMBDA_MIX(T As Double, speciesList As Variant, yList As Variant) As Variant
On Error GoTo ErrHandler
Dim i As Long, j As Long
Dim lam() As Double, M() As Double, Psi() As Double
Dim denom As Double, sumOuter As Double
speciesList = To1DArray(speciesList)
yList = To1DArray(yList)
Dim lb As Long, ub As Long
lb = LBound(speciesList): ub = UBound(speciesList)
ReDim lam(lb To ub)
ReDim M(lb To ub)
ReDim Psi(lb To ub, lb To ub)
sumOuter = 0#
' Einzelwerte ermitteln und prüfen
For i = lb To ub
Dim tmpLam As Variant, tmpM As Variant
tmpLam = GET_LAMBDA(T, CStr(speciesList(i)))
If VarType(tmpLam) = vbError Then
GET_LAMBDA_MIX = CVErr(xlErrNA)
Exit Function
End If
lam(i) = CDbl(tmpLam)
tmpM = GET_MOLAR_MASS(CStr(speciesList(i)))
If VarType(tmpM) = vbError Then
GET_LAMBDA_MIX = CVErr(xlErrNA)
Exit Function
End If
M(i) = CDbl(tmpM)
Next i
' Psi-Matrix berechnen (analog Mason–Saxena)
For i = lb To ub
For j = lb To ub
If i = j Then
Psi(i, j) = 1#
Else
If lam(j) = 0 Or M(i) = 0 Or M(j) = 0 Then
GET_LAMBDA_MIX = CVErr(xlErrDiv0)
Exit Function
End If
Psi(i, j) = ((1# + Sqr(lam(i) / lam(j)) * (M(j) / M(i)) ^ 0.25) ^ 2) / _
(Sqr(8# * (1# + M(i) / M(j))))
End If
Next j
Next i
' Mason–Saxena-Summe
For i = lb To ub
denom = 0#
For j = lb To ub
denom = denom + CDbl(yList(j)) * Psi(i, j)
Next j
If denom = 0# Then
GET_LAMBDA_MIX = CVErr(xlErrDiv0)
Exit Function
End If
sumOuter = sumOuter + CDbl(yList(i)) * lam(i) / denom
Next i
GET_LAMBDA_MIX = sumOuter
Exit Function
ErrHandler:
GET_LAMBDA_MIX = CVErr(xlErrNA)
End Function
'======================================================================
' WÄRMEKAPAZITÄT EINES GASGEMISCHES [J/kg·K]
'======================================================================
'
' Funktion: GET_CP_MIX(T, speciesList, yList)
'
' Beschreibung:
' Berechnet die massenspezifische Wärmekapazität eines idealen
' Gasgemisches als molbruchgewichtetes Mittel der Einzelstoffe:
'
' cp_mix = S y_i * cp_i
'
' wobei cp_i [J/kg·K] durch GET_CP bestimmt wird.
'
' Eingabe:
' T : Temperatur [K]
' speciesList : Zell-Array der Komponenten (z. B. {"CO2","H2O","N2"})
' yList : Molanteile der Komponenten (Summe = 1)
'
' Ausgabe:
' cp_mix : Massenbezogene Wärmekapazität [J/kg·K]
'
' Beispiel:
' cp_mix = GET_CP_MIX(900, Array("CO2","H2O","N2"), Array(0.1,0.1,0.8))
'
'======================================================================
Public Function GET_CP_MIX(T As Double, speciesList As Variant, yList As Variant) As Variant
On Error GoTo ErrHandler
Dim i As Long, lb As Long, ub As Long
Dim cp_mix As Double
cp_mix = 0#
speciesList = To1DArray(speciesList)
yList = To1DArray(yList)
lb = LBound(speciesList): ub = UBound(speciesList)
For i = lb To ub
Dim tmpCp As Variant
tmpCp = GET_CP(T, CStr(speciesList(i)))
If VarType(tmpCp) = vbError Then
GET_CP_MIX = CVErr(xlErrNA)
Exit Function
End If
cp_mix = cp_mix + CDbl(yList(i)) * CDbl(tmpCp)
Next i
GET_CP_MIX = cp_mix
Exit Function
ErrHandler:
GET_CP_MIX = CVErr(xlErrNA)
End Function
'======================================================================
' MOLARE ENTHALPIE EINES GASGEMISCHES [J/mol]
'======================================================================
'
' Funktion: GET_H_MIX(T, speciesList, yList)
'
' Beschreibung:
' Berechnet die molare Enthalpie eines idealen Gasgemisches
' aus den molaren Anteilen und den Einzel-Enthalpien:
'
' H_mix = S y_i * H_i(T)
'
' Eingabe:
' T : Temperatur [K]
' speciesList : Zell-Array der Komponenten (z. B. {"CO2", "H2O", "N2"})
' yList : Molanteile der Komponenten (Summe = 1)
'
' Ausgabe:
' H_mix : Molare Enthalpie [J/mol]
'
' Beispiel:
' Hmix = GET_H_MIX(1000, Array("CO2","H2O","N2"), Array(0.1,0.1,0.8))
'
'======================================================================
Public Function GET_H_MIX(T As Double, speciesList As Variant, yList As Variant) As Variant
On Error GoTo ErrHandler
Dim i As Long, n As Long
Dim Hmix As Double
' Bereinigung des Arrays
speciesList = To1DArray(speciesList)
yList = To1DArray(yList)
n = UBound(speciesList) - LBound(speciesList) + 1
For i = 1 To n
Hmix = Hmix + yList(i) * GET_H(T, speciesList(i))
Next i
GET_H_MIX = Hmix
Exit Function
ErrHandler:
GET_H_MIX = CVErr(xlErrNA)
End Function
'======================================================================
' DELTA-ENTHALPIE delta_H EINES GASGEMISCHES [J/mol]
'======================================================================
'
' Funktion: GET_DELTA_H_MIX(T, speciesList, yList)
'
' Beschreibung:
' Berechnet die Enthalpiedifferenz delta_H eines Gasgemisches relativ
' zu 298,15 K über:
'
' delta_H_mix = S y_i * [H_i(T) - H_i(298,15 K)]
'
' Eingabe:
' T : Temperatur [K]
' speciesList : Zell-Array der Komponenten
' yList : Molanteile der Komponenten
'
' Ausgabe:
' delta_H_mix : Enthalpiedifferenz des Gemisches [J/mol]
'
' Beispiel:
' dHmix = GET_DELTA_H_MIX(1200, Array("CO2","H2O","N2"), Array(0.1,0.1,0.8))
'
'======================================================================
Public Function GET_DELTA_H_MIX(T As Double, speciesList As Variant, yList As Variant) As Variant
On Error GoTo ErrHandler
Dim i As Long, n As Long
Dim dHmix As Double
' Bereinigung des Arrays
speciesList = To1DArray(speciesList)
yList = To1DArray(yList)
n = UBound(speciesList) - LBound(speciesList) + 1
For i = 1 To n
dHmix = dHmix + yList(i) * GET_DELTA_H(T, speciesList(i))
Next i
GET_DELTA_H_MIX = dHmix
Exit Function
ErrHandler:
GET_DELTA_H_MIX = CVErr(xlErrNA)
End Function
'======================================================================
' PRANDTL-ZAHL FÜR GASGEMISCHE [-]
'======================================================================
'
' Funktion: GET_PR_MIX(T, speciesList, yList)
'
' Beschreibung:
' Berechnet die dimensionslose Prandtl-Zahl eines Gasgemisches über:
'
' Pr_mix = (cp_mix * eta_mix) / lambda_mix
'
' Dabei:
' cp_mix [J/kg·K] – Molenbruch-gewichtete Wärmekapazität
' eta_mix [Pa·s] – Mischungsviskosität (Wilke)
' lambda_mix [W/m·K] – Mischungswärmeleitfähigkeit (Mason–Saxena)
'
' Eingabe:
' T : Temperatur [K]
' speciesList : Zell-Array der Komponenten
' yList : Molanteile (Summe = 1)
'
' Ausgabe:
' Pr_mix : Prandtl-Zahl [-]
'
' Beispiel:
' Pr_mix = GET_PR_MIX(800, Array("CO2","H2O","N2"), Array(0.1,0.1,0.8))
'
'======================================================================
Public Function GET_PRANDTL_MIX(T As Double, speciesList As Variant, yList As Variant) As Variant
On Error GoTo ErrHandler
Dim eta_mix As Variant
Dim lambda_mix As Variant
Dim cp_mix As Variant
Dim Pr As Double
Debug.Print "---- GET_PRANDTL_MIX ----"
Debug.Print "T = "; T
speciesList = To1DArray(speciesList)
yList = To1DArray(yList)
' 1) Viskosität
eta_mix = GET_ETA_MIX(T, speciesList, yList)
Debug.Print "eta_mix = "; eta_mix
If VarType(eta_mix) = vbError Then
Debug.Print "ERROR: eta_mix enthält Fehlerwert"
GET_PRANDTL_MIX = eta_mix
Exit Function
End If
' 2) Wärmeleitfähigkeit
lambda_mix = GET_LAMBDA_MIX(T, speciesList, yList)
Debug.Print "lambda_mix = "; lambda_mix
If VarType(lambda_mix) = vbError Then
Debug.Print "ERROR: lambda_mix enthält Fehlerwert"
GET_PRANDTL_MIX = lambda_mix
Exit Function
End If
' 3) Wärmekapazität
cp_mix = GET_CP_MIX(T, speciesList, yList)
Debug.Print "cp_mix = "; cp_mix
If VarType(cp_mix) = vbError Then
Debug.Print "ERROR: cp_mix enthält Fehlerwert"
GET_PRANDTL_MIX = cp_mix
Exit Function
End If
' 4) Denominator prüfen
If lambda_mix = 0 Then
Debug.Print "ERROR: lambda_mix = 0"
GET_PRANDTL_MIX = CVErr(xlErrDiv0)
Exit Function
End If
Pr = (eta_mix * cp_mix) / lambda_mix
Debug.Print "Mischungs-Prandtl: "; Pr
GET_PRANDTL_MIX = Pr
Exit Function
ErrHandler:
Debug.Print "ERROR in GET_PRANDTL_MIX"
GET_PRANDTL_MIX = CVErr(xlErrNA)
End Function
? GET_PRANDTL_MIX(800, Array("CO2","H2O","N2"), Array(0.1,0.1,0.8))
---- GET_PRANDTL_MIX ----
T = 800
ERROR in GET_PRANDTL_MIX
Fehler 2042
|