Technik · zum Alleinlesen

Eine Fabrik, die ihre Eingriffe belegt

Fünf Anlagen, zwei Protokolle, ein historisierter Zwilling und ein Regelkreis, der Stellgrößen verändern darf — aber erst, nachdem vier Instanzen nacheinander Nein sagen konnten und eine davon ein Mensch ist. Diese Seite zeigt, wie das aufgebaut ist und an welcher Stelle genau die Automatik in eine Maschine greift.

5

Anlagen, 22 Einheiten — vier über OPC UA, eine über Modbus/TCP

21

beschreibbare Punkte von 670 Metriken. Alles andere ist lesend.

0

Modelle im Regelkreis. Der Kreis ist regelbasiert — trainiert ist eines, es sagt die Standzeit vorher und schlägt nichts vor.

207

Tests, grün. Die meisten halten einen Fehler fest, der einmal echt war.

Der Durchstich

Es gibt genau einen Weg nach oben und genau einen zurück. Der Weg zurück ist derselbe, den ein fremdes Leitsystem nehmen müsste — nicht eine Abkürzung in die Simulation hinein.

Jede Ebene rechnet nur ihre eigene Sache. Die Simulation kennt kein Protokoll, die Steuerung kennt keine Datenbank, der Regelkreis kennt keine einzige Anlage beim Namen — er kennt Regelwerk-Objekte. Deshalb kostet eine fünfte Anlage ein Modul und einen Eintrag, keinen Umbau.

EbeneBausteinTechnikPort
0SimulationPython 3.12, eigener Kern — benannte Zufallsströme, deterministisch
1Steuerungasyncua 2.0 — echter OPC-UA-Server, mit UaExpert begehbar4840
1Altmaschinepymodbus 3.15 — Modbus/TCP-Slave, mit mbpoll lesbar5020
2Edge-Gatewaypysparkplug über paho-mqtt, Eclipse Mosquitto 21883
2Modbus-Konnektorpymodbus-Client, Kennzahlenrechnung am Rand
3HistorianTimescaleDB auf PostgreSQL 16 — Hypertable und kontinuierliche Aggregation5442
3APIFastAPI auf uvicorn, asyncpg-Pool8021
3RegelkreisMAPE-K, Takt 20 s; Ledger mit Ed25519
4OberflächeSvelteKit mit adapter-node, three.js für die Hallenansicht5180

Vier Anlagen sprechen OPC UA, eine spricht Modbus. Beide Ketten enden in derselben Sparkplug-Gruppe, mit Metriknamen, die der idShortPath des AAS sind — kein Übersetzungsschritt, keine Mapping-Tabelle, die jemand pflegen muss. Wie die Kabel dazu liegen, steht unter Datenwege.

Wo die Automatik eingreift

Die Automatik greift an genau 21 von 670 Punkten ein — und auch dort erst, nachdem vier Instanzen nacheinander die Gelegenheit hatten, sie zu stoppen.

21 beschreibbar — Vorschub, Sollgeschwindigkeit, Haltetemperatur 649 ausschließlich lesend

