FB Strings in VAR_OUTPUT zurückgeben

vo13

Level-1
Beiträge
31
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,
hier meine Problemstellung:

Einem FB wird ein String z.B. '123;345;12' übergeben.
Semikolon ist als Trennung zwischen den Einzelstrings definiert.
Der FB soll einzelne Strings zurückgeben, also String1='123', String2='345' usw.
Die Anzahl der zurückgelieferten Strings ist undefiniert.
Es kann also auch nur '333' als String dem FB übergeben werden.

Hat jemand eine brauchbare Lösung? Evtl. mit Pointer?

Ich verwende TwinCat 3.
Danke für eure Hilfe.
 
Kannst du ganz einfach mit einer Schleife lösen. Schleife so lange durchlaufen bis kein Semikolon gefunden wurde. Jedes mal wenn du ein ; findest den String dort trennen und auf eine Ausgangsvariable schreiben. Anschließend den String links des ; ablöschen und das Spielchen von vorne.

Code:
PROGRAM PLC_PRG
VAR
 ErstesSemikolon : INT;
 stringvariable : STRING := '123;444;233333;4444;';
 i : INT ;
 Ausgabgestring : ARRAY [0..MAX_OUTPUTSTRINGS] OF STRING;
END_VAR
VAR CONSTANT
 MAX_OUTPUTSTRINGS : INT := 10;
END_VAR

FOR i := 0 TO MAX_OUTPUTSTRINGS DO
  (* ; suchen*)
  ErstesSemikolon := FIND(stringvariable, ';');

  (* STRING trennen*)
  Ausgabgestring[i] := MID(stringvariable, ErstesSemikolon-1, 1); (* Erste Semikolon Pos minus 1 um das Semikolon abzutrennen *)


(* String um bereits ausgegebenen Bereich kürzen*)
stringvariable := MID(stringvariable, LEN(stringvariable) - (ErstesSemikolon+1), ErstesSemikolon+1);

(* Prüfen ob noch MIN ein ; zu finden ist sonst Schleife beenden *)
IF FIND(stringvariable, ';') = 0 THEN
EXIT;
END_IF;

END_FOR;

Wichtig ist, am Ende muss auch ein ; stehen.
 
Man kann die Strings in einem Array ablegen und die Anzahl in einer Variable Speicher. Das Array und die Variable kann man der Übersicht halber auch in einer Struktur zusammenfassen. Allerdings muss die Größe des Arrays im Vorfeld festgelegt werden. Es sollte also eine ungefähre Vorstellung geben wie viele Strings maximal zu erwarten wären.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Man könnte als Resultat auch eine verkettete Liste zurückgeben. So ist man völlig unabhängig von der Anzahl.
Das ist je nach Anwendung aber ein bisschen übertrieben. Deshalb meine Frage, was man mit diesen einzelnen Strings tun will.
 
Es handelt sich hier ja um die Split-Funktion. In der Umsetzung würde ich die Variante von MasterOhh favourisieren. Ich kann mir nicht vorstellen, dass die (maximale) Anzahl der Teilkomponenten des Vorgabestrings nicht schon prinzipiell feststeht.

Gruß
Larry
 
Hallo zusammen,
vielen Dank für eure Anregungen.
Sind auf jeden Fall sinnvoll und habe sie auch bereits umgesetzt. Danke nochmal.

Ich habe jetzt die Anzahl der Strings auf max. 32 begrenzt.
Meine Idee war, einen FB aufzurufen mit einem StringArray von z.B. 8 zu übergeben.
Im FB soll dann der Übergabestring in 8 Einzelstring aufgeteilt werden.
Aber im FB VAR_OUT muss das StringArray auch auf seine Größe definiert werden.
Habe gedacht das geht irgendwie mit pointer.

Mit einer Begrenzung auf 32 Strings ists ok.
Danke für Eure Hilfe.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Wie bereits gesagt, würde es auch dynamisch funktionieren. Es ist halt ein bisschen aufwändig (verkettete Liste).

Aber nochmals:
Was machst Du schlussendlich mit diesen Teilstrings?

Denn eine andere Variante wäre, dass Du eine Funktion erstellst, welchem neben dem
aufzuteilenden String, noch eine Startposition (ab der gelesen werden soll), mitgegeben wird.
Dann könntest Du die Teilstrings via einer Schleife auslesen und wärst auch komplett unabhängig
von der Anzahl Teilstrings (in der Funktion).

Bsp des Aufrufs:
bPos:= 0;
bStringNr:= 1;
REPEAT
Result[bStringNr]:= GetStringPart( ADR(sSourceString), ADR(bPos) );
bStringNr:= bStringNr + 1;
UNTIL ( bPos = 0) END_REPEAT

Am Schluss stehen die Teilstrings im Array Result.
Der Vorteil ist, dass die Funktion selber total unabhängig ist von der Anzahl Teilstrings.
 
Teile des Strings werden an einen Drucker geschickt, andere in LREAL umgwandelt und für Endpositionen einer rotorischen Achse verwendet.
Sicherlich kann man das alles in einem FB und mit globalne Variablen lösen, jedoch war für mich interessant, ob es mit einem FB und VAR_OUTPUT ein Möglichkeit gibt, unabhängig der Anzahl eines Arrays die Variablen zurückzugeben.
 
Genau für Deinen Fall würde meine Lösung Sinn machen:
Ich verwende halt keinen FB sondern nur eine Funktion (GetStringPart), da ein FB hier überflüssig ist, da nichts bis zum nächsten Aufruf gespeichert werden muss.
Wie kommst Du auf globale Variablen?

Innerhalb der REPEAT ... UNTIL Schleife könntest Du die unterschiedlichen Verarbeitungsschritte einbauen.
 
Zurück
Oben