Werte vom seriellen Port in Variablen schreiben?

Hallo,
ich empfange 10 Werte vom Seriellen Port:

Strom1: 21mA; Strom2: 12mA; Strom3: 0mA; Strom4: 0mA; Strom5: 0mA; Strom6: 0mA; Strom7: 0mA; Strom8: 0mA; Strom9: 0mA; Strom10: 0mA; <\r><
>

Dann habe ich eine Cutterinstanz erstellt. Da die Länge variiert habe ich nach Zeichen geschnitten:
Links „Doppelpunkt Leerzeichen“ und Rechts: „mA;“

In der Registervariable kommen nun die 10 Werte nacheinander an.

Diese möchte ich nun per Skript in 10 Variablen schreiben und hier komme ich nicht weiter:


<?
$IPS_VARIABLE = RegVar_GetBuffer(55563 /*[Stromzähler\Arduino\Auswertung_Arduino\RegisterVariable]*/);
$data = explode(";", $IPS_VARIABLE);
SetValue(22821, $data[0]);

echo "test2", $data[0];
?>

  1. bleibt meine Variable leer und wird auch nicht geschrieben
  2. wie kann ich die 10 Werte auf 10 Variablen aufteilen? in der Registervariable ist ja kein „;“ mehr drin. Oder sollte ich alles im Skript machen und nicht über den Cutter?

Gruß, Tobias

Das paßt auch nicht so ganz, was du da im Script machst, weil RegVar_GetBuffer brauchst du nicht, da du ja schon im Cutter die Daten zerschneidest.

Ist aber mit dem Semikolon auch eher schlecht, zumal du das Trennzeichen \r
gar nicht beachtest.

Mach mal folgendes, stelle im Cutter auf HEX und rechtes Trennzeichen auf ‚0D 0A‘.
Jetzt kommt ganz sicher immer ein Datensatz von 10 Werten in der RegVar an und landet dann bei dir im Script in $_IPS[‚VALUE‘].

Dann kannst du das hier mal ausprobieren, ich habe es aber jetzt nicht getestet ;):


        $part = explode("; ", $_IPS['VALUE']);  // nach Semikolon+Leerzeichen trennen
	array_pop($part); // der letzte ist immer leer => wegwerfen
        $Werte=array();
        foreach ($part as $set)  // alle "StromX: YYmA"  Teile durchlaufen
        {
            $pairs = explode(": ", $set);  // nach Doppelpunkt Leerzeichen trennen
            $Werte[(int)substr($pairs[0],5)] = (int)substr($pairs[1],0,-2); // Zeichen abschneiden und in eine Zahl wandeln.
        }
        var_dump($Werte);
//        SetValue(12345,$Werte[1]); // Strom1
//        SetValue(23456,$Werte[2]); // Strom2

SetValue musst du natürlich anpassen und das var_dump ist nur zur Kontrolle (siehst du im Meldungsfenster) und solltest du dann rauswerfen.

Es ist dann auch egal ob Strom1 an erster oder 5 Stelle kommt.

Michael

Hallo Michael,

vielen Dank für den Code. Wie muss ich denn IPS_SetValue anpassen?
Habe es so versucht und die Registervariable eingetragen:


$part = explode("; ", $_IPS(37774/*[IP-SymconWEB-Oberfläche\Stromzähler\Arduino Strom]*/));  // nach Semikolon+Leerzeichen trennen

anscheinend ist die Variable falsch oder das Format…
Fatal error: Function name must be a string in C:\IP-Symcon\scripts\42925.ips.php on line 3

Ich bin da wirklich blutiger Anfänger…

Gruß, Tobias

Du darfst da oben nix ändern.
$_IPS[‚VALUE‘] enthält automatisch die Daten aus der RegVar. Siehe hier:
Systemvariablen — IP-Symcon :: Automatisierungssoftware

Du musst nur unten das auskommentierte am Ende anpassen.
Also erst Variablen in IPS anlegen und die IDs dann im Script bei SetValue eintragen (da wo 12345 und 23456 steht).

Michael

Hallo Michael,

so sieht das bei mir aus:
Unbenannt.PNG

Das Skript „Auswertung“ wird regelmäßig aufgerufen. In der RegisterVariable im Debugmodus werden auch die Werte angezeigt - also der Cutter funktioniert.

In das Skript von dir habe ich die beiden Variablen eingetragen.


<?

   $part = explode("; ", $_IPS['VALUE']);  // nach Semikolon+Leerzeichen trennen
    array_pop($part); // der letzte ist immer leer => wegwerfen
        $Werte=array();
        foreach ($part as $set)  // alle "StromX: YYmA"  Teile durchlaufen
        {
            $pairs = explode(": ", $set);  // nach Doppelpunkt Leerzeichen trennen
            $Werte[(int)substr($pairs[0],5)] = (int)substr($pairs[1],0,-2); // Zeichen abschneiden und in eine Zahl wandeln.
        }
        var_dump($Werte); // Werte in der Skriptausgabe ausgeben
        IPS_SetValue(47443 /*[Stromzähler\Arduino Strom\Strom01]*/,$Werte[1]); // Strom1
        IPS_SetValue(20044 /*[Stromzähler\Arduino Strom\Strom02]*/,$Werte[2]); // Strom2

?>

trozdem kommt immer die Fehlermeldung:

Notice: Undefined index: VALUE in C:\IP-Symcon\scripts\42925.ips.php on line 3
array(0) {
}

Fatal error: Call to undefined function IPS_SetValue() in C:\IP-Symcon\scripts\42925.ips.php on line 12

Vielen Dank für deine Gelduld,
Tobias

Das mit den SetValue war mein Fehler.

Das heißt nicht IPS_SetValue, sondern nur SetValue.
Ich ändere das oben mal ab.

Wann kommt die Fehlermeldung ?

Undefined index: VALUE in C:\IP-Symcon\scripts\42925.ips.php on line 3

Wenn du das Script über die Console ausführst ?
Das funktioniert nicht, das Script wird ausschließlich über die RegisterVariable gestartet.
Darum auch der Hinweis, dass die Ausgabe vom var_dump auch nur im Meldungsfenster erscheint.

Diese Zeile solltest du dann später auch auskommentieren / löschen.

Michael

Sehr schön, vielen dank - es läuft!!! :smiley:

Ich habe das falsch verstanden.
Ich dachte ich könnte erst mal sehen, ob die Werte im Skript ankommen und später die Variablen eintragen.
Und JA, der Fehler ist immer gekommen, wenn ich das Skript von hand ausgeführt habe…
Jetzt habe ich alle 10 Variablen eingetragen und es funktioniert!
Den Befehl „var_dump($Werte);“ habe ich jetzt auskommentiert - aber den werde ich später wohl auch bei anderen Skripten sehr gut nutzen können.

Also vielen Dank und schönes Wochenende,
Tobias

Gern geschehen :slight_smile:
Danke und gleichfalls.
Michael