---
title: "Grundkonzept des Handshakes"
product: "LumiScan Cam Driver"
component: "lumiscan-cam-driver-de"
version: "2.2.1"
display_version: "2.2.1.10"
latest_version: true
language: "de"
url: "https://docs.hdvisionsystems.com/de/lumiscan-cam-driver-de/2.2.1/lumiscan-camdriver/general-concept-of-handshake.html"
---

# Grundkonzept des Handshakes – LumiScan Cam Driver

Die Kommunikation in der Anwendung LumiScan CamDriver beruht auf dem Grundkonzept des Handshakes. Die Namenskonvention für Handshake-Parameter besteht in der Regel aus der **Funktionalität** und den Namen **-ready** oder **-request**.

Der Handshake funktioniert für jede Operation außer `trigger`. Die meisten Operationen können auch mit einem einzelnen Schreibvorgang auf ihren `execute`-Knoten gestartet werden - siehe [Eine Methode ausführen](https://docs.hdvisionsystems.com/de/lumiscan-cam-driver-de/2.2.1/lumiscan-camdriver/execute-a-method.html) für einen Vergleich der beiden Arten.

Jede Operation hat einen Knoten `<parent address>/<functionality name>/ready` (schreibgeschützt, von der Anwendung gesetzt: `true`, wenn die Funktionalität gestartet werden darf) und einen Knoten `<parent address>/<functionality name>/request` (beschreibbar, von Ihnen gesetzt, um sie zu starten). Der allgemeine Handshake - seine Adressen, sein Ablauf und seine Regeln - ist in [Handshake](https://docs.hdvisionsystems.com/de/lumiscan-keryx-de/1.0.0/handshake.html) beschrieben. Diese Seite beschreibt, wie der Cam Driver ihm folgt.

## Ausführung einer Funktionalität {#functionality-execution}

> [!NOTE]
> Um nicht jedes Mal die gesamte Adresse zu wiederholen, werden in diesem Abschnitt der **unveränderliche Teil** mit der übergeordneten Adresse und der **variable Funktionalitätsname** (capture, connect-camera, disconnect-camera) durch **XXX** ersetzt.\
> Die Adresse **`hdvisionsystems/lumiscan-cam-driver/<camera name>/control/connect-camera/ready`** wird also als **XXX/ready** geschrieben.

Entsprechend wird die Adresse **`hdvisionsystems/lumiscan-cam-driver/<camera name>/control/connect-camera/request`** als **XXX/request** geschrieben.

> [!NOTE]
> Stellen Sie sicher, dass immer nur ein Prozess auf XXX/request zugreift.\
> Das Ergebnis der Ausführung ist **undefiniert, wenn**:

a. Prozess A XXX/request auf True setzt.

b. Prozess B XXX/request auf False setzt, ohne Prozess A zu berücksichtigen.

c. Unsere Anwendung könnte dann XXX/request von Prozess A verpassen.

Um eine Funktionalität auszuführen, führen Sie die folgenden Schritte aus (siehe auch [Schritte zur Ausführung einer Funktionalität](https://docs.hdvisionsystems.com/de/lumiscan-cam-driver-de/2.2.1/lumiscan-camdriver/general-concept-of-handshake.html#functionality-execution-steps)):

1. Warten Sie, bis XXX/ready auf **True** gesetzt ist.
2. Setzen Sie XXX/request auf **True**.
3. Warten Sie, bis XXX/ready auf **False** wechselt: Die Anwendung hat den Request erkannt.
4. Setzen Sie XXX/request auf **False**.
5. Warten Sie, bis die Funktionalität abgeschlossen ist, und lesen Sie ihren Ausgang: siehe die Tabelle unten.

**Schritte zur Ausführung einer Funktionalität**

```mermaid
%% Der ready/request-Handshake. Mermaid rendert es im Browser; bearbeiten und Vorschau unter https://mermaid.live
sequenceDiagram
  autonumber
  participant C as Client (SPS oder Programm)
  participant M as Modul
  M-->>C: ready = true: die Funktion kann starten
  C->>M: request = true
  M-->>C: ready = false: die Anforderung wurde gesehen
  C->>M: request = false
  Note over M: führt die Funktion aus
  M-->>C: ready = true: die Funktion ist fertig
  C->>M: control/status/code und output/ lesen
```

## Wann eine Funktionalität läuft {#when-a-functionality-runs}

Es wird immer nur ein Request bedient, in dieser Reihenfolge: `reset`, `connect-camera`, `disconnect-camera`, `save`, `capture`, `load`, `list-images`, `remove`.

**Tabelle 1. Wann jede Funktionalität läuft**

| Funktionalität | Läuft | Am Ende |
| --- | --- | --- |
| `capture` | Sofort, sobald die Anwendung den Request erkennt: Sie wartet nicht, bis XXX/request zurückfällt. `status/code` ist `2` (running), solange es läuft, dann `3` (waitingForClient), solange die Anwendung darauf wartet, dass XXX/request zurückfällt. | Erfolg: `status/code` `0`, `capture/ready` **True**, und `output/package-identifier` ist um eins gestiegen.<br> **Fehler: `status/code` bleibt `3`**, nicht der Fehlercode des Capture, und `capture/ready` bleibt **False**, bis ein `reset` erfolgreich ist. |
| `connect-camera`, `disconnect-camera`, `reset`, `save`, `load`, `list-images`, `remove` | Nachdem XXX/request zurückgefallen ist. `status/code` ist bis dahin `3` und `2`, solange sie läuft. | `status/code` `0` oder ein Fehler (unter `0`). |

Ein fehlgeschlagenes `capture`, `reset`, `save` oder `load` bleibt gespeichert: Sein Status bleibt bestehen, bis ein `reset` erfolgreich ist. (Ein `save`, bevor etwas aufgenommen wurde, `-10005`, wird nicht gespeichert.) Jeder andere Fehler steht nur etwa 100 ms auf `status/code`, dann ersetzt ihn `0`. Prüfen Sie also, ob die Kamera verbunden ist, mit `hdvisionsystems/lumiscan-cam-driver/<camera name>/device-info/is-connected`, nicht mit dem Status.

Um den Ausgang eines Capture direkt zu lesen, verwenden Sie stattdessen `control/capture/execute`. Der Status behält dann den eigenen Code des Capture. Siehe [Eine Methode ausführen](https://docs.hdvisionsystems.com/de/lumiscan-cam-driver-de/2.2.1/lumiscan-camdriver/execute-a-method.html).
