- Python 93.6%
- Makefile 4.1%
- Shell 2.3%
| Filename | Latest commit message | Latest commit date |
|---|---|---|
Simulation des FISI-Abschlussprojekts 2018, Szenario Spritzgießmaschine SPG_01 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> |
||
| .gitignore | ||
| CLAUDE.md | ||
| client.py | ||
| event.py | ||
| Makefile | ||
| mes.py | ||
| monitor.py | ||
| README.md | ||
| requirements.txt | ||
| server.py | ||
| tags.py | ||
| tmux-restore.sh | ||
sps-sim
Simulation des FISI-Abschlussprojekts 2018 (S7-1500 + OPC UA + PRISMA MDE).
Stack
| Damals (echt) | Heute (Sim) |
|---|---|
| Siemens S7-1500 | server.py (asyncua) |
| Softing dataFEED + Ibs.Scheduler | client.py (asyncua Subscription) |
| PRISMA MES + MSSQL | SQLite (mde_log.db) + monitor.py (rich-TUI) |
Setup
cd sps-sim
python3 -m venv .venv
source .venv/bin/activate
pip install -r requirements.txt
Starten
make server # Terminal 1 – simuliert die S7-1500
make client # Terminal 2 – subscribed + loggt in mde_log.db
make mes # Terminal 3 – MES/BDE: Aufträge, Mengen, Zustände, OEE
make monitor # Terminal 4 – Live-Dashboard (Terminal-UI), Taste v = MDE/MES-Ansicht
./tmux-restore.sh baut alles als tmux-Fenster auf (Claude | Shell | Monitor).
Hand-/Automatikbetrieb
Standardmäßig wechselt die Sim selbst zwischen RunTime und Stillständen (Störung, ManStop, Rüsten, Low-/HighLevel).
Wie damals über den OPC-UA-Test-Client lassen sich die Main_Event-Bits auch von Hand schreiben –
das schaltet die Sim in den Handbetrieb, bis sie wieder auf Automatik gestellt wird
(Steuerknoten Objects/Sim/Auto, liegt bewusst außerhalb des Original-DB).
make event E=MS V=1 # ManStop setzen → Handbetrieb
make event E=RT V=0 # RunTime zurücksetzen
make event # Stand anzeigen
make auto # zurück in Automatik
Im Monitor: Tasten 1–8 schalten DT/RT/LO/HI/MS/RST/spare6/spare7 um, a = Automatik, f = nachfüllen, b = Behälter wechseln, v = MDE/MES-Ansicht, q = Ende.
Einordnung
ERP –
MES PRISMA (Quality Center) → hier: mes.py (Aufträge, OEE) + monitor.py
└ BDE Betriebsdatenerfassung → hier: mes.py (bde_status, bde_menge)
└ MDE Maschinendatenerfassung → hier: client.py + mde_events
OPC UA Softing dataFEED (UA→DA-Gateway) + Ibs.Scheduler
SPS S7-1500, DB „PLCNet TimeStamp-DB“ → hier: server.py
Maschine: PLA_UN1 (Platine Unterbau MA1), Maschinengruppe GR_PLA (PlatinenBau), Datenquelle PL0123 (Platine123).
MES/BDE – Szenario Spritzgießen
Die Platine war nur die Demo der Abschlussarbeit; die Sim bildet heute eine Spritzgießmaschine SPG_01 ab,
weil dort alle Signale des Original-DB einen natürlichen Sinn haben. mes.py liest die MDE-Rohdaten und bucht
wie die PRISMA-Command-Pipe (MdaSetStatus, MdaSaveQuantity) Zustände und Mengen auf Fertigungsaufträge.
| Signal | BDE-Zustand |
|---|---|
| MEv_RT | Produktion |
| MEv_DT | Störung |
| MEv_LO (+DT) | Materialmangel – Granulat-Trichter leer |
| MEv_HI (+DT) | Behälter voll – Teilebehälter wechseln |
| MEv_MS | ManStop |
| MEv_RST | Rüsten – Werkzeugwechsel |
Materialfluss (in server.py, also auf SPS-Ebene): Während RunTime leert sich der Granulat-Trichter
(~6 min Laufzeit) und füllt sich der Teilebehälter (~8 min). Unter 10 % Trichter meldet die SPS LowLevel,
bei vollem Behälter HighLevel – beides mit DownTime und Stillstand, bis der „Bediener“ nach 10–40 s nachfüllt
bzw. wechselt. LowLevel/HighLevel kommen damit aus dem Prozess, zufällig sind nur noch Störung, ManStop, Rüsten.
Füllstände liegen als Objects/Sim/Trichter und Objects/Sim/Behaelter (Float, %) außerhalb des Original-DB.
make fuellen # Trichter sofort nachfüllen (beendet Materialmangel)
make wechseln # Teilebehälter sofort wechseln (beendet „Behälter voll“)
Im Monitor: Füllstandsbalken im Kopf, Tasten f / b. Im Handbetrieb steht der Materialfluss.
Artikel: DECKEL-90 (W-101, 4-fach, 24 s), KAPPE-28 (W-205, 16-fach, 12 s), CLIP-12 (W-310, 8-fach, 18 s).
make auftrag A=KAPPE-28 M=1200 # Auftrag einplanen (sonst legt mes.py automatisch welche an)
make mes-status # aktueller Auftrag, Gut/Ausschuss, OEE
make mes-neu # BDE/MES-Daten aus den Rohdaten neu berechnen
Sim-Annahmen, weil der Original-DB keinen Stückzähler hat: Schüsse ergeben sich aus der Laufzeit und der Zykluszeit (Ist 0–15 % über Soll), die ersten 2 Schüsse nach Auftragsstart, Rüsten, Störung und Materialmangel sind Anfahrausschuss. OEE = Verfügbarkeit (Laufzeit/Planzeit) × Leistung × Qualität, je Auftrag.
Tags (aus TIA-Datenbaustein der Abschlussarbeit)
Namespace: http://www.siemens.com/simatic-s7-opcua, alle unter PLCNet TimeStamp-DB.PRISMA_MDE.
Typen und Kommentare aus _pic/TIA/datenbausteine_Variabeln.png, PRISMA-Zuordnung aus Projektdoku/QC-Screenshots.
| Tag | TIA-Typ | Offset | Bedeutung | PRISMA |
|---|---|---|---|---|
| TimeStamp.S00001 | String[20] | 92.0 | SPS-Zeit als Text, '18.Okt.2012 09:07:34' |
|
| TimeStamp.C00001 | DInt | 114.0 | SPS-Zeit als HHMMSS, 90734 |
PL0123C0001 Counter (16 Bit, Stk) |
| TimeStamp.A00001 | Real | 118.0 | SPS-Zeit als HH.MMSS, 9.0734 |
|
| TimeStamp.BCD | Array[1..6] of Byte | 122.0 | JJ MM TT hh mm ss BCD, 12#10#18#09#07#34 |
|
| Clock_Trigger[0..7] | Bool | 128.0–128.7 | Taktmerker 10 / 5 / 2,5 / 2 / 1,25 / 1 / 0,625 / 0,5 Hz (Annahme) | |
| Main_Event.MEv_DT | Bool | 130.0 | DownTime | PL0123E0002 Downtime |
| Main_Event.MEv_RT | Bool | 130.1 | RunTime | PL0123E0001 Runtime |
| Main_Event.MEv_LO | Bool | 130.2 | LowLevel | |
| Main_Event.MEv_HI | Bool | 130.3 | HighLevel | |
| Main_Event.MEv_MS | Bool | 130.4 | ManStop | PL0123E0004 ManuellerStop |
| Main_Event.MEv_RST | Bool | 130.5 | Rüsten | |
| Main_Event.MEv_spare6/7 | Bool | 130.6/7 | Reserve |
Der „TimeStamp-DB“ war ein Test-Baustein: dieselbe SPS-Uhrzeit in vier Datentypen, um die Typ-Durchreichung SPS → OPC UA → DA-Gateway → PRISMA zu prüfen.