Step 7 SCL Anfängerfehler??

Licht9885

Level-1
Beiträge
346
Reaktionspunkte
18
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
 
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
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
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
 
Zuletzt bearbeitet:
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
       [U]--> (Durchlauf nur bei Start false )[/U]

	IF NOT Ventil_Ok THEN;
	A:=FIND(IN1:=Eingabetext,IN2:=Text_5);

                  [U]--> (Durchlauf nur bei Start false & Fentil nicht O.K.)[/U]
		IF A<>0 THEN
                   [U] --> (Durchlauf nur bei Start false & Fentil nicht O.K. & A <> 0 u.s.w.)[/U]
		   Ventil_Ok:=True;

                       IF A<>0 THEN
                       Ventil_Ok:=True;
 
Zuviel Werbung?
-> Hier kostenlos registrieren
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.
 
@ 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
 
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.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
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
 
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 ;)
 
Du hast IF THEN ELSE nicht richtig verstanden...

Code:
IF A THEN
    blablabla;
ELSE
    IF A AND B THEN
        blablabla;     // Das hier wird NIE ausgeführt
    END_IF;
END_IF;

ELSE wird nur ausgeführt, wenn IF unwahr ist...

Gruß.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Vor allem weiß ich nicht, warum da mit Strings gearbeitet wird. Wäre das nicht leichter, mit lokalen Variablen zu arbeiten und den Status im Baustein zu setzen? Wenn's denn sein muß kann man ja noch einen Ventilstatus als Integer ausgeben, dann kann man in WinCC flexible auch mit einer Textliste als Status arbeiten
 
Hallo,

ich versteh den Eingang "Start" nicht. Da momentan im FB nichts passiert, wenn der nicht gesetzt ist, brauch er auch nicht überall geprüft werden.

Oder die Funktion soll eine andere sein ...
 
Vielleicht sollte der TE mal von vorne anfangen und genau beschreiben was mit dem Baustein gemacht werden soll. Ein simples Ventil schalten sollte ja auch einfacher gehen.
 
Code:
FUNCTION_BLOCK FB1
VAR_INPUT
Eingabetext: STRING; //* Steuertext von WinCC*//
Start: BOOL; //* Start Variable von WINCC*//
END_VAR

VAR_OUTPUT
Ventil: BOOL; //*Ausgangsvariable für das Ventil*//
END_VAR
VAR

A2: INT; //*Find Baustein*//
A3: INT; //*Find Baustein*//
A4: INT; //*Find Baustein*//
A5: INT; //*Find Baustein*//
A6: INT; //*Find Baustein*//
A7: 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*//


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

// Textsuche
A2:=FIND(IN1:=Eingabetext,IN2:=Text_2);
A3:=FIND(IN1:=Eingabetext,IN2:=Text_3);
A4:=FIND(IN1:=Eingabetext,IN2:=Text_4);
A5:=FIND(IN1:=Eingabetext,IN2:=Text_5);
A6:=FIND(IN1:=Eingabetext,IN2:=Text_6);
A7:=FIND(IN1:=Eingabetext,IN2:=Text_7);    

// Ventil schalten
IF START AND (A2 OR A5) AND (A3 OR A6) THEN
    VENTIL := 1;
ELSIF START AND (A2 OR A5) AND (A4 OR A7) THEN
    VENTIL := 0;
END_IF;

END_FUNCTION_BLOCK

ohne Gewähr...
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Kein FOR Schleife weil der Ergebniss ist Unterschiedlich für die verschiedene STRINGs.

Meinem Vorschlag:

Code:
INPUT_VAR
   Eingabetext: STRING[20]; //* Steuertext von WinCC*// Auf 20 Characters begrenzt. Ohne Dimensionierung werden 256 BYTEs verschwendet.
   Start: BOOL; //* Start Varibale von WINCC*//
END_VAR 

VAR_OUTPUT
   Ventil: BOOL; //*Ausgangsvariable für das Ventil*//
END_VAR

VAR
   TestString : ARRAY[2..7] OF STRING[20] ;
END_VAR 

TEMP_VAR
  i: INT ;
  TempVentil : BOOL ;
END_VAR 

TempVentil := FALSE ;  // wenn keinen Treffer gefunden ist, wird der Ventil = FALSE.

IF Start THEN
   TestString[2]:='V1';
   TestString[3]:='auf';
   TestString[4]:='zu';
   TestString[5]:='Ventil';
   TestString[6]:='öffne';
   TestString[7]:='schließe';

      IF (Eingabetext := TestString[2] OR 
          (Eingabetext := TestString[5] OR
          (Eingabetext := TestString[3] OR
          (Eingabetext := TestString[6] THEN
          TempVentil := TRUE ;
      END_IF ;
      IF (Eingabetext := TestString[4] OR 
          (Eingabetext := TestString[7]  THEN
          TempVentil := FALSE ; // Zu und Schliesse haben vorrang.
      END_IF ;

END_IF ;

Ventil := TempVentil ;
 
Zuletzt bearbeitet:
FIND liefert nen INT, da musst nochwas umbauen... aber prinzipiell geht's so in etwa, und sogar nachvollziehbar.

@ jesper: im Eingabetext steht "V1 auf" bzw. "V1 zu" so hab ichs verstanden.

Gruß.
 
Zurück
Oben