Instanz zyklisch in der SPS-Task aufgerufen - Wie???

rapser

Level-1
Beiträge
48
Reaktionspunkte
6
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo, ich arbeite mit TwinCAT und soll per TCP/IP Daten auf ein Identsystem schreiben. Das Verbinden uns hinsenden von Daten funktioniert soweit sehr gut, doch beim empfangen kommt es vor, dass die Daten durch TCP/IP in mehreren Teilen kommen. In der Hilfe zu dem Baustein steht folgendes:

Es ist also möglich, dass nicht alle Daten auf einmal mit einem Aufruf der Instanz von FB_SocketReceive empfangen werden können. Aus diesem Grund muss die Instanz zyklisch (pollend) in der SPS-Task aufgerufen werden, so lange bis alle benötigten Daten empfangen wurden. Dabei wird eine steigende Flanke, z.B. alle 100ms, an dem bExecute-Eingang erzeugt.
Kann mir bitte jemand ein Beispiel dazu geben, wie ich ich dies in ST am besten mache?

Bin noch nicht so bewandert in CoDeSys.

Vielen Dank.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Zeilsystem ist ein PC und als Bibliothek habe ich die TcpIp.lib.
Dort gibt es ja die FB FB_SocketConnect, FB_SocketSend und FB_SocketReceive.

Connect und Send funktionieren auch, doch leider weiß ich nicht wie ich das Receive aurufen muss, das es alles empfängt bzw. wann weiß ich, dass ich alles emfangen habe? Es steht zwar etwas mit Nullterminierung in der Hilfe, doch wie überprüfe ich darauf?
 
hier nun etwas code, vielleicht kann mir dann jemand einen tip geben.

Code:
CASE iSchrittId OF

    1:
        fb_ssend(sSrvNetId:=sNetId, hSocket:=Socket_id, pSrc:= ADR(sInitString),cbLen:= LEN(sInitString),bExecute:= bSendInitString);
        IF fb_ssend.nErrId=0 THEN
            bSendInitString:=FALSE;
            bStarteEmpfangen:=TRUE;
            iSchrittId:=2;
        END_IF

    2:
            fb_sreceive(sSrvNetId:=sNetId, hSocket:=Socket_id, pDest:= ADR( sFromServer ),cbLen:= SIZEOF( sFromServer ),bExecute:= bStarteEmpfangen);    
            KommtVor:=FIND(sFromServer, '$060');
            IF KommtVor<>0 THEN
                bSendString:=TRUE;
                iSchrittId:=3;
            ELSE
                bSendInitString:=TRUE;
                bStarteEmpfangen:=FALSE;
                iSchrittId:=1;
            END_IF

    3:
...
ich möchte quasi eine schrittkette darstellen, zuerst soll gesendet werden, wenn dabei kein fehler entstanden ist, soll er in den nächsten schritt (2) gehen und soll dort empfangen. kommt nun in dem STRING sFromServer eine bestimmte zeichenkette vor, soll er in den schritt 3 gehen, wenn nicht wieder schritt 1 und neu senden. er wechslet andauernd zwischen schritt 1 und 2, doch glaube ich sendet er in schritt 1 nicht erneut.

Bitte um Hilfe.
 
Zuletzt bearbeitet:
Hallo Rapser,

ich hoffe ich kann Dir helfen. Es gibt von Beckhoff eine Beispielprojekt, welches Du Dir einmal ansehen soltlest.

http://infosys.beckhoff.com/content/1031/tcpipserver/html/tcplclibtcpip_sample01_test.htm

In Diesem Projekt ist ein gibt es eine Funktion die da heist 'fb_DataExcha'. Diese macht genau das, was Du vor hast. Du sendest einen STRING an einen Clienten, und der Antwortet Dir ebenfalls mit einem STRING. Die Funktion Arbeitet selbstständig so lange, bis die NULL-Terminierung erfolgt ist.
Die Funktion basiert auf den Standard-Funktionen wie FB_SocketConnect, FB_SocketSend und FB_SocketReceive

Gruß Scrat
 
Zurück
Oben