Beschreibbar ist, was die Einheit selbst als Stellgröße meldet — nicht, was in einer Liste steht. Die Anlage klemmt ihre Grenzen zusätzlich selbst.

  1. M

    Beobachten

    loop/monitor.py

    Liest den AAS-Zwilling, nicht die Rohsensorik. Cockpit, Regelkreis und fremde Werkzeuge sehen dadurch dieselbe Wahrheit. Zeitgewichtet aggregiert, weil das Gateway nur Änderungen sendet.

  2. A

    Beurteilen

    loop/regelwerke.py

    Hier liegt das Fachwissen, je Anlage eines: an der Linie der Engpass, in der Zelle die Warteschlange, an der Abfüllung der Rückstau, am Reaktor die Exothermie. Heraus kommt ein Satz, den ein Meister sagen würde.

  3. P

    Planen

    loop/plan.py

    Macht aus dem Befund einen begrenzten Vorschlag: ein Zielwert, ein Schritt, eine vorhergesagte Wirkung als Zahl. Ohne diese Prognose ließe sich später nicht prüfen, ob der Vorschlag gut war.

  4. 1

    Das Tor

    kann Nein sagen loop/policies/policies.yaml

    Prüft gegen die Richtlinie und begründet jede Ablehnung einzeln: Grenzen, Schrittweite, Mindestkonfidenz 0,55, mindestens 15 Minuten Beobachtung, 45 Minuten Anlagenlaufzeit, 20 Minuten Abstand — und vier Stunden Sperre für einen Zielwert, der schon einmal verworfen wurde. Eine YAML-Datei, kein Code.

  5. 2

    Der Mensch

    Freigabe erforderlich

    Ohne Freigabe passiert nichts. Der Vorschlag verfällt nach 30 Minuten, weil die Lage, auf die er sich stützte, dann nicht mehr die aktuelle ist. Wer freigegeben hat, steht im Nachweisbuch.

  6. 3

    Der Probelauf

    kann Nein sagen loop/canary.py

    Eine freigegebene Änderung wird nicht übernommen, sondern auf Probe gefahren. Danach entscheidet die gemessene Wirkung, nicht die erhoffte. Wer weniger liefert als angekündigt, geht zurück. Kein Graubereich.

  7. 4

    Der Wachhund

    bricht ab

    Läuft während des Versuchs mit. Steigt der Ausschuss über die Grenze oder fällt die OEE weg, bricht er sofort ab. Ein Sicherheitsereignis am Reaktor wird sogar vor der Schonzeit geprüft: Kennzahlen schwanken nach einer Änderung, eine Notabschaltung schwankt nicht.

  8. 5

    Das Rauschband

    nicht unterscheidbar

    Eine gemessene Änderung, die kleiner ist als die natürliche Streuung der Kennzahl, ist weder Beleg noch Widerlegung. Sie als Erfolg zu buchen wäre eine Werbebroschüre, als Fehlschlag eine Aussage, die die Messung nicht hergibt.

  9. K

    Ausführen und bezeugen

    loop/execute.py

    Der einzige Schreibpfad: Sparkplug DCMD an das Gateway, das ihn auf OPC UA legt — derselbe Weg, den ein fremdes Leitsystem nehmen müsste. Jeder Schritt davor und danach wird angehängt, hash-verkettet und signiert.

Was dabei herauskommt

AusgangAnzahlWas das heißt
Vom Tor abgelehntJede Ablehnung mit einzelner Begründung: Grenzen, Schrittweite, Konfidenz, Beobachtungsdauer, Abstand. Das Tor ist kein Formular.
BestätigtWirkung gemessen und ausreichend nah an der Prognose.
ZurückgenommenDer Probelauf hat die Prognose nicht bestätigt — der alte Wert kam zurück.
Angewandt und stehendDauerhaft übernommene Änderungen.
AutonomieDie Richtlinie verlangt bestätigte Prognosen, bevor Autonomie überhaupt zur Debatte steht.

Aus /api/loop/bilanz — die Zahlen stehen nicht im Quelltext. Im Livebetrieb zählen sie über die gesamte Laufzeit, in der öffentlichen Fassung über das aufgezeichnete Fenster; deshalb sind sie dort kleiner.

Warum kein Modell

Im gesamten Repository gibt es kein torch, kein sklearn, kein tensorflow und keinen Modellaufruf. Der Regelkreis ist regelbasiert, und zwar absichtlich.

Der Grund steht als Kommentar über den Regelwerken: ein Modell, das sagt „stell auf 1,06", ist im Abnahmetermin wertlos, wenn niemand erklären kann, warum. Was hier stattdessen herauskommt, ist ein Satz, den ein Meister sagen würde — mit Kennzahlen daneben und einer Prognose, an der sich der Vorschlag später messen lassen muss.

Der zweite Grund ist messtechnisch und wiegt schwerer: die Streuung ist größer als der Effekt. An der Linie schwankt die Ausbringung bei unveränderter Stellgröße um ±14 %, an der Abfüllung um ±25 %, an den Reaktoren um ±77 %. Ein Modell, das auf solchen Daten lernt, lernt zuerst das Rauschen. Bevor Lernen sinnvoll wird, muss die Messung besser werden — nicht der Algorithmus. Wie ein Modell trotzdem andocken würde, steht unter Modell und Andockstelle.

