FUNCTION_BLOCK NET_IO
TITLE = 'NET-IO'
NAME : NET_IO
FAMILY : ''
AUTHOR : dalbi
VERSION : '1.0'
VAR_INPUT
CONNECT : BOOL;
ID : WORD;
DEV_ID : BYTE;
IP_ADDR1 : INT;
IP_ADDR2 : INT;
IP_ADDR3 : INT;
IP_ADDR4 : INT;
END_VAR
VAR_IN_OUT
NET_IO : UDT_NET_IO;
END_VAR
VAR_OUTPUT
CONNECTED : BOOL;
END_VAR
VAR_TEMP
TempPointer : ANY;
AnyPointer AT TempPointer : STRUCT
BYTE0 : BYTE; //10h
TYP : BYTE; //Daten/Parametertyp
ANZ : WORD; //Länge
DBNr : WORD; //DB-Nummer
BZ : DWORD; //Bereichszeiger
END_STRUCT;
i : INT;
BCD_Code : DWORD;
END_VAR
VAR
TCON : TCON;
TSEND : TSEND;
TRCV : TRCV;
TDISCON : TDISCON;
TCON_PAR : TCON_PAR;
TON_CON : TON;
TON_SEND : TOF;
PulsePosConn : BOOL;
PulseNegConn : BOOL;
EdgeFlagPos : BOOL;
EdgeFlagNeg : BOOL;
Count : INT;
RcvData : ARRAY[0..23] OF CHAR;
GETPORT : ARRAY [0..10] OF CHAR := 'G','E','T','P','O','R','T',' ','X', '$L', '$R';
GETADC : ARRAY [0..9] OF CHAR := 'G','E','T','A','D','C',' ','X', '$L', '$R';
SETPORT : ARRAY [0..12] OF CHAR := 'S','E','T','P','O','R','T',' ','X','.','Y', '$L', '$R';
GETSTATUS : ARRAY [0..10] OF CHAR := 'G','E','T','S','T','A','T','U','S', '$L', '$R';
END_VAR
BEGIN
(*********************************************************)
(* Get the positive pulse *)
(*********************************************************)
PulsePosConn := CONNECT AND NOT EdgeFlagPos;
EdgeFlagPos := CONNECT;
(*********************************************************)
(* Get the negative pulse *)
(*********************************************************)
PulseNegConn := NOT CONNECT AND EdgeFlagNeg;
EdgeFlagNeg := CONNECT;
(*********************************************************)
(* Set ID of the specified connection *)
(*********************************************************)
TCON_PAR.id := ID;
TCON_PAR.local_device_id := DEV_ID;
(*********************************************************)
(* Set IP address values *)
(*********************************************************)
TCON_PAR.rem_staddr[1] := WORD_TO_BYTE(INT_TO_WORD(IP_ADDR1));
TCON_PAR.rem_staddr[2] := WORD_TO_BYTE(INT_TO_WORD(IP_ADDR2));
TCON_PAR.rem_staddr[3] := WORD_TO_BYTE(INT_TO_WORD(IP_ADDR3));
TCON_PAR.rem_staddr[4] := WORD_TO_BYTE(INT_TO_WORD(IP_ADDR4));
(*********************************************************)
(* Establish connection *)
(*********************************************************)
IF PulsePosConn THEN
TCON.REQ := TRUE;
END_IF;
TCON(REQ := TCON.REQ,
ID := TCON_PAR.id,
CONNECT := TCON_PAR);
IF TCON.DONE THEN
CONNECTED := TRUE;
TCON.REQ := FALSE;
END_IF;
TON_CON(IN := CONNECTED,
PT := T#2s);
(*********************************************************)
(*********************************************************)
CASE Count OF
1..8: SETPORT[8] := INT_TO_CHAR(Count [COLOR=#ff0000]+ 48[/COLOR]);[COLOR=#ff0000] // was hat es mit den 48 aufsich ?[/COLOR]
SETPORT[10] := INT_TO_CHAR(BOOL_TO_INT(NET_IO.DigiOut[Count]) [COLOR=#ff0000]+ 48[/COLOR]);
TempPointer := SETPORT;
9..12: GETPORT[8] := INT_TO_CHAR(Count - 8 [COLOR=#ff0000]+ 48[/COLOR]);
TempPointer := GETPORT;
13..16: GETADC[7] := INT_TO_CHAR(Count - 12 [COLOR=#ff0000]+ 48[/COLOR]);
TempPointer := GETADC;
17: TempPointer := GETSTATUS;
ELSE
Count := 1;
TempPointer := GETSTATUS;
END_CASE;
(*********************************************************)
(* Send data over existing connection *)
(*********************************************************)
TSEND.LEN := WORD_TO_INT(AnyPointer.ANZ);
IF TON_CON.Q THEN
TON_SEND(IN := NOT TSEND.REQ,
PT := T#50ms);
TSEND.REQ := TON_SEND.Q;
TSEND(REQ := TSEND.REQ,
ID := TCON_PAR.id,
LEN := TSEND.LEN,
DATA := TempPointer);
END_IF;
(*********************************************************)
(* Receive data over existing connection *)
(*********************************************************)
IF CONNECTED THEN
TRCV(EN_R := TRUE,
ID := TCON_PAR.ID,
LEN :=[COLOR=#ff0000] TRCV.LEN,[/COLOR] [COLOR=#ff0000] // woher weiß mann wieviele BYTE ankommen ? [/COLOR]
DATA := RcvData);
END_IF;
BCD_Code := 0;
[COLOR=#000000]IF TRCV.NDR THEN [/COLOR]
CASE Count OF
1..8: IF RcvData[0] = 'A' AND RcvData[1] = 'C' AND RcvData[[COLOR=#ff0000]1[/COLOR]] = 'K' THEN [COLOR=#ff0000]//??? musste das nicht 2 heißen ?[/COLOR]
;
END_IF;
9..12: IF RcvData[0] = '0' THEN
NET_IO.DigiIn[Count-8] := FALSE;
ELSIF RcvData[0] = '1' THEN
NET_IO.DigiIn[Count-8] := TRUE;
END_IF;
13..16: IF CHAR_TO_INT(RcvData[0]) >= 48 AND CHAR_TO_INT(RcvData[0]) <= 57 THEN
BCD_Code := WORD_TO_DWORD(INT_TO_BCD(CHAR_TO_INT(RcvData[0]) - 48));
END_IF;
IF CHAR_TO_INT(RcvData[1]) >= 48 AND CHAR_TO_INT(RcvData[1]) <= 57 THEN
BCD_Code := SHL(IN:=BCD_Code, N:=4);
BCD_Code := BCD_Code OR WORD_TO_DWORD(INT_TO_BCD(CHAR_TO_INT(RcvData[1]) - 48));
END_IF;
IF CHAR_TO_INT(RcvData[2]) >= 48 AND CHAR_TO_INT(RcvData[2]) <= 57 THEN
BCD_Code := SHL(IN:=BCD_Code, N:=4);
BCD_Code := BCD_Code OR WORD_TO_DWORD(INT_TO_BCD(CHAR_TO_INT(RcvData[2]) - 48));
END_IF;
IF CHAR_TO_INT(RcvData[3]) >= 48 AND CHAR_TO_INT(RcvData[3]) <= 57 THEN
BCD_Code := SHL(IN:=BCD_Code, N:=4);
BCD_Code := BCD_Code OR WORD_TO_DWORD(INT_TO_BCD(CHAR_TO_INT(RcvData[3]) - 48));
END_IF;
NET_IO.AnaIn[Count-12] := DINT_TO_INT(DWORD_BCD_TO_DINT(BCD_Code));
17: IF RcvData[0] = 'S' THEN
FOR i := 1 TO 8 DO
NET_IO.StatusOut[i] := INT_TO_BOOL(CHAR_TO_INT(RcvData[9-i]) - 48);
END_FOR;
END_IF;
END_CASE;
[COLOR=#000000]Count := Count + 1; [/COLOR]
FOR i := 0 TO 23 DO
RcvData[i] := ' ';
END_FOR;
END_IF;
(*********************************************************)
(* Existing connection end *)
(*********************************************************)
IF PulseNegConn AND CONNECTED THEN
TDISCON.REQ := TRUE;
END_IF;
TDISCON(REQ := TDISCON.REQ,
ID := TCON_PAR.id);
IF TDISCON.DONE THEN
CONNECTED := FALSE;
TDISCON.REQ := FALSE;
Count := 1;
END_IF;
END_FUNCTION_BLOCK