11 KiB
Symbole und Benennungen im DXF-Layout
Diese Dokumentation beschreibt, wie Symbole und Texte in der DXF-Zeichnung benannt und strukturiert sein muessen, damit sie vom System erkannt werden.
1. Sensoren / Aktoren / Motoren (Equipment)
Equipment wird ueber INSERT-Bloecke mit Attributen erkannt.
Block-Attribute
| Attribut-Tag | Bedeutung | Beispiel | Pflicht |
|---|---|---|---|
NAME |
Geraete-ID (moderner Block) | MA0062, BG3240 |
Ja (oder IO+B) |
IO |
Geraete-ID (I/O-Block, Legacy) | MA0062 |
Alternativ zu NAME |
B |
Geraete-ID (Technik-Block, Legacy) | MA0062 |
Alternativ zu NAME |
ARTINR |
SIVAS-Artikelnummer | 790902001 |
Ja |
KENNZEICHNUNG |
Routing-Adresse | =A01+UH01-KF1DQ04 |
Ja |
SPS |
SPS-Praefix / Anlage | 1 |
Ja (fuer Zuordnung) |
VERW |
Verwendung/Beschreibung | CV-M0062_0,75 |
Nein |
REALE_POSITION |
Marker fuer tatsaechliche Position | x |
Nein |
Geraete-Praefix (erste 2 Zeichen der ID)
Welche Geraete geroutet werden, bestimmt die cfg/BMK.cfg:
Routing-Include (werden geroutet):
| Praefix | Typ |
|---|---|
MA |
Motoren |
MB |
Ventile |
QM |
Ventile/Pumpen |
BG |
Sensoren/Naeherungsschalter |
BP |
Naeherungsschalter |
BX |
Mehrzweckgeraete |
PO |
Pneumatik-Elemente |
SF |
Sicherheitselemente |
PF |
Programmierbare Logik |
Routing-Ignore (Schaltschrankelemente, nicht geroutet):
| Praefix | Typ |
|---|---|
FC |
Steuerungselemente |
UH |
Unterverteiler |
UC |
Unterverteiler |
UZ |
Spezialverteiler |
DI |
Digitale Eingaenge |
DQ |
Digitale Ausgaenge |
QA |
Ausgabegeraete |
KENNZEICHNUNG-Format
=ANLAGE+VERTEILER-KARTE
Beispiel: =A01+UH01-KF1DQ04
| Teil | Bedeutung | Beispiel |
|---|---|---|
| ANLAGE | Anlagengruppe | A01 |
| VERTEILER | Unterverteiler-ID | UH01 |
| KARTE | Karte/Kanal | KF1DQ04 |
Trennzeichen: = (Start), + (zwischen Anlage und Verteiler), - (zwischen Verteiler und Karte)
Block-Zusammenfuehrung (Legacy Dual-Block)
Bei der alten Dual-Block-Struktur werden zwei Bloecke mit gleicher ID (z.B. MA0062) zusammengefuehrt, wenn:
- Beide innerhalb von 1000mm Abstand liegen
- Einer das
SPS-Attribut hat, der andere nicht - Ergebnis-ID:
{id}@{sps}(z.B.MA0062@1)
2. Unterverteiler (Distributoren)
Unterverteiler koennen auf zwei Arten definiert werden: als Text oder als Symbol.
Variante A: Text (MTEXT)
Ein MTEXT-Element auf einem erlaubten Layer mit folgendem Muster:
-UH01 (Minus vor dem Namen)
+UH01 (Plus vor dem Namen)
Der Text muss den Verteilernamen als Teilstring enthalten, mit - oder + davor.
Erlaubte Layer (konfiguriert in cfg/allgemein.cfg, Sektion GetPos-Layer_Distributors):
Busverteiler-Kennzeichnung0-0_ILS_Busverteiler-Kennzeichnung0-0_ILS_UNTERVERTEILER0-0_ILS_Unterverteiler0-0_Omniflo_UNTERVERTEILER0-0_Omniflo_UnterverteilerUNTERVERTEILER0-0_Omniflo_Busverteiler-KennzeichnungSchaltschrank-ILS
Variante B: Symbol (INSERT-Block)
Ein INSERT-Block mit dem Attribut NAME, dessen Wert einem Cabinet-Pattern entspricht.
Cabinet-Patterns (Regex, konfiguriert in cfg/BMK.cfg, Sektion Cabinet-Pattern):
| Pattern | Beispiel-Match | Extrahierte ID |
|---|---|---|
A\d\d\+(UH0\d) |
A01+UH01 |
UH01 |
A\d\d\+(UC\d\d\d) |
A01+UC001 |
UC001 |
\+(UC\d\d\d\d) |
+UC0101 |
UC0101 |
\+(UH\d\d) |
+UH01 |
UH01 |
Die Klammer-Gruppe im Regex bestimmt die extrahierte Verteiler-ID.
Optionale Attribute:
REALE_POSITION=x: Position wird aus Attribut-Position berechnet (Mittelpunkt des Markers)SPS: SPS-Zuordnung
3. Tunnel
Tunnel koennen ebenfalls als Text oder Symbol definiert werden.
Variante A: Text (MTEXT)
Ein MTEXT-Element auf einem erlaubten Layer mit folgendem Muster:
TUNNEL1-5 (Tunnelname-Laenge)
TUNNEL2-10
Regex: (TUNNEL\d+)-(\d+)
| Teil | Bedeutung | Beispiel |
|---|---|---|
| Gruppe 1 | Tunnelname | TUNNEL1 |
| Gruppe 2 | Laenge in Metern | 5 |
Pro Tunnel muessen genau 2 MTEXT-Elemente vorhanden sein (Ein- und Ausgang).
Erlaubte Layer (konfiguriert in cfg/allgemein.cfg, Sektion GetPos-Layer_Tunnel):
Busverteiler-Kennzeichnung0-0_Tunnel
Variante B: Symbol (INSERT-Block)
Ein INSERT-Block mit dem Attribut NAME, dessen Wert einem Tunnel-Pattern entspricht.
Tunnel-Patterns (Regex, konfiguriert in cfg/BMK.cfg, Sektion Tunnel-Pattern):
| Pattern | Beispiel |
|---|---|
Tunnel\d+ |
Tunnel1, Tunnel2 |
Tunnel_\d+ |
Tunnel_1, Tunnel_2 |
Tunnel-\d+ |
Tunnel-1, Tunnel-2 |
TUNNEL\d+ |
TUNNEL1, TUNNEL2 |
Attribute:
| Attribut-Tag | Bedeutung | Beispiel | Pflicht |
|---|---|---|---|
NAME |
Tunnelname | Tunnel1 |
Ja |
LAENGE |
Tunnellaenge in Metern | 5 |
Nein (Default: 5) |
REALE_POSITION |
Positionsmarker | x |
Nein |
Pro Tunnel muessen genau 2 Symbole platziert werden (Ein- und Ausgang).
Fehler bei Tunnel-Definition:
- Weniger als 2 Positionen: Fehler
missing_tunnel - Mehr als 2 Positionen: Fehler
overdefined_tunnel - Fehlende Laenge: Warnung, Default 5m wird verwendet
4. Kabelpritschen (Racks)
Kabelpritschen werden als LWPOLYLINE oder POLYLINE auf bestimmten Layern erkannt.
Es sind keine Attribute oder Texte noetig - nur der Layer entscheidet.
Erlaubte Layer (konfiguriert in cfg/allgemein.cfg, Sektion GetPos-Layer_Racks):
| Layer | Beschreibung |
|---|---|
PRITSCHE_100-60 |
Standard 100x60 |
PRITSCHE_100-60-SCHRAFF |
Standard 100x60 schraffiert |
PRITSCHE_200-60 |
Standard 200x60 |
PRITSCHE_200-60_ILS |
ILS 200x60 |
PRITSCHE_200-60_OMNIFLO |
Omniflo 200x60 |
0-0_ILS_PRITSCHE_200-60_storage_Level1 |
ILS Storage Level 1 |
0-0_ILS_PRITSCHE_200-60_storage_Level2 |
ILS Storage Level 2 |
0-0_ILS_PRITSCHE_200-60_Workstation |
ILS Workstation |
0-0_ILS_Pritsche_200-60_AMR |
ILS AMR |
0-0_ILS_PRITSCHE_200-60_Highway |
ILS Highway |
0-0_ILS_Pritsche_200-60_Inbound |
ILS Inbound |
0-0_Omniflo_Pritsche_200-60_Workstation-Outbound |
Omniflo Workstation Outbound |
0-0_Omniflo_Pritsche_200-60_outbound |
Omniflo Outbound |
0-0_Omniflo_Pritsche_200-60_AMR |
Omniflo AMR |
0-0_Omniflo_Pritsche_200-60_Highway |
Omniflo Highway |
Validierung: Wenn die Z-Koordinaten aller Racks mehr als 2000mm auseinanderliegen, wird eine Warnung ausgegeben (Schwellwert konfigurierbar in cfg/allgemein.cfg, Sektion Racks, Schluessel MaximalTotalHeightDifferences).
5. Zusammenfassung: Was muss im Layout vorhanden sein?
| Element | Erkennungsart | Mindestangaben |
|---|---|---|
| Sensor/Motor | INSERT-Block | NAME (oder IO+B), ARTINR, KENNZEICHNUNG |
| Unterverteiler | MTEXT oder INSERT-Block | Text: -UH01 auf richtigem Layer / Block: NAME = A01+UH01 |
| Tunnel | MTEXT oder INSERT-Block | Text: TUNNEL1-5 (2x) / Block: NAME = Tunnel1, LAENGE = 5 (2x) |
| Kabelpritsche | LWPOLYLINE/POLYLINE | Auf richtigem Layer gezeichnet |
6. Funktionsreferenz (getpositions.py)
Uebersicht der zentralen Funktionen, die die Erkennung durchfuehren.
Sensoren / Equipment
| Funktion | Zeile | Aufgabe |
|---|---|---|
get_attributes_of_insert(d_insert, d_pos) |
~76 | Extrahiert ID, Typ und Position aus einem einzelnen INSERT-Block. Prueft zuerst IO, dann NAME, dann B. Bei REALE_POSITION='x' wird der Mittelpunkt aus Marker-Geometrie berechnet (Breite/Hoehe aus Config). Gibt (dict, id, typ) zurueck. |
extract_input_positions(all_inserts, all_positions, error_collector) |
~221 | Hauptfunktion: Iteriert ueber alle Bloecke, ruft get_attributes_of_insert() auf, trennt Sensoren von Schaltschrankelementen anhand des Praefixes. Fuehrt Block-Zusammenfuehrung via CompareBuffer durch. |
allocate_blocks_together(...) |
~329 | Fuehrt die Zusammenfuehrung von Dual-Bloecken durch (Legacy). Nutzt CompareBuffer.positions_are_close() mit 1000mm Toleranz. |
Unterverteiler
| Funktion | Zeile | Aufgabe |
|---|---|---|
get_subdistributor_positions_from_entities(entities, dist2sensors) |
~547 | Text-Erkennung: Iteriert ueber MTEXT-Entities auf erlaubten Layern. Sucht nach -{name} oder +{name} im Text. Gibt {distname: (x, y)} zurueck. |
get_subdistributor_positions_from_symbols(all_inserts, all_positions, dist2sensors) |
~472 | Symbol-Erkennung: Iteriert ueber alle INSERT-Bloecke mit NAME-Attribut. Prueft NAME gegen Cabinet-Patterns aus BMK.cfg. Ruft get_subdistributor_position_of_symbol() fuer die Positionsextraktion auf. |
get_subdistributor_position_of_symbol(d_insert, d_pos) |
~413 | Hilfsfunktion: Extrahiert Position aus einem einzelnen Unterverteiler-Block. Beruecksichtigt REALE_POSITION fuer Mittelpunktberechnung. Gibt (dict, id) zurueck. |
Tunnel
| Funktion | Zeile | Aufgabe |
|---|---|---|
get_tunnel_positions_from_entities(entities) |
~574 | Text-Erkennung: Iteriert ueber MTEXT-Entities auf erlaubten Layern. Regex (TUNNEL\d+)-(\d+) extrahiert Name und Laenge. Sammelt alle Positionen pro Tunnelname. |
get_tunnel_positions_from_symbols(all_inserts, all_positions, error_collector) |
~493 | Symbol-Erkennung: Iteriert ueber alle INSERT-Bloecke mit NAME-Attribut. Prueft NAME gegen Tunnel-Patterns aus BMK.cfg. Liest LAENGE-Attribut (Default: 5m). Warnung bei fehlender Laenge. |
get_tunnel_position_of_symbol(d_insert, d_pos) |
~441 | Hilfsfunktion: Extrahiert Position und Laenge aus einem einzelnen Tunnel-Block. Beruecksichtigt REALE_POSITION. Gibt (dict, id) zurueck. |
Kabelpritschen
| Funktion | Zeile | Aufgabe |
|---|---|---|
get_rack_positions(msp) |
~614 | Sucht LWPOLYLINE und POLYLINE auf erlaubten Layern. Nummeriert Racks automatisch (Rack_1, Rack_2, ...). Delegiert an handle_lwpolyline() bzw. handle_polyline(). |
handle_lwpolyline(entity, rack_key, ret) |
~636 | Verarbeitet 2D-Polylinien. Z-Wert kommt global aus elevation. |
handle_polyline(entity, rack_key, ret) |
~644 | Verarbeitet 3D-Polylinien. Jeder Vertex hat individuelle x/y/z-Koordinaten. |
check_rack_z_coordinates(res_racks, error_collector, config) |
~654 | Validierung: Prueft ob Z-Koordinaten-Differenz den Schwellwert uebersteigt. |
Erkennungsablauf im Hauptprogramm
1. DXF laden: get_dxf_file() -> msp
2. Alle Bloecke extrahieren: attribs_to_dicts(msp) -> all_inserts, all_positions
3. Sensoren: extract_input_positions(all_inserts, all_positions)
4. Mappings: create_mappings(res_sens) -> sensor2unterverteiler
5. Unterverteiler (Text): get_subdistributor_positions_from_entities(msp.query('MTEXT'))
6. Unterverteiler (Symbol): get_subdistributor_positions_from_symbols(all_inserts, all_positions)
7. Tunnel (Text): get_tunnel_positions_from_entities(msp.query('MTEXT'))
8. Tunnel (Symbol): get_tunnel_positions_from_symbols(all_inserts, all_positions)
9. Racks: get_rack_positions(msp)
7. Konfigurationsdateien
| Datei | Inhalt |
|---|---|
cfg/allgemein.cfg |
Layer-Zuordnungen, Geometrie-Parameter, Toleranzen |
cfg/BMK.cfg |
Geraete-Praefixe, Cabinet-Patterns, Tunnel-Patterns, Kabelzuordnungen |
cfg/kabel.cfg |
SIVAS-Artikelnummern nach Kabeltyp und Laenge |
cfg/bezeichner.cfg |
Artikelnummer-Beschreibungen |