Google, allmächtiger, wie rechnet man Low und High Word zusammen?
Um zwei 16-Bit-Wörter (High- und Low-Word) zu einem 32-Bit-Wert (z. B. DWORD oder REAL) zusammenzurechnen, müssen Sie das High-Word an seine korrekte Stelle verschieben (um \(16\) Bit nach links) und anschließend mit dem Low-Word bitweise verknüpfen (Addition oder ODER-Verknüpfung).Die mathematische Formel für diese Berechnung lautet
Gesamtwert = (High-Word × 65536) + Low-Word.
Moin
Danke - soweit war ich auch schon.
Hast Du das selber mal versucht.
Habe verschiedenste Dinge versucht, dies im IO Broker darzustellen.
Mir ist das nicht gelungen.
Hat das jemand schonmal gemacht und kann mir die Augen öffnen ?
Ich benutze keinen IO-Broker, sondern Home Assistant. In HA muss ich nichts zusammenrechnen, das wird in der Solarman-Integration irgendwo berechnet. Ich habe es mit dem Taschenrechner ausgerechnet, allerdings ein wenig anders. Ich habe mit den Hex-Zahlen gerechnet und sie dann in Dezimalzahlen umgerechnet. High-Word um vier Stellen nach links schieben und dann Low-Word einfügen.
Ich denke aber, dass du ein ganz anderes Problem hast. Entstehen die Probleme beim Einspeisen? Beim Einspeisen ist der Wert negativ und muss anders berechnet werden. Ich bin jetzt auf der Arbeit und kann nicht nachgucken. Vielleicht schaffe ich es heute Abend, ich verspreche es aber nicht.
KI hat die Formel für ioBroker (z. B. JavaScript-Adapter) ausgespuckt. Die Register- und Modbusadressen musst du jedoch anpassen. Ob die Formel funktioniert, kann ich nicht sagen.
let high = getState("modbus.0.holdingRegisters.40001").val;
let low = getState("modbus.0.holdingRegisters.40002").val;
let value = ((high << 16) | low) >> 0;
setState("0_userdata.0.myValue", value);
und die Formel für HA
template:
- sensor:
- name: "Modbus 32bit Signed"
state: >
{% set high = states('sensor.modbus_high') | int %}
{% set low = states('sensor.modbus_low') | int %}
{% set value = (high << 16) + low %}
{% if value >= 2147483648 %}
{{ value - 4294967296 }}
{% else %}
{{ value }}
{% endif %}
Um die Anzeige in kW zu erhalten, muss der Wert durch 1 000 geteilt werden.
Ich mache mir keinen Stress. Mich würde auch interessieren, wie die Umrechnung funktioniert. Mit dem Taschenrechner hat es mit den positiven Werten funktioniert, das möchte ich noch mit den negativen Werten ausprobieren.
Das High Word ist immer 0 oder -1 , damit kommt da immer Müll raus.
Dann bin ich irgendwie drauf gestoßen, dass es doch kein high und low word sein könnte,
sondern ein INT16 ….
Dann könnte wenn größer als 32767, es zu einem Abzug von 65536 zu einen realen Wert kommen.
KI sagt:
function calcCT() {
let value = getState('deyeidc.0.2766066377.P_GRID_CT_TOTAL').val;