Best Practice | Schrittkette von extern beschalten

Biiebs

Level-2
Beiträge
40
Reaktionspunkte
12
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Zusammen,

ich würde gerne mein prinzipielles Verständnis wieder etwas auffrischen oder mir neue Lösungsansätze aneignen.

Grundsätzlich geht es um das Basic Thema Schrittketten von extern beschalten in Strukturierten Text / SCL. Wie baut man das in der Praxis am Besten auf vor allem auch im Hinblick auf z.B. Aktorsteuerung (z.B. Motoren)? Über die Suche hab ich zwar das ein oder andere Thema gefunden aber noch keinen konkreten Ansatz....

Ich habe hier für den Anfang der Diskussion mal ein prinzipielles Beispiel erstellt, gibt es hierzu Tipps oder hat jemand ein konkretes Beispiel für mich?

Bin für jeden Tipp dankbar, denn kleine Schritte führen zu großen Erfolgen! ;)

Code:
PROGRAM PLC_PRG
VAR
     fbControlSeq : FB_ControlSequence;
     _xStart : BOOL;
END_VAR

_xStart := TRUE;

(* Ablaufsteuerung ausführen *)
fbControlSeq(xStart := _xStart);
fbControlSeq.Execute();

Code:
FUNCTION_BLOCK FB_Sequence
VAR_INPUT
    xStart : BOOL;
    xReset : BOOL;
    xExternesSignal1 : BOOL;
    xExternesSignal2 : BOOL;
    xExternesSignal3 : BOOL;
    xExternesSignal4 : BOOL;
    xExternesSignal5 : BOOL;
END_VAR
VAR_OUTPUT
    iZustand : INT;
    xError : BOOL;
END_VAR
VAR_IN_OUT
   
END_VAR
VAR
END_VAR

Code:
METHOD Execute : BOOL
VAR_INPUT
END_VAR
CASE iZustand OF
    0: (* Initialisierung *)
        IF xStart THEN
            iZustand := 1; (* Zum nächsten Zustand wechseln *)
        END_IF;
   
    1: (* Schritt 1*)
        IF xExternesSignal1 THEN
            iZustand := 2;
        ELSE
            xError := TRUE;
            iZustand := 6;
        END_IF;

    2: (* Schritt 2*)
        IF xExternesSignal2 THEN
            iZustand := 3;
        ELSE
            xError := TRUE;
            iZustand := 6;
        END_IF;

    3: (* Schritt 3*)
        IF xExternesSignal3 THEN
            iZustand := 4;
        ELSE
            xError := TRUE;
            iZustand := 6;
        END_IF;

    4: (* Schritt 4*)
        IF xExternesSignal4 THEN
            iZustand := 5;
        ELSE
            xError := TRUE;
            iZustand := 6;
        END_IF;

    5: (* Schritt 5: Finished *)
        IF xExternesSignal5 THEN
            iZustand := 0;
        ELSE
            xError := TRUE;
            iZustand := 6;
        END_IF;

    6: (* Errorzustand *)
        IF xReset THEN
            xError := FALSE;
            iZustand := 0;
        END_IF;
END_CASE;

Code:
FUNCTION_BLOCK FB_ControlSequence
VAR_INPUT
    xStart : BOOL;
END_VAR
VAR_OUTPUT
END_VAR
VAR
END_VAR

Code:
METHOD Execute
VAR_INPUT
END_VAR
VAR_STAT
    _fbSequence : FB_Sequence;    

    _xStart : BOOL;
    _xExternesSignal1 : BOOL;
    _xExternesSignal2 : BOOL;
    _xExternesSignal3 : BOOL;
    _xExternesSignal4 : BOOL;
    _xExternesSignal5 : BOOL;
    _xReset : BOOL;
    _iZustand : INT;
    _xErrorSeq : BOOL;
    _xAlarm : BOOL;
END_VAR



//************************************************************************
// Sequence
_xStart := xStart ;

