NEWS
SOLVED Datenpunkte zusammenführen switch + state
-
@BBTown sagte in Datenpunkte zusammenführen switch + state:
@Elektroniker86 der Aufwand ist ja der gleiche wie bei einem Script
Ja genau, deswegen hier ja die Frage an die Profis ob es da ne elegantere Lösung gibt.
-
Ich habe mal gezählt, es wären ca. 55 neue Datenpunkte/ Scripte. Wie wirkt sich das denn auf die Performance aus?
-
@Elektroniker86 sagte:
Wie wirkt sich das denn auf die Performance aus?
Kaum. Beim RAM-Verbrauch schon etwas mehr, aber wenn dadurch der Szenen-Adapter eingespart wird, sogar weniger.
-
@Elektroniker86 ob das überhaupt eine Auswirkung hat, dass musst Du schon ausprobieren.
Ich sehe dazu aber überhaupt keine Alternative, also ist das sowieso nebensächlich .... denke ich zumindest mal -
Ok, trotzdem vielen Dank für eure Hilfe!!!
-
So, ich habe mal ein Blockly für oben beschriebenes Problem gebaut.
Es funktioniert, aber würdet ihr vielleicht nochmal drüber schauen ob man das eventuell noch optimieren könnte?Vielen Dank im vorraus!
-
@Elektroniker86 sagte:
Es funktioniert,
Genügt es, den Taster-Datenpunkt auf true zu aktualisieren oder muss er nach kurzer Zeit auf false gesetzt werden ?
Dann schlage ich folgendes Skript vor, das beliebig kopiert werden kann und in dem jeweils nur die IDs in Zeilen 2 und 3 angepasst werden müssen. Die Datenpunkte für Vis usw. werden automatisch unter Verwendung des Taster-Namens erzeugt.// IDs anpassen const idButton = 's7.0.abc.NI19'; const idActor = 's7.0.xyz.Q19'; const js = 'system.adapter.javascript.' + instance; const common = getObject(idButton).common; const idVis = 'Logo.' + common.name.replace(' ', '_'); common.read = true; createState(idVis, getState(idActor).val, common); on({id: idVis, change: 'ne', fromNe: js}, function() { setState(idButton, true); }); on(idActor, function(dp) { setState(idVis, dp.state.val, true); });
-
Ja genau, es reicht den Taster Datenpunkt einmal auf true zu setzen.
Danach springt er nach einer Sekunde automatisch wieder auf false.Cool, vielen Dank für deine Mühe. Werde das Script morgen testen.
Wo werden dann die Datenpunkte angelegt ?
Hätte da schon gerne ein Ordner unter Javascript.0/LOGO/s7.0........s7.1.........s7.2 usw.Damit das soweit geordnet ist wie beim s7 Adapter unter Objekte.
-
@Elektroniker86 sagte:
Wo werden dann die Datenpunkte angelegt ?
Unter javascript.0.Logo.
Beispiel: "javascript.0.Logo.Wandleuchten_Terasse" -
Ah ja, das heißt wenn ein Datenpunkt unter "javascript.0.Logo.s70.Wandleuchten_Terasse" landen soll dann muss das cript so aussehen?
// IDs anpassen const idButton = 's7.0.abc.NI19'; const idActor = 's7.0.xyz.Q19'; const js = 'system.adapter.javascript.' + instance; const common = getObject(idButton).common; const idVis = 'Logo.s70' + common.name.replace(' ', '_'); common.read = true; createState(idVis, getState(idActor).val, common); on({id: idVis, change: 'ne', fromNe: js}, function() { setState(idButton, true); }); on(idActor, function(dp) { setState(idVis, dp.state.val, true); });
-
@Elektroniker86 sagte:
muss das cript so aussehen?
Fast - es fehlt noch der Punkt hinter s70
const idVis = 'Logo.s70.' + common.name.replace(' ', '_');
-
@Elektroniker86 sagte in Datenpunkte zusammenführen switch + state:
// IDs anpassen const idButton = 's7.0.abc.NI19'; const idActor = 's7.0.xyz.Q19'; const js = 'system.adapter.javascript.' + instance; const common = getObject(idButton).common; const idVis = 'Logo.s70' + common.name.replace(' ', '_'); common.read = true; createState(idVis, getState(idActor).val, common); on({id: idVis, change: 'ne', fromNe: js}, function() { setState(idButton, true); }); on(idActor, function(dp) { setState(idVis, dp.state.val, true); });
Alles klar ja den Punkt hatte ich vergessen.
So, ich habe eben das Script getestet soweit alles in Ordnung.
Allerdings kann ich die Aktoren nicht über den neuen Datenpunkt schalten.
Wenn sich der Status vom Aktor ändert dann wechselt der neue Datenpunkt entsprechend mit, passt ja.
Aber ich muss von dem neuen Datenpunkt auch den "Aktor" /Button ansteuern können. -
So habe ich das jetzt eingetragen, sollte doch so passen?
-
@Elektroniker86 sagte:
kann ich die Aktoren nicht über den neuen Datenpunkt schalten.
Das soll in Zeilen 13 bis 15 passieren: Tastendruck, wenn sich der Wert ändert, außer die Änderung erfolgt aus dem Skript. Füge mal vor Zeile 14 ein Log ein:
on({id: idVis, change: 'ne', fromNe: js}, function() { log('Tastendruck'); setState(idButton, true); });
-
@paul53 sagte in Datenpunkte zusammenführen switch + state:
on({id: idVis, change: 'ne', fromNe: js}, function() { log('Tastendruck'); setState(idButton, true); });
// IDs anpassen const idButton = 's7.0.DBs.DB1.NI02'; const idActor = 's7.0.DBs.DB1.Q02'; const js = 'system.adapter.javascript.' + instance; const common = getObject(idButton).common; const idVis = 'LOGO.s7-0.' + common.name.replace(' ', '_'); common.read = true; createState(idVis, getState(idActor).val, common); on({id: idVis, change: 'ne', fromNe: js}, function() { setState(idButton, true);on({id: idVis, change: 'ne', fromNe: js}, function() { log('Tastendruck'); setState(idButton, true); }); }); on(idActor, function(dp) { setState(idVis, dp.state.val, true); });
So?
-
@Elektroniker86 sagte:
So?
Nein, so:
// IDs anpassen const idButton = 's7.0.DBs.DB1.NI02'; const idActor = 's7.0.DBs.DB1.Q02'; const js = 'system.adapter.javascript.' + instance; const common = getObject(idButton).common; const idVis = 'LOGO.s7-0.' + common.name.replace(' ', '_'); common.read = true; createState(idVis, getState(idActor).val, common); on({id: idVis, change: 'ne', fromNe: js}, function() { log('Tastendruck'); setState(idButton, true); }); on(idActor, function(dp) { setState(idVis, dp.state.val, true); });
-
Javascript spuckt das im Log aus::
13:48:51.637 info javascript.0 Stop script script.js.common.LOGO.s7-0.Deckenleuchte_Zimmer_KG_hinten
13:48:51.657 info javascript.0 Start javascript script.js.common.LOGO.s7-0.Deckenleuchte_Zimmer_KG_hinten
13:48:51.658 info javascript.0 script.js.common.LOGO.s7-0.Deckenleuchte_Zimmer_KG_hinten: registered 2 subscriptions and 0 schedules
13:48:58.646 info javascript.0 Stop script script.js.common.LOGO.s7-0.Deckenleuchte_Zimmer_KG_hinten
13:49:01.052 info javascript.0 Start javascript script.js.common.LOGO.s7-0.Deckenleuchte_Zimmer_KG_hinten
13:49:01.053 info javascript.0 script.js.common.LOGO.s7-0.Deckenleuchte_Zimmer_KG_hinten: registered 2 subscriptions and 0 schedules -
@Elektroniker86 sagte:
Javascript spuckt das im Log aus:
Hast Du den Wert des Datenpunktes geändert (z.B. in Vis). Nur dann erscheint "Tastendruck" im Log.
-
Im Vis habe ich noch überhaupt nichts geändert. Ich habe jetzt nur erst mal zum test ein Script angelegt und das ganze teste ich unter objekte .... Javascript.LOGO.s7-0.
Wenn es in Objekte Funktioniert, dann muss der Rest auch funktionieren oder nicht?
Wenn ich am neuen Datenpunkt z.B auf true klicke dann wird die Button ID nicht angesteuert.
-
@Elektroniker86 sagte:
es reicht den Taster Datenpunkt einmal auf true zu setzen.
Danach springt er nach einer Sekunde automatisch wieder auf false.Das passierte wohl im Szene-Adapter ? Dann muss dieses Verhalten auch im Skript erzeugt werden.
// IDs anpassen const idButton = 's7.0.DBs.DB1.NI02'; const idActor = 's7.0.DBs.DB1.Q02'; const js = 'system.adapter.javascript.' + instance; const common = getObject(idButton).common; const idVis = 'LOGO.s7-0.' + common.name.replace(' ', '_'); common.read = true; createState(idVis, getState(idActor).val, common); on({id: idVis, change: 'ne', fromNe: js}, function() { log('Tastendruck'); setState(idButton, true); setTimeout(function() { setState(idButton, false); }, 500); }); on(idActor, function(dp) { setState(idVis, dp.state.val, true); });