Ein Freund von mir bat mich vor einiger Zeit um Hilfe für die Einbindung eines Energiezählers über Lan.
Die Einbindung musste über PicoC erfolgen, da es sich um eine bidirektionale TCP-Verbindung handelt.
Das ganze hat auch eigentlich funktioniert, aber wenn das Skript, dass ich geschrieben habe, einige Stunden im Betrieb ist, hört die Abfrage einfach auf.
Wenn der Fehler auftritt, scheint das Skript offenbar in Frührente zu gehen, da ich keine Abfrage an den Zähler über Wireshark erkennen kann und auch der Loxone Monitor auf Level 3 keine Spur mehr aufzeigt vom Skript, wenn ihm Daten gesendet werden.
Weil ich noch nicht so viel Berufserfahrung habe in der IT und es vorher noch nie mit Loxone Servern zu tun hatte, hoffe ich, dass mir jemand hier vielleicht helfen kann.
Hardware:
Energiezähler: Elster AS3000 mit einer AM300 Ethernet Erweiterung.
Loxone Miniserver 1 Gen.
Die Projektseite:
// /?20285298!\r\n (nummer ist nur ein Beispiel) #define RD_BLOCK_SIZE 1000 char szBuffer[RD_BLOCK_SIZE]; char ps[RD_BLOCK_SIZE]; int nCnt; int iplength; int znumlength; int ifstate = 0; int j; float input; char* ip; char* znum; char* ascii = "\r\n"; while(TRUE) { while(input == 0 || iplength == 0 || znumlength == 0) { //Prüft ob alle nötigen Daten empfangen wurden input = getinput(0); ip = getinputtext(0); znum = getinputtext(1); iplength = strlen(ip); znumlength = strlen(znum); sleeps(2); } strcat(znum,ascii); while(input > 0) { for(int i=0; i < 10; i++) { STREAM* pTcpStream = stream_create(ip,0,0); //Stream oeffnen char* pTcpCmd = znum; stream_write(pTcpStream,pTcpCmd,strlen(pTcpCmd)); stream_flush(pTcpStream); nCnt = stream_readline(pTcpStream,szBuffer,RD_BLOCK_SIZE, 4000); if(2 > nCnt) { stream_close(pTcpStream); } if(2 < nCnt) { break; } sleeps(1); } if (nCnt == -1) { setoutput(0,1); // Sendet eine 1 wenn ein Fehler auftritt } if(pTcpStream != NULL) { while(1 != nCnt) { // Liest den Stream aus if(1 < nCnt) { sleep(200); } nCnt = stream_readline(pTcpStream,szBuffer,RD_BLOCK_SIZE, 4000); printf("%d", nCnt); if(nCnt > 0) { ps = szBuffer; setoutputtext(0,ps); // Ausgabe des Streaminhalts } j++; if(-1 == nCnt && j > 2) { // Beendet den Stream bei unerwarteter Unterbrechung break; } } } stream_close(pTcpStream); iplength = 0; znumlength = 0; input = 0; setoutput(0,0); j = 0; } }
Kommentar