Step 7 Ein Problemchen beim Planen einer Schrittkette

Zuviel Werbung?
-> Hier kostenlos registrieren
Vielen Dank für eure Unterstützung; ich hoffe ich raffe das jetzt noch mal irgendwann...

Also, ich fange jetzt mal mit dem Code von Tigerente an und wenn der korrekt ist, dann kommt deiner dran, Larry! ;)
Sonst blicke ich es gar nimmer.

Der Code von Tigerente in SCL:

Code:
// FC oder FB als Ausgabebaustein

IF Automatik AND SchrittXY AND NOT Stoerung THEN
   Auto_Ventil_A := 1;
ELSE
   Auto_Ventil_A := 0;
END_IF;

IF Hand AND TasterAB AND NOT Stoerung THEN
   Hand_Ventil_A := 1;
ELSE
   Hand_Ventil_A := 0;
END_IF;

IF Auto_Ventil_A OR Hand_Ventil_A OR GS_Ventil_A THEN
   Ventil_A := 1;
ELSE
   Ventil_A := 0;
END_IF;


Meine Fragen dazu:

1)
Stimmt das so in SCL und können alle drei Teilbereiche z.B. in einen gemeinsamen Ausgabebaustein gepackt werden?

2)
Für das Beispiel, dass jemand in SchrittXY in Handbetrieb schaltet, würde über den ELSE-Zweig der Merker "Auto_Ventil_A" auf Null gesetzt werden. Dadurch wird im Ausgangsbaustein der eigentliche Aktor "Ventil_A" ebenfalls auf Null gesetzt. Stimmt das?

3)
Das ganze Konstrukt muss nun im Grunde für jeden Aktor einer Schrittkette programmiert werden?
 
Dein Code würde meinem Beispiel entsprechen.
Man kann das aber noch schöner zuweisen:

Beispiel:

Code:
#Auto_Ventil_A := Automatik AND SchrittXY AND NOT Stoerung

Von der Bausteinstruktur her mache ich gern folgendes:

- Baustein mit Betriebsarten
- Baustein mit Ausgängen, zum Teil zusammengefasst für irn Modul
- Baustein mit Automatikschrittkette
- Baustein mit Grundstellungsschrittkette

Die Handfunktion schreibe ich i.d.R. mit in den Baustein für den jeweiligen Ausgang.

Im Baustein Betriebsarten sind die entsprechenden Merker "Hand", "Auto" etc.
Wenn halt jemand "Hand" wählt, ist der "Auto"-Merker nicht da. Du hast das denke ich richtig verstanden.

Die Schrittkette solltest Du Dir wie von Larry vorgeschlagen skizzieren.

Du siehst ja schon, dass es viele Wege zum Ziel gibt. Zum Teil ist es auch anlagenbezogen zu entscheiden, welche Variante besser passt.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Und um die Verwirrung jetzt komplett zu machen:

SCL ist nicht in allen Fällen die beste Programmiersprache.
Diskussionen dieser Art gibt es in diesem Forum genügend.
Ich glaube aber schon, dass sich alle einig darüber sind, Verknüpfungen wie

Code:
#Auto_Ventil_A := Automatik AND SchrittXY AND NOT Stoerung

sind in KOP/FUP am elegantesten.
 
Dein Code würde meinem Beispiel entsprechen.

Von der Bausteinstruktur her mache ich gern folgendes:

- Baustein mit Betriebsarten
- Baustein mit Ausgängen, zum Teil zusammengefasst für irn Modul
- Baustein mit Automatikschrittkette
- Baustein mit Grundstellungsschrittkette

Lieben Dank für deine Hilfestellung bei meinen Schrittketten-Gehversuchen... ;)

Kann man deinen Code wie folgt in verschiedene Bausteine aufteilen:

Baustein für Automatik-Schrittkette:
Code:
IF Automatik AND SchrittXY AND NOT Stoerung THEN
    Auto_Ventil_A := 1; 
ELSE    
   Auto_Ventil_A := 0;
END_IF;

Baustein für Handbetrieb:
Code:
IF Hand AND TasterAB AND NOT Stoerung THEN
    Hand_Ventil_A := 1; 
ELSE    
    Hand_Ventil_A := 0; 
END_IF;

Baustein für Grundstellungsfahrt:
Code:
IF Taster_GS AND NOT Automatik THEN
    GS_Ventil_A := 1;
