Seite 1 von 1

E3DC-Modbus, Bit auswerten

Verfasst: 07.03.2024, 14:13
von joesch
Hallo zusammen!

Aktuell lese ich dank der Veröffentlichungen im Forum erfolgreich die Messwerte eines E3DC aus (Auszug aus der Function-Node):

Code: Alles auswählen

var ui32a = new Uint32Array(msg.payload);

msg1 = {};
msg2 = {};
...
var pvi = 0;
var bat = 0;
...
pvi += ui32a[0];
pvi -= ui32a[1];
bat += ui32a[2];
bat -= ui32a[3];
...
...
msg1.payload = pvi;
msg2.payload = bat;
...
return [msg1,msg2,msg3,msg4,msg5,msg6,msg7,msg8,msg9,msg10];
Dabei handelt es sich um "Zahlenwerte", die ich grafisch darstelle und in Systemvariablen schreibe.
Bei den Werten für die Wallbox werden die jeweiligen Zustände/Flags biteise ausgegeben:
wb01.PNG
wb01.PNG (7.75 KiB) 408 mal betrachtet
wb02.PNG
Kann mir jemand bezügich des "bitweisen" Auslesens der Werte helfen? Sprich wie kann ich auslesen, ob z.B. der Solarmodus aktiv ist (Bit 1)? Wie kann ich das in die Funktion-Node einbauen? Oder sollte man das getrennt aufteilen?
Vielen Dank schon mal für eure Unterstützung!

VG, joesch

Re: E3DC-Modbus, Bit auswerten

Verfasst: 07.03.2024, 16:15
von mademyday
zB bit1:

Code: Alles auswählen

> ( 255 & 0b1 ) !== 0
true
> ( 256 & 0b1 ) !== 0
false
zB bit4:

Code: Alles auswählen

> ( 8 & 0b1000 ) !== 0
true
> ( 7 & 0b1000 ) !== 0
false

Re: E3DC-Modbus, Bit auswerten

Verfasst: 09.03.2024, 15:47
von joesch
Vielen Dank für deine Rückmeldung! Ich habe das in einem Function-Node wie folgt umgesetzt:

Code: Alles auswählen

var wallboxregister = msg.payload;

msg1 = {};

if (wallboxregister && 0b1000 !== 0) {
    msg1.payload = "Lädt";
}
else{
    msg1.payload = "Lädt nicht";
}

return [msg1];
In die Variable Wallboxregister habe ich zwei verschiedene Beispielwerte als Eingangswert übergeben:
1. Wert: 4131 (Dezimal)
Das müsste binär folgendem Wert entsprechen (wobei das Bit 0 ganz rechts steht (?)):
0001 0000 0010 0011
2. Wert: 4139 (Dezimal)
0001 0000 0010 1011
In der Function-Node werte ich das 4. Bit von rechts aus (entspricht dem Bit3 der Übesicht von E3DC). Jedoch erhalte ich am Ausgang beide Male den Wert "Lädt".

Wo könnte hier mein (Denk-)Fehler liegen?

Vielen Dank und VG, joesch

Re: E3DC-Modbus, Bit auswerten

Verfasst: 09.03.2024, 16:03
von Henke
joesch hat geschrieben:
09.03.2024, 15:47
if (wallboxregister && 0b1000 !== 0)

Code: Alles auswählen

if ( (wallboxregister & 0b1000) !== 0)
Weniger Denk als Tippfehler

Nicht getestet, aber sauberer Stil:

Code: Alles auswählen

if ( wallboxregister & 0b1000)

Re: E3DC-Modbus, Bit auswerten

Verfasst: 09.03.2024, 17:46
von joesch
Vielen Dank! Funktioniert jetzt :-)

Re: E3DC-Modbus, Bit auswerten

Verfasst: 10.03.2024, 09:25
von joesch
Hier noch mal die Function-Node als "Blaupause" für alle Infos zur Wallbox. Allerdings werden die aktuellen E3DC-WB nur noch ohne Schuko-Steckdose (warum auch immer ...) augeliefert.

Code: Alles auswählen

var wallboxregister = msg.payload;

msg1 = {}; /*Bit 0: Wallbox verfügbar*/
msg2 = {}; /*Bit 1: Solarbetrieb aktiv*/
msg3 = {}; /*Bit 2: Laden abgebrochen*/
msg4 = {}; /*Bit 3: Auto lädt*/
msg5 = {}; /*Bit 4: Typ2-Stecker verriegelt*/
msg6 = {}; /*Bit 5: Typ-2-Stecker gesetckt*/
msg7 = {}; /*Bit 6: Schukosteckdose an*/
msg8 = {}; /*Bit 7: Schukostecker gesteckt*/
msg9 = {}; /*Bit 8: Schukostecker verriegelt*/
msg10 = {}; /*Bit 9: Relais an, 16A. 1phasig, Schuko*/
msg11 = {}; /*Bit 10: Relais an, 16A, 3phasig, Typ 2*/
msg12 = {}; /*Bit 11: Relais an, 32A, 3phasig, Typ 2*/
msg13 = {}; /*Bit 12: (nur) eine Phase aktiv*/

