TIA Vergleiche in SCL

NerdySPS

Level-2
Beiträge
6
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo zusammen

Ich habe mehrere Integer-Werte, welche ich auf einen Grenzwert prüfen möchte. Wenn einer der Integer-Werte den festgelegten Grenzwert überschreitet, soll ein Boolean geschalten werden. Wenn die Integer-Werte einzeln geprüft werden, funktioniert dies auch. Jedoch wollte ich den Grenzwert im Code nur einmal schreiben. Das funktioniert aber nicht so wie erwartet. In den angehängten Screenshots habe ich ein Beispiel gemacht.

Wenn Integer[0] oder Integer[1] grösser als 360 ist, soll Bool[2] schalten. Wie man im zweiten Screenshot sieht, schaltet Bool[2], wenn die Summe von Integer[0] + [1] grösser als 360 sein wird. Wieso und wie kann es umschreiben, dass es funktioniert und im Code nur einmal 360 vorkommt?

PS: Ich weiss, das man auch mit Konstanten arbeiten kann, aber auch dadurch wird der Code nicht kürzer.

Danke schon Mal für eure Antworten.

Gruss AAR
 

Anhänge

  • SCL_IntVergleich_1.png
    SCL_IntVergleich_1.png
    53,7 KB · Aufrufe: 120
  • SCL_IntVergleich_2_notCorrect.png
    SCL_IntVergleich_2_notCorrect.png
    56,4 KB · Aufrufe: 117
Zuviel Werbung?
-> Hier kostenlos registrieren
Was ist jetzt daran so schlimm, wenn mehrmals auf 360 verglichen wird? Das lässt sich nicht sinnvoll abkürzen. Höchstens umständlicher und unverständlicher. Man könnte z.B. erst alle Variablen untereinander vergleichen und nur den größten Wert mit 360 ...
 
Dein Code sieht nicht schön aus - ich versuche es mal mit eigenen Variablen (da du deinen Code ja nur als Screenshot gepostet hast) :
Code:
myBool := (Var_1 > 360) or (Var_2 > 360) or ...
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Eine weitere Möglichkeit wäre es per Schleife mit Index durch dein Array of Int durch zu gehen und den Status in einem Temp Bool abzulegen, um diesen dann nach der Schleife auf deinen richtigen Bool zuzuweisen. Vorteil wäre das du dein Array of Int leicht erweitern kannst ohne große Änderungen an der Überprüfung.
 
Man kann es drehen und wenden und formulieren wie man will, man braucht immer mindestens 3 Vergleiche. Bei der MAX-Ermitlung wird nur verschleiert, daß das eigentliche Ziel ist, jeden Wert auf Grenzwertüberschreitung zu prüfen. Und die Variante ist schlecht in eine Funktion zu implementieren, die man für jede Variable aufruft, egal um wieviele Variablen es geht.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Danke für eure Antworten. Wie ihr im 2. Screenshot sieht, schaltet der Boolean TRUE, wenn die Summe >360 ist. Ich hätte dieses Verhalten nicht erwarten, aber das ist nebensächlich.

@Larry Laffer: Das war dann auch meine Lösung. Mich hat es nur interessiert, ob es auch anders geht. Scheint aber die einzige Lösung zu sein. Der Hintergrund ist, das wir sehr lange Variablenamen haben, da eher grösseres Projekt - sprich auch viele Struct in Struct usw. So wollte ich halt diese Zeile etwas kürzen.
Den Hinweis von @Cal_TDI mit Array und For-Schleife behalte ich Mal im Hinterkopf. Danke.

@NBerger Man muss nicht antworten, damit man geantwortet hat.
 
Wie ihr im 2. Screenshot sieht, schaltet der Boolean TRUE, wenn die Summe >360 ist. Ich hätte dieses Verhalten nicht erwarten, aber das ist nebensächlich.
Deine Interpretation ist falsch. Im Code wird ja auch gar keine Summe gebildet, sondern die 16-Bit-Bitmuster der 3 Integer werden bitweise ver-odert. Das hätte man ganz leicht testen können: Wenn alle 3 Werte = 360 sind, dann ist die Summe 1080, und trotzdem wird das Ergebnis FALSE. Noch viel lernen du musst junger Padawan ;)

Nur wenn bei einem der 3 Werte mindestens ein Bit = 1 ist, welches beim Wert 360 dez = 0 ist, dann kann das Ergebnis > 360 werden :cool:
Beispiel: 360 dez = 16#168 = 2#0001_0110_1000 <--- wenn irgendeines der roten 0-Bits 1 wird, dann wird der Wert > 360 dez

Deshalb soll man bei Ganzzahlen (INT) auch nicht mit den Bitmustern spielen, wenn man nicht gaaanz genau weiß was man tut ... In der IEC ist sowas auch nicht erlaubt, nur bei Siemens, weil die wollen die unsauber programmierenden Leute nicht zu sauberem Code zwingen ...
 
Zurück
Oben