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

Ergebnis 1 bis 7 von 7

Thema: MID-FC in SCL funktioniert nicht

  1. #1
    Registriert seit
    12.02.2008
    Beiträge
    31
    Danke
    3
    Erhielt 3 Danke für 3 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Hallo

    Ich sitze da auf einer IBN und komme bei einem Problem nicht weiter, welches nicht wirklich kompliziert sein kann:

    Code:
    FUNCTION FC7 : Byte
    AUTHOR: mab
    VERSION: '0.1'
    
    
    // history
    // datum          name    version          änderungsgrund
    // ----           ----    -------          -------------
    // 08.01.09       mab     0.1              erstellt
    
    VAR_INPUT
        i_referenzcode: STRING[24];     // Referenzcode zum Vergleich
        i_produkt1:     STRING[24];     // Vergleichscode Produkt 1
        i_produkt2:     STRING[24];     // Vergleichscode Produkt 2
        i_produkt3:     STRING[24];     // Vergleichscode Produkt 3
        i_produkt4:     STRING[24];     // Vergleichscode Produkt 4
        i_produkt5:     STRING[24];     // Vergleichscode Produkt 5
        i_produkt6:     STRING[24];     // Vergleichscode Produkt 6
        i_produkt7:     STRING[24];     // Vergleichscode Produkt 7
        i_produkt8:     STRING[24];     // Vergleichscode Produkt 8
    END_VAR
    
        
    VAR_TEMP
        l_vergleicher:  INT;            // vergleichsvariable
        l_referenz:     STRING[8];     // Da Eingäng nicht direkt an EQ_STRNG übergeben werden können
        l_produkt:      STRING[8];     // Vergleichscode Produkt
        l_temp_string:  STRING[24];
    END_VAR
    
    
          
    
        l_temp_string:=i_referenzcode;
        IF EQ_STRNG(S1 := l_referenz ,S2 := 'NOREAD') THEN
            l_vergleicher:=9;
        ELSE
            
    
            l_referenz:=MID(IN:=l_temp_string, L:=8, P:=5);
            l_temp_string:=i_produkt1;
            l_produkt:=MID(IN:=l_temp_string, L:=8, P:=5);
            IF EQ_STRNG(S1 := l_referenz ,S2 := l_produkt) THEN
                l_vergleicher:=1;
            END_IF;
       
            l_temp_string:=i_produkt2;
            l_produkt:=MID(IN:=l_temp_string, L:=8, P:=5);
            IF EQ_STRNG(S1 := l_referenz ,S2 := l_produkt) THEN
                l_vergleicher:=2;
            END_IF;
        
            l_temp_string:=i_produkt3;
            l_produkt:=MID(IN:=l_temp_string, L:=8, P:=5);
            IF EQ_STRNG(S1 := l_referenz ,S2 := l_produkt) THEN
                l_vergleicher:=3;
            END_IF;
        
            l_temp_string:=i_produkt4;
            l_produkt:=MID(IN:=l_temp_string, L:=8, P:=5);  
            IF EQ_STRNG(S1 := l_referenz ,S2 := l_produkt) THEN
                l_vergleicher:=4;
            END_IF;
        
            l_temp_string:=i_produkt5;
            l_produkt:=MID(IN:=l_temp_string, L:=8, P:=5);
            IF EQ_STRNG(S1 := l_referenz ,S2 := l_produkt) THEN
                l_vergleicher:=5;
            END_IF;
        
            l_temp_string:=i_produkt6;
            l_produkt:=MID(IN:=l_temp_string, L:=8, P:=5);
            IF EQ_STRNG(S1 := l_referenz ,S2 := l_produkt) THEN
                l_vergleicher:=6;
            END_IF;
        
            l_temp_string:=i_produkt7;
            l_produkt:=MID(IN:=l_temp_string, L:=8, P:=5);
            IF EQ_STRNG(S1 := l_referenz ,S2 := l_produkt) THEN
                l_vergleicher:=7;
            END_IF;
         
            l_temp_string:=i_produkt8;
            l_produkt:=MID(IN:=l_temp_string, L:=8, P:=5);
            IF EQ_STRNG(S1 := l_referenz ,S2 := l_produkt) THEN
                l_vergleicher:=8;
            END_IF;
        END_IF;
        
        
       
    
        
        CASE l_vergleicher OF
            1 : FC7:=1;
            2 : FC7:=2;
            3 : FC7:=3;
            4 : FC7:=4;
            5 : FC7:=5;
            6 : FC7:=6;
            7 : FC7:=7;
            8 : FC7:=8;
            9 : FC7:=9;     
        ELSE:
            FC7:=9;
        END_CASE; 
             
    END_FUNCTION
    Das Problem ist, dass ich am RET_VAL immer ne 8 stehen habe. Habe mal einige Teile des FC's auskommentiert und festgestellt, dass einfach jede IF-Bedingung erfüllt wird. Es liegt daran das aus der MID-Funktion ein Leerstring rauskommt. An was kann das liegen??

    Gruess ig
    Zitieren Zitieren MID-FC in SCL funktioniert nicht  

  2. #2
    Registriert seit
    27.05.2004
    Ort
    Thüringen/Berlin
    Beiträge
    12.222
    Danke
    533
    Erhielt 2.697 Danke für 1.949 Beiträge

    Standard

    Wichtig ist, daß die Strings initialisiert werden müssen, das gilt insbesondere für die unter temp angelegten, da die über IN kommenden Strings in der Regel ja gefüllt sind.

    Schreib mal an den Anfang des Codes in SCL einfach:

    Code:
     l_referenz := '';
     l_produkt := '';
     l_temp_string := '';
    Evtl. auch mit den entsprechenden Leerzeichen gefüllt:

    Code:
     l_referenz := '        '; 
     l_produkt := '        ';
     l_temp_string := '                        ';
    Geändert von Ralle (17.03.2009 um 21:45 Uhr)
    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. Folgender Benutzer sagt Danke zu Ralle für den nützlichen Beitrag:

    nobby_nobbs (17.03.2009)

  4. #3
    Registriert seit
    12.02.2008
    Beiträge
    31
    Danke
    3
    Erhielt 3 Danke für 3 Beiträge

    Standard

    tausend Dank aus einem Gottverlassenen Hotel in Regensburg...

    In der Simu funktionierts, bin ziemlich sicher das es Morgen auf der Anlage auch funktioniert...

  5. #4
    Registriert seit
    30.03.2005
    Beiträge
    2.096
    Danke
    0
    Erhielt 673 Danke für 541 Beiträge

    Standard

    3 Initialisierung von Zeichenketten

    Stringvariable lassen sich, wie andere Variablen auch, bei der Deklaration der Parameter von Funktionsbausteinen (FBs) mit konstanten Zeichenfolgen initialisieren.

    Bei den Parametern von Funktionen (FCs) ist keine Initialisierung möglich.

    Werden temporäre Variable (in VAR bei FCs und in VAR_TEMP bei FCs und FBs) vom Typ STRING z. B. zur Zwischenspeicherung von Ergebnissen benötigt, dann müssen diese in jedem Fall vor ihrer erstmaligen Verwendung mit einer Stringkonstanten beschrieben werden. Hierdurch wird der korrekte Stringaufbau sichergestellt.

    Beispiel:

    FUNCTION Test : STRING[45]

    VAR
    x : STRING[45];
    END_VAR

    x := 'a';
    x := concat (in1 := x, in2 := x);
    Test := x;

    END_FUNCTION

    Ohne die Initialisierung x := 'a'; würde die Funktion ein falsches Ergebnis liefern.
    ID403867 String-Handling mit S7-SCL

    Gruß Kai

  6. #5
    Registriert seit
    30.03.2005
    Beiträge
    2.096
    Danke
    0
    Erhielt 673 Danke für 541 Beiträge

    Standard

    Siehe auch das folgende Programmbeispiel für die LEFT-Funktion in S7-SCL:

    http://www.sps-forum.de/showpost.php...35&postcount=7

    http://www.sps-forum.de/showpost.php...36&postcount=8

    Gruß Kai

  7. #6
    Registriert seit
    12.02.2008
    Beiträge
    31
    Danke
    3
    Erhielt 3 Danke für 3 Beiträge

    Standard

    hat geklappt...

    es reichte:
    Code:
    l_temp_string:='';
    zur initialisierung...

    nochmals herzlichen dank...

  8. #7
    Registriert seit
    18.03.2008
    Beiträge
    267
    Danke
    3
    Erhielt 26 Danke für 26 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Hier sei noch eines angemerkt:

    Vorsicht mit den String-Funktionen von Step7 - die brauchen saumässig Lokaldaten. Besonders auf ner 300er wo die den Lokaldaten Stack nicht einstellen kannst, biste schnell mal am Limit.

    Ich empfehle dir, mal in den Referenzdaten den Aufrufbaum zu studieren, wie viel Lokaldatenstack du braucht.

    Wenn du kurze Stings hast, dann kannst du mit PreCompiler Befehlen den Lokaldatenstack der Stringfunktionen massiv reduzieren.

Ähnliche Themen

  1. Multiinstanz FB funktioniert nicht
    Von Bär1971 im Forum Simatic
    Antworten: 16
    Letzter Beitrag: 12.03.2010, 08:14
  2. MMC funktioniert nicht
    Von MesSen-Nord im Forum Simatic
    Antworten: 3
    Letzter Beitrag: 23.10.2008, 11:06
  3. IM360 funktioniert nicht ?!?
    Von Wassermann im Forum Simatic
    Antworten: 5
    Letzter Beitrag: 29.10.2006, 12:00
  4. TTY-Wandler an 921 funktioniert nicht
    Von Atlantik im Forum Simatic
    Antworten: 0
    Letzter Beitrag: 11.06.2006, 07:21
  5. TD 200 C funktioniert nicht
    Von -Andrea- im Forum Simatic
    Antworten: 2
    Letzter Beitrag: 14.04.2005, 20:41

Lesezeichen

Berechtigungen

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