---
title: "Handshake"
description: "Der ready/request-Handshake der LumiScan-Apps - Adressen, der Ablauf, dem ein Client folgt, der Status des Moduls dabei, die Regeln und wie sich Cam Driver und AI Object Matching unterscheiden."
product: "LumiScan Keryx"
component: "lumiscan-keryx-de"
version: "1.0.0"
display_version: "1.0.0.7"
latest_version: true
language: "de"
url: "https://docs.hdvisionsystems.com/de/lumiscan-keryx-de/1.0.0/handshake.html"
---

# Handshake – LumiScan Keryx

Der Handshake ist für eine Operation gedacht, die länger als etwa 1 s dauern kann oder die ein Client starten muss, ohne auf sie zu warten. Client und Modul wechseln sich auf zwei Knoten ab, `ready` und `request`. Niemand wartet innerhalb eines Aufrufs: Der Client pollt, und das Modul antwortet über Knoten.

Cam Driver, AI Object Matching und Calibration bieten Handshakes an.

## Adressen {#addresses}

| Adresse | Typ | Bedeutung |
| --- | --- | --- |
| `<module>/control/<function>/ready` | bool, schreibgeschützt | vom Modul gesetzt: `true`, wenn die Funktion gestartet werden kann |
| `<module>/control/<function>/request` | bool, beschreibbar | vom Client gesetzt, um die Funktion zu starten |
| `<module>/control/status/code` | int32, schreibgeschützt | der Status des Moduls, einer für alle seine Funktionen. Siehe [Statuscodes und Ergebnisse](https://docs.hdvisionsystems.com/de/lumiscan-keryx-de/1.0.0/status-codes.html) |
| `<module>/control/status/text` | string, schreibgeschützt | dasselbe als Text, für Menschen - verwenden Sie in der Programmlogik den Code |
| `<module>/input/…` | beschreibbar | die Eingaben der Funktion, vor dem Request geschrieben |
| `<module>/output/…` | schreibgeschützt | ihre Ergebnisse |
| `<module>/output/package-identifier` | schreibgeschützt | zählt abgeschlossene Operationen: Ein neuer Wert bedeutet neue Ausgaben |

`<module>` ist `hdvisionsystems/<app>/<module name>`, zum Beispiel `hdvisionsystems/lumiscan-calibration/plane1/control/transform/request`.

## Der Ablauf {#sequence}

1. Warten Sie, bis `control/<function>/ready` `true` ist.
2. Schreiben Sie die Eingaben der Funktion.
3. Setzen Sie `control/<function>/request` auf `true`.
4. Warten Sie, bis `ready` `false` ist: Das Modul hat den Request erkannt.
5. Setzen Sie `request` auf `false`.
6. Warten Sie, bis `ready` wieder `true` ist: Die Funktion ist abgeschlossen.
7. Lesen Sie `control/status/code` und die Ergebnisse unter `output/`. `output/package-identifier` ist um eins gestiegen.

Pollen Sie im Abstand von 50 bis 100 ms.

## Was das Modul anzeigt {#module-states}

So, wie Calibration ihn ausführt:

| Schritt | `ready` | `request` | `status/code` |
| --- | --- | --- | --- |
| Leerlauf | `true` | `false` | `0` ready, oder der letzte Fehler |
| Der Client fordert an | `true` | `true` |   |
| Das Modul quittiert | `false` | `true` | `3` waitingForClient |
| Der Client bestätigt; die Funktion läuft | `false` | `false` | `2` running |
| Fertig | `true` | `false` | `0`, oder ein Fehler (unter `0`) |

## Regeln {#rules}

- **Nur ein Programm schreibt einen `request`-Knoten.** Schreiben zwei Programme ihn unabhängig voneinander, kann ein Request verloren gehen. Ein Programm, das sich nicht mit anderen abstimmen kann, verwendet die [Execute-Methode](https://docs.hdvisionsystems.com/de/lumiscan-keryx-de/1.0.0/execute.html), die einen zweiten Aufruf ablehnt, solange einer läuft.
- **Das Modul wartet darauf, dass `request` zurückfällt, so lange es dauert.** Es gibt kein Timeout: Ein `request`, das danach noch `true` ist, würde als neuer Request gelesen.
- **Ein Handshake und eine Execute-Methode desselben Moduls teilen sich eine Sperre.** Während ein Handshake läuft, antwortet ein Execute-Aufruf desselben Moduls, dass es belegt ist.

## Unterschiede zwischen den Apps {#differences}

Calibration folgt dem Ablauf genau. Cam Driver und AI Object Matching weichen in Punkten ab, die ein SPS-Programm kennen muss:

| App | Unterschied |
| --- | --- |
| Cam Driver | `capture` startet, sobald der Request erkannt wird, ohne zu warten, bis `request` zurückfällt. Ein **fehlgeschlagenes Capture endet mit Status `3`**, nicht mit seinem eigenen Fehlercode, und `capture/ready` bleibt `false`, bis ein `reset` erfolgreich ist. Ein fehlgeschlagenes `reset`, `save` oder `load` bleibt ebenfalls bestehen, bis ein `reset` erfolgreich ist. Jeder andere Fehler steht nur etwa 100 ms im Status: Prüfen Sie eine Verbindung mit `device-info/is-connected`, nicht mit dem Status. Ohne Lizenz ist jedes `ready` `false` und der Status ist `-4`. |
| AI Object Matching | `inference` startet, sobald der Request erkannt wird, und **endet unabhängig vom Ausgang mit Status `3`**; nur `output/package-identifier`, das ausschließlich bei Erfolg steigt, zeigt an, dass sie erfolgreich war. Nach einer fehlgeschlagenen Inferenz und solange das Modul einen Fehler hat, wird jeder Request außer `reset` ignoriert. `reset` wird sofort ausgeführt. Während der Stream läuft, ist `inference/ready` `false` und ein Request erhält Status `100002`. |

Um den Ausgang eines Cam-Driver-`capture` oder einer AI-`inference` direkt zu lesen, verwenden Sie die zugehörige Execute-Methode: Der Status behält dann den eigenen Code der Operation.
