Autor Thema: Fehlerauswertung für Störmeldekontakte  (Gelesen 1475 mal)

Offline radar17892

  • Full Member
  • ***
  • Beiträge: 430
  • Think easy!
Fehlerauswertung für Störmeldekontakte
« am: September 03, 2015, 07:32:02 Vormittag »
Die Meldekontakte können mit diesem Baustein beschrieben werden.
Eine quittierung des Anstehenden Fehlers ist möglich, der den Kontakt für weitere Fehler wieder scharf schaltet (zB Wählgerät).

FUNCTION_BLOCK FB_Meldungen
(*
##################################################################################
Programmbeschreibung:
Aufbereitung Warnungen+Störungen
Je ein 32Bit Array, in das die Warnungen und Störungen geschrieben werden wird mit dem,
aus dem letzten Zyklus verglichen
##################################################################################
Änderungsindex
Name: TL Version:0.1 Datum: 11.6.2013 Grund:   neu angelegt
Name: TL Version:0.2 Datum: 17.1.2015 Grund:   Fehlernummer speichern für Fehlersuche
##################################################################################
*)
VAR_INPUT
Warnung: ARRAY [0..31] OF BOOL; (*Eingang Warnungen*)
Stoerung: ARRAY [0..31] OF BOOL; (*Eingang Störungen*)
END_VAR
VAR_OUTPUT
x_W_neu: BOOL; (*neue Warnung erkannt*)
x_S_neu: BOOL; (*neue Störung erkannt*)
x_W: BOOL; (*Warnung liegt an*)
x_S: BOOL; (*Störung liegt an*)
END_VAR
VAR
i1: INT := 0; (*Laufvariable für Schleife1*)
i2: INT := 0; (*Laufvariable für Schleife2*)
i3: INT := 0; (*Laufvariable für Schleife3*)
i4: INT := 0; (*Laufvariable für Schleife4*)
Warnung_alt: ARRAY [0..31] OF BOOL; (*Array für Vergleich ob neue Warnung  im Nächsten Zyklus anliegt*)
Stoerung_alt: ARRAY [0..31] OF BOOL; (*Array für Vergleich ob neue Störung  im Nächsten Zyklus anliegt*)
Letzte_Warnung: INT := 99;(*der erste erkannte Fehler im Durchlauf*)
Letzte_Stoerung: INT := 99;(*der erste erkannte Fehler im Durchlauf*)
END_VAR
######################################################

(* Neue Warnung erkennen*)
FOR i1 := 0 TO 31 BY 1 DO
   IF  Warnung[i1] > Warnung_alt[i1]  THEN   (* ist Unterschied zum letzten Zyklus?*)
      x_W_neu:=TRUE;      (* Bei "größer" auf true setzen und aus der Schleife springen*)
Letzte_Warnung:=i1; (*für Fehlersuche Warnungen*)
EXIT;
    ELSE x_W_neu:= FALSE;(*sonst Bit auf 0 setzen*)
   END_IF;
END_FOR;
(*x_W setzen so lange eine Warnung ansteht*)
FOR i2 := 0 TO 31 BY 1 DO
   IF  Warnung[i2] > 0 THEN   (*steht eine Warnung an?*)
      x_W:=TRUE; EXIT;      (* Bei "größer" auf true setzen und aus der Schleife springen*)
   ELSE x_W:= FALSE; (*sonst Bit auf 0 setzen*)
   END_IF;
END_FOR;
Warnung_alt:=Warnung; (*aktuelles Array nach "alt" schieben*)
(* Neue Störung erkennen*)
FOR i3 := 0 TO 31 BY 1 DO
   IF  Stoerung[i3] > Stoerung_alt[i3]  THEN   (* ist Unterschied zum letzten Zyklus?*)
x_S_neu:=TRUE;      (* Bei "größer" auf true setzen und aus der Schleife springen*)
Letzte_Stoerung:=i3; (*für Fehlersuche Störungen*)
EXIT;
   ELSE x_S_neu:= FALSE;(*sonst Bit auf 0 setzen*)
   END_IF;
END_FOR;

(*x_S setzen so lange eine Störung ansteht*)
FOR i4 := 0 TO 31 BY 1 DO
   IF  Stoerung[i4] > 0 THEN   (*steht eine Störung an?*)
      x_S:=TRUE; EXIT;      (* Bei "größer" auf true setzen und aus der Schleife springen*)
   ELSE x_S:= FALSE;(*sonst Bit auf 0 setzen*)
   END_IF;
END_FOR;
Stoerung_alt:=Stoerung; (*aktuelles Array nach "alt" schieben*)



Die externe Schnittstelle des Bausteins und Ansteuerung der Relais.

(* prüfen ob (neue) Fehler anliegen *)
Meldung_check(
Warnung:= A_Warnungen,
Stoerung:= A_Stoerungen,
x_W_neu=> , x_S_neu=> , x_W=> , x_S=> );

Warn_setzen(SET:= Meldung_check.x_W_neu, RESET1:= E_reset, Q1=> );
Warnung:= Warn_setzen.Q1; (*Warnungsbit setzen*)
Stoer_setzen(SET:= Meldung_check.x_S_neu, RESET1:= E_reset, Q1=> );
Stoerung:= Stoer_setzen.Q1; (*Störungsbit setzen*)
(* Störlampe ansteuern (0=alles OK, blinken=Warnung, 1=Störung)*)
Stoerlampe:= (SysBl1 AND Meldung_check.x_W) OR Meldung_check.x_S;

(* Störmeldekontakte verzögern  und Testimpuls erzeugen*)
Verz_SSM(IN:= (NOT Stsp_ok OR Stoerung), PT:= T_Verz_SSM, Q=> , ET=> );(*Verzögerung bis Sammelstörmeldung*)
SM_Test(IN:= Telenot_Test, PT:= t#10s, Q=> , ET=> ); (*Testimpuls*)
SM_Telenot:= NOT (Verz_SSM.Q OR SM_Test.Q); (* Störmeldung an Wählgerät 0=Störung *)
Error[76]:= SM_Test.Q; (*Hinweis an Visu, Testimpuls abgesetzt *)
Weil Einfach einfach Einfach ist!