# LumiScan DMC Reader 1.1.0.6 – complete documentation

> All pages of the LumiScan DMC Reader 1.1.0.6 manual (language: de) by HD Vision Systems GmbH, in navigation order. Each page starts with a level-1 heading followed by its URL; cite that URL. Manual: https://docs.hdvisionsystems.com/de/lumiscan-dmc-reader-de/1.1.0/

# Beschreibung – LumiScan DMC Reader

URL: https://docs.hdvisionsystems.com/de/lumiscan-dmc-reader-de/1.1.0/lumiscan-dmc-reader/description.html

LumiScan DMC Reader findet Data-Matrix-Codes in einem Kamerabild und meldet für jeden Code, was er enthält und wo er liegt.

Die App liest **ECC 200** Data-Matrix-Codes – den modernen Standard mit quadratischen Modulen, der für die Teilekennzeichnung und die Direktmarkierung (Direct Part Marking) verwendet wird. Jeder im Bild gefundene Code wird gemeldet: Es gibt keine Begrenzung auf einen Code pro Lauf und weder ein Referenzbild noch einen Trainingsschritt irgendeiner Art.

> [!NOTE]
> Die Anwendung benötigt **keine Vorlage und keine Konfiguration**. Sie geben ihr die Adresse eines Bildes und rufen `execute` auf; sie liest jeden Data-Matrix-Code in diesem Bild. Ihre Schwester-Apps lesen die anderen Symbologien – LumiScan QR Code Reader, LumiScan Aztec Code Reader und LumiScan Barcode Reader – und arbeiten auf dieselbe Weise.

## Wo die App läuft

