Werkspur Docs Zur Website

Der Shopfloor-Prozess

Anmelden an der Station

Das Feld „Station“ darf bei der Anmeldung für jede Rolle leer bleiben. Gibt ein Bediener oder Planer einen Stationsnamen an, prüft WERKSPUR ihn gegen die Liste bekannter Stationen und lehnt einen unbekannten Namen ab. Admins umgehen diese Prüfung. Der Stationsname ist damit keine Voraussetzung für die Anmeldung, sondern ein optionaler, bei nicht leeren Angaben geprüfter Ortsvermerk. Details zur Registrierung und Prüfung finden Sie unter Rollen & Stationen.

Im Scan-Terminal wählt der Bediener die Maschine einmal im Feld „Maschine“. Die Auswahl bleibt als URL-Parameter erhalten; ein fest eingerichtetes Terminal kann deshalb mit einem entsprechend vorbereiteten Link starten. Der optionale Stationsname aus der Anmeldung liefert diesen Maschinenkontext nicht. Nach der Auswahl trägt jede Buchung die Maschine automatisch mit, ohne dass der Bediener sie erneut bestätigen muss.

Scannen

Der Bediener scannt eine Kiste. Der Scan aktiviert das zugehörige Los an dieser Maschine und setzt es auf den Zustand in_process. Dabei prüft das System, ob die Maschine die Fähigkeit besitzt, die der aktuelle Schritt verlangt. Fehlt sie, schlägt der Scan fehl, und die Kiste bleibt unverändert. Eine Kiste landet so nie versehentlich an der falschen Maschine.

Nach einem erfolgreichen Scan ist diese Kiste die aktive Kiste an der Maschine. Sie ist von da an der stille Bezugspunkt für alles, was an dieser Maschine noch gebucht wird. Weitere Buchungen am selben Schritt brauchen keinen erneuten Scan; sie beziehen sich automatisch auf die aktive Kiste. Erst wenn der Bediener eine andere Kiste scannt oder den Schritt abschließt, wechselt der Bezugspunkt.

Buchen

Ist eine Kiste aktiv, bucht der Bediener den Schritt über die Schaltfläche „Schritt {{step}} abschließen“. Diese Buchung meldet Gutmenge und Ausschuss gemeinsam zurück.

Ausschuss braucht immer einen Grund. Der Bediener wählt ihn aus dem verwalteten Katalog der Grund-Codes; ohne Grund lässt sich keine Ausschussmenge buchen. So bleibt später nachvollziehbar, warum eine Menge verloren ging. Der Katalog ist derselbe für alle Stationen, ein Admin pflegt ihn zentral.

Prozessparameter, die der Auftrag für diesen Schritt vorgibt, etwa ein Waschprogramm, übernimmt die Buchung automatisch. Der Bediener trägt sie nicht selbst ein und kann sie deshalb nicht verändern. Ändert sich ein solcher Parameter später am Auftrag, gilt das nur für Lose, die danach angelegt werden. Bereits laufende Kisten behalten den Stand, den sie bei ihrer Anlage übernommen haben.

Teilmengen und Chargen

Nicht jede Kiste läuft als Ganzes weiter. Zwei Muster kommen im Alltag vor.

Das erste ist Draw-down: Eine Teilmenge der aktiven Kiste geht in eine neue Kiste ab. Der neue Barcode wird zur ID eines neuen Loses, unabhängig von der Kiste, aus der es stammt. Die restliche Menge bleibt in der ursprünglichen Kiste und läuft an der Maschine weiter, bis sie irgendwann leer ist; dann schließt der Bediener sie als Ausschuss ab, statt eine weitere Teilmenge abzuziehen.

Das zweite Muster ist der Charge-Betrieb, etwa am Ofen. Hier sammelt die Maschine mehrere Lose, bevor ein gemeinsamer Lauf startet, und schließt sie am Ende gemeinsam ab. Der Bediener bucht dabei nicht Kiste für Kiste, sondern den Lauf als Ganzes. Die dazugehörigen Steuerungs-Aktionen, haertung-starten, charge-hinzufuegen, haertung-beenden und kiste-fuellen, sind einfache Kommando-Durchreichen ohne eigene Logik. Sie sind hier nur genannt, nicht Gegenstand dieser Seite.

Fertig

Am letzten Schritt einer Route fallen Scannen und Abschließen zu einer einzigen Geste zusammen. Der Bediener scannt die Kiste, und dieselbe Buchung schließt sie sofort ab, bei voller Gutmenge; ein zweiter Klick zum Abschließen entfällt.

Danach übernimmt ein Trigger. Er meldet das fertige Los automatisch an das Zielsystem, ohne dass der Bediener dafür etwas tun muss.

Der gesamte Ablauf verbindet Stationsprüfung, Fähigkeitsprüfung und den Fortschritt des Loses. Am letzten Schritt fasst die vorgesehene Aktion Scannen und Abschließen zusammen.

flowchart TD
    Login["Anmeldung an der Station"] --> Scan["Kiste scannen"]
    Scan --> Capability{"Fähigkeit vorhanden?"}
    Capability -->|"Nein"| Rejected["Scan abgelehnt"]
    Rejected --> Scan
    Capability -->|"Ja"| Last{"Letzter Schritt?"}
    Last -->|"Ja"| CompleteLast["Scannen und abschließen"]
    Last -->|"Nein"| Active["Los in_process"]
    Active --> Book["Schritt abschließen"]
    Book --> More{"Weitere Schritte?"}
    More -->|"Ja"| Queue["Los queued"]
    Queue --> Scan
    More -->|"Nein"| Done["Los done"]
    CompleteLast --> Done
    Done --> Trigger["Trigger meldet Fertigstellung"]

