Hoffnungslos: Bootprojekt, TCP Server und hochstarten

JorTec

Level-1
Beiträge
6
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo zusammen,

Ich habe schon Wochen ein Problem mit Funktionsblock TCP_Server von WagoLibEthernet_01.lib mit die Wago 750-880. Wenn ich mein Projekt lade mit Online -> Einloggen und dann start, funktioniert alles super. Wenn ich aber mein Projekt als Bootprojekt erzeug, gibt es verschiedene ergebnisse:
1)
Ich starte die SPS hoch (24V) mit der Betriebsartenschalter (Mode Selector Switch) in mittlere Position (STOP). Nachdem die SPS hochgestartet ist (alle LEDs sind oder blinken Grün), setz ich der Betriebsartenschalter in die oberste Position (RUN). Wenn ich das so mache, habe ich auch keine Probleme und kann ich über TCP schön kommunizieren.

2)
Ich starte die SPS hoch (24V) mit der Betriebsartenschalter (Mode Selector Switch) in oberste Position (RUN). Alle Funktionalität von meinem Programm scheint zu funktionieren, nur kann ich nicht über TCP Kommunizieren. Ich habe mal die Error Codes vom FB TCP_Server in eine CSV geschrieben. Ich bekomme ständig Error 16#8001 (No socket descriptor available). Wenn ich jetzt der Betriebsartenschalter nach STOP und wieder züruck nach RUN setze, bleibt der Fehler 16#8001.

Ich werde am Ende noch mein Code einfügen.
Ich habe schon mehrere andere Lösungen versucht, aber irgendwie krieg ich das nicht hin. Ich gehe davon aus das ich etwas falsch mache oder das ich auf etwas warten muss bevor ich TCP_server ausführen darf?
Ich bin mittlerweile hoffnungslos und hoffe das Ihr mir helfen könnt.

Code:
FUNCTION_BLOCK TCPServer_FB
VAR_INPUT
END_VAR
VAR_OUTPUT
END_VAR
VAR
    tcpServ: TCP_Server;
    receivedData : ARRAY [0..MAX_RECEIVE_TCP_SERVER] OF BYTE;
    transmitData : ARRAY [0..MAX_SEND_TCP_SERVER] OF BYTE;
    startSend : BOOL;
    transmitCount : WORD;
    receiveCount : DINT;
    dataWrite: STRING;
    index: DINT;
    result : BOOL;


END_VAR


Code:
tcpServ(xEnable  :=  TRUE,
wPortNumber := 2455,
ptSendData := ADR(transmitData),
diSendCount := transmitCount,
xStartSend := startSend,
aReceiveBuffer := receivedData,
diReceiveCount := receiveCount
);




IF tcpServ.diError > 1 THEN
    dataWrite := 'Error';
    dataWrite := CONCAT(dataWrite, DINT_TO_STRING(tcpServ.diError ));
    dataWrite := CONCAT(dataWrite,ASCIIBYTE_TO_STRING(13)); (*CR*)
    dataWrite := CONCAT(dataWrite,ASCIIBYTE_TO_STRING(10)); (*LF*)
    CSV_writeData('S:\Logging\EthernetError.csv', LEN(dataWrite), ADR(dataWrite));
END_IF




IF receiveCount >= 10 AND tcpServ.xClientConnected = TRUE THEN
    (*At least 6 bytes need to be received (minimum of Lemnatec Communication Protocol*)
    dataWrite := 'Received Data: ' ;
    dataWrite := DINT_TO_STRING(receiveCount);
    dataWrite := CONCAT(dataWrite,ASCIIBYTE_TO_STRING(13)); (*CR*)
    dataWrite := CONCAT(dataWrite,ASCIIBYTE_TO_STRING(10)); (*LF*)
    CSV_writeData('S:\Logging\EthernetLog.csv', LEN(dataWrite), ADR(dataWrite));
    IF receivedData[0] = cStartHeader AND receivedData[receiveCount-2] = cEndMessage  THEN
        (*Valid message header, process data*)
        result := processCommand( (receivedData[1] + receivedData[2]*256), receivedData[3], (receivedData[6] + receivedData[7]*256), ADR(receivedData[8]) );
        processResponse( (receivedData[1] + receivedData[2]*256), receivedData[3], ADR(transmitData[0]), ADR(transmitCount), BOOL_TO_BYTE(result));
        startSend := TRUE;
    END_IF
END_IF


IF receiveCount > 0 THEN
    (*Clear receive buffer*)
    dataWrite := 'Buffer clear' ;
    dataWrite := CONCAT(dataWrite,ASCIIBYTE_TO_STRING(13)); (*CR*)
    dataWrite := CONCAT(dataWrite,ASCIIBYTE_TO_STRING(10)); (*LF*)
    CSV_writeData('S:\Logging\EthernetLog.csv', LEN(dataWrite), ADR(dataWrite));
    FOR index := 0 TO receiveCount BY 1 DO
        receivedData[index] := 0;
    END_FOR
    receiveCount := 0;
END_IF

Und in mein PLC_PRG:
Code:
PROGRAM PLC_PRGVAR
    test :    TCPServer_FB;
END_VAR

Code:
test();
 
Hallo JorTec,

bitte probiere mal den tcpServ.xEnable nicht dauerhaft auf TRUE zu setzen, sondern mit einer kurzen Zeit zu verzögern.
Zudem sollte auf Port 2455 kein Server laufen, da dies der CoDeSys Kommunikationsport ist.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Herzlichen Dank für die Antwort. Hat mir auf den richtigen spur gesetz.

Ich habe die port nach 2500 geändert und ein TON eingeführt. xEnable steht noch immer dauerhaft auf TRUE, aber es funktioniert jetzt:

Code:
IF firstStart = FALSE THEN	powerOnTimer(IN:= TRUE, PT:=t#5s);
	firstStart := TRUE;
ELSE
	powerOnTimer();
END_IF


IF powerOnTimer.Q = TRUE THEN
(*Execute tcp server*)

Ich dürfte scheinbar nicht direkt der TCP Server anrufen.
 
Zurück
Oben