Lade das Gehirn auf den seriellen Anschluss: LLCOM Lua Script Debugger

kostenlosKostenloses technisches Material

Dieser Inhalt ist direkt lesbar und eignet sich für das Grundlagenlernen und die Suche.

Lade das Gehirn auf den seriellen Anschluss: LLCOM Lua Script Debugger

Quelle: Modbus Chinesisches Netzwerk (modbus.cn) - führende Modbus Kommunikationsprotokoll Technologie-Community in China

Dieser Artikel: LLCOM: Installieren Sie Lua-Gehirn für den seriellen Port - - ein vollständiger Leitfaden zur Verdoppelung der Modbus-Debugging - Effizienz · Autor: Modbus-Technologie - Team · Veröffentlicht am 2026 - 07 - 01

Zusammenfassung: LLCOM ist ein Open-Source - Debugging-Tool für Windows (chenxuuu / llcom) auf GitHub, das auf der. NET - und Tencent-Xlua - Engine basiert, um das Debugging von seriellen Ports nicht mehr als ein manuelles Hexadezimal-Frame zu erledigen. Sein Kern-Killer - Schlag ist die vollständige Lua 5.3 - Betriebsumgebung auf der Basis von Standard-Seriell - Tools, unterstützt das Luat Task-Framework, kann Skripte automatisch senden und empfangen, automatisch berechnen Modbus CRC, automatisch polling, automatisch analysieren Antworten schreiben. Dieser Artikel behandelt von der Installation bis zur API bis zu vier Modbus-Skripte in der Praxis jeden Schritt, vom Download bis zum Automatisierten Test von Sprintpass. Schlagwörter: LLCOM, Lua Debugging, Modbus CRC-Automatische Berechnung, Serienport-Automatische Tests, xlua, Luat Task.


Der häufigste Workflow zum Debuggen von Modbus-RTU - Geräten ist: Öffnen des seriellen Port-Tools → manuelle Eingabe von Hexadezimal-Frammen → Senden von Punkten → Egaler-Antworten → Blick-Kontrolle - Bytes → Entdecken eines CRC-Falsches → Wiederholen. Zehn Geräte wurden eingestellt, Finger schmerzen, die Augen saure, das Herz zerbrochen.

Das ist das Problem, das LLCOM löst. Es ist nicht nur ein serieller Assistent - es ist eine serielle Debugger-Engine, die Skript ausführt.


1. Was ist LLCOM?

LLCOM ist ein GitHub-Open - Source-Projekt (chenxuuu / llcom), das in C # geschrieben ist, auf dem. NET-Framework basiert und Tencent xlua als Scripting-Engine verwendet. Die Lizenz lautet Apache 2.0.

Ein Satz: Programmierbares Debugging-Tool. Der gewöhnliche serielle Anschluss-Assistent kann nur "Tastatur-Tippen - Hex-Dezimal → Handkommandosendung → bloßes Auge sehen, die Hex-Dezimal". LLCOM kann Lua-Skripte schreiben, um Daten automatisch zu verarbeiten, zu senden, zu analysieren und zu überprüfen.

Kernstruktur 3 Ebenen:

  • SerienübertragungStandard-serielle Anschlusskommunikation, Unterstützung der Baudrate, Datenbit, Checksbit Konfiguration, gleichzeitig integrierte TCP / UDP / MQTT-Client - und Server-Funktionen, kann auch die von anderen Programmen verwendeten seriellen Anschlüssen überwachen
  • Die Lua Script Engine- Lua 5.3 - Umgebung + Luat Task-Framework (sys.wait, sys.taskInit, sys.timerLoopStart, etc.)
  • Verarbeitungsschicht vor SendenDie Daten, die der Benutzer in das Send-Box eingegeben hat, können in einem Lua-Skript verarbeitet werden, bevor sie ausgeschickt werden - automatische Zeilenwechsel, automatische Hex-Konvertierung, automatische JSON-Assembly, alles.

Open - So urce - Ad resse : https ://github.com/chenxuuu/llcom


II. Installation und Download

Wählen Sie einen von drei Kanälen:

Option 1: Der Microsoft StoreInstallieren Sie die Installation durch die Suche nach "LLCOM" im Microsoft Store, der mit Windows geliefert wird. Der Vorteil ist, dass es automatisch aktualisiert wird, der Nachteil ist, dass ein Microsoft-Konto benötigt wird.

Option 2: Portable Version (ohne Installation)Laden Sie das Zip-Paket von unten herunter, öffnen Sie es in ein beliebiges Verzeichnis und doppelklicken Sie auf llcom.exe, um es auszuführen. Nicht auf die Registrierung, nicht schreiben Sie Systemverzeichnisse, legen Sie in die USB-Sticket überall mit laufen.

Methode 3: GitHub Releasesvonhttps://github.com/chenxuuu/llcom/releases/latestDownload der neu esten stabil en Version . Gee ignet für De bu gging - S zen arien , in denen eine bestimmte Version erforderlich ist .

Systemanforderungen: Windows 10 und höher, 64 - Bit. Benötigt. NET Runtime (Windows 10 / 11 ist normalerweise integriert; falls. NET Runtime fehlt, laden Sie. NET Desktop Runtime 8.0 von der Microsoft-Website herunter).


3. Funktionsliste: Mehr als ein gewöhnlicher Serien-Assistent

LLCOM hat alle Funktionen eines normalen seriellen Assistenten.(Serial Port Auswahl, Baud-Rate / Check-Bit - Konfiguration, Hex / ASCII-Sendung, Log-Anzeige), dann hinzugefügt:

FunktionenBeschreibungModbus-Debugging - Szenario
Lua-Vor - SendenverarbeitungInhalte der Eingabefelder werden erst nach der Verarbeitung des Lua-Skripts gesendetAutomatisches Spleiß von CRCs, automatisches Hinzufügen von Slave-Adressen
eigenständiger Lua-Skriptbereichrechts vollständiges Lua-Skript mit Timer und Collaboration ausgeführtSchreiben eines Skripts Automatisches Polling aller Slave-Register
VerknüpfungssendleisteSpeichern häufig verwendeter Befehle, Senden mit einem KlickLesen von Frames in verschiedenen Registers auf verschiedene Seiten
SerienüberwachungÜberwachen von Seriendaten, die von anderen Programmen verwendet werdenÜberprüfen, welche Frames von einer Host-Software gesendet werden
TCP / UDP / SSL-Client und - ServerTCP ohne Serienanschluss direkt anmelden könnenModbus-TCP - Port-Test
MQTT-TestIntegration MQTT-Veröffentlichung / AbonnementAuthentifizierung des MQTT-Uplinks des Gateways
Automatische Wiederverbindung des seriellen PortsAutomatische Wiederherstellung der Verbindung nach TrennungDer Neustart des Geräts wird nicht unterbrochen Debugging
Automatische ProtokollspeicherungSerielle Ports mit Zeitstempel und Lua-JournalUmsetzen des kompletten Geräts, Rückblick auf das Protokoll
Umwandlung zwischen Code Interchange / Chaos RecoveryGBK / UTF - 8 / Hex UmwandlungChinesische Zeichenzeichen Debug

4. Detail der zwei Kernfunktionen

4.1 Lua-Verarbeitung vor dem Senden

Dies ist die unmittelbarste Funktion von LLCOM. Schreiben Sie eine Lua in "Send-Einstellungen" → "Send-Process - Skript", jedes Mal, wenn Sie auf Senden klicken, geben Sie den ursprünglichen Text in dem Eingabefeld zuerst an dieses Skript, die Zeichenfolge, die nach der Verarbeitung des Skripts zurückgegeben wird, ist die Daten, die tatsächlich an den seriellen Port gesendet werden.

Drei klassische Anwendungen:

Automatisch hinzufügenrn: Viele serielle Anschlussgeräte verlangen, dass Befehle mit einer Rückkehr am Ende der Zeile umschneiden -

return uartData .. "rn"

Von nun an müssen Sie nicht jedes Mal 0D0A manuell tippen, sondern den Eingabebefehl direkt an den Punkt senden.

Automatische Hexadezimalkonvertierung: Schreiben Sie eine Hexadezimalzeichenfolge (z.B.010300000001) in das Eingabefeld, und das Skript wird automatisch in Binär konvertiert -

return uartData:fromHex()

Dies ist der Standard für Modbus RTU-Debugging - Sie schreiben die hexadezimal-Darstellung des Modbus-Frame in das Eingabefeld, und das Skript wird in binäres Format umgewandelt, um das Gerät zu senden.