Beispiele

Die folgenden drei Aktionen sind unverändert aus dem Seed-Profil übernommen, mit dem auch die Demo läuft.

kiste-abfuellen action
{
  "name": "kiste-abfuellen",
  "summary": "Teilmenge der aktiven Kiste an dieser Maschine in eine neue Kiste abfüllen.",
  "min_role": "operator",
  "params": [
    {
      "name": "machine",
      "kind": "text",
      "label": "Maschine",
      "source": "context",
      "required": true
    },
    {
      "name": "output_box",
      "kind": "scan",
      "label": "Kiste",
      "source": "operator",
      "required": true
    },
    {
      "name": "qty_good",
      "kind": "int",
      "label": "Menge (kg)",
      "source": "operator",
      "required": true
    },
    {
      "name": "scrap",
      "kind": "breakdown",
      "label": "Ausschuss (kg)",
      "source": "operator",
      "required": false,
      "options_source": "scrap-reasons"
    }
  ],
  "steps": [
    {
      "command": "lot.draw_down",
      "bind": {
        "machine": {
          "param": "machine"
        },
        "output_box": {
          "param": "output_box"
        },
        "qty_good": {
          "param": "qty_good"
        },
        "scrap": {
          "param": "scrap"
        }
      }
    }
  ]
}
Mit dem Assistenten
Terminal-Aktion: eine Teilmenge der aktiven Kiste an dieser Maschine in eine neue gescannte Kiste abziehen.

Ein einziger Schritt, lot.draw_down. Die Maschine kommt als Kontext-Param automatisch mit. Der Bediener scannt nur die neue Kiste (output_box) und trägt die Gutmenge ein; Ausschuss ist optional und verlangt, sobald er auftritt, einen Grund-Code aus dem Katalog scrap-reasons. Das Feld input_box bleibt in der Bindung bewusst leer. lot.draw_down löst es selbst auf und zieht von der aktiven Kiste an dieser Maschine ab. Der Bediener scannt also nie die Quelle, nur das Ziel. Der Schritt ist zugleich der letzte, deshalb braucht die Aktion kein compensate.

maschine-leeren action
{
  "name": "maschine-leeren",
  "summary": "Restmenge der aktiven Kiste an dieser Maschine als Ausschuss abschließen.",
  "min_role": "operator",
  "params": [
    {
      "name": "machine",
      "kind": "text",
      "label": "Maschine",
      "source": "context",
      "required": true
    },
    {
      "name": "reason_codes",
      "kind": "select",
      "label": "Grund",
      "source": "operator",
      "required": true,
      "options_source": "box-close-reasons"
    }
  ],
  "steps": [
    {
      "command": "lot.close_empty",
      "bind": {
        "machine": {
          "param": "machine"
        },
        "reason_codes": {
          "param": "reason_codes"
        }
      }
    }
  ]
}
Mit dem Assistenten
Aktion, die die Restmenge der aktiven Kiste an dieser Maschine als Ausschuss mit Grund abschließt.

Auch hier ein einziger Schritt, lot.close_empty, mit derselben Kontext-Maschine wie oben. Der Bediener wählt nur den Grund aus dem Katalog box-close-reasons; ein Auswahlfeld für die Kiste selbst gibt es nicht. lot.close_empty ermittelt die aktive Kiste an der Maschine selbst und schließt ihre Restmenge als Ausschuss. Der Grund ist Pflicht, ohne ihn scheitert die Aktion. Auch dieser Schritt ist der letzte in der Aktion, ein compensate entfällt.

verpacken action
{
  "name": "verpacken",
  "summary": "Kiste einscannen und verpacken: schließt die Kiste im selben Schritt ab.",
  "min_role": "operator",
  "params": [
    {
      "name": "machine",
      "kind": "text",
      "label": "Maschine",
      "source": "context",
      "required": true
    },
    {
      "name": "lot_id",
      "kind": "scan",
      "label": "Kiste",
      "source": "operator",
      "required": true
    }
  ],
  "steps": [
    {
      "command": "lot.scan-in",
      "bind": {
        "lot_id": {
          "param": "lot_id"
        },
        "machine": {
          "param": "machine"
        }
      }
    },
    {
      "command": "lot.complete",
      "bind": {
        "lot_id": {
          "step": {
            "step": 0,
            "field": "id"
          }
        },
        "machine": {
          "param": "machine"
        },
        "qty_good": {
          "step": {
            "step": 0,
            "field": "qty_good"
          }
        }
      }
    }
  ]
}
Mit dem Assistenten
Endschritt-Aktion, die Scannen und Abschließen einer Kiste in einem Klick erledigt.

Zwei Schritte in einer Transaktion. Der erste, lot.scan-in, aktiviert die gescannte Kiste an der Maschine, genau wie ein einzelner Scan es sonst tut. Der zweite, lot.complete, schließt dieselbe Kiste sofort ab, bei voller Gutmenge. lot_id und qty_good binden dafür nicht den Param, sondern das Ergebnis des ersten Schritts: die id und die qty_good, die lot.scan-in zurückgibt. So schließt die Aktion garantiert genau die gerade gescannte Kiste ab, auch wenn an der Maschine zuvor noch keine aktive Kiste bekannt war. Ausschuss bleibt ungebunden, diese Aktion kennt kein Ausschussfeld an dieser Stelle. Da lot.complete der letzte Schritt ist, braucht auch er kein compensate.

Wie Sie eigene Abläufe bauen, zeigt das Kapitel Aktionen.