Hallo,
ich nutze den Baustein IP_CONTROL um über eine Socket Verbindung meine Wärmepumpe (Luxtronic) abzufragen.
Das Protokoll besteht aus:
- Sende Paket 1 an WWP: 00 00 0b bc
- Sende Paket 2 an WWP: 00 00 00 00
- Empfange Daten 820 Bytes mit Werten
Das Programm funktioniert, die Daten in der ersten Ausführung an.
In der Zweiten Ausführung wird nur noch Paket 00 00 00 00 gesendet.
In der dritten Ausführung erhalte ich einen Error im IP_C.C_ERROR
In der vierten Ausführung klappts dann (meistens) wieder
usw. usw.
Ich vermute die State-Machine hat noch einen Fehler, oder ich habe irgendwas übersehen beim sauberen Verbindungsabbau?
Bin für jeden Tipp dankbar!
Das ist der Code:
(* IF the send command is active AND the system is busy, ignore the send request *)
IF xSend THEN
(* Init status variables *)
xSend := FALSE;
xBusy := TRUE;
iStep := 0;
S_BUF.SIZE := 0; (* reset send-buffer *)
IP_C.C_PORT := uiPort;
IP_C.C_IP := IP4_DECODE('192.168.50.120');
IP_C.C_MODE := 0;
IP_C.TIME_RESET := TRUE;
IP_C.R_OBSERVE := TRUE;
IP_C.C_ENABLE := TRUE;
IPClient.TIME_OUT := T#500ms;
END_IF
IF xBusy THEN
CASE iStep OF
0: (* SEND Paket 1 *)
S_BUF.BUFFER[0] := 16#00;
S_BUF.BUFFER[1] := 16#00;
S_BUF.BUFFER[2] := 16#0B;
S_BUF.BUFFER[3] := 16#BC;
S_BUF.SIZE := 4;
IPClient(IP_C := IP_C, S_BUF := S_BUF, R_BUF := R_BUF);
R_BUF.SIZE := 0;
IF IP_C.C_STATE = 255 THEN
iStep := 1;
END_IF
1: (* SEND Paket 2 *)
S_BUF.BUFFER[0] := 16#00;
S_BUF.BUFFER[1] := 16#00;
S_BUF.BUFFER[2] := 16#00;
S_BUF.BUFFER[3] := 16#00;
S_BUF.SIZE := 4;
IPClient(IP_C := IP_C, S_BUF := S_BUF, R_BUF := R_BUF);
R_BUF.SIZE := 0;
IF IP_C.C_STATE = 255 OR IP_C.C_STATE = 1 THEN
iStep := 2;
END_IF
IF IP_C.ERROR = 0 THEN
iStep := 10;
END_IF
2: (* CONVERT *)
FB_CONVERT(VAR_IN := R_BUF.BUFFER[0], VAR_OUT => status);
FB_CONVERT(VAR_IN := R_BUF.BUFFER[18], VAR_OUT => tempAussen);
FB_CONVERT(VAR_IN := R_BUF.BUFFER[13], VAR_OUT => tempVorlauf);
FB_CONVERT(VAR_IN := R_BUF.BUFFER[14], VAR_OUT => tempRuecklauf);
FB_CONVERT(VAR_IN := R_BUF.BUFFER[15], VAR_OUT => tempVorlaufS);
FB_CONVERT(VAR_IN := R_BUF.BUFFER[20], VAR_OUT => tempWWIst);
FB_CONVERT(VAR_IN := R_BUF.BUFFER[21], VAR_OUT => tempWWSoll);
FB_CONVERT(VAR_IN := R_BUF.BUFFER[24], VAR_OUT => tempMKVLIst);
FB_CONVERT(VAR_IN := R_BUF.BUFFER[25], VAR_OUT => tempMKVLSoll);
FB_CONVERT(VAR_IN := R_BUF.BUFFER[154], VAR_OUT => kwhHeizung);
FB_CONVERT(VAR_IN := R_BUF.BUFFER[155], VAR_OUT => kwhWasser);
iStep := 10;
10:
IP_C.C_ENABLE := FALSE;
IF IP_C.C_STATE = 0 THEN
xBusy := FALSE;
iStep := 0;
END_IF
END_CASE;
(*
IP_FIFO(FIFO:=IP_C.FIFO,STATE:=IP_STATE,ID:=IP_ID);
IP_C.FIFO:=IP_FIFO.FIFO;
IP_STATE := IP_FIFO.STATE;
IP_ID:=IP_FIFO.ID;
*)
END_IF
Variablen
PROGRAM PRG_LWP_SOCKET
VAR_INPUT
xSend : BOOL := FALSE;
END_VAR
VAR
(* Relevante Werte *)
(* siehe globale Variablenliste *)
IP_C : IP_C;
IP_FIFO : IP_FIFO;
IPClient : IP_CONTROL;
IPClient2 : IP_CONTROL;
IP_STATE : BYTE;
IP_ID : BYTE;
R_BUF : NETWORK_BUFFER;
S_BUF : NETWORK_BUFFER;
xBusy : BOOL := FALSE;
iStep : UINT := 0;
FB_CONVERT : FB_BYTESWAP_DWORD;
FB_SOCK_ERROR : SysSockGetLastError;
END_VAR