Der Nachweis

Jeder Befund, jeder Vorschlag, jede Ablehnung mit Begründung, jede Freigabe mit Namen, jedes Urteil: ein Eintrag, angehängt, hash-verkettet, mit Ed25519 signiert. Der Hash geht über die Form, die die Datenbank speichert — die Nutzdaten laufen vorher einmal durch jsonb, weil numeric keine negative Null kennt.

Die Kettenprüfung meldet einen Bruch. Er bleibt stehen.

Ursache war genau diese negative Null, gefunden und behoben — keine Manipulation. Was passiert ist, steht als eigener Eintrag in der Kette selbst. Ein anfügender Nachweis wird nicht bereinigt, auch nicht von seinem Betreiber: im Termin ist ein sichtbarer Bruch mit Erklärung das bessere Argument als eine glatte Kette. Die Prüfung hat funktioniert, und niemand hat aufgeräumt. Nachzusehen unter Regelkreis.

Was es nicht ist

Die Grenzen stehen hier, damit sie nicht im Termin gefunden werden.

Keine echte Anlage

Die Physik ist simuliert

Taylor-Standzeit, Arrhenius-Kinetik, MTBF/MTTR — plausibel parametriert und gegen synthetische Fälle geprüft, aber nicht an einer realen Maschine kalibriert. Protokolle, Zwilling und Regelkreis sind dagegen echt.

Konformität

Zwei von dreizehn Submodelltypen folgen IDTA-Vorlagen

Typenschild und technische Daten. Betriebszustand, OEE, Stellgrößen und alles Anlagenspezifische stehen unter eigener IRI — und der Konformitätsbericht im AAS-Explorer weist genau das aus, statt ein fremdes semanticId danebenzuschreiben.

Offen

Eine Anlage kann ihre Wirkung nicht belegen

In der CNC-Zelle wirkt die Stellgröße nur auf eine von fünf Maschinen. Der Kreis sagt dort dauerhaft „nicht unterscheidbar" — richtig, aber unbefriedigend. Der Vergleich gegen eine unveränderte Schwestereinheit ist der nächste geplante Schritt.

Offen

Kein AAS-Server, keine Belegschicht

Der Zwilling lebt im Historian; ein BaSyx-Server daneben wäre das nächste Konformitätsargument. Auftrags- und Chargenkontext bis aufs Werkstück ist geplant, aber nicht begonnen.

Selbst nachsehen

Im Projekt gilt: wo eine Zahl behauptet wird, gehört der Befehl daneben, mit dem man sie nachrechnet. Das gilt auch für diese Seite.

# Stand und Tests
systemctl --user status zenfactory.target
.venv/bin/python -m pytest -q                      207 passed

# Der Zwilling, live
curl -s localhost:8021/api/anlagen | jq
curl -s localhost:8021/api/ledger/verify | jq

# Die Protokolle roh — ohne ZenFactory dazwischen
scripts/opcua_browse.py --watch ST020              OPC UA
mbpoll -a 1 -r 1 -c 15 -1 127.0.0.1 -p 5020        Modbus

# Der Arbeitspunkt einer Anlage, reproduzierbar gemessen
.venv/bin/python scripts/sweep_arbeitspunkt.py REAKTOREN --stunden 96 --seeds 3
FrageDatei
Was darf die Leitebene?loop/policies/policies.yaml
Woher kommt das Fachwissen je Anlage?loop/regelwerke.py
Wo ist der einzige Schreibpfad?loop/execute.py
Wie sieht der Zwilling aus?aas/models/
Was steht auf dem Draht der Altmaschine?config/registerkarte_zs100.yaml
Welche Annahmen stecken im Euro-Betrag?config/wirtschaft.yaml
Wie ist das Ganze zusammengesetzt?docs/ARCHITEKTUR.md
Was passiert bei einem Neustart?docs/BETRIEB.md
Warum ist etwas so, wie es ist?docs/journal/decisions.md