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

Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 20

Thema: If Abfrage mit Boolschen Variablen

  1. #1
    Registriert seit
    25.10.2013
    Ort
    Castrop-Rauxel
    Beiträge
    177
    Danke
    36
    Erhielt 0 Danke für 0 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Hallo Leute

    ich habe heute ein Phänomen entdeckt was ich mir nicht erklären kann. Bisher habe ich eine IF abfrage folgendermaßen gestalltet:

    Code:
    VAR_INPUT
    a:BOOL;
    END_VAR
    
    IF a THEN
     Anweisung;
    END_IF;
    Die hat auch immer funktioniert, wenn die Variable a=1 ist, ist die Abfrage "WAHR".

    In meinem aktuellen Programm funktioniert das aber nur wenn ich auf a=1 abfrage....

    Code:
    VAR_INPUT
    a:BOOL;
    END_VAR
    
    IF a=1 THEN
     Anweisung;
    END_IF;
    Hatte das Problem schon mal einer?

    Ich habe das Programm auf einer 314CPU laufen

    Danke
    Zitieren Zitieren If Abfrage mit Boolschen Variablen  

  2. #2
    Registriert seit
    09.11.2007
    Ort
    Rhein Main (Darmstadt)
    Beiträge
    663
    Danke
    61
    Erhielt 112 Danke für 80 Beiträge

    Standard

    Zitat Zitat von SanjaDO Beitrag anzeigen
    Hallo Leute

    ich habe heute ein Phänomen entdeckt was ich mir nicht erklären kann. Bisher habe ich eine IF abfrage folgendermaßen gestalltet:

    Code:
    VAR_INPUT
    a:BOOL;
    END_VAR
    
    IF a THEN
     Anweisung;
    END_IF;
    Die hat auch immer funktioniert, wenn die Variable a=1 ist, ist die Abfrage "WAHR".

    In meinem aktuellen Programm funktioniert das aber nur wenn ich auf a=1 abfrage....

    Code:
    VAR_INPUT
    a:BOOL;
    END_VAR
    
    IF a=1 THEN
     Anweisung;
    END_IF;
    Hatte das Problem schon mal einer?

    Ich habe das Programm auf einer 314CPU laufen

    Danke
    Ich habe keine Umgebung zum Testen aber ich würde immer auf True oder False testen. Der Stil, den Du da praktizierst, ist allerdings sehr üblich bei Programmierern, die die Sprache C mit der Muttermilch bekommen haben.

    Übrigens, wenn es einen ELSE Zweig gibt, sollte man auf FALSE testen, das geht minimal vom Code schneller. Letzden Endes erzeugt der Compiler eine Subtraktion zwischen den beiden Werten und sieht nach, ob das Ergebnis = 0 ist.
    Als Freelancer immer auf der Suche nach interessanten Projekten.
    Zitieren Zitieren Strong Typed  

  3. #3
    Registriert seit
    22.03.2007
    Ort
    Detmold (im Lipperland)
    Beiträge
    11.727
    Danke
    398
    Erhielt 2.404 Danke für 2.002 Beiträge

    Standard

    Hallo,
    die Abfrage auf a vom Typ BOOL auf 1 ergibt m.E. nur deshalb ein TRUE weil der Compiler es gestattet. Wenn dann solltest du a auch auf TRUE (oder FALSE) abfragen.
    In meiner bisherigen Welt (das ist allerdings S7-Classic) frage ich Boolsche Variablen auch nicht auf TRUE oder FALSE ab, da diese ja auch nur den Zustand haben können (ich code es also auch so, wie du es schreibst : IF a then ...).
    Das du jetzt a auf seinen Inhalt prüfen mußt scheint mir eher ein TIA-Feature zu sein ...

    Gruß
    Larry

  4. #4
    Registriert seit
    22.06.2009
    Ort
    Sassnitz
    Beiträge
    11.192
    Danke
    925
    Erhielt 3.292 Danke für 2.661 Beiträge

    Standard

    Zitat Zitat von SanjaDO Beitrag anzeigen
    In meinem aktuellen Programm funktioniert das aber nur wenn ich auf a=1 abfrage....
    Du meinst "IF a THEN" funktioniert nicht, Du mußt "IF a=1 THEN" schreiben?
    Was meinst Du mit "funktioniert das aber nur ..." - meckert der SCL-Compiler oder funktioniert der Code auf der CPU nicht wie erwartet?
    Mit welchem Aktualparameter wird a beim Aufruf versorgt?
    Welche TIA-Version hast Du?


    "IF ausdruck THEN" testet einen Ausdruck auf TRUE, dafür ist es absolut nicht nötig einen boolschen Ausdruck zusätzlich mit TRUE zu vergleichen.

    Wenn Du für den Ausdruck einen Vergleich schreibst, dann müßtest Du statt "IF a=1 ..." eigentlich schreiben "IF a=TRUE ...", doch der Compiler verzeiht Dir und wandelt implizit die numerische 1 und 0 in boolsche TRUE und FALSE .

    Harald
    Es ist immer wieder überraschend, wie etwas plötzlich funktioniert, sobald man alles richtig macht.

    FAQ: Linkliste SIMATIC-Kommunikation über Ethernet

  5. #5
    Registriert seit
    09.08.2006
    Beiträge
    3.629
    Danke
    912
    Erhielt 656 Danke für 542 Beiträge

    Standard

    Zitat Zitat von RobiHerb Beitrag anzeigen
    Ich habe keine Umgebung zum Testen aber ich würde immer auf True oder False testen. Der Stil, den Du da praktizierst, ist allerdings sehr üblich bei Programmierern, die die Sprache C mit der Muttermilch bekommen haben.
    Naja so hat jeder seine Ansichten...

    ich finde

    Code:
    IF a OR b OR NOT c THEN
    übersichtlicher als

    Code:
    IF (a=true OR b=true OR c=false)=true THEN
    aber das hat ja nichts mit dem Thema zu tun

    Wäre doch schon ein ziemlicher Bug. aber warten wir mal ab, welche Version der TE benutzt.

    Gruß.

  6. Folgender Benutzer sagt Danke zu ducati für den nützlichen Beitrag:

    hucki (03.04.2014)

  7. #6
    Registriert seit
    27.06.2009
    Ort
    am Nordharz
    Beiträge
    3.717
    Danke
    443
    Erhielt 920 Danke für 740 Beiträge

    Standard

    Zitat Zitat von SanjaDO Beitrag anzeigen
    Code:
    VAR_INPUT
    a:BOOL;
    END_VAR
    Da TIA ja diese Art der Deklarierung nicht verarbeitet, würde ich mal prüfen, ob a nicht vlt. als (evtl. global) INT deklariert ist.

  8. #7
    SanjaDO ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    25.10.2013
    Ort
    Castrop-Rauxel
    Beiträge
    177
    Danke
    36
    Erhielt 0 Danke für 0 Beiträge

    Standard

    Der Compiler meckert nicht, die IF abfrage ist dann einfach nicht "true"! Ich habe sehr viele Programme so geschrieben die auch bis jetzt funktionieren. Nur das aktuelle Projekt nicht...
    Da bin ich total überfragt warum es gerade in einer von 10 if schleifen nicht geht (im gleichen FB)....

  9. #8
    SanjaDO ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    25.10.2013
    Ort
    Castrop-Rauxel
    Beiträge
    177
    Danke
    36
    Erhielt 0 Danke für 0 Beiträge

    Standard

    Zitat Zitat von pn/dp Beitrag anzeigen
    du meinst "if a then" funktioniert nicht, du mußt "if a=1 then" schreiben?
    Was meinst du mit "funktioniert das aber nur ..." - meckert der scl-compiler oder funktioniert der code auf der cpu nicht wie erwartet?
    Mit welchem aktualparameter wird a beim aufruf versorgt?
    Welche tia-version hast du?


    "if ausdruck then" testet einen ausdruck auf true, dafür ist es absolut nicht nötig einen boolschen ausdruck zusätzlich mit true zu vergleichen.

    Wenn du für den ausdruck einen vergleich schreibst, dann müßtest du statt "if a=1 ..." eigentlich schreiben "if a=true ...", doch der compiler verzeiht dir und wandelt implizit die numerische 1 und 0 in boolsche true und false .

    Harald
    tia v12, sp1

  10. #9
    Registriert seit
    29.03.2004
    Beiträge
    5.739
    Danke
    143
    Erhielt 1.686 Danke für 1.225 Beiträge

    Standard

    Wenn du noch Step7 zur Verfügung hast, kannst du dir ja mal den AWL Code ansehen den das TIA Portal generiert. Dazu öffnest du mit Step7 online den relevanten Baustein, der Editor schaltet dann auch AWL um und du kannst dir das Ergebnis ansehen.

    Mit dem TIA-Portal geht das leider nicht mehr, das kann einem den Bausteincode nicht mehr anzeigen wenn die Bausteinsprache auf SCL steht und es die Quelle dazu nicht mehr hat. Eine einfache Variante des Knoff-Hoff-Schutzes für Tia-Trolle.

    Ich habe mir mal mit V12 SP1 einen FC mit deinem Beispiel erstellt und den AWL Code angesehen. Mir ist da nichts fehlerhaftes aufgefallen.

    Warum sollte man a=true schreiben müssen, wenn a vom Typ Bool ist?
    Bei einer If-Anweisung muss die Bedingung den Datentyp Bool haben. Bei SCL gibt es keine implizite Datentypkonvertierung nach Bool (wie z.B. bei C).
    Wenn a vom Datentyp Bool ist kann daran nichts falsch sein.

    Wer hier IF a=True then.. schreibt, der müsste auch wenn er einem Ausgang einen Eingang zuweisen will anstatt
    A0.0 := E0.0;
    dann
    A0.0 := E0.0 = true;
    schreiben.

  11. #10
    Registriert seit
    29.03.2004
    Beiträge
    5.739
    Danke
    143
    Erhielt 1.686 Danke für 1.225 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Zitat Zitat von RobiHerb Beitrag anzeigen
    Übrigens, wenn es einen ELSE Zweig gibt, sollte man auf FALSE testen, das geht minimal vom Code schneller. Letzden Endes erzeugt der Compiler eine Subtraktion zwischen den beiden Werten und sieht nach, ob das Ergebnis = 0 ist.
    Was höchstens für Architekturen gilt die keinen wirklichen Bit-Datentyp besitzen, und bei denen Bool = Int ist.
    Wir sind hier aber bei Simatic S7, und da gibt es wirkliche Bitadressen. Also solche Spezialoptimierungen gleich wieder vergessen.

Ähnliche Themen

  1. Antworten: 6
    Letzter Beitrag: 01.11.2013, 20:36
  2. Antworten: 1
    Letzter Beitrag: 14.10.2012, 15:54
  3. Abfrage Bit und if Abfrage
    Von Move im Forum HMI
    Antworten: 5
    Letzter Beitrag: 11.05.2011, 21:58
  4. Antworten: 19
    Letzter Beitrag: 09.11.2010, 13:58
  5. Antworten: 3
    Letzter Beitrag: 02.04.2008, 09:21

Lesezeichen

Berechtigungen

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