String aufteilen in S7

meef

Level-1
Beiträge
5
Reaktionspunkte
0
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
 
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
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
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!
 
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?
 
... 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
 
Ich würde das in SCL machen ... das ist dann einfach ein bißchen übersichtlicher ...:p

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
 
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.
 
Zurück
Oben