Eine Frage zur Schrittkette in SCL

Zuviel Werbung?
-> Hier kostenlos registrieren
Innerhalb einer Schrittkette würde ich nie einen Aktor zuweisen.
Das gehört nach außerhalb.

Diesen Satz würde ich voll unterstützen.
Wenn man aber in einer Schrittkette keinen Aktor zuweist, dann auch keinen Merker. Das macht es dann auch nicht besser.
Wenn der Ausgang A10.0 von Schritt 1 oder Schritt 5 oder Schritt 7 geschaltet werden soll dann würde ich es in der Zuweisung des Ausgangs auch so umsetzen. Alles andere wäre dann inkonsequent ...

Gruß
Larry
 
Ein Problem wäre es nur, wenn man nach einer Störung im vorhergehenden Schritt weitermachen würde - aber das kann doch eigentlich nicht passieren, denn im Speicher der SPS ist doch noch Schritt 5 gespeichert, so dass nach einer Störung eigentlich wieder dorthin gesprungen wird... oder irre ich mich?

Dass liegt Auge des Betrachters.
Wenn z.B. ein Teil aufgepresst werden soll und dieses ist verklemmt.
Dann Störung quittieren und Teil entnehmen.
Dann Fehler quit und wenn erkannt wird, dass Teil nicht aufgepresst wird, geht meine Schrittekette autoamtisch zurück zu dem Schritt in dem das Teil vorbereitet wird.
Und der Prozess wird fortgesetzt.

So kann es geschehen, doch es ist halt die Aufgabenstellung, die die Art der Programmierung bestimmt.


bike
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Diesen Satz würde ich voll unterstützen.
Wenn man aber in einer Schrittkette keinen Aktor zuweist, dann auch keinen Merker. Das macht es dann auch nicht besser.
Wenn der Ausgang A10.0 von Schritt 1 oder Schritt 5 oder Schritt 7 geschaltet werden soll dann würde ich es in der Zuweisung des Ausgangs auch so umsetzen. Alles andere wäre dann inkonsequent ...

Gruß
Larry

Schrittketten sind eine Philosophie :)
Wenn zuerst Ausgangsmerker auf null gesetzt werden, dann der Schritt angesprungen wird ist nur der aktuelle Merker 1.
Bei einer Störung nach dem Nullsetzen wegspringen und kein Aktor ist aktiv.

Aber jeder so wie er denkt oder will.


bike
 
OK ... aber dann kannst du auch genausogut die Ausgänge innerhalb der CASE-Struktur schalten. Die lassen sich dann ja auch bei einem Reset gezielt rücksetzen (oder setzen).
Der Charme, es nicht in der Struktur zu machen ist ja, das man sich um den Kram nicht kümmern muss weil es ja am Ende passiert. Vom Programmcode wir das dann natürlich "etwas" umfangreicher. Aber wie du schon schreibst :
jeder so wie er denkt oder will.

Gruß
Larry
 
Wenn man aber in einer Schrittkette keinen Aktor zuweist, dann auch keinen Merker.
Wenn der Ausgang A10.0 von Schritt 1 oder Schritt 5 oder Schritt 7 geschaltet werden soll dann würde ich es in der Zuweisung des Ausgangs auch so umsetzen.
Gruß
Larry

Ähm, sorry Larry - aber ich muss doch irgendetwas in der Schrittkette aktiv setzen, damit ich dann am Ende den Ausgang A10.0 zuweisen kann. Das verstehe ich jetzt nicht; wenn es auch keine Merker sein sollen, was denn dann? :confused:
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Aber die Variablen, bzw. Merker sind doch auch im Schritt 0 nur dann Null, wenn diese im Verlauf der nachfolgenden Schritte nach und nach rückgesetzt werden, oder nicht? Oder wird das an einer best. Stelle explizit gemacht? Was ich meine, wenn die Schrittkette z.B. 15 Schritte hat, dann sollte ja im Schritt 15 wieder alles auf Null sein, so dass dann beim Sprung in Schritt 0 die Variablen automatisch den Status Null haben - stimmt das so?

