Quantcast
Channel: SPS-Forum - Automatisierung und Elektrotechnik
Viewing all articles
Browse latest Browse all 47324

Telegrammpuffer abarbeiten mittels while - Schleife

$
0
0
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

Viewing all articles
Browse latest Browse all 47324


<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>