TIA Was ist perfomanteste Art zu programmieren ?

Zuviel Werbung?
-> Hier kostenlos registrieren
ja das ist allerdings richtig - das hab ich eben komplett übersehen :confused:
Dann darf man eben nicht mit EXIT die Schleife verlassen, muss sie einmal komplett durchlaufen und Prioritäten setzen über die Reihenfolge der IF / ELSIF Bedingungen :-)
Zeigt wieder das man nicht alle Optionen beim Lesen von Programm Code sieht und auch versteht was passiert / passieren soll.

Again what learned :D
 
Zuletzt bearbeitet:
Vollmis letzter Vorschlag, geringfügig "optimiert":
Code:
BEGIN
    #GesamtBetriebsart := -1;
    #Lower := LOWER_BOUND(ARR := #BA_Array, DIM := 1);
    #Upper := UPPER_BOUND(ARR := #BA_Array, DIM := 1);
    FOR #index := #Lower TO #Upper DO
[COLOR=#0000cd][B]        IF #BA_Array[#index] = #P1_Mode THEN
            #GesamtBetriebsart := #P1_Mode;
            Exit; 
[/B][/COLOR]        ELSEIF #BA_Array[#index] = #P2_Mode OR #GesamtBetriebsart = #P2_Mode THEN
            #GesamtBetriebsart := #P2_Mode;
        ELSEIF #BA_Array[#index] = #P3_Mode OR #GesamtBetriebsart = #P3_Mode THEN
            #GesamtBetriebsart := #P3_Mode;
        ELSEIF #BA_Array[#index] = #P4_Mode OR #GesamtBetriebsart = #P4_Mode THEN
            #GesamtBetriebsart := #P4_Mode;
        ELSEIF #BA_Array[#index] = #P5_Mode OR #GesamtBetriebsart = #P5_Mode THEN
            #GesamtBetriebsart := #P5_Mode;
        END_IF;
    END_FOR;
END_FUNCTION

Und nun noch das GegenBeispiel für gut unlesbar und leicht minderverständlich durch ZusatzSchleiferei und Zusatz-Array-al:
Code:
BEGIN
    #Lower := LOWER_BOUND(ARR := #BA_Array, DIM := 1);
    #Upper := UPPER_BOUND(ARR := #BA_Array, DIM := 1);
    #ArrayMode[1] := #P1_Mode;
    #ArrayMode[2] := #P2_Mode;
    #ArrayMode[3] := #P3_Mode;
    #ArrayMode[4] := #P4_Mode;
    #ArrayMode[5] := #P5_Mode;
    #ArrayMode[6] := -1;
    #IdxModeMax := 6;
    FOR #index := #Lower TO #Upper DO
        fOR #IdxMode := 2 TO #IdxModeMax DO
            IF #BA_Array[#index] = #ArrayMode[#IdxMode - 1] THEN
                #IdxModeMax := #IdxMode;
                Exit;
            END_FOR;
            IF #IdxModeMax = 1 THEN Exit;
        END_FOR;
    #GesamtBetriebsart := #ArrayMode[#IdxModeMax];
END_FUNCTION
Beide Varianten mit Daten-abhängiger AusführungszeitÜberraschung.
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
@Heinileini: "Warum diese "kontraproduktive" Idee? Häufig ist es wichtiger, eine schmale SchwankungsBreite der ZyklusZeit einzuhalten, als regelmässig eine möglichst kurze ZyklusZeit zu erzielen."
Ist es da nicht besser, sowieso alles in einem zeitzyklisch aufgerufenen OB zu machen und den OB1 leer zu lassen? Viele andere SPS-Systeme arbeiten nur zeitzyklisch und haben gar keinen freilaufenden Zyklus wie S7.
 
Ist es da nicht besser, sowieso alles in einem zeitzyklisch aufgerufenen OB zu machen und den OB1 leer zu lassen?
Es ist nicht nur eine Frage der historischen Entwicklung und des Mottos "das war schon immer so", nicht auf einen "freilaufenden Zyklus" zu verzichten. Am Anfang waren die BitBefehle und bedingte SprungBefehle waren den Programmierern nicht geheuer - Schwankungen der ZyklusZeit mussten erst noch erfunden werden. Gut, beim 1. Zyklus wurde eine Überschreitung der ZyklusZeit toleriert, damit zig GrundstellungsRoutinen durchlaufen werden konnten.
Aber dann . . . fingen irgendwann Hochsprachen-basierte "Verrücktheiten" an, die SPS zu infiltrieren, aufzublähen und auch die Zykluszeit ins Schwanken zu bringen. Da waren plötzlich "WeckAlarme" gefragt. Die unterschiedlichen Anforderungen für unterschiedliche Aufgaben sind geblieben. Ob man nun von Tasks oder Threads spricht oder von OB1 und OB-sonstwas . . . und sooo wahnsinnig freilaufend ist der OB1 ja auch nicht - seine Zykluszeit wird überwacht.
Es werden verschiedene Möglichkeiten geboten und welche man wofür benutzt, das ergibt sich aus der Gesamtheit der Anforderungen an eine SPS.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich wurde nicht von den freilaufende Zyklus (OB1) versichten. Das macht keinen Sinn. Wenn man den Beispiel in diesen Thema verwendet, dann kann man nicht ein Program der in OB1 15 ms verwendet, in OB35 übertragen und dann erwarten dass das Program jetzt nur 2 ms braucht.
Ich wurde nur die Zeitkritische Programmteile in ein schnellen Zeit-OB (OB35) packen.
Ich stelle die Frage, selbst wenn man alle mögliche "gesunde" oder "schlaurige" verfahren verwendet, so dass man nicht das Programm unnötig verlangsahmt, wie garantiert man eine gewisse kurze aktualisierungszeit ?
 
@Heinileini:
Die Hochsprachen-basierten "Verrücktheiten" sind m.E. aus den Anforderungen an die SPS-Steuerungen entstanden. Heute hat man halt auch Strings und Array's in einer SPS - bei solchen Sachen dann mit Pointern herumzuwurschteln macht für mich keinen Sinn.
Bedingte Programmbearbeitung (richtig eingesetzt) wäre dann z.B. "ich möchte einen Wert nur speichern oder Berechnen wenn Bedingung x erfüllt ist".
Das alles sind aber für mich keine Dinge für einen Zeit-OB. Hierhinein gehört für mich z.B. "ich möchte alle 20 ms einen Wert einlesen (und speichern)"
Mit der CPU geht es dann weiter. Für ein einfaches und/oder kleines Programm brauch man nicht unbedingt eine schnelle CPU. Bei einem großen umfangreichen Programm ist das dann schon anders. Ganz oft brauchen aber auch manche Abläufe eine schnelle Reaktionszeit. Das Thema haben (und akzeptieren) wir aber auch bei anderen Anwendungen - wenn ich mit meinem Auto einen schweren Anhänger ziehen möchte muss ich mir möglicherweise auch Gedanken über den Antrieb meines Auto's machen ...

Gruß
Larry
 
Ich stelle die Frage, selbst wenn man alle mögliche "gesunde" oder "schlaurige" verfahren verwendet, so dass man nicht das Programm unnötig verlangsahmt, wie garantiert man eine gewisse kurze aktualisierungszeit ?

Zum Thema etwas garantieren und Entscheidungsfindung im Unternehmen.

Ich hatte einmal einen Fall, wo die sicherheitstechnische Bewertung, die von Maschinenbauingenieuren vorgenommen wurde, unter Anderem als Berechnungsgrundlage die Reaktionszeiten der Steuerung beinhaltete (was an sich auch richtig ist). Die verehrten Kollegen Maschbauer haben sich überlegt, daß die mit einer Reaktionszeit (nach SYSTEMA) von 10mS gut fahren würden. Als ich an der Anlage war, habe ich festgestellt, daß die CPU permanent den OB80 und andere Fehler- und Überlauf-OBs aufruft. Auf meine Nachfrage meinte der Inbetriebnehmer, daß dies deswegen so sei, weil das sehr umfangreiche Sicherheitsprogramm in einem Zeit-OB untergebracht ist, welches auf 10mS eingestellt ist, sein Ablauf in diesen 10mS nicht vollendet wird, und deswegen das Ablaufsystem permanent in den OB80 geht.

Auf meine Nachfrage, warum um Jesu Namen das so sein muss, und ob er das bitte in einen adäquaten Zustand bringen könnte, meinte er, die Zykluszeit des Safety-Anteils hätte so die Maschinebauabteilung vorgegeben, und er wird das auf keinen Fall ändern, da dies "sicherheitsrelevante Vorgaben sind", und ihm anderenfalls die Kündigung droht.
 
Zuletzt bearbeitet:
@Draco:
Was hat der denn da alles in seinem Sicherheitsprogramm drin ?
Ich hatte bislang noch keine Anwendung bei der 50 ms unterschritten hätten werden müssen ...

Gruß
Larry

Ich habe Dich nicht verstanden. Was hätte unterschritten werden müssen ?
Das Sicherheitsprogramm war sehr groß und bildetete die Pressensicherheit mit umfangreicher Peripherie ab (etwa an die 25 ET200S Stationen jeweils mit Safety).
 
Ich hatte bislang keinen Bedarf, mein Safety-Prg öfter als im 50ms-Takt aufzurufen zu müssen - deswegen hat mich die Anwendung interessiert ...
Die Tatsache vieler ET-Stationen hat da m.E. auch keinen Einfluß.
Pressen sind natürlich immer so eine Sache für sich - nur ist ja auch so, das selbst wenn dein Safety-Prg einen 10ms-Takt hat es ja nicht heißt, dass z.B. der Hydraulik-Zylinder deshalb auch in 10ms umsteuert ...
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Safety oder nicht, ändert in Prinzip nichts.
Der CPU muss Safety und 'normalen' Zeit-OBs beide bearbeiten können ohne dass es OB1 Zeitüberlauf kommt.
Wenn nicht, dann ist der CPU nicht genug leistungsfähig.
 
@Jesper:
Da hast du natürlich vollkommen Recht ... mich interessierte hier nur der Zusammenhang für die Anforderung.

Larry, wie bereits geschrieben.

Die verehrten Kollegen Maschbauer haben sich überlegt, daß die mit einer Reaktionszeit (nach SYSTEMA) von 10mS gut fahren würden.

Die Maschinenbauer haben invers gerechnet, und sich überlegt, daß sie einen unzureichenden Sicherheitsabstand gegenüber dem Pressenwerkzeug durch schnellere Reaktionszeiten der Steuerung ausgleichen könnten. Davon, daß es neben der Steuerung auch Reaktionszeiten der Peripherie an sich gibt, und man da mindestens mit einem Faktor 2 rechnen muss, haben diese Leute wahrscheinlich nichts gehört. Genau so wenig wie von den Reaktionszeiten der Ventile (dreifach vorgesteuerte Blockventile).

Es ist im Übrigen einer der führenden Pressenhersteller in Deutschland.
 
Leider hat dem Kollegen, der Angst vor der Kündigung hat, keiner gesagt, daß er mit mindestens einem Bein im Knast steht, da das Sicherheitsprogramm gar nicht in 10ms abgearbeitet wird (also die verlangte Voraussetzung nicht erfüllt ist) und er das hätte erkennen, dokumentieren und auf Änderungen bestehen müssen ...
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Also gerade unter TIA würde ich (noch) Schleifen jeglicher Art vermeiden, da selbst die 1500er Reihe bis zur 1517 sehr anfällig darauf reagiert und deine Zykluszeit am Ende irgendwo zwischen 50-70ms liegt (genauso sehr schwankend).. selbst mit Firmware V2.6 haben wir noch etliche Probleme in verschiedenen Projekten..


Diesen Effekt habe ich auch schon erlebt.
Allerdings mit AWL im Projekt. Das werde ich zukünftig vermeiden.

Was ich gerade nicht verstehe, ist wieso Schleifen die Zykluszeit dermaßen hochtreiben?
Was nützt mich das schönste SCL, wenn ich dann alles mit IF Then basteln muss??
 
Was ich gerade nicht verstehe, ist wieso Schleifen die Zykluszeit dermaßen hochtreiben?
Jetzt verstehe ich nicht, was Du nicht verstehst.
Die Befehle, die in der Schleife abgearbeitet werden, werden pro SchleifenDurchkauf abgearbeitet. Zusätzlich die Befehle, die den SchleifenIndex z.B. erhöhen und die Befehle, die nötig sind, zu prüfen, ob weitere Durchläufe erforderlich sind - auch pro Zyklus. All die Ausführungszeiten multipliziert mit der Anzahl SchleifenDurchläufe.
Eine Schleife, die z.B. 10 mal durchlaufen wird, mag die ZyklusZeit nur unmerklich verändern.
Aber z.B. 1000 Durchläufe, also 100mal "unmerklich" kann schon störend viel oder sogar viel zu viel sein.
Schleifen, die abhängig von den durchsuchten Daten vorzeitig abgebrochen werden können, sind nicht gut kalkulierbar, da man nicht voraussehen kann, wie viele Durchläufe stattfinden werden.
Zumal, wenn die gesuchte Information im Array nicht vorhanden ist, muss das Array komplett abgesucht werden, nur um festzustellen, dass die Mühe für die Katz war. U.a. deshalb sei für das Suchen in sortierten Daten unbedingt das "binäre Suchen" empfohlen, bei dem bei jeder Verdopplung der Anzahl ArrayElemente lediglich 1 weiterer SchleifenDurchlauf hinzukommt.
Wenn sich, wie hier im Thread angenommen, das Programm automatisch an die ArrayLänge anpasst (per LOWER_BOUND und UPPER_BOUND), geht auch noch das Gefühl dafür verloren, mit welchen Ausführungszeiten zu rechnen ist.
Derjenige, der's programmiert hat, sollte es wissen, aber derjenige, der's gedankenlos anwendet, ahnt vermutlich nicht einmal, was ihm droht.

Was nützt mich das schönste SCL, wenn ich dann alles mit IF Then basteln muss??
Findest Du ein SCL ohne IF THEN denn noch schöner?
 
Zuletzt bearbeitet:
Das Sicherheitsprogramm war sehr groß und bildetete die Pressensicherheit mit umfangreicher Peripherie ab (etwa an die 25 ET200S Stationen jeweils mit Safety).

Was ist das für eine Presse ???
25 ET200S Stationen ist verdammt viel oder sammeln die jeden DI/DA einzeln mit einer Anschaltung ein ?

Ich hab schon öfters mit den Kollegen was zu tun gehabt
https://wickert-presstech.de
Aber an einer einzelnen Presse noch nie 25 ET Stationen.
 
Zurück
Oben