Ja von selbst wird da nichts zurückgesetzt. Der Start-Schritt ist nur 0, damit nichts passieren kann, wenn man einer Urlöschen durchführt.
Ob die Variablen alle wieder 0 sein müssen kann man nicht Pauschal sagen. Aktoren wird man idr. immer dann abschalten wenn es gerade notwenig ist. Variablen will ich eventuell auch über mehere Schrittkettenabläufe behalten. z.B. wenn ich 6 Teile entnehmen muss, lasse ich die Kette 6 mal durchlaufen und inkrementiere die Teileanzahl.
Dardurch, dass du innerhalb der Ketten mit Speichern und Rücksetzen arbeitest musst du halt auf deine Variablen aufpassen. Springe ich aus der Kette muss ich natürlich derbe aufpassen das ich auch wirklich alle wichtigen Variablen zurücksetze.

Alternativ dazu das System von Larry, wo der Aktor eine bedingte Zuweisung abhängig vom Wert der "Schritt" Variable hat.
Also
Code:
IF Schritt = 1 OR Schritt = 2 THEN
Antrieb := true;
ELSE
Antrieb := false;
END_IF;

(Soetwas sollte man auch in AWL/FUP/KOP machen)

Hier musst du nicht aufpassen ob alles "zurückgesetzt" worden ist. Jedoch ist man mit diesem System eingeschränkt und hat viel Ärger wenn man "mal einen Schritt einfügen" muss.
 
Hier musst du nicht aufpassen ob alles "zurückgesetzt" worden ist. Jedoch ist man mit diesem System eingeschränkt und hat viel Ärger wenn man "mal einen Schritt einfügen" muss.

Das ist aber ein Mangel beim Siemens SCL. In anderen besser ausgestatteten Programmiersprachen nimmt man für die Schrittzustände eine Enumeration. Wenn ich dann meine Schrittkette erweitern will füge ich dort einfach einen Schritt ein. Außerdem kann ich diese Enumeration in der Schrittkette und in der Zuweisung je nach Schritt verwenden. Bei Codesys bekomme ich im Online-Zustand beim Beobachten sogar den Namen des Enumerationswertes angezeigt, und nicht nur eine nichtssagende Nummer.

Beispiel Codesys ST:
Code:
TYPE eSCHRITTKETTE1 :
(
	INIT := 0,
	AUSFAHREN,
	EINFAHREN,
	ENDE
);
END_TYPE


VAR
	STEP : eSCHRITTKETTE1;
END_VAR

CASE STEP OF
	INIT:
		IF (BEDINGUNG1) THEN
			STEP := AUSFAHREN;
		END_IF
	AUSFAHREN:
		IF (BEDINGUNG2) THEN
			STEP := EINFAHREN;
		END_IF
	EINFAHREN:
		IF (BEDINGUNG3) THEN
			STEP := ENDE;
		END_IF
	ENDE:
		IF (BEDINGUNG4) THEN
			STEP := INIT;
		END_IF
END_CASE

Bei SCL könnte man das Problem eigentlich halbwegs über Konstanten umschiffen. Leider kennt SCL keine global gültigen Konstanten oder Dateien die man einbinden könnte. Somit muss man bei Erweiterung der Schrittkette die Konstanten per Copy/Paste in alle anderen Programmteile einkopieren.
SCL hat so viele Beschränkungen dass es kein richtigen Spaß macht. Wobei es wirklich nur Kleinigkeiten sind die fehlen, die einen aber schon enorm weiterbringen würden.
 
Dank' euch für die super Unterstützung!


Eine Frage ist bei der Umsetzung noch aufgetaucht:

Worin besteht eigentlich der Unterschied, ob ich nun Variante a) oder Variante b) programmiere? In beiden Fällen müssen ja E0.0 UND M10.0 TRUE sein!

