Registervariable mit fester Länge

Hallo Zusammen,

ich möchte meine neue Klimaanlage von Samsung mit in das IP-Symcon integrieren. Die Geräte kommunizieren über eine RS 485 und sind sehr geschwätzig. Das Protokoll ist recht einfach aufgebaut. Jedes Telegramm hat eine Länge von14 Zeichen und beginnt stets mit eine 0x32.
Nun habe ich eine I/O Instanz Serial Port angelegt und mit eine Register variable Verknüpft. In der Doku gibt es zum bereits ein Beispielscript, welches die Daten bei eine fixen länge ausliest. Dies habe ich auf die Länge 14 korrigiert und mit der Register variable Verknüpft.


<?

// wenn das Skript von einer RegisterVariable-Instanz aus aufgerufen worden ist
if ($_IPS['SENDER'] == "RegisterVariable")
{
    // 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 14 Zeichen lang ist
    if (strlen($data) >= 14)
    {
        // $data in Blöcke von bis zu 14 Zeichen zerlegen
        $datasets = str_split($data, 14);
        // $data leeren
        $data = "";

        // alle Datensätze durcharbeiten
        for ($i = 0; $i < count($datasets); $i++)
        {
            // vollständige Datensätze (genau 16 Zeichen lang) ausgeben
            if (strlen($datasets[$i]) == 14)
            {
                //echo "!!!!!".bin2hex($datasets[$i])."
";
                SetValueString (22616 /*[var\Klimaanlage\Dataset]*/ ,bin2hex($datasets[$i]));
            }
            else
            {
                // Unvollständige Datensätze in $data schreiben
                $data = $datasets[$i];
            }
        }
    }

    // Inhalt von $data im Puffer der RegisterVariable-Instanz speichern
    RegVar_SetBuffer($_IPS['INSTANCE'], $data);
}
?>

Wenn man den Dienst IP-Symcon startet funktioniert das auch sehr gut. Die Ergebnis ist dann wie folgt:
OK.png

Leider verschieben sich dann irgendwann die Zeichen und ich kann dann nichts mehr damit anfangen.
Die debug Ausgabe von der seriellen Schnittstelle sieht dann immer noch gut aus:


Die Daten aus dem Script sehen dann so aus:
fehler.png
Die Ausrufungszeichen sind von mir zum einfacheren filtern in den Meldungen vorangestellt.

Kennt jemand eine Lösung um hier die synchronität zu erhalten?
Danke und Gruß,
Dietmar

Wäre das nicht der richtige Job für den Cutter ?
Solange Anfang und Ende gleich sind und bleiben, dürfte das klappen :o

Try it

LG Tom

Danke Tom,

hab’s mal eingerichtet. Mal sehen wies es läuft.

Gruß,
DIetmar

Hallo Tom,

sieht bis jetzt sehr gut aus.
Danke nochmal.