Read Data von Comport

Hallo,

um die Daten meiner Wärmepumpe THZ im iP-Syncom auszuwerten, habe ich einen TCP/IP <-> RS232 Wandler and die Wp gehängt.
In der Zwischenzeit weis ich auch schon was ich via RS232 senden muss um allgemeine Parameter (Laufzeiten der Pumpen, etc) vom Gerät zurück zu bekommen.
Wie jedoch bekomme ich die Daten vom RS232 in eine Variable
mein Script: bisher


<?

COMPort_SendText(40328 /*[Serial Port]*/, "\x02");
ips_sleep(200);
COMPort_SendText(40328 /*[Serial Port]*/, "\x01\x00\xFE\xFD\x10\x03");
ips_sleep(200);
COMPort_SendText(40328 /*[Serial Port]*/, "\x10");
$buf = RegVar_GetBuffer(59213 /*[Heizung\THZ\Register Variable]*/);
echo ("buffer:" . $buf);
?>

und noch ein Bild…

Mein Unterschied zur beschriebenen Variante unter: http://www.ip-symcon.de/forum/f52/newbie-fuer-newbies-register-variablen-10754/ ist, das ich ein Script ausführe was die Daten sendet und dann die Antwort weiterverarbeiten möchte.

sysncom_2.JPG

Die Registervariable-Instance muss als Parent die Comport-Instanz und mit einem Script verknüpft werden, welches die Daten vom ComPort in die Registervariable schreibt.

if ($IPS_SENDER == "RegisterVariable")
{
  $reg=12345; Registervariable Instance-ID
  // bereits im Puffer der Instanz vorhandene Daten in $data kopieren
  $data  = RegVar_GetBuffer($reg);
  // neu empfangene Daten an $data anhängen
  $data .= $IPS_VALUE;
  // Inhalt von $data im Puffer der RegisterVariable-Instanz speichern
  RegVar_SetBuffer($reg, $data);
 }

Dann kann man mit RegVar_GetBuffer($reg) die Daten bekommen. Der Buffer sollte dann mir Regvar_SetBuffer($reg,"") gleich wieder geleert werden.

Ich habe das auch für meine I2C-Lib so gemacht und hier auch nochmal beschrieben.
Tommi

danke für die Infos bis hier her. Ich tue mich noch etwas schwer mit der Komunikation auf der COM-Schnittstelle:
hier der Auszug aus einem ComportTrace


Port geöffnet durch Vorgang "LWZ303_V408.exe" (PID: 2768)
>>>>>>>>>>>>>>>>>>>Connection Aufbau Start>>>>>>>>>>>>>>>>>>>
Request: 07.09.2010 22:07:35.81464 (+21.2813 seconds)
 02                                                .               
Answer: 07.09.2010 22:07:35.81464 (+0.0000 seconds)
 10                                                .               
Request: 07.09.2010 22:07:35.82964 (+0.0156 seconds)
 01 00 FE FD 10 03                                 ..þý..          
Answer: 07.09.2010 22:07:35.86164 (+0.0000 seconds)
 10 02                                             ..              
Request: 07.09.2010 22:07:35.01764 (+0.0156 seconds)
 10                                                .               
Answer: 07.09.2010 22:07:35.03364 (+0.0156 seconds)
 01 00 D5 FD 00 D7 10 03                           ..Õý.×..        
Request: 07.09.2010 22:07:35.03364 (+0.0000 seconds)
 10                        
>>>>>>>>>>>>>>>>>>>Connection Aufbau fertig>>>>>>>>>>>>>>>>>>>

genau das will ich wenigstens erst einmal nachbauen um zu die schnittstelle besser zu verstehen.
und hier mein script bisher:


<?
include_once('thz_vars.ips.php');

COMPort_SendText($com_thz, "\x02");
$buf = RegVar_GetBuffer($reg);
echo ("buffer: " . hexdec($buf) . "
");
//ips_sleep(200);
COMPort_SendText($com_thz, "\x01\x00\xFE\xFD\x10\x03");
ips_sleep(200);
COMPort_SendText($com_thz, "\x10");
ips_sleep(200);
COMPort_SendText($com_thz,"\x01\x00\x0A\x09\x10\x03");
ips_sleep(200);
COMPort_SendText($com_thz,"\x10\x02");
ips_sleep(200);

$buf = RegVar_GetBuffer($reg);
echo ("buffer: " . hexdec($buf) . "
");
?>

allerdings steht im Buffer immer nur ‚0‘ drin. Im Debug der Registervariable sehe ich schon teilweise den richtigen Output.
und dann hier noch der Code der Register_Var:


<?
include_once('thz_vars.ips.php');
if ($IPS_SENDER == "RegisterVariable")
{
  // bereits im Puffer der Instanz vorhandene Daten in $data kopieren
  $data  = RegVar_GetBuffer($reg);
  // neu empfangene Daten an $data anhängen
  $data .= $IPS_VALUE;
  // Inhalt von $data im Puffer der RegisterVariable-Instanz speichern
  RegVar_SetBuffer($reg, $data);
  debug_log(IPS_GetName($reg), "data: $IPS_VALUE
");
 }

?>

Es wäre schön wenn sich ein Spezi für serielle Komunikation mit mir zusammen einmal dem Thema annehmen könnte…dann lässt sich ja für eine Stiebel Eltron Wärmepumpe vieleicht was richtig gutes draus machen…

Kommen die richtigen Daten wirklich im Debug der Registervariableninstance oder der Comportinstance. Wenn sie beim Comport kommen, aber im Debug der RegVar nicht, dann fehlt wahrscheinlich die Verbindung zwischen den Instancen (Comport als „Übergeordnete Instanz“ der RegvarInstanz eintragen). Wenn sie bei beiden kommen, dann bitte nachschauen, ob das RegVar-Script wirklich als Zielscript zugeordnet ist.
Tommi

Heureka, ich habs… der Inhalt des Buffers war nicht leer sonder binary Data. Das musste ich erst umwandeln.
Jetzt kann es weiter gehen mit dem Auseinandernehmen der Daten:


//einziger Unterschied...einige Sekunden ist die Uhr weitergelaufen
//1010020100d5fd00d71003101002010049f4009501dd023b003302470134023d00020001421e00640100000000f500000000000002000000f51003
//1010020100d5fd00d71003101002010049f4009601dd023b003302460134023d00020001421e00640100000000f500000000000002000000f51003
//Verdichter A: 438h
//Verdichter A: 443h
//Heizmodus: 16673h
//Brauchwassermodus: 4240h
//Kühlmodus: 0h
//Datum: 08.09.2010 (Mittwoch) 22:36:xx

//hier hat sich der wert Verdichter B auf 444h geändert und es ist jetzt 23:02:xx
//1010020100d5fd00d71003101002010056f400960067021d003602310135022200020001421e00640100000000f501cd0000000002000000f51003

Gib es spezielle Vorgehensweisen so etwas auseinander zu nehmen und an die geünschten Daten ranzukommen? Viele Messreihen mit dem Orig-Prog und einen Com-Port-Sniffer sind ja wichtig…aber wie analysiert man so etwas?

Ich muss mich mal einklinken, weil wir auch bald eine StiebelEltron Wärmepumpe bekommen undich diemöglichst einbinden möchte.

Hast Du bei dem Projekt schon weitere Erfahrung sammeln können?

mws

push… :slight_smile: