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

Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 12

Thema: SCL: Stringvergleich funktioniert nicht

  1. #1
    Registriert seit
    25.01.2008
    Beiträge
    18
    Danke
    1
    Erhielt 1 Danke für 1 Beitrag

    Standard


    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
    Zitieren Zitieren SCL: Stringvergleich funktioniert nicht  

  2. #2
    Registriert seit
    22.03.2007
    Ort
    Detmold (im Lipperland)
    Beiträge
    11.792
    Danke
    398
    Erhielt 2.416 Danke für 2.012 Beiträge

    Standard

    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

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

    Standard

    Zitat Zitat von Larry Laffer
    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).
    FC10 EQ_STRNG aus den Standard Bibliotek unter IEC Bausteine.
    Jesper M. Pedersen

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

    Larry Laffer (05.08.2011)

  5. #4
    Scanda ist offline Neuer Benutzer
    Themenstarter
    Registriert seit
    25.01.2008
    Beiträge
    18
    Danke
    1
    Erhielt 1 Danke für 1 Beitrag

    Standard

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

  6. #5
    Registriert seit
    27.08.2003
    Ort
    Schweitenkirchen
    Beiträge
    472
    Danke
    101
    Erhielt 73 Danke für 59 Beiträge

    Standard

    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.
    Wenn ich einen meiner Finger in eines deiner Nasenlöcher stecke, haben wir beide nen Finger in der Nase

  7. #6
    Registriert seit
    22.03.2007
    Ort
    Detmold (im Lipperland)
    Beiträge
    11.792
    Danke
    398
    Erhielt 2.416 Danke für 2.012 Beiträge

    Standard

    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

  8. #7
    Registriert seit
    29.03.2004
    Beiträge
    5.793
    Danke
    144
    Erhielt 1.706 Danke für 1.238 Beiträge

    Standard

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

    Zitat Zitat von Hilfe zu S7-SCL
    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.

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

    RMA (05.08.2011)

  10. #8
    Registriert seit
    19.12.2008
    Beiträge
    336
    Danke
    19
    Erhielt 28 Danke für 28 Beiträge

    Standard

    ... 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

  11. #9
    Registriert seit
    29.03.2004
    Beiträge
    5.793
    Danke
    144
    Erhielt 1.706 Danke für 1.238 Beiträge

    Standard

    Zitat Zitat von Lupo Beitrag anzeigen
    ... 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
    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.

  12. #10
    Registriert seit
    27.08.2003
    Ort
    Schweitenkirchen
    Beiträge
    472
    Danke
    101
    Erhielt 73 Danke für 59 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    @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.

    Zitat Zitat von Scanda Beitrag anzeigen
    Danke schon mal für die Infos. Der FC10 wird schon mal miterzeugt.
    Zitat Zitat von Thomas_v2.1 Beitrag anzeigen
    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
    Wenn ich einen meiner Finger in eines deiner Nasenlöcher stecke, haben wir beide nen Finger in der Nase

Ähnliche Themen

  1. Datendoppelbyteadresse funktioniert nicht
    Von Kodan im Forum Simatic
    Antworten: 7
    Letzter Beitrag: 26.05.2009, 14:32
  2. MID-FC in SCL funktioniert nicht
    Von nobby_nobbs im Forum Simatic
    Antworten: 6
    Letzter Beitrag: 19.03.2009, 02:14
  3. MMC funktioniert nicht
    Von MesSen-Nord im Forum Simatic
    Antworten: 3
    Letzter Beitrag: 23.10.2008, 11:06
  4. S7 - 200 Unterprogramm funktioniert nicht
    Von godi im Forum Simatic
    Antworten: 6
    Letzter Beitrag: 12.08.2008, 15:00
  5. TD 200 C funktioniert nicht
    Von -Andrea- im Forum Simatic
    Antworten: 2
    Letzter Beitrag: 14.04.2005, 20:41

Stichworte

Lesezeichen

Berechtigungen

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