NEWS
widgets mit einem Word belegen / Bit Aufschlüsselung
-
Hallo zusammen,
ich war schon im Visualisierungs-Kategorie unterwegs und bräuchte ien paar Tipps.
Ich möchte Widgets mit eine Word belegen und entsprechen Werte schreiben und lesen.
Das ganze hat den Hintergrund, dass ich unser Haus an eine SPS hängen hab und diese nur eine bestimmte Anzahl an Variablen schreiben/lesen kann. Deswegen habe ich sehr viele boolsche Variablen als Word zusammen gefasst.
Das muss jetzt wieder im IO-Broker zerlegt werden.
Als Beispiel beim Licht:
Bit 0: Software Schalter
Bit 1: Licht ist an
Dafür möchte ich einen bool.button aus dem hqwidget nehmen.
allerdings bin ich (noch) keine Erfahrung mit Javascript und dem entsprechenden ansprechen der Funktionen (z.B. button betätigt)
ich hoffe hier kann mir jemand helfenGruß T.Spooner
-
@t-spooner
Prinzip mit Beispiel Kommando = Bit 3 und Rückmeldung = Bit 2:// IDs anpassen! const idVis = '0_userdata.0.xyz'; // boolean const idWord = 's7.0.abc'; var word = getState(idWord).val; on({id: idWord, ack: true}, function(dp) { word = dp.state.val; setState(idVis, !!(word & 4), true); // bit 2 }); on({id: idVis, change: 'ne', fromNe: 'system.adapter.javascript.0'}, function(dp) { const bitval = 8; // bit 3 if(dp.state.val) word |= bitval; else word &= ~bitval; setState(idWord, word); });
-
@paul53
danke für den Tipp, aber mir stellt sich schon die nächste Frage:
Die Variable idWord ist klar, aber was ist die idVis?
das ist doch die zum Button gehörige Variable, oder sehe ich das falsch?
Wo deklariere ich die bzw wo sehe ich die? -
@t-spooner sagte: idVis? das ist doch die zum Button gehörige Variable
Ja.
@t-spooner sagte in widgets mit einem Word belegen / Bit Aufschlüsselung:
Wo deklariere ich die bzw wo sehe ich die?
Dafür muss ein eigener Datenpunkt vom Typ "boolean" unter "0_userdata.0" erstellt werden.
-
@paul53
Ok habe es hinbekommen, und wieder ne Frage (wirst mich jetzt nicht mehr los ).
Wie sage ich dem Button jetzt, dass die Leuchte an ist?
Übrigens musste ich ne kleine Änderungen machen und zwar hier:
.
Es dreht sich nämlich um das erste Bit, dass die Rückmeldung gibt.
Kannst mir mir da nochmals auf die Sprünge helfen? -
@t-spooner sagte: Wie sage ich dem Button jetzt, dass die Leuchte an ist?
Bei mir funktioniert es so (es ist kein Taster):
Mit Vis kenne ich mich aber nicht wirklich aus.
@t-spooner sagte in widgets mit einem Word belegen / Bit Aufschlüsselung:
Übrigens musste ich ne kleine Änderungen machen und zwar hier:
Das war auch nur ein Beispiel. Die Kommentare sind falsch: Wert 1 ist Bit 0, Wert 2 ist Bit 1.
-
@paul53 ok.
Danke mal vorab -
@t-spooner
Beispiel für ein 4-Bit-Wort, beliebig erweiterbar:// IDs anpassen! const idWord = 'beckhoff.0.plc.PLCIOB.Buro_Light.wReply'; const idVis1 = '0_userdata.0.Buero.Licht'; // boolean const idVis2 = '0_userdata.0.xyz'; var word = getState(idWord).val; on({id: idWord, ack: true}, function(dp) { word = dp.state.val; setState(idVis1, !!(word & 2), true); // bit 1 setState(idVis2, !!(word & 8), true); // bit 3 }); on({id: idVis1, change: 'ne', fromNe: 'system.adapter.javascript.0'}, function(dp) { const bitval = 1; // bit 0 if(dp.state.val) word |= bitval; // set bit else word &= ~bitval; // reset bit setState(idWord, word); }); on({id: idVis2, change: 'ne', fromNe: 'system.adapter.javascript.0'}, function(dp) { const bitval = 4; // bit 2 if(dp.state.val) word |= bitval; // set bit else word &= ~bitval; // reset bit setState(idWord, word); });
-
@paul53 habe dein Script hier gefunden und sollte ebenfalls deine Unterstüzung haben da ich es nicht wirklich verstehe, kannst du mir weiter helfen
on({id: idWord, ack: true}, function(dp) { word = dp.state.val; setState(idVis1, !!(word & 2), true); // bit 1 setState(idVis2, !!(word & 8), true); // bit 3 });
Meine Fragen zu dem Code:
- Wieso hast du hier "ack:true" verwendet
- Wann werden bzw. wie werden die Bits wieder auf false gesetzt
- Was machen die zwei !!, habe was gelesen das du hier zweimal negierst und indirekt eine Typenwandlung von Word auf Bool machst, stimmt das oder liege ich hier komplett falsch
on({id: idVis1, change: 'ne', fromNe: 'system.adapter.javascript.0'}, function(dp) { const bitval = 1; // bit 0 if(dp.state.val) word |= bitval; // set bit else word &= ~bitval; // reset bit setState(idWord, word); });
- Wieso gibt es hier ({id: idVis1, change: 'ne', fromNe: 'system.adapter.javascript.0'}, zwei Aufzählungen change 'ne' und fromNe: 'sys..'
- Was macht fromNe
Grund: Habe einen WR der ebenfalls ein Statuswort hat, das würde ich gerne in einzelne Bits zerlegen damit ich die Stati in meiner VIS anzeigen kann
Aufbau Statuswort, Beispiel:
Batterie Laden => Bit 1 = 0 => Nicht Laden
Batterie Laden => Bit 1 = 1 => LadenBatterie Entladen => Bit 2 = 0 => Nicht Entladen
Batterie Entladen => Bit 2 = 1 => EntladenLeistungsbezug => Bit 5 = 0 => Keine Leistung aus dem Netz
Leistungsbezug => Bit 5 = 1 => Netz Bezugvielen Dank für deine Unterstüzung
Alex
-
@captainchaos666 sagte: Meine Fragen zu dem Code:
-
Wieso hast du hier "ack:true" verwendet
Weil in einen eigenen Datenpunkt unter "0_userdata.0" geschrieben wird -
Wann werden bzw. wie werden die Bits wieder auf false gesetzt
Wenn das Wort an der Bitposition eine 0 enthält -
Was machen die zwei !!
Wandeln die Zahlen 0 und 1 in false und true. -
Was macht fromNe
Verhindert ein Triggern, wenn die Quelle der Wertänderung ein Skript ist: Dient zur Vermeidung von Endlos-Trigger-Schleifen.
Bit 1: Maske 2; Bit 2: Maske 4; bit 5: Maske 32
-