Milesight UC100: Modbus-RS485-zu-LoRaWAN-Konverter
Milesight UC100 Modbus-zu-LoRaWAN-Konverter: bis zu 32 Modbus-RTU-Geraete uber RS485, eigenes ChirpStack-Decoder-Framework und Downlink-Steuerung.
- LoRaWAN
- Class A, OTAA
- Feldbus
- RS485 Modbus RTU
- Modbus-Geraete
- Bis zu 32 RTU-Slaves abgefragt
- Verlaufsspeicher
- Bis zu 800 Datensaetze, Retransmission
- Stromversorgung
- 5 V DC (USB) oder 8 bis 28 V DC
- Konfiguration
- USB + Milesight ToolBox
- Montage
- Hutschiene oder Wandmontage
Was kann der UC100?
Modbus-Kanaele
Bis zu 32 Register-Maps: Coils, Discrete, Input- und Holding-Register.
Datentypen
INT16, UINT16, INT32, UINT32, Float und Ein/Aus, alle Byte-Reihenfolgen.
Verlaufsdatensaetze
Speichert bis zu 800 Saetze lokal und sendet sie nach einer Stoerung erneut.
Lesefehler-Flags
Kanalweiser Alarm, wenn ein Modbus-Slave nicht antwortet.
Modbus-Transparentmodus
Leitet rohe Modbus-Frames fuer eigene Register uber LoRaWAN weiter.
Integration
Sensor / Controller
Misst oder steuert vor Ort und sendet LoRaWAN-Uplinks.
LoRaWAN-Gateway
Empfängt die Funkpakete und reicht sie an den Server weiter.
ChirpStack
Network-Server: verwaltet Sessions und decodiert das Payload.
ThingsBoard / Grafana
Dashboards, Alarme, Regeln und Reports.
function decodeUplink(input) {
var bytes = input.bytes;
var data = { modbus: {}, info: {} };
for (var i = 0; i < bytes.length; ) {
var channel = bytes[i++];
var type = bytes[i++];
// Modbus channel value (ff 19): channel id (1) + data length (1)
// + data def (1) + value
if (channel === 0xff && type === 0x19) {
var chId = bytes[i++] + 1; // 1-based channel index
i++; // skip data length byte
var dataDef = bytes[i++];
var sign = (dataDef >>> 7) & 0x01; // high bit = signed
var dataType = dataDef & 0x7f; // low 7 bits = register type
var read = readModbusValue(bytes, i, dataType, sign);
data.modbus["chn" + chId] = read.value;
i += read.size;
continue;
}
// Modbus read error (ff 15): channel id (1)
if (channel === 0xff && type === 0x15) {
var errId = bytes[i++] + 1;
data.modbus["chn" + errId + "_error"] = true;
continue;
}
// Device info (join / power-on): version, SN, class, status
if (channel === 0xff) { i += deviceInfoLen(type); continue; }
// Unknown / config-specific segment: stop to avoid misreads
break;
}
return { data: data };
}
function readModbusValue(b, i, dataType, sign) {
// 0,1 coil/discrete -> 1 byte on/off; 2,3 16-bit; 4,6 32-bit;
// 5,7 float; 8-11 16-bit value carried in a 4-byte slot
if (dataType <= 1) {
return { value: b[i] ? 1 : 0, size: 1 };
}
if (dataType === 2 || dataType === 3) {
return { value: sign ? readInt16LE(b, i) : readUInt16LE(b, i), size: 2 };
}
if (dataType === 5 || dataType === 7) {
return { value: readFloatLE(b, i), size: 4 };
}
if (dataType >= 8 && dataType <= 11) {
return { value: sign ? readInt16LE(b, i) : readUInt16LE(b, i), size: 4 };
}
return { value: sign ? readInt32LE(b, i) : readUInt32LE(b, i), size: 4 };
}
function readUInt16LE(b, i) { return (b[i + 1] << 8) | b[i]; }
function readInt16LE(b, i) {
var v = readUInt16LE(b, i);
return v > 0x7fff ? v - 0x10000 : v;
}
function readUInt32LE(b, i) {
return ((b[i + 3] << 24) | (b[i + 2] << 16) | (b[i + 1] << 8) | b[i]) >>> 0;
}
function readInt32LE(b, i) {
var v = readUInt32LE(b, i);
return v > 0x7fffffff ? v - 0x100000000 : v;
}
function readFloatLE(b, i) {
var bits = readUInt32LE(b, i);
var sign = (bits >>> 31) ? -1 : 1;
var exp = (bits >>> 23) & 0xff;
var frac = bits & 0x7fffff;
if (exp === 0) { return sign * frac * Math.pow(2, -149); }
if (exp === 0xff) { return frac ? NaN : sign * Infinity; }
return sign * (1 + frac * Math.pow(2, -23)) * Math.pow(2, exp - 127);
}
function deviceInfoLen(type) {
// 0xFF segment lengths are firmware-specific; tune per deployment
if (type === 0x16) { return 8; } // serial number
if (type === 0x09 || type === 0x0a || type === 0xff) { return 2; }
return 1;
}
Implementiert nach der veröffentlichten Milesight-Byte-Spezifikation (Communication Protocol / User Guide).
Die UC100-Payload ist konfigurationsabhaengig: Jeder Modbus-Kanal enthaelt eine Kanal-ID, eine Datenlaenge und ein Datentyp-Byte (oberes Bit signiert, untere 7 Bits Registertyp), gefolgt vom Wert. Derselbe Datentyp deckt Coils, 16/32-Bit-Ganzzahlen und Floats in jeder Byte-Reihenfolge ab. Das ist ein Framework, kein fertiges Drop-in, da das Register-zu-Kanal-Mapping pro Deployment festgelegt wird. Als Class-A-Geraet nimmt der UC100 zudem Downlinks an (nach einem Uplink), um Register zu schreiben oder Modbus-Befehle auszuloesen. Implementiert nach der veroeffentlichten Milesight-Byte-Spezifikation.
Einsatzszenarien
Industrie-Retrofit
Macht alte Energiezaehler und SPS uber LoRaWAN auslesbar, ohne neu zu verkabeln.
MehrSmart Agriculture
Liest Boden-, Fuellstands- und Durchflusssensoren an einem entfernten RS485-Bus.
MehrVersorgungszaehler
Erfasst Wasser-, Gas- und Stromzaehler an Standorten ohne kabelgebundenen Backhaul.
Konfiguration & Stolpersteine
Stromversorgung und Klasse
Der UC100 ist ein Class-A-Geraet, versorgt uber USB (5 V) oder eine 8 bis 28 V DC Klemme. Plane eine stabile Versorgung im RS485-Schaltschrank statt Batteriebetrieb.
RS485-Verdrahtung
Stimme Baudrate, Paritaet und Slave-Adressen auf die Feldgeraete ab und setze bei langen oder schnellen Busleitungen einen Abschlusswiderstand.
Modbus-Abfrageintervall
Waehle ein realistisches Abfrageintervall fuer die Registeranzahl, sonst stauen sich Uplinks auf.
Verlauf und Retransmission
Der 800-Datensatz-Puffer fuellt nach einer Stoerung Verlaufs-Uplinks. Dashboard-Regeln muessen gebuendelte, zeitgestempelte Datensaetze verarbeiten, nicht nur Live-Werte.
So unterstützt dich merkaio beim UC100
Von der Beschaffung bis zum laufenden Betrieb, alles aus einer Hand und auf eigener europäischer Infrastruktur.
Pre-Staging & Provisioning
Wir konfigurieren den UC100, setzen Keys, Intervalle und Alarme und liefern einsatzbereit aus.
Eigener Decoder
Payload-Codec für ChirpStack v4 und ThingsBoard, nach der Milesight-Spezifikation implementiert.
Integration ins Dashboard
Die Daten landen in deinem ThingsBoard oder Grafana, inklusive Alarmen und Reports.
Betrieb & Monitoring
Wir betreiben LoRaWAN-Stack und Dashboards auf europäischer Infrastruktur, du nutzt nur die Daten.
Häufige Fragen
Sprechen wir über Ihre Infrastruktur. Digital und vor Ort.
Ob IoT-Plattformentwicklung, Hardwareauswahl, Managed Hosting für ChirpStack, ThingsBoard, Grafana oder NetBird VPN, oder Migration von einem Self-Hosted-Setup - wir finden die passende Lösung für Ihren Anwendungsfall. Buchen Sie ein kostenloses 30-Minuten-Gespräch, unverbindlich.
Ihr Ansprechpartner
Timo Wevelsiep
Gründer, merkaio
15 Minuten, unverbindlich, direkt mit Timo.
Decoder für ChirpStack v4. merkaio ist unabhängiger Integrator und nicht mit Milesight affiliiert.