JSON wird automatisch zusammengesetzt: Geben Siea,b,cein und senden Sie JSON - -

json = require("JSON")
t = uartData:split(",")
return json:encode({
    key1 = t[1],
    key2 = t[2],
    key3 = t[3],
})

Jede Taste in der Schnellversandleiste folgt dem gleichen Skript, also können Sie 10 Seiten Schnellversand erstellen, verschiedene Modbus-Befehle pro Seite geben und dann automatisch CRC bei jedem Klick auf die Taste senden - die vollständige Implementierung wird später angegeben.

4.2 Unabhängige Lua-Skript - Zone

Rechts befindet sich ein Bereich „Lua-Skripte", in dem Sie vollständige Lua-Programme schreiben und ausführen. Das Skript hier verfügt über die vollständigen Fähigkeiten des Luat Task-Frameworks:

  • sys.taskInit()Erstellen von Kooperations-Tasks
  • sys.wait(ms)Warten auf Verzögerungen (ohne Blockade der Schnittstelle)
  • sys.waitUntil()Warten auf Nachrichten (ereignisgetrieben)
  • sys.timerLoopStart()Loop-Timer
  • sys.publish() / sys.subscribe()Nachrichtenveröffentlichung Abonnements

Grundbeispiel: Automatische Antwort nach Empfang von seriellen Daten - -

uartReceive = function (data)
    log.info("uartReceive", data)
    sys.publish("UART", data)
end

sys.taskInit(function()
    while true do
        local _, udata = sys.waitUntil("UART")
        log.info("task waitUntil", udata)
        local sendResult = apiSendUartData("ok!")
        log.info("uart send", sendResult)
    end
end)

Sie können sogar eine HTTP-Anfrage direkt mit xlua aufrufen System. Net-Klassenbibliothek in C # - das bedeutet, dass Sie ein Skript schreiben können, das automatisch eine Nachricht in die Cloud schieben, sobald der serielle Port Daten empfängt.


V. Kern-API - Schnellüberprüfung

Die Lua API - D okument ation für LLC OM bef ind et sich unterhttps://github.com/chenxuuu/llcom/blob/master/LuaApi.mdHier sind die am hä ufig sten verwend eten Teile des Mod bus - De bu gging auf gel istet .

5.1Übertragung der API

-- 发送数据到串口(推荐新接口)
apiSend("uart", data)

-- 发送数据到串口(旧接口,后续会移除)
apiSendUartData(data)

-- 订阅串口接收回调
apiSetCb("uart", function(data)
    log.info("received", data)
end)

-- 取消订阅
apiUnsetCb("uart", callback)

5.2 API Timer und Kooperation

-- 创建任务
sys.taskInit(function()
    while true do
        -- 你的逻辑
        sys.wait(1000)  -- 等 1000ms
    end
end)

-- 循环定时器
sys.timerLoopStart(function()
    log.info("tick", os.time())
end, 1000)  -- 每 1000ms 触发一次

-- 停止定时器
sys.timerStop(timerId)

5.3 Verarbeitung der API

-- 二进制转十六进制字符串
string.toHex("x01x03")  -- 返回 "0103"

-- 十六进制字符串转二进制
("010300000001"):fromHex()

-- 分割字符串
("a,b,c"):split(",")  -- 返回 {"a","b","c"}

5.4 Protokoll API

log.info("tag", "message")
log.warn("tag", "warning")
log.error("tag", "error")

Alle Protokolle werden automatisch im Softwareverzeichnis gespeichert und werden mit einem Zeitstempel versehen.


Modbus-RTU - Skript

Die folgenden Scripts können direkt in LLCOM kopiert werden. Jeder ist vollständig verfügbar.

6.1 Intelligente Übertragung: Modbus CRC automatisch berechnen und senden

Müde von der Hand-Rechnung von CRC? Dies ist die klassischste Anwendung von LLCOM im Modbus-Debugger.

Einfügen Sie in "Send Verarbeitung Skript":

-- Modbus CRC16 查表法(多项式 0xA001)
local crcTable = {}
for i = 0, 255 do
    local crc = i
    for _ = 1, 8 do
        if (crc & 1) ~= 0 then
            crc = (crc >> 1) ~ 0xA001
        else
            crc = crc >> 1
        end
    end
    crcTable[i] = crc
end

