Short-Circuiting in CoDeSys

aspro86

Level-1
Beiträge
2
Reaktionspunkte
0
Hallo,
ich bin relativ neu in der SPS-Programmierung und habe mich allerdings (auch dank dieses Forums :)) schon relativ gut eingearbeitet, hätte aber nun eine Detailfrage, auf die ich bisher keine Antwort gefunden habe.
Bei der Auswertung von IF Ausdrücken kenne ich es aus C(++) so, dass bei mehreren boolschen Ausdrücken diese nur so lange ausgewertet werden, bis das Endresultat klar ist.
Also beispielsweise IF a AND b THEN ...
Wenn nun a = FALSE dann ist b egal und braucht demnach auch nicht ausgewertet.
In C(++) wird es vom Standard garantiert, dass in dem Fall das zweite Argument nicht ausgewertet wird, genannt Short-Curcuiting.
Wie ist es in CoDeSys?

Viele Grüße und danke im Voraus!
 
Das gibt es in Codesys auch, zumindest "bei Verwendung von 68xxx-Generatoren in FUP" für die Operationen AND und OR. Und auch bei SEL und MUX gibt es "Abkürzungen wg. Optimierung". Ob solche Optimierungen auch in ST angewendet werden ist m.W. nicht dokumentiert. Man könnte es vermutlich testen, indem man Operanden durch Ausdrücke mit einer Function bildet und in der Function zählt wie oft sie aufgerufen wurde.

Harald
 
Ich habe mir das mal bei TwinCAT 2 angesehen, dort wird das zumindest bei x86 nicht gemacht. Ich glaube ich hatte mal ein paar entsprechende Assemblate hier im Forum geposted.
Ich vermute mal, dass es aufgrund der Debuggingmöglichkeiten, d.h. Zustand online beobachten, generell nicht gemacht wird.
Aber wenn es nicht dokumentiert ist, dann würde ich mich weder auf das eine noch auf das andere Verlassen. Der Einsatzzweck den es bei C-Programmen gibt wie erst Variable auf != Null prüfen wenn nicht Null damit eine Funktion aufrufen, ist bei der SPS-Programmierung aber auch eher selten.
 
In der IEC-Norm steht noch etwas dazu, aber nur "may be"
Boolean expressions may be evaluated only to the extent necessary to determine the resultant
value. For instance, if A<=B, then only the expression (A>B) would be evaluated to determine that
the value of the expression
(A>B) & (C<D)
is Boolean zero.
 
Danke für die schnellen Antworten.
Die Tendenz geht anscheinend eher in die Richtung, dass es nicht gemacht wird, zumal es anscheinend in CoDeSys 3 spezielle Operatoren dafür gibt. Zumindest kann ich mich nicht drauf verlassen. Alles klar.
 
Also wenn ich die Dokumentation von Beckhoff (https://infosys.beckhoff.de/content/1031/tc3_plc_intro/2528923787.html?id=4733090955820432857) richtig verstehe (und das ist am frühen Morgen vielleicht nicht unbedingt sicher), dann läuft das folgendermaßen:


  • AND, OR: keine Kurzauswertung, kann auf BOOL/BIT und auf INT/WORD/wasauchimmer (bitweise) angewendet werden
  • AND_THEN, OR_ELSE: Kurzauswertung, kann nur auf BOOL/BIT angewendet werden


ob das bei den verschiedenen Codesys-Derivaten anders ist, müßte man aber konkret mal nachschauen.

Ich find aber, das ist eine echt wichtige Spracheigenschaft, die man beim Programmieren durchaus im Hinterkopf haben sollte.
 
...sollte aufpassen, dass er nicht mit denen zusammenstösst, die eher gehen ...
Das wurde schon mal in irgendeiner Behörde untersucht, weil man glaubte, deswegen die Flure verbreitern zu müssen.
Aber dann gab's eine Entwarnung, weil die Leute, die später kamen, dieselben waren, die früher gingen. ;o)

Schönes, laaanges Wochenende wünscht Heinileini
 
Zurück
Oben