Step 7 Wert einer booleschen Variablen abfragen

Earny

Level-1
Beiträge
422
Reaktionspunkte
38
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich will den Wert der booleschen Variablen M3.0 und M3.1 in SCL abfragen und in Abhängigkeit davon den A5.0 schalten:

Ich würde folgendermaßen programmieren:

IF M3.0=True Then A5.0:=True; End_IF;
IF M3.1=True Then A5.0:=False; End_If;

Das hat bisher immer funktioniert.

______________________________

Jetzt zeigt mir ein Kollege seine Varianten und sagt, dass müsste auch gehen:

IF M3.0=1 Then A5.0:=True; End_IF;
IF M3.1=1 Then A5.0:=False; End_If;

Und dann soll die folgende Variante auch noch richtig sein:

IF M3.0=1 Then A5.0:=1; End_IF;
IF M3.1=1 Then A5.0:=0; End_If;

Der Kompiler erkennt keine Syntaxfehler. Aber das ja nicht viel zu sagen.

Frage: Arbeiten die beiden letzten Varianten auch immer richtig?
 
True und False sind vordefinierte Konstanten, mit den Werten 1 und 0. Allerdings sind die Konstanten vom Datentyp BOOL, entsprechen also genaugenommen den Konstanten BOOL#1 und BOOL#0. Darum ist eine Anweisung wie
intVar := TRUE + TRUE;
aufgrund der nicht kompatiblen Datentypen nicht erlaubt.

intVar := BOOL_TO_INT(TRUE) + BOOL_TO_INT(TRUE);
hingegen schon.

Von der Funktion her sind deine Varianten identisch, aber dort wird eine implizite Typkonvertierung von INT nach BOOL vorgenommen, die zumindest nach SCL-Sprachbeschreibung von Step7 eigentlich nicht erlaubt wäre, aber wohl doch funktioniert.
Ich ziehe die Schreibweise mit True/False vor, bzw. lasse ich die Konstanten bei einer Bedingung ganz weg wenn es besser passt.
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Bei boolschen Variablen muß man nicht mit = vergleichen.

Code:
IF  M3.0 Then A5.0:=True; End_IF;
IF  M3.1 Then A5.0:=False; End_If;

bzw. die Negation

IF NOT M3.0 Then usw.

Sonst müßte man ja bei einem Integervergleich folgendes schreiben.

Code:
IF (MW10 = 1) = true then ...

War zwar nicht die Frage aber ich wollte es mal loswerden.
 
Wenn man nicht genau weiß wie True und False definiert sind, dann kann man sich auch um die Angabe drücken, indem man den Compiler den wahr/falsch-Wert selber einsetzen läßt: :cool:
Code:
IF M3.0 = 0 = 0 Then A5.0 := 0 = 0; End_If;
IF M3.1 = 0 = 0 Then A5.0 := 0 = 1; End_If;


Die True/False-Konstanten und -Vergleiche kann man sich auch komplett sparen, wenn man statt dem IF-Gewurstel einfach so schreibt:
Code:
A5.0 := (A5.0 OR M3.0) AND NOT M3.1 ;

Harald
 
Besten Dank für eure Tipps.
Ich nehme dann mal zur Kenntnis, dass alle meine drei Varianten immer richtig arbeiten und dass noch viele andere Lösungen existieren.
 
Zurück
Oben