local function modbusCrc16(data)
    local crc = 0xFFFF
    for i = 1, #data do
        local b = string.byte(data, i)
        crc = (crc >> 8) ~ crcTable[(crc ~ b) & 0xFF]
    end
    return crc
end

-- 主逻辑:把输入转成二进制,计算 CRC,拼上去,发给串口
local raw = uartData:fromHex()  -- 输入框写十六进制,如 010300000001
local crc = modbusCrc16(raw)
local lo = crc & 0xFF
local hi = (crc >> 8) & 0xFF
return raw .. string.char(lo, hi)

Jetzt schreiben Sie010300000001in das Eingabefeld (Sendstation-Adresse = 01, Funktionscode = 03, Start-Adresse = 0000, Register-Zahl = 0001), und nach dem Senden wird01 03 00 00 00 01 84 0A- - CRC automatisch hinterher gesendet.

6.2 Das Modbus RTU-Auto - Polling-Skript

wird im Bereich "Lua-Skript" ausgeführt und liest alle 2 Sekunden das Hold-Register 40001 von Station 01 (Adresse 0x0000), um die zurückgegebenen Daten automatisch zu analysieren:

-- CRC 表(同上,这里省略,需要放在脚本最前面)
-- ...(和 6.1 的 crcTable 和 modbusCrc16 函数一样)

local function buildReadFrame(slave, startAddr, regCount)
    local frame = string.char(slave, 0x03,
        (startAddr >> 8) & 0xFF, startAddr & 0xFF,
        (regCount >> 8) & 0xFF, regCount & 0xFF)
    local crc = modbusCrc16(frame)
    return frame .. string.char(crc & 0xFF, (crc >> 8) & 0xFF)
end

local function parseResponse(data)
    if #data < 5 then
        log.warn("modbus", "响应太短: " .. string.toHex(data))
        return nil
    end
    local slave = string.byte(data, 1)
    local func = string.byte(data, 2)
    if func > 0x80 then
        log.error("modbus", "异常码: 0x" .. string.format("%02X", string.byte(data, 3)))
        return nil
    end
    local byteCount = string.byte(data, 3)
    local values = {}
    for i = 0, (byteCount / 2) - 1 do
        local hi = string.byte(data, 4 + i * 2)
        local lo = string.byte(data, 5 + i * 2)
        values[i + 1] = (hi << 8) | lo
    end
    return {slave = slave, values = values}
end

-- 接收处理
apiSetCb("uart", function(data)
    local result = parseResponse(data)
    if result then
        log.info("modbus", string.format("从站%02X 寄存器值: %s",
            result.slave, table.concat(result.values, ", ")))
    end
end)

-- 轮询任务
sys.taskInit(function()
    while true do
        local frame = buildReadFrame(0x01, 0x0000, 4)
        log.info("modbus", "发送: " .. string.toHex(frame))
        apiSend("uart", frame)
        sys.wait(2000)
    end
end)

Nach Ausführung gibt es eine ähnliche Log-Ausgabe:modbus 发送: 0103000000044409modbus 从站01 寄存器值: 168, 2234, 0, 512。Keine menschliche Eingriffe erforderlich, das Skript automatisch pollt, analysiert und protokolliert.

6.3 Mehr von einem Scanner

Scannt automatisch, welche Slaves im Bus online sind. Lesen Sie einen Befehl nach dem anderen, und die Antwort ist online:

-- CRC 函数同上,省略

local function scanSlave(slaveId)
    local frame = string.char(slaveId, 0x03, 0x00, 0x00, 0x00, 0x01)
    local crc = modbusCrc16(frame)
    frame = frame .. string.char(crc & 0xFF, (crc >> 8) & 0xFF)

    apiSetCb("uart", function(data)
        if #data >= 5 and string.byte(data, 1) == slaveId
            and string.byte(data, 2) == 0x03 then
            log.info("scan", "从站 " .. slaveId .. " 在线✓")
        end
    end)

    apiSend("uart", frame)
    log.info("scan", "扫描从站 " .. slaveId .. " ...")
end

sys.taskInit(function()
    for slaveId = 1, 247 do
        scanSlave(slaveId)
        sys.wait(150)  -- 等 150ms 给从站响应时间
    end
    log.info("scan", "扫描完成")
end)

