TIA SPLIT Funktion

Zuviel Werbung?
-> Hier kostenlos registrieren
Habe ich, habe ich auch verstanden. Nur kann man am Eingang SrcArray, ja nur ein Array of Char verschalten. Von daher geht an den Separatoren ja immer nur Char. Daher vorstehe ich nicht, warum der Eingang als Variant deklariert ist und warum Siemens hier so unflexibel ist
OK, das artet jetzt etwas in Klugscheißerei aus, aber als Quelle kann ein ARRAY OF CHAR oder ein ARRAY OF WCHAR angegeben werden, darum sind die Separatoren vom Typ Variant.
 
Dann brauchst du auch die Split-Funktion nicht und kannst es gleich händisch machen :D.
Der Code würde mich dazu dann doch interessieren.


Zu der angesprochenen Schleife hier ein ungetestetes Beispiel:

Code:
REPEAT
    #POS := FIND(IN1 := #myString, IN2 := '//');
    IF #POS > 0 THEN
        #myString := REPLACE(IN1 := #myString, IN2 := '/', L := 2, P := #POS);
    ELSE
        EXIT;
    END_IF;
UNTIL #POS <= 0
END_REPEAT;
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Jetzt funktioniert es. Bekomme zwar immer zwischen den Zwei / Zeichen einen leeren String ausgegeben, aber wenn man das so löst wie Zotos es geschrieben hat könnte tatsächlich etwas sinnvolles dabei raus kommen.
Versteh nur nicht, warum Siemens mir immer mein Leben so schwer machen muss.

Screenshot 2024-06-27 084843.png
 
Da schreiben Leute an der Software rum die noch nie was mit Automatisierung zu tun hatten... Da kommt halt schon mal so was "verdrehtes" bei rum;)
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Der Code würde mich dazu dann doch interessieren.


Zu der angesprochenen Schleife hier ein ungetestetes Beispiel:

Code:
REPEAT
#POS := FIND(IN1 := #myString, IN2 := '//');
IF #POS > 0 THEN
#myString := REPLACE(IN1 := #myString, IN2 := '/', L := 1, P := #POS);
ELSE
EXIT;
END_IF;
UNTIL #POS <= 0
END_REPEAT;

Dein Code ist fast richtig. bei L der Länge was ersetzt werden soll muss eine 2 hin. Ansonsten hast du dir eine Dauerschleife gebastelt.
 
Dank eurer Hilfe habe ich es jetzt hinbekommen.
Vielen Dank euch. Manchmal echt schade, dass so einfach Sachen so kompliziert sein müssen.

#sTemp := "IDB_St4_Graphitplatten".fb_Handscanner.sData;
REPEAT
#iPos := FIND(IN1 := #sTemp, IN2 := '//');
IF #iPos > 0 THEN
#sTemp := REPLACE(IN1 := #sTemp, IN2 := '/', L := 2, P := #iPos);
ELSE
EXIT;
END_IF;
UNTIL #iPos <= 0
END_REPEAT;

Screenshot 2024-06-27 091513.png

So sieht das jetzt aus.


Also vielen Dank euch nochmal und einen schönen Tag.

Gruß Dennis
 
Zuviel Werbung?
-> Hier kostenlos registrieren
ich bekomme von einem Keyence Handscanner aus einem Datamatrix-Code ein Array of Char.
Dieses sieht z.B. wie folgt aus wenn man es in einen String wandelt: '600638-1970-000//03//521022//5647375$R'
Ich möchte Dieses Array nun in mehrere Strings aufteilen. Als Separator sind die "//" vorhanden, der EndSeparator ist "$R"
Ich meine, die SLIT-Funktion kann überhaupt nur mit einem Zeichen als Separator umgehen, nicht mit 2 Zeichen (da geht als Datentyp Char sowieso nur 1 Zeichen). Das macht aber überhaupt nichts. Bei Angabe von RecSeparator = '/' sollte das Char-Array '600638-1970-000//03//521022//5647375$R' in 7 Strings zerlegt werden:
'600638-1970-000'
''
'03'
''
'521022'
''
'5647375$R'

(ob der EndSeparator '$R' im letzten String drin bleibt oder entfernt wird, weiß ich jetzt nicht)

Jetzt funktioniert es. Bekomme zwar immer zwischen den Zwei / Zeichen einen leeren String ausgegeben
Das ist halt genau die Funktion des Split und auch sinnvoll so.

Versteh nur nicht, warum Siemens mir immer mein Leben so schwer machen muss.
Das ist doch gar nicht kompliziert, man muss nur die Split-Funktion verstehen.

Dank eurer Hilfe habe ich es jetzt hinbekommen.
Vielen Dank euch. Manchmal echt schade, dass so einfach Sachen so kompliziert sein müssen.
Warum wandelst/kopierst du dein Empfangs-Array irgendwo in String und dann wieder in CHar-Array? Das Strg_TO_Chars sollte völlig unnötig sein. Kannst du am Split nicht direkt das Empfangs-Array angeben?
 
Warum wandelst/kopierst du dein Empfangs-Array irgendwo in String und dann wieder in CHar-Array? Das Strg_TO_Chars sollte völlig unnötig sein. Kannst du am Split nicht direkt das Empfangs-Array angeben?
Um mit Replace aus den zwei '//' ein '/' Zeichen zu machen. und dann kann ich den SPLIT Baustein "sauber" benutzen ohne einen Leerstring zu haben.
 
Um mit Replace aus den zwei '//' ein '/' Zeichen zu machen. und dann kann ich den SPLIT Baustein "sauber" benutzen ohne einen Leerstring zu haben.
Das Replace ist völlig unnötig. Der Split-Baustein funktioniert trotzdem "sauber". Du weisst doch schon vorher, dass der 2. und 4. und 6. String ein leerer String sein wird - die kannst du doch einfach ignorieren/nicht verwenden (oder zur Format-Überprüfung der empfangenen Nachricht verwenden, ob denn wirklich an den erwarteten Stellen jeweils '//' enthalten waren).

Genauso funktioniert auch Split in VBS z.B. beim Einlesen von csv-Dateien. Da kommt es nur darauf an, dass die richtige Anzahl Separatoren in einer Zeile sind. Ob zwischen den Separatoren noch ein Wert oder ein Leerzeichen oder nichts ist, ist für das Split egal. Dadurch können Werte zwischen den Separatoren weggelassen werden, und trotzdem verschieben sich die folgenden Werte nicht, weil die Zuordnung der Werte zu Variablen durch die Anzahl Separatoren davor eindeutig bleibt.
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich finde es nicht schön, wenn da leere Strings sind. Aber so hat jeder eben andere Geschmäcker :P von dem her lasse ich es jetzt so. Aber trotzdem danke für deine Info´s.
 
Du könntest auch Keyence mitteilen, dass du das "nicht schön" findest, dass da '//' enthalten sind ;) Es ist aber nun mal so, und man kann das '//' auch einfach so interpretieren, dass das 2 Separatoren '/' mit nichts dazwischen sind.
 
Wenn dann müsste ich mich bei meinem Kunden beschweren. von denen kommt der Datamatrix-Code. Ich hab mir jetzt selbst einen Baustein mit dem SPLIT-Baustein geschrieben, wo man egal wie groß einen Separator angeben kann und man bekommt die Strings schön hintereinander raus.
Es funktioniert und never change a running system 😅
 
Zurück
Oben