Komisches Phänomen mit Memo-Feld

Hallo,

ich habe eine Memofunktion zum Anzeigen von Messages erstellt. Hierfür habe ich fast genau den Tipp aus Thread 894 umgesetzt, siehe Code im Anhang.
Bis vor ca. einem halben Jahr gab es keine Probleme. Vor ca. 2 Monaten machte ich nach langer Zeit wieder ein Update des Designers und nun finde ich folgendes bisher nicht lösbares Problem vor:

Wenn ich den Designer starte, dann ist alles gut und die Messageliste wird komplett angezeigt. Wenn nun ein Script die Variable „LAST_MESSAGE“ mit einer neuen Message beschreibt, dann wird auf einmal im Memofenster nicht die an das Memofeld gebundene Variable „HMI_MSG_MEMO“, sondern nur die Variable „LAST_MESSAGE“ angezeigt. D.h. die gesamte Liste verschwindet und es wird nur der letzte Eintrag ohne Zeitstempel angezeigt. Eigenartigerweise ist die Variable "„HMI_MSG_MEMO“ richtig belegt, das kann ich im Variablen-Editor sehen. Völlig irre! Wie kann es sein, dass der Designer „LAST_MESSAGE“ anzeigt, obwohl im Designer eindeutig die andere Variable gebunden ist. Und warum tut er das nur bei Update von „LAST_MESSAGE“?

Habe ich ein Brett vor dem Kopf oder haben wir einen Programmfehler? Hilfe dringend erbeten, danke.

Peter

code.txt (1.15 KB)

Meinst das liegt am Designer?

Was steht den in der Variable selbst drin? Du kannst das unter „Variables“ - „Evaluate“ anzeigen lassen…

Gruß,

Toni

Wie ich schon schrieb, beinhaltet „HMI_MSG_MEMO“ genau den Wert den ich erwarte, nämlich die Liste der Messages. Daher wird ja auch bei Neustart des Designers bzw. bei Wechsel zwischen Edit/View-Mode im Designer die Liste komplett angezeigt. Und „LAST_MESSAGE“ beinhaltet auch den richtigen Wert.
Ja, ich meine, es liegt am Designer, aber ehrlich gesagt, wüsste ich auch nicht wo ich suchen soll. Gerne bereit, weitere Tests zu machen.

Peter

Ich würde mal folgendes Probieren:

  1. Message Feld löschen, neu anlegen (falls fehlerhafte Einstellungen)
  2. Script manuell starten und „LAST_MESSAGE“ am Anfang mal mit einem Wert definieren
  3. evt. mal zur Probe zwei andere Variable benutzen

Gruß Thomas

Das klingt ganz nach meinem Skript was du da benutzt. Ich habe das gleiche Phenomen. Manchmal ist das ganze Fenster leer (anstatt der meldungen) und es dümpelt nur so ein Einzeiler vor sich hin.
Dann stoppe ich den Designer und starte neu, dann geht es wieder.
Irgendwie wurde am ‚Memo‘-Objekt bei irgendeinem Update dran gefummelt, und nun geht es nicht mehr.
Vorhin gab es nie ein Problem damit.

@Paresy: Könnte es sein, dass die Stringlänge beschränkt ist und bei Überlänge etwas schief läuft?

Franz

Okay…

Hört sich doch nach Designer an… War auch nur ne Vermutung…

Toni

  1. Habe ich schon mehrfach versucht, kein Erfolg. Habe auch Variable gelöscht und neu angelegt.
    2./3. Habe nun viel mit neuen Variablen gespielt. Zum Anfang hat es immer geklappt, dann nach mehreren versuchen wieder das gleiche Ergebnis. Somit glaube ich, dass es ein Problem mit einem zu langen String gibt. Ein anderer poster hat hier ja ähnliches vermutet.
    Habe dann vor dem Aufruf auch mal die Memo-Variable gelöscht, sofort hat es wieder funktioniert, aber nur, bis die erste Zeile weggeschnitten wurde. Also hat es nichts mit alter/neuer Variable zu tun, sondern mit dem Verhalten innerhalb des Scripts. Aber egal, was in dem Script passiert, dass es sich so komisch äußert…

Peter

Noch ein Update. Ich habe im Script nun die Anzahl der Zeilen im Memo-Feld auf 10 begrenzt. Nun habe ich das problem nicht mehr, da irgendeine Variable nicht mehr zu groß wird. Ist ein Workaround. Danke für die Tipps.

Peter

Seltsam bei mir geht alles im Designer, hab allerdings seit geraumer Zeit kein Update gemacht, weil alles gut geht.

Mein Logging mache ich so:


<?
/*
*******************************
 IP-SYMCON Event Scripting
*******************************
File     : Log.ips.php
Trigger  : Ne Menge :-)
Interval : 
*/

 include("C:/Programme/IP-Symcon/scripts/Konstanten.ips.php");

 //------------- Loggen von wichtigen Variablen- & Scriptänderungen ------------

 if ($IPS_SENDER == "Variable")
 {
 
 $trig_var = $IPS_VARIABLE; // Variable die getriggert hat
 $trig_val = $IPS_VALUE; // Wert der Variablen
 $Datentyp = IPS_GetVariableType($IPS_VARIABLE); // Variablentyp bestimmen

 }
 
 //---------------------- Variablentypen Texte zuweisen ------------------------
 
 if ($Datentyp == "Boolean" and $trig_val =="1")
 {
 $trig_val = "an";
 }
 else
 {
 if ($Datentyp == "Boolean")
 {
 $trig_val = "aus";
 }
 }

 //----------------- aktuellen Trigger im Textfile schreiben -------------------

 //aktelle Meldung
 if($trig_var != "log_menge" and $IPS_COMPONENT != "filter") // Trigger Anzahl Werte nicht aufzeichnen
 {
 $log_datum = date("d.m.y");
 $log_zeit = date("H:i:s");
 $log_variable = $trig_var;
 $log_variablen_typ = $Datentyp;
 $log_variablen_wert = $trig_val;
 $handle=fopen("c:/logfile.txt", "a");
 fwrite($handle, "Datum: ".$log_datum." Zeit: ".$log_zeit.
 " ==> Trigger Variable: ".$log_variable.chr(9).
 " ==> Trigger Variablenwert: ".$log_variablen_wert."
");
 fclose($handle);
 }

 //-----------------------------------------------------------------------------

?>

Ausgabe für Designer:


<?
/*
*******************************
 IP-SYMCON Event Scripting
*******************************
File     : Log_Anzeige.ips.php
Trigger  : 
Interval : 
*/

 include("C:/Programme/IP-Symcon/scripts/Konstanten.ips.php");

 //----------------- wieviel Werte sollen Angezeigt werden ? -------------------

 if ($IPS_COMPONENT == "log_10")
 {
 SetValueInteger("log_menge", 10);
 }
 if ($IPS_COMPONENT == "log_100")
 {
 SetValueInteger("log_menge", 100);
 }
 if ($IPS_COMPONENT == "log_5000")
 {
 SetValueInteger("log_menge", 5000);
 }

 //---------------------------- Loggdatei anpassen -----------------------------

 $log_menge = GetValueInteger("log_menge");
 $logfile = file_get_contents("c:/logfile.txt"); //Logfile in variable einlesen
 $log_arr = explode("
", $logfile); // nach Zeilenumbruch trennen und in array
 $werte = count($log_arr); // Werte zählen

 $loeschen = $werte-$log_menge-1;

 for ($i=0; $i<$loeschen; $i++)
 {
 unset ($log_arr[$i]);
 }

 //-------------------- hier wird gefiltert für den Designer -------------------

 for ($loeschen; $loeschen<$werte; $loeschen++)
 {
 If ($Filter_1 and stristr($log_arr[$loeschen], 'Bewegungsmelder') or
 $Filter_2 and stristr($log_arr[$loeschen], 'Steckdose') or
 $Filter_3 and stristr($log_arr[$loeschen], 'Aufloesung') or
 $Filter_4 and stristr($log_arr[$loeschen], 'Mail') or
 $Filter_5 and stristr($log_arr[$loeschen], 'Touch') or
 $Filter_6 and stristr($log_arr[$loeschen], 'script') or
 $Filter_7 and stristr($log_arr[$loeschen], 'Dimmer') or
 $Filter_8 and stristr($log_arr[$loeschen], 'Wetter') or
 $Filter_9 and stristr($log_arr[$loeschen], 'Beitr') or
 $Filter_10 and stristr($log_arr[$loeschen], 'Geragentor') or
 $Filter_11 and stristr($log_arr[$loeschen], 'Modus') or
 $Filter_12)
 {
 //nichts machen
 }
 else
 {
 unset ($log_arr[$loeschen]); //löschen
 }
 }

 $log_ausgabe = implode("
", $log_arr); // in String zurück zum Designer
 SetValueString("log_ausgabe", $log_ausgabe);

?>


Das Problem wird wohl ab 500 Zeichen passieren. Bis 500 Zeichen werden die Werte direkt als Event verschickt. >500 wird nur der Designer benachrichtigt und er pollt die Variable manuell nach. Dort muss der Bug liegen.

Als Workaround die Variable vorerst auf 500 Zeichen limitieren.

paresy

Verstehe ich das jetzt richtig, dass dieses Problem ab einer neueren Version im Designer auftritt, als meiner, denn ich habe vieleicht 100.000 Zeichen in meiner Variablen stehen!

Gruß Thomas

Ok, werde dann mal die Anzahl von Meldungen mal runterschrauben.

Beim Webbrowser habe ich auch so 'ne Sache. Da ist auch manchmal das Feld leer, und es steht nur in grossen Buchstaben drin ‚FALSE‘

Soll das auch mit dieser ultralangen String Variable zusammenhängen ?

mfG Franz

So, heute morgen, kurz nach dem Aufstehen konnte ich wieder sehen, dass das Problem vorhanden ist. Vor dem Zubett-Gehen hatte ich sie ordentlich gekürzt, quasi Hälfte, d.h. 30 Zeilen nur. Anstelle des Inhaltes der Stringvariable, war nur ein kurzer Teil zu sehen, eigentlich nur eine Zeile. Ein Neustart des Designers (ohne irgendwas an der Stringvariable zu ändern!) brachte dann die gesamte Stringvariable wieder.
Da ist definitif ein Bug im Memofeld des Designers

Franz

Ich bin mir nicht so sicher. Aber ich glaube, ich habe ein ähnliches Verhalten mit einem Label im Designer:

In meiner Variablen namens „Fritzbox1“ -Typ string- ist folgendes gespeichert:

‚09.10.07 18:59:21;DISCONNECT;0;2638;‘

Ein Label im Designer hat die Caption „Fritzbox1“
Wenn ich den Designer starte, wird der vollständige Inhalt angezeigt.
Irgendwann -ich konnte es noch nicht nachstellen- erscheint dann nur noch:

‚09.10.07 18:59:21‘

obwohl die Variable noch den vollständigen Inhalt hat.
Beim Neustart ist alles beim alten

Vielleicht hat es mit den „;“ zu tun. Ich weiss es nicht.

Ich hatte ein ähnliches Problem schon reportet.
Siehe http://www.ipsymcon.de/forum/showthread.php?t=3482
Ich vermute dies ist das gleiche Problem.

Ist aber wohl liegengeblieben.

Gruß Thomas

Hallo Thomas,

stimmt, das dürfte des gleiche Phänomen sein.
Deshalb geht es wie von mir oben beschrieben auch ohne Probleme, mein Updatestand ist ein älterer.

Na das wird sich paresy sicher anschauen.:wink:

MfG Thomas

Paresy entgeht eigentlich nichts. Wenn er nix dazu sagt, muss nicht heissen, er tut da nix. Irgendwann ist es dann in einem Live-Update mit drin.

Franz

http://www.ipsymcon.de/beta/

Sollte gefixt sein. Bitte ausprobieren :wink:

paresy

@Thomas

Siehste, das ist was ich meine !

Franz

Hab’s bei mir übers Wochenende getestet.
Funktioniert wieder super.
Danke.

Thomas