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

Seite 1 von 4 123 ... LetzteLetzte
Ergebnis 1 bis 10 von 31

Thema: SCL Stringzerlegung

  1. #1
    Registriert seit
    16.03.2004
    Beiträge
    173
    Danke
    11
    Erhielt 0 Danke für 0 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Hallo

    Ich bekomme aus einer Presse einen verketteten Ergebnissstring:
    "123.4$r$l3456.78$r$l-T -Z"

    Die Trennzeichen ($r$l) können an ihrer Position variieren je nachdem wieviele Stellen die Zahle davor hat.
    Ich muss nun den verketteten String so zerlegen, das am Ende die Einzelnen Zahlen in REAL ausgegeben werden und der letzte Block als String.

    Ich hätte an SCL gedacht bin aber auf SCL absoluter Neuling. Kann mir da wer weiterhefen?

    Besten Dank
    Thomas
    greetings from upper austria

    ... merlin ...
    Zitieren Zitieren SCL Stringzerlegung  

  2. #2
    Registriert seit
    29.08.2006
    Beiträge
    195
    Danke
    0
    Erhielt 35 Danke für 21 Beiträge

    Standard

    du findest alle hierzu nötigen bausteine in der open source library oscat
    die funktion find_nun and find_nonum dienen dazu zahlen und nicht zahlenzeichen zu suchen.
    die lib kannst du downloaden unter www.oscat.lib

  3. #3
    Registriert seit
    07.03.2004
    Beiträge
    4.369
    Danke
    946
    Erhielt 1.158 Danke für 831 Beiträge

    Standard

    Oh das macht keinen Spaß ;o(

    Ich habe eben mal kurz versucht was zu bauen und bin über das $ gestolpert das ist bei den String-Konstanten ein Escape Zeichen und und hat mein Experiment vereitelt. Aber ansich ist die Aufgabe nicht wild. Kannst auch in der Hilfe von SCL unter FIND, LEN, LEFT, RIGHT nachlesen.
    If you open your Mind too much, your Brain will fall out.

  4. #4
    Registriert seit
    22.03.2007
    Ort
    Detmold (im Lipperland)
    Beiträge
    11.718
    Danke
    398
    Erhielt 2.400 Danke für 2.000 Beiträge

    Standard

    Hallo,
    ich hoffe das zumindestens Grundkenntnisse vorhanden sind.

    Du brauchst dafür nicht die Oscat-Lib, Siemens kann das alles auch ...
    Ich würde grundsätzlich so vorgehen:
    Hilfs-Strings für den Gesamt-String und alle Teil-Variablen anlegen.
    Quell-String in Hilfs-String 1 kopieren.
    Diesen mittels FIND nach dem 1. "$"-Zeichen durchsuchen.
    Ab der zurück-gelieferten Position den linken Teil des Strings mit LEFT abschneiden und in die 1. Teil-Variable kopieren und den rechten Teil des Strings in eine neue Hilfs-Variable kopieren.
    Mit dieser dann verfahren wie vorher ...

    Das ist auf jeden Fall ein bißchen Probiererei, aber durchaus zu schaffen ...

    Gruß
    LL

  5. #5
    Registriert seit
    20.06.2003
    Ort
    Sauerland.NRW.Deutschland
    Beiträge
    4.850
    Danke
    78
    Erhielt 800 Danke für 543 Beiträge

    Standard

    rechten Teil des Strings in eine neue Hilfs-Variable kopieren.
    Mit dieser dann verfahren wie vorher ...
    nicht ganz. das erste zeichen ist dann ja das $.
    also 4 zeichen später beginnen (gibts unter scl mid ? )bzw right(reststring,stringlaenge-4)
    .
    mfg Volker .......... .. alles wird gut ..

    =>Meine Homepage .. direkt zum Download

    Meine Definition von TIA: Total Inakzeptable Applikation

  6. #6
    Registriert seit
    22.03.2007
    Ort
    Detmold (im Lipperland)
    Beiträge
    11.718
    Danke
    398
    Erhielt 2.400 Danke für 2.000 Beiträge

    Standard

    Zitat Zitat von volker Beitrag anzeigen
    nicht ganz. das erste zeichen ist dann ja das $.
    also 4 zeichen später beginnen (gibts unter scl mid ? )bzw right(reststring,stringlaenge-4)
    Ein bißchen Spaß mußt du Merlin natürlich auch noch lassen ...

  7. #7
    Registriert seit
    07.03.2004
    Beiträge
    4.369
    Danke
    946
    Erhielt 1.158 Danke für 831 Beiträge

    Standard

    Also ich stell mal einen Ansatz hier rein.

    Ich behaupte nicht das es der einfachste Weg ist und an den kniffligen Stellen fehlen auch noch Kommentare ;o( Aber gerade das Wandeln von STRING nach Real habe ich mit den Step7 Boardmitteln auf die Schnelle nicht besser hinbekommen.

    Code:
    FUNCTION FC10 : VOID
    VAR_INPUT
      S             :STRING[40];
      Token         :STRING[5];
    END_VAR
    
    VAR_OUTPUT
      T1_real       :REAL;
      T2_real       :REAL;
      T3_string     :STRING[40];
    END_VAR
    
    VAR_TEMP
      myString      :STRING[40];
      myToken       :STRING[5];
      myPos         :INT;
      myTeil_1      :STRING[40];
      myTeil_2      :STRING[40];
      myTeil_3      :STRING[40];  
      myINT_1       :INT;  
      myINT_2       :INT;    
    END_VAR
      (* Strings Initialisieren *)
      myString      :='';
      myToken       :='';
      myTeil_1      :='';
      myTeil_2      :='';
      myTeil_3      :='';
    
      (* Eingangs Variablen in Temp Kopieren *)
      myString := S;      //'555.4_r_l3456.78_r_l-T -Z';
      myToken  := Token;  //'_r_l';
    
      (* Erste Zahl ausschneiden / String *)
      myPos := FIND(IN1:=myString, IN2:=myToken);
      myTeil_1 := LEFT(IN:=myString, L:=myPos - 1);  
      
      myString := RIGHT(IN:=myString, L:=LEN(myString) - myPos - LEN(S:=myToken) + 1);
    
      (* Erste Zahl ausschneiden / String *)
      myPos := FIND(IN1:=myString, IN2:=myToken);
      myTeil_2 := LEFT(IN:=myString, L:=myPos - 1);  
    
      (* Rest des Strings Abschneiden *)
      myTeil_3 := RIGHT(IN:=myString, L:=LEN(myString) - myPos - LEN(S:=myToken) + 1);  
      T3_string := myTeil_3;
      
      (* Erste Zahl *)
      (* Teil vor dem Dezimalpunkt Kopieren und in INT wandeln *)
      myPos := FIND(IN1:=myTeil_1, IN2:='.');
      myString := LEFT(IN:=myTeil_1, L:=myPos - 1);  
      myINT_1 := STRNG_I(myString);
      (* Teil nach dem Dezimalpunkt Kopieren und in INT wandeln *)
      myString := RIGHT(IN:=myTeil_1, L:= LEN(myTeil_1) - myPos);  
      myINT_2 := STRNG_I(myString);
      (* Aus den zwei INT teilen einen Real basteln *)
      T1_real := ((INT_TO_REAL(myINT_1) * EXPD(LEN(myString)))  +  INT_TO_REAL(myINT_2)) / EXPD(LEN(myString)) ;
    
      (* Zweite Zahl *)
      (* Teil vor dem Dezimalpunkt Kopieren und in INT wandeln *)
      myPos := FIND(IN1:=myTeil_2, IN2:='.');
      myString := LEFT(IN:=myTeil_2, L:=myPos - 1);  
      myINT_1 := STRNG_I(myString);
      (* Teil nach dem Dezimalpunkt Kopieren und in INT wandeln *)
      myString := RIGHT(IN:=myTeil_2, L:= LEN(myTeil_2) - myPos);  
      myINT_2 := STRNG_I(myString);
      (* Aus den zwei INT teilen einen Real basteln *)  
      T2_real := ((INT_TO_REAL(myINT_1) * EXPD(LEN(myString)))  +  INT_TO_REAL(myINT_2)) / EXPD(LEN(myString)) ;
    END_FUNCTION
    If you open your Mind too much, your Brain will fall out.

  8. Folgender Benutzer sagt Danke zu zotos für den nützlichen Beitrag:

    jck0815 (09.11.2010)

  9. #8
    Registriert seit
    01.02.2008
    Beiträge
    28
    Danke
    2
    Erhielt 0 Danke für 0 Beiträge

    Standard

    Hallo,

    bin gerade auf den Thread gestoßen, um ihn für Nachfolgende zu vervollständigen:

    Zitat Zitat von zotos Beitrag anzeigen
    Aber gerade das Wandeln von STRING nach Real habe ich mit den Step7 Boardmitteln auf die Schnelle nicht besser hinbekommen.
    IEC-Standardfunktionen für STRING-Variable:
    Mit den IEC-Standardfunktionen FC5, FC16, FC30, FC37, FC38 und FC39 können Sie Variablen im DINT-Format in eine Zeichenkette und umgekehrt umwandeln.
    1. FC5 DI_STRNG: Umwandlung einer Variable vom Typ DINT in eine Variable vom Typ STRING,
    2. FC16 I_STRNG: Umwandlung einer Variable vom Typ INT in eine Variable vom Typ STRING,
    3. FC30 R_STRNG: Umwandlung einer Variable vom Typ REAL in eine Variable vom Typ STRING,
    4. FC37 STRNG_DI: Umwandlung einer STRING-Variablen in eine Variable vom Typ DINT,
    5. FC38 STRNG_I: Umwandlung einer STRING-Variablen in eine Variable vom Typ INT,
    6. FC39 STRNG_R: Umwandlung einer STRING-Variablen in eine Variable vom Typ REAL.

    Weitere Informationen finden Sie auch in unserem Beitrag "Welche Standardfunktionen von STEP 7 gibt es bezüglich Umwandlung und Vergleich von STRING-Variablen bzw. ASCII-Zeichen?" unter der Beitrags-ID: 10913338.


    Grüße

  10. #9
    Registriert seit
    30.03.2011
    Beiträge
    25
    Danke
    10
    Erhielt 0 Danke für 0 Beiträge

    Standard

    Zitat Zitat von zotos Beitrag anzeigen
    Also ich stell mal einen Ansatz hier rein.

    Ich behaupte nicht das es der einfachste Weg ist und an den kniffligen Stellen fehlen auch noch Kommentare ;o( Aber gerade das Wandeln von STRING nach Real habe ich mit den Step7 Boardmitteln auf die Schnelle nicht besser hinbekommen.

    Code:
    FUNCTION FC10 : VOID
    VAR_INPUT
      S             :STRING[40];
      Token         :STRING[5];
    END_VAR
    
    VAR_OUTPUT
      T1_real       :REAL;
      T2_real       :REAL;
      T3_string     :STRING[40];
    END_VAR
    
    VAR_TEMP
      myString      :STRING[40];
      myToken       :STRING[5];
      myPos         :INT;
      myTeil_1      :STRING[40];
      myTeil_2      :STRING[40];
      myTeil_3      :STRING[40];  
      myINT_1       :INT;  
      myINT_2       :INT;    
    END_VAR
      (* Strings Initialisieren *)
      myString      :='';
      myToken       :='';
      myTeil_1      :='';
      myTeil_2      :='';
      myTeil_3      :='';
    
      (* Eingangs Variablen in Temp Kopieren *)
      myString := S;      //'555.4_r_l3456.78_r_l-T -Z';
      myToken  := Token;  //'_r_l';
    
      (* Erste Zahl ausschneiden / String *)
      myPos := FIND(IN1:=myString, IN2:=myToken);
      myTeil_1 := LEFT(IN:=myString, L:=myPos - 1);  
      
      myString := RIGHT(IN:=myString, L:=LEN(myString) - myPos - LEN(S:=myToken) + 1);
    
      (* Erste Zahl ausschneiden / String *)
      myPos := FIND(IN1:=myString, IN2:=myToken);
      myTeil_2 := LEFT(IN:=myString, L:=myPos - 1);  
    
      (* Rest des Strings Abschneiden *)
      myTeil_3 := RIGHT(IN:=myString, L:=LEN(myString) - myPos - LEN(S:=myToken) + 1);  
      T3_string := myTeil_3;
      
      (* Erste Zahl *)
      (* Teil vor dem Dezimalpunkt Kopieren und in INT wandeln *)
      myPos := FIND(IN1:=myTeil_1, IN2:='.');
      myString := LEFT(IN:=myTeil_1, L:=myPos - 1);  
      myINT_1 := STRNG_I(myString);
      (* Teil nach dem Dezimalpunkt Kopieren und in INT wandeln *)
      myString := RIGHT(IN:=myTeil_1, L:= LEN(myTeil_1) - myPos);  
      myINT_2 := STRNG_I(myString);
      (* Aus den zwei INT teilen einen Real basteln *)
      T1_real := ((INT_TO_REAL(myINT_1) * EXPD(LEN(myString)))  +  INT_TO_REAL(myINT_2)) / EXPD(LEN(myString)) ;
    
      (* Zweite Zahl *)
      (* Teil vor dem Dezimalpunkt Kopieren und in INT wandeln *)
      myPos := FIND(IN1:=myTeil_2, IN2:='.');
      myString := LEFT(IN:=myTeil_2, L:=myPos - 1);  
      myINT_1 := STRNG_I(myString);
      (* Teil nach dem Dezimalpunkt Kopieren und in INT wandeln *)
      myString := RIGHT(IN:=myTeil_2, L:= LEN(myTeil_2) - myPos);  
      myINT_2 := STRNG_I(myString);
      (* Aus den zwei INT teilen einen Real basteln *)  
      T2_real := ((INT_TO_REAL(myINT_1) * EXPD(LEN(myString)))  +  INT_TO_REAL(myINT_2)) / EXPD(LEN(myString)) ;
    END_FUNCTION
    Moin,

    Ich hätte eine Frage zu dem LEFT.

    Ich versuche gerade xml file (SAP IDOC) nach einem XML Tag zu durchsuchen.

    Was würde mypos dann ausgeben ist das die Anfangs oder Endposition?

    Das was dort zwischen den Tags steht ist dann z.B. "03-04" wie krieg ich jeweils die ersten beiden Zeichen also 03 und 04 getrennt in zwei Variablen?

    Wäre euch wirklich dankbar wenn Ihr einem Noob wie mir helfen könntet

  11. #10
    Registriert seit
    27.05.2004
    Ort
    Thüringen/Berlin
    Beiträge
    12.222
    Danke
    533
    Erhielt 2.697 Danke für 1.949 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Zitat Zitat von Aslof Beitrag anzeigen
    Moin,

    Ich hätte eine Frage zu dem LEFT.

    Ich versuche gerade xml file (SAP IDOC) nach einem XML Tag zu durchsuchen.

    Was würde mypos dann ausgeben ist das die Anfangs oder Endposition?

    Das was dort zwischen den Tags steht ist dann z.B. "03-04" wie krieg ich jeweils die ersten beiden Zeichen also 03 und 04 getrennt in zwei Variablen?

    Wäre euch wirklich dankbar wenn Ihr einem Noob wie mir helfen könntet
    Deine Frage ist nicht ganz verständlich, da wir deinen XML-code ja nicht kennen.

    mypos gibt gar nichts aus, sondern find sucht nach einem bestimmten Zeichen oder einer Zeichenkette und gibt dann mit mypos das erste Auftreten dieser Zeichenkette an. Das findest du, wenn du, wenn du in der Standard-Library unter IEC-Functions die Funktion Find markierst und dann "F1" drückst.

    Die Funktion FC 11 liefert die Position der zweiten Zeichenkette (IN2) innerhalb der ersten Zeichenkette (IN1). Die Suche beginnt links; es wird das erste Auftreten der Zeichenkette gemeldet. Ist die zweite Zeichenkette in der ersten nicht vorhanden, wird Null zurückgemeldet. Die Funktion meldet keine Fehler.
    PS: und hier noch Left:

    Die Funktion FC 20 liefert die ersten L Zeichen einer Zeichenkette. Ist L größer als die aktuelle Länge der STRING*Variable, wird der Eingangswert zurückgeliefert. Bei L = 0 und bei einem Leerstring als Eingangswert wird ein Leerstring zurückgeliefert. Ist L negativ wird ein Leerstring ausgegeben und das BIE*Bit auf "0" gesetzt.
    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

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

    Aslof (03.05.2011)

Lesezeichen

Berechtigungen

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