-> Hier kostenlos registrieren
Hi,
ich versuche Dummy-artig über einen Raspberry meine Wärmepumpe (Luxtronic Steuerung) per Socket-Connection abzufragen (Temperaturen etc.). Leider bin ich ein absoluter CodeSys Newbie.
Über z.B. PHP ziemlich simpel per:
Mein zusammengestöpseltes Programm per "irgendwo im Netz gefundene Vorlage" sieht so aus:
Deklarationen:
Programm PLC_PRG
Die Verbindung scheint zu klappen, ich bekomme einen Connection Handler. Das schreiben scheint er auch zu machen, aber es kommt nichts oder etwas unerwartetes zurück - siehe Screenshot aus dem online Modus.

1. Vermutung:
Im PHP Skript sende ich eine Zahl - 3004, die per "pack()" Befehl in einen binären Wert gewandelt wird - im CodeSys ist das Zeug mangels besserem Wissen als String deklariert.
Der Parameter "N*" in PHP bedeutet: vorzeichenloser Long-Typ (immer 32 Bit, Byte-Folge Big Endian), der "*" für Wiederholung bis ans Ende der Daten
Laut CodeSys debugger sendet er für pData den DWORD Wert "3061857692".
2. Vermutung:
Genereller Ablauf ist untauglich?
1000 Dank für Eure Hilfe,
Philipp
ich versuche Dummy-artig über einen Raspberry meine Wärmepumpe (Luxtronic Steuerung) per Socket-Connection abzufragen (Temperaturen etc.). Leider bin ich ein absoluter CodeSys Newbie.
Über z.B. PHP ziemlich simpel per:
Code:
$sBuff = 0;
$socket = socket_create(AF_INET, SOCK_STREAM,0);
$connect = socket_connect($socket, "192.168.50.107", 8888) || exit("socket_connect fehlgeschlagen");
// 3004 = Werte auslesen, 3003 Parameter setzen
$msg = pack('N*',3004);
$send=socket_write($socket, $msg, 4); //3004 senden
$msg = pack('N*',0);
$send=socket_write($socket, $msg, 4); //0 senden
socket_recv($socket,$Test,4,MSG_WAITALL); // Lesen, sollte 3004 zurückkommen
socket_recv($socket,$Test,4,MSG_WAITALL); // Status
socket_recv($socket,$Test,4,MSG_WAITALL); // Länge der nachfolgenden Werte
$Test = unpack('N*',$Test);
print_r($Test);
socket_close($socket);
Mein zusammengestöpseltes Programm per "irgendwo im Netz gefundene Vorlage" sieht so aus:
Deklarationen:
Code:
PROGRAM PLC_PRG
VAR_INPUT
xSend : BOOL := FALSE;
sDataSend : STRING;
END_VAR
VAR
strIPAddr : NBS.IP_ADDR;
uiPort : UINT;
nwClient : NBS.TCP_Client;
nwTCPWrite : NBS.TCP_Write;
nwTCPRead : NBS.TCP_Read;
sDataRecv : STRING := ''; // Final result value
sDataBuff : STRING(4095); // Buffer for composing result string
xBusy : BOOL := FALSE;
xSuccess : BOOL := FALSE;
xError : BOOL := FALSE;
iErrorCode : INT := 0;
iStep : INT := 0;
END_VAR
Programm PLC_PRG
Code:
// If the send command is active and the system is busy, ignore the send request
IF xSend THEN
IF xBusy THEN
xSend := FALSE;
END_IF
END_IF
IF xSend THEN
strIPAddr.sAddr := '192.168.50.107';
uiPort := 8888;
// Init status variables
xSend := FALSE;
xBusy := TRUE;
xSuccess := FALSE;
xError := FALSE;
iErrorCode := 0;
sDataRecv := '';
iStep := 0;
nwClient(xEnable := FALSE);
nwTCPRead(xEnable := FALSE);
nwTCPWrite(xExecute := FALSE);
END_IF
IF xBusy THEN
CASE iStep OF
0: // Prepare connection
nwClient(xEnable := TRUE, ipAddr := strIPAddr, uiPort := uiPort, udiTimeOut := 10000000);
IF nwClient.xActive THEN
// Successfuly connected
iStep := 1; // JUMP TO SEND DATA
ELSIF nwClient.xError THEN
// Error shile connection creation
nwClient.xEnable := FALSE;
xError := TRUE;
iErrorCode := 1; // Error creating connection: reason - 1
xBusy := FALSE;
ELSIF NOT nwClient.xActive AND NOT nwClient.xError AND nwClient.xDone THEN
nwClient.xEnable := FALSE;
xError := TRUE;
iErrorCode := 2; // Error creating connection: reason - 2
xBusy := FALSE;
END_IF
1,2: // Send data part 1
IF nwTCPWrite.xBusy = FALSE AND nwTCPWrite.xError = FALSE AND nwTCPWrite.xDone = FALSE THEN
IF iStep = 1 THEN
sDataSend := '3004';
ELSE
sDataSend := '0';
END_IF
nwTCPWrite.hConnection := nwClient.hConnection;
nwTCPWrite.pData := ADR(sDataSend);
nwTCPWrite.szSize := INT_TO_UDINT(LEN(sDataSend));
nwTCPWrite.udiTimeOut := 10000000;
nwTCPWrite.xExecute := TRUE;
END_IF
IF nwTCPWrite.xDone = TRUE THEN
// Data IS SENT!
nwTCPWrite.xExecute := FALSE;
IF iStep = 1 THEN
iStep := 2; // SEND WAITs
ELSE
iStep := 3; // JUMP TO READ
END_IF
ELSIF nwTCPWrite.xError THEN
// Send data ERROR
nwTCPWrite.xExecute := FALSE;
xError := TRUE;
iErrorCode := 3; // Data write error
xBusy := FALSE;
ELSE
nwTCPWrite();
END_IF
3: // Read data
nwTCPRead(xEnable := TRUE, hConnection := nwClient.hConnection, szSize := SIZEOF(sDataBuff), pData := ADR(sDataBuff));
IF nwTCPRead.xReady AND nwTCPRead.eError = 0 THEN
IF nwTCPRead.szCount > 0 THEN
sDataRecv := sDataBuff;
ELSE
sDataRecv := '';
END_IF
xError := FALSE;
iErrorCode := 0; // No error
xSuccess := TRUE;
xBusy := FALSE;
ELSIF nwTCPRead.eError <> 0 THEN
xError := TRUE;
iErrorCode := 4; // Data read error
xBusy := FALSE;
END_IF
END_CASE;
END_IF
Die Verbindung scheint zu klappen, ich bekomme einen Connection Handler. Das schreiben scheint er auch zu machen, aber es kommt nichts oder etwas unerwartetes zurück - siehe Screenshot aus dem online Modus.

1. Vermutung:
Im PHP Skript sende ich eine Zahl - 3004, die per "pack()" Befehl in einen binären Wert gewandelt wird - im CodeSys ist das Zeug mangels besserem Wissen als String deklariert.
Der Parameter "N*" in PHP bedeutet: vorzeichenloser Long-Typ (immer 32 Bit, Byte-Folge Big Endian), der "*" für Wiederholung bis ans Ende der Daten
Laut CodeSys debugger sendet er für pData den DWORD Wert "3061857692".
2. Vermutung:
Genereller Ablauf ist untauglich?
1000 Dank für Eure Hilfe,
Philipp
Zuletzt bearbeitet: