• Das Erstellen neuer Accounts wurde ausgesetzt. Bei berechtigtem Interesse bitte Kontaktaufnahme über die üblichen Wege. Beste Grüße der Admin

Durchlauf Array erstellen

Philipp00

New member
Hallo zusammen

ich möchte für einen Alarm ausgabe ein Array erstellen, ich habe drei Zeilen mit Alarmtext und möchte immer die aktuellste auf die erste Zeile nehmen und die andern nachrücken bis diese wieder rausfallen.

Leider funktioniert es noch nicht ganz wie ich es möchte, sprich habe momentan einfach 3 verschiedene IF abfragen, was jedoch nicht funktioniert, die neuen Alarme werden nicht richtig an oberster Stelle eingefügt.
Kann jemand helfen?;-)

Java1.PNGjava2.JPG
 
Bezüglich dem item.state bin ich etwas überfragt.

Anbei findet ihr den Text.

HTML:
var arrayAlarms = [];
var filter = {};
filter.address = ["g:AGENT.OBJECTS.*"];
filter.type = [];
	//filter.type.push("v:1");		// node
	filter.type.unshift("v:2");		// alarm	
	filter.init = ["v:true"];
	// initial raw values for AGENT.OBJECTS.MyData.*
	webMI.data.subscribeFilter(filter, function(e) {
		var item = e;
    // ...
    console.log(item);
    if(item.state == 1 && item.ActiveStateId == true){
		webMI.gfx.setText("txtAlarmDatum1", "22-09-2020");
		webMI.gfx.setText("txtAlarmbedinung1", item.InputNode);
		webMI.gfx.setText("txtAlarmzeile1", item.eventtext.de);
		webMI.gfx.setText("txtAlarmStatus1", item.ActiveState.de);
		}
	if(item.state == 2 && item.ActiveStateId == true){	
		webMI.gfx.setText("txtAlarmDatum2", "22-09-2020");
		webMI.gfx.setText("txtAlarmbedinung2", item.InputNode);
		webMI.gfx.setText("txtAlarmzeile2", item.eventtext.de);
		webMI.gfx.setText("txtAlarmStatus2", item.ActiveState.de);
		}
		
	    if(item.state == 3 && ActiveStateId == true){
		webMI.gfx.setText("txtAlarmDatum3", "22-09-2020");
		webMI.gfx.setText("txtAlarmbedinung3", item.InputNode);
		webMI.gfx.setText("txtAlarmzeile3", item.eventtext.de);
		webMI.gfx.setText("txtAlarmStatus3", item.ActiveState.de);	
		//arrayAlarms.push({id:address.address, address:c.address, eventtext:item.eventtext.de});
	}
 
Zuletzt bearbeitet von einem Moderator:
Und was genau meinst du hiermit?

ich möchte für einen Alarm ausgabe ein Array erstellen

Was ist für dich ein Alarm? Und was genau meinst du mit Array in diesem Zusammenhang?
Du musst bitte mal mit eigenen Worten beschreiben, wie es am Ende aussehen soll. Lass mal Fachbegriffe und Code ganz weg.
Und wichtig: wo kommen die Nutzdaten her und wie genau sehen sie aus?
 
Hallo zusammen

Ich möchte die letzen drei Alarmmeldungen die über Objecte ausgebgen werden (siehe Foto unten) in einem weisen Rahmen anzeigen (siehe Foto).
Dabei soll es so sein das immer die aktuellste Meldung oben stehen und nur solange diese Aktiv ist, wenn diese nicht mehr aktiv ist soll diese von selbst verschwinden.
Daher auch das Array.
Hoff konnte es euch so verständlich erklären.



Javascript_Object.PNG
Javascript_Object1.PNG
 
OK dann brauchen wir die Beispieldaten noch in Textform. Als Image kann man damit nicht arbeiten.
Und der Abruf/Bezug der Daten ist schon fertig oder ist das auch Bestandteil der Frage? Ich nehme an, JSON per AJAX? Oder anderes? Du schreibst von Objecten, wo kommen die her? Oder geht es einzig um die Anzeigesteuerung?
 
Die Daten werden vom Webserver empfangen zum Beispiel von einer SPS, nach mir werden die Objekte dann vom Webserver generiert (siehe Printscreen)

HTML:
var arrayAlarms = [];
var filter = {};
filter.address = ["g:AGENT.OBJECTS.*"];
filter.type = [];
	filter.type.push("v:2");							// alarm	
	filter.init = ["v:true"];							// initial raw values for AGENT.OBJECTS.MyData.*
	webMI.data.subscribeFilter(filter, function(e) {
		var item = e;
    // ...
    console.log(item);
    if(item.state == 1 && item.ActiveStateId == true){
		webMI.gfx.setText("txtAlarmDatum1", "22-09-2020");
		webMI.gfx.setText("txtAlarmbedinung1", item.InputNode);
		webMI.gfx.setText("txtAlarmzeile1", item.eventtext.de);
		webMI.gfx.setText("txtAlarmStatus1", item.ActiveState.de);
		}

- - - Aktualisiert - - -

Nach mir werden die Meldungen mit "filter.address = ["g:AGENT.OBJECTS.*"];" gefiltert.
Eigentlich Funktioniert der Code so, jedoch wird immer nur die erste Meldung angezeigt und nicht wie gewünscht immer die aktuellst zu oberst.

- - - Aktualisiert - - -

so sieht es dann aus, wenn ich einen Alarm auslöse immer der neust steht zu oberst, leider werden die anderen nicht auf die unteren Zeile verschoben.


Javascript_Alarm.JPG
 
Zuletzt bearbeitet von einem Moderator:
ok jetzt sind wir genau einmal im Kreis rum wieder bei der Frage von kkapsner.
Die Anzeige scheint ja von einer externen Komponente webMI.gfx.setText() vorgenommen zu werden. Und es besteht eine maßgebliche Bedingung mit item.state. Die Frage ist jetzt, wer kann uns bei diesen beiden Sachen Details geben?

M. E. musst du unbedingt herausfinden, wo item herkommt und wann item.state und item.ActiveStateId welche Werte annehmen. Bau doch mal noch ein paar mehr console.log() ein, um die Werte zu beobachten, wenn du die Info anders nicht bekommen kannst.

Und eine Info, wie man die Meldungen in webMI.gfx.setText() steuert kann wahrscheinlich auch nicht schaden. Schließlich müssen wir dem Ding sagen, dass es alles um einen verschieben, auf der einen Seite einen löschen und auf der anderen Seite einen einfügen soll, damit der gewünschte Durchlauf Effekt entsteht. Oder ist das schon bekannt, wie das geht?
 
Das Poblem ist einfach, wenn der Alarm einmal ausgelöst ist und per console.log() auf die oberte Zeile geschrieben wird, verändert sich dieser nur noch wenn ein neu Meldung hinzu kommt.
Jedoch sollte die meldung sobald " item.ActiveStateId == true" nicht mehr uf true steht wieder verschwinden.

Leider weiss ich nicht wie ich dem ding sage das es sich auf den nächsten Linie schieben soll, oder am Ende aus der Liste herausfallen soll.
 
Du willst Meldungen in der Console steuern? Glaube nicht dass das geht, weil die Console dafür nicht gemacht ist. Die dient der Entwicklung einer Webseite und der Fehlersuche.
Deine Meldungen wirst du in einem Container innerhalb des DOM der Webseite anzeigen müssen.
 
Ich glaube du verstehst nicht ganz was ich möchte.
Die Meldungen müssen nur angezeigt werden, auf der obsten Zeile wird ja bereits einen Meldung angezeit, dass ist auch gut so nur möchte ich diesen Meldung bei erhalten einer neuen Meldung um eine Zeile nach unten verschieben und so weiter bis die Meldung unten wieder rausfällt, sprich ab der vierten Position wird diese nicht mehr angezeigt und immer die neuste Meldung zu oberst erscheint.
 
Ja das habe ich verstanden aber die Konsole console.log() ist nur ein Entwicklerwerkzeug! Du kannst dort hinein schreiben, wenn du z. B. Fehler in deinem JS Code suchst. Das ist nicht zur darüber hinaus gehenden regelmäßigen Nutzung vorgesehen. Und man kann schon gleich gar nicht darin irgend welche Reihenfolgen definieren, Schriftarten verändern oder sonstige Spielchen machen. Zumindest ist das mein Kenntnisstand.

Warum ergänzt du in deiner Webseite nicht einfach ganz unten ein div und schreibst dort rein? Da kannst du dich dann austoben.
 
So mittlerweile ist etwas Zeit vergangen und ich habe mich versucht etwas weiterzubilden im Javascript

Ich glaub ich werde immer noch nicht ganz richtig verstanden, Grundsätzlich warte ich ja nur bis ein Obejekt meine Bedingung für die if Anweisung erfüllt.
Die möchte ich dann auf der obersten Zeile anzeigen, sobald das nächste Objekt diese if bedinung erfüllt, wird dies an der obersten Stelle angezeigt und verdrängt das erste Objekt auf die zweite Zeile, dies läuft dann so weiter bis es nach der dritten Zeile wieder unten rausfällt, da nur drei anzeige Zeilen vorhanden sind.

So soll immer die aktuellste Meldung an oberster Stelle stehen.

Was noch dazu kommt, sobald ein Objekt nicht mehr aktiv ist, soll dies automatisch gelöscht werden.

Hoff konnte es etwas verständlicher erklären.
 
Ich fange noch mal von vorne an mit einer ganz einfachen Frage: wo genau soll die gewünschte Anzeige zu sehen sein? Zeige bitte ein Screenshot und umrande den Bereich rot.
 
Hallo zusammen

Ich versuche es nochmals.
Ich auf drei Zeilen (siehe Anhang Pos 1-3) Alarmmeldungen darstellen, dies Alarmmeldungen werden mittls Objekt angezeit (siehe Code unten), wenn ich das richtig verstehe wird mittels der Variable 'filter' die Objekte in der Konsole (Browser, siehe Anhang) ausgegeben.
Der zweite Schritt ist die Anzeige der Objekte (ausgewählte Punkte) im Alarmfeld (Pos 1-3), dies funktioniert soweit auch, mit der if Anweisung (if(item.state == 1 && item.ActiveStateId == true)) werden zwei Werte überprüft, wenn diese erfüllt sind, werden die gwünschten Infos angezeigt, soweit so gut.
Nun mein Problem, ich möchte nun immer die neuste meldung auf Pos 1 haben, z.B. mit einem vergleich des Zeitstempel, wann dieses Objekt ausgelöst wurde, sobald dann ein neues Objekt ausgelöst wird, kommt dieses an die oberste stelle und dass andere wird aus Pos 2 geschoben, dies läuft so weiter bis die meldung unten wieder rausfällt (nach Pos. 3). Zusätzlich müsste das Objekt automatisch wieder rausfallen, wenn die If bedinung nicht mehr erfüllt ist.

Hoff so ist es etwas verständlicher.

- - - Aktualisiert - - -

Anbei findet ihr noch den Code.

Code:
var arrayAlarms = [];                                         // Array für die Zeilen 
var filter = {};                                                 // Variable um das Objekt in der Konsole darzustellen 
filter.address = ["g:AGENT.OBJECTS.*"];
filter.type = [];

	
filter.type.push("v:2");			// alarm	
filter.init = ["v:true"];    		// initial raw values for AGENT.OBJECTS.MyData.*
	
webMI.data.subscribeFilter(filter, function(e) {
	var item = e;

  console.log(item);
	if(item.state == 1 && item.ActiveStateId == true){
		webMI.gfx.setText("txtAlarmDatum1", formattedTime);		
                webMI.gfx.setText("txtAlarmbedinung1", item.InputNode);
		webMI.gfx.setText("txtAlarmzeile1", item.eventtext.de);
		webMI.gfx.setText("txtAlarmStatus1", item.ActiveState.de);
		}}



Alarmfenster im Browser.JPG
Fenster_Konsole.JPG
 
wenn ich das richtig verstehe wird mittels der Variable 'filter' die Objekte in der Konsole (Browser, siehe Anhang) ausgegeben
Einen Zusammenhang zu filter sehe ich nicht. Woher nimmst du die Annahme?
Diese Ausgabe hätte ich jetzt eher console.log(item) zugeschrieben, ist aber nur eine Vermutung.

Der zweite Schritt ist die Anzeige der Objekte (ausgewählte Punkte) im Alarmfeld (Pos 1-3)
Das dürfte wahrscheinlich durch webMI.gfx.setText() erfolgen.

Nun mein Problem, ich möchte nun immer die neuste meldung auf Pos 1 haben, z.B. mit einem vergleich des Zeitstempel, wann dieses Objekt ausgelöst wurde, sobald dann ein neues Objekt ausgelöst wird, kommt dieses an die oberste stelle und dass andere wird aus Pos 2 geschoben, dies läuft so weiter bis die meldung unten wieder rausfällt (nach Pos. 3).
Dann müsste man hier vermutlich die Reihenfolge der Abarbeitung umstellen. Ist es das was du meinst?
Oder man baut die webMI.gfx.setText() um.

Da ich aber für beide Alternativen nicht den betreffenden Code sehe und du bisher im gesamten Thread noch keine einzige Sachfrage (im Sinne eines Satzes mit Fragezeichen am Ende) gestellt hast, weiß ich nicht mehr was ich noch antworten soll.
Zeig' doch mal den für dein Ansinnen betreffenden Code.
Oder gib' einen Link oder mache ein Fiddle.
 
Du hast recht, der consol.log (item) sorgt für die Ausgabe der Objekte und das WebMi.gfs.set.Text sorgt für die Ausgabe in der Spalte Pos. 1., dass passt eigentlich auch alles.

Eigentlich geht es mir nur um den Block mit der if-Anweisung, diese muss nach mir irgendwie in einen Array verpackt werden, der drei mal diesen Block enthält und die Meldung auf Pos 1-3 verteilt.
Mit dem Kriterium das die aktuellste meldung zu oberst steht und nicht mehr aktive meldungen automatisch verschwinden.

Hoff das bringt etwas für das verständnis.

Habt ihr eine IDEE??
 
Zurück
Oben