RegisterVariable Fragen

Hi ich hätte einige Fragen zum RegisterVariable-Objekt. Leider ist die Beschreibung in der Doku für mich recht kryptisch.

Versteh ich es richtig, dass wenn über den Com-Port (den ich mit meiner RegisterVariable verbunden hab) ein Signal kommt, die RegisterVariable das ZielScript startet und in diesem die empfangenen Daten als $IPS_VALUE auslesbar sind? So hab ichs nämlich probiert und so funktionierts nicht.

Ich hab dann zum Testen per $IPS_LogMessage eine Message in den Log schreiben lassen, damit ich weiß, dass das Skript gestartet wurde, doch das funktioniert nur wenn ichs manuell starte, wenn was über den COM-Port kommt, erscheint zwar RegisterVariable aber sonst nichts.

Also wie verwendet man nun RegisterVariable?

EDIT: Ich starte das über COM-Port angeschlossene Gerät über ein IPS-Script und das Gerät antwortet mir dann. Kann es daran liegen, dass nicht zwei Scripte parallel ausgeführt werden, also das RegisterVariable das Auswerte-Script starten will, während das Sende-Script noch läuft?

So wie du es beschrieben hast, klingt es eigentlich ganz gut.

…erscheint zwar RegisterVariable…

Wie muss ich das verstehen? Wo erscheint was?

Hast du es in der RegVar ganz sicher mit dem ComPort verbunden?
Was siehst du jeweils in den Instanzen, wenn du DEBUG startest?

paresy

Ok hat sich erledigt, auf einmal gehts, hab nochmal IPS gestartet, nichts verändert und es ging?!? Ich werd mich mal noch auf die Suche machen und falls ich rausfinde, worans lag, schreib ich es hier rein.

RegisterVariable ist als Meldung im Log erschienen, für mich ein Zeichen, dass es korrekt mit dem Com-Port verbunden war.

Edit: Ok den Grund hab ich immer noch nicht gefunden, aber mir ist aufgefallen, als es nicht ging, wurden die empfangenen Daten nicht im Debug-Fenster angezeigt. Und obwohl RegisterVariable im Log erschien, wurden auch dort die empfangenen Daten nicht als Array angezeigt.

Habe nun ein weiteres Problem mit der RegisterVariable -.- Mein Gerät sendet eine Datenreihe aber aus irgendeinem Grund wertet RegisterVariable die empfangene 10-Byte-Nachricht in einer 8-Byte-Nachricht und einer 2-Byte-Nachricht aus. Dadurch stimmt aber natürlich Prüfsumme und Länge nicht.
Wie kann ich es schaffen, dass IPS die 10 Byte am Stück verarbeitet?

IPS-Data.JPG

Hallo
Ich mach das so:

Leg Dir ne Puffervariable an. Im Beispiel ist das 14564.
dann liest Du erst den Puffer ein und daran hängst Du dann $IPS_VALUE an.

$buf = getvalue(14564 /*[Diverse\Edip 1\Register Xbee\Buffer]*/); //Puffer einlesen
if ($IPS_SENDER == "RegisterVariable")
$buf .=  $IPS_VALUE; // neuen Wert hinzufügen

Danach musst Du natürlich überprüfen ob die länge erreicht ist, dann die Daten weiterverarbeiten bzw. Prüfsumme überprüfen und den Puffer löschen

setvalue(14564,"");

.

Hoffe das hilft schonmal weiter

Gruß Jannis

Hallo Magmaster - Hallo Jannis,

besser keine eigene Variable hierfür verwenden (siehe Doku). Die Registervariable besitzt bereits eine „Puffer-Variable“

Lösung:

$buf = RegVar_GetBuffer(12345); //Puffer einlesen 
if ($IPS_SENDER == "RegisterVariable") 
$buf .=  $IPS_VALUE; // neuen Wert hinzufügen  

Zum Schreiben in den Puffer:

RegVar_SetBuffer(12345, $buf);

Inhalt des Puffers löschen:

RegVar_SetBuffer(12345,"");

wieder was gelernt ^^

ich hab das auch mit einer eigenen BufferVar gelöst … das Doku zu der RegisterVariablen hat sich mir nicht so erschlossen.

Muss ich gleich mal in meinem Skript testen.

Den Hinweis keine Variable zu nutzen sollte wirklich beherzigt werden, wenn man nicht irgendwann mal ein IPS ohne eine funktionierende Config haben will.

paresy

Ich hab das Ganze inzwischen mittels CutterInstanz gelöst. Als ich rausfand, dass es sowas gibt erschien es mit als beste Lösung. :smiley:

Habe inzwischen allerdings ein Folgeproblem:
Wie man inzwischen wohl rausgefunden hat, versuche ich ein Protokoll auszulesen. Ich hab mir das nun so vorgestellt, das ich ein Skript starte, das während des gesamten Auslesevorgangs läuft, dh. die Befehle sendet, sie empfängt, prüft, verarbeitet und schließlich entscheidet was als nächstes gesendet wird.

Nur wie bekomme ich jetzt die Antworten in mein laufendes Skript? Wenn ich das Steuerskript als Zielskript angeben, dann wird ja eine neue Instanz des Skripts parallel gestartet und ich kann auf die Laufzeitvariablen des ersten Skripts nicht mehr zugreifen (in dem wichtige Infos gespeichert werden, auf Grund derer das Skript entscheiden kann was als nächstes passieren soll). Die Laufzeitvaribalen als IPS-Variablen setzen will ich nicht, aus Performancegründen und weil man dort keine Arrays ablegen kann.

Ich hab dann versucht mir dem oben genannten GetBuffer-Befehl und einer while Schleife den RegisterVariable-Puffer passiv auszulesen, aber offensichtlich geht das nicht, warum weiß ich auch nicht.

Skript sieht so aus:


function sync($Befehl) {
    Befehl_senden($Befehl); //Befehl senden
    while(RegVar_GetBuffer(52114 /*[Register Variable]*/ ) == NULL) {} //Auf Antwort warten
    $antwort = RegVar_GetBuffer(52114 /*[Register Variable]*/); //Antwort in Variable schreiben
    if(!test_antwort($antwort)) { //Antwort auf Fehler prüfen
        die('Fehler');
    }
    return $antwort;
}

$antwort = sync($start_befehl) { 
switch ($antwort) { // Entscheiden was als nächstes passiert.
    case antwort1:
        sync($befehl1);
etc.etc.

Das Skript bleibt dann in der while-Schleife hängen, dh. der Puffer scheint leer zu bleiben, obwohl im Debug-Fenster eine Antwort erscheint.
Irgendwelche Vorschläge wie ich meinen Weg realisieren könnte, bzw. wieso ich den Puffer nicht auslesen kann?

swich ($antwort) { // Entscheiden was als nächstes passiert. 

Schreibfehler oder steht es so im Script ?

switch !

Ähm ja war ein Schreibfehler, aber ich hab den Teil nur der Vollständigkeit dazugetextet, ist sonst etwas umfangreicher. Es geht vorallem eben um die while-Schleife, die durch den GetBuffer die empfangene Antwort auslesen soll, was allerdings nicht funktioniert, obwohl die Antwort laut Debug-Fenster bei der RegisterVariable ankommt ?!?

Bist du hier weitergekommen?

Gruss

hightower

Nicht besonders, nein. Die einzige Möglichkeit, dass Skripte untereinander kommunizieren ist anscheinend über Variablen, aber das dauert mir zu lange.

Hat jemand eine andere Lösung?