---
title: "Eine Methode ausführen"
product: "LumiScan Template Finder"
component: "lumiscan-template-finder-de"
version: "1.1.0"
display_version: "1.1.0.7"
latest_version: true
language: "de"
url: "https://docs.hdvisionsystems.com/de/lumiscan-template-finder-de/1.1.0/lumiscan-template-finder/execute-a-method.html"
---

# Eine Methode ausführen – LumiScan Template Finder

Jede Operation dieser Anwendung - Matching, Erstellen einer Vorlage und Modulverwaltung - wird auf dieselbe Weise gestartet und meldet ihr Ergebnis auf dieselbe Weise.

## Der Aufbau einer Operation

Eine Operation liegt unter einer eigenen Adresse und hat immer drei Teile:

```
<operation>/execute                 write here to run it
<operation>/input/...               the values it works on
<operation>/output/status-code      what happened, as a number
<operation>/output/status-text      what happened, in words
```

Manche Operationen haben mehr unter `output/` - ein Matching-Ergebnis oder den Pfad einer geschriebenen Datei -, aber `execute`, `status-code` und `status-text` sind immer vorhanden.

## Eine Operation ausführen

1. Schreiben Sie die Eingabeknoten.
2. Schreiben Sie auf `execute`. Der Wert spielt keine Rolle; der Schreibvorgang selbst löst die Operation aus.
3. Lesen Sie `output/status-code`, um zu erfahren, ob sie erfolgreich war.

Das Schreiben auf `execute` ist ein **blockierender Aufruf**: Er kehrt zurück, wenn die Operation abgeschlossen ist; Sie müssen also kein "ready"-Flag pollen und keinen Zustand in Ihrem Programm verfolgen. Eingaben behalten ihre Werte zwischen den Durchläufen, sodass eine wiederholte Operation nur Schritt 2 benötigt.

## Das Ergebnis prüfen

`output/status-code` ist eine vorzeichenbehaftete Zahl, und **das Vorzeichen allein sagt Ihnen, ob die Operation erfolgreich war**:

| Wert | Bedeutung |
| --- | --- |
| größer als 0 | Die Operation war erfolgreich |
| 0 | Die Operation wurde seit dem Start der Anwendung nicht ausgeführt |
| kleiner als 0 | Die Operation ist fehlgeschlagen und hat nichts erzeugt |

Die Prüfung in einer SPS ist also einfach `status-code < 0`. Einen bestimmten Code brauchen Sie nur, wenn Sie auf verschiedene Fehler unterschiedlich reagieren wollen - etwa auf eine fehlende Vorlage anders als auf eine Kamera, die nicht antwortet.

`output/status-text` enthält dasselbe Ergebnis als Satz und nennt den fehlerhaften Wert, wenn es einen gibt:

```
ok: 3 match(es) using 'screw.png'
error: crop/startX + crop/width (100 + 900 = 1000) exceeds the image width 640
```

Lesen Sie ihn, wenn etwas schiefgeht; bauen Sie keine Logik darauf auf, denn der Wortlaut kann sich zwischen Releases ändern. Die vollständige Liste der Codes steht in [Ausführungsstatus](https://docs.hdvisionsystems.com/de/lumiscan-template-finder-de/1.1.0/lumiscan-template-finder/execution-status.html).

> [!NOTE]
> Der Grund kommt auf `output/status-text` an, nicht in der Antwort auf den Schreibvorgang auf `execute` selbst. Ein fehlgeschlagener Schreibvorgang antwortet nur mit einem Statuscode - über REST ein bloßes `400`. Der Data Layer verwirft alle Details, die ein Provider an einen fehlgeschlagenen Aufruf anhängt; `output/status-text` anschließend zu lesen ist also der Weg, um herauszufinden, was falsch war. Die Ergebniscodes eines Schreibvorgangs 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.
>
> Derselbe Text wird in das Protokoll der Anwendung geschrieben, sodass ein Fehler auch ganz ohne den Data Layer diagnostizierbar ist: auf ctrlX OS im ctrlX Logbook oder mit `journalctl`, auf einem PC in der Konsolenausgabe der Anwendung. Sind mehrere Eingaben falsch, erhält jede eine eigene Warnzeile.

## Eine Operation zur Zeit

Ein Modul führt jeweils eine Operation aus. Eine zweite zu starten, während die erste noch läuft, stellt sie nicht in eine Warteschlange - sie kehrt sofort mit Statuscode `-1` (belegt) zurück und tut nichts. Der Schreibvorgang selbst antwortet mit `TooManyOperations` (ctrlX: `DL_TOO_MANY_OPERATIONS`), siehe [Eine Operation zur Zeit](https://docs.hdvisionsystems.com/de/lumiscan-keryx-de/1.0.0/execute.html#busy).

Die Sperre gilt pro Modul, sodass verschiedene Module parallel matchen - eine zweite Kamera wird nicht von der ersten aufgehalten. `system/create-template` hat eine eigene Sperre; das Erstellen einer Vorlage blockiert also das Matching nicht, und zwei Erstellungen können nicht kollidieren.

## Die Ausgaben gehören zum Durchlauf, der gerade beginnt

Jede Methode löscht ihre eigenen Ausgabeknoten, sobald sie beginnt - `find-template` sein `output/result`, `create-template` seinen `output/template-path`. Sie werden gelöscht, **bevor** irgendetwas fehlschlagen kann; ein Durchlauf, der aus irgendeinem Grund fehlschlägt, hinterlässt sie also leer, statt das Ergebnis eines früheren Durchlaufs zu behalten.

Deshalb ist es sicher, eine Ausgabe zu lesen, ohne zuerst `output/status-code` zu prüfen: Was Sie sehen, ist entweder das Ergebnis dieses Durchlaufs oder nichts, nie ein veralteter Wert aus einem vorherigen Bild.

`output/status-code` und `output/status-text` sind die Ausnahme - sie beschreiben immer den letzten Versuch, und genau dafür sind sie da.

> [!WARNING]
> **Lesen Sie eine Ausgabe, bevor Sie den nächsten Durchlauf auslösen.** Die Ausgaben beschreiben den letzten Durchlauf, und der nächste Aufruf leert sie in dem Moment, in dem er beginnt. Wer `execute` erneut aufruft und dann das vorherige Ergebnis lesen will, erhält nichts.
>
> Der einzige Fall, der **nichts** löscht, ist ein als `-1` (belegt) abgelehnter Aufruf: Er wurde nie ausgeführt und lässt die Ausgaben der laufenden Operation unberührt. Ein zweites `execute` unmittelbar nach dem ersten hat also zwei mögliche Ergebnisse, und sie unterscheiden sich:
>
> - Der erste Durchlauf **läuft noch** - der zweite wird mit `-1` abgelehnt, und die Ausgaben enthalten noch den Durchlauf davor;
> - der erste Durchlauf ist **gerade fertig** - der zweite wird angenommen und löscht die Ausgaben, die der erste Durchlauf eben erst geschrieben hat.
>
> Warten Sie, bis `execute` zurückkehrt, lesen Sie die Ausgaben, und lösen Sie erst dann den nächsten Durchlauf aus.
