String mit Kommagetrennten Werten splitten

KAmatzeWA
2015-02-13
2016-01-27
  • KAmatzeWA - 2015-02-13

    Hallo, ich möchte gerne eine String-Variable teilen.
    Sie beinhaltet Komma getrennte Werte wie das folgende Beispiel.

    a1234,1234,1234,125,87,0100,0100,0100,0100,0100,0100,0100,0100,0100x

    Dieser String beinhaltet 14 Istwerte, also von a beginnend bis zum 1 Komma und dann
    von Komma zu Komma. Das x ist Telegramm Ende. Wäre Sau cool wenn es da jemand
    gibt der mir da auf die Sprünge hilft.

    MFG Matze

     
  • Erik Böhm - 2015-02-17

    Moin

    mit FIND Position des 1. Kommas suchen
    Das was davor kommt ist Ergebnis 1.
    Dieses wegkopieren und anschliessend mit DELETE bis zur Position des 1. Kommas löschen.

    Das ganze 14 mal wiederholen, bzw. bis zum Stringende.
    ca. 5 Zeilen...

    Gruß Erik

     
  • Pitsch - 2016-01-27

    Hallo

    Ne Moglichkeit wäre so:

    Im Deklarationsfenster:
    FUNCTION_BLOCK Splitter
    VAR_INPUT
       Trig:BOOL;
       InpStr : STRING;
       Separator : STRING := ',';
       Reset : BOOL;
    END_VAR
    VAR_OUTPUT
       Q1: ARRAY[0..10] OF STRING;
    END_VAR
    VAR
       FeldIndex: INT := 0;
       (*SplitAray[0..10] : STRING;*)
       Temp1:STRING;
       DelLaenge: INT;
       VarExit: BOOL;
       ArrIsInit: BOOL;
       Flanke1:BOOL;
       Flanke2 : BOOL;
       i: INT;
    END_VAR
    
    Im Programmfenster:
    IF Trig = TRUE AND Flanke1 = FALSE THEN  (*Bei Positiver Flanke am Trig-Eingang*)
       (*Prüfen, ob Daten vorhanden, Separator angegeben, Array nicht initialisiert und Reset nicht aktiv.*)
       IF InpStr <> '' AND Separator <> ''  AND ArrIsInit = FALSE AND Reset = FALSE THEN
          Temp1 := InpStr; (*Zeichenkette, sicherheitshalber umkopieren, befor sie manipuliert wird.*)
           WHILE VarExit = FALSE DO (*Alle <Separator-getrennte Blöcke durchlaufen*)
             DelLaenge := FIND(Temp1,Separator); (*Die Länge, des zu bearbeitenden Zeichenketten-Abschnittes ermitteln*)
             Q1[FeldIndex] := LEFT(Temp1, DelLaenge - LEN(Separator)); (*Sämtliche gefundene Blöcke, minus die Separatorzeichen, im Array eintragen*)
             IF DelLaenge = 0 AND Temp1 <> '' THEN (*Wenn kein Separator mehr gefunden wird, aber noch Zeichen einzutragen sind*)
                Q1[FeldIndex] := Temp1; (*Den Zeichenketten-Rest noch im Array eintragen*)
                ArrIsInit := TRUE; (*Array-Initialisierungs-Merker setzen*)
                VarExit := TRUE; (*Exit-Merker, zu verlassen der Suchschleife setzen*)
             END_IF
             FeldIndex := FeldIndex + 1; (*Array-Feld-Index um eins erhöhen*)
             Temp1 := DELETE(Temp1, DelLaenge, 1); (*Beginnend mit dem ersten Zeichen, DelLaenge Zeichen löschen. Die Zeichenkette wird also kürzer*)
            END_WHILE
          Temp1 := ''; (* Sicherstellen, das Temp1, keine Zeichen mehr enthält. Ist eigentlich überflüssig, da in Zeile 4, ein eventueller Rest, überschrieben wird.*)
       END_IF
    END_IF
    Flanke1 := Trig; (*Flankenmerker zurücksetzen*)
    (*Das Ganze resetten*)
    IF Reset = TRUE AND Flanke2 = FALSE THEN (*Bei Positiver Flanke am Reset-Eingang*)
       ArrIsInit := FALSE;  (*Array-Initialisierungs-Merker zurücksetzen. Wird bei erneuter Initialisierung, wieder gesetzt.*)
       VarExit := FALSE; (*Exit-Merker, zu verlassen der Suchschleife zurücksetzen. Sonst wird die Schleife, nie durchlaufen*)
       FeldIndex := 0; (*FeldIndex zurücksetzen, damit die nächsten Eintragungen wieder bei 0 beginnen.*)
       FOR i := 0 TO 10 DO (*Array, Feld um Feld den Inhalt löschen. Das Array bleibt leer erhalten*)
          Q1[i] := ''; (*Feldinhalt mit einem Leerstring überschreiben (Löschvorgang)*)
       END_FOR
    END_IF
    Flanke2 := Reset; (*Flankenmerker zurücksetzen*)
    

    Wichtig, ist noch, dass Du das Array gross genug dimensionierst!
    Viel Spass beim ausprobieren.

    Mit freundlichen Grüssen! Pitsch

     

Log in to post a comment.