{"id":9415,"date":"2026-08-10T13:37:08","date_gmt":"2026-08-10T11:37:08","guid":{"rendered":"https:\/\/www.lukaswojcik.com\/blog\/werkzeuge\/modbus-sunspec-register-decoder\/"},"modified":"2026-08-10T13:45:02","modified_gmt":"2026-08-10T11:45:02","slug":"modbus-sunspec-register-decoder","status":"publish","type":"page","link":"https:\/\/www.lukaswojcik.com\/blog\/de\/werkzeuge\/modbus-sunspec-register-decoder\/","title":{"rendered":"Modbus- und SunSpec-Register-Decoder"},"content":{"rendered":"<div class=\"gtm-analyser-container\" style=\"background: var(--bg-panel, #1e1e24); padding: 25px; border-radius: 8px; border: 1px solid var(--border, #2a2a35);\">\n<p style=\"color: var(--text-secondary, #a0a0b0); margin-bottom: 20px;\">Modbus-Register kommen als blanke 16-Bit-W\u00f6rter an. Hier eingef\u00fcgt, mit Datentyp und Wortreihenfolge versehen, ergibt sich der dekodierte Wert \u2014 samt Vergleich aller vier Wortreihenfolgen nebeneinander.<\/p>\n<div style=\"margin-bottom: 18px;\">\n        <label for=\"mb-register\" style=\"color: var(--text-secondary, #a0a0b0); display: block; font-size: 0.85rem; margin-bottom: 5px;\">Registerwerte<\/label><br \/>\n        <input type=\"text\" id=\"mb-register\" value=\"17232 4660\" class=\"form-control\" style=\"width: 100%; padding: 12px; background: var(--bg-body, #14141a); border: 1px solid var(--border, #2a2a35); color: var(--text-primary, #f0f0f5); border-radius: 6px; font-family: monospace;\"><br \/>\n        <span style=\"color: var(--text-secondary, #a0a0b0); font-size: 0.78rem; display: block; margin-top: 6px;\">Dezimal oder hexadezimal (0x\u2026), durch Kommas oder Leerzeichen getrennt. Negative Dezimalwerte bis -32768 werden als Rohw\u00f6rter akzeptiert.<\/span>\n    <\/div>\n<div style=\"display: flex; gap: 10px; align-items: flex-end; flex-wrap: wrap; margin-bottom: 20px;\">\n<div style=\"flex: 1; min-width: 140px;\">\n            <label for=\"mb-typ\" style=\"color: var(--text-secondary, #a0a0b0); display: block; font-size: 0.85rem; margin-bottom: 5px;\">Datentyp<\/label><br \/>\n            <select id=\"mb-typ\" class=\"form-control\" style=\"width: 100%; padding: 12px; background: var(--bg-body, #14141a); border: 1px solid var(--border, #2a2a35); color: var(--text-primary, #f0f0f5); border-radius: 6px; font-family: monospace;\"><option value=\"int16\">int16<\/option><option value=\"uint16\">uint16<\/option><option value=\"int32\" selected>int32<\/option><option value=\"uint32\">uint32<\/option><option value=\"float32\">float32<\/option><option value=\"String\">String<\/option><\/select>\n        <\/div>\n<div style=\"flex: 1; min-width: 200px;\">\n            <label for=\"mb-order\" style=\"color: var(--text-secondary, #a0a0b0); display: block; font-size: 0.85rem; margin-bottom: 5px;\">Wortreihenfolge<\/label><br \/>\n            <select id=\"mb-order\" class=\"form-control\" style=\"width: 100%; padding: 12px; background: var(--bg-body, #14141a); border: 1px solid var(--border, #2a2a35); color: var(--text-primary, #f0f0f5); border-radius: 6px; font-family: monospace;\"><option value=\"ABCD\" selected>ABCD &ndash; big-endian<\/option><option value=\"DCBA\">DCBA &ndash; little-endian<\/option><option value=\"BADC\">BADC &ndash; byte-swapped<\/option><option value=\"CDAB\">CDAB &ndash; word-swapped<\/option><\/select>\n        <\/div>\n<div style=\"flex: 0 0 120px; min-width: 110px;\">\n            <label for=\"mb-sf\" style=\"color: var(--text-secondary, #a0a0b0); display: block; font-size: 0.85rem; margin-bottom: 5px;\">Skalierungsfaktor<\/label><br \/>\n            <input type=\"number\" id=\"mb-sf\" value=\"0\" min=\"-10\" max=\"10\" step=\"1\" class=\"form-control\" style=\"width: 100%; padding: 12px; background: var(--bg-body, #14141a); border: 1px solid var(--border, #2a2a35); color: var(--text-primary, #f0f0f5); border-radius: 6px; font-family: monospace;\">\n        <\/div>\n<p>        <button id=\"mb-btn\" class=\"button\" style=\"background: var(--accent, #4ade80); color: #0b1114; border: none; padding: 12px 24px; border-radius: 6px; font-weight: 700; cursor: pointer;\">Dekodieren<\/button>\n    <\/div>\n<div id=\"mb-ergebnis\"><\/div>\n<\/div>\n<p><script>\n(function () {\n    \/\/ --- reine Rechenlogik, ohne jeden DOM-Zugriff ---\n    const ORDERS = ['ABCD', 'DCBA', 'BADC', 'CDAB'];\n    const ORDER_NAMEN = { ABCD: 'big-endian', DCBA: 'little-endian', BADC: 'byte-swapped', CDAB: 'word-swapped' };<\/p>\n<p>    function einsetzen(vorlage, marke, wert) {\n        return String(vorlage).split(marke).join(String(wert));\n    }<\/p>\n<p>    function parseRegisters(text) {\n        if (typeof text !== 'string') { text = ''; }\n        const roh = text.replace(\/[,;\\t\\r\\n]+\/g, ' ').trim();\n        if (roh === '') { return { ok: false, fehler: 'Mindestens ein Registerwert ist erforderlich.' }; }\n        const teile = roh.split(\/\\s+\/);\n        const register = [];\n        for (let i = 0; i < teile.length; i++) {\n            const t = teile[i];\n            let v = null;\n            if (\/^0[xX][0-9a-fA-F]{1,4}$\/.test(t)) {\n                v = parseInt(t.slice(2), 16);\n            } else if (\/^-?[0-9]{1,7}$\/.test(t)) {\n                v = parseInt(t, 10);\n                if (v < 0) {\n                    if (v < -32768) { return { ok: false, fehler: einsetzen('Registerwert au\u00dferhalb des Bereichs (0 bis 65535 oder -32768 bis -1): {v}', '{v}', t) }; }\n                    v = v + 65536;\n                }\n            } else {\n                return { ok: false, fehler: einsetzen('Kein g\u00fcltiger Registerwert: {v}', '{v}', t) };\n            }\n            if (typeof v !== 'number' || !isFinite(v) || v < 0 || v > 65535) {\n                return { ok: false, fehler: einsetzen('Registerwert au\u00dferhalb des Bereichs (0 bis 65535 oder -32768 bis -1): {v}', '{v}', t) };\n            }\n            register.push(v);\n        }\n        if (register.length > 64) { return { ok: false, fehler: 'Zu viele Register \u2014 h\u00f6chstens 64 sind m\u00f6glich.' }; }\n        return { ok: true, register: register };\n    }<\/p>\n<p>    function registerZuBytes(register) {\n        const bytes = [];\n        for (let i = 0; i < register.length; i++) {\n            bytes.push((register[i] >> 8) & 0xFF);\n            bytes.push(register[i] & 0xFF);\n        }\n        return bytes;\n    }<\/p>\n<p>    function ordneBytes(bytes, order) {\n        const out = [];\n        for (let i = 0; i < bytes.length; i += 4) {\n            const rest = bytes.length - i;\n            if (rest >= 4) {\n                const a = bytes[i], b = bytes[i + 1], c = bytes[i + 2], d = bytes[i + 3];\n                if (order === 'DCBA') { out.push(d, c, b, a); }\n                else if (order === 'BADC') { out.push(b, a, d, c); }\n                else if (order === 'CDAB') { out.push(c, d, a, b); }\n                else { out.push(a, b, c, d); }\n            } else if (rest === 2) {\n                const a = bytes[i], b = bytes[i + 1];\n                if (order === 'DCBA' || order === 'BADC') { out.push(b, a); }\n                else { out.push(a, b); }\n            } else {\n                out.push(bytes[i]);\n            }\n        }\n        return out;\n    }<\/p>\n<p>    function registerAnzahl(typ) {\n        if (typ === 'int32' || typ === 'uint32' || typ === 'float32') { return 2; }\n        if (typ === 'String') { return 0; }\n        return 1;\n    }<\/p>\n<p>    function dekodiere(register, typ, order) {\n        if (!register || register.length === 0) { return { ok: false, fehler: 'Mindestens ein Registerwert ist erforderlich.' }; }\n        if (typ === 'String') {\n            const alleBytes = ordneBytes(registerZuBytes(register), order);\n            let s = '';\n            for (let i = 0; i < alleBytes.length; i++) {\n                const c = alleBytes[i];\n                if (c === 0) { break; }\n                if (c >= 32 && c <= 126) { s += String.fromCharCode(c); }\n                else { s += '.'; }\n            }\n            return { ok: true, wert: s.replace(\/[ ]+$\/, '') };\n        }\n        const noetig = registerAnzahl(typ);\n        if (register.length < noetig) { return { ok: false, fehler: 'Dieser Datentyp ben\u00f6tigt zwei Register, eingegeben wurde nur eines.' }; }\n        const teil = register.slice(0, noetig);\n        const bytes = ordneBytes(registerZuBytes(teil), order);\n        const dv = new DataView(new ArrayBuffer(bytes.length));\n        for (let i = 0; i < bytes.length; i++) { dv.setUint8(i, bytes[i]); }\n        let wert;\n        if (typ === 'int16') { wert = dv.getInt16(0, false); }\n        else if (typ === 'uint16') { wert = dv.getUint16(0, false); }\n        else if (typ === 'int32') { wert = dv.getInt32(0, false); }\n        else if (typ === 'uint32') { wert = dv.getUint32(0, false); }\n        else if (typ === 'float32') { wert = dv.getFloat32(0, false); }\n        else { return { ok: false, fehler: 'Unbekannter Datentyp.' }; }\n        return { ok: true, wert: wert };\n    }\n\n    function skaliere(wert, sf) {\n        if (typeof wert !== 'number' || !isFinite(wert)) { return wert; }\n        return wert * Math.pow(10, sf);\n    }\n\n    function kuerzeZahl(x, stellen) {\n        if (x === 0) { return '0'; }\n        let s = x.toPrecision(stellen);\n        if (s.indexOf('e') === -1 &#038;&#038; s.indexOf('.') !== -1) {\n            s = s.replace(\/0+$\/, '');\n            s = s.replace(\/\\.$\/, '');\n        }\n        return s;\n    }\n\n    function formatiereWert(wert, typ, sf) {\n        if (typ === 'String') {\n            if (typeof wert !== 'string' || wert === '') { return '(leer)'; }\n            return wert;\n        }\n        if (typeof wert !== 'number' || isNaN(wert)) { return 'keine Zahl'; }\n        if (!isFinite(wert)) { return wert > 0 ? '+\u221e' : '-\u221e'; }\n        const s = skaliere(wert, sf);\n        if (typ === 'float32') { return kuerzeZahl(s, 7); }\n        if (Math.abs(s) >= 1e15) { return s.toExponential(6); }\n        if (sf < 0) { return s.toFixed(-sf); }\n        return s.toFixed(0);\n    }\n\n    function hexWort(v) {\n        return '0x' + ('000' + (v >>> 0).toString(16).toUpperCase()).slice(-4);\n    }<\/p>\n<p>    function binWort(v) {\n        const s = ('000000000000000' + (v >>> 0).toString(2)).slice(-16);\n        return s.slice(0, 4) + ' ' + s.slice(4, 8) + ' ' + s.slice(8, 12) + ' ' + s.slice(12, 16);\n    }<\/p>\n<p>    function analysiere(text, typ, sfText, order) {\n        const p = parseRegisters(text);\n        if (!p.ok) { return { ok: false, fehler: p.fehler }; }<\/p>\n<p>        const sfRoh = (sfText === null || sfText === undefined) ? '' : String(sfText).trim();\n        let sf = 0;\n        if (sfRoh !== '') {\n            if (!\/^[+-]?[0-9]{1,3}$\/.test(sfRoh)) { return { ok: false, fehler: 'Der Skalierungsfaktor muss eine ganze Zahl zwischen -10 und 10 sein.' }; }\n            sf = parseInt(sfRoh, 10);\n            if (!isFinite(sf) || sf < -10 || sf > 10) { return { ok: false, fehler: 'Der Skalierungsfaktor muss eine ganze Zahl zwischen -10 und 10 sein.' }; }\n        }<\/p>\n<p>        if (ORDERS.indexOf(order) === -1) { order = 'ABCD'; }<\/p>\n<p>        const d = dekodiere(p.register, typ, order);\n        if (!d.ok) { return { ok: false, fehler: d.fehler }; }<\/p>\n<p>        const alle = ORDERS.map(function (o) {\n            const r = dekodiere(p.register, typ, o);\n            return { order: o, text: r.ok ? formatiereWert(r.wert, typ, sf) : '\u2014' };\n        });<\/p>\n<p>        const noetig = registerAnzahl(typ);\n        const hinweise = [];\n        if (typ !== 'String' && p.register.length > noetig) {\n            let h = einsetzen('F\u00fcr diesen Datentyp werden nur die ersten {n} Register dekodiert; {r} weitere Register werden ignoriert.', '{n}', noetig);\n            h = einsetzen(h, '{r}', p.register.length - noetig);\n            hinweise.push(h);\n        }\n        if (typ === 'int16' || typ === 'uint16') { hinweise.push('Bei 16-Bit-Typen liefern ABCD und CDAB dasselbe Ergebnis, ebenso DCBA und BADC.'); }\n        if (typ === 'float32' && (typeof d.wert !== 'number' || isNaN(d.wert) || !isFinite(d.wert))) {\n            hinweise.push('Dieses Bitmuster ist keine normale IEEE-754-Zahl \u2014 vermutlich stimmt die Wortreihenfolge nicht.');\n        }<\/p>\n<p>        return {\n            ok: true,\n            typ: typ,\n            order: order,\n            sf: sf,\n            register: p.register,\n            wertText: formatiereWert(d.wert, typ, sf),\n            rohText: formatiereWert(d.wert, typ, 0),\n            alle: alle,\n            hinweise: hinweise\n        };\n    }<\/p>\n<p>    \/\/ fuer die Pruefung von aussen erreichbar\n    if (typeof window !== 'undefined') {\n        window.LW_TEST = window.LW_TEST || {};\n        window.LW_TEST.mb = {\n            parseRegisters: parseRegisters,\n            registerZuBytes: registerZuBytes,\n            ordneBytes: ordneBytes,\n            registerAnzahl: registerAnzahl,\n            dekodiere: dekodiere,\n            skaliere: skaliere,\n            formatiereWert: formatiereWert,\n            hexWort: hexWort,\n            binWort: binWort,\n            analysiere: analysiere\n        };\n    }<\/p>\n<p>    \/\/ --- Darstellung ---\n    function schuetze(s) {\n        return String(s).replace(\/&\/g, '&amp;').replace(\/<\/g, '&lt;').replace(\/>\/g, '&gt;').replace(\/\"\/g, '&quot;');\n    }<\/p>\n<p>    function tabelle(kopf, zeilen) {\n        let h = '<\/p>\n<div style=\"overflow-x: auto;\">\n<table style=\"width: 100%; border-collapse: collapse; font-size: 0.9rem;\">\n<thead>\n<tr>';\n        for (let i = 0; i < kopf.length; i++) {\n            h += '\n\n<th style=\"text-align: left; padding: 8px 10px; border-bottom: 1px solid var(--border, #2a2a35); color: var(--text-secondary, #a0a0b0); font-weight: 600; font-size: 0.75rem; text-transform: uppercase; letter-spacing: 0.05em; white-space: nowrap;\">' + kopf[i] + '<\/th>\n<p>';\n        }\n        h += '<\/tr>\n<\/thead>\n<tbody>';\n        for (let z = 0; z < zeilen.length; z++) {\n            h += '\n\n<tr>';\n            for (let s = 0; s < zeilen[z].length; s++) {\n                h += '\n\n<td style=\"padding: 8px 10px; border-bottom: 1px solid var(--border, #2a2a35); color: var(--text-primary, #f0f0f5); vertical-align: top;\">' + zeilen[z][s] + '<\/td>\n<p>';\n            }\n            h += '<\/tr>\n<p>';\n        }\n        h += '<\/tbody>\n<\/table>\n<\/div>\n<p>';\n        return h;\n    }<\/p>\n<p>    function baueHtml(m) {\n        if (!m.ok) {\n            return '<\/p>\n<div style=\"background: var(--bg-body, #14141a); border: 1px solid var(--border, #2a2a35); border-left: 3px solid var(--accent, #4ade80); border-radius: 6px; padding: 14px; color: var(--text-primary, #f0f0f5); font-size: 0.92rem;\">' + schuetze(m.fehler) + '<\/div>\n<p>';\n        }<\/p>\n<p>        let h = '';<\/p>\n<p>        h += '<\/p>\n<div style=\"background: var(--bg-body, #14141a); border: 1px solid var(--border, #2a2a35); border-radius: 6px; padding: 18px; margin-bottom: 18px;\">';\n        h += '<\/p>\n<div style=\"color: var(--text-secondary, #a0a0b0); font-size: 0.75rem; text-transform: uppercase; letter-spacing: 0.05em; margin-bottom: 8px;\">Dekodierter Wert<\/div>\n<p>';\n        h += '<\/p>\n<div style=\"color: var(--accent, #4ade80); font-size: 1.7rem; font-weight: 700; font-family: monospace; word-break: break-all; line-height: 1.3;\">' + schuetze(m.wertText) + '<\/div>\n<p>';\n        h += '<\/p>\n<div style=\"color: var(--text-secondary, #a0a0b0); font-size: 0.85rem; margin-top: 10px; font-family: monospace;\">Rohwert: ' + schuetze(m.rohText);\n        if (m.sf !== 0) {\n            h += ' &nbsp;&middot;&nbsp; Skalierungsfaktor: &times;10^' + m.sf;\n        }\n        h += '<\/div>\n<\/div>\n<p>';<\/p>\n<p>        for (let i = 0; i < m.hinweise.length; i++) {\n            h += '\n\n<div style=\"background: var(--bg-body, #14141a); border: 1px solid var(--border, #2a2a35); border-left: 3px solid var(--accent, #4ade80); border-radius: 6px; padding: 12px 14px; margin-bottom: 12px; color: var(--text-secondary, #a0a0b0); font-size: 0.85rem;\">' + schuetze(m.hinweise[i]) + '<\/div>\n<p>';\n        }<\/p>\n<p>        const zeilenOrder = m.alle.map(function (a) {\n            const aktiv = (a.order === m.order);\n            const stil = aktiv ? 'color: var(--accent, #4ade80); font-weight: 700;' : 'color: var(--text-primary, #f0f0f5);';\n            const marke = aktiv ? ' <span style=\"color: var(--text-secondary, #a0a0b0); font-weight: 400; font-size: 0.72rem; text-transform: uppercase; letter-spacing: 0.05em;\">ausgew\u00e4hlt<\/span>' : '';\n            const name = ORDER_NAMEN[a.order] || '';\n            return [\n                '<span style=\"font-family: monospace; ' + stil + '\">' + a.order + '<\/span> <span style=\"color: var(--text-secondary, #a0a0b0); font-size: 0.8rem;\">' + name + '<\/span>' + marke,\n                '<span style=\"font-family: monospace; word-break: break-all; ' + stil + '\">' + schuetze(a.text) + '<\/span>'\n            ];\n        });<\/p>\n<p>        h += '<\/p>\n<div style=\"color: var(--text-secondary, #a0a0b0); font-size: 0.75rem; text-transform: uppercase; letter-spacing: 0.05em; margin: 22px 0 8px;\">Alle Wortreihenfolgen<\/div>\n<p>';\n        h += tabelle(['Wortreihenfolge', 'Ergebnis'], zeilenOrder);<\/p>\n<p>        const zeilenReg = m.register.map(function (v, i) {\n            return [\n                '<span style=\"font-family: monospace; color: var(--text-secondary, #a0a0b0);\">' + i + '<\/span>',\n                '<span style=\"font-family: monospace;\">' + v + '<\/span>',\n                '<span style=\"font-family: monospace;\">' + hexWort(v) + '<\/span>',\n                '<span style=\"font-family: monospace; white-space: nowrap;\">' + binWort(v) + '<\/span>'\n            ];\n        });<\/p>\n<p>        h += '<\/p>\n<div style=\"color: var(--text-secondary, #a0a0b0); font-size: 0.75rem; text-transform: uppercase; letter-spacing: 0.05em; margin: 22px 0 8px;\">Rohregister<\/div>\n<p>';\n        h += tabelle(['Register', 'Dezimal', 'Hex', 'Bin\u00e4r'], zeilenReg);<\/p>\n<p>        return h;\n    }<\/p>\n<p>    \/\/ --- DOM-Anbindung, sauber abgesichert ---\n    const btn = document.getElementById('mb-btn');\n    const out = document.getElementById('mb-ergebnis');\n    if (!btn || !out) { return; }<\/p>\n<p>    const feldRegister = document.getElementById('mb-register');\n    const feldTyp = document.getElementById('mb-typ');\n    const feldOrder = document.getElementById('mb-order');\n    const feldSf = document.getElementById('mb-sf');\n    if (!feldRegister || !feldTyp || !feldOrder || !feldSf) { return; }<\/p>\n<p>    function aktualisiere() {\n        const m = analysiere(feldRegister.value, feldTyp.value, feldSf.value, feldOrder.value);\n        out.innerHTML = baueHtml(m);\n    }<\/p>\n<p>    btn.addEventListener('click', function () { aktualisiere(); });\n    feldTyp.addEventListener('change', function () { aktualisiere(); });\n    feldOrder.addEventListener('change', function () { aktualisiere(); });\n    feldSf.addEventListener('change', function () { aktualisiere(); });\n    feldRegister.addEventListener('keydown', function (e) {\n        if (e && (e.key === 'Enter' || e.keyCode === 13)) {\n            if (typeof e.preventDefault === 'function') { e.preventDefault(); }\n            aktualisiere();\n        }\n    });<\/p>\n<p>    aktualisiere();\n})();\n<\/script><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Modbus-Register kommen als blanke 16-Bit-W\u00f6rter an. Hier eingef\u00fcgt, mit Datentyp und Wortreihenfolge versehen, ergibt sich der dekodierte Wert \u2014 samt Vergleich aller vier Wortreihenfolgen nebeneinander. Registerwerte Dezimal oder hexadezimal (0x\u2026), durch Kommas oder Leerzeichen getrennt. Negative Dezimalwerte bis -32768 werden als Rohw\u00f6rter akzeptiert. Datentyp int16uint16int32uint32float32String Wortreihenfolge ABCD &ndash; big-endianDCBA &ndash; little-endianBADC &ndash; byte-swappedCDAB &ndash; word-swapped [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":9283,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"template-tool-base.php","meta":{"footnotes":""},"class_list":["post-9415","page","type-page","status-publish","hentry"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v28.1 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Modbus- und SunSpec-Register-Decoder - Lukas Wojcik - Blog<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.lukaswojcik.com\/blog\/de\/werkzeuge\/modbus-sunspec-register-decoder\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Modbus- und SunSpec-Register-Decoder - Lukas Wojcik - Blog\" \/>\n<meta property=\"og:description\" content=\"Modbus-Register kommen als blanke 16-Bit-W\u00f6rter an. Hier eingef\u00fcgt, mit Datentyp und Wortreihenfolge versehen, ergibt sich der dekodierte Wert \u2014 samt Vergleich aller vier Wortreihenfolgen nebeneinander. Registerwerte Dezimal oder hexadezimal (0x\u2026), durch Kommas oder Leerzeichen getrennt. Negative Dezimalwerte bis -32768 werden als Rohw\u00f6rter akzeptiert. Datentyp int16uint16int32uint32float32String Wortreihenfolge ABCD &ndash; big-endianDCBA &ndash; little-endianBADC &ndash; byte-swappedCDAB &ndash; word-swapped [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.lukaswojcik.com\/blog\/de\/werkzeuge\/modbus-sunspec-register-decoder\/\" \/>\n<meta property=\"og:site_name\" content=\"Lukas Wojcik - Blog\" \/>\n<meta property=\"article:modified_time\" content=\"2026-08-10T11:45:02+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/08\/og-default.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"1200\" \/>\n\t<meta property=\"og:image:height\" content=\"630\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/de\\\/werkzeuge\\\/modbus-sunspec-register-decoder\\\/\",\"url\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/de\\\/werkzeuge\\\/modbus-sunspec-register-decoder\\\/\",\"name\":\"Modbus- und SunSpec-Register-Decoder - Lukas Wojcik - Blog\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/#website\"},\"datePublished\":\"2026-08-10T11:37:08+00:00\",\"dateModified\":\"2026-08-10T11:45:02+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/de\\\/werkzeuge\\\/modbus-sunspec-register-decoder\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/de\\\/werkzeuge\\\/modbus-sunspec-register-decoder\\\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/de\\\/werkzeuge\\\/modbus-sunspec-register-decoder\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Toolbox\",\"item\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/toolbox-2\\\/\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Modbus- und SunSpec-Register-Decoder\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/#website\",\"url\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/\",\"name\":\"Lukas Wojcik - Blog\",\"description\":\"\",\"publisher\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/#\\\/schema\\\/person\\\/895f7604f9b6b71aad9bba33af28d0f9\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/#\\\/schema\\\/person\\\/895f7604f9b6b71aad9bba33af28d0f9\",\"name\":\"luky\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/07\\\/lw-x2.jpg\",\"url\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/07\\\/lw-x2.jpg\",\"contentUrl\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/07\\\/lw-x2.jpg\",\"width\":424,\"height\":636,\"caption\":\"luky\"},\"logo\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/07\\\/lw-x2.jpg\"},\"sameAs\":[\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\"]}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Modbus- und SunSpec-Register-Decoder - Lukas Wojcik - Blog","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.lukaswojcik.com\/blog\/de\/werkzeuge\/modbus-sunspec-register-decoder\/","og_locale":"en_US","og_type":"article","og_title":"Modbus- und SunSpec-Register-Decoder - Lukas Wojcik - Blog","og_description":"Modbus-Register kommen als blanke 16-Bit-W\u00f6rter an. Hier eingef\u00fcgt, mit Datentyp und Wortreihenfolge versehen, ergibt sich der dekodierte Wert \u2014 samt Vergleich aller vier Wortreihenfolgen nebeneinander. Registerwerte Dezimal oder hexadezimal (0x\u2026), durch Kommas oder Leerzeichen getrennt. Negative Dezimalwerte bis -32768 werden als Rohw\u00f6rter akzeptiert. Datentyp int16uint16int32uint32float32String Wortreihenfolge ABCD &ndash; big-endianDCBA &ndash; little-endianBADC &ndash; byte-swappedCDAB &ndash; word-swapped [&hellip;]","og_url":"https:\/\/www.lukaswojcik.com\/blog\/de\/werkzeuge\/modbus-sunspec-register-decoder\/","og_site_name":"Lukas Wojcik - Blog","article_modified_time":"2026-08-10T11:45:02+00:00","og_image":[{"width":1200,"height":630,"url":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/08\/og-default.jpg","type":"image\/jpeg"}],"twitter_card":"summary_large_image","schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/www.lukaswojcik.com\/blog\/de\/werkzeuge\/modbus-sunspec-register-decoder\/","url":"https:\/\/www.lukaswojcik.com\/blog\/de\/werkzeuge\/modbus-sunspec-register-decoder\/","name":"Modbus- und SunSpec-Register-Decoder - Lukas Wojcik - Blog","isPartOf":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/#website"},"datePublished":"2026-08-10T11:37:08+00:00","dateModified":"2026-08-10T11:45:02+00:00","breadcrumb":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/de\/werkzeuge\/modbus-sunspec-register-decoder\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.lukaswojcik.com\/blog\/de\/werkzeuge\/modbus-sunspec-register-decoder\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.lukaswojcik.com\/blog\/de\/werkzeuge\/modbus-sunspec-register-decoder\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.lukaswojcik.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Toolbox","item":"https:\/\/www.lukaswojcik.com\/blog\/toolbox-2\/"},{"@type":"ListItem","position":3,"name":"Modbus- und SunSpec-Register-Decoder"}]},{"@type":"WebSite","@id":"https:\/\/www.lukaswojcik.com\/blog\/#website","url":"https:\/\/www.lukaswojcik.com\/blog\/","name":"Lukas Wojcik - Blog","description":"","publisher":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/#\/schema\/person\/895f7604f9b6b71aad9bba33af28d0f9"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.lukaswojcik.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":["Person","Organization"],"@id":"https:\/\/www.lukaswojcik.com\/blog\/#\/schema\/person\/895f7604f9b6b71aad9bba33af28d0f9","name":"luky","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/07\/lw-x2.jpg","url":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/07\/lw-x2.jpg","contentUrl":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/07\/lw-x2.jpg","width":424,"height":636,"caption":"luky"},"logo":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/07\/lw-x2.jpg"},"sameAs":["https:\/\/www.lukaswojcik.com\/blog"]}]}},"_links":{"self":[{"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/pages\/9415","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/comments?post=9415"}],"version-history":[{"count":1,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/pages\/9415\/revisions"}],"predecessor-version":[{"id":9436,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/pages\/9415\/revisions\/9436"}],"up":[{"embeddable":true,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/pages\/9283"}],"wp:attachment":[{"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/media?parent=9415"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}