if (wallboxregister & 0b1) {msg1.payload = true;}else{msg1.payload = false;}
if (wallboxregister & 0b10) {msg2.payload = true;}else{msg2.payload = false;}
if (wallboxregister & 0b100) {msg3.payload = true;}else{msg3.payload = false;}
if (wallboxregister & 0b1000) {msg4.payload = true;}else{msg4.payload = false;}
if (wallboxregister & 0b10000) {msg5.payload = true;}else{msg5.payload = false;}
if (wallboxregister & 0b100000) {msg6.payload = true;}else{msg6.payload = false;}
if (wallboxregister & 0b1000000) {msg7.payload = true;}else{msg7.payload = false;}
if (wallboxregister & 0b10000000) {msg8.payload = true;}else{msg8.payload = false;}
if (wallboxregister & 0b100000000) {msg9.payload = true;}else{msg9.payload = false;}
if (wallboxregister & 0b1000000000) {msg10.payload = true;}else{msg10.payload = false;}
if (wallboxregister & 0b10000000000) {msg11.payload = true;}else{msg11.payload = false;}
if (wallboxregister & 0b100000000000) {msg12.payload = true;}else{msg12.payload = false;}
if (wallboxregister & 0b1000000000000) {msg13.payload = true;}else{msg13.payload = false;}

return [msg1,msg2,msg3,msg4,msg5,msg6,msg7,msg8,msg9,msg10,msg11,msg12,msg13];

Re: E3DC-Modbus, Bit auswerten

Verfasst: 10.03.2024, 11:05
von Tyfys
Wenn es sich um Javascript handelt, müsste es doch auch so ohne if gehen :

Code: Alles auswählen

msg1.payload  = (wallboxregister & 0b1);
msg2.payload  = (wallboxregister & 0b10);
msg3.payload  = (wallboxregister & 0b100);
msg4.payload  = (wallboxregister & 0b1000);
msg5.payload  = (wallboxregister & 0b10000);
msg6.payload  = (wallboxregister & 0b100000);
msg7.payload  = (wallboxregister & 0b1000000);
msg8.payload  = (wallboxregister & 0b10000000);
msg9.payload  = (wallboxregister & 0b100000000);
msg10.payload = (wallboxregister & 0b1000000000);
msg11.payload = (wallboxregister & 0b10000000000);
msg12.payload = (wallboxregister & 0b100000000000);
msg13.payload = (wallboxregister & 0b1000000000000);

Re: E3DC-Modbus, Bit auswerten

Verfasst: 10.03.2024, 20:34
von Henke
13 mal das gleiche mit 13 Ausgängen der node und dann beim nächsten mal...

Das geht eleganter. Generell sollte man die Daten einer msg anreichern und die Anzahl der Ausgänge reduzieren:

Code: Alles auswählen

    const WallBoxRegister = {
        Wallbox_verfuegbar: (1 << 0),
        Solarbetrieb_aktiv: (1 << 1),
        Laden_abgebrochen: (1 << 2),
        Auto_laedt: (1 << 3),
        Typ2_Stecker_verriegelt: (1 << 4),
        Typ2_Stecker_geseteckt: (1 << 5),
        Schukosteckdose_an: (1 << 6),
        Schukostecker_gesteckt: (1 << 7),
        Schukostecker_verriegelt: (1 << 8),
        Relais_an_16A_1phasig_Schuko: (1 << 9),
        Relais_an_16A_3phasig_Typ2: (1 << 10),
        Relais_an_32A_3phasig_Typ_2: (1 << 11),
        nur_eine_Phase_aktiv: (1 << 12),
    };
    // msg anreichern
    msg.wallbox = { wert: msg.payload, Wbr: WallBoxRegister };

    // In allen weiteren Nodes können dann Abfragen in diesem Stil laufen:
    if (msg.wallbox.wert & msg.wallbox.Wbr.Auto_laedt)
        if (!(msg.wallbox.wert & msg.wallbox.Wbr.Solarbetrieb_aktiv))
        {
            msg.payload = "Auto lädt, aber kein Solarbetrieb";
            node.send ( [null, { payload: "Nachricht an 2. Ausgang"});
        }
    return msg;