SCL: Stringvergleich funktioniert nicht

Scanda

Level-1
Beiträge
18
Reaktionspunkte
1
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo, momentan versuche ich ein kleines Programm zu schreiben. Aber irgendwie funktioniert das nicht. Vielleicht könnt ihr mir ja weiterhelfen bzw. seht woran es liegt.

Als INPUT bekomm ich folgende Daten:
Code:
suchobjekt:STRING[10];


Im FB hab ich selber diese Daten gespeichert.
Code:
   daten : ARRAY[1..10] OF STRUCT
        kennnummer : STRING[10];
        zaehler_gasse1 : INT;
        zaehler_gasse2 : INT;
        zaehler_gasse3 : INT;
    END_STRUCT;

Im Programm selber will ich das Array nach diesem String absuchen:
Code:
 FOR i := 1 TO 10 BY 1 DO
  IF (daten[i].kennnummer = suchobjekt) THEN 
  END_IF;
END_FOR;

Sollte ein String nicht vorhanden sein, soll das Programm ihn eintragen:
Code:
 daten[i].kennnummer := suchobjekt;

Ist hier irgendetwas falsch? Kann ich es überhaupt so in SCL programmieren?

Hier nochmal der ganze Baustein:

Code:
FUNCTION_BLOCK FB100
VAR_TEMP
  i:INT;  // Zähler für For-Schleifen
END_VAR

VAR
    daten : ARRAY[1..10] OF STRUCT
        kennnummer : STRING[10];
        zaehler_gasse1 : INT;
        zaehler_gasse2 : INT;
        zaehler_gasse3 : INT;
    END_STRUCT;
END_VAR
//Eingänge
VAR_INPUT
    suchobjekt:STRING[10];
    gasse1_ok:BOOL; //1=OK=Gasse ist betriebsbereit und hat min. 1 leeren Platz
    gasse2_ok:BOOL; //1=OK=Gasse ist betriebsbereit und hat min. 1 leeren Platz
    gasse3_ok:BOOL; //1=OK=Gasse ist betriebsbereit und hat min. 1 leeren Platz
END_VAR
//Ausgänge
VAR_OUTPUT
    zielgasse: INT;
END_VAR
//Programm
  zielgasse:=0; //Rücksetzen der Zielgasse
  
//Nach Kennummer Suchen und eintragen, falls vorhanden 
 FOR i := 1 TO 10 BY 1 DO
  
  IF (daten[i].kennnummer = suchobjekt) THEN 
     //Überprüfen welche Gasse am meisten Typen der gesuchten Kennnummer gelagert hat
     IF (gasse1_ok AND 
        daten[i].zaehler_gasse1 < daten[i].zaehler_gasse2 AND
        daten[i].zaehler_gasse1 < daten[i].zaehler_gasse3) THEN
        zielgasse:=1;
        daten[i].zaehler_gasse1:=daten[i].zaehler_gasse1 +1;
     ELSIF (gasse2_ok AND daten[i].zaehler_gasse2 < daten[i].zaehler_gasse3) THEN
        zielgasse:=2;
        daten[i].zaehler_gasse2:=daten[i].zaehler_gasse2 +1;
     ELSIF (gasse3_ok) THEN
        zielgasse:=3;
        daten[i].zaehler_gasse3:=daten[i].zaehler_gasse3 +1;
     EXIT;
     END_IF;
   END_IF;
END_FOR;

//wenn kein passendes Kennnummer gefunden wurden
IF (zielgasse = 0) THEN
    FOR i := 1 TO 10 BY 1 DO
        IF daten[i].zaehler_gasse1 = 0 AND    //Nach Kennnummer suchen, die in keiner der Gassen eingelagert ist
           daten[i].zaehler_gasse2 = 0 AND
           daten[i].zaehler_gasse3 = 0 THEN
            
           daten[i].kennnummer := suchobjekt;  //Wenn eine nicht mehr eingelagerte Kennummer gefunden, neue Nummer eintragen
           IF gasse1_ok THEN                  //...und Wert für die entsprechende Gasse erhöhen
              daten[i].zaehler_gasse1:=daten[i].zaehler_gasse1 +1;      //Priorität ist hier Gasse 1>2>3
              EXIT;
           END_IF;
           IF gasse2_ok THEN
              daten[i].zaehler_gasse2:=daten[i].zaehler_gasse2 +1;
              EXIT;
           END_IF;
           IF gasse3_ok THEN
              daten[i].zaehler_gasse3:=daten[i].zaehler_gasse3 +1;
              EXIT;
           END_IF;
        END_IF;
   END_FOR;
END_IF;    
   
END_FUNCTION_BLOCK
 
