TIA Unwichtig/Diskussion: Schrittkette verbessern

Saufautomat

Level-2
Beiträge
45
Reaktionspunkte
2
Zuviel Werbung?
-> Hier kostenlos registrieren
Hi Ihr,

wie der Titel schon sagt ist das nicht wichtig. Mein Projekt wurde von einem Kollegen übernommen, der die vorhandenen Schrittketten durch seine eigene, nicht kommentierte Version ersetzten wollte. Das hat er für das halbe Projekt gemacht. Mittlerweile weiß ich auch warum, pro Schrittkette werden 2% Arbeitsspeicher verbraucht und er ist bei 96% angekommen. CPU ist eine 1215C.
Die bisherige Schrittkette war auch nicht das gelbe vom Ei aber wesentlich resourcensparender.

Ich überlege nun, ob man seine Kette verbessern kann. So ist jeder Schritt aufgebaut:
1677501562992.png

Jede Schrittkette hat fix 50 von den Schritten (was auch nicht reicht).
Ich kenne mich nicht so gut aus. Meine Idee wäre es nicht 50 TON zu verwenden sondern einen. Es ist ja immer nur ein Schritt aktiv. Beim Wechsel auf den nächsten Schritt müsste man den Timer in dem dargestellten Netzwerk resetten am Ende resetten. Und dann das ganze in einer While-Schlauf durchlaufen. Ist das denkbar?
Habt ihr vielleicht bessere Schrittketten parat?

Ein anderes Problem ist, dass regelmäßig Änderungen gewünscht werden. Dann muss ich am Anfang einen Schritt einfügen und alles neu durchnummerieren. Bei meiner Variante habe ich 5er Schritte genommen aber das mit der Schrittkette umzusetzen wäre viel zu arbeitsspeicherlastig.
 
Naja ... für die Umsetzung von Schrittketten gibt es ja so mehrere Ansätze ...
Diesen Ansatz von dir habe ich bislang noch nicht gesehen und so richtig leuchtet mir das mit dem Timer auch nicht ein.

Möglichkeit 1 :
Die Merker-Schrittkette - hier gibt es für jeden Schritt einen Merker (oder eine BOOL aus der Instanz des FB's in der die SK umgesetzt ist). Ist die Bedingung erfüllt löscht man den aktuellen Schrittmerker und setzt den nächsten.

Möglichkeit 2 :
Die Zählvariable (wie in deinem Fall) - hier hat man einen Integer den man auf einen Wert abfragt und bei der Weiterschaltung diesem dann einen neuen Wert zuweist. Diese Variante verbraucht naturgemäß sehr viel mehr Speicher wie Möglichkeit 1 - für die Schritte selbst - aber auch für das Zuweisen von Aktionen zu den Schritten.

Möglichkeit 3 :
Du arbeitest mit Graph (habe ich selbst aber noch nicht gemacht) - das wird sich aber wahrscheinlich im Speicherbedarf wie auch in der Performance ähnlich wie Möglichkeit 2 verhalten.

Wie würdest du selber denn deine Schrittketten erstellen ?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Das sieht ja lustig aus.

Und für jeden Schritt gibt es hier ein eigenes Netzwerk? 🤣

Wie sieht denn die Schnittstelle von dem Teil aus?
Sind alle Netzwerke wirklich identisch?
Es sind immer exakt 50 Schritte?
Muss es in FUP sein?
Warum muss man bei Änderungen am Anfang was hinzufügen?
 
Wie würdest du selber denn deine Schrittketten erstellen ?
1677574309650.png
So ist es aufgebaut, allerdings ohne Timer. Und ohne die Möglichkeit von Automatik in manuellen Modus zu schalten. Der FC Schritt wird in jedes Netzwerk eingefügt. Zusätzlich gibt es einen DB der die aktuelle Schrittnummer als Int speichert und ein Bool-Array für den aktiven Schritt.

Und für jeden Schritt gibt es hier ein eigenes Netzwerk? 🤣

Wie sieht denn die Schnittstelle von dem Teil aus?
Ja genau.
So wird er in jeder Schrittkette einmal aufgerufen. Er hat fix 50 Schritte, daher braucht jede Schrittkette auch genau gleich viel Speicher.

1677574796582.png
Ein einzelner Schritt sieht dann so aus:
1677575006090.png
Graph geht auf der 1200er leider nicht (oder geht mittlerweile?). Ich möchte es jedenfalls nicht nochmal alles ändern ;)
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Bei der Schnittstelle hätte mich sowas hier interessiert.
1677576229136.png

Wie weit, darf sich denn das Verhalten vom Ursprung entfernen?
So wie ich das gelesen habe, können mehrere aufeinanderfolgende Schritte gleichzeitig aktiv sein.
 
Wie auch immer.
Wenn es sich hier um den SEQ_FBK handelt, werden wahrscheinlich vor und/oder nach den Schrittnetzwerken aus deinem ersten Post Anweisungen ausgeführt.

Ein kleiner Umbau , damit nicht alle 50 Schritte im FB stehen müssen und nur ein Timer benötigt wird.1677577544490.png
1677577341076.png
1677577366611.png
Falls es nach den Schritten noch Anweisung gibt, anstelle der Return-Anweisung unter das Netzwerk 4 von mir springen.
Das SEQ_STEP_MAX gehört da wahrscheinlich auch noch irgendwo rein.

Erwartetes anderes Verhalten:
Es wird entweder ein oder kein SEQ_STEP_CMD bit auf high sein.
Schrittweiterschaltung ist einen SPS-Zyklus später.

Ist jetzt nur schnell zusammengebastelt.
Auf Funktion wurde nicht getestet.

Nachtrag:
Das Verhalten von SEQ_STEP_NO kann ich jetzt nicht beurteilen.
Bei mir zählt es halt bis 51 und hört dann auf.
 
Zuletzt bearbeitet:
Bei der Schnittstelle hätte mich sowas hier interessiert.

Wie weit, darf sich denn das Verhalten vom Ursprung entfernen?
So wie ich das gelesen habe, können mehrere aufeinanderfolgende Schritte gleichzeitig aktiv sein.
So sieht die Schnittstelle aus:
1677590025247.png
Das entspringt wohl irgendeiner Bibliothek?

Es ist immer nur ein Schritt aktiv. Es gibt allerdings eine übergeordnete Schrittkette aber das spielt hier keine Rolle.

Danke für den Umbau, das werde ich bei Gelegenheit testen. Ich habe es auch umgebaut aber gleich in SCL, damit es in einer Schleife laufen kann. Es braucht nur noch 25% von dem Speicher aber es hat noch ein paar Bugs und den Timer bekomme ich nicht zum Laufen. Naja ich mache es besser Schritt für Schritt, wie eine Schrittkette^^ Ich mache es erstmal so wie du.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Bei der Schnittstelle stell sich mir eher die Frage, warum Daten für 100 Schritte angelegt sind aber nur 50 verwendet werden.
Da wäre schon von Vorne herein großes Potential zur Speicherplatzoptimierung.
 
Bei der Schnittstelle stell sich mir eher die Frage, warum Daten für 100 Schritte angelegt sind aber nur 50 verwendet werden.
Da wäre schon von Vorne herein großes Potential zur Speicherplatzoptimierung.
Vermutlich hat er gemerkt, dass 50 Schritte nicht ausreichen und die Arrays erweitert und dann gemerkt, dass das Kartenhaus zusammenfällt. Etwas nervig^^
 
