MID-FC in SCL funktioniert nicht

nobby_nobbs

Level-1
Beiträge
31
Reaktionspunkte
3
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
 
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 := '                        ';
 
Zuletzt bearbeitet:
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
 
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.
 
Zurück
Oben