IPS_VALUE und serielle Schnittstelle

Guten Tag

Ich versuche ein Möller Easy Steuerrelais via serieller Schnittstelle abzufragen.

Ablauf:

  • Via serieller Schnittstelle Abfragebefehl an die Easy senden
  • Die Antwort der Easy wird in eine Register Varable gelesen
  • Die Register Variable startet ein Script
  • Das Script wertet die seriellen Daten via $IPS_VALUE aus

Leider ist die Länge des empfangenen Datenstroms befehlsabhängig (keine konstante Länge) und hat am Schluss des Datenstromes noch eine 2-Byte Checksumme angehängt. Da heisst, ich kann mit dem Cutter nichts machen.
Die Länge des empfangenen Strings wird in Byte 2 mitgeteilt.

Problem:
Solange der Datenstrom nicht länger wie 8 Byte ist, funktioniert alles bestens.

Ist der empfangene Datenstrom länger (zum Beispiel 14 Byte) wird das Script zweimal ausgeführt/getriggert, einmal für die ersten 8 Byte und ein zweites Mal für die restlichen 6 Byte.

Kann man den seriellen Empfangsbuffer vergrössern damit IPS später triggert?
oder
Wie kann ich den zweigeteilten String wieder zusammensetzen?

Danke für eure Hilfe
Erwin

Hallo Erwin,

das die Daten unregelmässig ankommen liegt am Comport, da kannst Du nichts machen.

Hast Du es mal mit RegVar_GetBuffer probiert.

Hier mal zur Info.

Sendet die Easy ein Steuerzeichen mit als Anfang des Datenstrings, wenn ja könnte man über ein Script arbeiten.

Die Lösung mit dem RegVar_SetBuffer/GetBuffer ist gut. Die Tatsache, dass das Skript doppelt ausgeführt wird, sollte ja kein Problem darstellen. (Bitte niemals eine String Variable für Binärdaten nehmen. Das ist langsam und kann außerdem die Settings kaputt machen)

Da das Script über RegVar auch seriell ausführt wird, musst du keine Angst haben, dass „Daten“ gleichzeitig oder verschoben ausgewertet werden. Es wird alles nacheinander abgearbeitet.

paresy

Hallo Rainer, Hallo Paresy

Danke für die schnelle Hilfe. RegVar_SetBuffer/GetBuffer schaut nach einer weiteren, eleganten Lösung aus.

@paresy: Etwas verwirrt mich:

Du schreibst:
„Bitte niemals eine String Variable für Binärdaten nehmen. Das ist langsam und kann außerdem die Settings kaputt machen“

In der Refernz steht:
boolean RegVar_SetBuffer ( integer $InstanzID, string $Puffer )

So wie ich das verstehe, ist $Puffer als String definiert. Bekommen ich da mit meinen binären Daten jetzt Probleme?

Erwin

Das war auf IP-Symcon Variablen bezogen. Im PHP Skript kannst du natürlich alles machen - Das beeinflusst ja IPS nicht.

paresy

Folgendes funktioniert:

$buf = RegVar_GetBuffer(123);
$buf .= $IPS_Value;
WENN Datenstream vollständig
Datenstream verarbeiten
SONST
Teilstream mit RegVar_SetBuffer(123,$buf) zwischenspeichern

Der Buffer wird jeweils vom auslösenden Befehl gelöscht (siehe posting 1)

Besten Dank