a)
Code:
              IF E0.0 THEN
                IF M10.0 THEN
                  A0.0 := 1;
                END_IF;
              END_IF;

b)
Code:
              IF E0.0 AND M10.0 THEN
                A0.0 := 1;
              END_IF;
 
Lieben Dank Deltal,

wobei evtl. die Absicht hinter der Programmierung anders sein könnte, oder?

In Variante a) wird die "Merkerzeile" ja nur dann ausgeführt, wenn der Eingang 0.0 TRUE ist. Bei FALSE wird die Zeile mit dem Merker ja gar nicht beachtet...

Ich suche einfach nur den Grund, warum ein ehem. Kollege in seinem Programm ausschließlich die Variante a) und nicht b) verwendet haben könnte?
 
Richtig.. aus der Variante a wird der Compiler wohl ein AWL Programm mit zwei Sprüngen erstellen. Wie so oft gibt es halt mehrere Wege ein Ziel zu erreichen.
Die IF-THEN-Bäume sind imho etwas besser lesbar, erzeugen aber auch mehr Programcode.

Wobei man die Bitabfragen möglichst nicht im SCL durchführen sollte.. das geht wesendlich effektiver in FUP/AWL..
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Das Ergebnis ist in diesem Fall das selbe.
Wenn aber die Konstruktion mit den 2 Schleifen verwendet wird, ist es manchesmal einfacher bei der IBN, da Änderungen und Ergänzungen leichter rein und raus zu programmieren sind.
Außerdem wird die zweite ggF. Schleife, wenn die Bedingung nicht erfüllt ist, übersprungen, macht(e) vielleicht Sinn wegen Zykluszeit, früher.
:ROFLMAO:

Wobei ich die Verschachtlung von mehreren IF Schleifen nicht so gern mache, es wird schwerer beim Verstehen und Debbugen.

bike
 
Wie so oft gibt es halt mehrere Wege ein Ziel zu erreichen.

Ja, das stimmt wohl! Tue mich halt oftmals noch schwer den Sinn in den versch. möglichen Programmiervarianten zu sehen - sicherlich auch deshalb, weil mir noch Erfahrung fehlt... :-x

Aber dank eurer Hilfe und Geduld wird's schon werden... ist ja noch keine Meisterin vom Himmel gefallen, gell... :p
 
das war echt sehr lehrreich. danke euch allen. ich hab schon oft mit schrittketten zu tun gehabt, sei es nun zu schulungszwecken oder in der praxis. programmiert hab ich sie aber immer in awl. wenn ich mir das so in ST angucke ist das aber wesentlich einfacher und überschaubarer und scriptsprache ist mir nicht fremd... warum ich da nur nicht früher drauf gekommen bin...??? danke!

eine sache noch: es stimmt NICHT!, dass bei einer schrittkette in FUP/AWL teilweise 2 schritte in einem zyklus aktiv sind, ist das der fall, hat man einen fehler gemacht.
hierzu ein beispiel:

NETWORK
TITLE =Schritt 1
//
U #bedingung1;
U #schritt0;
S #schritt1;
ON #aus;
O #schritt2;
R #schritt1;

so ist es falsch, da erst im nächsten zyklus (nachdem schritt1 aktiviert wurde, dann auch schritt0 zurückgesetz wird. es ist also ein zyklus lang 0 und 1 aktiv.

viel besser ist:

NETWORK
TITLE =Schritt1
//
U #bedingung;
S #schritt1;
R #schritt0;

kann man auch in FUP konvertieren.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
NETWORK
TITLE =Schritt1
//
U #bedingung;
S #schritt1;
R #schritt0;.


Also bei mir für der nächste Schritt der vorherige Schritt noch aktiv sein.
Nur einen Bedingung ist mir zu wenig.

Es gibt viele Möglichkeiten eine Schrittkette zu programmieren und was richtig und falsch mag ich nicht beurteilen.
Wenn das Programm seine Aufgabe richtig erfüllt, ist es ein gutes Programm.


bike
 
Zurück
Oben