Werkspur Docs Zur Website

Datenmodell

Auftrag und Schritte

Ein Auftrag trägt eine Route aus Schritten. Jeder Schritt hat eine Fähigkeit (capability), die eine Maschine besitzen muss, einen Ausgabetyp und optionale Prozessparameter. Der Ausgabetyp ist entweder transform oder passthrough. Bei transform entstehen neue Lose; bei passthrough läuft dasselbe Los zum nächsten Schritt weiter.

Die Demo führt eine Kaltumformung mit sechs Schritten vor. Befetten, Fließpressen und Härten sind transform-Schritte, weil dort jeweils neue Kisten aus dem Material der vorherigen entstehen. Waschen, die 100%-Prüfung und Verpacken sind passthrough, weil dieselbe Kiste unverändert weiterläuft. Ein Prozess-Param an einem Schritt kann zum Beispiel ein Waschprogramm sein, das der Auftrag vorgibt und das der Bediener an der Maschine nicht selbst wählt.

Legen Sie ein Los aus einem Auftrag an, kopiert WERKSPUR die Route in das Los. Das Los führt sich von da an selbst und trägt seinen eigenen Schritt-Fortschritt. Ändern Sie später den Auftrag, etwa weil sich ein Prozess-Param ändert, bleiben bereits angelegte Lose davon unberührt. Sie folgen dem Stand, der zum Zeitpunkt ihrer Anlage galt. Ein neu angelegtes Los aus demselben Auftrag übernimmt dagegen die geänderte Route.

Los und Kiste

Das Los ist die verfolgbare Materialeinheit. Sie scannen eine Kiste, und der gescannte Barcode wird zur Los-ID. Die Kiste vergibt also die Identität, nicht der Server. Scannen Sie keinen Barcode, vergibt das System selbst eine ID.

Ein Los kennt sieben Zustände: queued, in_process, done, blocked, split, merged und transformed. queued heißt, das Los wartet auf den nächsten Schritt. in_process kennzeichnet die aktive Kiste an einer Maschine. WERKSPUR setzt diesen Zustand beim Scannen und löscht ihn wieder, sobald Sie den Schritt abschließen. done heißt, das Los hat alle Schritte der Route durchlaufen.

blocked ist eine Quarantäne, die ein Bediener oder Planer etwa nach einem Qualitätsproblem manuell setzt. Nach der Freigabe kehrt das Los in seinen vorherigen Zustand zurück. split, merged und transformed sind Endzustände. Das Los selbst läuft dann nicht weiter; sein Inhalt bleibt in den Kind-Losen erhalten, die aus der Buchung entstanden sind.

Jedes Los trägt seine Gutmenge, seine Ausschussmenge, eine Einheit, den aktuellen Schritt und seine Herkunft (made_with), also aus welchen Losen es entstanden ist. Über made_with verfolgen Sie ein Los bis zu seinem Ursprung zurück, auch über mehrere Umwandlungen hinweg.

Scannen aktiviert

lot.scan-in setzt ein Los auf in_process und prüft dabei, ob die Maschine die Fähigkeit des aktuellen Schritts besitzt. Fehlt der Maschine diese Fähigkeit, schlägt der Scan fehl, und die Kiste bleibt in ihrem bisherigen Zustand. Diese Prüfung verhindert, dass ein Bediener eine Kiste versehentlich an der falschen Maschine aktiviert.

Erlaubt ist der Scan aus queued oder erneut aus in_process, auch an einer anderen Maschine: Wechselt die Kiste dorthin, wechselt auch ihre Aktivierung, und die Fähigkeitsprüfung gilt weiterhin. Ein Scan aus jedem anderen Zustand schlägt fehl. Eine fertige oder gesperrte Kiste lässt sich nicht erneut aktivieren.

Umwandeln und Abziehen

Auf einem transform-Schritt entstehen neue Lose auf zwei Wegen.

Draw-down zieht Teilmengen aus der aktiven Kiste in neue Kisten ab. Aus einer Kiste können so mehrere neue Kisten entstehen, zum Beispiel wenn Fließpressen einen Teil des Materials für die nächste Maschine abzweigt. Die Buchung ist mengengeführt. Sie können also nie mehr abziehen, als die aktive Kiste noch enthält, eine Überziehung lehnt das System ab. Einheit und Mengenart bleiben beim Draw-down gleich; die Buchung teilt die Menge nur auf.

Die Umwandlung verbindet mehrere Eingangs-Lose mit mehreren Ausgangs-Losen am nächsten Schritt. Anders als beim Draw-down gilt hier keine Mengenerhaltung, weil sich die Einheit ändern kann. Aus Draht in Kilogramm können so Teile in Stück werden. Die Umwandlung passt damit auf Schritte, an denen sich die Zähleinheit des Produkts grundsätzlich ändert, während Draw-down für das reine Aufteilen derselben Einheit gedacht ist.

