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

Seite 2 von 2 ErsteErste 12
Ergebnis 11 bis 20 von 20

Thema: If Abfrage mit Boolschen Variablen

  1. #11
    Registriert seit
    22.06.2009
    Ort
    Sassnitz
    Beiträge
    11.163
    Danke
    921
    Erhielt 3.286 Danke für 2.655 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Zitat Zitat von Thomas_v2.1 Beitrag anzeigen
    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.
    Konsequenterweise schreiben diejenigen eher so:
    Code:
    IF E0.0=TRUE THEN
      A0.0 := TRUE ;
    ELSE
      A0.0 := FALSE ;
    END_IF ;


    Zitat Zitat von SanjaDO Beitrag anzeigen
    Der Compiler meckert nicht, die IF abfrage ist dann einfach nicht "true"!
    [...]
    Da bin ich total überfragt warum es gerade in einer von 10 if schleifen nicht geht (im gleichen FB)....
    Da solltest Du uns wohl doch mal den echten nicht funktionierenden Code zeigen. Dein Problem muß eine andere Ursache haben.

    btw: "IF" ist keine Schleife

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

    FAQ: Linkliste SIMATIC-Kommunikation über Ethernet

  2. #12
    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

    So! Mein Problem ist aber immer noch nicht geklärt. Hier der kompletter Code, Im Schritt 4 (SM[4]) ist das angesprochene Problem. Da musste ich "#fuellstand_erreicht=1" auf 1 prüfen, sonst geht das Programm nicht in diese Unterabfrage rein:

    Code:
    FUNCTION_BLOCK "Petri"
    { S7_Optimized_Access := 'FALSE' }
    VERSION : 0.1
       VAR_INPUT 
          fuellstand_erreicht : Bool;
          B2_abgesperrt : Bool;
          B2_entleert : Bool;
          entleerventile_geschlossen : Bool;
          B2_evakuiert : Bool;
          Ventlie_geschlossen : Bool;
          Anlage_entspannt : Bool;
          Anlage_entleert : Bool;
          Uebefuehrventil_WA_geoeffnet : Bool;
          Entleerventil_WA_geoeffnet : Bool;
          Produktion_start : Bool;
          Produktion_stop : Bool;
          Reinigung_start : Bool;
          Reinigung_stop : Bool;
          Reinigung_halt : Bool;
          Reinigung_weiter : Bool;
          Entleert : Bool;
          Evakuiert : Bool;
       END_VAR
    
    
       VAR_OUTPUT 
          SM : Array [0..20] of Bool;
       END_VAR
    
    
       VAR 
          Timer1 {OriginalPartName := 'TON'; VersionGUID := 'b966b86b-3345-49ba-8b4b-c930e1b67fde'} : TON;
          Timer2 {OriginalPartName := 'TON'; VersionGUID := 'b966b86b-3345-49ba-8b4b-c930e1b67fde'} : TON;
       END_VAR
    
    
       VAR_TEMP 
          index : Int;
       END_VAR
    
    
    
    
    BEGIN
    	
    	
    	IF "Wiederanlauf" THEN
    	  #SM[0]:=1;
    	  FOR #index := 1 TO 20 DO
    	    #SM[#index]:=0;
    	  END_FOR;
    	  "Panel".Start_Produktion:=0;
    	  "Panel".Start_Reinigung:=0;
    	END_IF;
    	
    	#Timer1(IN:=#SM[0],PT:=T#20s);
    	
    	IF #SM[0] THEN
    	  IF #Timer1.Q THEN
    	    "Wiederanlauf":=0;
    	    #SM[0]:=0;
    	    #SM[1]:=1;
    	  END_IF;
    	END_IF;
    	
    	IF #SM[1] THEN
    	  IF #Produktion_start THEN
    	  #SM[1]:=0;
    	  #SM[2]:=1;
    	  ELSIF #Reinigung_start THEN
    	  #SM[1]:=0;
    	  #SM[15]:=1;
    	  END_IF;
    	END_IF;
    	
    	IF #SM[2] THEN
    	  IF #Entleert THEN
    	    #SM[2]:=0;
    	    #SM[3]:=1;
    	  ELSIF #Produktion_stop THEN
    	    #SM[2]:=0;
    	    #SM[1]:=1;
    	  END_IF;
    	END_IF;
    	
    	IF #SM[3] THEN
    	  IF #Evakuiert THEN
    	    #SM[3]:=0;
    	    #SM[4]:=1;
    	  ELSIF #Produktion_stop THEN
    	    #SM[3]:=0;
    	    #SM[1]:=1;
    	  END_IF;
    	END_IF;
    	
    	IF #SM[4] THEN
    	  IF #fuellstand_erreicht=1 THEN
    	    #SM[4]:=0;
    	    #SM[5]:=1;
    	  ELSIF #Produktion_stop THEN
    	    #SM[4]:=0;
    	    #SM[1]:=1;
    	  END_IF;
    	END_IF;
    	
    	IF #SM[5] THEN
    	  IF #B2_abgesperrt THEN
    	    #SM[5]:=0;
    	    #SM[6]:=1;
    	  ELSIF #Produktion_stop THEN
    	    #SM[5]:=0;
    	    #SM[1]:=1;
    	  END_IF;
    	END_IF;
    	
    	IF #SM[6] THEN
    	  IF #B2_entleert THEN
    	    #SM[6]:=0;
    	    #SM[7]:=1;
    	  ELSIF #Produktion_stop THEN
    	    #SM[6]:=0;
    	    #SM[1]:=1;
    	  END_IF;
    	END_IF;
    	
    	IF #SM[7] THEN
    	  IF #entleerventile_geschlossen THEN
    	    #SM[7]:=0;
    	    #SM[8]:=1;
    	  ELSIF #Produktion_stop THEN
    	    #SM[7]:=0;
    	    #SM[1]:=1;
    	  END_IF;
    	END_IF;
    	
    	IF #SM[8] THEN
    	  IF #B2_evakuiert THEN
    	    #SM[8]:=0;
    	    #SM[9]:=1;
    	  ELSIF #Produktion_stop THEN
    	    #SM[8]:=0;
    	    #SM[1]:=1;
    	  END_IF;
    	END_IF;
    	
    	IF #SM[9] THEN
    	  IF #Ventlie_geschlossen THEN
    	    #SM[9]:=0;
    	    #SM[10]:=1;
    	  ELSIF #Produktion_stop THEN
    	    #SM[9]:=0;
    	    #SM[1]:=1;
    	  END_IF;
    	END_IF;
    	
    	IF #SM[10] THEN
    	  IF #Anlage_entspannt THEN
    	    #SM[10]:=0;
    	    #SM[11]:=1;
    	  ELSIF #Produktion_stop THEN
    	    #SM[10]:=0;
    	    #SM[1]:=1;
    	  END_IF;
    	END_IF;
    	
    	IF #SM[11] THEN
    	  IF #Anlage_entleert THEN
    	    #SM[11]:=0;
    	    #SM[12]:=1;
    	  ELSIF #Produktion_stop THEN
    	    #SM[11]:=0;
    	    #SM[1]:=1;
    	  END_IF;
    	END_IF;
    	
    	IF #SM[12] THEN
    	  IF #Uebefuehrventil_WA_geoeffnet THEN
    	    #SM[12]:=0;
    	    #SM[13]:=1;
    	  ELSIF #Produktion_stop THEN
    	    #SM[12]:=0;
    	    #SM[1]:=1;
    	  END_IF;
    	END_IF;
    	
    	IF #SM[13] THEN
    	  IF #Entleerventil_WA_geoeffnet THEN
    	    #SM[13]:=0;
    	    #SM[2]:=1;
    	  ELSIF #Produktion_stop THEN
    	    #SM[13]:=0;
    	    #SM[1]:=1;
    	  END_IF;
    	END_IF;
    	
    	
    END_FUNCTION_BLOCK
    Danke

  3. #13
    Registriert seit
    22.11.2006
    Ort
    CH
    Beiträge
    3.618
    Danke
    775
    Erhielt 646 Danke für 492 Beiträge

    Standard

    Grundsätzlich müsste das funktionieren wenn du tatsächlich füllstand erreicht auf 1 hast.

    Ist dir bewusst dass deine FOR Schleife nicht zwingend funktionieren muss?

    mfG René

  4. #14
    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

    Auf einmal gehts wieder... Keine Ahnung was da passiert ist. Jetzt macht mir dieser Fehler noch mehr Angst weil ich den jetzt nicht reproduzieren kann. Warum funktioniert die for schleife nicht???

  5. #15
    Registriert seit
    22.11.2006
    Ort
    CH
    Beiträge
    3.618
    Danke
    775
    Erhielt 646 Danke für 492 Beiträge

    Standard

    Weil die Index Variable temporär ist und du diese nicht initialisierst.
    Der Zustand einer Temporären Variable ist aus Sicht des Bausteins, zufällig.
    Bin mir jetzt aber garnicht mehr sicher ob for die variable nicht selbst initialisiert?

    mfG René
    Geändert von vollmi (06.04.2014 um 14:07 Uhr)

  6. #16
    Registriert seit
    22.06.2009
    Ort
    Sassnitz
    Beiträge
    11.163
    Danke
    921
    Erhielt 3.286 Danke für 2.655 Beiträge

    Standard

    FOR enthält die Initialisierung der Index-/Schleifen-Variable auf einen Anfangswert:
    Code:
    	  FOR #index := 1 TO 20 DO
    	    #SM[#index]:=0;
    	  END_FOR;
    Harald
    Es ist immer wieder überraschend, wie etwas plötzlich funktioniert, sobald man alles richtig macht.

    FAQ: Linkliste SIMATIC-Kommunikation über Ethernet

  7. Folgender Benutzer sagt Danke zu PN/DP für den nützlichen Beitrag:

    vollmi (06.04.2014)

  8. #17
    Registriert seit
    27.06.2009
    Ort
    am Nordharz
    Beiträge
    3.713
    Danke
    443
    Erhielt 914 Danke für 739 Beiträge

    Standard

    Zitat Zitat von SanjaDO Beitrag anzeigen
    Code:
    FUNCTION_BLOCK "Petri"
    { S7_Optimized_Access := 'FALSE' }
    VERSION : 0.1
       VAR_INPUT 
          fuellstand_erreicht : Bool;
          B2_abgesperrt : Bool;
          B2_entleert : Bool;
          entleerventile_geschlossen : Bool;
          B2_evakuiert : Bool;
          Ventlie_geschlossen : Bool;
          Anlage_entspannt : Bool;
          Anlage_entleert : Bool;
          Uebefuehrventil_WA_geoeffnet : Bool;
          Entleerventil_WA_geoeffnet : Bool;
          Produktion_start : Bool;
          Produktion_stop : Bool;
          Reinigung_start : Bool;
          Reinigung_stop : Bool;
          Reinigung_halt : Bool;
          Reinigung_weiter : Bool;
          Entleert : Bool;
          Evakuiert : Bool;
       END_VAR
    
    
       VAR_OUTPUT 
          SM : Array [0..20] of Bool;
       END_VAR
    
    
       VAR 
          Timer1 {OriginalPartName := 'TON'; VersionGUID := 'b966b86b-3345-49ba-8b4b-c930e1b67fde'} : TON;
          Timer2 {OriginalPartName := 'TON'; VersionGUID := 'b966b86b-3345-49ba-8b4b-c930e1b67fde'} : TON;
       END_VAR
    
    
       VAR_TEMP 
          index : Int;
       END_VAR
    
    
    
    
    BEGIN
        
        
        IF "Wiederanlauf" THEN
          #SM[0]:=1;
          FOR #index := 1 TO 20 DO
            #SM[#index]:=0;
          END_FOR;
          "Panel".Start_Produktion:=0;
          "Panel".Start_Reinigung:=0;
        END_IF;
        
        #Timer1(IN:=#SM[0],PT:=T#20s);
        
        IF #SM[0] THEN
          IF #Timer1.Q THEN
            "Wiederanlauf":=0;
            #SM[0]:=0;
            #SM[1]:=1;
          END_IF;
        END_IF;
        
        IF #SM[1] THEN
          IF #Produktion_start THEN
          #SM[1]:=0;
          #SM[2]:=1;
          ELSIF #Reinigung_start THEN
          #SM[1]:=0;
          #SM[15]:=1;
          END_IF;
        END_IF;
        
        IF #SM[2] THEN
          IF #Entleert THEN
            #SM[2]:=0;
            #SM[3]:=1;
          ELSIF #Produktion_stop THEN
            #SM[2]:=0;
            #SM[1]:=1;
          END_IF;
        END_IF;
        
        IF #SM[3] THEN
          IF #Evakuiert THEN
            #SM[3]:=0;
            #SM[4]:=1;
          ELSIF #Produktion_stop THEN
            #SM[3]:=0;
            #SM[1]:=1;
          END_IF;
        END_IF;
        
        IF #SM[4] THEN
          IF #fuellstand_erreicht=1 THEN
            #SM[4]:=0;
            #SM[5]:=1;
          ELSIF #Produktion_stop THEN
            #SM[4]:=0;
            #SM[1]:=1;
          END_IF;
        END_IF;
        
        IF #SM[5] THEN
          IF #B2_abgesperrt THEN
            #SM[5]:=0;
            #SM[6]:=1;
          ELSIF #Produktion_stop THEN
            #SM[5]:=0;
            #SM[1]:=1;
          END_IF;
        END_IF;
        
        IF #SM[6] THEN
          IF #B2_entleert THEN
            #SM[6]:=0;
            #SM[7]:=1;
          ELSIF #Produktion_stop THEN
            #SM[6]:=0;
            #SM[1]:=1;
          END_IF;
        END_IF;
        
        IF #SM[7] THEN
          IF #entleerventile_geschlossen THEN
            #SM[7]:=0;
            #SM[8]:=1;
          ELSIF #Produktion_stop THEN
            #SM[7]:=0;
            #SM[1]:=1;
          END_IF;
        END_IF;
        
        IF #SM[8] THEN
          IF #B2_evakuiert THEN
            #SM[8]:=0;
            #SM[9]:=1;
          ELSIF #Produktion_stop THEN
            #SM[8]:=0;
            #SM[1]:=1;
          END_IF;
        END_IF;
        
        IF #SM[9] THEN
          IF #Ventlie_geschlossen THEN
            #SM[9]:=0;
            #SM[10]:=1;
          ELSIF #Produktion_stop THEN
            #SM[9]:=0;
            #SM[1]:=1;
          END_IF;
        END_IF;
        
        IF #SM[10] THEN
          IF #Anlage_entspannt THEN
            #SM[10]:=0;
            #SM[11]:=1;
          ELSIF #Produktion_stop THEN
            #SM[10]:=0;
            #SM[1]:=1;
          END_IF;
        END_IF;
        
        IF #SM[11] THEN
          IF #Anlage_entleert THEN
            #SM[11]:=0;
            #SM[12]:=1;
          ELSIF #Produktion_stop THEN
            #SM[11]:=0;
            #SM[1]:=1;
          END_IF;
        END_IF;
        
        IF #SM[12] THEN
          IF #Uebefuehrventil_WA_geoeffnet THEN
            #SM[12]:=0;
            #SM[13]:=1;
          ELSIF #Produktion_stop THEN
            #SM[12]:=0;
            #SM[1]:=1;
          END_IF;
        END_IF;
        
        IF #SM[13] THEN
          IF #Entleerventil_WA_geoeffnet THEN
            #SM[13]:=0;
            #SM[2]:=1;
          ELSIF #Produktion_stop THEN
            #SM[13]:=0;
            #SM[1]:=1;
          END_IF;
        END_IF;
        
        
    END_FUNCTION_BLOCK
    Ich würde da an Deiner Stelle schon die Möglichkeiten von SCL nutzen, anstatt alles doppelt und dreifach zu schreiben.
    Mal als (ungetestete S7 Classic-) Anregung:
    Code:
    FUNCTION_BLOCK "Petri"
    
    
    VAR_INPUT
        Fuellstand_erreicht :           BOOL;
        B2_abgesperrt :                 BOOL;
        B2_entleert :                   BOOL;
        Entleerventile_geschlossen :    BOOL;
        B2_evakuiert :                  BOOL;
        Ventle_geschlossen :            BOOL;
        Anlage_entspannt :              BOOL;
        Anlage_entleert :               BOOL;
        Uebefuehrventil_WA_geoeffnet :  BOOL;
        Entleerventil_WA_geoeffnet :    BOOL;
        Produktion_Start :              BOOL;
        Produktion_Stop :               BOOL;
        Reinigung_Start :               BOOL;
        Reinigung_Stop :                BOOL;
        Reinigung_Halt :                BOOL;
        Reinigung_Weiter :              BOOL;
        Entleert :                      BOOL;
        Evakuiert :                     BOOL;
    END_VAR
    
    VAR_IN_OUT
        Wiederanlauf :                  BOOL;
        Start_Produktion :              INT; 
        Start_Reinigung :               INT; 
    END_VAR
    
    VAR_OUTPUT 
        SM :                            ARRAY [0..20] OF BOOL;
    END_VAR
    
    VAR
        Aktiver_Schritt :               INT;
        Anlauftimer :                   "TON";
        Timer2 :                        "TON";
    END_VAR
    
    VAR_TEMP 
        Naechster_Schritt :             INT;
        Index :                         INT;
    END_VAR
    
    
        // Initialisierung
        IF Wiederanlauf THEN
            Aktiver_Schritt := 0;
        END_IF;
        
        // Schrittkette
        CASE Aktiver_Schritt OF
             0 : Start_Produktion := 0;
                 Start_Reinigung  := 0;
                 Wiederanlauf     := SEL(G:= Anlauftimer.Q,                IN1:= false, IN0:= true);
                 Naechster_Schritt:= SEL(G:= Anlauftimer.Q,                IN1:=  1,    IN0:=  0);
             1 : Naechster_Schritt:= SEL(G:= Produktion_Start,             IN1:=  2,    IN0:= SEL(G:= Reinigung_Start, IN1:= 15, IN0:= 1));
             2 : Naechster_Schritt:= SEL(G:= Entleert,                     IN1:=  3,    IN0:=  2);
             3 : Naechster_Schritt:= SEL(G:= Evakuiert,                    IN1:=  4,    IN0:=  3);
             4 : Naechster_Schritt:= SEL(G:= Fuellstand_erreicht,          IN1:=  5,    IN0:=  4);
             5 : Naechster_Schritt:= SEL(G:= B2_abgesperrt,                IN1:=  6,    IN0:=  5);
             6 : Naechster_Schritt:= SEL(G:= B2_entleert,                  IN1:=  7,    IN0:=  6);
             7 : Naechster_Schritt:= SEL(G:= entleerventile_geschlossen,   IN1:=  8,    IN0:=  7);
             8 : Naechster_Schritt:= SEL(G:= B2_evakuiert,                 IN1:=  9,    IN0:=  8);
             9 : Naechster_Schritt:= SEL(G:= Ventle_geschlossen,           IN1:= 10,    IN0:=  9);
            10 : Naechster_Schritt:= SEL(G:= Anlage_entspannt,             IN1:= 11,    IN0:= 10);
            11 : Naechster_Schritt:= SEL(G:= Anlage_entleert,              IN1:= 12,    IN0:= 11);
            12 : Naechster_Schritt:= SEL(G:= Uebefuehrventil_WA_geoeffnet, IN1:= 13,    IN0:= 12);
            13 : Naechster_Schritt:= SEL(G:= Entleerventil_WA_geoeffnet,   IN1:=  2,    IN0:= 13);
            14 : Naechster_Schritt:= SEL(G:= true,                         IN1:= 15,    IN0:= 14);
            15 : Naechster_Schritt:= SEL(G:= true,                         IN1:= 16,    IN0:= 15);
            16 : Naechster_Schritt:= SEL(G:= true,                         IN1:= 17,    IN0:= 16);
            17 : Naechster_Schritt:= SEL(G:= true,                         IN1:= 18,    IN0:= 17);
            18 : Naechster_Schritt:= SEL(G:= true,                         IN1:= 19,    IN0:= 18);
            19 : Naechster_Schritt:= SEL(G:= true,                         IN1:= 20,    IN0:= 19);
            20 : Naechster_Schritt:= SEL(G:= true,                         IN1:=  1,    IN0:= 20);
        END_CASE;
        
        // Schrittweiterschaltung
        Aktiver_Schritt:= SEL(G:= Produktion_Stop AND NOT Wiederanlauf, IN1:= 1, IN0:= Naechster_Schritt);
        
        // Timer
        Anlauftimer(IN:= Wiederanlauf, PT:= T#20s);
        Timer2     (IN:= false,        PT:= T#1s);
            
        // Ausgabe
        FOR Index := 0 TO 20 BY 1 DO
            SM[Index]:= SEL(G:= Index = Aktiver_Schritt, IN1:= True, IN0:= False);
        END_FOR;
    
        
    END_FUNCTION_BLOCK

  9. #18
    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

    Danke für den Tipp, ich finde meine Variante sieht viel übersichtlicher aus.

  10. #19
    Registriert seit
    06.10.2009
    Ort
    NRW
    Beiträge
    1.568
    Danke
    63
    Erhielt 258 Danke für 218 Beiträge

    Standard

    Was mir noch aufgefallen ist...

    Warum deklarierst Du "SM" als output?

    Code:
    VAR_OUTPUT
        SM : Array [0..20] of Bool;
    END_VAR
    Sofern Du den Schrittmerker nicht außerhalb brauchst, könntest daraus eine statische Variable machen.

    Und wenn Du die Variable doch außerhalb brauchst, so sollte das als "VAR_IN_OUT" deklariert sein, da die Variable auch lesend verarbeitet wird.
    Meine Motivation läuft nackig mit einem Cocktail über eine Wiese.

  11. #20
    Registriert seit
    24.05.2006
    Beiträge
    234
    Danke
    14
    Erhielt 77 Danke für 57 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Und dann stellt sich mir die viel grundsätzlichere Frage wieso den ganzen SM[..], obwohl sie vom Typ Bool sind, immer "0" oder "1" zugewiesen wird und nicht "False" oder "True". Dieser durch den Compiler hingenommene, hininterpretierte Stil funktioniert zwar (leider), aber sauber geht anders. Wer weiß, vielleicht steckte hier der Knoten im Compiler, dass "fuellstand_erreicht" auf "1" anstatt "True" geprüft werden musste - es gibt schließlich die unmöglichsten Fehler.

Ä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
  •