Möglichkeit 1 :
Die Merker-Schrittkette - hier gibt es für jeden Schritt einen Merker (oder eine BOOL aus der Instanz des FB's in der die SK umgesetzt ist). Ist die Bedingung erfüllt löscht man den aktuellen Schrittmerker und setzt den nächsten.

Möglichkeit 2 :
Die Zählvariable (wie in deinem Fall) - hier hat man einen Integer den man auf einen Wert abfragt und bei der Weiterschaltung diesem dann einen neuen Wert zuweist. Diese Variante verbraucht naturgemäß sehr viel mehr Speicher wie Möglichkeit 1 - für die Schritte selbst - aber auch für das Zuweisen von Aktionen zu den Schritten.
Hm, ich nutze normalerweise für meine Schrittketten auch INT. Je nachdem, was ich Programmiere tatsächlich in einer Abfrage oder einem Case-Of.
Warum genau verbraucht diese Variante mehr Speicher? Ist ein Integer-Vergleich/Zuweisung so viel schlechter Speichertechnisch als ein Boolscher? Weil reine Datenmenge ist ein INT ja bereits ab dem 17 Schritt besser, oder was verstehe ich nicht?
 
Hm, ich nutze normalerweise für meine Schrittketten auch INT. Je nachdem, was ich Programmiere tatsächlich in einer Abfrage oder einem Case-Of.
Warum genau verbraucht diese Variante mehr Speicher? Ist ein Integer-Vergleich/Zuweisung so viel schlechter Speichertechnisch als ein Boolscher? Weil reine Datenmenge ist ein INT ja bereits ab dem 17 Schritt besser, oder was verstehe ich nicht?
Vom Codebedarf her ist die INT-Schrittkette ungünstiger - du vergleichst ja immer auf einen Wert und schreibst ggf. einen neuen Wert in deine Schritt-Variable.
Vom Variablen-Speicherbedarf her wäre die Merker-Schrittkette bei mehr als 16 Schritten natürlich ungünstiger (für 50 Schritte bräuchte man dann schon 4 Worte) - das gleich aber den mehr-Codebedarf nicht aus ...

Die Ausführung selbst ist Geschmacksache - bei SCL würde ich persönlich auch immer zu CASE tendieren (vor Allem wenn ich genug Speicher habe - das war aber beim TE nicht mehr der Fall)
 
Ich denke dass das Hauptproblem die vielen Timer sind
Gibts bei der 1200er die S5-Timer noch? 🤔

Ansonsten, wozu braucht jeder Schritt überhaupt den Timer. Alternativ mit nem Addierer nen eigenen Timer bauen...

Wenn ich das richtig verstanden hab, gibts im Endausbau 100 Schrittketten a 50 oder 100 Schritte, also 10000 Timer?

Sind das überhaupt so viele verschiedene Abläufe oder kann man das zu einem "parametrierbaren" Ablauf zusammenfassen?
 
Zuletzt bearbeitet:
Gibts bei der 1200er die S5-Timer noch? 🤔

Ansonsten, wozu braucht jeder Schritt überhaupt den Timer. Alternativ mit nem Addierer nen eigenen Timer bauen...

Wenn ich das richtig verstanden hab, gibts im Endausbau 100 Schrittketten a 50 oder 100 Schritte, also 10000 Timer?

Sind das überhaupt so viele verschiedene Abläufe oder kann man das zu einem "parametrierbaren" Ablauf zusammenfassen?
Ja die "S5-Timer" gibt es in der 1200er noch, das sind aber wie im S7-Classic Hardware Timer daher auch begrenzt (ImHo).

Da wäre das parametrierbar auf jeden Fall vorzuziehen. Auch würde ich das mit Impulsen und Vergleichern aufbauen oder das ganze in SCL mit CASE...
 
Nein, den Legacy Ordner gibt es in der 1200 nicht.
Wenn du z.B. den S_IMPULS suchst, ist nicht vorhanden.
 
Zuletzt bearbeitet:
Wenn ich das richtig verstanden hab, gibts im Endausbau 100 Schrittketten a 50 oder 100 Schritte, also 10000 Timer?

Sind das überhaupt so viele verschiedene Abläufe oder kann man das zu einem "parametrierbaren" Ablauf zusammenfassen?
Es gibt vielleicht 30 Schrittketten, wobei eine mal nur 10 Schritte haben kann und die andere 100.
Meine Schrittkette kam gänzlich ohne Timer aus aber es ist nice to have. Bei ein paar Schritten überwache ich ob sie nicht zu lange laufen und ein paar andere sollen eine bestimmte Zeit laufen. Aber das habe ich außerhalb der eigentlichen Schrittkette programmiert.

Ich versuche das Bestehende zu verbessern, hauptsächlich um etwas zu lernen und weil das Programm dank des Umbauversuchs mit zwei verschiedenartigen Schrittketten läuft. Vor dem Hochrüsten auf V17 möchte ich etwas aufräumen. Und wenn man mal eine schöne Schrittkette hat kann man die ja wiederverwenden.
 
Zurück
Oben