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

Seite 1 von 3 123 LetzteLetzte
Ergebnis 1 bis 10 von 23

Thema: String zählen

  1. #1
    Registriert seit
    02.09.2008
    Beiträge
    61
    Danke
    9
    Erhielt 0 Danke für 0 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Hallo,

    ich habe ein Problem.

    Folgende Situation ich möchte in einen String mit einer länge von 100 Zeichen eine Anzahl Zählen.
    Das heißt wenn die Zeichenfolge = FCG möchte ich ein Ergebniss (INT) 1 haben, wenn es 2 mal vorkommt eine 2 und so weiter.

    Ich möchte dies in SCL machen. Weiß aber nicht so genau wie ich anfangen soll. Dachte da so an neh FOR Schleife oder ist das quatsch.

    Würde mich freuen wenn mir einer helfen kann.

    Danke schon mal dafür.
    Zitieren Zitieren String zählen  

  2. #2
    jensel ist offline Benutzer
    Themenstarter
    Registriert seit
    02.09.2008
    Beiträge
    61
    Danke
    9
    Erhielt 0 Danke für 0 Beiträge

    Standard

    Hallo,

    ich habe ein Problem.

    Folgende Situation ich möchte in einen String mit einer länge von 100 Zeichen eine Anzahl Zählen.
    Das heißt wenn die Zeichenfolge = FCG möchte ich ein Ergebniss (INT) 1 haben, wenn es 2 mal vorkommt eine 2 und so weiter.

    Ich möchte dies in SCL machen. Weiß aber nicht so genau wie ich anfangen soll. Dachte da so an neh FOR Schleife oder ist das quatsch.

    Würde mich freuen wenn mir einer helfen kann.

    Danke schon mal dafür.
    Zitieren Zitieren String  

  3. #3
    Registriert seit
    24.02.2009
    Beiträge
    1.244
    Danke
    23
    Erhielt 276 Danke für 235 Beiträge

    Standard

    Na da bietet sich doch die Funktion "Find" an. Mit der kannst du einen String auf das vorhandensein eines anderen Strings untersuchen. "Find" liefert dabei die Position zurück an der sich dein gesuchter String befindet. Ist Find = 0 wurde nichts gefunden.

    Da "Find" aber nur bis zu ersten Treffer sucht, du aber wissen willst ob die Zeichenfolge mehrfach vorkommt, musst du etwas basteln. Du kannst z.B. den ersten Teil des zu durchsuchenden Strings (einschließlich des ersten Treffers) löschen und es dann nochmal mit "Find" versuchen. Das machst du so oft bis entweder eine 0 zurück kommt oder du am Ende des Strings angekommen bist.

    Schau dir einfach mal die String- Funktionen für SCL an.

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

    jensel (21.02.2013)

  5. #4
    Registriert seit
    27.05.2004
    Ort
    Thüringen/Berlin
    Beiträge
    12.263
    Danke
    537
    Erhielt 2.708 Danke für 1.957 Beiträge

    Beitrag

    Kommt ein wenig darauf an.
    Wenn nicht zu viele Vorkommen der Zeichenkette im String sind, bietet sich eine Schleife an. Wenn es dann zuviel Zuykluszeit verbrät, muß man das Ganze auf mehrere Zyklen aufteilen.
    Wenn du z.Bsp. keine Schleife machst und in jedem Zyklus 1 Mal suchst, bis su durch bist, kann das ein deinem Beispiel im Extremfall 33 mal sein, bei 10ms sind das dann 330ms, bis ein Ergebnis vorliegt.

    Zum Weg:
    1. Du kannst die in SCL vorhandenen Stringfunktionen nutzen.

    Code:
    1. Find:  Suchen der Zeichenkette, die Position des 1. Vorkommens wird dir ausgegeben
    2. Zähler hochzählen
    3. Right: mit der Position der Fundstelle + Länge des Suchstrings als L und dem String als Input 
              liefert es einen neuen String ab dem Ende des 1. Vorkommens des Suchstrings
    4. Len:   die Länge des zurückgegebenen Strings prüfen. Ist die Länge < 3, dann bist du fertig, ist sie größer, 
              dann in der nachsten Runde wieder bei 1 anfangen, aber als Inputstring den, in 3 zurückgelieferten Reststring verwenden. 
    2. Du kannst das selbst machen, in einer Schleife von 1-100

    Code:
    1. Zeiger für die "Zeichenposition" auf 1 stellen
    2. "Anzahl der Vorkommen" auf 0 stellen
    
    Hier beginnt die Schleife
    3. Zeichen an "Zeigerposition" des Strings lesen und vergleichen, ob 'F' darin steht
       wenn nein, weiter mit 7.  
       wenn ja, dann  
    4. Zeichen an "Zeigerposition" + 1 des Strings lesen und vergleichen, ob 'C' darin steht 
       wenn nein, weiter mit 7.
       wenn ja dann 
    5. Zeichen an "Zeigerposition" + 2 des Strings lesen und vergleichen, ob 'G' darin steht  
       wenn nein, dann weiter mit 7.
       wenn ja, dann
    6. Zeichenfolge wurde gefunden, "Anzahl der Vorkommen" um 1 erhöhen,
       "Zeichenposition" um 2 erhöhen, dann weiter mit 7.
    
    7. "Zeichenposition" um 1 erhöhen
    8. Prüfen ob "Zeichenposition" > 97
       wenn nein, dann Sprung zu 3.
       wenn ja, dann Schleife fertig, Ergebnis steht in Anzahl der Vorkommen
    Hier endet die Schleife
    
    Das wäre mal die Vorgehensweise.

    Wenn du einen SCL-Baustein anlegst, kannst du im SCL-Editor die Hilfe aufrufen und findest über die Suche detaillierte Hilfen zu Find, Right und auch zu Schleifen.
    Geändert von Ralle (20.02.2013 um 19:34 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

  6. Folgender Benutzer sagt Danke zu Ralle für den nützlichen Beitrag:

    jensel (21.02.2013)

  7. #5
    Registriert seit
    27.05.2004
    Ort
    Thüringen/Berlin
    Beiträge
    12.263
    Danke
    537
    Erhielt 2.708 Danke für 1.957 Beiträge

    Standard

    @jensel

    Bitte ein Thema nur einmal einstellen, ich habe die deinen beiden mal zusammengeführt!
    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

  8. #6
    jensel ist offline Benutzer
    Themenstarter
    Registriert seit
    02.09.2008
    Beiträge
    61
    Danke
    9
    Erhielt 0 Danke für 0 Beiträge

    Standard

    Hi danke für die schnelle Hilfe hab mich gefreut.
    @ralle wollte den 2 löschen hab es aber nicht hin bekommen !!

    Ich finde deine 1. Idee gut mit dem zähler hab aber noch neh frage dazu ich würde das jetzt so machen für die erste prüfung aber wie mache ich weiter ??

    A:=FIND(STRING1,'FCG');
    B:=RIGHT(STRING1,A);
    C:=LEN(STRING1)
    IF B < 1 THEN ZAHL:= ZAHL + 1;
    ??
    C < 3 THEN ???

    muß ich jetzt die Anweisungen 66 mal schreiben??
    Zitieren Zitieren Dankefür die schnellen antworten  

  9. #7
    Registriert seit
    27.05.2004
    Ort
    Thüringen/Berlin
    Beiträge
    12.263
    Danke
    537
    Erhielt 2.708 Danke für 1.957 Beiträge

    Standard

    ok, ich hab das mal ausprobiert,

    Right ist hier nicht das Richtige, wir nehmen Delete!

    Code:
    FUNCTION_BLOCK FB104
    VAR_INPUT
        Start               : BOOL;
        String1             : STRING;
    END_VAR
    VAR_OUTPUT
        Anzahl              : INT;
        Ready               : BOOL;
    END_VAR
    VAR_IN_OUT  
    END_VAR
    VAR_TEMP
        // temporäre Variablen
        A, B             : INT;
    END_VAR
    VAR
        // statische Variablen
        String2             : STRING := '';
        FPStart_intern      : BOOL;
        HM_FPStart_intern   : BOOL;
        Start_intern        : BOOL;
    END_VAR
    
    
    FPStart_Intern := Start AND NOT HM_FPStart_intern;
    HM_FPStart_intern := Start;  
    
    
    //Startwerte setzen
    IF FPStart_intern THEN
        STRING2 := '';              //STRING2 initialisieren
    //    STRING2 := String1;         //String 1 in String 2 kopieren
        STRING2 := CONCAT(IN1 := String1    // IN: STRING
                         ,IN2 := ' '        // IN: STRING
                         );                 // STRING
    
    
        Anzahl := 0;                //Anzahl auf Startwert;
        Ready := False;             //Fertigmeldung zurücksetzen
        Start_intern := true;       //Start setzen
    END_IF;
        
    IF Start_intern THEN
        //Suchen des Suchstrings
        A := FIND(IN1 := STRING2    // IN: STRING
                 ,IN2 := 'FCG'      // IN: STRING
                 ); // INT
        IF A <> 0 THEN
            //von Position 1 bis zum Fundort + 2 (Fundort ist Zeichen 1 des Suchstrings) löschen 
            String2 := DELETE(IN := String2 // IN: STRING
                             ,L := (A+2)    // IN: INT
                             ,P := 1        // IN: INT
                             );             // STRING
             
            Anzahl := Anzahl + 1;
            //Stringlänge bestimmen
            B := LEN(S := STRING2 // IN: STRING
                    ); // INT
            IF B < 3 THEN
                //endgültiges Ende der Suche, da String kürzer als die 3 gesuchten Zeichen
                Ready := TRUE;
                Start_Intern := False;
            END_IF;
        ELSE
            //endgültiges Ende der Suche, da Suchstring nicht gefunden
            Ready := TRUE;
            Start_Intern := False;
        END_IF;
    END_IF;
                 
        
        
    END_FUNCTION_BLOCK
    Achtung, du brauchst aus der Standard-Library/IEC-Funktion

    FC21 - LEN
    FC11 - FIND
    FC4 - DELETE
    FC2 - CONCAT

    den FB wie folgt aufrufen:

    Code:
          CALL  FB   104 , DB104
           Start  :=M1.0
           String1:=DB105.String1
           Anzahl :=MW2
           Ready  :=M1.1
    Im DB105 habe ich einfach eine Variable vom Typ String angelegt.
    Wenn es denn unbedingt 100 Zeichen sein müssen, dann lege einen String[100] an, String1 und String2 im FB104 dann bitte auch so ändern.

    PS: Tigerente hat mich darauf hingewiesen, dass das letzte 'FCG', das in einem String 'FCG' oder 'FCG....FCGFCG' steht nicht mitgezählt wird.
    Daher habe ich die grün markierte Zeile, durch die rot markierten ersetzt. Durch das Anhängen eines Leerzeichens funktioniert auch dieser Sonderfall, offenbar ist da ein Fehler in der Siemens-Bibliothek bei "Find"!
    Geändert von Ralle (22.02.2013 um 23:16 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

  10. #8
    Registriert seit
    29.04.2012
    Beiträge
    195
    Danke
    13
    Erhielt 42 Danke für 37 Beiträge

    Standard

    Eigentlich schon frech, dass der Find nicht ab Position x suchen kann.

    Mich würde mal interessieren, ob die Schleife schneller ist. In etwa:
    Code:
    found := 0;
    FOR #i := 1 TO LenString-LenSearch DO
        FOR #j := 1 TO LenSearch DO
            IF SearchIn[i+j-1] <> SearchFor[j] THEN
                Exit;
            END_IF;
        END_FOR;
        IF j = LenSearch THEN
            found = found +1;
        END_IF;
    END_FOR;

  11. #9
    Registriert seit
    29.03.2004
    Beiträge
    5.797
    Danke
    144
    Erhielt 1.707 Danke für 1.239 Beiträge

    Standard

    Das wäre ja die andere Lösung die Ralle vorgeschlagen hat.
    Zugriff auf einzelne Zeichen eines Strings mit Arrayindex ist aber nicht direkt möglich. Dazu bräuchte man eine AT-Sicht auf den String.
    Die Variante mit den Stringfunktionen ist auf jeden Fall ein richtiger Zykluszeitvernichter, zumindest wenn man sie mit den mitgelieferten Funktionen umsetzen will.

  12. #10
    Registriert seit
    27.05.2004
    Ort
    Thüringen/Berlin
    Beiträge
    12.263
    Danke
    537
    Erhielt 2.708 Danke für 1.957 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Zitat Zitat von Thomas_v2.1 Beitrag anzeigen
    Das wäre ja die andere Lösung die Ralle vorgeschlagen hat.
    Zugriff auf einzelne Zeichen eines Strings mit Arrayindex ist aber nicht direkt möglich. Dazu bräuchte man eine AT-Sicht auf den String.
    Die Variante mit den Stringfunktionen ist auf jeden Fall ein richtiger Zykluszeitvernichter, zumindest wenn man sie mit den mitgelieferten Funktionen umsetzen will.
    Richtig, deshalb habe ich das ja auch nicht in einer For- oder While-Schleife gemacht, sondern pro Zyklus immer nur ein Vorkommen des Suchstrings gesucht. Es dauert also für 8 Vorkommen, 8 SPS-Zyklen.

    @Pipboy

    Diese Variante habe ich in ähnlicher Form auch schon einmal genutzt, den Zugriff habe ich dann nicht über eine AT-Ansicht (das kannte ich damals noch nicht), sondern über den direkten Zugriff in den DB mit dem String erledigt.

    Ich denke auch, die Schleife wäre schneller.
    Geändert von Ralle (22.02.2013 um 06:51 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

Ähnliche Themen

  1. Konstante String in Variable String schreiben
    Von sailor im Forum Simatic
    Antworten: 8
    Letzter Beitrag: 07.12.2009, 18:01
  2. Antworten: 13
    Letzter Beitrag: 24.09.2009, 12:54
  3. Int na. String und String zusammensetzen
    Von bastler im Forum Simatic
    Antworten: 9
    Letzter Beitrag: 09.11.2008, 20:29
  4. Ein String kopieren in einen anderen String
    Von CanYouHelpMe im Forum Simatic
    Antworten: 3
    Letzter Beitrag: 25.09.2008, 17:21
  5. STRING aus einzelnen STRING's zusammenstellen
    Von ollibolli im Forum Simatic
    Antworten: 6
    Letzter Beitrag: 23.08.2006, 09:39

Lesezeichen

Berechtigungen

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