Binärlogik in SCL / ST

Zuviel Werbung?
-> Hier kostenlos registrieren
// Ausführen
IF tmpBool Then
VarG := TRUE;
ELSE
VarG := FALSE;
END_IF[/CODE]
Hier werden gleich die Ersten wieder schreiben:

Das geht auch so:
Code:
VarG := tmpBool;

Erster ☝️

Ich habe auch schon Folgendes geschrieben:
Code:
tempBool := TRUE
AND tempBool1
AND tempBool2
AND tempBool3
AND tempBool4
AND tempBool5
AND tempBool6
;

Das "TRUE" ist nur ein Platzhalter, damit die Formatierung der Verknüpfungen von Variablen von der ersten Zeile an gleich ist und auskommentiert werden kann. Damit JEDE Variablenzeile einfach auskommentiert werden kann, ist das ";" auch in die nächste Zeile gerutscht.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich habe auch schon Folgendes geschrieben:
Code:
tempBool := TRUE
AND tempBool1
AND tempBool2
AND tempBool3
AND tempBool4
AND tempBool5
AND tempBool6
;
Das hat aber natürlich weniger mit IF..THEN..ELSE zu tun.

Dafür ein Beispiel:

Code:
IF TRUE
    AND tempBool1
    AND tempBool2
    AND tempBool3
THEN
    tempBool := TRUE;
END_IF;

So kann ich in der Bedingung auch jede einzelne Bedingung auskommentieren. Und hinter jede Bedingung (Zeile) noch ein Kommentar schreiben.
 
Was aber auch geht (hat mich ein Kollege drauf gebracht):


INI:
intVal := intVal1 (*Kommentar1*) + intVal2 (*Kommentar2*) + intVal3 (*Kommentar3*);

Das ist nicht immer übersichtlich, aber manchmal ganz praktisch oder hilfreich. Z.B., wenn man Einheiten in einer Berechnung mit angeben will.
 
früher vor 12 Jahren hab ich auch mal sowas gemacht, aber in nem Bibliotheksbaustein:
Code:
// START / STOP Motor (MANUAL) left=======================================
    IF EN_Reverse AND QSTOP AND
       ((NOT QMAN_AUT AND NOT QREMOTE AND MAN_left AND NOT MAN_left_OLD AND NOT QSIM AND NOT QERR)
         OR (OPabCmdPLC[2] AND NOT OP_STOP_L AND NOT QMAN_AUT AND QREMOTE AND NOT QSIM AND NOT QERR))  THEN
        QCMD_left   := TRUE;
        QCMD_right  := FALSE;
        QCMD_on     := FALSE;
    END_IF;  
    IF (NOT QMAN_AUT AND NOT QREMOTE AND NOT MAN_left AND NOT QSIM)
        OR ((OPabCmdPLC[0] OR OP_STOP_L) AND NOT QMAN_AUT AND QREMOTE AND NOT QSIM)
        OR QERR OR NOT EN_Reverse THEN
        QCMD_left := FALSE;
    END_IF;

aber irgendwie ist das Käse...
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Diese Version hat auch den Vorteil, dass sich AWL-Programmierer nahezu nicht umgewöhnen müssen! :ROFLMAO:
Das kommt aber eher aus der Onlinebetrachtung vom TIA, ich finde der Status am Rand ist grausam. Wäre das wie im Codesys Inline würden viele ohne Unterlass alle in eine Zeile Tippen.
Ich persönlich versuche mich das nach den Regularien sauber gegliedert zu editieren.
 
Vielleicht ist mit "höchste Priorität" einfach der niedrigste Zahlenwert gemeint?
In der Tabelle steht die 8 ja über der 10 und damit höher?!?!
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ja, ich meine auch, dass die Prioritäten bei Siemens eine kontraintuitive Reihenfolge haben. Je niedriger der Zahlenwert, desto höher die Priorität.

Auch erkennbar an der Priorität der Zuweisung (11). Wäre ja Quatsch, erst zuzuweisen und dann zu berechnen, welcher Wert sich nun eigentlich ergibt.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ein Logiker würde da allerdings nicht uneingeschränkt zustimmen, dass 2 die 2. höchste Priorität hat : D Wir wissen nur, dass die 1 die höchste Priorität hat! ;P
ein Aussenstehender würde nicht glauben, dass Siemens Geräte für Industrielogiken baut, so wie die Doku mitlerweile aussieht ;)

aber zurück zum Thema ;)
 
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
Für mich ist es ausschlaggebend, wie viele Bits verknüpft werden müssen. Wenn ich einen Code vor 4 Jahren geschrieben habe mit ST oder AWL und vielleicht 40 Bits oder mehr verknüpft werden, dann kommt man sofort ins grübeln unter welchen Umständen das Ergebnis Wahr wird, da kann mir auch niemand etwas anderes erzählen. Also nutze ich für diese FUP. Interessant wird es auch wenn der Code von mehreren Personen gelesen werden oder Erweiterungen daran vorgenommen werden muss. Man kann mit reinen AWL/ST enorme Einsparungen in der Code Menge vornehmen, aber das sollte nicht das Ziel sein, wenn dabei die anderen Mitarbeiter baden gehen.
 
Zurück
Oben