# LumiScan Barcode Reader 1.0.0.5 – complete documentation

> All pages of the LumiScan Barcode Reader 1.0.0.5 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-barcode-reader-de/1.0.0/

# Beschreibung – LumiScan Barcode Reader

URL: https://docs.hdvisionsystems.com/de/lumiscan-barcode-reader-de/1.0.0/lumiscan-barcode-reader/description.html

LumiScan Barcode Reader findet Barcodes in einem Kamerabild und meldet für jeden einzelnen, was er enthält und wo er liegt.

Er liest **lineare (1D-)Barcodes** - die Strichcodes, die quer gelesen werden und nicht als Raster. Der Reader ist für die gesamte Familie der *linearen* Codes von ZXing konfiguriert und nicht für eine einzelne Symbologie; Code 128, Code 39, EAN-13 und UPC-A werden also unter anderem alle mit demselben Aufruf gelesen. Der Codetyp muss nicht vorab bekannt sein. Jeder im Bild gefundene Code wird gemeldet: Es gibt keine Beschränkung 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 Barcode in diesem Bild. Ihre Schwester-Apps lesen die anderen Symbologien - LumiScan DMC Reader, LumiScan QR Code Reader und LumiScan Aztec Code Reader - und funktionieren auf dieselbe Weise.

## Wo die Anwendung 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-barcode-reader-de/1.0.0/lumiscan-barcode-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 spezifisch für LumiScan Barcode Reader ist; seine eigenen Knoten sind in der [Data-Layer-Referenz](https://docs.hdvisionsystems.com/de/lumiscan-barcode-reader-de/1.0.0/lumiscan-barcode-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, angegeben als Adresse in `input/image-address`, 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 bereitstellt. Siehe [Voraussetzungen](https://docs.hdvisionsystems.com/de/lumiscan-barcode-reader-de/1.0.0/lumiscan-barcode-reader/requirements.html).

## Keine Module

Anders als die LumiScan-Anwendungen, die nach etwas Konfiguriertem suchen, hat dieser Reader **keine Module**. Es gibt einen Reader pro Installation, an 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 dem Bild, in dem sie gefunden wurden, **eingezeichnet zu sehen**, öffnen Sie LumiScan Cockpit: Es führt diese Anwendung als eine einzelne Ansicht namens `bar-code` und zeichnet ein Rechteck um jeden Code, beschriftet mit dem dekodierten Text und dem Score.

# Voraussetzungen – LumiScan Barcode Reader

URL: https://docs.hdvisionsystems.com/de/lumiscan-barcode-reader-de/1.0.0/lumiscan-barcode-reader/requirements.html

## Lizenz {#licence}

Wie LumiScan Barcode 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-BARxxCRDSxHDVSx-V1NN`, eine Lizenz pro App-Instanz. Advanced-Funktionen benötigen zusätzlich `SWL-W-XCx-BARxxCRDAxHDVSx-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 Barcode 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 vom Data-Layer-Bildknoten einer anderen Anwendung.

**Auf ctrlX OS:** Diese Anwendung muss auf **demselben Gerät** laufen (ctrlX CORE oder ctrlX IPC) - 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, aber jede Anwendung funktioniert, solange der in `input/image-address` genannte Knoten diese vier Kindknoten bereitstellt:

| Knoten | Typ | Beschreibung |
| --- | --- | --- |
| `data` | Array von 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 Beachtung der 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 x height x 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) hält zwei Dinge im Konfigurationsverzeichnis der Anwendung: seinen Stream-Modus und das, was er abonniert, in `barcode-reader.json`, dort gespeichert, sobald sie sich ändern, und wofür jeder Einstellungs-Hash steht, 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-barcode-reader-de/1.0.0/lumiscan-barcode-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 ganze Bild nach Codes durchsucht wird.

# Einen Code lesen – LumiScan Barcode Reader

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

Ein Lauf hat zwei Schritte: angeben, welches Bild gelesen werden soll, dann `execute` aufrufen. Alle Pfade unten sind relativ zum Basispfad der Anwendung, `hdvisionsystems/lumiscan-barcode-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 in diesem Bild gefundenen Barcode - siehe [Das Ergebnis](https://docs.hdvisionsystems.com/de/lumiscan-barcode-reader-de/1.0.0/lumiscan-barcode-reader/the-result.html).

## Was ein Lauf tut

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

Es gibt keine Region of Interest und keine Teilsuche: Jeder Lauf liest den gesamten 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**, mit den Codes des vorherigen Laufs. Diese Version veröffentlicht keinen Statusknoten und gibt keinen Identifier zurück; am Ergebnis allein lässt sich also nicht erkennen, ob es aktuell ist. Kommt es auf den Ausgang eines Laufs an, 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 Barcode enthielt.

# Das Ergebnis – LumiScan Barcode Reader

URL: https://docs.hdvisionsystems.com/de/lumiscan-barcode-reader-de/1.0.0/lumiscan-barcode-reader/the-result.html

`output/results` ist ein Flatbuffer mit einem Eintrag pro gefundenem Barcode, im registrierten Typ `types/hdvisionsystems/lumiscan-barcode-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 ein 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 von `Point2f` | Die Eckpunkte, die den Code im Bild umreißen |

`Point2f` ist ein Paar von Floats, `x` und `y`, in Bildpixelkoordinaten. Die Koordinaten sind Floats, weil Mittelpunkt und 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 eine fehlende Umrandung also als "keine Umrandung 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 - ein Float 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 ein Rechteck um jeden Code, beschriftet mit dem dekodierten Text und dem Score, in einer Ansicht namens `bar-code`.

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

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

URL: https://docs.hdvisionsystems.com/de/lumiscan-barcode-reader-de/1.0.0/lumiscan-barcode-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 funktioniert 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 Barcode 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` hat keine andere Eingabe als die Bildadresse, und an deren Stelle tritt der Frame. `input/parameter` wird von keinem der beiden gelesen: siehe [Data-Layer-Referenz](https://docs.hdvisionsystems.com/de/lumiscan-barcode-reader-de/1.0.0/lumiscan-barcode-reader/datalayer-reference.html).

