No description
  • Python 93.6%
  • Makefile 4.1%
  • Shell 2.3%
Find a file
Repository files (latest commit first)
Filename Latest commit message Latest commit date
Joshua Phu Kuhrau 7ce74516be
SPS-Sim: S7-1500 (OPC UA) → MDE → BDE/MES → Monitor
Simulation des FISI-Abschlussprojekts 2018, Szenario Spritzgießmaschine SPG_01

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-30 20:55:47 +01:00
.gitignore SPS-Sim: S7-1500 (OPC UA) → MDE → BDE/MES → Monitor 2026-10-30 20:55:47 +01:00
CLAUDE.md SPS-Sim: S7-1500 (OPC UA) → MDE → BDE/MES → Monitor 2026-10-30 20:55:47 +01:00
client.py SPS-Sim: S7-1500 (OPC UA) → MDE → BDE/MES → Monitor 2026-10-30 20:55:47 +01:00
event.py SPS-Sim: S7-1500 (OPC UA) → MDE → BDE/MES → Monitor 2026-10-30 20:55:47 +01:00
Makefile SPS-Sim: S7-1500 (OPC UA) → MDE → BDE/MES → Monitor 2026-10-30 20:55:47 +01:00
mes.py SPS-Sim: S7-1500 (OPC UA) → MDE → BDE/MES → Monitor 2026-10-30 20:55:47 +01:00
monitor.py SPS-Sim: S7-1500 (OPC UA) → MDE → BDE/MES → Monitor 2026-10-30 20:55:47 +01:00
README.md SPS-Sim: S7-1500 (OPC UA) → MDE → BDE/MES → Monitor 2026-10-30 20:55:47 +01:00
requirements.txt SPS-Sim: S7-1500 (OPC UA) → MDE → BDE/MES → Monitor 2026-10-30 20:55:47 +01:00
server.py SPS-Sim: S7-1500 (OPC UA) → MDE → BDE/MES → Monitor 2026-10-30 20:55:47 +01:00
tags.py SPS-Sim: S7-1500 (OPC UA) → MDE → BDE/MES → Monitor 2026-10-30 20:55:47 +01:00
tmux-restore.sh SPS-Sim: S7-1500 (OPC UA) → MDE → BDE/MES → Monitor 2026-10-30 20:55:47 +01:00

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.