(* Schalten der Signale abhängig von Bedingungen *)
_xExternesSignal2 := (_iZustand = 2);
_xExternesSignal3 := (_iZustand = 3);
_xExternesSignal4 := (_iZustand = 4);
_xExternesSignal5 := (_iZustand = 5);
   

IF _iZustand = 6 THEN
    (* Fehlerzustand überwachen *)
    _xAlarm := _xErrorSeq;
END_IF


//*****************************************************************************
_fbSequence(
    xStart:= _xStart,
    xReset:= _xReset,
    xExternesSignal1:= _xExternesSignal1,
    xExternesSignal2:= _xExternesSignal2,
    xExternesSignal3:= _xExternesSignal3,
    xExternesSignal4:= _xExternesSignal4,
    xExternesSignal5:= _xExternesSignal5,
    xError => _xErrorSeq,
    iZustand=> _iZustand);

_fbSequence.Execute();
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Eigentlich bin ich hauptsächlich auf CODESYS basierte Steuerungen unterwegs, also strukturierter Text. Prinzipiell wäre auch SCL möglich - die Portierung auf andere Steuerungshersteller wäre kein Problem.
 
Prinzipiell kann man das so machen. Ich hätte als Outputs aber dann auch die auszulösenden Aktionen (also die SPS-Ausgänge) und nicht die Schrittnummer. Naja ... und die Inputs würde ich natürlich auch nach deren realer Funktion benennen ...
Du könntest vielleicht noch irgendetwas mit Timeout (oder ähnlich) einbauen ...
 
Wie ist das, wenn ein externens Signal (z.B. 2) True ist, dann schaltet die Schrittkette weiter (z.B. 3) und geht sofort in Störung (6), wenn das folgende externe Signal (z.B.3) nicht True ist. Macht das Sinn?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Wie ist das, wenn ein externens Signal (z.B. 2) True ist, dann schaltet die Schrittkette weiter (z.B. 3) und geht sofort in Störung (6), wenn das folgende externe Signal (z.B.3) nicht True ist. Macht das Sinn?
In der fbSequence-Methode wird ja das externe Signal abhängig vom Zustand der SK geschaltet.

Wenn die Schrittkette in Schritt 3 springt, wird im gleichen Zyklus noch in der fbSequence-Methode das externe Signal xExternesSignal3 gesetzt, damit im nächsten Zyklus die Schrittkette das Signal erkennt und in den Schritt 4 übergeht. Daraufhin wird dann wiederum xExternesSignal4 gesetzt, etc.

Es wird also keinen Fehler geben, aber die Sinnhaftigkeit des permanenten Weiterschaltens dürfte schon hinterfragbar sein.
 
Ok
In der fbSequence-Methode wird ja das externe Signal abhängig vom Zustand der SK geschaltet.

Wenn die Schrittkette in Schritt 3 springt, wird im gleichen Zyklus noch in der fbSequence-Methode das externe Signal xExternesSignal3 gesetzt, damit im nächsten Zyklus die Schrittkette das Signal erkennt und in den Schritt 4 übergeht. Daraufhin wird dann wiederum xExternesSignal4 gesetzt, etc.

Es wird also keinen Fehler geben, aber die Sinnhaftigkeit des permanenten Weiterschaltens dürfte schon hinterfragbar sein.
Ok, mit dieser Art zu programmieren habe ich mich in der SPS noch nicht beschäftigt, halte das aber für Bullshit, weil mind. 80% der "alten Säcke", wie ich und der Instandhalter das eben nicht so blickt. Schrittketten kann man so einfach programmieren, warum derartig sinnlose Konstrukte bauen?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ohne mir jetzt zu lange deine FBs angeschaut zu haben, wirken die auf den ersten Blick auf unnötig komplex/verschachtelt auf mich. Ein einfaches CASE sollte es eigentlich auch tun.

Hinsichtlich deiner Frage zur Aktoransteuerung: Wir übergeben gerne die jeweiligen Aktorbausteine als Referenz an die Schrittkette. Dann kann man in der Schrittkette recht komfortabel die entsprechenden Methoden der Aktor FBs aufrufen.
 
Zurück
Oben