Eine Methode ausführen
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
-
Schreiben Sie die Eingabeknoten.
-
Schreiben Sie auf
execute. Der Wert spielt keine Rolle; der Schreibvorgang selbst löst die Operation aus. -
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.
|
Der Grund kommt auf 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 |
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.
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.
|
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 Der einzige Fall, der nichts löscht, ist ein als
Warten Sie, bis |