Register Variable COM-Port auslesen

Hallo zusammen,

ich quäle mich nun schon seit 2 Tagen mit einem kleinen Problem.

Ich lese die Daten eines Heizkessel aus einem COM-Port aus.

Diese kommen je nach gesendetem Befehl in einem Paket mit 5 , 100 o. 200 Zeichen an.

Auf dem COM-Port sehe ich die Daten ankommen. Mal mit einem Zeichen mal fünf Zeichen.

Ich sammle die Daten so wie im Beispiel von Register Variable angegeben.

if ($kommando == „Z510000“)
{
// bereits im Puffer der Instanz vorhandene Daten in $data kopieren
$data = RegVar_GetBuffer($_IPS[‚INSTANCE‘]);
// neu empfangene Daten an $data anhängen
$data .= $_IPS[‚VALUE‘];
// wenn $data mindestens 100 Zeichen lang ist
if (strlen($data) >= 100)

		{ Hier ist dann mein Scriptteil 
            }

else
{
RegVar_SetBuffer($_IPS[‚INSTANCE‘], $data);
}
}

Diese Abfrage habe ich dann insgesamt 5mal im Script stehen.

Es funktioniert auch alles. Was mich stört ist die Tatsache, daß das Script dann teilweise
100* durchlaufen muss um alle Teile des Datensatz voll zu bekommen.
Da ich in dem Skript für die verschiedenen Befehlsarten IF Abfragen einbauen muss wird dieses
auch schon recht lang und damit auch langsamer
Damit kann es auch schon mal ein paar Sekunden dauern und die Prozessorlast geht hoch.

Leider sendet die Steuerung kein festes Endzeichen für den Datensatz, sonst würde ich ja einfach
erstmal nach diesem Zeichen auswerten und die Auswertung in einem zweiten Script machen.

Gibt es keine elegantere Lösung hierfür ?

Habe mir schon einige Beispiele hier im Forum angeschaut, aber bisher bauen die alle
auf dem gleichen Prinzip auf.

Gruß Udo

Wenn es kein festes Trennzeichen am Ende gibt, dann fällt mir gerade keine elegantere Lösung ein.

paresy

@paresy

habe nochmal die Daten im Debugger des Serial-Port mitgeschrieben.
dort gibt es doch immer ein Zeichen am Ende jedes Datenpaket.

Es gibt immer ein „Quadrat“ als letztes Zeichen.

Bisher habe ich immer nur die Register Variable angeschaut, aber da erscheint das Zeichen ja nicht
wenn die Satzlänge erreicht ist.

Wie würdest du den dann vorgehen ??

Gruß Udo

Schalt doch mal auf Hex um; das ist sicher ein Trennzeichen.

Habe mir den String aus dem Buffer
mal in HEX ins Wordpad kopiert.
Kann den im Debugger nicht komplett sehen

seltsamerweise ist der letzte HEX verschieden obwohl er im Buffer immer gleich aussieht.

so habe ich mal 0F = Shift in, oder 16 = Sync oder 03 = END of Text.

Da werde ich wohl keine andere Lösung finden.

Ich habe jetzt mal testweise alles aus dem Script rausgenommen
und nur noch die Schleife mit dem Buffer füllen drin.

Da braucht das Script bei 100 Zeichen 6 Sekunden bis der Buffer voll ist.
Ist halt nur ein Atom 1600, aber der Rechner wurde ja als stromsparend
angeschafft.

Da muss es doch noch was anderes geben

Gruß Udo

Da ich ja den Befehl zum Senden der Daten aus IPS raus gebe und
solange keine neuen Daten kommen bis ich einen neuen Befehl sende,
gibt es keine Möglichkeit die empfangenen Daten auf einmal in den Buffer zu schreiben,
statt mit einer Schleife 100 x abzufragen ?

sagen wir z.B. nach 500ms oder so ?

Das Paket kann ich ja dann anhand des gesendeten Befehls auswerten.

Da die Anzahl der zu empfangenden Zeichen bekannt ist, braucht man nur den Befehl zu senden und dann die konkrete Anzahl an Zeichen einzulesen. Das geht direkt mit PHP vermutlich deutlich einfacher als mit den IPS-Funktionen.

fopen, fwrite, fread, fclose
In der Dokumentation zu diesen Befehlen gibt es Beispiele für serielle Schnittstellen.

Hallo Robi,

du meinst also den ganzen Serial Port und Register Variable rausschmeisen ?

Gruß Udo

Genau. Die Regelung sendet ja nicht von selbst Daten, sondern nur wenn man ihr einen entsprechenden Befehl gibt. Eine permanente Überwachung der Schnittstelle ist also überhaupt nicht erforderlich.

Hallo Robi,

danke für den Tip mit „fopen“ etc.

habe es hinbekommen sowohl senden als auch empfangen direkt aus PHP-Scripten

Wenn ich nun 100 Zeichen auslesen dauert das ganze 500ms incl. 200ms Pause nach dem Senden vor dem Einlesen

Der ganze IPS-Server läuft damit stabiler.
Selbst 3 oder 4 Abfragen hintereinander bringen ihn nicht mehr zum stocken und ich kann vernüftig sperren das sich zwei
Abfragen gegenseitig abschießen.

Jetzt kann ich mich mal an die ganze Steuerung machen.

Ist zwar nicht so schön bund wie bei Stokerkontrol, aber ich habe alles in einer Oberfläche und brauche nicht den Kunstgriff mit Stokerkontrol schließen und öffnen beim Datensenden zu machen.
Vielleicht mache ich mir mal irgendwann ein Dashboard like Stokerkontrol.

Stokerkontrol kommt dann auf mein Laptop damit ich im Falle eines Falles die analoge Regelung aktivieren und den Kessel auf die entsprechenden Werte setzen kann. Dann habe ich falls der IPS mal ausfallen sollte innerhalb von ein paar Minuten meine Heizung wieder am Laufen.

Gruß Udo