Zuviel Werbung? - > Hier kostenlos beim SPS-Forum registrieren

Seite 4 von 4 ErsteErste ... 234
Ergebnis 31 bis 32 von 32

Thema: Hilfe bei einem FB (SCL) bin ich hier richtig? Sorry, bin neu hier...

  1. #31
    Marcel9824 ist offline Neuer Benutzer
    Themenstarter
    Registriert seit
    03.09.2011
    Beiträge
    13
    Danke
    0
    Erhielt 0 Danke für 0 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    #
    (Ich hoffe das klappt mit der Raute

    Ich möchte mich nochmal vielmals bei Euch bedanken für die super Tipps und guten Hilfestellungen! Ich bin wirklich ein großes Stück weiter gekommen und bin Euch wirklich sehr dankbar dafür!

    Der FB funktioniert so wie er soll, ich denke er kann bestimmt noch verbessert werden, bin dankbar für jeden Tipp

    Hier der Code wie ich es gelöst habe:

    //--------------------------------------------------------------------------------------------------------//
    // Beschreibung FB804: Stoerungausgabe //
    // //
    // Erstellt : Schmidt M. am 09.09.11 - Code dokumentiert //
    // //
    //--------------------------------------------------------------------------------------------------------//
    // //
    // INHALTSVERZEICHNIS: 1) = Erfassung der Fehlerzustände mit definierter Blinkauswertung //
    // 2) = Der Freigabezustand der Fehlereingänge //
    // 3) = Auswertung für die Störtasterbeleuchtung //
    // 4) = Auswertung für Akustisches Signal mit Überbrückungsfunktion //
    // 5) = Sperrung des automatischen Wiederanlaufs durch Reseterwartung //
    // 6) = Sicheres Abschalten der Ausgänge wenn Baustein nicht aktiv ist //
    // //
    //--------------------------------------------------------------------------------------------------------//

    {SCL_OverwriteBlocks := 'y' ; SCL_CreateDebugInfo := 'y'}
    {SetOKFlag := 'y' ; OptimizeObjectCode := 'y'}

    FUNCTION_BLOCK FB804 // FB für Fehlerauswertung
    CONST
    ANZ := 9;
    END_CONST
    VAR_INPUT
    Baustein_aktiv: BOOL; // Baustein wird aktiviert
    Fehler1: BOOL; // Fehlerzustand1 = 1x blinken (1Hz) und 5sec Pause
    Fehler2: BOOL; // Fehlerzustand2 = 2x blinken (1Hz) und 5sec Pause
    Fehler3: BOOL; // Fehlerzustand3 = 3x blinken (1Hz) und 5sec Pause
    Fehler4: BOOL; // Fehlerzustand4 = 4x blinken (1Hz) und 5sec Pause
    Fehler5: BOOL; // Fehlerzustand5 = 5x blinken (1Hz) und 5sec Pause
    Fehler6: BOOL; // Fehlerzustand6 = 6x blinken (1Hz) und 5sec Pause
    Fehler7: BOOL; // Fehlerzustand7 = 7x blinken (1Hz) und 5sec Pause
    Fehler8: BOOL; // Fehlerzustand8 = 8x blinken (1Hz) und 5sec Pause
    Fehler9: BOOL; // Fehlerzustand9 = 9x blinken (1Hz) und 5sec Pause
    Fehler10: BOOL; // Fehlerzustand10 = 10x blinken (1Hz) und 5sec Pause
    Reseteingang: BOOL; // Reset für Fehler und Stoerpiepser
    Ueberbrueckungszeit: TIME; // Eingabe der Überbrückungszeit im Fehlerfall bei drücken des Resettasters
    END_VAR
    VAR_OUTPUT
    LED: BOOL; // Blinkauswertung des anstehenden Fehler (eine LED)
    Piepser: BOOL; // Akustische Fehlermeldung
    Sammelstoerung: BOOL; // Visuelle Fehleranzeige am Resettaster
    Keine_Stoerung: BOOL; // Stoerungsfreier Ausgang
    END_VAR

    VAR
    T_Blink_E: TON; // Blinkzeit EIN
    T_Blink_P: TON; // Blinkzeit AUS
    T_PAUSE: TON; // Blinkpause
    BLINK_JOB: INT; // Anzahl der Blinkvorgänge
    LAST_JOB: INT; // Merken welcher JOB schon abgearbeitet wurde (Startwert für den Schleifenindex i)
    HM_P: BOOL; // Hilfsmerker Blinken
    Alarmueberbrueckung: TOF; // Überbrückungszeit des Alarmsignals bei Fehlerreset
    Keine_Stoerung_FRG: BOOL; // Freigabevariable zur weiterverarbeitung
    FM1: BOOL; // Flankenmerker1 (Reseterfassung)
    FM2: BOOL; // Flankenmerker2 (Reseterfassung)
    END_VAR
    VAR_TEMP
    Fehler: ARRAY[0..10]OF BOOL; // Welcher Fehler steht in der Schleife
    i: INT; // Der Fehlerschleifenindex
    END_VAR
    LABEL _1; // Sprungmarke für Überbrückung des Resetstops im Fehlerfreien Zustand
    END_LABEL

    BEGIN;
    // ------------------------------------------------------------------------------------------------------------------------------//
    // (1) Erfassung der Fehlerzustände mit definierter Blinkauswertung //
    // ------------------------------------------------------------------------------------------------------------------------------//
    Fehler[0] := Fehler1;
    Fehler[1] := Fehler2;
    Fehler[2] := Fehler3;
    Fehler[3] := Fehler4;
    Fehler[4] := Fehler5;
    Fehler[5] := Fehler6;
    Fehler[6] := Fehler7;
    Fehler[7] := Fehler8;
    Fehler[8] := Fehler9;
    Fehler[9] := Fehler10;
    // Auf Fehler prüfen und Blink-Job eintragen
    IF T_PAUSE.Q THEN // Kein Blinkauftrag aktiv und Pausenzeit abgelaufen
    FOR i := LAST_JOB TO ANZ DO
    IF Fehler[i] = true THEN // Fehler steht an, dann
    BLINK_JOB := i + 1; // Nummer als "Blink-Job" eintragen = Anzahl Blinken
    LAST_JOB := BLINK_JOB; // damit bei nächstem Schleifendurchlauf mit nächstem Fehler fortgesetzt wird.
    IF LAST_JOB > ANZ THEN
    LAST_JOB := 0;
    END_IF;
    EXIT; // Schleife verlassen und Blink-Job abarbeiten
    END_IF;
    END_FOR;
    IF i > ANZ THEN // Wenn kein Blink-Job eingetragen (Schleife ist durchgelaufen)
    LAST_JOB := 0; // dann beim nächsten mal bei 0 beginnen
    END_IF;
    END_IF;

    // Blink-Job abarbeiten
    // Timer Einschaltdauer LED
    T_BLINK_E(
    IN := NOT T_BLINK_P.Q AND BLINK_JOB > 0,
    PT := T#300ms
    );
    // Timer Ausschaltdauer LED
    T_BLINK_P(
    IN := T_BLINK_E.Q,
    PT := T#300ms
    );
    // Timer Pausenzeit zwischen Blinkjobs
    T_PAUSE(
    IN := BLINK_JOB = 0,
    PT := T#2s
    );
    // Anzahl blinken zählen
    IF NOT T_BLINK_E.Q AND HM_P THEN
    BLINK_JOB := BLINK_JOB - 1;
    END_IF;
    HM_P := T_BLINK_E.Q;

    LED := NOT T_BLINK_E.Q AND BLINK_JOB > 0;


    // ------------------------------------------------------------------------------------------------------------------------------//
    // (2) Der Freigabezustand der Fehlereingänge //
    // ------------------------------------------------------------------------------------------------------------------------------//
    Keine_Stoerung_FRG :=true;
    FOR i := 0 TO 9 DO
    IF Fehler[i] = true THEN
    Keine_Stoerung_FRG :=False;
    END_IF;
    END_FOR;


    // ------------------------------------------------------------------------------------------------------------------------------//
    // (3) Auswertung für die Störtasterbeleuchtung //
    // ------------------------------------------------------------------------------------------------------------------------------//
    //Hier soll die Sammelstoerung (Störmeldeleuchte des Resettasters) angesteuert werden, immer wenn ein Fehler besteht und NUR bei Fehlerfreiheit ausgehen:
    IF Keine_Stoerung_FRG = false THEN Sammelstoerung:=true;
    ELSE Sammelstoerung:=false;
    END_IF;


    // ------------------------------------------------------------------------------------------------------------------------------//
    // (4) Auswertung für Akustisches Signal mit Überbrückungsfunktion //
    // ------------------------------------------------------------------------------------------------------------------------------//
    //Hier soll der Piepser im Takt des Fehlers gesetzt werden und bei drücken des Resettasters eine "gewisse Zeit" (Eingangsparameter) überbrückt werden.... steht er nach der Zeit immernoch an kommt erneut ein Alarm
    IF LED AND NOT Alarmueberbrueckung.Q THEN Piepser:=true;
    ELSE Piepser:=false;
    END_IF; //OK
    Alarmueberbrueckung( //Sollte ein Reset betätigt werden erlischt der Alarm und soll nach abgleaufener Zeit wieder melden......-> wenn Fehler noch ansteht!
    IN := Reseteingang,
    PT := Ueberbrueckungszeit //Überbrückungszeit vorgegeben durch Eingangsparameter
    );


    // ------------------------------------------------------------------------------------------------------------------------------//
    // (5) Sperrung des automatischen Wiederanlaufs durch Reseterfassung //
    // ------------------------------------------------------------------------------------------------------------------------------//
    //Hier die speichernden Fehler damit erst nach drücken des Resettasters der Ausgang wieder gesetzt werden kann......
    IF Keine_Stoerung AND Reseteingang THEN GOTO _1; //Überspringen des Rücksetzens im Fehlerfreien Betrieb durch drücken des Resets
    END_IF;
    FM2 := Reseteingang AND Keine_Stoerung_FRG AND NOT FM1; //Speichernde Flanke durch Reseteingang
    FM1 := Reseteingang AND Keine_Stoerung_FRG;
    IF FM2 = TRUE THEN //Flip-Flop Funktion
    Keine_Stoerung:= Keine_Stoerung XOR Keine_Stoerung_FRG;
    END_IF;
    IF NOT Keine_Stoerung_FRG THEN Keine_Stoerung:=false; //Fehlerzustand setzt Ausgang sicher zurück
    END_IF;
    _1: //Sprungmarke wegen des Rücksetzens im Fehlerfreien Betrieb durch drücken des Resettasters


    // ------------------------------------------------------------------------------------------------------------------------------//
    // (6) Sicheres Abschalten der Ausgänge wenn Baustein nicht aktiv ist //
    // ------------------------------------------------------------------------------------------------------------------------------//
    //Hier sollen die Ausgänge abgeschalten werden wenn der Baustein inaktiv ist. WICHTIG: Am Ende des Bausteins damit alle Ausgänge überschrieben werden!!!
    IF NOT Baustein_aktiv THEN LED:=false; Piepser:=false; Sammelstoerung:=false; Keine_Stoerung:=false;
    END_IF;
    // Hier darf nix mehr rein.........
    END_FUNCTION_BLOCK
    Zitieren Zitieren Dankeschön  

  2. #32
    Registriert seit
    06.10.2009
    Ort
    NRW
    Beiträge
    1.572
    Danke
    63
    Erhielt 259 Danke für 219 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Mit der "Raute" war ds kleine Icon über dem Eingabefenster gemeint. Du schreibst den Code dann zwischen die eckigen Klammern...

    Aber Dein Posting zeigt, wieviel Initiative Du dabei gezeigt hast.

    So mag es das Forum

    Ich verstehe nur nicht ganz den "Umweg" mit dem Arraybit Fehler[0].

    Deklariere doch das Array für den Bereich [1..10] und rangiere die Eingänge "passend" Fehler[1] := Fehler1;
    Dann musst Du auch nicht Beim Blinkjob-Eintrag mit "i+1" arbeiten.
    Oder gab es dafür doch noch einen Grund mit dem Feld[0] zu arbeiten ?!?

    // ------------------------------------------------------------------------------------------------------------------------------//
    // (3) Auswertung für die Störtasterbeleuchtung //
    // ------------------------------------------------------------------------------------------------------------------------------//
    //Hier soll die Sammelstoerung (Störmeldeleuchte des Resettasters) angesteuert werden, immer wenn ein Fehler besteht und NUR bei Fehlerfreiheit ausgehen:
    IF Keine_Stoerung_FRG = false THEN Sammelstoerung:=true;
    ELSE Sammelstoerung:=false;
    END_IF;
    geht einfacher mit:
    Code:
    Keine_Stoerung_FRG := not Sammelstoerung;
    Und zu guter letzt: Mit dem Button "Vorschau" kannst Du Dir das Posting ansehen, bevor Du auf "Antworten" klickst.
    Meine Motivation läuft nackig mit einem Cocktail über eine Wiese.

Ähnliche Themen

  1. Neu hier
    Von Halbwissen im Forum Stammtisch
    Antworten: 7
    Letzter Beitrag: 11.03.2010, 15:31
  2. Bin neu hier...
    Von Pro² im Forum Stammtisch
    Antworten: 10
    Letzter Beitrag: 11.10.2009, 22:26
  3. neu hier
    Von SPS-Mirk im Forum Stammtisch
    Antworten: 18
    Letzter Beitrag: 24.10.2007, 21:04
  4. Hi bin neu hier
    Von woodimweb im Forum Stammtisch
    Antworten: 4
    Letzter Beitrag: 05.09.2006, 14:28
  5. Antworten: 15
    Letzter Beitrag: 01.03.2005, 22:25

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •