Hallo Leute,
hier ein Beispiel für einen FB zur Verarbeitung von Temperatursensoren
FUNCTION_BLOCK Signalwandler
(*
##################################################################################
Programmbeschreibung:
Beruhigung des Sensorwertes und Umwandlung der INT Analogsignale auf den entspechenden Messbereich
Fehlerausgabe wenn EN=1 bei überschreiten der Grenzwerte
Drahtbruch ist von EN unabhängig
Unabhängig von Emergancy-Telegrammen des Feldbuses
Benötigte Bibliothek: util.lib; easy800d.lib
##################################################################################
Änderungsindex
Name: TL Datum: 30.09.2012
Grund: für alle INT Analogwerte (Temperaturen) verwendbar
##################################################################################
*)
VAR_INPUT
IN: INT; (*Analogeingang*)
MBu: INT; (*Messbereich unten in 0,1°C*)
MBo: INT; (*Messbereich oben in 0,1°C*)
GWu: INT; (*Grenzwert unten bezogen auf output*)
GWo: INT; (*Grenzwert oben bezogen auf output*)
EN: BOOL; (*Bei EN=0 Unterdrückung OL/UL Fehler*)
Offset: SINT; (*Offset zum Ausgangswert in 0,1°C*)
END_VAR
VAR_OUTPUT
out: INT; (*Skalierter Sensorwert in 0,1°C*)
E_GWu: BOOL; (*1=Meldung Grenzwertunterschreitung*)
E_GWo: BOOL; (*1=Meldung Grenzwertüberschreitung*)
Err: BOOL; (*1=Sensorfehler/ Drahtbruch/Überlauf*)
END_VAR
VAR
Trafo: LIN_TRAFO; (*Signalanpassung*)
Alarm: LIMITALARM; (*Grenzwertüberwachung*)
Filter: FT; (*PT1 Signalfilter für analogen Rohwert(easy800d.lib)*)
Err_Level: INT := 5; (*Grenzwert für Erkennung Sensorfehler/Drahtbruch*)
END_VAR
############################################################
(*Messwertberuhigung*)
Filter(
EN:= TRUE,
I1:= IN,
TG:= 60,
KP:= 100,
Dummy=> ,
QV=> );
(*Scalierung(16Bit) (bei 10Bit EC4P AI IN_MAX ->1023 ändern)*)
Trafo(
IN:= Filter.QV,
IN_MIN:= 0,
IN_MAX:= 32767,
OUT_MIN:= MBu,
OUT_MAX:= MBo,
OUT=> ,
ERROR=> );
(*Wert mit Offset ausgeben*)
out:=Offset + REAL_TO_INT (Trafo.OUT);
(*Drahtbruchüberwachung*)
IF (Filter.QV < Err_Level) OR Trafo.ERROR THEN
Err:= TRUE;
ELSE
Err:= FALSE;
END_IF
(*Grenzwertüberwachung*)
Alarm(
IN:= out,
HIGH:= GWo,
LOW:= GWu,
O=> ,
U=> ,
IL=> );
E_GWo:=EN AND Alarm.O;(*1=GWo überschritten*)
E_GWu:=EN AND Alarm.U;(*1=GWu unterschritten*)
Have a lot of fun!