Hallo Hubertus, nur so als Idee:
FUNCTION_BLOCK Ethernet_Server
VAR_INPUT
xOPEN_SERVER : BOOL; (* Set TRUE to enable function block *)
wPORT : WORD; (* Port number *)
xTCP_PROTOCOL : BOOL; (* TRUE => TCP; FALSE => UDP *)
tTIMEOUT : TIME:=t#20s; (* Watchdog timeout value (seconds) *)
iBYTES_TO_SEND : INT; (* Number of bytes to transmit *)
ptSEND_BUFFER : POINTER TO ARRAY[1..1500] OF BYTE; (* Transmit Buffer *)
END_VAR
VAR_IN_OUT
xSTART_SEND : BOOL; (* Set TRUE to initiate data transmittal, will be *)
(* reset FALSE when transmittal is completed *)
utRECEIVE_BUFFER : typEthernet_BUFFER; (* Receive Buffer *)
END_VAR
VAR_OUTPUT
utERROR : ETH_ERROR; (* See ETH_ERROR datatype in ETHERNET.LIB *)
(* for error codes and definitions *)
xSERVER_OPEN : BOOL; (* TRUE if socket connection made *)
wSOCKET : WORD; (* Socket connection number *)
END_VAR
VAR
MyEthernetOpen : ETHERNET_SERVER_OPEN;
MyEthernetClose : ETHERNET_SERVER_CLOSE;
MyEthernetWrite : ETHERNET_WRITE;
MyEthernetRead : ETHERNET_READ;
EthernetBuffer : ARRAY[1..1500] OF BYTE;
Status : WORD:=0;
i : INT;
getConfig : ETHERNET_GET_NETWORK_CONFIG;
watchdog_timer1 : TON;
client_SRC_IP
WORD;
client_SRC_PORT:WORD;
CloseState :INT;
END_VAR
IF xOpen_Server THEN
watchdog_timer1(IN:=TRUE , PT:=tTIMEOUT );
IF watchdog_timer1.q THEN
watchdog_timer1(IN:=FALSE , PT:=tTIMEOUT );
MyEthernetClose(EN:= 1, SOCKET:= MyEthernetOpen.SOCKET);
MyEthernetClose(EN:= 0, SOCKET:= 0);
Status := 0; (* Try to open the server *)
END_IF
CASE Status OF
0:
getConfig(EN:=FALSE );
getConfig(EN:=TRUE );
utERROR:=0;
wSocket:=0;
CloseState:=0;
status:=1;
1: getConfig(EN:=TRUE );
IF getConfig.ENO THEN
IF getConfig.IP_ADR<>0 THEN
status:=4;
MyEthernetOpen (EN:=0);
MyEthernetRead(EN:= 0, SOCKET:=0 , DATA:=EthernetBuffer );
MyEthernetClose(EN:= 0);
ELSE
status:=0;
END_IF
END_IF
4: (* try to open a socket*)
IF xTCP_PROTOCOL THEN
MyEthernetOpen(EN:=1 , TYP:=SOCK_STREAM, PROTO := IPPROTO_TCP, PORT := wPort);
ELSE
MyEthernetOpen(EN:=1 , TYP:=SOCK_DGRAM, PROTO := IPPROTO_UDP, PORT := wPort);
END_IF
IF ((MyEthernetOpen.ERROR = 0) AND (MyEthernetOpen.ENO = 1)) THEN
Status := 10; (* socket created, wait for data to process *)
MyEthernetOpen (EN:=0);
xServer_open:=TRUE;
wSocket:=MyEthernetOpen.socket;
ELSE
Status := 0; (*socket not available, try it again *)
MyEthernetOpen (EN:=0);
xServer_open:=FALSE;
wSocket:=0;
END_IF;
10: (* Wait for data to process *)
(* Monitor ethernet port for new data *)
MyEthernetRead( EN:= 1, SOCKET:=MyEthernetOpen.SOCKET , DATA:=EthernetBuffer );
MyEthernetRead( EN:= 0, SOCKET:=0 , DATA:=EthernetBuffer );
IF(MyEthernetRead.ERROR<>0) THEN (* Error reading the socket, close it *)
Status:=40;
ELSIF (MyEthernetRead.LEN_OUT <>0) THEN (* Process the data received via the ethernet port *)
Status:=20;
client_SRC_IP:=MyEthernetRead.SRC_IP;
client_SRC_PORT:=MyEthernetRead.SRC_PORT;
watchdog_timer1(IN:=FALSE , PT:=tTIMEOUT );
ELSIF (iBytes_TO_SEND > 0 AND xSTART_SEND) THEN (* Process the data received via the serial port *)
status:=30;
MyEthernetWrite( EN:= 0 , DATA:=EthernetBuffer );
END_IF
20: (* Process the data received via the ethernet port *)
FOR i := 1 TO (MyEthernetRead.LEN_OUT) DO
utReceive_buffer.index :=(utReceive_buffer.index MOD 1500)+1;
utReceive_buffer.data[utReceive_buffer.index] := EthernetBuffer
;
END_FOR
Status:=10;
30: (* Process the data to send *)
EthernetBuffer :=ptSEND_BUFFER^;
(* Send data in transmit buffer out ethernet port *)
IF xTCP_PROTOCOL THEN
MyEthernetWrite( EN:= 1,
SOCKET:= MyEthernetOpen.SOCKET,
LEN_IN:=iBYTES_TO_SEND,
DATA:=EthernetBuffer );
ELSE
IF client_SRC_IP>0 AND client_SRC_PORT>0 THEN
MyEthernetWrite(EN:=1, SOCKET:=MyEthernetOpen.SOCKET , LEN_IN:=iBYTES_TO_SENd , DST_IP:=client_SRC_IP,DST_PORT:=client_SRC_PORT,DATA:=EthernetBuffer );
ELSE
status:=10;
END_IF
END_IF
IF MyEthernetWrite.eno THEN
IF(MyEthernetWrite.ERROR <>0) THEN
Status:=40;(* Error writing to the socket, close it *)
ELSE
Status:=10; (* Comms complete, read more data *)
END_IF;
xStart_send:=FALSE;
END_IF
40: (* Close the server *)
MyEthernetClose(EN:= 1, SOCKET:= MyEthernetOpen.SOCKET);
IF MyEthernetClose.eno THEN
MyEthernetClose(EN:= 0);
xServer_open:=FALSE;
utERROR:=0;
wSocket:=0;
Status := 0; (* Try to open the server again *)
END_IF
END_CASE;
ELSE
CASE CloseState OF
0:
MyEthernetClose(EN:= 0);
MyEthernetClose(EN:= 1, SOCKET:= MyEthernetOpen.SOCKET);
CloseState:=1;
1:
MyEthernetClose(EN:= 1, SOCKET:= MyEthernetOpen.SOCKET);
IF MyEthernetClose.eno THEN
MyEthernetClose(EN:= 0);
CloseState:=2;
END_IF
2:
xServer_open:=FALSE;
utERROR:=0;
wSocket:=0;
END_CASE
END_IF