Beide Buchungen hinterlassen Genealogie-Kanten. So bleibt für jedes Los nachvollziehbar, aus welchem Vorgänger es hervorgegangen ist, auch über mehrere Schritte und mehrere Umwandlungen hinweg.

Maschine

Eine Maschine hat einen Zustand: running, idle, down oder maintenance, mit idle als Standard. running heißt, die Maschine arbeitet gerade. down heißt, sie steht ungeplant still. maintenance heißt, sie ist für eine geplante Wartung außer Betrieb.

Eine Maschine trägt außerdem eine Liste von Fähigkeiten, etwa oiling, pressing oder hardening; diese Werte erscheinen wortgleich in Daten und Oberfläche. Diese Liste entscheidet, welche Schritte an ihr laufen dürfen: lot.scan-in prüft genau gegen diese Liste. Die Werkzeuge einer Maschine haben jeweils einen eigenen Zustand, unabhängig vom Zustand der Maschine selbst. Jeder Zustandswechsel, an der Maschine wie am Werkzeug, ist ein Ereignis und trägt einen Grund-Code. So bleibt später nachvollziehbar, warum eine Maschine zu einem bestimmten Zeitpunkt stillstand.

Alles ist ein Ereignis

Jede Änderung an Auftrag, Los oder Maschine ist ein Ereignis: LotCreated, LotScannedIn, StepCompleted, LotDrawnDown, LotTransformed und weitere. WERKSPUR überschreibt keinen bestehenden Datensatz. Wie WERKSPUR aus diesen Ereignissen den aktuellen Stand und die vollständige Rückverfolgbarkeit aufbaut, erklärt das Kapitel Rückverfolgbarkeit.

Die fachlichen Objekte sind über Route, Buchung und Herkunft miteinander verbunden. Das Los übernimmt seine Route bei der Anlage aus dem Auftrag; Ereignisse halten danach jeden weiteren Schritt fest.

flowchart LR
    Order["Auftrag"] -->|"enthält"| Route["Route"]
    Route -->|"ordnet"| Step["Schritt"]
    Order -->|"erzeugt"| Lot["Los"]
    Box["Kiste mit Barcode"] -->|"bestimmt Los-ID"| Lot
    Lot -->|"folgt Routenkopie"| Step
    Machine["Maschine"] -->|"erfüllt Fähigkeit"| Step
    Lot -->|"Buchung erzeugt"| Event["Ereignis"]
    Machine -->|"Ort der Buchung"| Event
    Event -->|"leitet ab"| State["Aktueller Stand"]

Beispiele

lots_by_status query
-- lots_by_status
SELECT status, count(*) AS count FROM lots_current GROUP BY status ORDER BY count DESC
Mit dem Assistenten
Lege eine Abfrage an, die Lose nach Zustand zählt.

Die Abfrage gruppiert alle Lose nach status und zählt sie je Gruppe, absteigend nach Anzahl sortiert. Sie zeigt damit live genau die Wortliste aus diesem Kapitel: queued, in_process, done, blocked, split, merged, transformed, jeweils mit der aktuellen Anzahl an Losen.

machine_detail query
-- machine_detail, params: machine_id
SELECT id, name, state, state_reason, capabilities, tooling FROM machines_current WHERE id = $1
Mit dem Assistenten
Lege eine Detail-Abfrage für eine einzelne Maschine an: Zustand, Grund, Fähigkeiten und Werkzeug.

Die Abfrage liest eine einzelne Maschine über ihre id und gibt name, state, state_reason, capabilities und tooling zurück. Das sind genau die Felder aus dem Maschinen-Modell oben: der aktuelle Zustand, der zuletzt gebuchte Grund-Code, die Liste der Fähigkeiten und der Werkzeug-Zustand.

active_box_at_machine query
-- active_box_at_machine, params: machine_id
SELECT id, order_number, qty_good, uom, scanned_at FROM lots_current WHERE machine = $1 AND status = 'in_process' ORDER BY scanned_at DESC LIMIT 1
Mit dem Assistenten
Zeig mir die aktive Kiste an einer Maschine.

Die Abfrage sucht unter allen Losen an dieser Maschine mit Zustand in_process die zuletzt gescannte und gibt id, order_number, qty_good, uom und scanned_at zurück. Das ist die Kiste, die lot.scan-in zuletzt aktiviert hat, also genau die eine Kiste, an der die Maschine gerade arbeitet.