H1: Deterministische Inline-Bildprüfung an der SPS: Wie man asynchrone KI-Inferenz in den Feldbustakt zwingt

Einstieg
Das Kernproblem der visuellen Inline-Inspektion ist nicht die Modellgenauigkeit, sondern der Takt: Eine SPS lebt in einem zyklischen, deterministischen Weltbild. Ein KI-Modell auf GPU nicht. PoCs funktionieren am Labortisch, scheitern aber an der Linie, weil sie Jitter ins Taktgefüge injizieren. Dieser Artikel beschreibt konkret, wie man eine asynchrone KI-Pipeline so architekturiert, dass sie sich einer SPS-Logik deterministisch unterordnet – inklusive Handshake-Signalen, Zeitbudgetierung, Pufferung, Zeitstempeln, Edge-Hardware und Failover-Pfaden.

1) Anforderungen sauber schneiden: Zeit, Qualität, Sicherheit
Bevor Architektur: drei harte Entscheidungen.

  • Latenzbudget und Jittergrenzen: Wie viele Millisekunden zwischen „Teilstück ist im Prüfbereich“ und „SPS braucht IO-Entscheidungsbit“ sind maximal zulässig? Entscheidend ist nicht nur die mittlere Latenz, sondern die 99,9-Perzentil-Jittergrenze. Definieren Sie sie explizit.
  • Verluststrategie: Was passiert, wenn ein Frame oder ein Ergebnis zu spät kommt? Möglichkeiten: (a) Teile ausschleusen, (b) Linie kurz anhalten, (c) bestmögliche Heuristik statt ML-Ergebnis, (d) Prozessfenster enger stellen. Ohne definierte Degradationsstrategie bleibt es Glücksspiel.
  • Rückverfolgbarkeit: Muss jede Entscheidung mit einem synchronisierten Zeitstempel und einer Teile-ID nachvollziehbar sein? Wenn ja, planen Sie harte Zeitstempel (Hardware/Driver-Level) und korrelierbare IDs vom Sensor bis zur SPS.

2) Architekturprinzip: SPS taktet, KI folgt
Der Grundsatz: Die SPS steuert den Takt und gibt das Inspektionsfenster vor. Die KI verarbeitet in diesem Fenster und liefert ein deterministisches, valides Ergebnis – oder ein definiertes Timeout-Signal.

Empfohlenes Signalmuster (vereinfachtes Vier-Phasen-Handshaking):

  • SPS setzt „Inspect_Req“ (Digital-IO oder Feldbus-Flag) synchron zum Bewegungs-/Aufnahmefenster.
  • Vision-PC löst hardwaregetriggert die Kamera aus (oder bestätigt, dass ein Frame zu diesem Request verarbeitet wird) und setzt „Inspect_Ack“.
  • Nach Inferenz setzt Vision „Inspect_Valid“ und schreibt „Inspect_Result“ (OK/NOK/Klasse).
  • SPS liest „Inspect_Valid“ in ihrem Zyklus und quittiert mit „Inspect_Clear“. Vision löscht Valid/Result und ist bereit für den nächsten Takt.

Wichtig:

  • Zeitstempel (capture_ts, inference_start_ts, result_ts) werden im Vision-System erfasst und für Traceability persistiert.
  • „Inspect_Valid“ altert. Wenn es nicht rechtzeitig kommt, setzt Vision explizit „Inspect_Timeout“. Die SPS darf nie aus stillem „Nicht-Valid“ eine positive Aussage ableiten.

3) Datenpfad: Von Trigger über Frame zu deterministischem Ergebnis
Hardwarepfad

  • Triggerung: Bevorzugt Hardware-Trigger von der SPS (optisch isolierte Digitaleingänge an Kamera/Framegrabber). So vermeiden Sie Scheduling-Jitter von Software-Triggern.
  • Kamera-Interface: Für harte Latenzpfade sind CoaXPress/Camera Link HS oder deterministisches GigE-Vision mit PTP-Zeitsynchronisierung praxiserprobt. USB3 ist in der Fertigung wegen Host-Jitter und Kabel-/EMV-Themen oft eine schlechte Wahl.
  • Beleuchtung: Strobe mit fester Belichtungszeit, synchronisiert zum Trigger. Konstante Leuchtdichte vermeidet algorithmische Latenzschwankungen durch automatische Belichtungsanpassungen.

