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

Ergebnis 1 bis 7 von 7

Thema: AG_Recv /Datenstring Splitten

  1. #1
    Registriert seit
    01.10.2010
    Ort
    NRW
    Beiträge
    11
    Danke
    5
    Erhielt 0 Danke für 0 Beiträge

    Standard


    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
    Zitieren Zitieren AG_Recv /Datenstring Splitten  

  2. #2
    Registriert seit
    19.06.2008
    Ort
    Ostalbkreis
    Beiträge
    3.140
    Danke
    201
    Erhielt 553 Danke für 498 Beiträge

    Standard

    Hallo,

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

    Stichwort: AG_SEND Done
    AG_RECEIVE Done

    LG

  3. #3
    Registriert seit
    27.08.2003
    Ort
    Schweitenkirchen
    Beiträge
    472
    Danke
    101
    Erhielt 73 Danke für 59 Beiträge

    Standard

    Würd sagen die Grösse des Empfangfaches stimmt nicht.

    Da mal spielen?
    Wenn ich einen meiner Finger in eines deiner Nasenlöcher stecke, haben wir beide nen Finger in der Nase

  4. #4
    Registriert seit
    01.04.2010
    Beiträge
    306
    Danke
    18
    Erhielt 38 Danke für 37 Beiträge

    Standard

    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
    Mann muß nicht alles wissen, mann sollte nur wissen wo es geschrieben steht!
    Wer lesen kann ist klar im Vorteil!

  5. #5
    Registriert seit
    19.06.2005
    Ort
    in Bayern ganz oben
    Beiträge
    1.360
    Danke
    188
    Erhielt 372 Danke für 290 Beiträge

    Standard

    Hi,

    Zitat Zitat von SKg Beitrag anzeigen
    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
    Erfahrung ist eine nützliche Sache. Leider macht man sie immer erst kurz nachdem man sie brauchte...

    OSCAT.lib Step 7

    Open Source Community for Automation Technolgy

    SPS-Forum Chat (Mibbit) | SPS-Forum Chat (MIRC)

  6. #6
    Registriert seit
    27.08.2003
    Ort
    Schweitenkirchen
    Beiträge
    472
    Danke
    101
    Erhielt 73 Danke für 59 Beiträge

    Standard

    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.
    Wenn ich einen meiner Finger in eines deiner Nasenlöcher stecke, haben wir beide nen Finger in der Nase

  7. #7
    Registriert seit
    10.06.2010
    Beiträge
    4
    Danke
    2
    Erhielt 0 Danke für 0 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    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.

Ähnliche Themen

  1. Profibus-Sensor - Signal splitten.
    Von DPuser im Forum Feldbusse
    Antworten: 14
    Letzter Beitrag: 01.08.2011, 10:51
  2. S7 in Programmteile splitten
    Von Servernexus im Forum Simatic
    Antworten: 6
    Letzter Beitrag: 26.05.2011, 20:52
  3. AG_RECV und Pointer(SCL)
    Von ditj_vitja im Forum Simatic
    Antworten: 33
    Letzter Beitrag: 25.09.2010, 18:13
  4. Großen FB in 2 Teile splitten - knifflig.
    Von rs-plc-aa im Forum Simatic
    Antworten: 51
    Letzter Beitrag: 11.11.2007, 21:26
  5. Chinch Ausgang splitten
    Von Markus im Forum Stammtisch
    Antworten: 6
    Letzter Beitrag: 19.09.2005, 23:26

Lesezeichen

Berechtigungen

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