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.
| Ebene | Baustein | Technik | Port |
|---|---|---|---|
| 0 | Simulation | Python 3.12, eigener Kern — benannte Zufallsströme, deterministisch | — |
| 1 | Steuerung | asyncua 2.0 — echter OPC-UA-Server, mit UaExpert begehbar | 4840 |
| 1 | Altmaschine | pymodbus 3.15 — Modbus/TCP-Slave, mit mbpoll lesbar | 5020 |
| 2 | Edge-Gateway | pysparkplug über paho-mqtt, Eclipse Mosquitto 2 | 1883 |
| 2 | Modbus-Konnektor | pymodbus-Client, Kennzahlenrechnung am Rand | — |
| 3 | Historian | TimescaleDB auf PostgreSQL 16 — Hypertable und kontinuierliche Aggregation | 5442 |
| 3 | API | FastAPI auf uvicorn, asyncpg-Pool | 8021 |
| 3 | Regelkreis | MAPE-K, Takt 20 s; Ledger mit Ed25519 | — |
| 4 | Oberfläche | SvelteKit mit adapter-node, three.js für die Hallenansicht | 5180 |
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.
Beschreibbar ist, was die Einheit selbst als Stellgröße meldet — nicht, was in einer Liste steht. Die Anlage klemmt ihre Grenzen zusätzlich selbst.
- M
Beobachten
loop/monitor.pyLiest den AAS-Zwilling, nicht die Rohsensorik. Cockpit, Regelkreis und fremde Werkzeuge sehen dadurch dieselbe Wahrheit. Zeitgewichtet aggregiert, weil das Gateway nur Änderungen sendet.
- A
Beurteilen
loop/regelwerke.pyHier 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.
- P
Planen
loop/plan.pyMacht 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.
- 1
Das Tor
kann Nein sagen loop/policies/policies.yamlPrü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.
- 2
Der Mensch
Freigabe erforderlichOhne 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.
- 3
Der Probelauf
kann Nein sagen loop/canary.pyEine 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.
- 4
Der Wachhund
bricht abLä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.
- 5
Das Rauschband
nicht unterscheidbarEine 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.
- K
Ausführen und bezeugen
loop/execute.pyDer 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
| Ausgang | Anzahl | Was das heißt |
|---|---|---|
| Vom Tor abgelehnt | – | Jede Ablehnung mit einzelner Begründung: Grenzen, Schrittweite, Konfidenz, Beobachtungsdauer, Abstand. Das Tor ist kein Formular. |
| Bestätigt | – | Wirkung gemessen und ausreichend nah an der Prognose. |
| Zurückgenommen | – | Der Probelauf hat die Prognose nicht bestätigt — der alte Wert kam zurück. |
| Angewandt und stehend | – | Dauerhaft übernommene Änderungen. |
| Autonomie | – | Die 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
| Frage | Datei |
|---|---|
| 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 |