Das Skript läuft ab, und das Protokoll listet alle online-Slaven - Adressen auf. Nach dem ersten Strom in einem großen Projekt läuft dies, um die Anleitung nach dem anderen zu lesen.

6.4 Automatische Auflösung von Reaktionsframes + Datenexport

Nach dem Erhalt der Modbus-Antwort, wird automatisch aufgelöst und in CSV-Zeilen formatiert, um in Excel zu kopieren, um die Trendanalyse zu machen:

local results = {}

apiSetCb("uart", function(data)
    if #data < 5 then return end
    local slave = string.byte(data, 1)
    local func = string.byte(data, 2)
    if func >= 0x80 then
        log.error("modbus", string.format("S=%02X 异常码0x%02X", slave, string.byte(data, 3)))
        return
    end
    local byteCount = string.byte(data, 3)
    local row = {os.date("%H:%M:%S"), slave}
    for i = 0, (byteCount / 2) - 1 do
        local hi = string.byte(data, 4 + i * 2)
        local lo = string.byte(data, 5 + i * 2)
        table.insert(row, (hi << 8) | lo)
    end
    table.insert(results, table.concat(row, ","))
    log.info("csv", table.concat(row, ","))
end)

-- 轮询任务(每 5 秒采集一次,共采集 60 次 = 5 分钟)
sys.taskInit(function()
    for i = 1, 60 do
        local frame = string.char(0x01, 0x03, 0x00, 0x00, 0x00, 0x04)
        local crc = modbusCrc16(frame)
        apiSend("uart", frame .. string.char(crc & 0xFF, (crc >> 8) & 0xFF))
        sys.wait(5000)
    end
    log.info("export", "采集完成,共 " .. #results .. " 行")
end)

Jede Zeile des Protokolls kann direkt in die CSV-Datei kopiert und eingefügt werden, die mit Excel geöffnet wird.


VII. TCP / MQTT / Listening - - Weitere Modbus-Szenarien

7.1 Modbus TCP

LLCOM kann als TCP-Client mit einem Modbus-TCP - Gerät verbunden werden (Standardport 502).Öffnen Sie die TCP-Client - Funktion, füllen Sie die Geräte-IP und Port 502 aus, senden und empfangen wie serielle Anschlüsse nach erfolgreicher Verbindung - Der Unterschied zwischen einem Modbus TCP-Frame und einem RTU-Frame besteht nur darin, dass es weniger CRCs und mehr MBAP-Header (6 Bytes) gibt. Sie können die MBAP-Header automatisch in das Senden-Verarbeitungskripte einfügen:

-- 输入框写 000000000006010300000001
-- 表示:事务ID=0000,协议ID=0000,长度=0006,单元ID=01,功能码=03,起始地址=0000,寄存器数=0001
return uartData:fromHex()

oder das Skript empfängt RTU-Frame, das vom seriellen Port empfangen wird, entfernt CRC durch MBAP-Header und sendet über TCP-Kanal. Siehechannel-demo.lua- Beispiel, das mit der Software geliefert wird.

7.2 MQTT-Test

Wenn Sie ein Modbus-Gateway debuggen (DTU konvertiert serielle Daten in MQTT-Veröffentlichungen), kann die MQTT-Funktion von LLCOM direkt das Thema des Gateway-Veröffentlichungen abonnieren, um zu sehen, ob die Daten vom Gateway korrekt sind. Außerdem können Sie Nachrichten zum Control-Thema testen.

7.3 Serial-Anschluss

Die Funktion „Serial Listening" kann die serielle Kommunikation erfassen, die von anderen Software verwendet wird - zum Beispiel, wenn Ihre Host-Software mit dem Gerät kommuniziert, und Sie möchten es nicht beenden, sondern sehen, welche Frames es sendet. LLCOM kann leise Seriendaten scrabbeln und Protokolle anzeigen, ohne die ursprüngliche Kommunikation zu beeinträchtigen.


8. Vergleich mit ähnlichen Instrumenten

ToolsScripting SupportModbus CRCOpen SourcePreise
LLCOMLua 5.3 + xlua + Collaboration FrameworkMuss selbst geschrieben werden (in diesem Artikel verfügbar)Kostenlos
SSCOMNicht unterstütztKostenlos
COMTooleingeschränktNicht unterstütztKostenlos
Modbus PollKein (Fix-Funktion für Modbus-Profession)Eingebaut$129
ModScanEingebaut$69

LLCOM ist kein Modbus-Werkzeug, das „out of the box" ist, sondern ein „All-Werkzeug, das sich in ein Modbus-Werkzeug verwandelt". Wenn Sie nur einen Knopf klicken müssen, um Modbus-Frame zu senden, ist Modbus Poll viel einfacher. Wenn Sie jedoch Batch-Automatisierungstests, benutzerdefinierte Analyse, Datenexport und MQTT / TCP-Mediting benötigen - LLCOM ist das flexibelste Open-Source - Tool, das derzeit verfügbar ist.


IX. Häufige Fragen

Q: Was ist mit dem Code?Überprüfen Sie, ob die Baudrate und die Prüfsätze mit dem Gerät übereinstimmen. Dann wechseln Sie im Empfangsbereich von LLCOM die Hex-Anzeige - in vielen Fällen ist das „Crypt" verwirrt, weil das Gerät binäre Daten zurückgibt, aber die Anzeige wird in ASCII aufgelöst.

F: Das Frame-Gerät, das vom CRC-Skript gesendet wird, reagiert nicht?Schritt 1: Stellen Sie sicher, dass die A / B-Linie nicht umgekehrt ist. Schritt 2: Überprüfen Sie im Empfangsbereich, ob das Gerät irgendwelche Bytes zurückgegeben hat - wenn überhaupt nicht, kann es sich um eine falsche Gerätadresse handeln. Schritt 3: Wenn das Gerät Daten zurückgibt, aber einen Ausnahmecode (Funktionscode + 0x80), prüfen Sie, was der Ausnahmecode ist - 0x02 ist "illegale Datenadresse", die Registeradresse kann nicht vorhanden sein.

F: Kann der Schaltflächenschaltflächenschaltflächenschaltfläche automatisch CRC-Skripte ausführen?kann. Die Inhalte der Quick-Send - Leiste werden auch durch das "Send-Process - Skript" - also müssen Sie die Quick-Send - Leiste nur nackte Frames füllen, nachdem Sie das CRC-Automatik - Berechnungskripte geschrieben haben (z. B.010300000001) füllen, nachdem Sie das CRC-Skript automatisch geschrieben haben.

F: Bei der Ausführung des Lua-Skripts gibt es einen Fehler?Fügen Sie eine Zeile am Anfang des Skriptbereichs hinzu.log.info("boot", "script started")Prüfen Sie, ob das Skript erfolgreich gestartet wurde. Die meisten Fehler entstehen aufgrund von falsch geschriebenen Variablennamen oder Aufrufen einer nicht vorhandenen API - die Log-Bereich zeigt eine Lua-Fehlermeldung an.


Der Kernwert von LLCOM besteht nicht darin, mehr Funktionalität zu haben, sondern darin, das Debuggen von wiederholter körperlicher Arbeit in eine programmierbare Aufgabe zu verwandeln. Sie haben eine halbe Stunde vor Ort verbracht, um drei Scripts zu schreiben, und die nächsten drei Tage kommen ein paar Maus-Klicks von selbst. Das ist der wahre Sinn von „Gehirn in den Serienanschluss" - nicht, dass LLCOM eine KI hat, sondern LLCOM, die es Ihnen ermöglicht, Ihre Debuggerlogik in Code zu schreiben und die Software für Sie auszuführen.

Probleme noch mal reden.

Relevante Etiketten
Sollte man diese Informationen für ein echtes Projekt verwenden?

Gehen Sie zum Tool Center, um Nachrichten zu analysieren, CRC-Prüfungen und Geräte-Debugging zu erledigen, oder senden Sie Anforderungen für Auswahl - und Zugangsvorschläge.

Ingenieur Mitglied

Verwandeln Sie diesen Artikel in ein umsetzbares Debuggermaterial

Erweiterte Nachrichtenanalyse, Paket-Downloads, Codebeispiele, Engineering-Szenarien und Priority-Technischer Support sind für die Real-Projekt - Bereitstellung möglich.

Unbegrenzte Werkzeuge
Datenpaket und Codepaket
Vollständige Engineering Case-Basis
Vorrangiger Zugang zum technischen Support

Antwort veröffentlichen

Ihre E-Mail - Adresse wird nicht öffentlich gemacht. Erforderliche Elemente wurden verwendet * markiert.