String auftrenen

focus81

Level-1
Beiträge
22
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo zusammen,

ich habe ein Problem mit einem String in Siemens S7.
Und zwar enthält der String 3 verschiedene Variablen die durch ein ; getrennt sind. Ich benötige jede Variable einzeln da diese von eine Kamera kommen und ich sie in der SPS auswerten muss, was wie ich finde noch erschwerend hinzukommt ich muss das ganze in AWL machen.

Ach ja der String ist nicht immer gleich lang.

ich habe mich mal mit einem Block_move und dem Find Baustein versucht bekomme aber im Find nur Schrott raus.

Ich wollte dann anschließend mit dem FC20 left und dann mit FC 4 Delet den String auseinander nehmen aber momentan scheitere ich schon am Anfang.


ich hoffe es kann mir jemand helfen.
 

Anhänge

  • gif1.gif
    gif1.gif
    45,4 KB · Aufrufe: 82
Hallo,
ich denke du hast schon die richtigen Routinen - nur nicht die richtige Vorgehensweise.
Bei einem String ist die Initialisierung und der Header das Wichtigste.
Bei der Initialisierung wird im String-Header (die ersten 2 Bytes des Strings) die tatsächliche Länge und die deklarierte Länge desselben eingetragen. Steht hier nichts oder nicht das Richtige drin, so arbeiten die Siemens-FC's schon mal gar nicht.
Für den Blockmove solltest du berücksichtigen, dass du beim Kopieren den Header entweder mitkopierst oder ihn nachträglich passend erzeugst (z.B. nach dem Ausschneiden).

Das Ganze ist in AWL allerdings nicht so besonders toll zu machen.
Besser wäre es, hierfür SCL (falls vorhanden) einzusetzen.

Gruß
Larry
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Danke für die schnell Antwort,

es beruhigt mich das ich wenigstens auf dem richtigen Weg bin.


Aber was ich nicht weiß, ist wie ich die tatsächliche Länge bei einem variablen String raus bekomme?
 
Der string kommt Ursprünglich von einer Kammera und ich verbunden über das cp 343-1 lean.

dan nutze ich den Kommunikations Baustein FC6 bekomme aber über den LEN nicht rein.

Von dem mal abgesehen habe ich die beideb Bytes mal von HAnd beschrieben und zwar das 0 Byte mit 22 und das 1 Byte mit 17 solange war der String, aber ich bekomme immer noch den gleichen schrott beim find raus.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich würde das eher von Hand (in AWL) machen, bin bei Strings und Standard-Bausteinen immer gescheitert.

Du kannst doch den String nach ; durchsuchen, dazwischen stehen deine Variablen. Beim CR ist dein String dann zuende.
 
... jetzt erst mal Eins nach dem Anderen ...

Dein Receive-Baustein sollte dir die Anzahl der empfangenen Zeichen liefern.

Für den FC-FIND muß der Suchstring, genau wie der Quellstring, auch initialsiert sein (also beide Längen-Angaben).
Was leifert dir der FIND denn als Resultat zurück und wie sieht dein Quellstring aus ?

Gruß
Larry
 
der find liefer 5140 zurück

mein Quellen-String sieht so aus 3.6;89.0;219.6END Header Byte 0:22 Byte 1:17
der suchString sieht so aus ; Header Byte 0:22 Byte 1:1
Der such String ist auf 22 initialisiert.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
der find liefer 5140 zurück

mein Quellen-String sieht so aus 3.6;89.0;219.6END Header Byte 0:22 Byte 1:17
der suchString sieht so aus ; Header Byte 0:22 Byte 1:1
Der such String ist auf 22 initialisiert.

Header Byte 0 = Maximale Länge String = 22 Zeichen

Header Byte 1 = Aktuelle Länge String = 17 Zeichen

Gruß Kai
 
Zuviel Werbung?
-> Hier kostenlos registrieren
du nimmst einen Pointer und durchsuchst den String Zeichen für Zeichen
(nach dem Header) :
-Ablegen der Zeichen in einen DB
-findest du ein ; dann ist die Variable vollständig -> Umwandeln ASCII -> REAL
- gleiches für 2. und 3. Variable
- findest du ein CR, ist Schluß

