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.

Milesight UC100
UC100Controller
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
Funktionen

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.

Daten ins Dashboard

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.

ChirpStack v4 · decodeUplink
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.

Aus der Praxis

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.

Dein Partner

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

Er ist ein kompakter Modbus-RS485-zu-LoRaWAN-Konverter. Er fragt bis zu 32 Modbus-RTU-Slaves ab, etwa Energiezaehler und SPS, und leitet die Messwerte uber LoRaWAN weiter, sodass kabelgebundene Feldgeraete ein Dashboard ohne lokalen Backhaul erreichen.
Ja. Es ist ein Standard-LoRaWAN-Class-A-Geraet, kein Milesight-Gateway oder -Cloud noetig. Du fuegst den Codec ins Device-Profil ein und provisionierst ihn per OTAA.
Jeder Modbus-Kanal traegt ein Datentyp-Byte, das dem Decoder sagt, ob der Wert eine Coil, eine 16/32-Bit-Ganzzahl oder ein Float ist. Welche Register auf welchen Kanal abgebildet werden, wird bei der Konfiguration festgelegt. Der Decoder ist daher ein Framework, das wir gegen einen echten Uplink aus deinem Deployment aufbauen und pruefen, kein fester Drop-in.
Bis zu 32 Modbus-RTU-Slaves uber einen einzigen RS485-Bus, mit konfigurierbaren Registern je Geraet. Er unterstuetzt zudem Modbus-Transparentuebertragung fuer eigene Register.
Ja. Er speichert bis zu 800 Saetze an Verlaufsdaten lokal und sendet sie erneut, sobald die LoRaWAN-Verbindung wieder steht, sodass bei einem Netzausfall keine Daten verloren gehen.
Ja. Als Class-A-Geraet nimmt er Downlinks im Empfangsfenster nach einem Uplink an, sodass du Modbus-Register schreiben oder Aktionen ausloesen kannst. Wir bauen und pruefen die Befehle fuer dein Setup.
Aus derselben Serie

Verwandte Geräte

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.

Timo Wevelsiep

Ihr Ansprechpartner

Timo Wevelsiep

Gründer, merkaio

15 Minuten, unverbindlich, direkt mit Timo.

Mit dem Absenden stimmen Sie unserer Datenschutzerklärung zu.

Decoder für ChirpStack v4. merkaio ist unabhängiger Integrator und nicht mit Milesight affiliiert.