ELSE 
    GS_Ventil_A := 0;
END_IF;


Baustein für Ausgangszuweisung:
Code:
IF Auto_Ventil_A OR Hand_Ventil_A OR GS_Ventil_A THEN   
    Ventil_A := 1; 
ELSE    
    Ventil_A := 0;
END_IF;

Und jetzt ganz wichtig:

Beim Umschalten von Automatik in Hand wird bei obigem Code einfach der Merker "#Auto-Ventil_A" nicht mehr zugewiesen, so dass automatisch der Ausgang für Ventil_A stromlos wird. Habe ich das jetzt endlich geschnallt???
 
Zuletzt bearbeitet:
Das ist jetzt merkwürdigerweise sogar logisch. :p

Der Baustein "Betriebsarten" wird so mit Code gefüllt, dass der Merker "Automatik" im Handbetrieb oder bei der Grundstellungsfahrt nicht mehr an ist. Das kann z.B. durch einen Automatik-Hand-Wahlschalter ausgelöst werden.
Dann geht auch der Ausgang aus.
Zur Erinnerung: Ob Du dabei die Schrittkette zurücksetzt oder im aktuellen Schritt stehen lässt ist erstmal nicht relevant.

Überleg Dir nochmal, ob Du wirklich bei dem "IF, THEN, ELSE" bleiben willst, anstatt es zuzuweisen wie von mir gezeigt.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Das ist jetzt merkwürdigerweise sogar logisch. :p

Dann geht auch der Ausgang aus.

Überleg Dir nochmal, ob Du wirklich bei dem "IF, THEN, ELSE" bleiben willst, anstatt es zuzuweisen wie von mir gezeigt.

Ja gell, wobei die Betonung auf "merkwürdigerweise" liegt! ;) Ich krieg das schon noch hin, wenn euch nicht davor die Motivation mir zu helfen ausgeht...

1)
Wobei aber der Ausgang ja schon dadurch weggeht, dass in deinem geposteten Code einfach der Merker "#Auto-Ventil_A" nicht mehr zugewiesen wird, oder?


2)
Dadurch bekommt ja dann im Grunde jede Schrittkette am Ende noch einen langen Rattenschwanz mit diesen Hilfsmerkern angehängt, denn davor sind ja die ganzen Schritte programmiert. Habe ich schon richitg verstanden?



Und ja, vermutlich ist dein Code doch etwas ansprechender... ich überlege es mir noch!

Lieben Dank!
 
Zuletzt bearbeitet:
Dadurch bekommt ja dann im Grunde jede Schrittkette am Ende noch einen langen Rattenschwanz mit diesen Hilfsmerkern angehängt, denn davor sind ja die ganzen Schritte programmiert. Habe ich schon richitg verstanden?

... das ist aber nicht so schlimm wenn man das Ganze schön strukturiert und mit entsprechenden Überschriften versieht (gerade bei Einsatz von SCL nicht unwichtig) ...

Ansonsten wie schon von Tigerente erwähnt - diese Variante bewirkt das Gleiche, ist aber m.E. anschaulicher und erzeugt auch noch den kompakteren Code :
Code:
statt :
IF Automatik AND SchrittXY AND NOT Stoerung THEN
     Auto_Ventil_A := 1;
 ELSE
     Auto_Ventil_A := 0; 
END_IF;

lieber :
Auto_Ventil_A := Automatik AND SchrittXY AND NOT Stoerung ;

Gruß
Larry
 
... das ist aber nicht so schlimm wenn man das Ganze schön strukturiert und mit entsprechenden Überschriften versieht (gerade bei Einsatz von SCL nicht unwichtig) ...

Ansonsten wie schon von Tigerente erwähnt - diese Variante bewirkt das Gleiche, ist aber m.E. anschaulicher und erzeugt auch noch den kompakteren Code :
Code:
statt :
IF Automatik AND SchrittXY AND NOT Stoerung THEN
     Auto_Ventil_A := 1;
 ELSE
     Auto_Ventil_A := 0; 
END_IF;

lieber :
Auto_Ventil_A := Automatik AND SchrittXY AND NOT Stoerung ;

Gruß
Larry

Ok, vielen Dank Larry!

1)
Wenn ich nun an die eigentliche Schrittkette noch obigen Code für jeden Aktor anhänge, so müssen in der Schrittkette selbst die beiden Voraussetzungen "Automatik" und "NOT Stoerung" aber nicht zusätzlich auch noch programmiert werden, richtig?

