Autor Thema: 3-Punktschrittregler für Heizungsmischventile  (Gelesen 500 mal)

Offline radar17892

  • Full Member
  • ***
  • Beiträge: 413
  • Think easy!
3-Punktschrittregler für Heizungsmischventile
« am: März 19, 2017, 17:56:49 Nachmittag »
Hallo,

aus meiner Sammlung bewährter Bausteine, diesmal ein Regler speziell optimiert für Heizungsmischventile.
Er ist bewusst einfach gehalten, (benötigt keinen PID-Baustein) arbeitet zuverlässig im bisherigem Einsatz.

FUNCTION_BLOCK Con3PS
(*
##################################################################################
Programmbeschreibung:
einfacher (P)roportionaler  3-Punktschrittregler (Integer) mit variabler Laufzeit und Handbedienung
Über die proportionale Abweichung vom Sollwert wird die Laufzeit des Ventils pro Takt bestimmt
Speziell für Heizungsmischventile optimiert
Die Standartvorgabe für die Kennlinie Ventillaufzeit ist: 1s bei 0°C bis 6s bei 15°C Abweichung 
Hinweis: Das Totband sollte nicht zu groß gewählt werden, dadurch sinkt die Genauigkeit
Der FB benötigt keine Stellungsrückmeldung des Ventils.
Der Antrieb sollte aber über interne Endschalter verfügen!
benötigt: util.lib
getestet: auf XV100  TL Die Initwerte haben sich in der Praxis als sehr stabil erwiesen.
##################################################################################
Änderungsindex
Name: TL Datum: 06.05.2016 Version:0.1 Grund:  neu

##################################################################################
*)
VAR_INPUT
T_ist: INT; (*Isttemperatur in 0,1°C*)
Temp_soll: INT; (*Solltemperatur in 0,1°C*)
TB: USINT :=4; (*Totband  für Regler in +/- 0,1°C*)
hand: BOOL; (*Handbetrieb aktiviern*)
H_auf: BOOL; (*Handbefehl AUF*)
H_zu: BOOL; (*Handbefehl ZU*)
Taktzeit: TIME := t#60s; (*Taktzeit für Schrittregler*)
Abw_max: UINT :=150; (*Endpunkt Kennl_LZ  Abweichung in 0,1°C*)
Lz_min: UINT :=1000; (*Startpunkt Kennl Laufzeit min in ms*)
Lz_max: UINT :=6000; (*Endpunkt Kennl Laufzeit max in ms*)
Sensorfehler: BOOL; (*1=Sensor ist def*)
OT: BOOL; (*1=Fehler Übertemperatur*)
END_VAR
VAR_OUTPUT
Ventil_auf: BOOL; (*Regelventil öffnen*)
Ventil_zu: BOOL; (*Regelventil schließen*)
IL: BOOL; (*Im Limit*)
END_VAR
VAR
T_Regler: LIMITALARM; (*Einfacher 3-Punkt Regler*)
T_Abweichung: UINT; (*absolute Abweichung T-ist von T-soll in 0,1°C*)
Kennl_Laufzeit: LIN_TRAFO; (*Prop-Kennlinie Fahrzeit Ventil*)
Takt: TON; (*Timer Schritttakt*)
Takt_ein: TIME := t#4s; (*berechnete Fahrzeit Ventil*)
END_VAR

##########################################################################################

(*Einfacher 3-Punkt P-Schrittregler mit Totband*)
T_Regler(
IN:= T_ist,
HIGH:= (Temp_soll + Totband),
LOW:= (Temp_soll - Totband),
O=> ,
U=> ,
IL=> IL);
(*Taktgeber Ventil *)
Takt(IN:= NOT Takt.Q AND NOT T_Regler.IL, PT:= Taktzeit, Q=> , ET=> );
(*Propwert Fahrzeit Ventil berechnen*)
T_Abweichung:= ABS(T_ist - Temp_soll);
(*0-15°C Abweichung = 1-6s Laufzeit*)
Kennl_Laufzeit(
IN:= T_Abweichung,
IN_MIN:= 0,
IN_MAX:= Abw_max,
OUT_MIN:= Lz_min,
OUT_MAX:= Lz_max,
OUT=> ,
ERROR=> );
Takt_ein:= REAL_TO_TIME(Kennl_Laufzeit.OUT);

(*Ausgänge ansteuern mit variabler Taktung*)
(*Ventil schliessen*)
IF hand
THEN (*Handbetrieb*)
IF H_zu AND NOT Ventil_auf
THEN Ventil_zu:= TRUE;
ELSE Ventil_zu:= FALSE;
END_IF
ELSIF Sensorfehler
THEN Ventil_zu:= TRUE; (*Bei Sensorfehler zu fahren (Sicherheitsfunktion)*)
ELSE (*Automatik*)
Ventil_zu:= NOT Ventil_auf AND ((T_Regler.O AND (Takt.ET > Taktzeit - Takt_ein)) OR OT);
END_IF
(*Ventil öffnen*)
IF hand
THEN (*Handbetrieb*)
IF H_auf AND NOT Ventil_zu
THEN Ventil_auf:= TRUE;
ELSE Ventil_auf:= FALSE;
END_IF
ELSE (*Automatik*)
Ventil_auf:= (NOT Sensorfehler AND NOT Ventil_zu AND T_Regler.U AND (Takt.ET > Taktzeit - Takt_ein));
END_IF

have a lot of fun!

Gruß Thomas
« Letzte Änderung: März 20, 2017, 12:46:29 Nachmittag von radar17892 »
Weil Einfach einfach Einfach ist!