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

Ergebnis 1 bis 8 von 8

Thema: String aufteilen in S7

  1. #1
    Registriert seit
    17.03.2008
    Beiträge
    5
    Danke
    0
    Erhielt 0 Danke für 0 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Hallo zusammen,

    Gibt es eigentlich eine mögichkeit in einem SPS Programm ein String, der Kommas als Trennzeichen beinhaltet, die einzelnen Teile in einen Array oder in Variablen zu speichern.

    Wäre spitze wenn es da eine Möglichkeit gäbe.
    Habe über Google bisher leider nichts passendes gefunden.

    Gruß
    Manuel
    Zitieren Zitieren String aufteilen in S7  

  2. #2
    Registriert seit
    08.08.2007
    Ort
    Dresden
    Beiträge
    9.648
    Danke
    1.059
    Erhielt 2.046 Danke für 1.627 Beiträge

    Standard

    STRING-Variablen vergleichen: FC 10, FC 13, FC 15, FC 19, FC 24, FC 29
    STRING-Variable bearbeiten: FC 21, FC 20, FC 32, FC 26, FC 2, FC 17, FC 4, FC 31, FC 11

    findest du unter IEC-Funktionen und die einzelnen Beschreibungen über das bekannte Drücken von F1
    Geändert von vierlagig (14.05.2008 um 10:25 Uhr)
    [SIGNATUR]
    Ironie setzt Intelligenz beim Empfänger voraus.
    [/SIGNATUR]

  3. #3
    Registriert seit
    24.05.2006
    Beiträge
    234
    Danke
    14
    Erhielt 77 Danke für 57 Beiträge

    Standard

    Gibt's nicht als fertigen Baustein vom großen S - aber es spricht doch nichts dagegen so was zu proggen und hier vielleicht der Allgemeinheit zur Verfügung zu stellen?
    Vergleichbares gibt's in anderen Programmiersprachen durchaus als fertige Codebausteine und in Step7 bietet sich für die dann notwendige Stringsuche (nach dem ",") z.B. der IEC Baustein FC11 "FIND" an (oder ein selbstgeschriebener, indirekt adressiert arbeitender Bytevergleich).

    Viel Erfolg!

  4. #4
    meef ist offline Neuer Benutzer
    Themenstarter
    Registriert seit
    17.03.2008
    Beiträge
    5
    Danke
    0
    Erhielt 0 Danke für 0 Beiträge

    Standard

    Danke für die Schnellen antworten.

    Ich hab mir mal folgendes überlegt.
    Man könnte doch (wie von hovonlo beschrieben) über den FC11 "FIND" die Stelle des Kommas feststellen. Dann über FC20 "LEFT" bis zu dieser stelle auslesen und in einen Array speichern, als letzes dann den gearde gelesen teil mit FC4 "DELETE" löschen. Dann das ganze von vorne bis der Komplete String verarbeitet ist.

    Wäre das so möglich? Oder gibts noch was einfachers?

  5. #5
    Registriert seit
    22.03.2007
    Ort
    Detmold (im Lipperland)
    Beiträge
    11.728
    Danke
    398
    Erhielt 2.406 Danke für 2.002 Beiträge

    Standard

    ... genau so würde ich es machen ...
    Vielleicht aber nicht unbedingt in AWL, aber das geht auch auf jeden Fall.

    Wichtig anzumerken an dieser Stelle ist noch :
    ALLE Siemens-FC's arbeiten NUR mit initialisierten Strings - das heißt, dass die deklarierte Länge und die tatsächliche Länge des Strings in dessen Header eingetragen sein muss (Auch bei einem leeren String !)..

    Gruß
    LL

  6. #6
    meef ist offline Neuer Benutzer
    Themenstarter
    Registriert seit
    17.03.2008
    Beiträge
    5
    Danke
    0
    Erhielt 0 Danke für 0 Beiträge

    Standard

    würdest du es in SCL machen?

    Wo und wie kann ich die Strings initialisieren und wie wird das in den Header eingetragen?

  7. #7
    Registriert seit
    22.03.2007
    Ort
    Detmold (im Lipperland)
    Beiträge
    11.728
    Danke
    398
    Erhielt 2.406 Danke für 2.002 Beiträge

    Standard

    Ich würde das in SCL machen ... das ist dann einfach ein bißchen übersichtlicher ...

    Strings haben immer einen Header (die beiden ersten Bytes desselben). Erzeugst du (z.B.) in einem DB einen String mit der Länge 10 Zeichen, dann werden 12 Bytes belegt. Diese ersten beiden Bytes müssen bei einem "neuen" String beschrieben werden. In Byte 0 schreibst du die max. Länge des String (im aktuellen Fall 10) und in Byte 1 die tatsächliche Länge (im aktuellen Fall ist es ein Leerstring - also 0). Das ginge dann so :
    Code:
    String steht im DB1 ab Byte 0
     
    L 10
    T DB1.DBB0
    L 0
    T DB1.DBB1
    oder in SCL :
    Code:
    myString := "" ;
    Gruß
    LL

  8. #8
    Registriert seit
    27.05.2004
    Ort
    Thüringen/Berlin
    Beiträge
    12.224
    Danke
    533
    Erhielt 2.698 Danke für 1.950 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Hier mal ein kleines Beispiel in SCL:

    Code:
    FUNCTION_BLOCK FB7
    
    Title = 'Auftrag'
    //
    // Auftragstrennung
    // Zerlegung des Auftragsfiles
    // in seine einzelnen Bestandteile
    // Im File trennt ';' die 
    // einzelnen Positionen voneinander
    // 
    Version : '1.0'
    author  : Ralle
    name    : AUFTRAG
    family  : SYSTEM
    
    VAR_INPUT
      // Eingangsparameter
      Auftrag: STRING[200];
    END_VAR
    
    VAR_OUTPUT // Ausgangsparameter
      Car_id_No: STRING[7];
      Kind_of_production: STRING[4];
      IO_Flag: STRING[2];
      Sachnummer: STRING[10];
      OPS_Kennung: STRING[3];
      Auftrag_Order_No: STRING[8];
      Part_Number_1: STRING[8];
      Part_Number_2: STRING[8];
      Part_Number_3: STRING[8];
      Part_Number_4: STRING[8];
      Part_Number_5: STRING[8];
      Part_Number_6: STRING[8];
      Part_Number_7: STRING[8];
      Part_Number_8: STRING[8];
    
    END_VAR
    
    VAR_TEMP
        // temporäre Variablen
      Pos: INT;
      SuchString: STRING;
      Length: INT;
    END_VAR
    
    // Anweisungsteil
    SuchString := ';';
    Length := 0;
    
    Pos :=                  FIND(IN1 := Auftrag, IN2 := SuchString);
    Car_id_No :=            MID(IN := Auftrag ,L := Pos-1 ,P := 1);
    Auftrag :=              DELETE(IN := Auftrag, L := Pos + Length, P := 1);
    
    Pos :=                  FIND(IN1 := Auftrag, IN2 := SuchString);
    Kind_of_production :=   MID(IN := Auftrag ,L := Pos-1 ,P := 1);
    Auftrag :=              DELETE(IN := Auftrag, L := Pos + Length, P := 1);
    
    Pos :=                  FIND(IN1 := Auftrag, IN2 := SuchString);
    IO_Flag :=              MID(IN := Auftrag ,L := Pos-1 ,P := 1);
    Auftrag :=              DELETE(IN := Auftrag, L := Pos + Length, P := 1);
    
    Pos :=                  FIND(IN1 := Auftrag, IN2 := SuchString);
    Sachnummer :=           MID(IN := Auftrag ,L := Pos-1 ,P := 1);
    Auftrag :=              DELETE(IN := Auftrag, L := Pos + Length, P := 1);
    
    Pos :=                  FIND(IN1 := Auftrag, IN2 := SuchString);
    OPS_Kennung :=          MID(IN := Auftrag ,L := Pos-1 ,P := 1);
    Auftrag :=              DELETE(IN := Auftrag, L := Pos + Length, P := 1);
    
    Pos :=                  FIND(IN1 := Auftrag, IN2 := SuchString);
    Auftrag_Order_No :=     MID(IN := Auftrag ,L := Pos-1 ,P := 1);
    Auftrag :=              DELETE(IN := Auftrag, L := Pos + Length, P := 1);
    
    Pos :=                  FIND(IN1 := Auftrag, IN2 := SuchString);
    Part_Number_1 :=        MID(IN := Auftrag ,L := Pos-1 ,P := 1);
    Auftrag :=              DELETE(IN := Auftrag, L := Pos + Length, P := 1);
    
    Pos :=                  FIND(IN1 := Auftrag, IN2 := SuchString);
    Part_Number_2 :=        MID(IN := Auftrag ,L := Pos-1 ,P := 1);
    Auftrag :=              DELETE(IN := Auftrag, L := Pos + Length, P := 1);
    
    Pos :=                  FIND(IN1 := Auftrag, IN2 := SuchString);
    Part_Number_3 :=        MID(IN := Auftrag ,L := Pos-1 ,P := 1);
    Auftrag :=              DELETE(IN := Auftrag, L := Pos + Length, P := 1);
    
    Pos :=                  FIND(IN1 := Auftrag, IN2 := SuchString);
    Part_Number_4 :=        MID(IN := Auftrag ,L := Pos-1 ,P := 1);
    Auftrag :=              DELETE(IN := Auftrag, L := Pos + Length, P := 1);
    
    Pos :=                  FIND(IN1 := Auftrag, IN2 := SuchString);
    Part_Number_5 :=        MID(IN := Auftrag ,L := Pos-1 ,P := 1);
    Auftrag :=              DELETE(IN := Auftrag, L := Pos + Length, P := 1);
    
    Pos :=                  FIND(IN1 := Auftrag, IN2 := SuchString);
    Part_Number_6 :=        MID(IN := Auftrag ,L := Pos-1 ,P := 1);
    Auftrag :=              DELETE(IN := Auftrag, L := Pos + Length, P := 1);
    
    Pos :=                  FIND(IN1 := Auftrag, IN2 := SuchString);
    Part_Number_7 :=        MID(IN := Auftrag ,L := Pos-1 ,P := 1);
    Auftrag :=              DELETE(IN := Auftrag, L := Pos + Length, P := 1);
    
    Pos :=                  FIND(IN1 := Auftrag, IN2 := SuchString);
    Part_Number_8 :=        MID(IN := Auftrag ,L := Pos-1 ,P := 1);
    Auftrag :=              DELETE(IN := Auftrag, L := Pos + Length, P := 1);
    
    ;
    END_FUNCTION_BLOCK
    Aber Achtung, Stinggeschichten bei S7 verbraten enorm viel Lokaldatenstak, dieser Baustein benötigt alleine 285 Byte. Da ist bei kleinen CPU ganz schnell Schluß, bei 318 (Speed7) kann man die Aufteilung der Lokaldaten verändern, da geht dann mehr.
    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

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

    DasRallum (09.04.2015)

Ähnliche Themen

  1. Regler aufteilen auf 2 Regelventile
    Von Poldi007 im Forum Simatic
    Antworten: 2
    Letzter Beitrag: 03.05.2010, 14:29
  2. Int in Hi - und Lowbyte aufteilen
    Von Pepper im Forum Programmierstrategien
    Antworten: 7
    Letzter Beitrag: 25.03.2010, 11:09
  3. Materialliste im WSCAD aufteilen
    Von moneybrother im Forum E-CAD
    Antworten: 3
    Letzter Beitrag: 16.10.2008, 10:26
  4. Programme aufteilen?
    Von Stromer im Forum Programmierstrategien
    Antworten: 15
    Letzter Beitrag: 01.03.2007, 17:45
  5. Simatic - Themenbereich aufteilen
    Von volker im Forum Stammtisch
    Antworten: 8
    Letzter Beitrag: 09.12.2005, 10:07

Lesezeichen

Berechtigungen

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