# Verzweigung in FUP-Schrittketten



## clumsi (29 Mai 2020)

Moin,

ich denke, dass die Umsetzung von Schrittketten mit SR (bzw. RS in Codesys) eine relativ verbreitete Methode ist (s.u.). 






In den Tutorials liest man immer wieder, dass immer nur ein Schritt aktiv sein soll.

Wie ist das aber bei Verzweigungen? Nach ein paar Schritt-Transitions-Folgen starten zwei parallele Teilprozesse, jeder auch jeweils in einer Linienstruktur mit Schritten und Transitionen. Die Teilprozesse vereinen sich dann wieder zu einer Linie, wenn die beiden letzten Transitionen jeder Teillinie wahr ist.




Dies würde aber dazu führen, dass eben nicht nur ein Schritt gleichzeitig aktiv ist (nämlich da, wo beide Teillinien parallel ablaufen). Ist sowas trotzem eine sinnvolle Umsetzung?

Grüße,
clumsi


----------



## Matze001 (29 Mai 2020)

Hi,

ja das sind die "Schwächen" bzw. Schwierigkeiten bei FUP-Schrittketten (oder auch SCL SWITCH CASE Schrittketten, etc).

Du könntest das umgehen, in dem Du die zwei "Zweige" in Unter-Schrittketten zerlegst. Somit hast Du drei Schrittketten,
in der Hauptschrittkette gibt es dann einen Schritt der die zwei parallelen Schrittketten anstößt, und auf das Ende von beiden
wartet.

Wenn Du Codesys einsetzt könntest Du dir mal die Programmart AS (Ablaufsteuerung) anschauen - die bietet dir hier schöne 
Möglichkeiten ohne Merker-Wahnsinn.

Grüße

Marcel


----------



## escride1 (30 Mai 2020)

Mach ich ähnlich.

Jede Schrittkette hat seinen eigenen FB, daher gebe ich an der Hauptschrittkette über die Ouput-Schnittstelle ein separates Start-Bit für die jeweils parallel zu laufenden Schrittketten und lasse wieder über die Schrittketten mitteilen das diese abgearbeitet wurden.

Somit kann ich in den jeweiligen Instanzdatenbausteinen sehen welche der einzelnen Schrittketten wo steht.

Bei nur einer kleinen parallelen Schrittkette kann es aber auch vorkommen das diese im gleichen FB liegt.
Die einzelnen Steps schreibe ich dann allerdings jeweils in ein Struct mit den einzelnen Schritten etc.. Somit lassen die sich dann sortiert anschauen.

Etwas was ich nur nicht mag ist, das man z.B. in Schritt 3 dann auf Schritt 3.1.1 sowie auf 3.2.1 verweist. Das ist mir zu unübersichtlich, auch wenn es erstmal augenscheinlich sortiert ausschaut.

Was Matze bei Codesys als AS beschreibt ist bei Siemens dann eher Graph, als Baustein dann FB->Graph.


----------



## PN/DP (30 Mai 2020)

clumsi schrieb:


> In den Tutorials liest man immer wieder, dass immer nur ein Schritt aktiv sein soll.
> 
> Wie ist das aber bei Verzweigungen? Nach ein paar Schritt-Transitions-Folgen starten zwei parallele Teilprozesse, jeder auch jeweils in einer Linienstruktur mit Schritten und Transitionen. Die Teilprozesse vereinen sich dann wieder zu einer Linie, wenn die beiden letzten Transitionen jeder Teillinie wahr ist.


Wenn eine Schrittkette in mehrere Teilprozesse/Zweige verzweigt, dann kann man das auch als 2 Teil-Schrittketten interpretieren, von denen jeweils nur 1 Schritt aktiv ist. Aber: Deine Schrittkette mit SR-Gliedern funktioniert so, daß da auch bei linearem Ablauf ohne Verzweigung bei jedem Schritt-Weiterschalten am Ende des Zyklus mehrere Schritte aktiv sind, weil ein "beendeter" Schritt erst im nächsten Zyklus zurückgesetzt wird.

