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

Seite 1 von 4 123 ... LetzteLetzte
Ergebnis 1 bis 10 von 32

Thema: SCL Anfängerfehler??

  1. #1
    Registriert seit
    21.12.2009
    Ort
    Dielmissen
    Beiträge
    299
    Danke
    98
    Erhielt 18 Danke für 17 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Hallo

    ich habe da ein Problem mit SCL vieleicht könnte mir hier aus dem Forum vieleicht einer dabei Helfen
    ich habe folgenden SCL Baustein der nicht richtig funktioniert das Ventil wird zwar True aber ich kann es danach nicht wieder auf False setzen.
    Sieht vieleicht irgendwer den Fehler??

    [/I]FUNCTION_BLOCK FB1
    VAR_INPUT
    Eingabetext: STRING; //* Steuertext von WinCC*//
    Start: BOOL; //* Start Varibale von WINCC*//
    END_VAR

    VAR_OUTPUT
    Ventil: BOOL; //*Ausgangsvariable für das Ventil*//
    END_VAR
    VAR
    Ventil_Ok: BOOL; //*Interne Hilfsvariable nur zur interne Verwendung*//
    A: INT; //*Find Baustein*//
    Text_2: STRING; //*Auswahltext_1*//
    Text_3: STRING; //*Auswahltext_2*//
    Text_4: STRING; //*Auswahltext_3*//
    Text_5: STRING; //*Auswahltext_4*//
    Text_6: STRING; //*Auswahltext_5*//
    Text_7: STRING; //*Auswahltext_6*//
    END_VAR


    //*Vorbelegung der Auswahltexte*//

    IF Start THEN;
    Text_2:='V1';
    Text_3:='auf';
    Text_4:='zu';
    Text_5:='Ventil';
    Text_6:='öffne';
    Text_7:='schließe';

    IF Start THEN;
    A:=FIND(IN1:=Eingabetext,IN2:=Text_2);
    IF A<>0 THEN
    Ventil_Ok:=True;
    ELSE
    IF NOT Ventil_Ok THEN;
    A:=FIND(IN1:=Eingabetext,IN2:=Text_5);
    IF A<>0 THEN
    Ventil_Ok:=True;

    IF Start AND Ventil_Ok THEN;
    A:=FIND(IN1:=Eingabetext,IN2:=Text_3);
    IF A<>0 THEN
    Ventil:=True;
    ELSE
    IF Start AND Ventil_Ok AND NOT Ventil THEN;
    A:=FIND(IN1:=Eingabetext,IN2:=Text_6);
    IF A<>0 THEN
    Ventil:=True;

    IF Start AND Ventil_Ok AND Ventil THEN;
    A:=FIND(IN1:=Eingabetext,IN2:=Text_4);
    IF A<>0 THEN
    Ventil:=False;
    ELSE
    IF Start AND Ventil_Ok AND Ventil THEN;
    A:=FIND(IN1:=Eingabetext,IN2:=Text_7);
    IF A<>0 THEN
    Ventil:=False;
    END_IF;
    END_IF;
    END_IF;
    END_IF;
    END_IF;
    END_IF;
    END_IF;
    END_IF;
    END_IF;
    END_IF;
    END_IF;
    END_IF;
    END_IF;

    END_FUNCTION_BLOCK


    Vielen Dank schonmal im Vorraus
    Zitieren Zitieren SCL Anfängerfehler??  

  2. #2
    Registriert seit
    09.08.2006
    Beiträge
    3.640
    Danke
    912
    Erhielt 661 Danke für 543 Beiträge

    Standard

    Zitat Zitat von Licht9885 Beitrag anzeigen
    END_IF;
    END_IF;
    END_IF;
    END_IF;
    END_IF;
    END_IF;
    END_IF;
    END_IF;
    END_IF;
    END_IF;
    END_IF;
    END_IF;
    END_IF;
    Dein IF THEN ELSE Konstrukt ist sowas von unübersichtlich verschachtelt und doppeltgemoppelt, dass ich aufgegeben habe, es zu verstehen.

    Versuche mal Deine END_IFs nicht am Ende zu setzen sondern nach der jeweiligen ELSE-Anweisung, sonst blickt da kein Mensch durch. Vielleicht 3 Schachtelungstiefen sind ja noch ok, aber nicht 13!!!

    Ansonsten würde mich mal interessieren, was der Baustein machen soll, wenn er fertig ist, also der Sinn des Ganzen. Das mit den "Steuertexten von WinCC" kommt mir suspekt vor...

    Gruß.

    PS: Es gibt auch noch ELSEIF oder auch CASE
    Geändert von ducati (14.05.2013 um 15:03 Uhr)

  3. #3
    Registriert seit
    06.10.2004
    Ort
    Kopenhagen.
    Beiträge
    4.639
    Danke
    377
    Erhielt 803 Danke für 644 Beiträge

    Standard

    Unmöglich das diese Code echt ist.
    Das Anzahl von IF und END_IF sind nicht gleich.
    edit: Sind sie doch, habe der erste IF übersehen.

    Ausserdem finde ich diese Code ganz grausam.

    Code:
    IF Start THEN; //1
      Text_2:='V1';
      Text_3:='auf';
      ext_4:='zu';
      Text_5:='Ventil';
      Text_6:='öffne';
      Text_7:='schließe';
      IF Start THEN; //2
         A:=FIND(IN1:=Eingabetext,IN2:=Text_2);
       IF A<>0 THEN //3
          Ventil_Ok:=True;
       ELSE
          IF NOT Ventil_Ok THEN; //4
             A:=FIND(IN1:=Eingabetext,IN2:=Text_5);
             IF A<>0 THEN //5
                Ventil_Ok:=True;
    
                IF Start AND Ventil_Ok THEN; //6
                   A:=FIND(IN1:=Eingabetext,IN2:=Text_3);
                   IF A<>0 THEN //7
                      Ventil:=True;
                   ELSE
                      IF Start AND Ventil_Ok AND NOT Ventil THEN; //8
                         A:=FIND(IN1:=Eingabetext,IN2:=Text_6);
                         IF A<>0 THEN  //9
                            Ventil:=True;
    
                            IF Start AND Ventil_Ok AND Ventil THEN;  //10
                               A:=FIND(IN1:=Eingabetext,IN2:=Text_4);
                               IF A<>0 THEN   //11
                                   Ventil:=False;
                               ELSE
                                  IF Start AND Ventil_Ok AND Ventil THEN; //12
                                     A:=FIND(IN1:=Eingabetext,IN2:=Text_7);
                                     IF A<>0 THEN  //13
                                        Ventil:=False;
                                     END_IF;  //13
                                   END_IF;  //12
                               END_IF;  //11
                            END_IF;  //10
                        END_IF;  //9
                     END_IF;  //8
                  END_IF;  //7
               END_IF;  //6
            END_IF;  //5
          END_IF;  //4
        END_IF;  //3
      END_IF;  //2
    END_IF;  //1
    Geändert von JesperMP (14.05.2013 um 15:09 Uhr)
    Jesper M. Pedersen

  4. #4
    Registriert seit
    22.07.2009
    Ort
    NRW
    Beiträge
    90
    Danke
    1
    Erhielt 6 Danke für 6 Beiträge

    Standard

    Doppel Post
    Geändert von wiesel187 (14.05.2013 um 15:07 Uhr)

  5. #5
    Registriert seit
    22.07.2009
    Ort
    NRW
    Beiträge
    90
    Danke
    1
    Erhielt 6 Danke für 6 Beiträge

    Standard

    Da war ducati schneller .....
    Schau dir deinen Code mal genau an ..

    Code:
    IF Start THEN;
        A:=FIND(IN1:=Eingabetext,IN2:=Text_2);
            IF A<>0 THEN
                Ventil_Ok:=True;
    ELSE
           --> (Durchlauf nur bei Start false )
    
    	IF NOT Ventil_Ok THEN;
    	A:=FIND(IN1:=Eingabetext,IN2:=Text_5);
    
                      --> (Durchlauf nur bei Start false & Fentil nicht O.K.)
    		IF A<>0 THEN
                        --> (Durchlauf nur bei Start false & Fentil nicht O.K. & A <> 0 u.s.w.)
    		   Ventil_Ok:=True;
    
                           IF A<>0 THEN
                           Ventil_Ok:=True;

  6. #6
    Licht9885 ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    21.12.2009
    Ort
    Dielmissen
    Beiträge
    299
    Danke
    98
    Erhielt 18 Danke für 17 Beiträge

    Standard

    So denke mal so ist es ein wenig übersichtlicher
    FUNCTION_BLOCK FB1
    VAR_INPUT
    Eingabetext: STRING; //* Steuertext von WinCC*//
    Start: BOOL; //* Start Varibale von WINCC*//
    END_VAR

    VAR_OUTPUT
    Ventil: BOOL; //*Ausgangsvariable für das Ventil*//
    END_VAR
    VAR
    Ventil_Ok: BOOL; //*Interne Hilfsvariable nur zur interne Verwendung*//
    A: INT; //*Find Baustein*//
    Text_2: STRING; //*Auswahltext_1*//
    Text_3: STRING; //*Auswahltext_2*//
    Text_4: STRING; //*Auswahltext_3*//
    Text_5: STRING; //*Auswahltext_4*//
    Text_6: STRING; //*Auswahltext_5*//
    Text_7: STRING; //*Auswahltext_6*//
    END_VAR


    //*Vorbelegung der Auswahltexte*//

    IF Start THEN;
    Text_2:='V1';
    Text_3:='auf';
    Text_4:='zu';
    Text_5:='Ventil';
    Text_6:='öffne';
    Text_7:='schließe';

    IF Start THEN;
    A:=FIND(IN1:=Eingabetext,IN2:=Text_2);
    IF A<>0 THEN
    Ventil_Ok:=True;
    ELSE
    IF NOT Ventil_Ok THEN;
    A:=FIND(IN1:=Eingabetext,IN2:=Text_5);
    IF A<>0 THEN
    Ventil_Ok:=True;
    END_IF;
    END_IF;
    END_IF;
    END_IF;



    IF Start AND Ventil_Ok THEN;
    A:=FIND(IN1:=Eingabetext,IN2:=Text_3);
    IF A<>0 THEN
    Ventil:=True;
    ELSE
    IF Start AND Ventil_Ok AND NOT Ventil THEN;
    A:=FIND(IN1:=Eingabetext,IN2:=Text_6);
    IF A<>0 THEN
    Ventil:=True;
    END_IF;
    END_IF;
    END_IF;
    END_IF;



    IF Start AND Ventil_Ok AND Ventil THEN;
    A:=FIND(IN1:=Eingabetext,IN2:=Text_4);
    IF A<>0 THEN
    Ventil:=False;
    ELSE
    IF Start AND Ventil_Ok AND Ventil THEN;
    A:=FIND(IN1:=Eingabetext,IN2:=Text_7);
    IF A<>0 THEN
    Ventil:=False;
    END_IF;
    END_IF;
    END_IF;
    END_IF;
    END_IF;


    END_FUNCTION_BLOCK

    Der Baustein soll ein einfachen Boolschen Ausgang hier Ventil auf True setzen wenn in dem Eingabetext die Wörter der Texte 2 -7 vorkommen
    Im 1 Block möchte ich auswerten ob das Wort Ventil oder V1 in dem String vorkommt das Funktioniert übrigens noch.
    Im 2 Block soll ausgewertet werden ob der Befehl auf oder öffnen kommt das funktioniert auch noch.
    Im 3 Block soll geprüft werden auf die Befehle zu oder schließe das Funktioniert nicht.

  7. #7
    Licht9885 ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    21.12.2009
    Ort
    Dielmissen
    Beiträge
    299
    Danke
    98
    Erhielt 18 Danke für 17 Beiträge

    Standard

    @ Jesper

    Ich finde diesen Code auch Grausam aber da mir leider die erfahrung mit SCL fehlt und ich es einigermassen Probiere mich da durchzuhangeln um es zu lernen hatte ich gedacht das ich jetzt wo ich alleine nicht weiterkomme Mal im Forum Frage
    MFG Sebastian Licht


    Step 7 Prof. ,WinCC
    Codesys, Beckhoff Twincat 2
    EZTouchPLC
    EZPLC
    EZTextPLC

  8. #8
    Registriert seit
    06.10.2004
    Ort
    Kopenhagen.
    Beiträge
    4.639
    Danke
    377
    Erhielt 803 Danke für 644 Beiträge

    Standard

    Dies ist eine Aufgabe für ein ARRAY von STRING und eine FOR Schleife.

    Vor der FOR Schleife, TempVentil auf FALSE setzen.
    Innerhalb von der FOR Schleife, TempVentil bedingt TRUE setzen.

    Am ende Ventil := TempVentil.
    Jesper M. Pedersen

  9. Folgender Benutzer sagt Danke zu JesperMP für den nützlichen Beitrag:

    Licht9885 (14.05.2013)

  10. #9
    Registriert seit
    16.07.2007
    Beiträge
    61
    Danke
    13
    Erhielt 16 Danke für 16 Beiträge

    Standard

    Und damit es ein wenig übersichtlicher wird.


    Code:
    FUNCTION_BLOCK FB1
    VAR_INPUT
    Eingabetext: STRING; //* Steuertext von WinCC*//
    Start: BOOL; //* Start Varibale von WINCC*//
    END_VAR
    
    VAR_OUTPUT
    Ventil: BOOL; //*Ausgangsvariable für das Ventil*//
    END_VAR
    VAR
    Ventil_Ok: BOOL; //*Interne Hilfsvariable nur zur interne Verwendung*//
    A: INT; //*Find Baustein*//
    Text_2: STRING; //*Auswahltext_1*//
    Text_3: STRING; //*Auswahltext_2*//
    Text_4: STRING; //*Auswahltext_3*//
    Text_5: STRING; //*Auswahltext_4*//
    Text_6: STRING; //*Auswahltext_5*//
    Text_7: STRING; //*Auswahltext_6*//
    END_VAR
    
    
    //*Vorbelegung der Auswahltexte*//
    
    IF Start THEN;
    Text_2:='V1';
    Text_3:='auf';
    Text_4:='zu';
    Text_5:='Ventil';
    Text_6:='öffne';
    Text_7:='schließe';
    
        IF Start THEN;
            A:=FIND(IN1:=Eingabetext,IN2:=Text_2);
        
            IF A<>0 THEN
                Ventil_Ok:=True;
            ELSE
                IF NOT Ventil_Ok THEN;
                    A:=FIND(IN1:=Eingabetext,IN2:=Text_5);
                END_IF;
        
                IF A<>0 THEN
                    Ventil_Ok:=True;
                END_IF;
            END_IF;
        END_IF;
        
        
        
        IF Start AND Ventil_Ok THEN;
            A:=FIND(IN1:=Eingabetext,IN2:=Text_3);
            IF A<>0 THEN
                Ventil:=True;
            ELSE
                IF Start AND Ventil_Ok AND NOT Ventil THEN;
                    A:=FIND(IN1:=Eingabetext,IN2:=Text_6);
                END_IF;
                
                IF A<>0 THEN
                    Ventil:=True;
                END_IF;
            END_IF;
        END_IF;
        
        
        
        IF Start AND Ventil_Ok AND Ventil THEN;
            A:=FIND(IN1:=Eingabetext,IN2:=Text_4);
            IF A<>0 THEN 
                Ventil:=False;
            ELSE
                IF Start AND Ventil_Ok AND Ventil THEN;
                    A:=FIND(IN1:=Eingabetext,IN2:=Text_7);
                END_IF;
                IF A<>0 THEN
                    Ventil:=False;
                END_IF;
            END_IF;
            
        END_IF;
        
    END_IF;
    
    
    END_FUNCTION_BLOCK

  11. #10
    Registriert seit
    05.09.2011
    Beiträge
    176
    Danke
    43
    Erhielt 28 Danke für 20 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Du brauchst übrigens nicht Find verwenden du kannst Strings auch einfach "normal" miteinander vergleichen:

    If StringA <> StringB bzw. auf Gleichheit sollte auch gehen! Das macht das ganze dann nochmals leserlicher.

    EDIT: Und damit kannst du das dann alles ODER-Verknüpfen und fertig

Ähnliche Themen

  1. SCL: FB Aufruf unter SCL mit Variablen DB
    Von ThorstenK im Forum Programmierstrategien
    Antworten: 32
    Letzter Beitrag: 10.02.2011, 19:15
  2. Antworten: 4
    Letzter Beitrag: 07.10.2006, 00:34
  3. Anfängerfehler beim Anschluss??
    Von Max-Schulz im Forum Simatic
    Antworten: 9
    Letzter Beitrag: 27.06.2006, 07:49
  4. Brauche Hilfe bei SCL.SFC Aufrufen in SCL
    Von Gerold im Forum Simatic
    Antworten: 10
    Letzter Beitrag: 06.10.2005, 10:47
  5. Anfängerfehler oder was
    Von andretus im Forum Simatic
    Antworten: 3
    Letzter Beitrag: 16.02.2005, 15:29

Lesezeichen

Berechtigungen

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