2)
Macht es eigentlich für die Zykluszeit einen Unterschied, ob ein Baustein in FUP, AWL oder SCL programmiert ist?

Lieben Dank!
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Spirit,
1)
Wenn ich nun an die eigentliche Schrittkette noch obigen Code für jeden Aktor anhänge, so müssen in der Schrittkette selbst die beiden Voraussetzungen "Automatik" und "NOT Stoerung" aber nicht zusätzlich auch noch programmiert werden, richtig?
Hatten wir den Punkt nicht weiter vorne im Thread schon mal ...?
Wenn du möchtest, dass deine Schrittkette unmittelbar auf den Zustand reagiert dann mußt du es auch in sie integrieren - in den unterschiedlichen Varianten.
Ist etwas "nur" eine Verriegelung dann baust du es vor die Zuweisung des Ausgangs. Anweidungen hier wirken sich aber nicht direkt auf das Laufverhalten der Schrittkette aus ...

2)
Macht es eigentlich für die Zykluszeit einen Unterschied, ob ein Baustein in FUP, AWL oder SCL programmiert ist?
Ja und Nein ...
KOP, FUP und AWL sind ja eigentlich nur Darstellungsformen und Geschmackssache. Selbstverständlich lassen sich manche Sachen in KOP/FUP gar nicht oder nur mit hohem Aufwand machen. Ich persönlich kann z.B. mit FUP gar nichts anfangen.
Bei SCL ist das schon wieder etwas anders. Je nachdem, wie man den Code aufbaut oder seine Variablen organisiert kann es sein, dass der Compiler wesentlich eleganteren AWL-Code erzeugt, als man selber es machen würde - es kann aber auch eine wilde Pointer-Hopserei davon werden. Entsprechend verhält es sich dann auch mit der Zykluszeit. Pauschalisieren läßt sich das aber nicht.

Gruß
Larry
 
Hallo Spirit,

Hatten wir den Punkt nicht weiter vorne im Thread schon mal ...?

Wenn du möchtest, dass deine Schrittkette unmittelbar auf den Zustand reagiert dann mußt du es auch in sie integrieren - in den unterschiedlichen Varianten.
Ist etwas "nur" eine Verriegelung dann baust du es vor die Zuweisung des Ausgangs. Anweidungen hier wirken sich aber nicht direkt auf das Laufverhalten der Schrittkette aus ...

Gruß
Larry

Naja Larry, irgendwie hatten wir es schon... aber in einem etwas anderem Zusammenhang; glaube ich zumindest. :p

Nur, was mir einfach nicht ganz klar ist:


Wenn nun in SchrittX jemand NotAus drückt, so wird die Zuweisung des Automatik-Merkers am Ende der SK (wegen UN Stoerung) ungültig und somit der Ausgang nicht angesteuert. Wenn aber der Ausgang nicht angesteuert wird, so kann doch gleichzeitig auch die SK nicht mehr in den nächsten Schritt kommen, da ja dann die neue Bedingung (z.B. Zyl. A in AS) für den Folgeschritt nie mehr eintrifft... Insofern bleibt doch auch so die SK sofort stehen - oder übersehe ich da jetzt was?

Warum dann also das Ganze auch nochmals in der SK programmieren?
 
Hallo Spirit,
das mit dem Not-Aus hatte ich (ohne den Thread jetzt nach der passenden Passage zu durchsuchen) so in Erinnerung :
Code:
if Not_Aus then Kette := 0 ; end_if ;

... und nun die CASE ...
Den Not-Aus solltest du meiner Ansicht nach sowieso gesondern betrachten, weil das ja keine Regel-Bedienung ist / sein sollte und du somit für dein Aggregat / die zugehörige Schrittkette ohnehin keine saubere Fehlerbehandlung erstellen kannst. Not-Aus passiert (wenn es passiert) immer so, das du es im Ablauf nicht gebrauchen kannst. Deswegen kannst du das für die Kette selbst auch gut mit der Abwürgezeile machen. Wichtiger danach dann, dass du das Aggregat wieder in Start-Position bekommen kannst - deshalb die Geschichte mit der Grundstellungsfahrt, die u.A. ich auch schon mal erwähnt habe.