Jedes Ergebnis trägt die Lineage seines Frames - welche Kamera ihn aufgenommen hat, in welchem Lauf des Kamera-Streams, als welchen Frame des Laufs - ergänzt um den eigenen Schritt des Readers. Siehe [Die Lineage eines Ergebnisses](https://docs.hdvisionsystems.com/de/lumiscan-barcode-reader-de/1.0.0/lumiscan-barcode-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 das vorherige Lesen abgeschlossen ist, den neuesten Frame. Die Frames dazwischen werden als übersprungen gezählt. Wie viele Frames warten dürfen, legt die Warteschlangengröße fest, siehe [Die Warteschlangengröße](https://docs.hdvisionsystems.com/de/lumiscan-barcode-reader-de/1.0.0/lumiscan-barcode-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 unabhängig davon, ob er einen Stream abonniert oder nicht. Um sie zu verwenden, ist kein Neustart nötig. Alle Adressen unten beginnen mit `hdvisionsystems/lumiscan-barcode-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-barcode-reader-de/1.0.0/lumiscan-barcode-reader/reading-codes-on-an-image-stream.html#subscribing). |
| `control/unsubscribe/execute` | Entfernt die in `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 unten in der Kette liest, sieht, welches Modul es gelesen hat. Leer: der Name des Readers, `lumiscan-barcode-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-barcode-reader-de/1.0.0/lumiscan-barcode-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-barcode-reader-de/1.0.0/lumiscan-barcode-reader/reading-codes-on-an-image-stream.html#keep-latest-output). |

Die Eingaben sind beim Start der Anwendung mit dem vorbelegt, was angewendet ist; ein Client kann also eine von ihnen ä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-barcode-reader-de/1.0.0/lumiscan-barcode-reader/datalayer-reference.html#system).

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

| Adresse | Typ | Bedeutung |
| --- | --- | --- |
| `control/unsubscribe/input/address` | string | Die Quelle, die entfernt werden soll: 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-barcode-reader-de/1.0.0/lumiscan-barcode-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-barcode-reader-de/1.0.0/lumiscan-barcode-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 mit ihrer 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-barcode-reader-de/1.0.0/lumiscan-barcode-reader/reading-codes-on-an-image-stream.html#statistics). |

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

## Einrichten {#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 abgeschlossen.

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 die Rolle einer SPS übernimmt (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-barcode-reader/control/subscribe/input/address hdvisionsystems/lumiscan-cam-driver/camera1/control/publish/output/stream
krxclient write hdvisionsystems/lumiscan-barcode-reader/control/subscribe/input/enable true
krxclient execute hdvisionsystems/lumiscan-barcode-reader/control/subscribe/execute
krxclient subscribe hdvisionsystems/lumiscan-barcode-reader/control/subscribe/output/stream/result --count 5
```

`krxclient subscribe` zeigt einen Flatbuffer nur mit seiner 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ühren muss. Siehe [In der Einstellungsdatei gespeichert](https://docs.hdvisionsystems.com/de/lumiscan-barcode-reader-de/1.0.0/lumiscan-barcode-reader/reading-codes-on-an-image-stream.html#saving).

## Die Quelle ändern {#subscribing}

Ein Reader hat 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 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-barcode-reader-de/1.0.0/lumiscan-barcode-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` (Datei-Identifier `HSCD`), auf dem Data Layer registriert als `types/hdvisionsystems/lumiscan-barcode-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-barcode-reader-de/1.0.0/lumiscan-barcode-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-barcode-reader-de/1.0.0/lumiscan-barcode-reader/the-result.html). Ein Frame ohne Barcode 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 stehen, nachdem der Stream gestoppt wurde.

Ein Frame wird dekodiert, wie `execute` den Bildknoten dekodiert; es werden also dieselben Pixelformate akzeptiert, siehe [Voraussetzungen](https://docs.hdvisionsystems.com/de/lumiscan-barcode-reader-de/1.0.0/lumiscan-barcode-reader/requirements.html). Der ganze Frame wird durchsucht. Ein Frame und dasselbe Bild, gelesen über `input/image-address`, 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 Frame-Nummer 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-barcode-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-barcode-reader-de/1.0.0/lumiscan-barcode-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-barcode-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 Kamera-Schritts zwischen zwei Ergebnissen derselben Kamera sind Frames, die übersprungen wurden, fehlgeschlagen oder verloren gegangen sind.

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, das nur den Schritt des Readers enthält. 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 ein Lesen verändert; der Hash deckt also nur den Codetyp sowie Name und Version der Anwendung ab: Er ändert sich, wenn die Anwendung aktualisiert wird. Er deckt nicht den Stream-Modus, die Quelle, die Warteschlangengröße oder keep-latest-output ab, 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/barcode-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": "bar-code",
        "software.name": "lumiscan-barcode-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` | Frames, die nie gelesen wurden: von neueren aus der Warteschlange verdrängt, während ein Frame gelesen wurde (siehe [Die Warteschlangengröße](https://docs.hdvisionsystems.com/de/lumiscan-barcode-reader-de/1.0.0/lumiscan-barcode-reader/reading-codes-on-an-image-stream.html#queue-size)), oder noch 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 Kamera-Streams 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}

Stream-Modus und Quelle sind Einstellungen des Readers. Sie werden im Abschnitt `stream` der Einstellungsdatei des Readers gespeichert, `barcode-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 Abschnitt `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-barcode-reader` |
| PC (Windows) | `%APP_RESOURCE_DIR%\etc\lumiscan-barcode-reader`; ohne `APP_RESOURCE_DIR` `C:\ProgramData\HD Vision Systems GmbH\LumiScan Vision Suite\lumiscan-barcode\etc\lumiscan-barcode-reader` |

Die Datei enthält einen Abschnitt, `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-barcode-reader-de/1.0.0/lumiscan-barcode-reader/reading-codes-on-an-image-stream.html#generate-settings):

```json
{
    // The settings of the Barcode 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/barcode-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-barcode-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-barcode-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 Frame beim Eintreffen angewendet werden, jeder ein Objekt mit einem `kind`, wie sie der Abschnitt `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 vorgenommene Änderungen an der Datei 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 Abschnitt `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`. Der Wert 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 durch `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. Es 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 jeder Aufruf von `execute`, und nichts wird zwischen den 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 vorgenommene Änderungen an der Einstellungsdatei wirken beim nächsten Start der Anwendung.

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

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

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

Ohne Ordner (`-g` allein) schreibt er in den aktuellen Ordner. Das Beispiel ist die Einstellungsdatei `barcode-reader.json`: Stream-Modus aus, der Stream von `camera1` des Cam Driver als Quelle, die standardmäßige Warteschlangengröße und `keep-latest-output` aus. Daneben, in `schemas/`, liegen das Schema, das sie in `"$schema"` nennt, `barcode-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` mit. Vorhandene Dateien werden nie überschrieben: Liegt eine von ihnen bereits im Ordner, wird nichts geschrieben, und der Barcode Reader sagt, welche.

Der Barcode 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-barcode\etc\lumiscan-barcode-reader`. Bearbeiten Sie das Beispiel, kopieren Sie es dorthin, und starten Sie den Barcode Reader.

# Data-Layer-Referenz – LumiScan Barcode Reader

URL: https://docs.hdvisionsystems.com/de/lumiscan-barcode-reader-de/1.0.0/lumiscan-barcode-reader/datalayer-reference.html

Alle Knoten liegen unter dem Basispfad der Anwendung:

```
hdvisionsystems/lumiscan-barcode-reader/
```

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

## Data Layer {#data-layer}

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

Auf ctrlX OS (ctrlX CORE oder ctrlX IPC) nutzt LumiScan Barcode 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 Barcode 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 Barcode 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-barcode-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-barcode-reader/
├── input/
│   ├── image-address        (string)      address of the image node to read
│   └── parameter            (flatbuffers) detection parameters
├── execute                  (method)      read every barcode 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 Data-Layer-Bildknotens, der gelesen werden soll. Der Reader hängt `/data`, `/width`, `/height` und `/pixel-type` an. Standardmäßig leer; ein Lauf schlägt dann fehl, bis die Adresse gesetzt ist. |
| `input/parameter` | flatbuffers | lesen, schreiben | Erkennungsparameter, Typ `types/hdvisionsystems/lumiscan-barcode-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 Feineinstellungen 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 an `input/image-address` und schreibt jeden gefundenen Barcode 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-barcode-reader/code_detect_result`. Leeres Array, wenn das Bild keinen Code enthielt. Siehe [Das Ergebnis](https://docs.hdvisionsystems.com/de/lumiscan-barcode-reader-de/1.0.0/lumiscan-barcode-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-barcode-reader-de/1.0.0/lumiscan-barcode-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-barcode-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 Quelle, die entfernt werden soll, 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 `barcode-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-barcode-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 mit ihrer 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-barcode-reader-de/1.0.0/lumiscan-barcode-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 `barcode-reader.json` und wendet sie dann an. Eine Eingabe allein zu schreiben ändert nichts. Abgelehnt bei Stream-Modus ohne Adresse oder bei einer Warteschlangengröße außerhalb von 1 bis 64. |
| `control/unsubscribe/execute` | Ja | Entfernt die in `control/unsubscribe/input/address` genannte Quelle, womit der Stream-Modus endet; das Tag bleibt. Wird wie ein Subscribe in `barcode-reader.json` gespeichert. Abgelehnt, wenn die Adresse nicht die Quelle ist. |

Die Eingaben von `control/subscribe` sind mit dem vorbelegt, was angewendet ist, und nur `control/subscribe/execute` wendet sie an. Kann `barcode-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, den der Reader abonniert, enthalten muss: 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 Anwendung **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.
- **Kein Daten-Identifier.** Es gibt nichts, was zurückgegeben wird; ein Ergebnis lässt sich also 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 ganze Bild.

# FAQ – LumiScan Barcode Reader

URL: https://docs.hdvisionsystems.com/de/lumiscan-barcode-reader-de/1.0.0/faq.html

Kurze Antworten auf häufige Fragen und Fehlermeldungen zu LumiScan Barcode 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-barcode-reader-de/1.0.0/lumiscan-barcode-reader/datalayer-reference.html), [ctrlX Data Layer und LumiScan Keryx](https://docs.hdvisionsystems.com/de/lumiscan-keryx-de/1.0.0/platforms.html)

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

- **Antwort:** Er liest lineare (1D-)Barcodes. Der Reader ist für die gesamte lineare Familie von ZXing konfiguriert und nicht für eine einzelne Symbologie; Code 128, Code 39, EAN-13 und UPC-A werden also unter anderem alle mit demselben Aufruf gelesen. Die Symbologie muss nicht vorab bekannt sein. Jeder im Bild gefundene Code wird gemeldet; es gibt keine Beschränkung auf einen Code pro Lauf. Es werden weder Vorlage, Referenzbild, Trainingsschritt noch Konfiguration benötigt: Sie geben dem Reader die Adresse eines Bildes und rufen `execute` auf.
- **Mehr:** [Beschreibung](https://docs.hdvisionsystems.com/de/lumiscan-barcode-reader-de/1.0.0/lumiscan-barcode-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 **demselben 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-barcode-reader-de/1.0.0/lumiscan-barcode-reader/requirements.html), [Einen Code lesen](https://docs.hdvisionsystems.com/de/lumiscan-barcode-reader-de/1.0.0/lumiscan-barcode-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 Beachtung der 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-barcode-reader-de/1.0.0/lumiscan-barcode-reader/requirements.html)

## Codes lesen

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

- **Antwort:** Alle Pfade sind relativ zu `hdvisionsystems/lumiscan-barcode-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`: Es enthält jeden in diesem Bild gefundenen Barcode.
- **Mehr:** [Einen Code lesen](https://docs.hdvisionsystems.com/de/lumiscan-barcode-reader-de/1.0.0/lumiscan-barcode-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 also als Zahlen. `center` und `text` sind immer vorhanden; `polygons` kann bei einem Eintrag fehlen, was bedeutet, dass keine Umrandung angegeben wurde, nicht, dass ein Fehler vorliegt.
- **Mehr:** [Das Ergebnis](https://docs.hdvisionsystems.com/de/lumiscan-barcode-reader-de/1.0.0/lumiscan-barcode-reader/the-result.html)

### Woran erkenne ich, ob 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 keinen Identifier 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, mit den 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-barcode-reader-de/1.0.0/lumiscan-barcode-reader/reading-a-code.html), [Data-Layer-Referenz](https://docs.hdvisionsystems.com/de/lumiscan-barcode-reader-de/1.0.0/lumiscan-barcode-reader/datalayer-reference.html)

### Kann ich die Erkennung feineinstellen, eine Region of Interest festlegen 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, und auch der Bild-Stream liest ihn nicht. Es gibt keine Region of Interest: Jeder Lauf durchsucht das ganze 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-barcode-reader-de/1.0.0/lumiscan-barcode-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 namens `bar-code` und zeichnet ein Rechteck um jeden Code, beschriftet mit dem dekodierten Text und dem Score. Ein Code, der gefunden, aber nicht dekodiert wurde, hat keinen Text und wird nur mit seinem Score beschriftet.
- **Mehr:** [Das Ergebnis](https://docs.hdvisionsystems.com/de/lumiscan-barcode-reader-de/1.0.0/lumiscan-barcode-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 ganze Bild durchsucht wird.
- **Mehr:** [Voraussetzungen](https://docs.hdvisionsystems.com/de/lumiscan-barcode-reader-de/1.0.0/lumiscan-barcode-reader/requirements.html)

## Bild-Stream (experimentell)

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

- **Antwort:** Ja, als experimentelle Funktion. Der Reader abonniert den Stream einer Kamera von LumiScan Cam Driver und liest jeden Barcode in jedem Frame, sobald er eintrifft, genau so, wie `execute` ein Bild liest. Alle Pfade sind relativ zu `hdvisionsystems/lumiscan-barcode-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-barcode-reader-de/1.0.0/lumiscan-barcode-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 `barcode-reader.json` im Konfigurationsverzeichnis der Anwendung: auf ctrlX OS `/var/snap/rexroth-solutions/common/solutions/activeConfiguration/lumiscan-barcode-reader`, unter Windows `C:\ProgramData\HD Vision Systems GmbH\LumiScan Vision Suite\lumiscan-barcode\etc\lumiscan-barcode-reader` (oder `%APP_RESOURCE_DIR%\etc\lumiscan-barcode-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-barcode --generate-settings <folder>` ein Beispiel, mit dem Sie beginnen können.
- **Mehr:** [In der Einstellungsdatei gespeichert](https://docs.hdvisionsystems.com/de/lumiscan-barcode-reader-de/1.0.0/lumiscan-barcode-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-barcode-reader-de/1.0.0/troubleshooting.html) beschrieben:

- [Der Reader beendet sich beim Start](https://docs.hdvisionsystems.com/de/lumiscan-barcode-reader-de/1.0.0/troubleshooting.html#faq-app-stops-after-start)
- [`output/results` ist ein leeres Array](https://docs.hdvisionsystems.com/de/lumiscan-barcode-reader-de/1.0.0/troubleshooting.html#faq-empty-result)
- [`control/subscribe/execute` wird abgelehnt](https://docs.hdvisionsystems.com/de/lumiscan-barcode-reader-de/1.0.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-barcode-reader-de/1.0.0/troubleshooting.html#ts-stream-no-results)
- [Nach einem Neustart streamt der Reader von selbst wieder](https://docs.hdvisionsystems.com/de/lumiscan-barcode-reader-de/1.0.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-barcode-reader-de/1.0.0/lumiscan-barcode-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-barcode-reader-de/1.0.0/lumiscan-barcode-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 erhalte Support? {#faq-support}

- **Antwort:** Siehe die übergreifende [LumiScan-FAQ](https://docs.hdvisionsystems.com/de/faq.html). 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).
- **Mehr:** [FAQ zur Lizenzierung](https://docs.hdvisionsystems.com/de/lumiscan-licensing-de/1.0.4/faq.html)

# Fehlerbehebung – LumiScan Barcode Reader

URL: https://docs.hdvisionsystems.com/de/lumiscan-barcode-reader-de/1.0.0/troubleshooting.html

Diese Seite beschreibt Probleme mit LumiScan Barcode Reader und wie Sie sie lösen. Beginnen Sie mit den [allgemeinen Prüfungen](https://docs.hdvisionsystems.com/de/lumiscan-barcode-reader-de/1.0.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-barcode-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-barcode-reader-de/1.0.0/lumiscan-barcode-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, ob ein Lauf fehlgeschlagen ist?](https://docs.hdvisionsystems.com/de/lumiscan-barcode-reader-de/1.0.0/faq.html#faq-failed-run).

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

   | Plattform | Konfigurationsverzeichnis |
   | --- | --- |
   | ctrlX OS | `/var/snap/rexroth-solutions/common/solutions/activeConfiguration/lumiscan-barcode-reader` |
   | PC (Windows) | `%APP_RESOURCE_DIR%\etc\lumiscan-barcode-reader`; ohne `APP_RESOURCE_DIR` `C:\ProgramData\HD Vision Systems GmbH\LumiScan Vision Suite\lumiscan-barcode\etc\lumiscan-barcode-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-barcode-reader-de/1.0.0/lumiscan-barcode-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-barcode-reader` verschwinden aus dem Data Layer.

**Mögliche Ursachen**

- Die ctrlX-Lizenz `SWL-W-XCx-BARxxCRDSxHDVSx-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-BARxxCRDSxHDVSx-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-BARxxCRDAxHDVSx-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-BARxxCRDSxHDVSx-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-barcode-reader-de/1.0.0/lumiscan-barcode-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-barcode-reader-de/1.0.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 Barcode. Ein leeres `output/results` ist kein Fehler: Es bedeutet, dass das Bild erfolgreich gelesen wurde und keinen Barcode enthielt. Ein Lauf, der nichts gefunden hat, veröffentlicht ein leeres Array und keinen Fehler.
- Der Code ist kein linearer (1D-)Barcode. Der Reader liest die lineare Familie von ZXing, zum Beispiel Code 128, Code 39, EAN-13 und UPC-A. Data-Matrix-, QR- und Aztec-Codes 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 linearer (1D-)Barcode, zum Beispiel Code 128, Code 39, EAN-13 oder UPC-A.

**Lösung**

- **Wenn das Bild keinen Barcode 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 linearer Barcode ist:** Verwenden Sie die Schwester-App für seine Symbologie: LumiScan DMC Reader, LumiScan QR Code Reader oder LumiScan Aztec Code Reader. Sie funktionieren 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-barcode-reader-de/1.0.0/lumiscan-barcode-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-barcode-reader-de/1.0.0/lumiscan-barcode-reader/reading-a-code.html) und [Das Ergebnis](https://docs.hdvisionsystems.com/de/lumiscan-barcode-reader-de/1.0.0/lumiscan-barcode-reader/the-result.html).

**Wenn das Problem weiterhin besteht**

Senden Sie die unter [Informationen für den Support](https://docs.hdvisionsystems.com/de/lumiscan-barcode-reader-de/1.0.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 `barcode-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 `barcode-reader.json` im Konfigurationsverzeichnis (siehe [Allgemeine Prüfungen](https://docs.hdvisionsystems.com/de/lumiscan-barcode-reader-de/1.0.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 `barcode-reader.json`, sodass die Datei gültiges JSON ist. Auf einem PC schreibt `lumiscan-barcode --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-barcode-reader-de/1.0.0/lumiscan-barcode-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-barcode-reader-de/1.0.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 `barcode-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-barcode-reader-de/1.0.0/lumiscan-barcode-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-barcode-reader/control/subscribe/output/stream/result --count 5`, dass Ergebnisse eintreffen; es zeigt einen Flatbuffer nur mit seiner Größe an.

Ein Frame ohne Barcode ergibt ein Ergebnis mit einem leeren Array `results`, siehe [Problem: `output/results` ist ein leeres Array](https://docs.hdvisionsystems.com/de/lumiscan-barcode-reader-de/1.0.0/troubleshooting.html#faq-empty-result). Siehe auch [Die Statistik lesen](https://docs.hdvisionsystems.com/de/lumiscan-barcode-reader-de/1.0.0/lumiscan-barcode-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-barcode-reader-de/1.0.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 `barcode-reader.json`. Nach einem Neustart abonniert der Reader dieselbe Quelle und startet, wenn `stream.enable` `true` ist, seinen Stream sofort.
- `stream.enable` wurde in `barcode-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 `barcode-reader.json` im Konfigurationsverzeichnis (siehe [Allgemeine Prüfungen](https://docs.hdvisionsystems.com/de/lumiscan-barcode-reader-de/1.0.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 `barcode-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-barcode-reader-de/1.0.0/lumiscan-barcode-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-barcode-reader-de/1.0.0/troubleshooting.html#support-information) aufgeführten Informationen an den Support, zusammen mit `barcode-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 Barcode 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:** `barcode-reader.json` und die Dateien in `settings-history/` aus dem Konfigurationsverzeichnis (siehe [Allgemeine Prüfungen](https://docs.hdvisionsystems.com/de/lumiscan-barcode-reader-de/1.0.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.0.0 – LumiScan Barcode Reader

URL: https://docs.hdvisionsystems.com/de/lumiscan-barcode-reader-de/1.0.0/release-notes/v1-0-0.html

Erste funktionsfähige Version von LumiScan Barcode Reader.

## Neu

**Barcodes lesen.** `execute` liest das in `input/image-address` genannte Bild und veröffentlicht, was es gefunden hat, in `output/results`. Jeder Code wird mit seinem dekodierten `text`, dem `center` und den `polygons`, die ihn im Bild umreißen, sowie einem `score` gemeldet.

**Die gesamte lineare Familie in einem Aufruf.** Der Reader ist für die *lineare* Symbologie-Familie von ZXing konfiguriert und nicht für ein einzelnes Format; Code 128, Code 39, EAN-13 und UPC-A werden also unter anderem alle mit demselben Aufruf gelesen. Die Symbologie muss nicht vorab bekannt sein.

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

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

## Gut zu wissen

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

**Ein fehlgeschlagener Lauf lässt das vorherige Ergebnis stehen.** Diese Version veröffentlicht keinen Statusknoten und gibt keinen Identifier zurück; `output/results` allein unterscheidet also nicht zwischen einem frischen und einem veralteten Leseergebnis. 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 Barcode.

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

## Frühere Versionen

**Version 0.0.1** - Stub. Der Knotenbaum war registriert, und `execute` las nichts.

# LumiScan Barcode Reader

URL: https://docs.hdvisionsystems.com/de/lumiscan-barcode-reader-de/1.0.0/index.html

|   |   |   |
| --- | --- | --- |
| ![Zwei Kartons mit Barcode-Etiketten](https://docs.hdvisionsystems.com/de/lumiscan-barcode-reader-de/1.0.0/_images/intro/step-1.svg)<br><br>**Die Etiketten aufnehmen.** Code 128, Code 39, EAN-13, UPC-A und weitere lineare Codes. | ![Beide Barcodes umrandet, mit gelesenem Inhalt](https://docs.hdvisionsystems.com/de/lumiscan-barcode-reader-de/1.0.0/_images/intro/step-2.svg)<br><br>**Jeden Barcode finden und lesen.** Die Symbologie muss nicht vorab feststehen. | Beispielergebnis<br><br><br><br><br><br><br>Codes<br>2<br><br><br>Text<br>4006381333931<br><br><br>Mitte<br>420, 196 px<br><br>**Das Ergebnis an die SPS geben.** Inhalt und Position jedes Codes. |

LumiScan Barcode Reader findet jeden linearen (1D-)Barcode im Kamerabild und meldet Inhalt und Position. Code 128, Code 39, EAN-13, UPC-A und die übrigen gängigen linearen Symbologien liest derselbe Aufruf, ohne den Typ vorher festzulegen. Er braucht weder Template noch Konfiguration und läuft auf ctrlX OS oder einem Windows- oder Ubuntu-PC.

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