TIA Wie lässt sich eine If Else Anweisung in FUP realisieren?

Dazai

Level-1
Beiträge
30
Reaktionspunkte
1
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo zusammen,

wie kann man so eine einfache If Else Funktion in FUP realisieren? Ich habe das Gefühl, dass ich gerade eine Grundlage der Sprache übersehe...

Edit: Mir fällt gerade auf, dass man die Vergleichsfunktion einfach mit einem Punkt FALSE setzen kann...

1658507532775.png
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Dein Analogeingang gibt bestimmt einen Int Wert aus. Den rechnest Du um Auf 8 V. ZB. 20000. Dann nimmst Du den Vergleicher CMP >= und die Zuweisungsbox =.
Edit: Bei Siemens Karten die 0- 27648 ausgeben ist es 22118.
 
Zuletzt bearbeitet:
wie kann man so eine einfache If Else Funktion in FUP realisieren? Ich habe das Gefühl, dass ich gerade eine Grundlage der Sprache übersehe...
Wo siehst Du bei der Aufgabe ein IF/ELSE ??? :unsure:

Wo siehst Du da ein "SR-RS Glied" ??? :unsure:

Irgendwie denkt ihr beide viel zu umständlich oder seht die Grundlagen der SPS nicht...

Code:
SCL:

GR_loc := Y_loc >= 22118 ;


FUP:
       +-------+
       |  >=   |
       |  INT  |       GR_loc
Y_loc--|IN1    |      +-----+
22118--|IN2    |------|  =  |
       +-------+      +-----+

Falls man in FUP wirklich mal ein ELSE braucht, dann kann man das "VKE invertieren" mit einem kleinen Kreis/Punkt.

Harald
 
Zuviel Werbung?
-> Hier kostenlos registrieren
:unsure:
"If Else" ist doch meist in SCL/ST schon nervig genug, da braucht man dass doch nicht noch 1:1 in FUP/KOP.
Und das nur, weil man keine Logik beherrscht.
😜

:ROFLMAO:
Wie oben geschrieben, ist SR/RS fast mit einem If/Else vergleichbar. Mit dem Nachteil, dass SR/RS nicht threadsafe ist, d.h. die Variable darf nicht in einem anderen Interrupt (OB, Thread) oder bei den Siemens 1200/1500 in einem HMI verwendet werden, da dort auch der Zwischenzustand verwendet werden könnte.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
@PN/DP Müsste das bei SCL nicht so aussehen?

Code:
IF Y_loc >= 22118 THEN
GR_loc := TRUE;
ELSE
GR_loc := FALSE;
END IF;

Aber ich glaube dein Code impliziert schon das gleiche Ergebnis
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Aber ich glaube dein Code impliziert schon das gleiche Ergebnis
Schau Dir mal die folgenden Variationen zu dem Thema an, wo Dein Lösungsweg Schritt für Schritt zunächst "verkompliziert", aber danach vereinfacht wird:
Code:
// Variation 1 (mit abschliessendem END_IF ergänzt)

IF Y_loc >= 22118 THEN
    GR_loc := TRUE ;
ELSE
    GR_loc := FALSE ;
END_IF ;


// Variation 2 (Einführung der zusätzlichen/"überflüssigen" tempVarBool)

tempVarBool := Y_loc >= 22118 ;
IF tempVarBool THEN
    GR_loc := TRUE ;
ELSE
    GR_loc := FALSE ;
END_IF ;


// Variation3 (Eliminierung der überflüssigen IF-ELSE-Konstruktion)

tempVarBool := Y_loc >= 22118 ;
GR_loc := tempVarBool ;


// Variante 4 (Eliminierung der überflüssigen tempVarBool)

GR_loc := Y_loc >= 22118 ;
Glaubst Du noch oder verstehst und weisst danach schon, dass die direkte Zuweisung des VergleichsErgebnisses keine Zauberei ist, sondern genauso funktioniert, wie Du es beabsichtigst?

Der Einwand von Thomas wäre ein weiterer Grund, keine unnötigen Umwege einzubauen.
 
GR_loc := Y_loc >= 22118 ;

Glaubst Du noch oder verstehst und weisst danach schon, dass die direkte Zuweisung des VergleichsErgebnisses keine Zauberei ist, sondern genauso funktioniert, wie Du es beabsichtigst?
Da die Zeile zyklisch abgefragt wird, wechselt GR_loc automatisch auf true/false, wenn sich die Abfrage (Y_loc >= 22118) ändert.
Wobei der Wert 22118 nicht in Stein gemeißelt ist. Bei Beckhoff EL3072 entsprechen 8.0 V 24414 DIGITs.
 
Zuletzt bearbeitet:
:unsure:
"If Else" ist doch meist in SCL/ST schon nervig genug, ...
Und das nur, weil man keine Logik beherrscht.
Tja, Mario, so ganz ohne Beherrschung der Logik geht es leider auch in der IF-ELSE-Variante nicht.
Ich fürchte es scheitert eher daran, dass man - warum auch immer - davor zurückschreckt, das ZwischenErgebnis des Vergleichs, das ja nunmal vom Typ BOOL ist, direkt einer Variablen vom Typ BOOL zuzuweisen.
Aus eigener (lange zurückliegender) Erfahrung mit ProgrammierKursen in "HochSprachen" weiss ich, dass diese Möglichkeit allzu oft einfach totgeschwiegen wird.
Ich vermute/befürchte, dass sich seither daran nicht allzu viel geändert hat. Das Stichwort könnte dabei "Vererbung" sein oder auf Englisch gesagt "old habits die hard". Eingefahrene Wege werden leider oft recht gedankenlos (grundlos) beibehalten.

da braucht man dass doch nicht noch 1:1 in FUP/KOP.
Zurück zum Thema dieses Threads "IF-ELSE-in-FUP":
Wenn man's denn doch mal wirklich braucht, gibt's dafür doch die tollen EN-Eingänge sooo vieler "Kästchen" in FUP (oder auch in KOP)!
Damit kann gesteuert werden, ob ein "Kästchen" ausgeführt werden soll oder nicht, eine bedingte Ausführung also.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Jaaa...
SCL verleitet den Nachwuchsprogrammierer geradezu zu IF THEN ELSE Orgien...

Ich hab halt in der Schule noch Logikgatter und boolsche Algebra und Relaisschaltungen gelernt, bevor es an die höheren Programmiersprachen ging...

Wie baut man IF THEN ELSE eigentlich mit Relais 🤔
 
Wie baut man IF THEN ELSE eigentlich mit Relais 🤔
Man nehme 1 Relais mit
- entweder 1 WechslerKontakt
- oder je 1 Schliesser und 1 Öffner
Dann verdrahte man die Bedingung auf die RelaisSpule (FreilaufDiode nicht vergessen, damit die Bedingung nicht kaputt geht! ;) ).
Der THEN-Zweig wird am SchliesserKontakt angeschlossen,
der ELSE-Zweig am ÖffnerKontakt. (Kann ich mir das Aufmalen sparen?)
 
So vielleicht 🤔
20220723_144321-jpg.62463
 

Anhänge

  • 20220723_144321.jpg
    20220723_144321.jpg
    977,5 KB · Aufrufe: 161
Zurück
Oben