Mit dem "nochmals in der Schrittkette programmmieren" meinte ich ewas anderes. Es kann für dein Aggregat einen Zustand geben, wo eine alternative Weiterbearbeitung notwendig werden könnte - im Unterschied zu der "normalen Bearbeitung". Diesen Fall mußt du dann in der Kette selbst abfangen/berücksichtigen ...

Gruß
Larry
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Spirit,
das mit dem Not-Aus hatte ich (ohne den Thread jetzt nach der passenden Passage zu durchsuchen) so in Erinnerung :
Code:
if Not_Aus then Kette := 0 ; end_if ;

... und nun die CASE ...

Gruß
Larry

Ja, das stimmt schon Larry... so hatten wir das besprochen.

Ich war mir nur nicht sicher, ob ich die NotAus-Situation wirklich am Anfang der Kette extra programmieren muss, wenn ich den von Tigerente vorgeschlagenen Code ja eh am Ende der Kette anhänge. Und da es dort unter anderem ja so ist, dass bei "Stoerung" kein Aktor mehr angesteuert wird und NotAus bei mir eine "Stoerung" verursacht, dachte ich eigentlich, dass das dann doppelt gemobbelt ist... :confused:

Denn wie beschrieben, die Kette würde ja auch ohne diese NotAus-Zeile am Anfang sofort stehenbleiben... nur wäre sie halt nicht automatisch im Schritt0, sondern man müsste sie händisch dorthin bringen...
 
Naja Larry, irgendwie hatten wir es schon... aber in einem etwas anderem Zusammenhang; glaube ich zumindest. :p

Nur, was mir einfach nicht ganz klar ist:


Wenn nun in SchrittX jemand NotAus drückt, so wird die Zuweisung des Automatik-Merkers am Ende der SK (wegen UN Stoerung) ungültig und somit der Ausgang nicht angesteuert. Wenn aber der Ausgang nicht angesteuert wird, so kann doch gleichzeitig auch die SK nicht mehr in den nächsten Schritt kommen, da ja dann die neue Bedingung (z.B. Zyl. A in AS) für den Folgeschritt nie mehr eintrifft... Insofern bleibt doch auch so die SK sofort stehen - oder übersehe ich da jetzt was?

Warum dann also das Ganze auch nochmals in der SK programmieren?

Auch wenn der thread schon etwas länger geworden ist, solltest Du versuchen den Überblick zu behalten.
Auf diese Frage habe ich in Post#5 schon geantwortet.
Angenommen Du hältst die Schrittkette bei Not-Aus an, solltest Du dafür Sorge tragen, dass die Schrittkette nicht weiterlaufen kann.
Bei Not-Aus wäre es denkbar, dass jemand durch Lichtschranken greift, Teile oder Zylinder manuell bewegt usw.
Wenn die Schrittkette dann über dieses Sensor-Signal weiterschalten kann, ist das in vielen Fällen eher nicht beabsichtigt. Bei Wiederanlauf steht die Schrittkette möglicherweise im falschen Schritt.

Du solltest langsam mal festlegen, ob Du die Schrittkette anhalten oder auf 0 setzen möchtest. Wenn Du die Schrittkette nämlich zurücksetzt, reicht es wie von Dir geschrieben, die Startbedingungen abzufragen.
 
Auch wenn der thread schon etwas länger geworden ist, solltest Du versuchen den Überblick zu behalten.
Auf diese Frage habe ich in Post#5 schon geantwortet.
Angenommen Du hältst die Schrittkette bei Not-Aus an, solltest Du dafür Sorge tragen, dass die Schrittkette nicht weiterlaufen kann.
Bei Not-Aus wäre es denkbar, dass jemand durch Lichtschranken greift, Teile oder Zylinder manuell bewegt usw.

Ja ok, danke!

Wenn ich zur Ansteuerung eines Aktors ein bistabiles Magnetventil verwende, dann muss ich doch folgenden

Code:
U #Automatik
U #Schritt X
UN #Stoerung
= Auto_Ventil_GS

U #Automatik
U #Schritt Y
UN #Stoerung
= Auto_Ventil_AS

für den Aktor Ventil an die SK anhängen. Also getrennt, einmal für GS und einmal für AS; stimmt schon, oder? :confused:
 
Zuletzt bearbeitet:
Ein bistabiles Magnetventil hat 2 Spulenanschlüsse. Also nimmst Du auch 2 Ausgänge dafür. Der Code macht so auch Sinn. :idea:

