AG_Recv /Datenstring Splitten

s_alpen

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

stehe heute vor einem neuen kleinen Problem.
Eine CPU315-2 DP kommuniziert über eine CP343-1 Lean via TCP/IP mit einem anderen Rechner (Andere Station).
Die Kommunikation über AG_SEND und AG_RECV habe ich bereits projektiert und getestet. Alles einwandfrei.
Seit gestern ist noch eine Sache hinzu gekommen, unzwar soll über diese Verbindung ein 16 Zeichen langer DatenString empfangen werden.

Beispielstring: +1+1+1+1+0+0+0+0

'+' dient als Trennzeichen, somit sind es 8 Werte, die aus dem String heraus genommen werden sollen und als Integerwert in eine DB abgelegt werden sollen. Der String wird nach dem empfangen zunächst in dem DB202 abgelegt String[16] Anfangswert: ''.
AG_RECV BAUSTEIN habe ich unter RECV: P#DB201.DBX0.0 BYTE 18 eingestellt.
Soweit so gut. Darufhin in SCL einige Zeilen geschrieben und mit der MID Funktion den String Stück für Stück ausgelesen und gewandelt.

Code:
FUNCTION DATA_ENCODER : VOID
VAR_TEMP
// temporäre Variablen
a1:STRING[2];   
a2:STRING[2];
a3:STRING[2];
a4:STRING[2];
a5:STRING[2];
a6:STRING[2];
a7:STRING[2];   
a8:STRING[2];
END_VAR
a1 := '';
a2 := '';
a3 := '';
a4 := '';
a5 := '';
a6 := '';
a7 := '';
a8 := '';
a1 := MID(IN := DB202.Stringkette_RECV, L := 2, P := 1);
a2 := MID(IN := DB202.Stringkette_RECV, L := 2, P := 3);
a3 := MID(IN := DB202.Stringkette_RECV, L := 2, P := 5);
a4 := MID(IN := DB202.Stringkette_RECV, L := 2, P := 7);
a5 := MID(IN := DB202.Stringkette_RECV, L := 2, P := 9);
a6 := MID(IN := DB202.Stringkette_RECV, L := 2, P := 11);
a7 := MID(IN := DB202.Stringkette_RECV, L := 2, P := 13);
a8 := MID(IN := DB202.Stringkette_RECV, L := 2, P := 15);
//Überführung von INT nach String
DB1.MOVE_to_REFERENCE_POS := STRING_TO_INT(a1);
DB1.REACHED_REFERENCE_POS := STRING_TO_INT(a2);
DB1.MOVE_to_DECK_of_SHIP  := STRING_TO_INT(a3);
DB1.REACHED_DECK_of_SHIP  := STRING_TO_INT(a4);
DB1.ROBOTER_MOVING        := STRING_TO_INT(a5);
DB1.BARGRAPH_green        := STRING_TO_INT(a6);
DB1.BARGRAPH_yellow       := STRING_TO_INT(a7);
DB1.BARGRAPH_red          := STRING_TO_INT(a8);
END_FUNCTION

Funktioniert auch soweit alles gut. Die Daten werden gewandelt und in DB1 geschrieben.

JETZT zum Problem: Mit dieser Routine "verschieben" sich nach jedem Empfang die Parameter um eine Variable. Wenn also der Beispiel Datenstring: +1+1+1+1+0+0+0+0 mehrmals hintereinander gesendet wird passiert folgendes in dem DB.

1. mal empfangen (richtig) ->1 1 1 1 0 0 0 0
2. mal empfangen -> 1 1 1 0 0 0 0 1
3. mal empfangen -> 1 1 0 0 0 0 1 1

usw...

Woran kann das liegen?

Danke für Eure Hilfe

Gruß Stefan
 
Hallo,

Kann es sein, dass die Übertragungs-Aufträge noch nicht abgeschlossen sind.

Stichwort: AG_SEND Done
AG_RECEIVE Done

LG
 
Ist es ein String im Sinne des Rechners oder ein String im Sinne der SPS?

Da gibt es unterschiede!

Wenn es ein String im Sinne des Rechners ist dann reicht es völlig das du 16 Byte Empfängst, und die Daten dann auch in 16 Bytes speicherst und nicht in 8 Strings!
Ein String[2] ist nicht 2 Byte groß sondern 4 Byte, die ersten beiden Byte´s geben die String länge und die Tatsächliche länge an, in den darauf folgenden 2 Byte´s stehen dann die Nutzdaten!

Gruß SKg
 
Hi,

Ist es ein String im Sinne des Rechners oder ein String im Sinne der SPS?

Da gibt es unterschiede!

Wenn es ein String im Sinne des Rechners ist dann reicht es völlig das du 16 Byte Empfängst, und die Daten dann auch in 16 Bytes speicherst und nicht in 8 Strings!
Ein String[2] ist nicht 2 Byte groß sondern 4 Byte, die ersten beiden Byte´s geben die String länge und die Tatsächliche länge an, in den darauf folgenden 2 Byte´s stehen dann die Nutzdaten!

Gruß SKg

Nein, das passt schon so. Das Problem ist ausserhalb des Bausteins zu suchen. Verpolt hatte das schon richtig geschrieben, Du darfst die Auswertung erst ausführen wenn der DONE aus dem Empfangsbaustein TRUE ist.

Gruss Daniel
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Wenn die Empfangslänge aber nicht mit der gesendeten Länge des Rechners übereinstimmt, kommt es genau zu dem Problem das er oben beschreibt.
Da bleiben noch Daten im CP hängen.
Da braucht nur einmal ein Byte mehr gesendet werden, dann kommts zu diesem rollierenden Effekt.
Mal alles Spannungslos machen um den Puffer im CP zu leeren, CP starten stoppen bringt nix.
 
Hallo,

dem AG_RECV ist die definition des S7-Strings egal.
Wenn also 16 Zeichen empfangen werden, muß die angegebene Pointer-Adresse 16Byte lang sein. Ansonsten entsteht dieser Effekt des rotierens.
 
Zurück
Oben