Binärlogik in SCL / ST

roboticBeet

Level-2
Beiträge
451
Reaktionspunkte
187
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo zusammen,

ich möchte kein (neues) Thema aufmachen, weshalb man binäre Logik in SCL / ST umsetzt, anstatt einfach FUP/KOP zu nutzen. Die grundsätzlichen Vor- und Nachteile sollten bekannt sein. Mein Eindruck ist aber, dass reines SCL / ST, auch für binäre Logik, immer häufiger eingesetzt wird - zuletzt hatte ich das bspw. hier (@Ralle) gelesen. Auch wir setzen, v. a. in unserem Bibliotheken, mittlerweile ausschließlich SCL / ST ein.

Falls ihr SCL / ST für binäre Logik einsetzt: Wie formatiert ihr die Statements, damit diese halbwegs lesbar bleiben?

Aktuell würde bei uns ein IF-Statement, welches etwas komplexer ist als nur mehrere UND-Verknüpfungen, folgendermaßen aussehen:
Code:
IF( ManchesterCoded               )    AND
  ( _cycleTimeOK                  )    AND
  ( ( _fbDiagSignal_RTrig.Q ) OR
    ( _fbDiagSignal_FTrig.Q )     )
THEN
[...]

Leider finde ich auf die Schnelle kein komplexeres Beispiel. Aber man könnte sich ja sowas denken:
Code:
IF(         MyBool1           ) AND
  (         MyBool2           ) AND
  ( (       MyBool3      ) OR
    (       MyBool4      ) OR
    (       MyBool5      )    ) AND
  ( (       MyBool6      ) OR
    (       MyBool7      ) OR
    ( (     MyBool8 ) OR
      (     MyBool9 )    )    ) AND
  (     NOT MyBoolA           ) AND
  (         MyInt = 5         )
THEN
 
Zuletzt bearbeitet:
Code:
Ergebnis := (    Bit_1
                 AND Bit_2
            )
            OR Bit_3;
 
Ergebnis 2 :=    (    (    Bit_1
                           AND Bit_2
                      )
                      OR
                      (    Bit_3
                           AND BIT_4
                      )
                 )
                 AND Bit_5;

Ich mach das in etwas so, je nachdem wie viel Code das ist.
Ich hab allerdings schon einige Varianten gesehen, jeder hat so seine Vorlieben.
Ich setze lieber eine Klammer mehr, als eine zu wenig, das macht es meißt übersichtlicher und man muß nicht nachdenken, welches UND oder welches ODER nun Vorrang hat.

PS: Die Formatierung hier in der Foren-Software ist leider Sch...
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Wenn die IF-Verzweigungen zu unübersichtlich werden, gliedere ich Teile davon in temporäre Variablen aus.

Das mache ich übrigens auch bei FUP-Netzwerken.

Das dann nicht jede einzelne Sicherung abgefragt wird, sondern vorher ein Bool tempAllFusesOK gebildet wird. So als ganz kurzes Beispiel
 
Indem ich gar kein if benutze.

A:= B OR C

Was soll das bringen?Du liest ja auch von links nach rechts.

Naja zwischen einer Zuweisung ( A:= B OR C) und einem IF-Block gibt es durchaus noch ein paar mehr Unterschiede und Anwendungsfälle. Ein IF-Block heißt ja nicht unbedingt, dass ich eine Zuweisung im Stil von
Code:
IF( B OR C )
THEN
    A := TRUE;
ELSE
    A := FALSE;
END_IF
machen möchte. Das wäre tatsächlich eher unglücklich.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Und wie tust du in SCL einen Zustand speichern bzw. setzen und rücksetzen?
Back to the roots: A:= (B OR A) AND NOT C (mit Klammer = SR, ohne Klammer = RS),
aber ich verstehe natürlich, worauf Du hinaus wolltest.

Es gibt mehr als genug Anwendungen, wo man um ein IF nicht vernünftig (Alex läßt grüßen) drum herum kommt.
Und um das IF (oder nicht IF) an sich geht's dem TE ja auch nicht.
 
Wenn es im rein Binär geht ist FUP sicher übersichtlicher, aber wenn man damit Bildschirmgrenzen sprengt ist halt ST kompakter. In Codesys kannst du ja auch in PRG und FB mischen, zumindest über den Trick der Aktion.
Über die Lesbarkeit für Servicepersonal brauchen wir nicht zu diskutieren, wie ich denke. Aber auch da wird ST immer besser aufgenommen.
Zumal in Codesys SR/RS auch in ST verfügbar ist @hucki und @Onkel Dagobert , sollte aber nichts neues sein.
 
Über die Lesbarkeit für Servicepersonal brauchen wir nicht zu diskutieren, wie ich denke.
Geht ja auch um Lesbarkeit und Beobachtbarkeit für den Programmierer/Inbetriebnehmer.

"Warum läuft die Pumpe jetzt grad nicht?"...

"Kannst die Verriegelung mit dem Druckschalter mal schnell testweise rausnehmen?"

"Ahh, OK, Pumpe läuft jetzt, aber Druckschalter hat ne Macke, kannst wieder reinnehmen"

Ich würd jetzt nicht sagen, dass KOP/FUP immer das Allerheilmittel ist...
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Code:
Ergebnis :=    ( 
                   Bit_1
               AND Bit_2
               )
            OR Bit_3;
 