Lieben Dank Tigerente, dann hätte ich ja sogar mal etwas (auf Anhieb) richtig gemacht... ;)


Macht es eigentlich einen (funktionellen) Unterschied, ob ich die beiden Merker (Auto_Ventil_GS und Auto_Ventil_AS) als Ausgangsparameter deklariere oder gleich fest in der Symboltabelle aufnehme?
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
... wie wäre es generell, wenn du uns mal dein bisheriges Werk präsentierst - ggf. festgemacht an einer nicht so komplizierten (aber beschriebenen) Schrittkette.
Dann kann man m.E. viel besser weiter philosophieren ... ;)

Gruß
Larry
 
... wie wäre es generell, wenn du uns mal dein bisheriges Werk präsentierst - ggf. festgemacht an einer nicht so komplizierten (aber beschriebenen) Schrittkette.
Dann kann man m.E. viel besser weiter philosophieren ... ;)

Gruß
Larry

Danke für das Angebot Larry, ist vielleicht eine gute Idee. Nur ist mein Werk noch nicht ganz vorführbereit... irgendwie bin ich noch immer dabei dem Ganzen eine sinnvolle (durchgehende) Struktur zu verpassen. Aber zu einem späteren Zeitpunkt wäre das evtl. doch eine gute Idee.

Ich habe glücklicherweise ziemlich viel Zeit das Projekt zu planen/realisieren. Von Beruf bin ich eigentlich Energieelektronikerin und hatte bis vor Kurzem mit SPS nicht viel zu tun. Als aber "unser" Programmierer gekündigt hatte, wurde niemand Neues eingestellt und man ist an mich herangetreten mit der Bitte, ob ich das nicht zusätzlich mit machen könnte...

Muss jetzt etwas vorsichtig sein, was ich schreibe; Feind liest ja evtl. mit. ;)

Aber ich denke das Ganze hat natürlich einen finanziellen Aspekt!

Da es mir nicht immer ganz einfach fällt (obgleich Frauen ja schon logisch denken können, gelle?) mich in die SPS-Welt einzuarbeiten, enstehen dann leider für euch immer so doofe Fragen von mir...

Ich habe mich jetzt mal (für ein bistabiles Magnetventil) sturr an folgende Struktur gehalten:

Code:
U #Automatik
U #Schritt X
UN #Stoerung
= Auto_Ventil_A_GS

U #Automatik
U #Schritt Y
UN #Stoerung
= Auto_Ventil_A_AS

U #Hand
U #Taste_A
UN #Stoerung
= #Hand_Ventil_A_GS

U #Hand
U #Taste_B
UN #Stoerung
= #Hand_Ventil_A_AS

U #Auto_Ventil_A_GS
O #Hand_Ventil_A_GS
= Ventil_A_GS

U #Auto_Ventil_A_AS
O #Hand_Ventil_A_AS
= Ventil_A_AS

Frage hierzu:

Im Handbetrieb sollen die GS/AS jeweils über ein Display-Button eines jeden Zylinders angefahren werden. Ist es da richtig, wenn ich z.B. die Grundstellungsanwahl für Taste_A wie folgt programmiere:

- Rücksetze Bit #Hand_Ventil_A_AS
- Setze Bit #Hand_Ventil_A_GS

Das funktioniert dann auch in der Praxis; allerdings nach Aus- u. Wiedereinschalten der SPS ist kein Ventil mehr geschaltet. Aber das wäre ja ok, oder?

Lieben Dank' euch...
 
Üblicherweise werden Handtasten am HMI so projektiert, dass das Tastenbit nur so lange an ist, wie die Taste gedrückt ist.
Da brauchst Du nichts zurücksetzen, wenn Du den Code nach dem von Dir vorgestellten Schema machst.

Bedenke auch noch einmal folgendes: Ein bistabiles Ventil bleibt in der zuletzt angesteuerten Lage. Es reicht also, das Ventil nur kurz anzusteuern. Daher ist es völlig irrelevant, ob ein Ausgang ansteht oder nicht, wenn die SPS neu startet.

Ganz pauschal kann man das vielleicht nicht sagen. Aber dennoch bin ich der Meinung, dass Ausgänge für Aktoren niemals an sein sollten, wenn die SPS einen Neustart gemacht hat.
 
Zurück
Oben