TIA Schrittkette in Strukturierter Text

arren

Level-2
Beiträge
52
Reaktionspunkte
2
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo, ich stehe zur Zeit etwas auf dem Schaluch. Es geht darum, eine Schrittkette in ST zu realisieren und zwar mit einer case-Answeisung, was auch das Problem darstellt. Als Beispiel sei folgende Schrittkette (in AWL) gegeben:

Code:
U Schritt 2
U B
R Schritt 2
S Schritt 3

U Schritt 3
U C
R Schritt 3
S Schritt 4

Als IF-Anweisung stellt sich das ganze bei mir folgendermaßen dar:

Code:
IF "Schritt" = 2 AND "B" = 1 THEN
    "Schritt" := 3;
END_IF;


IF "Schritt" = 3 AND "C" = 1 THEN
    "Schritt" := 4;
END_IF;


Jedoch würde eine case-Anwisung nicht wie folgt ausehen,

Code:
CASE "Schritt" OF
      [B][COLOR=#ff0000]1[/COLOR][/B]  :
        IF "B"=1 AND "Schritt" = 2 THEN
            "Schritt" :=   [B][COLOR=#ff0000]3  [/COLOR][/B]; END_IF;
      [B][COLOR=#ff0000]2[/COLOR][/B]  :
        IF "C" AND "Schritt" = 3 THEN
            "Schritt" :=   [B][COLOR=#ff0000]4[/COLOR][/B]  ; END_IF;
END_CASE;

da ich in der case-Anweisung ja Zwei verschiedene Werte zuweisen würde. In der Ersten Bedinungen wäre das eine " 1 " und eine " 3" in der zweiten Bed iengung eine " 2" und eine "4" . Angelehnt ist das ganze an diesen alten Post:

Hallo,
wenn du in SCL mittels CASE eine Schrittkette machen willst (der Befehl bietet sich ja geradezu dafür an) dann arbeitest du nicht mit Merkern sondern mit einem INT.
Das könnte dann z.B. so aussehen :
Code:
CASE Schritt of
   0 :
   // tue hier irgendwas
   if Bedingung_1 then Schritt := 1 ; end_if ;
   1 :
   // tue hier irgendwas
   if Bedingung_2 then Schritt := 2 ; end_if ;
   2 :
   // tue hier irgendwas
   if Bedingung_3 then Schritt := 0 ; end_if ;
END_CASE ;
Gruß
Larry


Was wäre hier der richtige Ansatz?
 
Ich benutze immer die Variante mit den IF... THEN Anweisungen. Da finde ich mich besser zurecht.

Aber wenn du eine CASE Anweisung für die Schrittkette verwenden willst, musst du es so machen:
Code:
CASE "Schritt" OF
      [B][COLOR=#ff0000]2[/COLOR][/B]  : "Blablabla... irgendwas anstoßen"
        IF "B"=1 THEN
            "Schritt" :=   [B][COLOR=#ff0000]3  [/COLOR][/B]; END_IF;
      [B][COLOR=#ff0000]3[/COLOR][/B]  : "tatatata....irgendwas anderes machen"
        IF "C" THEN
            "Schritt" :=   [B][COLOR=#ff0000]4[/COLOR][/B]  ; END_IF;
END_CASE;

Den Teil der If Abfrage nach dem Wert von "Schritt" erledigt dann die Case Anweisung.

Wenn du "Schritt" anderswo keinen neuen Wert zuweist wird bei jedem Durchlauf nur der Teil ausgeführt der beim Wert von "Schritt" steht.
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
So nebenbei ein kleiner Tipp, ich mache die Schritte immer in 10er Sprüngen. Als Schritt 10 dann Schritt 20 usw. Das hat den großen Vorteil, daß man da später relativ einfach noch Zwischenschritte einfügen kann, wenn Änderungen oder Erweiterungen gefordert werden.
 
Wenn Du es unbedingt in SCL realisieren willst, würde ich noch daran denken jedem Schritt ein Entry und ein Exit Ereignis zu spendieren. Welches nur für einen Zyklus beim Eintritt und beim Austritt aus dem Schritt TRUE ist, sozusagen first und last scan.
Solche Flanken werden in der Regel immer wieder in Schrittketten benötigt.
 
@Miasma:
den Sinn dieses Vorschlages kann ich nicht so recht nachvollziehen. Eine Schrittkette ist/macht ja schon von ihrer Natur her eine Flankenauswertung ...

@Bapho:
Das mit den Schritten/Schrittnummern kann man in SCL / ST sehr schön umgehen wenn man an Stelle von Betragswerten mit Konstanten oder Enumerationen arbeitet. Dadurch kann man dann auch nachträglich sehr schnell das komplette Schrittnummern-Konstrukt ändern ...

Gruß
Larry
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Larry,
@Miasma:
den Sinn dieses Vorschlages kann ich nicht so recht nachvollziehen. Eine Schrittkette ist/macht ja schon von ihrer Natur her eine Flankenauswertung ...
eine Flankenauswertung meinte Miasma wohl auch nicht, er meinte Entry und Exit Ereignisse. Der Schritt wird ja so lange ausgeführt, bis die Weiterschaltbedingung erfüllt ist. Es kann aber vorkommen, dass man gewisse Dinge einmalig beim Eintritt in den Schritt oder beim Verlassen ausführen möchte, dafür gibt es diese Entry/Exit Ereignisse.
 
Das kommt hier dann wahrscheinlich darauf an, wie man eine Schrittkette umsetzt ... (viele Wege führen nach Rom ...)
 
@Miasma:
den Sinn dieses Vorschlages kann ich nicht so recht nachvollziehen. Eine Schrittkette ist/macht ja schon von ihrer Natur her eine Flankenauswertung ...
Gruß
Larry

Ich habe häufig die Anforderung, dass ich beim Eintritt oder beim Austritt in/aus einen Schritt Aktionen auszuführen, die nur einen Zyklus lang gültig sind aber direkt zu diesem Schritt gehören.
Das löse ich in SCL genauso wie ich es in Graph 7 machen würde, direkt im Schritt. Bei Graph gibt es hierfür S1 und S0 als ereignisabhängige Aktionen.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
@miasma
Da würde mich jetzt mal interessieren, wie du das realisiert, da ja mit einer einfachen CASE Schrittkette immer nur eine Zahl vorhanden ist. Folglich also auch keine Flanke da ist.
Vielleicht steh ich aber da auch nur auf dem Schlauch.

Danke

Gesendet von meinem SM-G930F mit Tapatalk
 
Du kannst in der Case Anweisung sowas einbauen.

Code:
[COLOR=#008000]Flanke := False;
Endflanke_Schritt2 :=False;[/COLOR]
CASE "Schritt" OF
      [B][COLOR=#ff0000]2[/COLOR][/B]  :[COLOR=#00ffff] 
[/COLOR][COLOR=#008000]If Not "Flankenbit_Schritt2" then 
Flankenbit_Schritt2 := TRUE;
 Flanke:= TRUE;
End_IF;[/COLOR][COLOR=#00ffff][/COLOR]
Blablabla... irgendwas anstoßen"
IF "B"=1 THEN
 "Schritt" :=   [B][COLOR=#ff0000]3  [/COLOR][/B]; 
[COLOR=#008000]Flankenbit_Schritt2 := FALSE;
Endflanke_Schritt2 :=TRUE;[/COLOR]
END_IF;
      [B][COLOR=#ff0000]3[/COLOR][/B]  : "tatatata....irgendwas anderes machen"
        IF "C" THEN
            "Schritt" :=   [B][COLOR=#ff0000]4[/COLOR][/B]  ; END_IF;
END_CASE;
 
Zuletzt bearbeitet:
Ich denke, dass er so etwas meint ... es stellt sich dann nur für mich die Frage : warum dann nicht gleich 3 Schritte daraus machen ? Aber vielleicht sehe ich das ja auch einfach zu simpel ... ?!
 
Ich denke, dass er so etwas meint ... es stellt sich dann nur für mich die Frage : warum dann nicht gleich 3 Schritte daraus machen ? Aber vielleicht sehe ich das ja auch einfach zu simpel ... ?!

Weil es bei mir laut Verfahrensbeschreibung oftmals nicht 3 Schritte sind sondern einer mit den Ereignissen Entry, Do und Exit. Somit ist es wichtig das Verfahrensbeschreibung, Programm und Visualisierung deckungsgleich sind.
 
Ok, also geht es ohne zusätzlichen Code nicht. Aber da bin ich dann eher altmodisch und spendier ein dem nötigen Schritt einen R- bzw F Trig 😀

Gesendet von meinem SM-G930F mit Tapatalk
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich benutze immer die Variante mit den IF... THEN Anweisungen. Da finde ich mich besser zurecht.

Aber wenn du eine CASE Anweisung für die Schrittkette verwenden willst, musst du es so machen:
Code:
CASE "Schritt" OF
      [B][COLOR=#ff0000]2[/COLOR][/B]  : "Blablabla... irgendwas anstoßen"
        IF "B"=1 THEN
            "Schritt" :=   [B][COLOR=#ff0000]3  [/COLOR][/B]; END_IF;
      [B][COLOR=#ff0000]3[/COLOR][/B]  : "tatatata....irgendwas anderes machen"
        IF "C" THEN
            "Schritt" :=   [B][COLOR=#ff0000]4[/COLOR][/B]  ; END_IF;
END_CASE;

Den Teil der If Abfrage nach dem Wert von "Schritt" erledigt dann die Case Anweisung.

Wenn du "Schritt" anderswo keinen neuen Wert zuweist wird bei jedem Durchlauf nur der Teil ausgeführt der beim Wert von "Schritt" steht.


Hmm, wenn ich jetzt deinen Code übernehme, dann führt es zu einem Problem, ich hab es zum besseren Verständnis als Bilddatei hochgeladen.

Schritt 1 zeigt meine Ausgangssituation. "Schritt" ist in der Ausgangssituation "2" zugeordnet. Kriegt "b" nun eine "1", ist mein Schritt "3". Soweit so gut. Da ich jetzt in der case Anweisung, in die "3"-Bedingung gerutscht sein müsste, müsste "c" eine "1" kriegen, um in den Schritt 4 zu springen. Er bleibt jedoch aus einem mit nicht verständlichen Grund in der "3".

Wird an dieser Stelle kein Zyklus durchlaufen?!

 
Das liegt daran dass du vor der Case Anweisung die Zuweisung hast
Code:
Schritt := 2;

Damit ist der Wert vor jedem Zylus wieder 2, deshalb wird der Schritt 3 nie ausgeführt, weil er 3 sein muss, wenn er in die Case Anweisung reingeht.
Vorher wird er aber auf 2 gesetzt, also wird Schritt 2 jedes mal ausgeführt.

Bei einer Case Anweisung wird nur einmalig oben entschieden welcher Schritt ausgeführt wird, weshalb auch wenn du den Schrittwert in der Anweisung 2 auf 3 setzt, er trotzdem erst im nächsten Zyklus vorbei kommt um Schritt 3 zu bearbeiten.
Bei If...Then Ketten, kann er den Schritt 3 noch im selben Zyklus abarbeiten.
Ist bei normalen Anwendungen kein Problem, klar, aber manchmal kommts auch darauf an dass die Schritte im selben Zyklus bearbeitet werden.
 
Zuletzt bearbeitet:
das mit Entry und Exit Operationen geht einfacher:

Code:
Entry := schritt <> schritt_alt;
schritt_alt := schritt;

case schritt of
    1 :   if entry then 
                 Eingangsoperation;  // Entry
           end_if;

          Schrittanweisungen;  // Do

           if Weiterschaltbedingung then
                 schritt := 2;
                 Ausgangsoperation;  // Exit
           end_if;

    2: 

...

Braucht bis auf schritt_alt keine weiteren Variablen, TRIGS oder cases egal wie lang die Schrittkette ist...
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Bin dank euerer Beiträge ein gutes Stück vorran gekommen. Eine einfache Ablaufklette stellt jetzt kein Problem mehr da, jedoch eine parallele Verzweigung. Hier der Code (nur die Verzweigung) und zum schnelleren Verständnis die Grafcet.

Code:
IF "Schritt_1" AND "Schritt_3" THEN
    "BWG_R" := 1;
    "BWG_O" := 1;
    IF "rechte Endlage" THEN
        "Schritt_1" := 0;
        "Schritt_2" := 1;
        "BWG_R" := 0;
    END_IF;
    
    IF "obere Endlage" THEN
        "Schritt_3" := 0;
        "Schritt_4" := 1;
        "BWG_O" := 0;
    END_IF;
END_IF;


forum.jpg

Ist Schritt 1 und Schritt 2 aktiviert, so kann ich mit "rechte Endlage" und "obere Endlage" die Weiterschaltbedingung erfüllen. Jedoch NUR wenn ich eines der Schritte anspreche. Habe ich einen Schritt angesprochen und die Weiterschaltbedingung erfüllt, so lässt es sich beim anderen Schritt nicht mehr erfüllen.
Hänge den halben Tag schon dran und weiß nicht woran es liegt.

Update: Der Grund, warum sich die Verzweigung so verhält, ist mir bekannt: Eines der "Endlagen" versetzt jeweils den Schritt 1 bzw. 3 auf "0", somit ist die übergeordnete Bedingung nicht mehr erfüllt (IF "Schritt_1" AND "Schritt_3" THEN...)

Update: Und hier ist auch schon die Lösung: Manchmal hilft es, die Problematik auszuformulieren :lol:

Code:
IF "Schritt_1" AND "Schritt_3" THEN
    "BWG_R" := 1;
    "BWG_O" := 1;
END_IF;

    IF "obere Endlage" THEN
        "Schritt_3" := 0;
        "Schritt_4" := 1;
        "BWG_O" := 0;


ELSIF "rechte Endlage" THEN
        "Schritt_1" := 0;
        "Schritt_2" := 1;
        "BWG_R" := 0;
    END_IF;
 
Zuletzt bearbeitet:
Hallo in die Runde...
Das Thema war ja schon öfters da...
Als fortgeschrittener Einsteiger und ST´ler möchte ich gerne nochmals auf die mögliche Verwendung von Enum hinweisen.
Dann ist die Schrittgröße sowie Trigger oder Merker/Flanken ggf. unnötig, da hier sprechende enum´s eingesetzt werden können.
Bsp:
Code:
TYPE Schrittkette: (
eMotor_init,
eMotor_anlauf,
eMotor_Dauer_in,
eMotor_Dauer_work,
eMotor_dauer_out,
eMotor_aus
);
END_TYPE

In meinem Bsp. soll der in/work/out symbolisch für den von Larry Laffer beschriebene Schritte darstellen.
Bei meinen Lernereien war es damit dann sehr hilfreich im Tracing nicht nur die Zahlen der Schrittkette zu beobachten,
welche sich ggf. bei "schnellen" Änderungen von der "schönheit" verabschiedeten, sondern "Klartexte" zu sehen und es dem Compiler zu überlassen, welche Nummern er daraus macht (Macht er ja nicht wirklich, sondern ist ja auch festgelegt oder änderbar, bevor hier eine "sublawine" losbricht)
Augenscheinlich wird dies aber sehr wenig genutzt ???
Liegt dies an mangelnder Kenntnis und damit Verbreitung ?
Oder ist es wie ich oft lese: Das mache ich schon immer so ;)

Viel Spaß
Shrimps
 
Das TIA-Portal kann keine Enumerationen. Als Ersatz könnte man Konstanten verwenden, und dementsprechend auch die Nummern für diese selber vergeben.

Das TIA-Portal hat dafür einen ganze Zoo weitere unnütze Nicht-Standard-Funktionen. Mir würde der Pascal Standard schon reichen.
 
Zurück
Oben