Zuviel Werbung? - > Hier kostenlos beim SPS-Forum registrieren

Ergebnis 1 bis 4 von 4

Thema: Programmierproblem: Logische Verknüpfung

  1. #1
    Registriert seit
    10.09.2012
    Beiträge
    33
    Danke
    9
    Erhielt 0 Danke für 0 Beiträge

    Standard


    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
    Zitieren Zitieren Programmierproblem: Logische Verknüpfung  

  2. #2
    Registriert seit
    27.05.2004
    Ort
    Thüringen/Berlin
    Beiträge
    12.218
    Danke
    533
    Erhielt 2.696 Danke für 1.948 Beiträge

    Standard

    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?
    Gruß
    Ralle

    ... there\'re 10 kinds of people ... those who understand binaries and those who don\'t …
    and the third kinds of people … those who love TIA-Portal

  3. #3
    Registriert seit
    10.09.2012
    Beiträge
    33
    Danke
    9
    Erhielt 0 Danke für 0 Beiträge

    Standard

    Zitat Zitat von Ralle Beitrag anzeigen
    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?

  4. #4
    Registriert seit
    21.02.2011
    Ort
    Deutschland, Baden-Würtemberg
    Beiträge
    990
    Danke
    115
    Erhielt 125 Danke für 100 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    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

Ähnliche Themen

  1. OB86 - logische Basisadresse S7-Slave
    Von Gerri im Forum Simatic
    Antworten: 10
    Letzter Beitrag: 23.05.2011, 07:00
  2. Logische Verknüpfungen einfach u. logisch programmieren
    Von good_mike im Forum Programmierstrategien
    Antworten: 4
    Letzter Beitrag: 04.05.2011, 18:53
  3. programmierproblem
    Von bennzi im Forum Programmierstrategien
    Antworten: 18
    Letzter Beitrag: 05.05.2007, 20:48
  4. logische Basisadresse
    Von Kuffel im Forum Simatic
    Antworten: 4
    Letzter Beitrag: 19.10.2006, 18:18
  5. Logische Schaltungen ohne SPS?
    Von Anonymous im Forum Simatic
    Antworten: 2
    Letzter Beitrag: 27.12.2004, 09:48

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •