emilio20
Level-1
- Beiträge
- 835
- Reaktionspunkte
- 20
-> Hier kostenlos registrieren
Hallo
ich habe Arduino mit dem ich eine TCP Verbindung aufbauen möchte.
Mit dem Siemens Beispiel funktioniert die Verbindung .
http://support.automation.siemens.c...objaction=csview&extranet=standard&viewreg=WW
Nun wollte ich in SCL eine Programm mit TCP Verbindung erstellen. Hierzu habe ich das vorhandnen NET_IO Programm abgeändert.
Leifer Funktioniert die Verbindung hiermit nicht. Kann mir jemand sagen was ich falsch mache ?
ich habe Arduino mit dem ich eine TCP Verbindung aufbauen möchte.
Mit dem Siemens Beispiel funktioniert die Verbindung .
http://support.automation.siemens.c...objaction=csview&extranet=standard&viewreg=WW
Nun wollte ich in SCL eine Programm mit TCP Verbindung erstellen. Hierzu habe ich das vorhandnen NET_IO Programm abgeändert.
Leifer Funktioniert die Verbindung hiermit nicht. Kann mir jemand sagen was ich falsch mache ?
Code:
TYPE UDT_ARDUINO_IO
NAME : Arduino
FAMILY : ''
AUTHOR : xxx
VERSION : 1.0
STRUCT
VALVE :ARRAY[1..19] OF INT;
END_STRUCT
END_TYPE
//**********************************************FB ARDUINO*******************************************************************************
FUNCTION_BLOCK ARDUINO
TITLE = 'Arduino'
NAME : Arduino
FAMILY : ''
AUTHOR : Zehe
VERSION : '1.0'
VAR_INPUT
CONNECT : BOOL;
ID : WORD;
DEV_ID : BYTE;
IP_ADDR1 : INT;
IP_ADDR2 : INT;
IP_ADDR3 : INT;
IP_ADDR4 : INT;
LOC_PORT :DINT;
REM_PORT :DINT;
END_VAR
VAR_IN_OUT
ARDUINO_IO : UDT_ARDUINO_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;
GETVALVE: ARRAY[0..12] OF CHAR := 'G','E','T','V','A','L','V','E',' ','X','X','$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));
//Port local Port
TCON_PAR.local_tsap_id[2] :=B#16#0;//WORD_TO_BYTE(DINT_TO_WORD(LOC_PORT));
TCON_PAR.local_tsap_id[1] :=B#16#0;//WORD_TO_BYTE(SHR(IN:=DINT_TO_WORD(LOC_PORT),N:=8));
TCON_PAR.local_tsap_id_len:=B#16#0;//B#16#2;
//Port REM Port
TCON_PAR.rem_tsap_id[2] :=WORD_TO_BYTE(DINT_TO_WORD(REM_PORT));
TCON_PAR.rem_tsap_id[1] :=WORD_TO_BYTE(SHR(IN:=DINT_TO_WORD(REM_PORT),N:=8));
TCON_PAR.rem_tsap_id_len:=B#16#2;
// Set leagth of the IP address
TCON_PAR.rem_staddr_len := B#16#4;
(*********************************************************)
(* 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..9: GETVALVE[9] := INT_TO_CHAR(0 + 48);
GETVALVE[10] := INT_TO_CHAR(Count + 48);
TempPointer := GETVALVE;
10..19:
GETVALVE[9] := INT_TO_CHAR(1 + 48);
GETVALVE[10] := INT_TO_CHAR(Count-10 + 48);
TempPointer := GETVALVE;
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 := TRCV.LEN,
DATA := RcvData);
END_IF;
BCD_Code := 0;
IF TRCV.NDR THEN
CASE Count OF
1..19: 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;
ARDUINO_IO.VALVE[Count] := DINT_TO_INT(DWORD_BCD_TO_DINT(BCD_Code));
END_CASE;
Count := Count + 1;
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
Zuletzt bearbeitet: