Programmierproblem: Logische Verknüpfung

Klimamensch

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

ich bin leider nicht so versiert im Programmieren und stehe derzeit vor folgendem Problem:

Ich habe mit CoDeSys folgendes Programm geschrieben:

IF EIN1 THEN
y1:= 100;
ELSE EIN1:= FALSE;
END_IF

Dieser Programmblock steht im Ablaufplan an letzter Stelle. DAVOR werden aber Werte für y1 berechnet, die - wenn EIN1 "aus" ist - auch für y1 verwendet werden sollen. Bei mir passiert aber folgendes: Wenn EIN1 "an" geschaltet wird, wird 100 in y1 geschrieben. Das ist auch gut so. Wenn jetzt aber "EIN1" "aus" geht, wird trotzdem nach wie vor 100 in y1 geschrieben und der Wert der zuvor in die Variable geschrieben wurde, wird überschrieben, weil ja mein Programmblock oben im Ablaufplan am Ende steht.

Ich bräuchte folgendes:

Wenn EIN1 "False" dann bitte den kompletten Programmblock ignorieren und NICHTS (auch keine 0) in die Variable schreiben. Einfach ignorieren. Entweder könnte das direkt im Programmblock passieren (ich weiß aber nicht wie) oder aber ich brauche einen weiteren logischen Operator, der wie folgt aufgebaut sein müsste:

Eingang:
EIN1
y1
y1*
Ausgang
y1**

Wenn EIN1 "TRUE", dann y1**=y1.
Wenn EIN1 "False", dann y1**=y1*.

Mir erscheint diese Logik so grundlegend, dass es in CoDeSys einen solchen Block vorgefertigt geben muss. Gibt es dafür aus den "Informatikwissenschaften" einen speziellen Ausdruck?
Es wäre schön, wenn ihr mir für beide Lösungsansätze eine Lösung geben könntet.

Vielen Dank im Voraus
 
Also dein Programmblock macht genau, was er soll, wenn Ein1 True ist, dann wird 100 in y1 geschrieben, ansonsten wird das nicht getan, da es dann nicht abgearbeitet wird. Das weiterhin eine 100 in y1 steht liegt eher daran, dass entweder im Programmcode davor keine Anweisungszeile mit y1 := ... abgearbeitet wird oder noch an anderer Stelle eine 100 in y1 geschrieben wird.

PS: Das "Ein1 := False" kannst du dir sparen, da ohnehin dieser Programmteil nur abgearbeitet wird, wenn Ein1 False ist.
Wo wird denn sonst noch Ein1 False gesetzt in deinem Programm?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Das weiterhin eine 100 in y1 steht liegt eher daran, dass entweder im Programmcode davor keine Anweisungszeile mit y1 := ... abgearbeitet wird
Ja, daran liegt es. Die Variable y1 gilt nur für diesen einen Programmblock und wird dann in eine weitere Variable geschrieben, welche dann aber tatsächlich im Gesamtprogramm mehrfach verwendet wird. Es ist aber dennoch so wie beschrieben: Geht EIN1 auf FALSE steht immer noch die 100 von y1 an, welche dann in die nächste Variable geschrieben wird.
Sobald EIN1 auf "aus" geht brauche ich aber den Wert aus der Berechnung ZUVOR. Folgende Lösung würde funktionieren:

y1 wird zu einer globalen Variable, die auch in dem Berechnungsteil verwendet wird, der im Ablauf vor meinem o.g. Programm liegt.

Aber geht das nicht noch einfacher mit einer Zeile in dem Programmblock?
 
Hi,

einfach eine LOKALE Variable (z.B. WERT1) mit dem Berechnungswert von ZUVOR deklarieren und diese dann y1 zuweisen, also:

IF EIN1
THEN
y1 := 100;
ELSE
y1 := WERT1;
END_IF;

So brauchst du keine globale Variable deklarieren!

Grüße, Florian
 
Zurück
Oben