Hallo,
Code:
 FOR i := 1 TO 10 BY 1 DO
  IF (daten[i].kennnummer = suchobjekt) THEN 
  END_IF;
END_FOR;
Diese Sequenz kannst du so nicht machen. Da muss es auf der String-Seite eine Art Compare-FC geben (da ich gerade kein PG etc. da habe kann ich leider Name und Nummer nicht liefern).
Jedenfalls würde dir dieser FC dann entsprechend ein TRUE oder FALSE zurückgeben.
Der Rest sollte so machbar sein ...

Gruß
Larry
 
Code:
FOR i := 1 TO 10 BY 1 DO 
IF (daten[i].kennnummer = suchobjekt) 
THEN    
END_IF; 
END_FOR;
Müsste schon funktionieren, ist bei uns so viele male im Einsatz.
Allerdings müssen die Strings auch auf jeder Stelle gleich sein.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Sorry Zefix.
Dem ist definitiv nicht so.
Das Einzige, dass ich mir vorstellen könnte ist, dass du nur 2-Zeichen-Strings vergleichst ...Es ist aber hierbei so, dass ich darüber irgendwann einmal selber schon gestolpert bin ...

Gruß
Larry
 
In SCL wird das "=" bei Strings automatisch durch den Bausteinaufruf von EQ_STRNG ersetzt.

Hilfe zu S7-SCL schrieb:
Bei den Zeichen und Zeichenketten wird die Länge der Variablen und der numerische Wert eines jeden ASCII-Zeichen zum Vergleich herangezogen.

Der Vergleich bei STRING wird intern durch die Funktionen EQ_STRNG, GE_STRNG, LE_STRNG, GT_STRNG und LT_STRNG der IEC Bibliothek durchgeführt.

Folgende Operanden sind für diese Funktionen nicht zulässig:

Parameter einer FC.

IN_OUT Parameter eines FB vom Typ STRUCT oder ARRAY.
 
... da muss ich Thomas zustimmen. Allerdings scheint das noch nicht sehr lange so zu sein denn ich erinnere mich, auch schon mal darüber gestolpert zu sein :rolleyes:
 
Zuviel Werbung?
-> Hier kostenlos registrieren
... da muss ich Thomas zustimmen. Allerdings scheint das noch nicht sehr lange so zu sein denn ich erinnere mich, auch schon mal darüber gestolpert zu sein :rolleyes:
Es kann schiefgehen wenn man den Baustein ohne SCL-Quelle, oder mit Quelle aber ohne neues Übersetzen in ein Projekt kopiert in dem die Bausteine (xy_STRNG) entweder nicht vorhanden sind oder andere Nummern haben.

Allerdings geht dann die SPS entweder in Stop oder es werden die Fehler-OB aufgerufen und SF Lampe geht an.
 
@Larry,
hier hat er doch schon geschrieben, dass SCL die FC10 mit rein ins projekt holt ;)
Ich kann nur sagen, habs auch immer so gemacht und funktioniert.

Danke schon mal für die Infos. Der FC10 wird schon mal miterzeugt.

Es kann schiefgehen wenn man den Baustein ohne SCL-Quelle, oder mit Quelle aber ohne neues Übersetzen in ein Projekt kopiert in dem die Bausteine (xy_STRNG) entweder nicht vorhanden sind oder andere Nummern haben.

Allerdings geht dann die SPS entweder in Stop oder es werden die Fehler-OB aufgerufen und SF Lampe geht an.

Und möglicherweise ist die SF nicht aufgefallen :rolleyes:
 
Hallo,
tut mir leid, wenn ich da etwas falsches geschrieben habe - Asche auf mein Haupt. Ich muß allerdings sagen, dass ich mir da, aufgrund gemachter Erfahrungen, wirklich sicher war. Um den von Thomas beschriebenen Effekt hatte es sich da bei meinem Projekt aber auch nicht gehandelt.

Wie auch immer - @TE:
Was war denn jetzt das Problem an deinem Script ? Funktionierte es nicht oder warst du dir nur irgendwie unsicher ?

Gruß
Larry
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo, momentan versuche ich ein kleines Programm zu schreiben. Aber irgendwie funktioniert das nicht. Vielleicht könnt ihr mir ja weiterhelfen bzw. seht woran es liegt.

Sind die Strings im Header initialisiert ?
Alle Siemens-FC's funktionieren nur dann sauber, wenn bei den Strings die Header-Daten richtig und überhaupt eingetragen sind. Das ist aber normalerweise ncht der Fall, wenn der String nur irgendwo deklariert und im DB zugewiesen worden ist.
 
Zurück
Oben