Softwarepfad

  • Capture: DMA in vorallokierte, gepinnte Host-Puffer (keine Allokationen im Hot Path). Wenn verfügbar, Zero-Copy/GPUDirect vom Framegrabber in die GPU.
  • Preprocessing: Farbkonvertierung, Zuschneiden, Normalisierung auf GPU (CUDA/OpenCL) oder via GStreamer mit geeigneten GPU-Plugins. CPU-Preprocessing erzeugt oft unnötigen Jitter.
  • Inferenz: Engine vorab kompiliert (keine JIT im Betrieb), Warm-Up beim Start, fest eingestellte Batchgröße = 1 für minimale Latenz. Quantisierte Modelle (INT8/FP16) nutzen, wenn Qualitätsbudget es erlaubt.
  • Postprocessing: NMS, Schwellen, Geometriekonversion ebenfalls auf GPU, Ergebnisse als kleine Strukturen an CPU.
  • IO/Handshake: Ergebnisbits über schnelle Digitalschnittstelle oder zyklisch via Feldbus. Ergebnis wird erst mit Valid markiert, wenn komplett geschrieben.

Pufferung

  • Lock-free Ringpuffer für Frames und Inferenzjobs. Jeder „Inspect_Req“ erzeugt ein „Inspection Ticket“ mit (ticket_id, expected_pose_window, deadline_ts). Nur Tickets mit rechtzeitigem Frame-Eingang werden zur Inferenz eingeplant – alle anderen gehen in Timeout-Path.
  • Backpressure: Wenn die Inferenz länger als das Deadline-Budget dauert, setzt die Pipeline frühzeitig „Timeout“ und verwirft weitere Tickets, statt Latenz aufzustauen.

4) Zeit-Synchronisation und Identität der Teile

  • PTP-basierte Zeitsynchronisation (IEEE 1588) zwischen Kamera, Vision-PC, ggf. SPS-Gateway. Ziel: sub-millisekundengenaue Korrelation. Klassisches NTP ist für strikte Korrelation oft zu grob.
  • Teile-Tracking: Wenn mehrere Teile parallel im Sichtfeld/auf dem Transfer sind, braucht es eine „ID-Übernahme“ (z. B. von einer vorgelagerten Lichtschranke/Encoder-Position). Die SPS übergibt die erwartete Teile-ID im Inspect_Req oder sie wird im Vision-System aus Encoder-/Positionsdaten plus Triggerindex berechnet. Ohne sauberes Mapping drohen Zuordnungsfehler („falsches Teil als OK markiert“).

5) Determinismus absichern: Betriebssystem, GPU, Speicher
Betriebssystem

  • Linux mit PREEMPT_RT oder industrielles RTOS, CPU-Kerne für Vision-Threads isolieren (isolcpus), CPU-Affinität setzen, C-States/Turbo abschalten, tickless Kernel/Low-Latency-Optimierungen aktivieren.
  • Threads: SCHED_FIFO für zeitkritische Threads (Capture, Inferenz-Scheduler, IO), Prioritäten sauber staffeln (Capture > IO > Inferenz-Worker > Logging).
  • Interrupt-Affinität: NIC-/Framegrabber-Interrupts auf dedizierte Kerne pinnen.

GPU

  • Fixe Performance-States, keine Auto-Clock-Skalierung. Thermische Reserven einplanen (Gehäuse, konstantes Lüfterprofil), damit es unter Last nicht drosselt.
  • Engine-Preload/Warmup: Erste Inferenz-Aufrufe sind oft langsamer; den Pipeline-Start außerhalb des Produktionsfensters durchführen.
  • Ressourcenabschottung: Bei Mehrkamera-Setups Streams und CUDA-Kontexte so planen, dass keine unkontrollierten Interferenzen entstehen. Wenn verfügbar, Hardware-Unterteilung/Partitionierung verwenden; sonst harte Quoten/Separation über Prozessgrenzen.

Speicher/IO

  • Keine Heap-Allokationen im Hot-Path. Vorab-Pools für Bilder/Workitems.
  • Pinned Memory und Page-Lock für Host↔GPU Transfers.
  • Zero-Copy Wege nutzen, wo verfügbar. Sonst Transfers batched, aber ohne zusätzliche Latenz – Batchgröße 1 für Low-Latency.