Funktion ist gegeben aber ist das so sauber?
Code:
VERSION : '1.2'
[COLOR="#FF0000"]AUTHOR : hugo[/COLOR]
NAME : HEAT_TMP
FAMILY : HLK
VAR_INPUT
EIN_AUS : BOOL;
T_EXT : REAL;
T_INT : REAL;
OFFSET : REAL;
T_REQ : REAL;
END_VAR
VAR_INPUT
TY_MAX : REAL := 70.0;
TY_MIN : REAL := 25.0;
TY_CONFIG : REAL := 70.0;
T_INT_CONFIG : REAL := 20.0;
T_EXT_CONFIG : REAL := -15.0;
T_DIFF : REAL := 10.0;
C : REAL := 1.33;
H : REAL := 3.0;
END_VAR
VAR_OUTPUT
TY : REAL;
HEAT : BOOL;
END_VAR
VAR
tr : REAL;
tx: REAL;
END_VAR
BEGIN
tr := T_INT + OFFSET;
tx := (tr - T_EXT) / (T_INT_CONFIG - T_EXT_CONFIG);
IF [COLOR="#FF0000"]EIN_AUS =0[/COLOR] THEN
TY :=[COLOR="#FF0000"]0[/COLOR];
HEAT :=0;
END_IF;
IF [COLOR="#FF0000"]EIN_AUS =1[/COLOR] THEN
IF T_EXT + H > tr THEN
[COLOR="#0000FF"]TY[/COLOR] := 0.0;
ELSE
[COLOR="#0000FF"]TY[/COLOR] := LIMIT(MN:=TY_MIN,IN:=tr + T_DIFF * 0.5 * tx + (TY_CONFIG - T_DIFF * 0.5 - tr) * (tx**(1.0 / C)),MX:=TY_MAX);
END_IF;
[COLOR="#FF0000"]TY[/COLOR] := MAX(IN1:=[COLOR="#FF0000"]TY[/COLOR], IN2:=T_REQ);
HEAT := [COLOR="#FF0000"]TY[/COLOR] > 0.0;
END_IF;
Was meinst Du mit "
deaktivieren"? Nicht mehr aufrufen (FUP/KOP EN = FALSE)? --> dann bleiben naturgemäß alle Werte "eingefroren"
Wenn Du ein kontrolliertes Setzen auf 0-Werte brauchst, dann gib dem Baustein noch einen zusätzlichen Input - ist das der EIN_AUS ?
- es ist nicht gut, einen INPUT im Baustein mehrmals zu verwenden/abzufragen (Multitasking!)
- es ist nicht gut, einem OUTPUT mehrmals Werte zuzuweisen (Multitasking! z.B. mit HMI-Kommunikation)
- es ist nicht gut, einen OUTPUT zu lesen!
- vergleichen von BOOL-Werten auf 0 oder 1 ist unprofessionell/nicht schön
- Verwendung von Konstanten: für BOOL- und REAL-Konstanten sollte man auch BOOL- und REAL-Werte schreiben, und nicht so faul 0 und 1
- die Zuweisung an den OUTPUT HEAT kann man 2x (in beiden IF-Zweigen, übersichtlicher) oder 1x (nach dem END_IF, Code kürzer) nachen
- man könnte testen/abfangen, daß C nicht 0.0 sein darf und daß T_INT_CONFIG <> T_EXT_CONFIG sein muß
Besser:
Code:
VAR_TEMP
tr : REAL;
tx : REAL;
tq : REAL;
END_VAR
IF NOT EIN_AUS THEN //EIN_AUS = FALSE
TY := 0.0;
HEAT := FALSE;
ELSE //EIN_AUS = TRUE
tr := T_INT + OFFSET;
tx := (tr - T_EXT) / (T_INT_CONFIG - T_EXT_CONFIG);
IF T_EXT + H > tr THEN
tq := 0.0;
ELSE
tq := LIMIT(MN:=TY_MIN, IN:=tr + T_DIFF * 0.5 * tx + (TY_CONFIG - T_DIFF * 0.5 - tr) * (tx**(1.0 / C)), MX:=TY_MAX);
END_IF;
tq := MAX(IN1:=tq, IN2:=T_REQ);
TY := tq;
HEAT := tq > 0.0;
END_IF;
Harald