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

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

Thema: FB Strings in VAR_OUTPUT zurückgeben

  1. #1
    Registriert seit
    22.08.2013
    Beiträge
    31
    Danke
    4
    Erhielt 0 Danke für 0 Beiträge

    Standard


    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.
    Zitieren Zitieren FB Strings in VAR_OUTPUT zurückgeben  

  2. #2
    Registriert seit
    07.06.2007
    Beiträge
    142
    Danke
    2
    Erhielt 24 Danke für 24 Beiträge

    Standard

    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.

  3. #3
    Registriert seit
    25.02.2010
    Beiträge
    570
    Danke
    34
    Erhielt 110 Danke für 100 Beiträge

    Standard

    Die Anzahl der zurückgelieferten Strings ist undefiniert.
    Das könnte zum Problem werden, da du ein Array nicht dynamisch verwalten kannst.

  4. #4
    Registriert seit
    11.07.2011
    Beiträge
    65
    Danke
    0
    Erhielt 4 Danke für 4 Beiträge

    Standard

    Was willst Du denn mit diesen einzelnen Strings machen?

  5. #5
    Registriert seit
    24.02.2009
    Beiträge
    1.229
    Danke
    22
    Erhielt 274 Danke für 234 Beiträge

    Standard

    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.
    Sänd from mei Kombjudder mitse Dastadurr.

  6. #6
    Registriert seit
    11.07.2011
    Beiträge
    65
    Danke
    0
    Erhielt 4 Danke für 4 Beiträge

    Standard

    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.

  7. #7
    Registriert seit
    22.03.2007
    Ort
    Detmold (im Lipperland)
    Beiträge
    11.409
    Danke
    392
    Erhielt 2.342 Danke für 1.949 Beiträge

    Standard

    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

  8. #8
    vo13 ist offline Benutzer
    Themenstarter
    Registriert seit
    22.08.2013
    Beiträge
    31
    Danke
    4
    Erhielt 0 Danke für 0 Beiträge

    Standard

    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.

  9. #9
    Registriert seit
    11.07.2011
    Beiträge
    65
    Danke
    0
    Erhielt 4 Danke für 4 Beiträge

    Standard

    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.

  10. #10
    vo13 ist offline Benutzer
    Themenstarter
    Registriert seit
    22.08.2013
    Beiträge
    31
    Danke
    4
    Erhielt 0 Danke für 0 Beiträge

    Standard


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

Ähnliche Themen

  1. Step 7 Strings verschicken
    Von GerhardPtl im Forum Simatic
    Antworten: 11
    Letzter Beitrag: 13.07.2016, 10:05
  2. Step 7 Any-Pointer aus FC zurückgeben
    Von Jason07 im Forum Simatic
    Antworten: 2
    Letzter Beitrag: 22.09.2014, 15:35
  3. Rockwell License Manager: zurückgeben der Lizenz?
    Von Grimsey im Forum Sonstige Steuerungen
    Antworten: 7
    Letzter Beitrag: 30.10.2013, 15:32
  4. Strings Vergleichen?
    Von Kmann im Forum CODESYS und IEC61131
    Antworten: 13
    Letzter Beitrag: 13.10.2010, 09:11
  5. Strings zusammensetzen
    Von Isha im Forum Simatic
    Antworten: 2
    Letzter Beitrag: 15.01.2008, 18:27

Stichworte

Lesezeichen

Berechtigungen

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