So ich bins wieder selbes Thema(Verbindung wird zwischen PC und PLC aufgebaut):

Und zwar sende ich mit der PLC Linktests (4Byte große) alle 5sek und erwarte auf das gesendete ein ACK dieses wird meistens richtig empfangen. wenn ich aber andere nachrichten vom PC aus an die PLC sende, empfängt der nichts mehr. Bei den Daten handelt es sich ebenfalls um einen Linktest 4 Byte oder um Nachrichten beliebig groß. Nach mehreren Neustarts und neuladen komme ich aber auch mal in den Zustand das immer alles geht und wenn ich wieder neustarte gehts wieder nicht mehr.
Ich habe nun die Zykluszeit von 10 auf 1 ms runtergesetzt und die im Systemmanager von 1ms auf 100µs nun gehts immer, zumindest bei mir. Aber auf nem anderen Rechner wo beckkoff auf einer virtuellen maschine läuft geht das empfangen überhaupt nicht.

Der Code liegt bei mache ich was beim empfangsaufruf falsch??? Oder woran liegt es. Bei den Beispiel Beckhoff Projekte geht das Empfangen ja auch.

Für eure Hilfe wäre ich sehr dankbar. Code liegt bei.

Code:
PROGRAM MAIN
VAR

    Connected         : BOOL;
    Step            : INT := 0;
    LinkTestSEND    : FB_LinkTestSEND;
    LinkTestTimer    : TON;                        (*Timer für den Linktest*)
    ACKTimer        : TON;                        (*Timer für den Ack der gesendeten Daten*)
    WaitForAckLink    : BOOL;
    WaitForAckData    : BOOL;

(*Test Variablen*)
    Disconnect    : BOOL := FALSE;
END_VAR

CASE Step OF
    0:      Connected := F_DCP_TCP_ConnectionStatus(Step := Step);
        LinkTestTimer(IN := FALSE,PT:=T#5s);
        ACKTimer(IN := FALSE,PT:=T#3s);
        WaitForAckLink    := FALSE;
        WaitForAckData    := FALSE;

     1:      IF NOT Connected THEN Step := 0; RETURN; END_IF;
        LinkTestTimer(IN := TRUE);
        StepSend();
        LinkTestSEND(LinkTimer := LinkTestTimer,ACKTimer:=ACKTimer,Connected =>Connected, WaitForAck := WaitForAckLink);
        StepRecv( ACKTimer:=ACKTimer, WaitForAckLink := WaitForAckLink, WaitForAckData := WaitForAckData);
END_CASE;
Code:
FUNCTION_BLOCK FB_StepRecv
VAR_INPUT
END_VAR
VAR_OUTPUT
END_VAR
VAR_IN_OUT
    ACKTimer        : TON;
    WaitForAckLink    : BOOL;
    WaitForAckData    : BOOL;
END_VAR
VAR
    RecvB             : UDINT;
    MsgSize            : DWORD;
    MsgSizeACK        : DWORD;
END_VAR

(*Ersten 4 Bytes Empfangen mit der Länge*)
IF MsgSize = 0 THEN
    Recv(msglen := 4,pRecv := ADR(SR_Buffer[0]),RecvBytes => RecvB);
    IF RecvB <4 THEN RETURN; END_IF;
    MsgSize := F_ArrayToDWord(ADR(SR_BUFFER[0]));
END_IF
(*Was war das für eine Message*)
CASE MsgSize OF
    4:    (*Eingehender Linktest*)
        SR_Buffer[0] := 0;
        SR_Buffer[1] := 0;
        SR_Buffer[2] := 0;
        SR_Buffer[3] := 8;
        SR_Buffer[4] := 0;
        SR_Buffer[5] := 0;
        SR_Buffer[6] := 0;
        SR_Buffer[7] := 4;
        Send(msglen :=  8, pSend:= ADR(SR_Buffer));
        MsgSize := 0;
    8:    (*ACK für gesendete Daten oder Linktest*)
        ACKTimer(IN := FALSE);                                        
        Recv(msglen := 4,pRecv := ADR(SR_Buffer[3]),RecvBytes => RecvB);
        IF RecvB <4 THEN RETURN; END_IF;
        MsgSizeACK := F_ArrayToDWord(ADR(SR_BUFFER[0]));
        IF MsgSizeACK = 4 THEN
            (*LinktestACK gekommen*)
            IF NOT WaitForAckLink THEN        (*ACK kam rein obwohl vorher kein Linktest gesendet wurde !!!*)
                ERROR_Report(Error := 1);            (*Fehler 1*)
            END_IF
            WaitForAckLink := FALSE;
        ELSE
            ;(*ACK für gesendete Daten*)
            IF NOT WaitForAckData THEN        (*ACK kam rein obwohl vorher keine Daten gesendet wurden !!!*)
                ERROR_Report(Error := 2);            (*Fehler 2*)
            END_IF
            WaitForAckData := FALSE;
        END_IF; 
        MsgSize := 0;
    ELSE
        IF MsgSize > 8 THEN
            (*Eingehende Daten*)
            Recv(msglen := DWORD_TO_DINT(MsgSize-4), pRecv := ADR(SR_Buffer[3]), RecvBytes => RecvB);
            IF RecvB <DWORD_TO_DINT(MsgSize-4) THEN RETURN; END_IF;
            MsgSize := 0;
            (*Hier kommt der Command in den Buffer von Dirk*)
        END_IF;
END_CASE;
Code:
FUNCTION_BLOCK FB_DCP_TCP_Receive
VAR_INPUT
    msglen            : DINT;
    pRecv            : DWORD;
END_VAR
VAR_OUTPUT
    RecvBytes        : UDINT;
END_VAR
VAR
    Error    : BOOL;
    fbrecv            : FB_SocketReceive;
    cbReceived         : UDINT := 0;
END_VAR

fbrecv( bExecute := FALSE );
RecvBytes := fbrecv.nRecBytes;
fbrecv(    sSrvNetId        := '',    
        hSocket            := DCP_TCP_hSocket,        
        cbLen            := msglen-cbReceived,            
        pDest            := pRecv+cbReceived,            
        bExecute        :=TRUE,            
        tTimeout            := T#5s);
cbReceived := cbReceived + RecvBytes;
RecvBytes := 0;
IF cbReceived = msglen THEN
    cbReceived := 0;
    RecvBytes := msglen;
END_IF;