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

Ergebnis 1 bis 2 von 2

Thema: Telegrammpuffer abarbeiten mittels while - Schleife

  1. #1
    Registriert seit
    12.05.2016
    Beiträge
    5
    Danke
    0
    Erhielt 0 Danke für 0 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Hallo Leute,

    ich möchte, dass eine SPS (Passiver Teilnehmer) mehrere Telegramme verarbeiten kann, die in einem Datenpaket und in einem Sendezyklus übersendet werden. Der Sourcecode arbeitet mit einem definierten Bereich, dass heißt, dass die Telegramme in diesen definierten Bereich hineingezogen und dekodiert werden. Dazu verwende ich eine while Schleife. Das funktioniert auch sehr gut.
    Nun zum eigentlich Problem: Die Rückantwort, die im Sendepuffer bereit liegt, wird erst nach Beendigung oder Abbruch der While Schleife gesendet. Damit aber die Nachrichten nacheinander verarbeietet werden können, muss die Rückantwort zuerst übersendet werden und anschließend rücken die folgenden Telegramme, die im Empfanungspuffer liegen, in den vordefenierten Bearbeitungsbereich. Der Sendeimpuls soll in der While - Schleife durchgeführt werden. Leider funktioniert das aber nciht.
    Hat jmd eine Idee? Einen Teil des Sourcecodes habe ich hinterlegt:

    Code:
    IF     (URCV_DONE=TRUE) THEN 
        WHILE (BYTE_TO_INT(sizeofpackage) - decoded > 0) DO (*sizeofpackage: Groesse des gesamten Datenpakets*)
    (*___Befehlstelegramm - dekodierter Telegramme ist kleiner als 2 Byte___*)
                IF (BYTE_TO_INT(sizeofpackage) - decoded < 2) THEN
                    EXIT;
                END_IF;
    
            sizeoforder:= INOUT_udtTCPIPReceiveBuffer.arrCache[0]; (*sizeoforder : Groesse des Telegramms / Befehl*)
                
                IF(BYTE_TO_INT(sizeoforder) > BYTE_TO_INT(sizeofpackage) - decoded) THEN
                    EXIT;
                END_IF;
    
    (*_Dekodierungsteil: Empfanungspuffer*)
    (*_Dekodierungsteil: Sendepuffer*)
    
        (*IP_USEND Code*)
        IP_USEND_2(REQ:=send_order,ID:=ID_Baustein,(*R_ID:=ro,*)SD_1:=INOUT_udtTCPIPSendBuffer.arrBuffer);
        sent:=IP_USEND_2.DONE;
        V_xSendError:=IP_USEND_2.ERROR;
        V_iSendStatus:=IP_USEND_2.STATUS;
        INOUT_udtTCPIPSendBuffer.arrBuffer:=IP_USEND_2.SD_1;
    
    IF sent = TRUE THEN
    decoded:=decoded + BYTE_TO_INT(sizeoforder); (*aufsummieren*)
    
    (*folgende Telegramme in vordefinierten Bereich aufrutschen*)
    
    END_IF;
    END_WHILE;
    (*Sende- und Empfanungspuffer loeschen*)
    Grüße,
    Florian
    Geändert von Florian_B (07.09.2016 um 16:13 Uhr)
    Zitieren Zitieren Telegrammpuffer abarbeiten mittels while - Schleife  

  2. #2
    Registriert seit
    08.09.2010
    Ort
    Blomberg
    Beiträge
    391
    Danke
    1
    Erhielt 61 Danke für 58 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Hallo Florian,

    "funktioniert nicht" sollte jetzt natürlich genauer untersucht werden. Dabei hilft in solchen Fällen (zeitlich unklare Abarbeitung) die Logik-Analyse, mit deren Hilfe Du die entsprechenden Signale in Ihrem zeitlichen Ablauf verfolgen kannst.

    Mindestens eine unglückliche Konstellation ist in Deinen Sourcen erkennbar:
    Der Aufruf des IP_Usend innerhalb des IF / While Konstruktes ist immer problematisch, da dieser Code in jedem Zyklus durchlaufen wird. Aus diesem Grund (gilt im Übrigen für alle FBs) sollten die FB-Aufrufe stets außerhalb jeder IF/While/Case usw. Konstrukte platziert werden. Die entsprechenden Steuer-Signale ( hier z.B. der REQ Eingang) können natürlich in den Schleifen usw. genutzt werden.

    Der Grund hierfür ist recht simpel - die FBs stoßen unter dem Blech oft FW Funktionen an und diese laufen oft über mehrere Zyklen. Da der Funktionsbaustein auch das Interface für das Ergebnis der Operation darstellt, würde dieses u.U. nicht aktualisiert, da der FB vielleicht nicht bearbeitet wird ... und so wartet man ewig auf das Ergebnis einer Operation, die unterm Blech bereits lange durch ist

    Das Ganz kann nun sogar Task übergreifend genutzt werden:
    Der Aufruf der IP-Bausteine sollte z.B. in einer schnellen, zyklischen Task erfolgen, damit die entsprechenden Buffer ausreichend schnell bedient werden, während die Dekodierung von aufwendigen Protokollen oft weniger zeitkritisch ist und in einer anderen (langsamen) Task erfolgen kann.

    Also, zieh mal den FB aus der Schleife/ IF Abfrage ... dann sollte es ggf. schon besser funktionieren.

    Viele Grüße aus Pyrmont
    Markus v. Schlichtkrull
    PHOENIX CONTACT Deutschland GmbH
    Hotline: 05281-946-2888
    automation-service@phoenixcontact.com
    www.phoenixcontact.de

Ähnliche Themen

  1. TIA Datenbaustein mittels Schleife durchlaufen
    Von fabianfischer im Forum Simatic
    Antworten: 18
    Letzter Beitrag: 16.07.2015, 08:44
  2. Step 7 Bitmusterüberprüfung mittels Schleife in AWL
    Von Rune17 im Forum Simatic
    Antworten: 37
    Letzter Beitrag: 29.04.2015, 15:32
  3. Step 7 Unterschied zwischen IF- Schleife und While-Schleife
    Von Vokal12 im Forum Simatic
    Antworten: 11
    Letzter Beitrag: 29.10.2013, 22:52
  4. Antworten: 4
    Letzter Beitrag: 17.11.2011, 10:38
  5. Reihenfolge speichern und abarbeiten
    Von artofautomation im Forum Simatic
    Antworten: 37
    Letzter Beitrag: 20.10.2011, 11:25

Stichworte

Lesezeichen

Berechtigungen

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