Die Anwendung läuft auf ctrlX OS (ctrlX CORE oder ctrlX IPC) mit dem ctrlX Data Layer sowie auf einem PC (Windows 11 oder Ubuntu 24.04) mit LumiScan Keryx, dem Data Layer von HD Vision Systems für PCs. Ihre Knoten, deren Adressen und deren Verhalten sind auf beiden gleich; wo sich etwas unterscheidet, sagt dieses Handbuch es. Siehe [Data-Layer-Referenz](https://docs.hdvisionsystems.com/de/lumiscan-dmc-reader-de/1.1.0/lumiscan-dmc-reader/datalayer-reference.html).

Was für jede LumiScan-App gleich ist – wie Adressen aufgebaut sind, der Handshake, die Aufrufmuster für Execute und Stream, Statuscodes, Einstellungen und Werkzeuge – ist im Handbuch [LumiScan Keryx](https://docs.hdvisionsystems.com/de/lumiscan-keryx-de/1.0.0/index.html) beschrieben. Dieses Handbuch behandelt nur, was für LumiScan DMC Reader spezifisch ist; seine eigenen Knoten sind in der [Data-Layer-Referenz](https://docs.hdvisionsystems.com/de/lumiscan-dmc-reader-de/1.1.0/lumiscan-dmc-reader/datalayer-reference.html) aufgeführt.

## Woher die Bilder kommen

Die Anwendung spricht nicht selbst mit einer Kamera. Sie liest einen Bildknoten, den eine andere Anwendung auf dem Data Layer veröffentlicht; seine Adresse wird in `input/image-address` angegeben, zum Beispiel:

```
hdvisionsystems/lumiscan-cam-driver/camera1/output/image
```

Der Knoten muss `data`, `width`, `height` und `pixel-type` veröffentlichen – genau das, was LumiScan Cam Driver liefert. Siehe [Voraussetzungen](https://docs.hdvisionsystems.com/de/lumiscan-dmc-reader-de/1.1.0/lumiscan-dmc-reader/requirements.html).

## Keine Module

Anders als die LumiScan-Anwendungen, die nach etwas Konfiguriertem suchen, hat der DMC Reader **keine Module**. Es gibt einen Reader pro Installation, unter einer Data-Layer-Adresse. Auf ctrlX OS deckt ihn ein Lizenzplatz ab.

Es gibt nichts pro Instanz zu konfigurieren, weil es überhaupt nichts zu konfigurieren gibt: Die einzige Eingabe, die sich von Lauf zu Lauf ändert, ist, welches Bild gelesen wird.

## Die Ergebnisse ansehen

Die Ergebnisse sind Zahlen auf dem Data Layer. Um sie in das Bild eingezeichnet zu **sehen**, in dem sie gefunden wurden, öffnen Sie LumiScan Cockpit: Es führt diese Anwendung als eine einzelne Ansicht mit dem Namen `datamatrix-code` und zeichnet um jeden Code ein Rechteck, beschriftet mit dem dekodierten Text und dem Score.

# Voraussetzungen – LumiScan DMC Reader

URL: https://docs.hdvisionsystems.com/de/lumiscan-dmc-reader-de/1.1.0/lumiscan-dmc-reader/requirements.html

## Lizenz {#licence}

Wie LumiScan DMC Reader lizenziert wird, hängt davon ab, wo Sie es gekauft haben und wo es läuft:

| Gekauft bei | Läuft auf | Lizenzierung |
| --- | --- | --- |
| HD Vision Systems | Windows 11 oder Ubuntu 24.04 | Die Lizenz liegt auf Ihrem LumiScan Key. Sie ist ein Einmalkauf und wird nicht verlängert.<br><br>[Lizenzierungsweg: gekauft bei HD Vision Systems](https://docs.hdvisionsystems.com/de/lumiscan-licensing-de/1.0.4/path-hdvs.html) |
| ctrlX Store | Windows 11 | Die Lizenz liegt in ctrlX WORKS. Zusätzlich ist der LumiScan Key erforderlich; er schützt die Software vor Reverse Engineering.<br><br>[Lizenzierungsweg: ctrlX Store, Windows](https://docs.hdvisionsystems.com/de/lumiscan-licensing-de/1.0.4/path-ctrlx-windows.html) |
| ctrlX Store | ctrlX OS (ctrlX CORE oder IPC) | ctrlX-Lizenz `SWL-W-XCx-DMxxxCRDSxHDVSx-V1NN`, eine Lizenz pro App-Instanz. Advanced-Funktionen benötigen zusätzlich `SWL-W-XCx-DMxxxCRDAxHDVSx-V1NN`.<br><br>[Lizenzierungsweg: ctrlX Store, ctrlX OS](https://docs.hdvisionsystems.com/de/lumiscan-licensing-de/1.0.4/path-ctrlx-os.html) |

Jedes Gerät, auf dem LumiScan DMC Reader gleichzeitig läuft, benötigt einen eigenen LumiScan Key. Keys können zwischen Geräten ausgetauscht werden.

Wie Sie die CodeMeter Runtime installieren und Lizenzen anfordern, verlängern und an einem anderen PC verwenden, steht in [LumiScan Lizenzierung](https://docs.hdvisionsystems.com/de/lumiscan-licensing-de/1.0.4/index.html).

Auf ctrlX OS wird die Lizenz beim Start bis zu zehn Sekunden lang geprüft; wird in dieser Zeit keine verfügbar, beendet sich der Reader, und der Grund wird in das Systemprotokoll geschrieben.

Ist eine Advanced-Lizenz verfügbar, verwendet die Anwendung sie automatisch. Ist keine verfügbar, läuft sie mit den Standard-Funktionen, statt den Start zu verweigern.

## Eine Bildquelle auf demselben Data Layer

Die Anwendung liest ihre Bilder aus dem Data-Layer-Bildknoten einer anderen Anwendung.

**Auf ctrlX OS:** Diese Anwendung muss auf dem **selben Gerät** (ctrlX CORE oder ctrlX IPC) laufen – der Zugriff auf einen entfernten Data Layer wird nicht unterstützt.

**Auf einem PC:** Diese Anwendung muss mit **demselben LumiScan Keryx** verbunden sein wie der Reader.

In der Praxis ist das LumiScan Cam Driver; es funktioniert aber jede Anwendung, solange der in `input/image-address` genannte Knoten diese vier Kindknoten bereitstellt:

| Knoten | Typ | Beschreibung |
| --- | --- | --- |
| `data` | Array aus uint8 | Rohe, unkomprimierte Pixeldaten |
| `width` | uint64 | Bildbreite in Pixeln |
| `height` | uint64 | Bildhöhe in Pixeln |
| `pixel-type` | string | Name des GenICam-Pixelformats |

### Unterstützte Pixelformate

`Mono8`, `Mono12`, `RGB8`, `RGB12`, `BGR8`, `BGR12`, `Bayer_GR8`, `Bayer_RG8`, `Bayer_GR12`, `Bayer_RG12`.

Der Name wird ohne Rücksicht auf Groß- und Kleinschreibung verglichen, und bei den Bayer-Namen darf der Unterstrich entfallen – `BayerGR8` und `bayer_gr8` sind dasselbe Format. Bayer-Bilder werden vor der Suche in Farbbilder umgewandelt.

Jedes andere Pixelformat wird abgelehnt, und der Lauf liefert kein Ergebnis.

> [!NOTE]
> Die Bilddaten müssen für das angegebene Format **mindestens** `width × height × bytes-per-pixel` Bytes umfassen. Ein Puffer, der kürzer ist, als die Metadaten versprechen, wird abgelehnt, statt über sein Ende hinaus gelesen zu werden.

## Speicherung

Das Lesen eines Codes speichert nichts: Es gibt kein Referenzbild und keine Modulliste, und die Adresse in `input/image-address` liegt auf dem Data Layer.

Der Bild-Stream (experimentell) bewahrt zwei Dinge im Konfigurationsverzeichnis der Anwendung auf: seinen Stream-Modus und das, was er abonniert, in `dmc-reader.json`, dort gespeichert, sobald sie sich ändern, sowie die Bedeutung jedes Einstellungs-Hash in `settings-history/` – eine kleine JSON-Datei pro Hash, die nie gelöscht wird. Wo dieses Verzeichnis auf ctrlX OS und auf einem PC liegt, steht in [In der Einstellungsdatei gespeichert](https://docs.hdvisionsystems.com/de/lumiscan-dmc-reader-de/1.1.0/lumiscan-dmc-reader/reading-codes-on-an-image-stream.html#saving).

## Zeitverhalten

Das Lesen ist **synchron**: Der Schreibvorgang auf `execute` kehrt zurück, wenn die Suche abgeschlossen ist. Wie lange das dauert, hängt von der Bildgröße ab, da bei jedem Lauf das gesamte Bild nach Codes durchsucht wird.

# Anleitung: Einen Data-Matrix-Code aus einem Kamerabild lesen – LumiScan DMC Reader

URL: https://docs.hdvisionsystems.com/de/lumiscan-dmc-reader-de/1.1.0/how-tos/read-a-code-from-a-camera-image.html

Diese Anleitung liest mit LumiScan DMC Reader die Data-Matrix-Codes in einem Bild von LumiScan Cam Driver und zeigt, wo der dekodierte Text und die Position stehen.

Am Ende liest ein Schreibzugriff auf die Methode `execute` des Lesers jeden Data-Matrix-Code im aktuellen Kamerabild.

Dieselben Schritte gelten für LumiScan QR Code Reader, LumiScan Aztec Code Reader und LumiScan Barcode Reader: Ersetzen Sie `lumiscan-dmc-reader` in den Adressen durch den Namen dieser Anwendung.

## Bevor Sie beginnen {#prerequisites}

- LumiScan DMC Reader und LumiScan Cam Driver laufen auf demselben Gerät - derselben ctrlX CORE oder demselben ctrlX IPC oder demselben PC. Ein Bild von einem anderen Gerät zu lesen wird nicht unterstützt.
- Das Kameramodul von LumiScan Cam Driver ist verbunden und kann Bilder aufnehmen.
- Optional: LumiScan Cockpit, um die Codes auf dem Bild zu sehen.

> [!TIP]
> Ohne Kamera verwenden Sie eine simulierte Kamera von LumiScan Cam Driver mit Beispielbildern, zum Beispiel dem Bild unten. Siehe [LumiScan Cam Driver: Wie funktioniert der Simulationsmodus?](https://docs.hdvisionsystems.com/de/lumiscan-cam-driver-de/2.2.1/faq.html#faq-simulation-mode).

![Auf Papier gedruckter Data-Matrix-Code vor einer gelochten Metallplatte](https://docs.hdvisionsystems.com/de/lumiscan-dmc-reader-de/1.1.0/_images/howto-dmc-example-code.png)

*Abbildung 1. Beispielbild mit einem Data-Matrix-Code*

## Wie es zusammenhängt {#overview}

LumiScan DMC Reader braucht keine Vorlage und keine Konfiguration. Er liest den Bildknoten, dessen Adresse Sie ihm geben, durchsucht das ganze Bild nach Data-Matrix-Codes nach ECC 200 und schreibt jeden gefundenen Code nach `output/results`.

Alle Adressen unten sind relativ zu `hdvisionsystems/lumiscan-dmc-reader`. Auf ctrlX OS setzen Sie Werte in der ctrlX-Weboberfläche unter **Settings > Data Layer** oder aus einer anderen Anwendung, zum Beispiel einem SPS-Programm.

## Schritt 1 - Den Leser auf das Kamerabild richten {#step-1-image-address}

Schreiben Sie die Adresse des Bildknotens der Kamera nach `input/image-address`. Für das Kameramodul `camera1`:

```
hdvisionsystems/lumiscan-cam-driver/camera1/output/image
```

Verwenden Sie die Adresse des Bildknotens selbst, nicht die seines Unterknotens `data`. Die Adresse bleibt erhalten; Sie setzen sie nur neu, wenn sich die Bildquelle ändert.

## Schritt 2 - Ein Bild aufnehmen {#step-2-capture}

Nehmen Sie mit LumiScan Cam Driver ein Bild auf, zum Beispiel mit einem Schreibzugriff auf `hdvisionsystems/lumiscan-cam-driver/camera1/control/capture/execute`.

Für ein sicheres Lesen sollte der Code scharf und kontrastreich sein, und seine Module - die schwarzen und weißen Quadrate - sollten im Bild mehrere Pixel breit sein.

## Schritt 3 - Die Codes lesen {#step-3-execute}

Schreiben Sie einen leeren Wert auf `execute`.

Der Aufruf kehrt zurück, wenn die Suche beendet ist.

## Schritt 4 - Das Ergebnis prüfen {#step-4-result}

Lesen Sie `output/results`. Es enthält einen Eintrag je gefundenem Code:

- `text` - der dekodierte Inhalt,
- `center` - der Mittelpunkt des Codes im Bild, in Pixeln,
- `score` - wie sicher die Lesung ist,
- `polygons` - die Eckpunkte des Codes, falls angegeben.

Eine leere Liste bedeutet: Das Bild wurde gelesen und enthielt keinen Data-Matrix-Code. Die Felder sind in [Das Ergebnis](https://docs.hdvisionsystems.com/de/lumiscan-dmc-reader-de/1.1.0/lumiscan-dmc-reader/the-result.html) beschrieben.

> [!IMPORTANT]
> Ein fehlgeschlagener Lauf - zum Beispiel bei falscher Bildadresse oder nicht lesbarem Bild - lässt `output/results` unverändert, mit den Codes des vorigen Laufs. Der Grund steht im Anwendungsprotokoll. Muss Ihr Programm wissen, ob das Ergebnis neu ist, vergleichen Sie das Ergebnis vor und nach dem Lauf oder prüfen Sie das Protokoll.

Um die Codes auf dem Bild zu sehen, öffnen Sie LumiScan Cockpit und wählen die Ansicht `datamatrix-code` von `lumiscan-dmc-reader`. Jeder Code ist umrahmt und mit Text und Score beschriftet.

## Ergebnis {#result}

- LumiScan DMC Reader liest das aktuelle Bild der Kamera.
- Ein Schreibzugriff auf `execute` liest jeden Data-Matrix-Code im Bild.
- Der dekodierte Text und die Position jedes Codes stehen in `output/results`.

In der Produktion ist ein Zyklus: mit LumiScan Cam Driver aufnehmen, auf `execute` des Lesers schreiben, `output/results` lesen. Um jedes Bild eines Kamerastreams ohne Aufruf je Bild lesen zu lassen, siehe [Codes in einem Bildstream lesen (experimentell)](https://docs.hdvisionsystems.com/de/lumiscan-dmc-reader-de/1.1.0/lumiscan-dmc-reader/reading-codes-on-an-image-stream.html). Probleme sind in [Fehlerbehebung](https://docs.hdvisionsystems.com/de/lumiscan-dmc-reader-de/1.1.0/troubleshooting.html) beschrieben.

# Einen Code lesen – LumiScan DMC Reader

URL: https://docs.hdvisionsystems.com/de/lumiscan-dmc-reader-de/1.1.0/lumiscan-dmc-reader/reading-a-code.html

Ein Lauf hat zwei Schritte: angeben, welches Bild gelesen werden soll, und dann `execute` aufrufen. Alle Pfade unten sind relativ zum Basispfad der Anwendung, `hdvisionsystems/lumiscan-dmc-reader`.

## 1. Den Reader auf ein Bild richten

Schreiben Sie die Adresse des Bildknotens in `input/image-address`:

```
hdvisionsystems/lumiscan-cam-driver/camera1/output/image
```

Das ist die Adresse des Bildknotens **selbst**, nicht die seines Kindknotens `data` – der Reader hängt beim Lesen `/data`, `/width`, `/height` und `/pixel-type` an.

Die Adresse wird gemerkt; sie muss also nur neu gesetzt werden, wenn sich die Bildquelle ändert.

## 2. execute aufrufen

Schreiben Sie einen leeren Wert in die Methode `execute`.

Der Aufruf ist **blockierend**: Er kehrt zurück, wenn die Suche abgeschlossen ist. Danach enthält `output/results` jeden Data-Matrix-Code, der in diesem Bild gefunden wurde – siehe [Das Ergebnis](https://docs.hdvisionsystems.com/de/lumiscan-dmc-reader-de/1.1.0/lumiscan-dmc-reader/the-result.html).

## Was ein Lauf tut

1. Liest die Adresse aus `input/image-address`.
2. Liest `data`, `width`, `height` und `pixel-type` unter dieser Adresse und wandelt die Pixel in ein Bild um – mit De-Bayering, wenn das Format es verlangt.
3. Durchsucht das **gesamte** Bild nach ECC 200 Data-Matrix-Codes.
4. Schreibt jeden gefundenen Code in `output/results`.

Es gibt keine Region of Interest und keine Teilsuche: Jeder Lauf liest den vollständigen aktuellen Inhalt des Bildknotens.

## Wenn ein Lauf fehlschlägt

Ein Lauf schlägt fehl, wenn das Bild nicht gelesen werden kann – keine Adresse gesetzt, eine Adresse, die sich nicht auflösen lässt, ein fehlender oder zu kurzer `data`-Puffer oder ein Pixelformat, das der Reader nicht unterstützt. Der Grund wird in das Protokoll der Anwendung geschrieben; auf ctrlX OS ist das das Systemprotokoll.

> [!WARNING]
> Ein fehlgeschlagener Lauf lässt `output/results` **unverändert**; der Knoten enthält weiterhin die Codes des vorherigen Laufs. Diese Version veröffentlicht keinen Statusknoten und gibt keine Kennung zurück, sodass das Ergebnis allein nicht verrät, ob es aktuell ist. Wenn der Ausgang eines Laufs wichtig ist, prüfen Sie das Protokoll – oder lesen Sie `output/results` vorher und nachher und vergleichen Sie.
>
> Ein leeres `output/results` bedeutet, dass das Bild erfolgreich gelesen wurde und keinen Data-Matrix-Code enthielt.

# Das Ergebnis – LumiScan DMC Reader

URL: https://docs.hdvisionsystems.com/de/lumiscan-dmc-reader-de/1.1.0/lumiscan-dmc-reader/the-result.html

`output/results` ist ein FlatBuffer mit einem Eintrag pro gefundenem Data-Matrix-Code, im registrierten Typ `types/hdvisionsystems/lumiscan-dmc-reader/code_detect_result`.

Die Wurzel ist ein Array – `CodeDetectResultArray.results` –, sodass ein Lauf, der nichts gefunden hat, ein leeres Array veröffentlicht und keinen Fehler.

## Was jeder Eintrag enthält

| Feld | Typ | Beschreibung |
| --- | --- | --- |
| `center` | `Point2f` | Der Mittelpunkt des Codes im Bild, in Pixeln |
| `text` | string | Der dekodierte Inhalt des Codes |
| `score` | float | Wie sicher das Leseergebnis ist |
| `polygons` | Array aus `Point2f` | Die Eckpunkte, die den Code im Bild umreißen |

`Point2f` ist ein Paar aus Gleitkommazahlen, `x` und `y`, in Bildpixelkoordinaten. Die Koordinaten sind Gleitkommazahlen, weil der Mittelpunkt und die Ecken eines Codes selten genau auf einer Pixelgrenze liegen.

## Das Ergebnis lesen

`center` und `text` sind immer vorhanden. `polygons` kann bei einem Eintrag fehlen; behandeln Sie einen fehlenden Umriss daher als „kein Umriss angegeben“ und nicht als Fehler.

**Über die ctrlX REST API (ctrlX OS):** Ein FlatBuffer kommt als JSON an, und seine Zahlen kommen **in Anführungszeichen** zurück – eine Gleitkommazahl ist in der Antwort ein String. Parsen Sie sie auf Ihrer Seite als Zahlen, statt sie als Text zu vergleichen.

## Das Ergebnis zeichnen

Um die Codes im Bild zu sehen, statt Koordinaten zu lesen, öffnen Sie LumiScan Cockpit. Es zeichnet um jeden Code ein Rechteck, beschriftet mit dem dekodierten Text und dem Score, in einer Ansicht mit dem Namen `datamatrix-code`.

Ein Code, der **lokalisiert, aber nicht dekodiert** wurde, hat keinen Text; Cockpit beschriftet ihn nur mit seinem Score.

# Codes auf einem Bild-Stream lesen (experimentell) – LumiScan DMC Reader

URL: https://docs.hdvisionsystems.com/de/lumiscan-dmc-reader-de/1.1.0/lumiscan-dmc-reader/reading-codes-on-an-image-stream.html

> [!IMPORTANT]
> Der Bild-Stream ist **experimentell**. Seine Knoten und Einstellungen können sich noch ändern. Verwenden Sie ihn zur Evaluierung, und prüfen Sie ihn mit Ihren Kameras und Ihrem Data Layer, bevor Sie sich darauf verlassen.

`execute` liest ein Bild pro Aufruf: Ihr Programm setzt `input/image-address` und schreibt auf `execute`. Ein Bild-Stream arbeitet umgekehrt. Der Cam Driver veröffentlicht jedes Bild, das er aufnimmt, auf `<camera name>/control/publish/output/stream/frame`, mit seiner Größe, seinem Pixelformat und seiner Lineage (siehe das Handbuch des Cam Driver, *Bilder streamen*). Der Reader abonniert den Stream einer Kamera, liest jeden Data-Matrix-Code in jedem Frame, sobald er eintrifft, und veröffentlicht ein Ergebnis pro Frame auf `control/subscribe/output/stream/result`.

Jeder Frame wird genau so gelesen, wie `execute` ein Bild liest. `execute` nimmt außer der Bildadresse keine Eingabe entgegen, und der Frame tritt an deren Stelle. `input/parameter` wird von keinem der beiden gelesen: siehe [Data-Layer-Referenz](https://docs.hdvisionsystems.com/de/lumiscan-dmc-reader-de/1.1.0/lumiscan-dmc-reader/datalayer-reference.html).

Jedes Ergebnis trägt die Lineage seines Frames – welche Kamera ihn aufgenommen hat, in welchem Lauf des Kamerastreams, als welcher Frame des Laufs – ergänzt um den eigenen Schritt des Readers. Siehe [Die Lineage eines Ergebnisses](https://docs.hdvisionsystems.com/de/lumiscan-dmc-reader-de/1.1.0/lumiscan-dmc-reader/reading-codes-on-an-image-stream.html#lineage).

Standardmäßig fällt der Reader nie hinter seine Kamera zurück. Treffen Frames schneller ein, als der Reader sie liest, nimmt er jedes Mal, wenn der vorherige Lesevorgang abgeschlossen ist, den neuesten Frame. Die Frames dazwischen werden als übersprungen gezählt. Wie viele Frames warten dürfen, wird mit der Warteschlangengröße festgelegt, siehe [Die Warteschlangengröße](https://docs.hdvisionsystems.com/de/lumiscan-dmc-reader-de/1.1.0/lumiscan-dmc-reader/reading-codes-on-an-image-stream.html#queue-size).

Das allgemeine Konzept der Streams, das die anderen LumiScan-Anwendungen teilen, ist in [Streams](https://docs.hdvisionsystems.com/de/lumiscan-keryx-de/1.0.0/streams.html) beschrieben. Diese Seite beschreibt den Stream des Readers.

## Die Knoten des Streams {#addresses}

Der Reader hat die Knoten des Streams, ob er einen Stream abonniert oder nicht. Um sie zu verwenden, ist kein Neustart nötig. Alle Adressen unten beginnen mit `hdvisionsystems/lumiscan-dmc-reader/`. Es gibt keine Module: ein Stream pro Installation.

**Tabelle 1. Methoden**

| Adresse | Bedeutung |
| --- | --- |
| `control/subscribe/execute` | Prüft die fünf Eingaben von `control/subscribe` gemeinsam, speichert sie in der Einstellungsdatei des Readers und wendet sie dann an: Ein laufender Stream folgt bei seinem nächsten Zyklus, ohne Neustart. Eine Eingabe allein zu schreiben ändert nichts. Siehe [Die Quelle ändern](https://docs.hdvisionsystems.com/de/lumiscan-dmc-reader-de/1.1.0/lumiscan-dmc-reader/reading-codes-on-an-image-stream.html#subscribing). |
| `control/unsubscribe/execute` | Entfernt die von `control/unsubscribe/input/address` genannte Quelle, womit auch der Stream-Modus endet. Das Tag bleibt. Wird wie ein Subscribe in der Einstellungsdatei des Readers gespeichert. |

**Tabelle 2. Eingaben von control/subscribe**

| Adresse | Typ | Bedeutung |
| --- | --- | --- |
| `control/subscribe/input/enable` | bool | Stream-Modus: `true` lässt den Stream laufen, `false` stoppt ihn. |
| `control/subscribe/input/address` | string | Die eine Quelle: der Stream-Ordner einer Kamera, zum Beispiel `hdvisionsystems/lumiscan-cam-driver/camera1/control/publish/output/stream`. Der Reader liest dessen Knoten `frame`. Eine andere Adresse ersetzt die Quelle. |
| `control/subscribe/input/tag` | string | Das Tag, das der Reader auf seine Ergebnisse setzt: Der Schritt des Readers in der Lineage jedes Ergebnisses trägt es, sodass jeder, der ein Ergebnis weiter hinten in der Kette liest, sieht, welches Modul es gelesen hat. Leer: der Name des Readers, `lumiscan-dmc-reader`. Ein neues Tag markiert das nächste Ergebnis; die Quelle bleibt abonniert. |
| `control/subscribe/input/queue-size` | uint32 | Wie viele Frames warten dürfen, während ein Frame gelesen wird: `1` bis `64`. Siehe [Die Warteschlangengröße](https://docs.hdvisionsystems.com/de/lumiscan-dmc-reader-de/1.1.0/lumiscan-dmc-reader/reading-codes-on-an-image-stream.html#queue-size). |
| `control/subscribe/input/keep-latest-output` | bool | `true`, um jedes Stream-Ergebnis zusätzlich in `output/results` zu schreiben. Siehe [Das neueste Ergebnis behalten](https://docs.hdvisionsystems.com/de/lumiscan-dmc-reader-de/1.1.0/lumiscan-dmc-reader/reading-codes-on-an-image-stream.html#keep-latest-output). |

Die Eingaben sind mit dem vorbelegt, was beim Start der Anwendung angewendet wird; ein Client kann also eine davon ändern und `execute` aufrufen.

Was die Quelle enthalten muss: Lesen Sie `system/meta/subscription-schema`. Es ist ein JSON Schema des Knotens `frame` der Quelle, eines `stream_image` mit seiner `lineage` und seinem `image`, in seiner JSON-Form. Siehe [Data-Layer-Referenz](https://docs.hdvisionsystems.com/de/lumiscan-dmc-reader-de/1.1.0/lumiscan-dmc-reader/datalayer-reference.html#system).

**Tabelle 3. Eingabe von control/unsubscribe**

| Adresse | Typ | Bedeutung |
| --- | --- | --- |
| `control/unsubscribe/input/address` | string | Die zu entfernende Quelle: die Adresse, die `setting/stream/address` anzeigt. Ein `/` am Anfang oder Ende zählt nicht. |

**Tabelle 4. Einstellungen**

| Adresse | Typ | Bedeutung |
| --- | --- | --- |
| `setting/stream/enable`, `setting/stream/address`, `setting/stream/tag`, `setting/stream/queue-size`, `setting/stream/keep-latest-output` | wie die Eingaben | Was `control/subscribe/execute` oder `control/unsubscribe/execute` zuletzt angewendet hat, so wie die Einstellungsdatei es speichert. Schreibgeschützt. |
| `setting/settings-hash` | string | Der Hash dessen, womit die Ergebnisse erzeugt werden, als 16 Hexadezimalziffern. Schreibgeschützt. Siehe [Der Einstellungs-Hash](https://docs.hdvisionsystems.com/de/lumiscan-dmc-reader-de/1.1.0/lumiscan-dmc-reader/reading-codes-on-an-image-stream.html#settings-hash). |

**Tabelle 5. Ausgaben**

| Adresse | Typ | Bedeutung |
| --- | --- | --- |
| `control/subscribe/output/stream/active` | bool | `true`, solange der Stream läuft. |
| `control/subscribe/output/stream/result` | flatbuffers `stream_codes` | Die aus jedem Frame gelesenen Codes und die Lineage des Frames. Abonnieren Sie den Knoten, um jedes Ergebnis zu erhalten. Siehe [Das Ergebnis eines Frames](https://docs.hdvisionsystems.com/de/lumiscan-dmc-reader-de/1.1.0/lumiscan-dmc-reader/reading-codes-on-an-image-stream.html#result). |
| `control/subscribe/output/stream/last-failure` | string | Warum der letzte Frame, der nicht gelesen werden konnte, fehlgeschlagen ist. Nennt die Quelle über ihre Adresse, zum Beispiel `a frame of 'hdvisionsystems/lumiscan-cam-driver/camera1/control/publish/output/stream' failed: …`. Wird geleert, wenn der Stream startet. |
| `control/subscribe/output/stream/statistics/…` | uint64 | Zähler des aktuellen oder des letzten Streams, siehe [Die Statistik lesen](https://docs.hdvisionsystems.com/de/lumiscan-dmc-reader-de/1.1.0/lumiscan-dmc-reader/reading-codes-on-an-image-stream.html#statistics). |

> [!NOTE]
> `execute` schreibt in `output/results`, der Stream in `control/subscribe/output/stream/result` – Singular. In `output/results` schreibt der Stream nur mit eingeschaltetem `keep-latest-output`.

## Einrichtung {#setting-up}

1. Stellen Sie sicher, dass der Stream des Cam Driver läuft: Sein `hdvisionsystems/lumiscan-cam-driver/<camera name>/control/publish/output/stream/active` ist `true`.
2. Schreiben Sie den Stream-Ordner der Kamera, zum Beispiel `hdvisionsystems/lumiscan-cam-driver/camera1/control/publish/output/stream`, in `control/subscribe/input/address`. Lassen Sie `control/subscribe/input/tag` leer, um die Ergebnisse mit dem Namen des Readers zu markieren, oder schreiben Sie ein eigenes Tag hinein.
3. Abonnieren Sie `control/subscribe/output/stream/result`.
4. Setzen Sie `control/subscribe/input/enable` auf `true` und schreiben Sie dann auf `control/subscribe/execute`. Warten Sie, bis `control/subscribe/output/stream/active` `true` ist. Ab dann treffen die Ergebnisse ein.
5. Zum Stoppen setzen Sie `control/subscribe/input/enable` auf `false` und schreiben erneut auf `control/subscribe/execute`. Der Frame, der gerade gelesen wird, wird zuerst fertig gelesen.

Auf ctrlX OS nehmen Sie dieselben Schreibzugriffe in der Data-Layer-Ansicht der Weboberfläche von ctrlX OS oder aus Ihrem SPS-Programm vor.

**Auf einem PC** dieselben Schritte mit `krxclient`, dem Kommandozeilen-Client von LumiScan Keryx, der eine SPS vertritt (siehe [Werkzeuge](https://docs.hdvisionsystems.com/de/lumiscan-keryx-de/1.0.0/tools.html#krxclient)). Ergänzen Sie die Optionen `--keryx-backend` und `--keryx-url`, die Ihr Broker benötigt:

```none
krxclient write hdvisionsystems/lumiscan-dmc-reader/control/subscribe/input/address hdvisionsystems/lumiscan-cam-driver/camera1/control/publish/output/stream
krxclient write hdvisionsystems/lumiscan-dmc-reader/control/subscribe/input/enable true
krxclient execute hdvisionsystems/lumiscan-dmc-reader/control/subscribe/execute
krxclient subscribe hdvisionsystems/lumiscan-dmc-reader/control/subscribe/output/stream/result --count 5
```

`krxclient subscribe` zeigt einen FlatBuffer nur über seine Größe an. Es sagt Ihnen, dass Ergebnisse eintreffen, nicht, was sie enthalten.

Gut zu wissen:

- Der Stream-Modus ist ein **Pegel**, kein Befehl: Der Stream läuft, solange das angewendete `enable` `true` ist.
- Der Stream kann vor dem Stream des Cam Driver gestartet werden. Ergebnisse treffen ein, sobald Frames eintreffen.
- Was `control/subscribe/execute` anwendet, wird in der Einstellungsdatei des Readers gespeichert. Nach einem Neustart der Anwendung startet der Reader so, wie er war: Einer, der gestreamt hat, streamt sofort wieder, ohne dass Ihr Programm etwas ausführt. Siehe [In der Einstellungsdatei gespeichert](https://docs.hdvisionsystems.com/de/lumiscan-dmc-reader-de/1.1.0/lumiscan-dmc-reader/reading-codes-on-an-image-stream.html#saving).

## Die Quelle ändern {#subscribing}

Ein Reader nimmt eine Quelle. Eine SPS oder ein anderer Client ändert sie, während die Anwendung läuft, mit oder ohne laufenden Stream:

1. Schreiben Sie die neuen Werte in die Eingaben von `control/subscribe` – nur die, die Sie ändern: Die anderen enthalten, was angewendet ist.
2. Schreiben Sie auf `control/subscribe/execute`. Die Eingaben werden gemeinsam geprüft, in der Einstellungsdatei des Readers gespeichert und erst dann angewendet: `setting/stream/` zeigt sie sofort an, und ein laufender Stream folgt bei seinem nächsten Zyklus. Eine andere Adresse ersetzt die Quelle; die Frames, die bei der alten noch warteten, werden als übersprungen gezählt. Ein neues Tag, eine neue Warteschlangengröße oder ein neues `keep-latest-output` braucht kein neues Abonnement: Ein neues Tag markiert das nächste Ergebnis.
3. Um die Quelle zu entfernen, schreiben Sie ihre Adresse in `control/unsubscribe/input/address` und schreiben dann auf `control/unsubscribe/execute`. Damit endet der Stream-Modus. Die Eingaben von `control/subscribe` werden auf das gesetzt, was angewendet wurde: Stream-Modus aus, keine Adresse. Das Tag bleibt: Es markiert die Ergebnisse des Readers, nicht die Quelle.

Kann die Einstellungsdatei nicht geschrieben werden, ändert sich nichts. Siehe [In der Einstellungsdatei gespeichert](https://docs.hdvisionsystems.com/de/lumiscan-dmc-reader-de/1.1.0/lumiscan-dmc-reader/reading-codes-on-an-image-stream.html#saving).

Die Methoden antworten:

| Ergebnis | Wann |
| --- | --- |
| `DL_OK` | Erledigt. |
| `DL_INVALID_VALUE` (ctrlX OS), `Rejected` (PC) | `control/subscribe/execute`: Stream-Modus ohne Adresse oder eine Warteschlangengröße außerhalb von `1` bis `64`. `control/unsubscribe/execute`: Die Adresse ist nicht die Quelle, oder es gibt keine Quelle. |
| `DL_CREATION_FAILED` | Die Einstellungsdatei konnte nicht geschrieben werden, zum Beispiel weil sie kein gültiges JSON ist. Nichts hat sich geändert. |

Der Grund für eine Ablehnung wird in das Protokoll der Anwendung geschrieben. Die Namen aller Ergebnisse auf beiden Data Layern sind in [Ergebnisse eines Methodenaufrufs](https://docs.hdvisionsystems.com/de/lumiscan-keryx-de/1.0.0/status-codes.html#method-results) aufgeführt.

Kann die Quelle nicht abonniert werden, versucht der Reader es alle 5 Sekunden erneut, solange der Stream läuft, und protokolliert den ersten Fehlschlag.

## Das Ergebnis eines Frames {#result}

`control/subscribe/output/stream/result` enthält eine FlatBuffers-Tabelle vom Typ `stream_codes` (Dateikennung `HSCD`), auf dem Data Layer registriert als `types/hdvisionsystems/lumiscan-dmc-reader/stream_codes`. Ihr kompiliertes Schema wird als `bfbs/stream_codes.bfbs` installiert.

| Feld | Bedeutung |
| --- | --- |
| `lineage` | Woher das Ergebnis stammt, siehe [Die Lineage eines Ergebnisses](https://docs.hdvisionsystems.com/de/lumiscan-dmc-reader-de/1.1.0/lumiscan-dmc-reader/reading-codes-on-an-image-stream.html#lineage). |
| `result` | Die Codes, als `CodeDetectResultArray`: dieselbe Tabelle, die `execute` für dasselbe Bild in `output/results` schreibt, beschrieben in [Das Ergebnis](https://docs.hdvisionsystems.com/de/lumiscan-dmc-reader-de/1.1.0/lumiscan-dmc-reader/the-result.html). Ein Frame ohne Data-Matrix-Code ergibt ein leeres Array `results`. |

Ein Lesen von `control/subscribe/output/stream/result` liefert das neueste Ergebnis; vor dem ersten Frame ein leeres. Das letzte Ergebnis bleibt erhalten, nachdem der Stream gestoppt wurde.

Ein Frame wird so dekodiert, wie `execute` den Bildknoten dekodiert; es werden also dieselben Pixelformate akzeptiert, siehe [Voraussetzungen](https://docs.hdvisionsystems.com/de/lumiscan-dmc-reader-de/1.1.0/lumiscan-dmc-reader/requirements.html). Der ganze Frame wird durchsucht. Ein Frame und dasselbe Bild, über `input/image-address` gelesen, ergeben dieselben Codes.

Ein Frame, der nicht gelesen werden kann – zum Beispiel einer in einem Pixelformat, das der Reader nicht unterstützt, oder einer, dessen Pixel die angegebene Größe nicht ausfüllen – ergibt kein Ergebnis. Er wird in `statistics/failed-frames` gezählt, und `control/subscribe/output/stream/last-failure` sagt, warum.

## Die Lineage eines Ergebnisses {#lineage}

`lineage.steps` listet auf, woher das Ergebnis stammt, der Ursprung zuerst:

1. Der Schritt der Kamera, wie der Cam Driver ihn erzeugt hat: `producer` ist die Adresse der Kamera, `hdvisionsystems/lumiscan-cam-driver/<camera name>`; `run`, wann der Stream der Kamera gestartet wurde; `sequence` die Nummer des Frames in diesem Lauf; `external_id` die eigene Bildnummer der Kamera; `settings_hash` die Einstellungen der Kamera; `tag` das Tag des Cam Driver für die Kamera, standardmäßig ihre Modul-ID, zum Beispiel `camera1`.
2. Der Schritt des Readers: `producer` ist die Adresse des Readers, `hdvisionsystems/lumiscan-dmc-reader`; `run`, wann der Stream des Readers gestartet wurde (jeder Start ist ein neuer Lauf); `sequence` die Nummer des Ergebnisses im Lauf, ab `1`; `settings_hash` die Einstellungen des Readers, siehe [Der Einstellungs-Hash](https://docs.hdvisionsystems.com/de/lumiscan-dmc-reader-de/1.1.0/lumiscan-dmc-reader/reading-codes-on-an-image-stream.html#settings-hash); `elapsed_us` die Mikrosekunden vom Eintreffen des Frames beim Reader bis zu seinem Ergebnis, Wartezeit eingeschlossen; `time_us`, wann das Ergebnis erzeugt wurde, in Mikrosekunden seit der Epoche; `tag` das Tag des Readers, `control/subscribe/input/tag`, oder `lumiscan-dmc-reader`, wenn es leer ist.

Ein Ergebnis benennt seinen Frame also genau: die Kamera über `producer`, den Frame über `run` und `sequence`. Um zu erfahren, von welcher Kamera ein Ergebnis stammt, lesen Sie den `producer` seines ersten Schritts. Eine Lücke in der `sequence` des Kameraschritts zwischen zwei Ergebnissen derselben Kamera sind Frames, die übersprungen wurden, fehlgeschlagen sind oder verloren gingen.

Eine Lineage enthält höchstens 16 Schritte. Eine längere behält den Ursprung und die neuesten Schritte, und `dropped` zählt die ausgelassenen Schritte.

Ein Frame ohne Lineage ergibt ein Ergebnis nur mit dem Schritt des Readers. Ein Wert auf dem Knoten `frame` eines Streams, der kein `stream_image` ist, wird ignoriert und einmalig protokolliert.

## Der Einstellungs-Hash {#settings-hash}

`setting/settings-hash` und der `settings_hash` des Reader-Schritts in jedem Ergebnis identifizieren, womit die Ergebnisse erzeugt werden. Der Knoten zeigt den Hash als 16 Hexadezimalziffern; der Schritt enthält denselben Wert als Zahl.

Der Reader hat keine Einstellung, die einen Lesevorgang verändert; der Hash umfasst daher nur den Codetyp sowie Name und Version der Anwendung: Er ändert sich, wenn die Anwendung aktualisiert wird. Er umfasst nicht den Stream-Modus, die Quelle, die Warteschlangengröße oder keep-latest-output, die die Frames auswählen und takten.

Wenn ein Hash zum ersten Mal auftritt, schreibt der Reader die Einstellungen, für die er steht, nach `settings-history/dmc-reader-<hash>.json` im Konfigurationsverzeichnis der Anwendung, sodass ein in einem Ergebnis gefundener Hash später nachgeschlagen werden kann. Die Anwendung löscht diese Dateien nicht. Eine Datei sieht so aus:

```json
{
    "format": 1,
    "settings": {
        "code-type": "datamatrix-code",
        "software.name": "lumiscan-dmc-reader",
        "software.version": "<version>"
    },
    "settingsHash": "<16 hex digits>"
}
```

## Die Statistik lesen {#statistics}

Die Zähler beginnen bei jedem Start des Streams bei null, werden etwa viermal pro Sekunde aktualisiert, solange er läuft, und behalten ihre letzten Werte, nachdem er gestoppt wurde. Alle Adressen beginnen mit `control/subscribe/output/stream/statistics/`.

| Zähler | Bedeutung |
| --- | --- |
| `elapsed-ms` | Millisekunden seit dem Start des Streams. Teilen Sie einen Zähler dadurch, um eine Rate zu erhalten. |
| `received-frames` | Frames, die das Abonnement geliefert hat. |
| `processed-frames` | Gelesene Frames, jeder mit einem auf `control/subscribe/output/stream/result` veröffentlichten Ergebnis. |
| `skipped-frames` | Nie gelesene Frames: von neueren aus der Warteschlange verdrängt, während ein Frame gelesen wurde (siehe [Die Warteschlangengröße](https://docs.hdvisionsystems.com/de/lumiscan-dmc-reader-de/1.1.0/lumiscan-dmc-reader/reading-codes-on-an-image-stream.html#queue-size)), oder wartend, als die Quelle ersetzt oder entfernt wurde. |
| `failed-frames` | Frames, die nicht gelesen werden konnten. `control/subscribe/output/stream/last-failure` sagt, warum der letzte fehlgeschlagen ist, und das Protokoll nennt die Fehlschläge, höchstens eine Zeile alle 5 Sekunden. |
| `lost-frames` | Frames, die verloren gingen, bevor sie eintrafen, ermittelt aus Lücken in der `sequence` der Kamera innerhalb eines Laufs ihres Streams. Eine neue Quelle oder ein neuer Lauf des Kamerastreams beginnt die Zählung von vorn. |
| `processing-us` | Mikrosekunden, die alle Lesevorgänge zusammen gedauert haben. Teilen Sie durch `processed-frames` für den Mittelwert. |

Frames, die beim Stoppen des Streams noch warten, werden verworfen, ohne gezählt zu werden.

## In der Einstellungsdatei gespeichert {#saving}

Der Stream-Modus und die Quelle sind Einstellungen des Readers. Sie werden im Member `stream` der Einstellungsdatei des Readers gespeichert, `dmc-reader.json` im Konfigurationsverzeichnis der Anwendung.

`control/subscribe/execute` und `control/unsubscribe/execute` speichern dort selbst, was sie anwenden, alle fünf Werte in einem Schreibvorgang, bevor sie sie anwenden. Kann die Datei nicht geschrieben werden, antwortet die Methode mit `DL_CREATION_FAILED`, und nichts ändert sich. Nach einem Neustart abonniert der Reader dieselbe Quelle und startet, wenn `stream.enable` `true` ist, seinen Stream sofort: Niemand muss etwas ausführen.

Das Speichern ändert nur den Member `stream`; der Rest der Datei bleibt, wie er war, Kommentare eingeschlossen. Der Reader legt die Datei an, wenn es keine gibt.

Das Konfigurationsverzeichnis:

| Plattform | Konfigurationsverzeichnis |
| --- | --- |
| ctrlX OS | `/var/snap/rexroth-solutions/common/solutions/activeConfiguration/lumiscan-dmc-reader` |
| PC (Windows) | `%APP_RESOURCE_DIR%\etc\lumiscan-dmc-reader`; ohne `APP_RESOURCE_DIR` `C:\ProgramData\HD Vision Systems GmbH\LumiScan Vision Suite\lumiscan-dmc-reader\etc\lumiscan-dmc-reader` |

Die Datei enthält einen Member, `stream`. Ein Beispiel; auf einem PC ist es das Beispiel, das die Anwendung mit `--generate-settings` schreibt, siehe [Mit einem Beispiel beginnen](https://docs.hdvisionsystems.com/de/lumiscan-dmc-reader-de/1.1.0/lumiscan-dmc-reader/reading-codes-on-an-image-stream.html#generate-settings):

```json
{
    // The settings of the DMC Reader, read once, at the start: the image stream it reads codes in.
    // control/subscribe/execute and control/unsubscribe/execute save what they change here before
    // they apply it, the rest of the file left as it is, comments included.
    "$schema": "schemas/dmc-reader.schema.json",
    "stream": {
        // Stream mode: read every frame of the source as it arrives. Off if left out.
        "enable": false,
        // The one image stream to read: its folder.
        "address": "hdvisionsystems/lumiscan-cam-driver/camera1/control/publish/output/stream",
        // "tag" (left out here): what marks the codes it reads, in their lineage - the reader's name,
        // lumiscan-dmc-reader, if left out.
        // How many frames may wait while a frame is read: 1 to 64, 1 if left out.
        "queueSize": 1,
        // Each stream result also on output/results, as execute writes it. Off if left out.
        "keepLatestOutput": false
    }
}
```

| Schlüssel | Erforderlich | Bedeutung |
| --- | --- | --- |
| `enable` | Nein | Stream-Modus: `true` startet den Stream beim Start der Anwendung. Benötigt eine `address`. `false`, wenn weggelassen. |
| `address` | Nein | Die eine Quelle: der Stream-Ordner einer Kamera. |
| `tag` | Nein | Was die Ergebnisse des Readers markiert: das `tag` des Reader-Schritts in ihrer Lineage. Der Name des Readers, `lumiscan-dmc-reader`, wenn weggelassen. |
| `queueSize` | Nein | Wie viele Frames warten dürfen: `1` bis `64`, `1`, wenn weggelassen. |
| `keepLatestOutput` | Nein | `true`, um jedes Stream-Ergebnis zusätzlich in `output/results` zu schreiben. `false`, wenn weggelassen. |
| `onEntry` | Nein | Die Schritte, die auf jeden eintreffenden Frame angewendet werden, jeder ein Objekt mit einem `kind`, wie sie der `stream` jeder LumiScan-Anwendung hat. Diese Anwendung hat noch keine: Lassen Sie ihn weg oder leer (`[]`). Ein Schritt startet den Reader außerhalb des Stream-Modus, mit einer Warnung im Protokoll; beim Speichern bleibt er erhalten. |

`control/subscribe/execute` und `control/unsubscribe/execute` schreiben alle fünf.

Gut zu wissen:

- Die Datei wird einmal gelesen, beim Start der Anwendung. Von Hand an der Datei vorgenommene Änderungen wirken beim nächsten Start.
- Ein Wert, der nicht verwendet werden kann, wird ignoriert und protokolliert: ein `enable` oder `keepLatestOutput`, das nicht `true` oder `false` ist, eine `address` oder ein `tag`, das kein String ist, eine `queueSize` außerhalb von `1` bis `64` (`1` wird verwendet). Stream-Modus ohne `address` wird ignoriert: Der Reader startet außerhalb des Stream-Modus.
- Der Member `subscriptions` früherer Versionen wird nicht mehr gelesen, und der Reader protokolliert, dass er umgezogen ist: Geben Sie die Quelle als `address` an.
- Eine Datei, die kein gültiges JSON ist, wird ignoriert und protokolliert.

## Die Warteschlangengröße {#queue-size}

`control/subscribe/input/queue-size` legt fest, wie viele Frames warten dürfen, während ein Frame gelesen wird: `1` bis `64`, standardmäßig `1`. Sie wird als `stream.queueSize` gespeichert, und `setting/stream/queue-size` zeigt den verwendeten Wert an. Ein Frame, der eintrifft, wenn so viele warten, verdrängt den ältesten von ihnen, was in `statistics/skipped-frames` gezählt wird. Eine neue Warteschlangengröße gilt ab dem nächsten eintreffenden Frame, ohne neues Abonnement.

| Warteschlangengröße | Wirkung |
| --- | --- |
| 1 (Standard) | Der Reader liest den neuesten Frame. Er fällt nie zurück; ist das Lesen langsamer als die Kamera, überspringt er Frames. |
| Mehr als 1 | Kurze Frame-Schübe werden vollständig gelesen, und weniger Frames werden übersprungen. Ist das Lesen über längere Zeit langsamer als die Kamera, fällt der Reader zurück: Er liest Frames, die bis zu so viele Lesevorgänge alt sind. Jeder wartende Frame hält ein ganzes Bild im Speicher. |

## Das neueste Ergebnis behalten {#keep-latest-output}

Mit `control/subscribe/input/keep-latest-output` `true` – angewendet von `control/subscribe/execute`, gespeichert als `stream.keepLatestOutput` – schreibt der Reader jedes Stream-Ergebnis zusätzlich in `output/results`, so wie `execute` es schreibt, sobald das Ergebnis auf `control/subscribe/output/stream/result` veröffentlicht ist. Ein Client, der `output/results` liest, hat dann das Ergebnis des neuesten Frames, ohne den Stream zu abonnieren. Das kostet eine Kopie jedes Ergebnisses. Standardmäßig aus.

## execute, während der Stream läuft {#while-streaming}

`execute` und der Stream behindern sich nicht. Jeder Frame wird von einem eigenen Detektor gelesen, wie auch jeder Aufruf von `execute`, und nichts wird zwischen beiden geteilt: `execute` kann jederzeit aufgerufen werden, während der Stream läuft, und ein Frame wartet nie darauf.

## Einschränkungen {#limitations}

- `input/parameter` wird weder von `execute` noch vom Stream gelesen.
- Der Stream wurde nur unter Windows mit LumiScan Keryx und simulierten Bildern getestet. Er wurde nicht unter Linux (ctrlX OS oder Ubuntu), auf dem ctrlX Data Layer oder mit einer echten Kamera geprüft.
- LumiScan Cockpit zeichnet die Ergebnisse des Streams noch nicht.
- Von Hand an der Einstellungsdatei vorgenommene Änderungen wirken beim nächsten Start der Anwendung.

## Mit einem Beispiel beginnen (PC) {#generate-settings}

Auf einem PC schreibt der DMC Reader ein Beispiel seiner Einstellungen in einen Ordner Ihrer Wahl und beendet sich, ohne zu starten. Unter Windows zum Beispiel:

```shell
lumiscan-dmc-reader --generate-settings C:\work\dmc-reader-settings
```

Ohne Ordner (`-g` allein) schreibt er in den aktuellen Ordner. Das Beispiel ist die Einstellungsdatei `dmc-reader.json`: Stream-Modus aus, der Stream der `camera1` des Cam Driver als Quelle, die Warteschlangengröße, die er standardmäßig hat, und `keep-latest-output` aus. Daneben liegen in `schemas/` das Schema, das sie in `"$schema"` nennt, `dmc-reader.schema.json`, und `stream.schema.json`, das den Abschnitt `stream` beschreibt; ein Editor, der JSON Schema versteht, kann die Datei dagegen prüfen. Kopieren Sie den Ordner `schemas` zusammen mit der Datei. Vorhandene Dateien werden nie überschrieben: Liegt eine davon bereits im Ordner, wird nichts geschrieben, und der DMC Reader sagt, welche.

Der DMC Reader nennt dann den Ordner, aus dem er seine Einstellungen liest, unter Windows standardmäßig `C:\ProgramData\HD Vision Systems GmbH\LumiScan Vision Suite\lumiscan-dmc-reader\etc\lumiscan-dmc-reader`. Bearbeiten Sie das Beispiel, kopieren Sie es dorthin, und starten Sie den DMC Reader.

# Data-Layer-Referenz – LumiScan DMC Reader

URL: https://docs.hdvisionsystems.com/de/lumiscan-dmc-reader-de/1.1.0/lumiscan-dmc-reader/datalayer-reference.html

Alle Knoten liegen unter dem Basispfad der Anwendung:

```
hdvisionsystems/lumiscan-dmc-reader/
```

Die Pfade unten sind relativ dazu angegeben. Ein einzelner Lesevorgang verwendet vier Knoten; der Bild-Stream (experimentell) fügt die unter [Bild-Stream](https://docs.hdvisionsystems.com/de/lumiscan-dmc-reader-de/1.1.0/lumiscan-dmc-reader/datalayer-reference.html#stream) aufgeführten Knoten hinzu, und [System](https://docs.hdvisionsystems.com/de/lumiscan-dmc-reader-de/1.1.0/lumiscan-dmc-reader/datalayer-reference.html#system) sagt, was seine Quelle enthalten muss.

## Data Layer {#data-layer}

LumiScan DMC Reader bietet seine Funktionen auf dem Data Layer unter `hdvisionsystems/lumiscan-dmc-reader` an.

Auf ctrlX OS (ctrlX CORE oder ctrlX IPC) nutzt LumiScan DMC Reader den [ctrlX Data Layer](https://docs.hdvisionsystems.com/de/lumiscan-keryx-de/1.0.0/ctrlx-data-layer.html).

Auf einem PC mit Windows 11 oder Ubuntu 24.04 nutzt LumiScan DMC Reader [LumiScan Keryx](https://docs.hdvisionsystems.com/de/lumiscan-keryx-de/1.0.0/keryx.html).

Knotenadressen, Typen und Aufrufmuster sind auf beiden gleich. LumiScan DMC Reader bietet:

- [Execute-Methoden](https://docs.hdvisionsystems.com/de/lumiscan-keryx-de/1.0.0/execute.html)
- ein [Stream](https://docs.hdvisionsystems.com/de/lumiscan-keryx-de/1.0.0/streams.html)-Abonnement auf eine Quelle (experimentell)
- keine Modulebene: Seine Knoten liegen direkt unter `hdvisionsystems/lumiscan-dmc-reader`

Wie Adressen aufgebaut sind, wie Funktionen aufgerufen werden, die Statuscodes und die Werkzeuge sind in [LumiScan Keryx](https://docs.hdvisionsystems.com/de/lumiscan-keryx-de/1.0.0/index.html) beschrieben.

## Knotenbaum

```
hdvisionsystems/lumiscan-dmc-reader/
├── input/
│   ├── image-address        (string)      address of the image node to read
│   └── parameter            (flatbuffers) detection parameters
├── execute                  (method)      read every Data Matrix code in that image
├── output/
│   └── results              (flatbuffers) one entry per code found
├── control/
│   ├── subscribe/                         the image stream (experimental)
│   │   ├── execute
│   │   ├── input/{enable,address,tag,queue-size,keep-latest-output}
│   │   └── output/stream/...              the image stream's results
│   └── unsubscribe/{execute,input/address}
├── setting/{stream,settings-hash}
└── system/meta/subscription-schema    (string)      what the stream's source must hold
```

## Eingabe

| Knoten | Typ | Zugriff | Beschreibung |
| --- | --- | --- | --- |
| `input/image-address` | string | lesen, schreiben | Adresse des zu lesenden Data-Layer-Bildknotens. Der Reader hängt `/data`, `/width`, `/height` und `/pixel-type` an. Standardmäßig leer, wodurch ein Lauf fehlschlägt, bis sie gesetzt ist. |
| `input/parameter` | flatbuffers | lesen, schreiben | Erkennungsparameter, Typ `types/hdvisionsystems/lumiscan-dmc-reader/code_detect_parameters`. Siehe den Hinweis unten. |

> [!NOTE]
> `input/parameter` enthält in dieser Version **keine Einstellungen** – seine Tabelle `DetectionParameters` ist leer. Der Knoten existiert, damit Feinabstimmungen ergänzt werden können, ohne den Knotenbaum zu ändern. Ein Schreibvorgang darauf ändert nichts daran, wie ein Code gelesen wird. Auch der Bild-Stream liest ihn nicht.

## Methode

| Knoten | Blockierend | Wirkung |
| --- | --- | --- |
| `execute` | Ja | Liest das Bild unter `input/image-address` und schreibt jeden gefundenen Data-Matrix-Code in `output/results`. Nimmt kein Argument entgegen – schreiben Sie einen leeren Wert. |

## Ausgabe

| Knoten | Typ | Zugriff | Beschreibung |
| --- | --- | --- | --- |
| `output/results` | flatbuffers | lesen | Jeder Code, den der letzte erfolgreiche Lauf gefunden hat, Typ `types/hdvisionsystems/lumiscan-dmc-reader/code_detect_result`. Leeres Array, wenn das Bild keinen Code enthielt. Siehe [Das Ergebnis](https://docs.hdvisionsystems.com/de/lumiscan-dmc-reader-de/1.1.0/lumiscan-dmc-reader/the-result.html). |

## Bild-Stream (experimentell) {#stream}

Der Reader liest jeden Frame des Cam-Driver-Streams, den er abonniert, so wie `execute` ein Bild liest, und veröffentlicht ein Ergebnis pro Frame. Siehe [Codes auf einem Bild-Stream lesen](https://docs.hdvisionsystems.com/de/lumiscan-dmc-reader-de/1.1.0/lumiscan-dmc-reader/reading-codes-on-an-image-stream.html).

| Knoten | Typ | Zugriff | Beschreibung |
| --- | --- | --- | --- |
| `control/subscribe/input/enable` | bool | lesen, schreiben | Stream-Modus: `true` lässt den Stream laufen, `false` stoppt ihn. |
| `control/subscribe/input/address` | string | lesen, schreiben | Die eine Quelle: der Stream-Ordner einer Kamera, zum Beispiel `hdvisionsystems/lumiscan-cam-driver/camera1/control/publish/output/stream`. Eine andere Adresse ersetzt sie. |
| `control/subscribe/input/tag` | string | lesen, schreiben | Das Tag auf den Ergebnissen des Readers: Der Schritt des Readers in der Lineage jedes Stream-Ergebnisses trägt es. Leer: der Name des Readers, `lumiscan-dmc-reader`. Ein neues Tag behält die Quelle; das nächste Ergebnis trägt es. |
| `control/subscribe/input/queue-size` | uint32 | lesen, schreiben | Wie viele Frames warten dürfen, während ein Frame gelesen wird, 1 bis 64. |
| `control/subscribe/input/keep-latest-output` | bool | lesen, schreiben | `true`, um jedes Stream-Ergebnis zusätzlich in `output/results` zu schreiben. |
| `control/unsubscribe/input/address` | string | lesen, schreiben | Die zu entfernende Quelle, so wie `setting/stream/address` sie anzeigt. |
| `setting/stream/enable`, `address`, `tag`, `queue-size`, `keep-latest-output` | wie die Eingaben | lesen | Was `control/subscribe/execute` oder `control/unsubscribe/execute` zuletzt angewendet hat, so wie `dmc-reader.json` es unter `stream` speichert. |
| `setting/settings-hash` | string | lesen | Der Hash dessen, womit die Ergebnisse erzeugt werden, als 16 Hexadezimalziffern. |
| `control/subscribe/output/stream/active` | bool | lesen | `true`, solange der Stream läuft. |
| `control/subscribe/output/stream/result` | flatbuffers | lesen | Ein Ergebnis pro gelesenem Frame, Typ `types/hdvisionsystems/lumiscan-dmc-reader/stream_codes`: die `lineage` des Frames und `result`, die Tabelle, die auch `output/results` enthält. Abonnieren Sie den Knoten, um jedes Ergebnis zu erhalten. |
| `control/subscribe/output/stream/last-failure` | string | lesen | Warum der letzte Frame, der nicht gelesen werden konnte, fehlgeschlagen ist; nennt die Quelle über ihre Adresse. |
| `control/subscribe/output/stream/statistics/elapsed-ms`, `received-frames`, `processed-frames`, `skipped-frames`, `failed-frames`, `lost-frames`, `processing-us` | uint64 | lesen | Die Zähler des Streams, siehe [Die Statistik lesen](https://docs.hdvisionsystems.com/de/lumiscan-dmc-reader-de/1.1.0/lumiscan-dmc-reader/reading-codes-on-an-image-stream.html#statistics). |

| Knoten | Blockierend | Wirkung |
| --- | --- | --- |
| `control/subscribe/execute` | Ja | Prüft die Eingaben von `control/subscribe` gemeinsam, speichert sie in `dmc-reader.json` und wendet sie dann an. Eine Eingabe allein zu schreiben ändert nichts. Wird abgelehnt bei Stream-Modus ohne Adresse oder bei einer Warteschlangengröße außerhalb von 1 bis 64. |
| `control/unsubscribe/execute` | Ja | Entfernt die von `control/unsubscribe/input/address` genannte Quelle, womit der Stream-Modus endet; das Tag bleibt. Wird wie ein Subscribe in `dmc-reader.json` gespeichert. Wird abgelehnt, wenn die Adresse nicht die Quelle ist. |

Die Eingaben von `control/subscribe` sind mit den angewendeten Werten vorbelegt, und nur `control/subscribe/execute` wendet sie an. Kann `dmc-reader.json` nicht geschrieben werden, antworten beide Methoden mit `DL_CREATION_FAILED` und ändern nichts. Die Ergebnisse eines Methodenaufrufs auf jedem Data Layer sind in [Ergebnisse eines Methodenaufrufs](https://docs.hdvisionsystems.com/de/lumiscan-keryx-de/1.0.0/status-codes.html#method-results) aufgeführt.

## System (experimentell) {#system}

| Knoten | Typ | Zugriff | Beschreibung |
| --- | --- | --- | --- |
| `system/meta/subscription-schema` | string | lesen | Was der Knoten enthalten muss, den der Reader abonniert: ein JSON Schema (draft-04) seiner JSON-Form. Hier der Knoten `frame` des abonnierten Stream-Ordners, ein `stream_image`: ein Objekt mit `lineage` und `image`. Experimentell. |

## In dieser Version nicht vorhanden

Wer von den anderen LumiScan-Anwendungen kommt, sollte wissen, was diese **nicht** veröffentlicht:

- **Kein Statusknoten.** Es gibt weder `status-code` noch `status-text`; ein fehlgeschlagener Lauf wird nur im Protokoll der Anwendung gemeldet und lässt in `output/results` die Codes des vorherigen Laufs stehen.
- **Keine Datenkennung.** Es gibt nichts, was zurückgegeben wird; ein Ergebnis lässt sich daher nicht dem Request zuordnen, der es erzeugt hat.
- **Kein Ergebnisbild.** Die Anwendung rendert nichts – keinen Knoten `result-image` und keine Methode `plot`. Verwenden Sie LumiScan Cockpit, um die Codes im Bild eingezeichnet zu sehen.
- **Keine Module.** Ein Reader pro Installation, unter dem einen Basispfad oben.
- **Keine Region of Interest.** Jeder Lauf durchsucht das gesamte Bild.

# FAQ – LumiScan DMC Reader

URL: https://docs.hdvisionsystems.com/de/lumiscan-dmc-reader-de/1.1.0/faq.html

Kurze Antworten auf häufige Fragen und Fehlermeldungen zu LumiScan DMC Reader. Jeder Eintrag verweist auf die Seite mit den Details.

> [!TIP]
> Durchsuchen Sie diese Seite nach der genauen Fehlermeldung. Jeder Eintrag hat einen festen Anker (zum Beispiel `#faq-failed-run`).

## Voraussetzungen und Einrichtung

### Läuft der Reader auf ctrlX OS und auf einem PC? {#faq-platforms}

- **Antwort:** Ja. Auf ctrlX OS (ctrlX CORE oder ctrlX IPC) verwendet er den ctrlX Data Layer; auf einem PC (Windows 11 oder Ubuntu 24.04) verwendet er LumiScan Keryx, den Data Layer von HD Vision Systems für PCs. Die Knotenadressen, Typen und das Verhalten sind auf beiden gleich; ein Programm, das für den einen geschrieben wurde, funktioniert also auch mit dem anderen.
- **Mehr:** [Data-Layer-Referenz](https://docs.hdvisionsystems.com/de/lumiscan-dmc-reader-de/1.1.0/lumiscan-dmc-reader/datalayer-reference.html), [ctrlX Data Layer und LumiScan Keryx](https://docs.hdvisionsystems.com/de/lumiscan-keryx-de/1.0.0/platforms.html)

### Welche Codes liest der Reader? {#faq-what-codes}

- **Antwort:** Er liest ECC 200 Data-Matrix-Codes, den Standard mit quadratischen Modulen, der für die Teilekennzeichnung und die Direktmarkierung (Direct Part Marking) verwendet wird. Jeder im Bild gefundene Code wird gemeldet; es gibt keine Begrenzung auf einen Code pro Lauf. Es sind weder Vorlage, Referenzbild, Trainingsschritt noch Konfiguration nötig: Sie geben dem Reader die Adresse eines Bildes und rufen `execute` auf.
- **Mehr:** [Beschreibung](https://docs.hdvisionsystems.com/de/lumiscan-dmc-reader-de/1.1.0/lumiscan-dmc-reader/description.html)

### Welche Bildquelle benötigt der Reader? {#faq-image-source}

- **Antwort:** Der Reader spricht nicht selbst mit einer Kamera. Er liest den in `input/image-address` genannten Bildknoten, den eine andere Anwendung veröffentlicht: auf ctrlX OS eine auf dem **selben Gerät** (der Zugriff auf einen entfernten Data Layer wird nicht unterstützt), auf einem PC eine, die mit **demselben LumiScan Keryx** verbunden ist. Normalerweise ist das LumiScan Cam Driver, zum Beispiel `hdvisionsystems/lumiscan-cam-driver/camera1/output/image`. Der Knoten muss `data` (rohe, unkomprimierte uint8-Pixeldaten), `width`, `height` und `pixel-type` (Name des GenICam-Pixelformats) bereitstellen. Geben Sie die Adresse des Bildknotens selbst an, nicht die seines Kindknotens `data`: Der Reader hängt `/data`, `/width`, `/height` und `/pixel-type` an.
- **Mehr:** [Voraussetzungen](https://docs.hdvisionsystems.com/de/lumiscan-dmc-reader-de/1.1.0/lumiscan-dmc-reader/requirements.html), [Einen Code lesen](https://docs.hdvisionsystems.com/de/lumiscan-dmc-reader-de/1.1.0/lumiscan-dmc-reader/reading-a-code.html)

### Welche Pixelformate werden unterstützt? {#faq-pixel-formats}

- **Antwort:** `Mono8`, `Mono12`, `RGB8`, `RGB12`, `BGR8`, `BGR12`, `Bayer_GR8`, `Bayer_RG8`, `Bayer_GR12` und `Bayer_RG12`. Der Name wird ohne Rücksicht auf Groß- und Kleinschreibung verglichen, und bei den Bayer-Namen darf der Unterstrich entfallen (`BayerGR8` und `bayer_gr8` sind dasselbe Format). Bayer-Bilder werden vor der Suche in Farbbilder umgewandelt. Jedes andere Pixelformat wird abgelehnt, und der Lauf liefert kein Ergebnis. Die Bilddaten müssen für das angegebene Format mindestens `width x height x bytes-per-pixel` Bytes umfassen; ein kürzerer Puffer wird abgelehnt.
- **Mehr:** [Voraussetzungen](https://docs.hdvisionsystems.com/de/lumiscan-dmc-reader-de/1.1.0/lumiscan-dmc-reader/requirements.html)

## Codes lesen

### Wie lese ich einen Code? {#faq-read-code}

- **Antwort:** Alle Pfade sind relativ zu `hdvisionsystems/lumiscan-dmc-reader`.
  - Schreiben Sie die Adresse des Bildknotens in `input/image-address`. Sie wird gemerkt; setzen Sie sie also nur neu, wenn sich die Bildquelle ändert.
  - Schreiben Sie einen leeren Wert in die Methode `execute`. Der Aufruf ist blockierend und kehrt zurück, wenn die Suche abgeschlossen ist.
  - Lesen Sie `output/results`: Der Knoten enthält jeden Data-Matrix-Code, der in diesem Bild gefunden wurde.
- **Mehr:** [Einen Code lesen](https://docs.hdvisionsystems.com/de/lumiscan-dmc-reader-de/1.1.0/lumiscan-dmc-reader/reading-a-code.html)

### Was enthält ein Ergebniseintrag? {#faq-result-fields}

- **Antwort:** `output/results` ist ein FlatBuffer (`CodeDetectResultArray.results`) mit einem Eintrag pro Code: `center` (ein `Point2f` mit `x` und `y` in Bildpixeln), `text` (der dekodierte Inhalt), `score` (wie sicher das Leseergebnis ist) und `polygons` (die Eckpunkte, die den Code umreißen). Auf ctrlX OS kommen die Zahlen über die ctrlX REST API in Anführungszeichen zurück, als Strings; parsen Sie sie daher als Zahlen. `center` und `text` sind immer vorhanden; `polygons` kann bei einem Eintrag fehlen, was „kein Umriss angegeben“ bedeutet und kein Fehler ist.
- **Mehr:** [Das Ergebnis](https://docs.hdvisionsystems.com/de/lumiscan-dmc-reader-de/1.1.0/lumiscan-dmc-reader/the-result.html)

### Woran erkenne ich, dass ein Lauf fehlgeschlagen ist? Es gibt keinen Knoten `status-code`. {#faq-failed-run}

- **Ursache:** Dieser Reader veröffentlicht keinen Knoten `status-code` oder `status-text` und gibt keine Kennung zurück. Ein Lauf schlägt fehl, wenn das Bild nicht gelesen werden kann: keine Adresse gesetzt, eine Adresse, die sich nicht auflösen lässt, ein fehlender oder zu kurzer `data`-Puffer oder ein nicht unterstütztes Pixelformat. Ein fehlgeschlagener Lauf lässt `output/results` unverändert; der Knoten enthält weiterhin die Codes des vorherigen Laufs.
- **Lösung:** Prüfen Sie das Protokoll der Anwendung (auf ctrlX OS das Systemprotokoll), in das der Grund geschrieben wird, oder lesen Sie `output/results` vor und nach dem Lauf und vergleichen Sie.
- **Mehr:** [Einen Code lesen](https://docs.hdvisionsystems.com/de/lumiscan-dmc-reader-de/1.1.0/lumiscan-dmc-reader/reading-a-code.html), [Data-Layer-Referenz](https://docs.hdvisionsystems.com/de/lumiscan-dmc-reader-de/1.1.0/lumiscan-dmc-reader/datalayer-reference.html)

### Kann ich die Erkennung abstimmen, eine Region of Interest setzen oder Module anlegen? {#faq-no-settings}

- **Antwort:** Nein, nicht in dieser Version. `input/parameter` enthält keine Einstellungen (seine Tabelle `DetectionParameters` ist leer), ein Schreibvorgang darauf ändert also nichts; auch der Bild-Stream liest ihn nicht. Es gibt keine Region of Interest: Jeder Lauf durchsucht das gesamte Bild. Es gibt keine Module: ein Reader pro Installation, unter einem einzigen Basispfad. Es gibt auch kein Ergebnisbild; verwenden Sie LumiScan Cockpit, um die Codes zu sehen.
- **Mehr:** [Data-Layer-Referenz](https://docs.hdvisionsystems.com/de/lumiscan-dmc-reader-de/1.1.0/lumiscan-dmc-reader/datalayer-reference.html)

### Wie kann ich die Codes im Bild eingezeichnet sehen? {#faq-see-results}

- **Antwort:** Öffnen Sie LumiScan Cockpit. Es führt den Reader als Ansicht mit dem Namen `datamatrix-code` und zeichnet um jeden Code ein Rechteck, beschriftet mit dem dekodierten Text und dem Score. Ein Code, der lokalisiert, aber nicht dekodiert wurde, hat keinen Text und wird nur mit seinem Score beschriftet.
- **Mehr:** [Das Ergebnis](https://docs.hdvisionsystems.com/de/lumiscan-dmc-reader-de/1.1.0/lumiscan-dmc-reader/the-result.html)

### Wie lange dauert ein Lesevorgang? {#faq-timing}

- **Antwort:** Das Lesen ist synchron: Der Schreibvorgang auf `execute` kehrt zurück, wenn die Suche abgeschlossen ist. Wie lange das dauert, hängt von der Bildgröße ab, da bei jedem Lauf das gesamte Bild durchsucht wird.
- **Mehr:** [Voraussetzungen](https://docs.hdvisionsystems.com/de/lumiscan-dmc-reader-de/1.1.0/lumiscan-dmc-reader/requirements.html)

## Bild-Stream (experimentell)

### Kann der Reader jeden Frame eines Kamerastreams lesen? {#faq-image-stream}

- **Antwort:** Ja, als experimentelle Funktion. Der Reader abonniert den Stream einer Kamera von LumiScan Cam Driver und liest jeden Data-Matrix-Code in jedem Frame, sobald er eintrifft, genau so, wie `execute` ein Bild liest. Alle Pfade sind relativ zu `hdvisionsystems/lumiscan-dmc-reader`.
  - Schreiben Sie den Stream-Ordner der Kamera, zum Beispiel `hdvisionsystems/lumiscan-cam-driver/camera1/control/publish/output/stream`, in `control/subscribe/input/address`.
  - Abonnieren Sie `control/subscribe/output/stream/result`: ein Ergebnis pro Frame, mit der Lineage des Frames.
  - Setzen Sie `control/subscribe/input/enable` auf `true` und schreiben Sie auf `control/subscribe/execute`. Eine Eingabe allein zu schreiben ändert nichts.
- **Mehr:** [Codes auf einem Bild-Stream lesen](https://docs.hdvisionsystems.com/de/lumiscan-dmc-reader-de/1.1.0/lumiscan-dmc-reader/reading-codes-on-an-image-stream.html), [Streams](https://docs.hdvisionsystems.com/de/lumiscan-keryx-de/1.0.0/streams.html)

### Wo speichert der Reader seine Stream-Einstellungen? {#faq-settings-file}

- **Antwort:** In `dmc-reader.json` im Konfigurationsverzeichnis der Anwendung: auf ctrlX OS `/var/snap/rexroth-solutions/common/solutions/activeConfiguration/lumiscan-dmc-reader`, unter Windows `C:\ProgramData\HD Vision Systems GmbH\LumiScan Vision Suite\lumiscan-dmc-reader\etc\lumiscan-dmc-reader` (oder `%APP_RESOURCE_DIR%\etc\lumiscan-dmc-reader`). `control/subscribe/execute` und `control/unsubscribe/execute` speichern dort, was sie anwenden, und nach einem Neustart streamt ein Reader, der gestreamt hat, sofort wieder. Auf einem PC schreibt `lumiscan-dmc-reader --generate-settings <folder>` ein Beispiel als Ausgangspunkt.
- **Mehr:** [In der Einstellungsdatei gespeichert](https://docs.hdvisionsystems.com/de/lumiscan-dmc-reader-de/1.1.0/lumiscan-dmc-reader/reading-codes-on-an-image-stream.html#saving)

## Fehlerbehebung {#troubleshooting}

Probleme und Fehlermeldungen sind Schritt für Schritt unter [Fehlerbehebung](https://docs.hdvisionsystems.com/de/lumiscan-dmc-reader-de/1.1.0/troubleshooting.html) beschrieben:

- [Der Reader beendet sich beim Start](https://docs.hdvisionsystems.com/de/lumiscan-dmc-reader-de/1.1.0/troubleshooting.html#faq-app-stops-after-start)
- [`output/results` ist ein leeres Array](https://docs.hdvisionsystems.com/de/lumiscan-dmc-reader-de/1.1.0/troubleshooting.html#faq-empty-result)
- [`control/subscribe/execute` wird abgelehnt](https://docs.hdvisionsystems.com/de/lumiscan-dmc-reader-de/1.1.0/troubleshooting.html#faq-stream-refused)
- [Der Stream läuft, aber es treffen keine Ergebnisse ein, oder `failed-frames` steigt](https://docs.hdvisionsystems.com/de/lumiscan-dmc-reader-de/1.1.0/troubleshooting.html#ts-stream-no-results)
- [Nach einem Neustart streamt der Reader von selbst wieder](https://docs.hdvisionsystems.com/de/lumiscan-dmc-reader-de/1.1.0/troubleshooting.html#ts-stream-restart)

## Lizenzierung und Support

### Standard- oder Advanced-Lizenz - welche verwendet der Reader? {#faq-standard-advanced}

- **Antwort:** Ist eine Advanced-Lizenz verfügbar, verwendet die Anwendung sie automatisch. Ist keine verfügbar, läuft sie mit den Standard-Funktionen, statt den Start zu verweigern.
- **Mehr:** [Voraussetzungen](https://docs.hdvisionsystems.com/de/lumiscan-dmc-reader-de/1.1.0/lumiscan-dmc-reader/requirements.html#licence), [FAQ zur Lizenzierung](https://docs.hdvisionsystems.com/de/lumiscan-licensing-de/1.0.4/faq.html)

### Welche Lizenz benötige ich? {#faq-licence}

- **Antwort:** Ein Lizenzplatz deckt den Reader ab, da es einen Reader pro Installation gibt. Bezugswege:
  - Bei HD Vision Systems gekauft: Die Lizenz liegt auf einem LumiScan Key (Windows 11 oder Ubuntu 24.04). Pro Gerät, auf dem die Software gleichzeitig läuft, wird ein LumiScan Key benötigt; Keys können zwischen Geräten getauscht werden.
  - Im ctrlX Store für Windows 11 gekauft: ctrlX WORKS plus ein LumiScan Key.
  - Im ctrlX Store für ctrlX OS (ctrlX CORE oder IPC) gekauft: eine ctrlX-Lizenz, kein Key.
- **Mehr:** [Voraussetzungen](https://docs.hdvisionsystems.com/de/lumiscan-dmc-reader-de/1.1.0/lumiscan-dmc-reader/requirements.html#licence), [FAQ zur Lizenzierung](https://docs.hdvisionsystems.com/de/lumiscan-licensing-de/1.0.4/faq.html)

### Wo finde ich weitere Antworten oder Support? {#faq-support}

- **Antwort:** Siehe die [LumiScan-FAQ](https://docs.hdvisionsystems.com/de/faq.html) der gesamten Dokumentation. Wenden Sie sich an den Customer Success von HD Vision Systems unter [customer.success@hdvisionsystems.com](mailto:customer.success@hdvisionsystems.com) oder +49 6221 6721905; bei Lizenzfragen an [licenses@hdvisionsystems.com](mailto:licenses@hdvisionsystems.com).
- **Mehr:** [FAQ zur Lizenzierung](https://docs.hdvisionsystems.com/de/lumiscan-licensing-de/1.0.4/faq.html)

# Fehlerbehebung – LumiScan DMC Reader

URL: https://docs.hdvisionsystems.com/de/lumiscan-dmc-reader-de/1.1.0/troubleshooting.html

Diese Seite beschreibt Probleme mit LumiScan DMC Reader und wie Sie sie lösen. Beginnen Sie mit den [allgemeinen Prüfungen](https://docs.hdvisionsystems.com/de/lumiscan-dmc-reader-de/1.1.0/troubleshooting.html#general-checks), und suchen Sie dann unten Ihr Symptom: Jedes Problem nennt seine Symptome, die möglichen Ursachen, eine Diagnose und die Lösung. Probleme des Data Layer selbst sind unter [Fehlerbehebung Data Layer](https://docs.hdvisionsystems.com/de/lumiscan-keryx-de/1.0.0/troubleshooting.html) beschrieben, Lizenzprobleme unter [Fehlerbehebung Lizenzierung](https://docs.hdvisionsystems.com/de/lumiscan-licensing-de/1.0.4/troubleshooting.html).

## Allgemeine Prüfungen {#general-checks}

1. **Lesen Sie das Protokoll der Anwendung.** Auf ctrlX OS ist das Protokoll der Anwendung das Systemprotokoll. Der Reader schreibt den Grund dorthin, wenn ein Lauf fehlschlägt, wenn `control/subscribe/execute` oder `control/unsubscribe/execute` abgelehnt wird, wenn die Quelle des Bild-Streams nicht abonniert werden kann (der erste Fehlschlag), wenn Frames nicht gelesen werden können (höchstens eine Zeile alle 5 Sekunden) und wenn ein Wert in seiner Einstellungsdatei nicht verwendet werden kann.

2. **Prüfen Sie die Adressen.** Alle Knoten liegen direkt unter `hdvisionsystems/lumiscan-dmc-reader/`; der Reader hat keine Module. Adressen sind kleingeschrieben. Erwartet: Ihre SPS oder Ihr Client verwendet genau diese Adressen, wie in der [Data-Layer-Referenz](https://docs.hdvisionsystems.com/de/lumiscan-dmc-reader-de/1.1.0/lumiscan-dmc-reader/datalayer-reference.html) aufgeführt.

3. **Prüfen Sie die Bildquelle.** Die Anwendung, die den Bildknoten veröffentlicht, normalerweise LumiScan Cam Driver, muss auf **demselben Gerät** laufen (ctrlX OS) oder mit **demselben LumiScan Keryx** verbunden sein wie der Reader (PC). Erwartet: Der in `input/image-address` genannte Knoten stellt `data`, `width`, `height` und `pixel-type` bereit.

4. **Prüfen Sie, ob ein Lauf fehlgeschlagen ist.** Dieser Reader veröffentlicht keinen Knoten `status-code` oder `status-text`. Ein fehlgeschlagener Lauf lässt `output/results` unverändert, mit den Codes des vorherigen Laufs. Lesen Sie `output/results` vor und nach dem Lauf und vergleichen Sie, oder prüfen Sie das Protokoll. Siehe [Woran erkenne ich, dass ein Lauf fehlgeschlagen ist?](https://docs.hdvisionsystems.com/de/lumiscan-dmc-reader-de/1.1.0/faq.html#faq-failed-run).

5. **Prüfen Sie die Einstellungsdatei des Bild-Streams.** Der Reader speichert seine Stream-Einstellungen in `dmc-reader.json` im Konfigurationsverzeichnis der Anwendung:

   | Plattform | Konfigurationsverzeichnis |
   | --- | --- |
   | ctrlX OS | `/var/snap/rexroth-solutions/common/solutions/activeConfiguration/lumiscan-dmc-reader` |
   | PC (Windows) | `%APP_RESOURCE_DIR%\etc\lumiscan-dmc-reader`; ohne `APP_RESOURCE_DIR` `C:\ProgramData\HD Vision Systems GmbH\LumiScan Vision Suite\lumiscan-dmc-reader\etc\lumiscan-dmc-reader` |

   Die Datei wird einmal gelesen, beim Start der Anwendung: Von Hand vorgenommene Änderungen wirken beim nächsten Start. Ein Wert, der nicht verwendet werden kann, wird ignoriert und protokolliert; eine Datei, die kein gültiges JSON ist, wird ignoriert und protokolliert. Siehe [In der Einstellungsdatei gespeichert](https://docs.hdvisionsystems.com/de/lumiscan-dmc-reader-de/1.1.0/lumiscan-dmc-reader/reading-codes-on-an-image-stream.html#saving).

## Problem: Der Reader beendet sich beim Start {#faq-app-stops-after-start}

**Symptome**

Auf ctrlX OS beendet sich der Reader kurz nach dem Start. Seine Knoten unter `hdvisionsystems/lumiscan-dmc-reader` verschwinden aus dem Data Layer.

**Mögliche Ursachen**

- Die ctrlX-Lizenz `SWL-W-XCx-DMxxxCRDSxHDVSx-V1NN` ist auf dem ctrlX-OS-Gerät, auf dem der Reader läuft, nicht verfügbar. Die Lizenz wird beim Start bis zu zehn Sekunden lang geprüft; wird in dieser Zeit keine verfügbar, beendet sich der Reader.

**Diagnose**

1. Öffnen Sie das Systemprotokoll von ctrlX OS - erwartet: der Grund für das Beenden. Das Systemprotokoll nennt die fehlende Lizenz.
2. Prüfen Sie die Lizenzen im License Manager von ctrlX OS - erwartet: Die ctrlX-Lizenz `SWL-W-XCx-DMxxxCRDSxHDVSx-V1NN` ist auf dem Gerät verfügbar, auf dem der Reader läuft. Ein Lizenzplatz deckt den Reader ab. Die Advanced-Lizenz `SWL-W-XCx-DMxxxCRDAxHDVSx-V1NN` wird für den Start nicht benötigt: Ohne sie läuft der Reader mit den Standard-Funktionen.

**Lösung**

- **Wenn die ctrlX-Lizenz fehlt:**

  a. Kaufen Sie die Lizenz `SWL-W-XCx-DMxxxCRDSxHDVSx-V1NN` im ctrlX Store.

  b. Aktivieren Sie sie im License Manager von ctrlX OS auf dem Gerät, auf dem der Reader läuft. Folgen Sie dabei der Dokumentation von Bosch Rexroth für ctrlX OS.

  c. Starten Sie den Reader erneut. Erwartet: Er läuft weiter, und seine Knoten sind im Data Layer.

Siehe [Lizenz](https://docs.hdvisionsystems.com/de/lumiscan-dmc-reader-de/1.1.0/lumiscan-dmc-reader/requirements.html#licence) und [Meine ctrlX-App beendet sich kurz nach dem Start](https://docs.hdvisionsystems.com/de/lumiscan-licensing-de/1.0.4/troubleshooting.html#faq-ctrlx-app-stops).

**Wenn das Problem weiterhin besteht**

Senden Sie die unter [Informationen für den Support](https://docs.hdvisionsystems.com/de/lumiscan-dmc-reader-de/1.1.0/troubleshooting.html#support-information) aufgeführten Informationen an den Support, zusammen mit den Zeilen des Systemprotokolls von ctrlX OS, die die Lizenz nennen. Für Lizenzen wenden Sie sich an [licenses@hdvisionsystems.com](mailto:licenses@hdvisionsystems.com).

## Problem: `output/results` ist ein leeres Array {#faq-empty-result}

**Symptome**

Nachdem `execute` zurückgekehrt ist, enthält `output/results` ein leeres Array: `CodeDetectResultArray.results` hat keinen Eintrag. Im Bild-Stream hat ein Ergebnis auf `control/subscribe/output/stream/result` ein leeres Array `results`.

**Mögliche Ursachen**

- Das Bild enthält keinen Data-Matrix-Code. Ein leeres `output/results` ist kein Fehler: Es bedeutet, dass das Bild erfolgreich gelesen wurde und keinen Data-Matrix-Code enthielt. Ein Lauf, der nichts gefunden hat, veröffentlicht ein leeres Array und keinen Fehler.
- Der Code ist kein ECC 200 Data-Matrix-Code. Der Reader liest ECC 200 Data-Matrix-Codes. QR-Codes, Aztec-Codes und lineare Barcodes lesen seine Schwester-Apps.
- `input/image-address` nennt einen Bildknoten, der den Code nicht zeigt. Jeder Lauf liest den gesamten aktuellen Inhalt des dort genannten Bildknotens.
- Der letzte Lauf ist fehlgeschlagen, und das leere Array ist das Ergebnis eines früheren Laufs. Ein fehlgeschlagener Lauf lässt `output/results` unverändert. Ein Lauf schlägt fehl, wenn das Bild nicht gelesen werden kann: keine Adresse gesetzt, eine Adresse, die sich nicht auflösen lässt, ein fehlender oder zu kurzer `data`-Puffer oder ein nicht unterstütztes Pixelformat.

**Diagnose**

1. Lesen Sie das Protokoll der Anwendung zum Zeitpunkt des Laufs - erwartet: kein Fehlschlag. Ein fehlgeschlagener Lauf schreibt seinen Grund dorthin; auf ctrlX OS ist das das Systemprotokoll.
2. Lesen Sie `input/image-address` - erwartet: die Adresse des Bildknotens der Kamera, die den Code sieht, zum Beispiel `hdvisionsystems/lumiscan-cam-driver/camera1/output/image`.
3. Prüfen Sie die Art des Codes - erwartet: ein ECC 200 Data-Matrix-Code.

**Lösung**

- **Wenn das Bild keinen Data-Matrix-Code enthält:** Mit dem Reader ist alles in Ordnung. Rufen Sie `execute` erneut auf, wenn der Bildknoten ein Bild mit dem Code enthält.

- **Wenn der Code kein ECC 200 Data-Matrix-Code ist:** Verwenden Sie die Schwester-App für seine Symbologie: LumiScan QR Code Reader, LumiScan Aztec Code Reader oder LumiScan Barcode Reader. Sie arbeiten auf dieselbe Weise.

- **Wenn `input/image-address` einen anderen Bildknoten nennt:**

  a. Schreiben Sie die Adresse des richtigen Bildknotens in `input/image-address`. Es ist die Adresse des Bildknotens selbst, nicht die seines Kindknotens `data`. Die Adresse wird gemerkt.

  b. Schreiben Sie einen leeren Wert in `execute`. Erwartet: `output/results` enthält einen Eintrag pro Code.

- **Wenn der letzte Lauf fehlgeschlagen ist:** Beseitigen Sie den Grund, den das Protokoll nennt: Setzen Sie `input/image-address`, korrigieren Sie eine Adresse, die sich nicht auflösen lässt, oder sorgen Sie dafür, dass die Bildquelle vollständige `data` in einem unterstützten Pixelformat liefert (siehe [Voraussetzungen](https://docs.hdvisionsystems.com/de/lumiscan-dmc-reader-de/1.1.0/lumiscan-dmc-reader/requirements.html)). Schreiben Sie dann erneut einen leeren Wert in `execute`. Erwartet: Das Protokoll zeigt für diesen Lauf keinen Fehlschlag.

Siehe [Einen Code lesen](https://docs.hdvisionsystems.com/de/lumiscan-dmc-reader-de/1.1.0/lumiscan-dmc-reader/reading-a-code.html) und [Das Ergebnis](https://docs.hdvisionsystems.com/de/lumiscan-dmc-reader-de/1.1.0/lumiscan-dmc-reader/the-result.html).

**Wenn das Problem weiterhin besteht**

Senden Sie die unter [Informationen für den Support](https://docs.hdvisionsystems.com/de/lumiscan-dmc-reader-de/1.1.0/troubleshooting.html#support-information) aufgeführten Informationen an den Support, zusammen mit dem Wert von `input/image-address`, `width`, `height` und `pixel-type` dieses Bildknotens und der Symbologie des Codes.

## Problem: `control/subscribe/execute` wird abgelehnt {#faq-stream-refused}

**Symptome**

Ein Schreibvorgang auf `control/subscribe/execute` (oder auf `control/unsubscribe/execute`) antwortet mit `DL_INVALID_VALUE` (ctrlX OS) oder `Rejected` (PC) oder mit `DL_CREATION_FAILED` (ctrlX OS) oder `CreationFailed` (PC) statt mit `DL_OK` (ctrlX OS) oder `Ok` (PC). Nichts hat sich geändert: `setting/stream/` zeigt weiterhin die zuvor angewendeten Werte.

**Mögliche Ursachen**

- `DL_INVALID_VALUE` / `Rejected` von `control/subscribe/execute`: Stream-Modus ohne Adresse oder eine Warteschlangengröße außerhalb von `1` bis `64`.
- `DL_INVALID_VALUE` / `Rejected` von `control/unsubscribe/execute`: Die Adresse ist nicht die Quelle, oder es gibt keine Quelle.
- `DL_CREATION_FAILED` / `CreationFailed`: Die Einstellungsdatei `dmc-reader.json` konnte nicht geschrieben werden, zum Beispiel weil sie kein gültiges JSON ist.

**Diagnose**

1. Lesen Sie die Antwort des Methodenaufrufs - erwartet: `DL_OK` oder `Ok`. `DL_INVALID_VALUE` oder `Rejected` weist auf eine Eingabe hin, `DL_CREATION_FAILED` oder `CreationFailed` auf die Einstellungsdatei.
2. Lesen Sie das Protokoll der Anwendung - erwartet: der Grund für die Ablehnung. Auf dem ctrlX Data Layer trägt ein abgelehnter Aufruf keinen Grund; der Reader schreibt ihn in sein Protokoll.
3. Lesen Sie nach einem abgelehnten `control/subscribe/execute` die Knoten `control/subscribe/input/enable`, `control/subscribe/input/address` und `control/subscribe/input/queue-size` - erwartet: eine Adresse, sobald `enable` `true` ist, und eine Warteschlangengröße von `1` bis `64`.
4. Vergleichen Sie nach einem abgelehnten `control/unsubscribe/execute` den Wert von `control/unsubscribe/input/address` mit `setting/stream/address` - erwartet: dieselbe Adresse. Ein `/` an einem der beiden Enden zählt nicht.
5. Öffnen Sie nach `DL_CREATION_FAILED` oder `CreationFailed` die Datei `dmc-reader.json` im Konfigurationsverzeichnis (siehe [Allgemeine Prüfungen](https://docs.hdvisionsystems.com/de/lumiscan-dmc-reader-de/1.1.0/troubleshooting.html#general-checks)) - erwartet: eine gültige JSON-Datei.

**Lösung**

- **Wenn der Stream-Modus keine Adresse hat:** Schreiben Sie den Stream-Ordner der Kamera, zum Beispiel `hdvisionsystems/lumiscan-cam-driver/camera1/control/publish/output/stream`, in `control/subscribe/input/address`, und schreiben Sie dann erneut auf `control/subscribe/execute`. Erwartet: `DL_OK` oder `Ok`.

- **Wenn die Warteschlangengröße außerhalb von `1` bis `64` liegt:** Schreiben Sie einen Wert von `1` bis `64` in `control/subscribe/input/queue-size`, und schreiben Sie dann erneut auf `control/subscribe/execute`. Erwartet: `DL_OK` oder `Ok`.

- **Wenn die zu entfernende Adresse nicht die Quelle ist:** Schreiben Sie die Adresse, die `setting/stream/address` anzeigt, in `control/unsubscribe/input/address`, und schreiben Sie dann erneut auf `control/unsubscribe/execute`. Ist `setting/stream/address` leer, gibt es keine Quelle, die entfernt werden kann.

- **Wenn die Einstellungsdatei nicht geschrieben werden konnte:**

  a. Korrigieren Sie `dmc-reader.json`, sodass die Datei gültiges JSON ist. Auf einem PC schreibt `lumiscan-dmc-reader --generate-settings <folder>` ein Beispiel, mit dem Sie beginnen können.

  b. Schreiben Sie erneut auf `control/subscribe/execute`. Erwartet: `DL_OK` oder `Ok`, und `setting/stream/` zeigt die neuen Werte.

     Von Hand vorgenommene Änderungen an der Datei wirken beim nächsten Start der Anwendung.

Siehe [Die Quelle ändern](https://docs.hdvisionsystems.com/de/lumiscan-dmc-reader-de/1.1.0/lumiscan-dmc-reader/reading-codes-on-an-image-stream.html#subscribing) und [Ergebnisse eines Methodenaufrufs](https://docs.hdvisionsystems.com/de/lumiscan-keryx-de/1.0.0/status-codes.html#method-results).

**Wenn das Problem weiterhin besteht**

Senden Sie die unter [Informationen für den Support](https://docs.hdvisionsystems.com/de/lumiscan-dmc-reader-de/1.1.0/troubleshooting.html#support-information) aufgeführten Informationen an den Support, zusammen mit der Antwort des Methodenaufrufs, den Werten der Eingaben von `control/subscribe` (oder von `control/unsubscribe/input/address`) und `dmc-reader.json`.

## Problem: Der Stream läuft, aber es treffen keine Ergebnisse ein, oder `failed-frames` steigt {#ts-stream-no-results}

**Symptome**

Nach `control/subscribe/execute` trifft auf `control/subscribe/output/stream/result` kein Ergebnis ein, oder der Zähler `control/subscribe/output/stream/statistics/failed-frames` steigt.

**Mögliche Ursachen**

- Der Stream des Readers läuft nicht: Die Eingaben von `control/subscribe` wurden geschrieben, aber `control/subscribe/execute` wurde nicht aufgerufen. Eine Eingabe allein zu schreiben ändert nichts.
- Von der Quelle treffen keine Frames ein: Der Stream des Cam Driver läuft nicht, oder `control/subscribe/input/address` ist nicht der Stream-Ordner der Kamera. Der Stream des Cam Driver bleibt über einen Neustart des Cam Driver nicht erhalten.
- Die Quelle kann nicht abonniert werden. Der Reader versucht es dann alle 5 Sekunden erneut, solange der Stream läuft.
- Frames treffen ein, können aber nicht gelesen werden, zum Beispiel Frames in einem Pixelformat, das der Reader nicht unterstützt, oder Frames, deren Pixel die angegebene Größe nicht ausfüllen.
- Ergebnisse werden veröffentlicht, aber Ihr Client abonniert `control/subscribe/output/stream/result` nicht. Ein Lesen des Knotens liefert nur das neueste Ergebnis.

**Diagnose**

1. Lesen Sie `control/subscribe/output/stream/active` - erwartet: `true`. Ist der Wert `false`, lesen Sie `setting/stream/enable` und `setting/stream/address` - erwartet: `true` und der Stream-Ordner der Kamera.
2. Lesen Sie `hdvisionsystems/lumiscan-cam-driver/<camera name>/control/publish/output/stream/active` - erwartet: `true`.
3. Lesen Sie `control/subscribe/output/stream/statistics/received-frames` zweimal, im Abstand von einigen Sekunden - erwartet: Der Wert steigt. Die Zähler werden etwa viermal pro Sekunde aktualisiert, solange der Stream läuft.
4. Lesen Sie `statistics/failed-frames` und `control/subscribe/output/stream/last-failure` - erwartet: `failed-frames` steigt nicht, und `last-failure` ist leer. `last-failure` sagt, warum der letzte Frame, der nicht gelesen werden konnte, fehlgeschlagen ist; der Knoten wird geleert, wenn der Stream startet.
5. Lesen Sie `statistics/processed-frames` - erwartet: Der Wert steigt. Für jeden verarbeiteten Frame wird ein Ergebnis auf `control/subscribe/output/stream/result` veröffentlicht.
6. Lesen Sie das Protokoll der Anwendung - erwartet: kein Fehlschlag beim Abonnieren der Quelle und keine fehlgeschlagenen Frames.

**Lösung**

- **Wenn der Stream des Readers nicht läuft:**

  a. Schreiben Sie den Stream-Ordner der Kamera in `control/subscribe/input/address`.

  b. Setzen Sie `control/subscribe/input/enable` auf `true`.

  c. Schreiben Sie auf `control/subscribe/execute`. Erwartet: `DL_OK` oder `Ok`, danach ist `control/subscribe/output/stream/active` `true`.

- **Wenn der Stream des Cam Driver nicht läuft:** Starten Sie ihn, siehe das Handbuch des Cam Driver, *Bilder streamen*. Sein Stream bleibt über einen Neustart nicht erhalten: Verbinden Sie nach jedem Start des Cam Driver die Kamera, und rufen Sie seine Methode `control/publish/execute` mit `enable` = `true` auf. Der Stream des Readers kann vor dem Stream des Cam Driver gestartet werden; Ergebnisse treffen ein, sobald Frames eintreffen.

- **Wenn die Adresse nicht der Stream-Ordner der Kamera ist:** Schreiben Sie den Ordner, zum Beispiel `hdvisionsystems/lumiscan-cam-driver/camera1/control/publish/output/stream`, in `control/subscribe/input/address`, und schreiben Sie auf `control/subscribe/execute`. Der Reader liest den Knoten `frame` des Ordners. Erwartet: `received-frames` steigt.

- **Wenn die Quelle nicht abonniert werden kann:** Stellen Sie sicher, dass der Cam Driver läuft und den in `control/subscribe/input/address` genannten Stream-Ordner veröffentlicht. Solange der Stream läuft, versucht der Reader die Quelle alle 5 Sekunden erneut; bei derselben Adresse müssen Sie nicht erneut ausführen.

- **Wenn Frames nicht gelesen werden können:** Lesen Sie den Grund in `control/subscribe/output/stream/last-failure`. Stellen Sie sicher, dass die Frames ein unterstütztes Pixelformat verwenden: `Mono8`, `Mono12`, `RGB8`, `RGB12`, `BGR8`, `BGR12`, `Bayer_GR8`, `Bayer_RG8`, `Bayer_GR12` oder `Bayer_RG12` (siehe [Voraussetzungen](https://docs.hdvisionsystems.com/de/lumiscan-dmc-reader-de/1.1.0/lumiscan-dmc-reader/requirements.html)). Erwartet: `failed-frames` steigt nicht mehr.

- **Wenn `processed-frames` steigt, Ihr Client aber nichts erhält:** Abonnieren Sie `control/subscribe/output/stream/result`, um jedes Ergebnis zu erhalten. Oder setzen Sie `control/subscribe/input/keep-latest-output` auf `true`, und schreiben Sie auf `control/subscribe/execute`: Der Reader schreibt dann jedes Stream-Ergebnis zusätzlich in `output/results`. Auf einem PC zeigt `krxclient subscribe hdvisionsystems/lumiscan-dmc-reader/control/subscribe/output/stream/result --count 5`, dass Ergebnisse eintreffen; es zeigt einen Flatbuffer nur mit seiner Größe an.

Ein Frame ohne Data-Matrix-Code ergibt ein Ergebnis mit einem leeren Array `results`, siehe [Problem: `output/results` ist ein leeres Array](https://docs.hdvisionsystems.com/de/lumiscan-dmc-reader-de/1.1.0/troubleshooting.html#faq-empty-result). Siehe auch [Die Statistik lesen](https://docs.hdvisionsystems.com/de/lumiscan-dmc-reader-de/1.1.0/lumiscan-dmc-reader/reading-codes-on-an-image-stream.html#statistics) und [Ein Stream liefert nichts](https://docs.hdvisionsystems.com/de/lumiscan-keryx-de/1.0.0/troubleshooting.html#stream-nothing).

**Wenn das Problem weiterhin besteht**

Der Bild-Stream ist experimentell. Er wurde nur unter Windows mit LumiScan Keryx und simulierten Bildern getestet; er wurde nicht unter Linux (ctrlX OS oder Ubuntu), auf dem ctrlX Data Layer oder mit einer echten Kamera geprüft. Senden Sie die unter [Informationen für den Support](https://docs.hdvisionsystems.com/de/lumiscan-dmc-reader-de/1.1.0/troubleshooting.html#support-information) aufgeführten Informationen an den Support, zusammen mit den Werten von `control/subscribe/output/stream/active`, `control/subscribe/output/stream/last-failure`, den Zählern unter `control/subscribe/output/stream/statistics/` und `setting/stream/` sowie dem Wert von `control/publish/output/stream/active` des Cam Driver.

## Problem: Nach einem Neustart streamt der Reader von selbst wieder {#ts-stream-restart}

**Symptome**

Nach einem Neustart der Anwendung ist `control/subscribe/output/stream/active` `true`, und auf `control/subscribe/output/stream/result` treffen Ergebnisse ein, obwohl Ihr Programm nichts ausgeführt hat.

**Mögliche Ursachen**

- Der Reader startet so, wie er war. Das ist beabsichtigt: `control/subscribe/execute` und `control/unsubscribe/execute` speichern, was sie anwenden, im Abschnitt `stream` von `dmc-reader.json`. Nach einem Neustart abonniert der Reader dieselbe Quelle und startet, wenn `stream.enable` `true` ist, seinen Stream sofort.
- `stream.enable` wurde in `dmc-reader.json` von Hand auf `true` gesetzt. `true` startet den Stream beim Start der Anwendung.

**Diagnose**

1. Lesen Sie `setting/stream/enable` und `setting/stream/address` - sie zeigen, was zuletzt angewendet wurde, so wie die Einstellungsdatei es speichert. Erwartet, wenn der Reader nach einem Start nicht streamen soll: `setting/stream/enable` ist `false`.
2. Öffnen Sie `dmc-reader.json` im Konfigurationsverzeichnis (siehe [Allgemeine Prüfungen](https://docs.hdvisionsystems.com/de/lumiscan-dmc-reader-de/1.1.0/troubleshooting.html#general-checks)) - erwartet, wenn der Reader nach einem Start nicht streamen soll: `stream.enable` ist `false` oder fehlt.

**Lösung**

- **Wenn der Reader nach einem Start nicht streamen soll:** Setzen Sie `control/subscribe/input/enable` auf `false`, und schreiben Sie dann auf `control/subscribe/execute`. Das stoppt den Stream sofort und wird in `dmc-reader.json` gespeichert; der Reader startet beim nächsten Mal also außerhalb des Stream-Modus. Der Frame, der gerade gelesen wird, wird zuerst abgeschlossen. Erwartet: `control/subscribe/output/stream/active` ist `false`, und `setting/stream/enable` ist `false`.
- **Wenn der Reader auch die Quelle nicht behalten soll:** Schreiben Sie die Adresse, die `setting/stream/address` anzeigt, in `control/unsubscribe/input/address`, und schreiben Sie dann auf `control/unsubscribe/execute`. Damit endet der Stream-Modus. Erwartet: `setting/stream/address` ist leer.

Siehe [In der Einstellungsdatei gespeichert](https://docs.hdvisionsystems.com/de/lumiscan-dmc-reader-de/1.1.0/lumiscan-dmc-reader/reading-codes-on-an-image-stream.html#saving).

**Wenn das Problem weiterhin besteht**

Senden Sie die unter [Informationen für den Support](https://docs.hdvisionsystems.com/de/lumiscan-dmc-reader-de/1.1.0/troubleshooting.html#support-information) aufgeführten Informationen an den Support, zusammen mit `dmc-reader.json` und den Werten von `setting/stream/`.

## Informationen für den Support {#support-information}

Besteht ein Problem weiterhin, senden Sie diese Informationen an den Support:

- **Software-Version:** die Version von LumiScan DMC Reader, die Sie einsetzen. Die Dateien, die der Bild-Stream in `settings-history/` im Konfigurationsverzeichnis ablegt, halten sie als `software.version` fest.
- **Plattform:** ctrlX OS (ctrlX CORE oder ctrlX IPC) und die Version von ctrlX OS, oder ein PC mit Windows 11 oder Ubuntu 24.04.
- **Data Layer:** der ctrlX Data Layer (ctrlX OS) oder LumiScan Keryx (PC). Auf einem PC zusätzlich die Broker-Adresse, die der Reader verwendet; jede App nennt sie beim Start in ihrem Protokoll.
- **Protokoll:** das Protokoll der Anwendung aus der Zeit des Fehlers; auf ctrlX OS das Systemprotokoll.
- **Zeitpunkt:** Datum und Uhrzeit des Fehlers.
- **Kommunikationsstatus:** die Antwort eines abgelehnten Methodenaufrufs (zum Beispiel `DL_INVALID_VALUE`) und die Knotenwerte, die der Eintrag des Problems nennt.
- **Konfigurationsdateien:** `dmc-reader.json` und die Dateien in `settings-history/` aus dem Konfigurationsverzeichnis (siehe [Allgemeine Prüfungen](https://docs.hdvisionsystems.com/de/lumiscan-dmc-reader-de/1.1.0/troubleshooting.html#general-checks)).

Wenden Sie sich an den Customer Success von HD Vision Systems unter [customer.success@hdvisionsystems.com](mailto:customer.success@hdvisionsystems.com) oder +49 6221 6721905; für Lizenzen an [licenses@hdvisionsystems.com](mailto:licenses@hdvisionsystems.com).

# Release Notes: v1.1.0 – LumiScan DMC Reader

URL: https://docs.hdvisionsystems.com/de/lumiscan-dmc-reader-de/1.1.0/release-notes/v1-1-0.html

Erstes funktionsfähiges Release von LumiScan DMC Reader. Version 1.0.0 hat die Data-Layer-Knoten der Anwendung registriert, aber ein festes Platzhalter-Ergebnis zurückgegeben; nichts von dem, was unten steht, war vorher nutzbar.

## Neu

**Lesen von Data-Matrix-Codes.** `execute` durchsucht ein Kamerabild nach ECC 200 Data-Matrix-Codes und meldet jeden gefundenen Code. Kein Referenzbild und kein Trainingsschritt: Die einzige Eingabe, die sich von Lauf zu Lauf ändert, ist, welches Bild gelesen wird.

**Ein Ergebnis pro Code** in `output/results` – der dekodierte Text, der Mittelpunkt in Bildpixeln, ein Konfidenz-Score und die Eckpunkte, die den Code umreißen. Ein Lauf, der nichts gefunden hat, veröffentlicht ein leeres Array und keinen Fehler.

**Jede Bildquelle auf demselben ctrlX CORE.** `input/image-address` nennt den zu lesenden Bildknoten; der Reader folgt also der Anwendung, die das Bild veröffentlicht, welche auch immer das ist. Mono-, RGB-, BGR- und Bayer-Formate werden mit 8 und 12 Bit akzeptiert, und Bayer-Bilder werden vor der Suche in Farbbilder umgewandelt.

**Eingezeichnete Ergebnisse in LumiScan Cockpit**, das den Reader als Ansicht mit dem Namen `datamatrix-code` führt und um jeden Code ein Rechteck zeichnet, beschriftet mit dem dekodierten Text und dem Score.

## Gut zu wissen

**Ein fehlgeschlagener Lauf lässt das vorherige Ergebnis stehen.** Diese Version veröffentlicht keinen Statusknoten und gibt keine Kennung zurück, sodass `output/results` allein ein frisches Leseergebnis nicht von einem veralteten unterscheidet. Der Grund für einen Fehlschlag wird in das Protokoll der Anwendung geschrieben. Ein **leeres** Ergebnis ist eindeutig: Das Bild wurde gelesen und enthielt keinen Data-Matrix-Code.

**`input/parameter` hat noch keine Einstellungen.** Seine Tabelle `DetectionParameters` ist leer; der Knoten existiert, damit später Feinabstimmungen ergänzt werden können, ohne den Knotenbaum zu ändern.

**Jeder Lauf durchsucht das gesamte Bild.** Es gibt keine Region of Interest, die Laufzeit wächst also mit der Bildgröße.

## Frühere Releases

**Version 1.0.0** – Stub. Der Knotenbaum wurde registriert, und `execute` gab ein festes Platzhalter-Ergebnis zurück.

# LumiScan DMC Reader

URL: https://docs.hdvisionsystems.com/de/lumiscan-dmc-reader-de/1.1.0/index.html

|   |   |   |
| --- | --- | --- |
| ![Zwei Metallteile auf einem Förderband, jedes mit Data-Matrix-Code](https://docs.hdvisionsystems.com/de/lumiscan-dmc-reader-de/1.1.0/_images/intro/step-1.svg)<br><br>**Die markierten Teile aufnehmen.** Gedruckte Etiketten oder Direktmarkierung. | ![Beide Data-Matrix-Codes umrandet, mit gelesenem Inhalt](https://docs.hdvisionsystems.com/de/lumiscan-dmc-reader-de/1.1.0/_images/intro/step-2.svg)<br><br>**Jeden Code finden und lesen.** Data Matrix ECC 200, ohne Template oder Training. | Beispielergebnis<br><br><br><br><br><br><br>Codes<br>2<br><br><br>Text<br>HDV-4711-0425<br><br><br>Mitte<br>640, 312 px<br><br>**Das Ergebnis an die SPS geben.** Inhalt und Position jedes Codes. |

LumiScan DMC Reader findet jeden Data-Matrix-Code (ECC 200) im Kamerabild und meldet Inhalt und Position. Data Matrix ist der Standard für Teile- und Direktmarkierung, damit Ihre SPS Seriennummern, Chargen und Teile durch die Fertigung verfolgen kann. Der Reader braucht weder Template noch Training noch Konfiguration und läuft auf ctrlX OS oder einem Windows- oder Ubuntu-PC.

Zur Lizenzierung siehe [Lizenz](https://docs.hdvisionsystems.com/de/lumiscan-dmc-reader-de/1.1.0/lumiscan-dmc-reader/requirements.html#licence). Fragen? Siehe die [FAQ](https://docs.hdvisionsystems.com/de/lumiscan-dmc-reader-de/1.1.0/faq.html). Ein Problem oder eine Fehlermeldung? Siehe [Fehlerbehebung](https://docs.hdvisionsystems.com/de/lumiscan-dmc-reader-de/1.1.0/troubleshooting.html).
