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

Ergebnis 1 bis 9 von 9

Thema: Datenkonsistenz von AG_RECV

  1. #1
    Registriert seit
    17.06.2009
    Beiträge
    14
    Danke
    1
    Erhielt 0 Danke für 0 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Hallo zusammen ,

    Folgende Situation:

    Ich empfange auf einem Lean-CP ab und zu ein einzelnes UDP-Paket fester Länge (einige Bytes) mittels AG_RECV. AG_RECV schreibt die empfangenen Daten dann über den Eingangsparameter "RECV" in einen Datenbaustein.

    Frage:
    Stellt die Funktion AG_RECV sicher, dass die Daten im Zieldatenbaustein zu jeder Zeit konsistent sind? Oder wird der DB Byte für Byte aufgefüllt und der Zyklus läuft währenddessen weiter? Das hätte zur Folge, dass sich während eines recieve-Vorgangs alte und neue Daten um DB befinden.

    Dann hätte ich noch eine Frage zum UD-Protokoll an sich:
    Dass das UDP-Paket möglicherweise nicht ankommt ist mir klar, und stellt in meiner Anwendung auch kein Problem dar.
    Aber gibt es bei UDP eine Checksumme, die die gesendeten Daten auf Fehler überprüft? Sollte ein fehlerhaftes Paket dann einfach verworfen werden, wäre mir das recht. Ich hab lieber gar kein Paket als ein fehlerhaftes.

    Grüße
    oid
    Geändert von oid (09.07.2009 um 19:33 Uhr)
    Zitieren Zitieren Datenkonsistenz von AG_RECV  

  2. #2
    Registriert seit
    25.06.2007
    Ort
    Dresden
    Beiträge
    3.930
    Danke
    465
    Erhielt 878 Danke für 634 Beiträge

    Standard

    Im Prinzip kannst du eine UDP-Verbindung wie eine Serielle Kommunikation (CP340) verstehen .
    Die Bausteinaufrufe sind fast gleich. Es ist fast so wie das serielle Protokoll mit Zeichenverzugszeit -so nutze ich es.
    D.h. ist der Datenstrom eingefahren, bekomme ich die Datenstromlänge mitgeteilt.
    Jetzt überprüfe ich die (z.B.) ersten drei Zeichen und die Länge.
    Passt das ins Raster ist es gut und ich gebe eine Datenquittung an
    den Datensender zurück. Damit hat man auch ohne TCP ein Datenhandshake geschaffen.

    Gruß

    IBFS

  3. #3
    oid ist offline Neuer Benutzer
    Themenstarter
    Registriert seit
    17.06.2009
    Beiträge
    14
    Danke
    1
    Erhielt 0 Danke für 0 Beiträge

    Standard

    Schonmal danke für die Antwort, aber ein handshake brauch ich eigentlich gar nicht .

    Ich möchte einfach nur sicher gehen, dass zu jeder Zeit in meinem Ziel-DB (der DB in den mir AG_RECV das empfangene Paket schreibt) alle Daten vom gleichen UDP-Paket sind.
    Und nicht - sollte der recieve-Vorgang noch nicht abgeschlossen sein - Teile vom Vorgänger-Paket und Teile vom aktuellen Paket.
    Klar könnte ich mit Hilfe des NDR-Flags am AG_RECV noch einen Puffer basteln, um dann wirklich konsistente Daten zu haben. Aber das kann ich mir ja sparen, wenn sich da der AG_RECV eh schon drum kümmert.

    Oder anders formuliert: Läuft das CPU-Programm weiter während der Ziel-DB von AG_RECV gefüllt wird? Und könnte das Programm somit im DB auf inkonsistente Daten stoßen?

    Gruß
    oid
    Geändert von oid (09.07.2009 um 20:48 Uhr)

  4. #4
    Registriert seit
    05.06.2006
    Ort
    PLZ 97xxx
    Beiträge
    274
    Danke
    31
    Erhielt 44 Danke für 36 Beiträge

    Standard

    AG_RECV schreibt erst in Deinen DB wenn alle Daten empfangen worden sind.
    Vorher werden die Daten im CP zwischengespeichert.
    Deshalb musst Du auch die Länge angeben am ANY-Pointers des AG_RECV.

    Bei UDP ist die Länge aber auf 240 Bytes begrenzt.

  5. Folgender Benutzer sagt Danke zu Sarek für den nützlichen Beitrag:

    oid (09.07.2009)

  6. #5
    oid ist offline Neuer Benutzer
    Themenstarter
    Registriert seit
    17.06.2009
    Beiträge
    14
    Danke
    1
    Erhielt 0 Danke für 0 Beiträge

    Standard

    okay merci, 240 byte reichen mir

  7. #6
    Registriert seit
    25.06.2007
    Ort
    Dresden
    Beiträge
    3.930
    Danke
    465
    Erhielt 878 Danke für 634 Beiträge

    Standard

    Zitat Zitat von Sarek Beitrag anzeigen
    AG_RECV schreibt erst in Deinen DB wenn alle Daten empfangen worden sind.
    Vorher werden die Daten im CP zwischengespeichert.
    Deshalb musst Du auch die Länge angeben am ANY-Pointers des AG_RECV.

    Bei UDP ist die Länge aber auf 240 Bytes begrenzt.

    Die Angabe des ANY-Pointers ist aber die BufferGesamtlänge.
    Diesen Buffer mache ich immer um einiges größer als die erwartete Länge.
    Die real empfangene Länge - nach dem "abreisen" des Datenstromes
    wird am Bausteinausgange für EINEN Zyklus lang angetragen.
    Die Länge zu überprüfen ist schon wichtig, weil Pakete auch
    verstümmelt sein können und damit kürzer sind.

  8. #7
    Registriert seit
    05.06.2006
    Ort
    PLZ 97xxx
    Beiträge
    274
    Danke
    31
    Erhielt 44 Danke für 36 Beiträge

    Standard

    Ist das nur bei UDP so?

    Bei TCP kanns ja nicht so sein, da man die Daten nur kriegt wenn der
    Puffer auch voll ist. Deshalb auch das Problem beim Empfang von TCP-Telegrammen unbekannter Länge.

    Bei UDP ist der Empfang mit der max. Länge 240Bytes ja sowieso auf ein Paket begrenzt.

    Zitat Zitat von IBFS Beitrag anzeigen
    Die Angabe des ANY-Pointers ist aber die BufferGesamtlänge.
    Diesen Buffer mache ich immer um einiges größer als die erwartete Länge.
    Die real empfangene Länge - nach dem "abreisen" des Datenstromes
    wird am Bausteinausgange für EINEN Zyklus lang angetragen.
    Die Länge zu überprüfen ist schon wichtig, weil Pakete auch
    verstümmelt sein können und damit kürzer sind.

  9. #8
    Registriert seit
    25.06.2007
    Ort
    Dresden
    Beiträge
    3.930
    Danke
    465
    Erhielt 878 Danke für 634 Beiträge

    Standard

    @Sarek

    Die Eingangsfrage handelte NUR von UDP. Deshalb bin ich nicht auf TCP eingegangen sondern habe nur das Verhalten von UDP erklärt.

    Den Buffer einfach maximal zu machen hat den Hintergund, dass man
    bei Protokolländerung einen DB-Bereich hat den man einfach nicht mehr
    ändern (vergrößern) muß weil er auf Maximalgröße ist.

    Gruß

  10. #9
    oid ist offline Neuer Benutzer
    Themenstarter
    Registriert seit
    17.06.2009
    Beiträge
    14
    Danke
    1
    Erhielt 0 Danke für 0 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Ich hätte da nochmal eine Frage:

    Was passiert, wenn ein zweites UDP-Paket am CP angekommen ist, bevor das erste Paket mit AG_RECV ausgelesen wurde? Liest AG_RECV pro Aufruf dann immer nur das älteste Paket aus (FIFO-Prinzip)?
    Wie groß ist der Zwischenspeicher vom CP? Und was passiert, wenn der Zwischenspeicher voll ist?

    Grüße

Ähnliche Themen

  1. Probleme mit AG_SEND und AG_RECV
    Von -Melanie- im Forum Simatic
    Antworten: 8
    Letzter Beitrag: 26.05.2011, 14:10
  2. Problem mit AG_Recv
    Von SPS-freak1 im Forum Simatic
    Antworten: 10
    Letzter Beitrag: 15.04.2011, 17:21
  3. AG_Recv /Datenstring Splitten
    Von s_alpen im Forum Simatic
    Antworten: 6
    Letzter Beitrag: 20.10.2010, 10:26
  4. AG_RECV und Pointer(SCL)
    Von ditj_vitja im Forum Simatic
    Antworten: 33
    Letzter Beitrag: 25.09.2010, 18:13
  5. Datenkonsistenz in DB's sicherstellen
    Von SPS-Dummy im Forum Simatic
    Antworten: 6
    Letzter Beitrag: 05.11.2007, 11:55

Lesezeichen

Berechtigungen

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