TIA TIA Compiler

Zuviel Werbung?
-> Hier kostenlos registrieren
Die Frage ist ja auch,
Probiere es doch einmal aus.

Schreibe den Code so in Step7 Classic in SCL, lade den Code in eine 300ér Steuerung und lade den Code dann zurück in ein leeres Projekt ( ohne die SCL Quellen ) oder öffne die Bausteine online. Dann siehst du, was der Compiler aus dem SCL Code so generiert.
 
Die Frage ist ja auch, ob der Compiler bei einem "unmöglichen UND" dann wenigstens noch die Zuweisung durchführt.

Grade in alten Anlagen (S7-Klassik) sehe ich es permanent, dass zu Beginn von OB1 dann (sinngemäß) steht:
M0.0 := M0.0 AND NOT M0.0
M0.1 := NOT M0.0
Das sind dann die "feste Null" und "feste Eins".
Ich erwarte von einem Compiler, dass das Programm, das er erzeugt, das korrekte Ergebnis zuweist.
D.h. eine oder mehrere erfolgte Änderungen/"Optimierungen" dürfen das Ergebnis nicht verfälschen.
Mir ist es recht, wenn er z.B. x1 UND x2 UND x3 stur und ausführlich berechnet.
Falls er stattdessen prüft, ob mindestens 1 der Variablen FALSE ist und das Ergebnis somit auch, dann sollte man sich überlegen, ob dieser Umweg überhaupt einen Vorteil in der AusführungsZeit bringen kann und welche Nachteile man dafür z.B. beim Beobachten des Status oder im Umfang des Code hinnehmen muss. Nötig sind evtl. Optimierungen nicht.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich habe mal einen kleinen Test mit PLCSIM gemacht.

Folgender Code führt zu einem CPU-Stop, wenn der Index außerhalb des Array-Bereichs (0 - 9) ist:
Code:
IF ("TestDaten_DB".Index >= 0) AND ("TestDaten_DB".Index <= 9) AND ("TestDaten_DB".Daten["TestDaten_DB".Index] > 0) THEN
    ;
END_IF;

Bei folgendem Code aber nicht: (Das FALSE kann auch am Ende stehen, macht keinen Unterschied im Verhalten)
Code:
IF FALSE AND ("TestDaten_DB".Index >= 0) AND ("TestDaten_DB".Index <= 9) AND ("TestDaten_DB".Daten["TestDaten_DB".Index] > 0) THEN
    ;
END_IF;

Es scheint also das bei Variablen zur Laufzeit keine Optimierung / Abbruch der Auswertung erfolgt.
Bei Konstanten wird aber anscheinend der Rest nicht ausgewertet...
 
Bei folgendem Code aber nicht: (Das FALSE kann auch am Ende stehen, macht keinen Unterschied im Verhalten)
Code:
IF FALSE AND ("TestDaten_DB".Index >= 0) AND ("TestDaten_DB".Index <= 9) AND ("TestDaten_DB".Daten["TestDaten_DB".Index] > 0) THEN
    ;
END_IF;

Es scheint also das bei Variablen zur Laufzeit keine Optimierung / Abbruch der Auswertung erfolgt.
Bei Konstanten wird aber anscheinend der Rest nicht ausgewertet...
Was wird dir eigentlich in der Online-Spalte angezeigt, wenn du diesen Code beobachtest?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Normal wäre ja eigentlich CPU-Stop, wenn der Array Zugriff außerhalb des Bereichs ist, wie du sagst.
Es ist interessant dass der Code zum einen so kompiliert wird, dass er anscheinend gar nicht erst komplett ausgeführt wird bzw. die Argumente gar nicht erst berechnet werden, aber zum anderen, der Code in der Online-Ansicht doch wieder komplett vorhanden sein muss. Oder es basiert bei SCL die Online-Anzeige lediglich auf dem unkompilierten Code.
Wenn bei SCL solche Optimierungen vorliegen wie in deinem Beispiel gezeigt, müsste dann die Kompilierung von SCL nicht in etwas anderes gewandelt werden als MC07 Code, wenn bei AWL zum Beispiel solche Optimierungen nicht stattfinden?
 
Zuletzt bearbeitet:
Zurück
Oben