COMPort Solaranlage auslesen

Hallo,
ich komme alleine nicht mehr weiter, vielleicht kann mir jemand helfen.
Ich möchte die Daten meiner Solaranlage auslesen über den COMPort
dafür wurde mir grad folgende Beschreibung zugeschickt:


1.)    0x55 schicken (cmd für Lesen)
2.)    warten auf empfang von 0x55
3.)    4 byte (DWORD) Adresse schicken
4.)    1 byte Anzahl der Datenbytes die gelesen werden sollten
5.)    warten auf quittung (0x55)
6.)    warten auf Anzahl der Datenbytes

Die Adresse ist die erste Zahl in jeder Zeile einer VFP-Edit Datei.

Lesen von Fühlerwerten:
1 Byte von Adresse 0 lesen.
--> Die Steuerung gibt Ausgangszustände und Fühlerwerte selbständig aus

kann mir jemand anhand dieser Beschreibung nun sagen was ich jetzt wie an den COMPort senden muß um die Daten zu bekommen ?

Lese Dir erstmal die Beschreibung des Comport und Register-variable-Moduls (hier )durch.
Dann erstellst du dir eine Instance des Comport und Register-Variable-Moduls und verbindest beide wie beschrieben. Der Variable im Register-Veriable-Modul gibst Du einen eindeutigen Namen z.B „Solardaten“. Diese muss vom Typ String sein. Die Com-Schnittstelle muss mit den Schnittstellendaten der Solaranlage geöffnet werden.

Dann kannst du Dein Script anfangen. Als Beispiel kannst du Dir auch meine M232-Steuerung in der Scripte-Sektion ansehen.

Als erstes soll 0x55 gesendet werden:


$cominstance=xxxx; //Deine Instance-ID
COMPort_SendText($cominstance,hexdec('55'));

dann warten auf 0x55


do
sleep (1); //1 sek. warten
$data=getValueString("Solardaten");
SetValueString("Solardaten",''); //zurücksetzen
while ($data{0}==chr(hexdec('55'));

als nächstes die 4 Byte der Adresse. Gute frage, ob das höchste oder niedrigste Byte zuerst kommen muss. Im zweifel die For-Schleife einfach umdrehen. Unklar ist mir auch, ob die Adresse Binär,hex, oder als String gewünscht wird. Ich nehme mal an binär.


// 1Byte von adresse 0000 lesen
$anzahl=1;
$adresse="0000";
for ($i=0;$i<4;$i++) {
   $byte=$adresse{$i};
   COMPort_SendText($cominstance,hexdec($byte));
}
COMPort_SendText($cominstance,$anzahl);

nun wieder Warten auf 0x55wie oben

alle dann folgenden Bytes sollten nun den Daten gehören.

Viel Spass

HTH
Tommi

Hallo tommi,
besten Dank, so werde ich das jetzt erstmal testen.

Den Comport und die Register-Variable hatte ich bereits verbunden,
denn die Daten kommen bisher schon immer automatisch alle 5min. von der Solaranlage, jedoch war mir die Dauer von 5min. immer zu lang.

So wollte ich nun probieren die Daten in kürzeren abständen zu bekommen,
wußte aber nicht wie ich der Anlage das mitteile.

Hallo tommi,

habe den code noch ein bischen modifiziert


<?
$cominstance= 13367; //Deine Instance-ID
COMPort_SendText($cominstance,chr(hexdec('55')));

do {
IPS_Sleep(400); //400 msek. warten
$data= GetValueString("register");
SetValueString("register",''); //zurücksetzen
}
while ($data{0}==chr(hexdec('55')));

// 1Byte von adresse 0000 lesen
$anzahl=1;
$adresse="0000";
for ($i=0;$i<4;$i++) {
   $byte=$adresse{$i};
   COMPort_SendText($cominstance,chr(hexdec($byte)));
}

COMPort_SendText($cominstance,"$anzahl");


do {
IPS_Sleep(200); //200 msek. warten
$data= GetValueString("register");
SetValueString("register",''); //zurücksetzen
}
while ($data{0}==chr(hexdec('55')));

?>

nun läuft es wunderbar :-))

danke nochmal für den guten Ansatz

Hallo Klaus,
nur so am Rande. Da es ja verschiedene Hersteller von Solarsteuergeräten gibt wäre für mich interessant, von welchem Hersteller Deine Steuerung ist.

MfG

Schlimmmerfinger

Hallo Schlimmmerfinger,

es handelt sich um eine Hanazeder SH-8 VFP Steuerung