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.
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.
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?
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…
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.
<?
/*
*******************************
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.
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!
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
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.