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
SELECT status, count(*) AS count FROM lots_current GROUP BY status ORDER BY count DESCDie 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, params: machine_id
SELECT id, name, state, state_reason, capabilities, tooling FROM machines_current WHERE id = $1Die 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, 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
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.