Ich mache das lieber ohne Systembausteine, dann kann das auch für anders aufgebaute Zeichenketten verwendet werden und man braucht nicht SW schreiben, nur damit es für die Systembausteine passt.
 
Naja ... das macht der Find ja auch.
Und irgendwann kommt man dann ja vielleicht doch um die String-Routinen nicht mehr drum herum.

Ich würde erstmal zusehen, dass der FIND mir ein sinnvolles Ergebnis liefert - und das kann er nur, wenn sowohl der QuellString wie auch der SuchString korrekt und sinnvoll initialisiert sind ...

Gruß
Larry
 
du nimmst einen Pointer und durchsuchst den String Zeichen für Zeichen
(nach dem Header) :
-Ablegen der Zeichen in einen DB
-findest du ein ; dann ist die Variable vollständig -> Umwandeln ASCII -> REAL
- gleiches für 2. und 3. Variable
- findest du ein CR, ist Schluß

Ich mache das lieber ohne Systembausteine, dann kann das auch für anders aufgebaute Zeichenketten verwendet werden und man braucht nicht SW schreiben, nur damit es für die Systembausteine passt.

Bin gerade auch dabei einen String zu zerlegen. Mit den Siemens Bausteinen bekomme ich aber nicht ichtiges zustande, die Idee mit de Pointer scheint mir besser zu funktionieren. Kannst du mir mal nen Ansatz zeigen wie du das realiseren würdest?
Wäre echt super.

Gruß Zimbo
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,
ich würde das nicht mit Pointern machen - sorry ...
Was willst du denn genau machen, wie machst du es und was funktioniert denn nicht so richtig ?

Gruß
Larry
 
Habe einen mit verschiedenen Daten einer Pelletsanlage. Ein String mit 200 Zeichen wird hier eingelesen. Wenn der String ja immer gleich wäre könnte ich mir direkt die Bytes holen aber dem ist nicht so. Die unterschiedlichen Werte sind durch ein Leerzeichen getrennt. Habe mit dem Find schon versucht ein Leerezeichen zu suchen aber bekomme keine Rückmeldung. Initialisert habe ich den String auch mit der maximlane Länge und der aktuellen Länge(mit LEN Baustein). Sind halt schon jeden Menge Daten

GRüße Zimbo
 
Habe einen mit verschiedenen Daten einer Pelletsanlage. Ein String mit 200 Zeichen wird hier eingelesen. Wenn der String ja immer gleich wäre könnte ich mir direkt die Bytes holen aber dem ist nicht so. Die unterschiedlichen Werte sind durch ein Leerzeichen getrennt. Habe mit dem Find schon versucht ein Leerezeichen zu suchen aber bekomme keine Rückmeldung. Initialisert habe ich den String auch mit der maximlane Länge und der aktuellen Länge(mit LEN Baustein). Sind halt schon jeden Menge Daten

GRüße Zimbo

Kann ich nicht nachvollziehen. Ich habe mit:

Code:
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);

...

lange Strings getrennt.
Mit Find suchst du das nächste Leerzeichen (in meinem Beispiel das ";" ), mit Mid kopierst du des gewünschte, mit Delete schneidest du es weg, um im Reststring weiter zu suchen. So etwas geht natürlich am besten in SCL.
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Sorry für die verspätete Antwort,
ich denke mein problem liegt am Initialisieren des Suchstrings.
Ich möchte nach einem Leerzeichen suchen, d.H doch ich muß
eine 20 in den String schreiben, oder? Die Maximale Länge beim header wäre doch 1 und die tatsächliche Länge auch 1 oder sehe ich das falsch?

Gruß
 
Hallo,
das Leerzeichen hat den Wert Dez.32 oder Hex.20 - je nachdem welches Format du bevorzugst.
Bezüglich des Headers stimmt es so, wie du schreibst ...

Gruß
Larry
 
Super, funktoniert. Ich bekomme die richtige Stelle im FIND angezeigt.
Jetzt muß ich das Teil noch komolett zerlegen. schon genial wie Ralle das in SCL realisiert hat. Muß ich wohl nun auch mit SCL auseinder setzen,
mal sehen ob das was wird :)

Grüße
 
Zurück
Oben