(*
FB_R290_Pbar_To_Tsat
Zweck: Sättigungstemperatur (°C) von R290 aus Druck (bar abs.)
Quelle Konstanten: NIST Chemistry WebBook – Propane (Antoine-Parameter, P in bar, T in K)
Gültigkeitsbereiche:
- Helgeson & Sage (1967): 277.6–360.8 K
- Rips (1963): 230.6–320.7 K
- Kemp & Egan (1938): 166.02–231.41 K
Achtung: Eingangsdruck MUSS absolut in bar(a) sein!
*)
FUNCTION_BLOCK FB_R290_Pbar_To_Tsat
VAR_INPUT
PressureBar : REAL; // bar(a) – absoluter Druck
END_VAR
VAR_OUTPUT
Tsat_C : REAL; // °C – Sättigungstemperatur
InRange : BOOL; // TRUE = innerhalb der abgedeckten Bereiche
RangeId : INT; // 3=Helgeson&Sage, 2=Rips, 1=Kemp&Egan, 0=keine Zuordnung
END_VAR
VAR
log10P : REAL;
A : REAL;
B : REAL;
C : REAL;
T_K : REAL;
END_VAR
// Hilfsfunktion: log10(x) (falls System keine Log10 bereitstellt, ln(x)/ln(10))
METHOD PRIVATE _Log10 : REAL
VAR_INPUT
x : REAL;
END_VAR
VAR
LN10 : REAL := 2.302585093; // natürliche Logarithmus-Basis-Umrechnung
END_VAR
IF x > 0.0 THEN
_Log10 := LN(x) / LN10;
ELSE
_Log10 := -1.0E38; // Marker für ungültig
END_IF
// Hauptalgorithmus
IF PressureBar <= 0.0 THEN
// Ungültiger Eingang
Tsat_C := REAL#NaN;
InRange := FALSE;
RangeId := 0;
ELSE
// Vorab: log10(P)
log10P := _Log10(PressureBar);
// Bereichslogik:
// Wir wählen den Parametersatz anhand des Drucks, der zu den T-Bereichen passt.
// Grobe Druckfenster passend zu den NIST-Temperaturbereichen (heuristisch):
// - Kemp & Egan (sehr kalt): P <= ~1.2 bar(a)
// - Rips (kalt bis ~47.5°C): ~1.0 … ~8.5 bar(a)
// - Helgeson & Sage (≥ ~4.5°C): ~5 … ~36 bar(a)
// Überlappungen werden bewusst so aufgelöst, dass die "beste" Näherung verwendet wird.
IF PressureBar >= 5.0 THEN
// Helgeson & Sage 1967
A := 4.53678; B := 1149.36; C := 24.906; // P[bar], T[K]
RangeId := 3;
ELSIF PressureBar >= 1.0 THEN
// Rips 1963
A := 3.98292; B := 819.296; C := -24.417; // P[bar], T[K]
RangeId := 2;
ELSE
// Sehr niedrige Drücke -> Kemp & Egan 1938
A := 4.01158; B := 834.26; C := -22.763; // P[bar], T[K]
RangeId := 1;
END_IF
// Inversion der Antoine-Gleichung:
// T[K] = B / (A - log10(P)) - C
T_K := B / (A - log10P) - C;
// Ausgabe in °C
Tsat_C := T_K - 273.15;
// Plausibilitätsflag: innerhalb des abgedeckten T-Bereichs?
// Wir prüfen konservativ die T-Bereiche der drei Korrelationen und setzen TRUE,
// wenn T in einem der originalen Bereiche liegt.
IF (T_K >= 277.6 AND T_K <= 360.8) OR
(T_K >= 230.6 AND T_K <= 320.7) OR
(T_K >= 166.02 AND T_K <= 231.41) THEN
InRange := TRUE;
ELSE
InRange := FALSE; // Ergebnis ist eine Extrapolation
END_IF
END_IF
END_FUNCTION_BLOCK