Ergebnis 2 :=     ( 
                      (   
                          Bit_1
                      AND Bit_2
                      )
                      OR
                      ( 
                          Bit_3
                      AND Bit_4
                      )
                   )
               AND Bit_5;

das kannst drehn wie Du willst, schön wird das nicht...

Code:
Ergebnis :=   
(
    Bit_1
AND Bit_2
)
OR Bit_3;


Ergebnis 2 :=     
(
(   
    Bit_1
AND Bit_2
)
OR
(
    Bit_3
AND Bit_4
)
)
AND Bit_5;

auch nicht viel besser...
 
Danke schonmal für all eure Antworten. Natürlich wird die Lesbarkeit von etwas komplexeren binären Ausdrücken nie vergleichbar sein mit FUP/KOP. Das geht gar nicht. Das ist in AWL auch nicht schön, in meinen Augen eher schlimmer. Wenn in gewissen Fällen aber SCL / ST gesetzt ist, sollte man sich im Rahmen der Möglichkeit imho schon Gedanken machen, die Lesbarkeit immerhin möglichst gut zu optimieren.

In meinem obigen Beispiel geht es vor allem darum, die Hierarchie der einzelnen binären Vergleicher durch Klammern und Einrückungen gut darzustellen. Aber ich stimme Ducati zu, dass das die Lesbarkeit leidet, wenn die Schlüsselworte AND, OR, XOR, ... rechts stehen. Übertragen auf mein Beispiel oben folgt dann ja:
Code:
IF     ( MyBool1                   )
   AND ( MyBool2                   )
   AND (    (       MyBool3      )
         OR (       MyBool4      )
         OR (       MyBool5      ) )
   AND (    (       MyBool6      )
         OR (       MyBool7      )
         OR (    (     MyBool8 )
              OR (     MyBool9 ) ) )
   AND ( NOT MyBoolA               )
   AND ( MyInt = 5                 )
THEN

Das finde ich schonmal besser.
 
Danke schonmal für all eure Antworten. Natürlich wird die Lesbarkeit von etwas komplexeren binären Ausdrücken nie vergleichbar sein mit FUP/KOP. Das geht gar nicht. Das ist in AWL auch nicht schön, in meinen Augen eher schlimmer. Wenn in gewissen Fällen aber SCL / ST gesetzt ist, sollte man sich im Rahmen der Möglichkeit imho schon Gedanken machen, die Lesbarkeit immerhin möglichst gut zu optimieren.

In meinem obigen Beispiel geht es vor allem darum, die Hierarchie der einzelnen binären Vergleicher durch Klammern und Einrückungen gut darzustellen. Aber ich stimme Ducati zu, dass das die Lesbarkeit leidet, wenn die Schlüsselworte AND, OR, XOR, ... rechts stehen. Übertragen auf mein Beispiel oben folgt dann ja:
Code:
IF     ( MyBool1                   )
   AND ( MyBool2                   )
   AND (    (       MyBool3      )
         OR (       MyBool4      )
         OR (       MyBool5      ) )
   AND (    (       MyBool6      )
         OR (       MyBool7      )
         OR (    (     MyBool8 )
              OR (     MyBool9 ) ) )
   AND ( NOT MyBoolA               )
   AND ( MyInt = 5                 )
THEN

Das finde ich schonmal besser.
Es geht halt erstens um Lesbarkeit, zweitens um Beobachtbarkeit und drittens einzelne Abfragen/Zeilen auskommentieren zu können...

Deine 13 Variablen sind aber schon das Maximum würd ich sagen, wenns mehr werden, würd ich Zwischenvariablen einführen... ausser wenns ohne Klammern ist, dann gehn vielleicht auch mehr...
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Guter Punkt auch mit dem Auskommentieren einzelner Zeilen für IBN / Fehlersuche. Das geht auch nur mit den Schlüsselworten vorne. Hinsichtlich der Zwischenvariablen bei zu komplexen Verknüpfungen ist es ja das gleiche, wie bei FUP/KOP Netzwerken auch. Wenn es nicht mehr sauber mit Kommentar auf eine Bildschirmseite passt, ist es deutlich zu groß.
 
Ich habe das mal so ähnlich gelöst, da
konnte man dann im Status sehen wie weit,
die Verknüpfung erfüllt waren.

Code:
// Kommentar für erste Verknüpfung
tmpBool := VarA
    AND       VarB
    AND       VarC;
    
// Kommentar für zweite Verknüpfung
tmpBool := tmpBool
    OR       VarD;

// Kommentar für dritte Verknüpfung
tmpBool := tmpBool
    AND       VarE >= VarF;

// Ausführen
IF tmpBool Then
    VarG := TRUE;
ELSE
    VarG := FALSE;
END_IF
 
Ich habe das mal so ähnlich gelöst, da
konnte man dann im Status sehen wie weit,
die Verknüpfung erfüllt waren.

Code:
// Kommentar für erste Verknüpfung
tmpBool := VarA
    AND       VarB
    AND       VarC;
  
// Kommentar für zweite Verknüpfung
tmpBool := tmpBool
    OR       VarD;

// Kommentar für dritte Verknüpfung
tmpBool := tmpBool
    AND       VarE >= VarF;

// Ausführen
IF tmpBool Then
    VarG := TRUE;
ELSE
    VarG := FALSE;
END_IF
Juhu, die Schmiermerker sind zurück ;)

Würd ich auch so ähnlich machen. Nur das IF THEN ELSE bei Aüsführen nicht ;)
 
Zuletzt bearbeitet:
Zurück
Oben