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