Harald


----------



## Blockmove (30 Mai 2020)

PN/DP schrieb:


> Wenn eine Schrittkette in mehrere Teilprozesse/Zweige verzweigt, dann kann man das auch als 2 Teil-Schrittketten interpretieren, von denen jeweils nur 1 Schritt aktiv ist. Aber: Deine Schrittkette mit SR-Gliedern funktioniert so, daß da auch bei linearem Ablauf ohne Verzweigung bei jedem Schritt-Weiterschalten am Ende des Zyklus mehrere Schritte aktiv sind, weil ein "beendeter" Schritt erst im nächsten Zyklus zurückgesetzt wird.
> 
> Harald



Aus diesem Grund programmieren wir schon immer FUP-Ketten "rückwärts". Also Schritt 1 im Prinzip letztes Netzwerk, Schritt 2 vorletztes Netzwerk...
Damit hat man das Thema 2 Schritte in einem Zyklus eigentlich nicht.
Natürlich kann es Verzweigungen mal vorkommen.


----------



## Onkel Dagobert (30 Mai 2020)

clumsi schrieb:


> .. In den Tutorials liest man immer wieder, dass immer nur ein Schritt aktiv sein soll...


Das ist eine Aussage, die ein gewisses Grundverständnis vermitteln soll. Das sollte man ganz einfach nicht zu wörtlich nehmen. Natürlich sind bei Simultanverzweigungen zwei Zweige parallel aktiv. Und bei der klassischen Schrittmerkertechnik sind beim Übergang für genau einen Zyklus logischerweise auch zwei Schritte aktiv. Das sollte in den meisten Fällen auch kein Problem darstellen. Aus meiner Sicht ist das zumindest kein Grund, die ganze Schrittkette auf den Kopf zu stellen. So einen Kopfstand beim Lesen stelle ich mir gerade auch sehr gewöhnungsbedürftig vor.

​​Zwei, beim Weiterschalten für einen Zyklus aktive Schrittmerker kann man auch als Schritt-Impuls ansehen, bzw. sich zunutze machen.


----------



## PN/DP (30 Mai 2020)

Ganz so marginal ist das Problem nicht. Es können auch 3, 4 oder mehr Schritte bzw. Schrittmerker am Zyklusende aktiv sein, je nachdem ob die Weiterschaltbedingungen bei Aktivierung eines Schrittes schon erfüllt sind.

Wenn man bei Richtungsänderungen von Aktoren keine extra Warteschritte und/oder Ausgangs-Veriegelungen eingebaut hat, dann kann das gleichzeitige Aktiv-sein mehrerer Schritte auch zu elektrischen Problemen führen. Es ist mindestens "unschön", wenn entgegengesetzt wirkende SPS-Ausgänge gleichzeitig aktiv werden, auch wenn es nur für 1 Zyklus ist (wie lang ist ein Zyklus bei dem Programm?!).


```
O "M_Schritt_2"
O "M_Schritt_3"
= "Q_Motor1_links"

O "M_Schritt_4"
O "M_Schritt_5"
= "Q_Motor1_rechts"
```

Harald


----------



## Onkel Dagobert (30 Mai 2020)

Ist schon klar Harald, wie immer es gibt natürlich unzählige Möglichkeiten, etwas falsch zu machen. In deinem konkreten Beispiel kracht es so oder so.


----------



## rostiger Nagel (30 Mai 2020)

so etwas würde ich *immer* gegeneinander verriegeln
in Software und wenn konventionell auch in der Hardware


```
U(
O "M_Schritt_2"
O "M_Schritt_3"
)
UN "Q_Motor1_rechts"
= "Q_Motor1_links"

U(
O "M_Schritt_4"
O "M_Schritt_5"
)
UN  "Q_Motor1_links"
= "Q_Motor1_rechts"
```


----------

