NEWS
Bitfield übersetzen/konvertieren
-
Danke für die superschnelle Antwort.
Ich habe alles vorhandene entfernt und "neu angefangen".
Dabei ist schon mal ein Fehler von mir aufgefallen. Betriebsstatus mit 2 * s.// Binärwert 12 Bit decodieren und in Datenpunkte schreiben const idModbus = 'modbus.0.inputRegisters.32500_Betriebsstatus'; // ID zuweisen ! const idWP = '0_userdata.0.Waermepumpe.Betriebsstatus.'; const idsWP = [ 'B0_HK1_Pumpe', 'B1_HK2_Pumpe', 'B2_Aufheizprogramm', 'B3_NHZ_Stufen_in_Betieb', 'B4_WP_im_Heizbetrieb', 'B5_WP_im_Warmwasserbetrieb', 'B6_Verdichter_in_Betrieb', 'B7_Sommerbetrieb_aktiv', 'B8_Kuehlbetrieb_aktiv', 'B9_Abtauen', 'B10_Silentmode1', 'B11_Silentmode2' ]; for(let i = 0; i < idsWP.length; i++) { createState(idWP + idsWP[i], false, {type: 'boolean', name: idsWP[i], read: true, write: false}); } on(idModbus, function(dp) { let val = dp.state.val; for(let i = 0; i < idsWP.length; i++) { setState(idWP + idsWP[i], !!(val & 1), true); val = val >> 1; } });
Das Ergebnis ist jedoch immer noch alles "false".
Node-red zeigt mir aber
24.5.2021, 11:33:56node: 7702536.90156ac
msg.payload : array[16]
array[16]
[0 … 9]
0: false
1: true
2: false
3: false
4: false
5: false
6: false
7: false
8: false
9: false
[10 … 15]
10: false
11: false
12: false
13: false
14: false
15: falseWas wiederum mit "modbus.0.inputRegisters.32500_Betriebsstatus" als Ausgabewert 2 übereinstimmen würde.
Liegt es evtl. am Datentype - Unsigned 16 bit
-
@schwabe_ch sagte: Das Ergebnis ist jedoch immer noch alles "false".
Hat sich denn der Wert von "modbus.0.inputRegisters.32500_Betriebsstatus" mal geändert? Es wird nur bei Wertänderung getriggert.
-
@schwabe_ch
Wenn schon bei Skriptstart die richtigen Werte gesetzt werden sollen, verwende eine Funktion, die auch bei Skriptstart aufgerufen wird.// Binärwert 12 Bit decodieren und in Datenpunkte schreiben const idModbus = 'modbus.0.inputRegisters.32500_Betriebsstatus'; // ID zuweisen ! const idWP = '0_userdata.0.Waermepumpe.Betriebsstatus.'; const idsWP = [ 'B0_HK1_Pumpe', 'B1_HK2_Pumpe', 'B2_Aufheizprogramm', 'B3_NHZ_Stufen_in_Betieb', 'B4_WP_im_Heizbetrieb', 'B5_WP_im_Warmwasserbetrieb', 'B6_Verdichter_in_Betrieb', 'B7_Sommerbetrieb_aktiv', 'B8_Kuehlbetrieb_aktiv', 'B9_Abtauen', 'B10_Silentmode1', 'B11_Silentmode2' ]; function word2bits(val) { for(let i = 0; i < idsWP.length; i++) { if(existsState(idWP + idsWP[i])) setState(idWP + idsWP[i], !!(val & 1), true); else createState(idWP + idsWP[i], !!(val & 1), {type: 'boolean', name: idsWP[i], read: true, write: false}); val = val >> 1; } } word2bits(getState(idModbus).val); // Skriptstart on(idModbus, function(dp) { word2bits(dp.state.val); });
-
Ein grosses DANKESCHÖN !!
Nun kann ich weitermachen mit meinem kleinen Projekt.
Noch einen schönen Pfingstmontag.
-
@schwabe_ch Wenn Du eh mit NodeRed arbeitest, da gibts eine tolle Buffer Node.
-
@mickym
Danke für den Hinweis.
„Mit Nodered arbeitest“ das wäre zu schön, für den Moment war es das Produkt welches mir im Zusammenhang mit Modbus als erstes in die Finger kam. Wir haben seit 2 Monaten eine E3/DC Pro . Damit fing das ganze an. Nun taste ich mich langsam vor.
Buffer Node? Hast Du mir wohl einen Link dazu, unter suchen erhalte ich 50 Seitenwo finde ich mehr Informationen?
-
@schwabe_ch
Man muss bissi ausprobieren, aber ich finde die Node ziemlich mächtig. Anhand der Screenshots kannst Dir ja schon mal ein Eindruck verschaffen und ist ja auch schnell installiert bzw. wieder deinstalliert.https://flows.nodered.org/node/node-red-contrib-buffer-parser
Auf der Seite sind auch einige Beispielflows zum Testen.
-
@paul53 Hi danke für das Skript,
funktioniert einwandfrei zum Lesen. Gibt es noch eine Möglichkeit dass ich auch Schreiben kann in die Einzelnen Bit? Ich will darüber ein und aus befehle an eine Steuerung mit Codesys schicken.
Viele Grüße Helmut -
@helmutlinner sagte: Möglichkeit dass ich auch Schreiben kann in die Einzelnen Bit?
function writeBit(val, set, bit) { let x = 1 << bit; if(set) return val | x; return val & ~x; }
-
@darkbrain85 sagte in Bitfield übersetzen/konvertieren:
Hi!
Ich habe ein kniffeliges Problem, bei dem ihr mir sicher behilflich sein könnte.
Ich lese meine Waterkotte Wärmepumpe per Modbus aus. Dabei erhalte ich auch diverse Werte. Funktioniert sehr gut.
Den Zustand einzelner Komponenten kann ich allerdings nur als bitfield in einem gemeinsamen Register abrufen. Hier erhalte ich einen Integer Wert den ich entsprechend interpretieren müsste.
Hier mal die Liste aus der Doku:Ich müsste also den Integer Wert übersetzen und dann die einzelnen Zustände zuordnen.
Beim Betrieb der Heizungsumwälzpumpe erhalte ich z.B. den Wert 2.Gibt es dafür irgendwo ein Beispiel, oder kann mir da jemand auf die Sprünge helfen?
Danke Euch jetzt schon!
Ist zwar schon was älter aber gerade erst gesehen.
Kannst du mir sagen welche WP das ist, welches Register und wie eingestellt im Adapter?
Hast du eine Übersicht über alle Register die man lesen/schreiben kann?