Compare commits

...

30 Commits

Author SHA1 Message Date
g.jahn cd6b9dc31f in BMK Liste Sensoren hinzugefügt 827072102 / 400101729 / 200000525
Verb.Leitung hinzugefügt
Sensor Kabel ergänzt
2026-06-23 15:02:22 +02:00
g.jahn f4dac5677e Doppelbügelerkennung neue Kabelzuweisung 2026-06-22 10:20:42 +02:00
g.jahn 8d0915b97e Kabelzuordnung 790000213 Doppelbügelerkennung geändert 2026-06-22 10:09:48 +02:00
g.jahn 4a4cdcacc6 Bezeichnung in 721002008 geändert 2026-06-22 09:36:04 +02:00
g.jahn db9653286d Sensor für Doppelbügelerkennung eingetragen 790000213 2026-06-22 09:19:06 +02:00
m.stangl 50609f80cf Symboltabelle um Encoder und Scanner ergänzt in Doku 2026-06-18 12:18:42 +02:00
m.stangl 8c11d15494 Verweis auf die Symbole und deren Aufbau noch dazu 2026-06-18 12:12:37 +02:00
m.stangl b6ab35d8be Abschnitt in der ioconverter Anwenderdoku noch genauer beschrieben 2026-06-18 12:07:27 +02:00
m.stangl eca5a82644 eigene Doku für iocnonvertert gebaut 2026-06-18 12:01:03 +02:00
m.stangl 046bcf7290 kleinere Berichtigungen noch im Readme.md 2026-06-18 11:49:35 +02:00
m.stangl a1d86500f2 Icons etwas grösser gemacht 2026-06-18 11:46:56 +02:00
m.stangl bed533e66b icons noch in die Vorschau des Reamde.md mit rein 2026-06-18 11:41:29 +02:00
m.stangl 64506684a2 Claude.md aktualisiert. Einfaches Readme.md für die gitea Vorschaug gebaut. Doku aktualisiert 2026-06-18 11:36:45 +02:00
m.stangl e157acf77e nach den Encoder Symbolen muss in Zukunft auch gesucht werden, wenn man die Kabel dazu möchte 2026-06-18 11:03:06 +02:00
m.stangl 5e7880a3ad Scannerkabel und Encoder Kabel nicht nur speziell auf eine SivasNummer definieren, sondern generell. Sonst fehlt der Fallback, falls eine andere Sivasnummer im Symbol steht 2026-06-18 10:44:39 +02:00
m.stangl 45c8973975 Kleiner Fix, falls ein Leerzeichen vom Sivas mitkommt, wird die Datei nicht gefunden. 2026-06-18 10:43:13 +02:00
g.jahn 594abb8b2e Encoder hinzugefügt 2026-06-18 10:05:47 +02:00
g.jahn d1ab663ff5 BX HINZUGEFÜGT 2026-06-18 09:59:14 +02:00
g.jahn 437c6d23fd Ventilkabel eingetragen [WD_Q-929012603] mit Kabel 2026-06-17 13:35:57 +02:00
g.jahn cfe1104c5c [WD_I-200000375] Sensorkabel in Kabel.cfg eingetragen 2026-06-17 13:16:51 +02:00
g.jahn 78d6edd6a8 Ventilkabel eingetragen in BMK.cfg MB-929012603 = WD_Q-929012603 2026-06-17 11:43:48 +02:00
g.jahn 4956525f24 Teilenummer 929012603 in [WD_Q-929012603] eingetragen 2026-06-17 10:23:16 +02:00
g.jahn 676429c053 929012603 - WEGEVENT.5/2 MONOSTABIL SY5120-5WAOU-C6F-Q in Bezeichner.cfg und im Kabel.cfg [WD_I-929012603] hinzugefügt. 2026-06-16 14:43:21 +02:00
g.jahn f868032b67 lAYER VON ILS_Encoder-800 eingetragen 2026-06-11 12:55:10 +02:00
g.jahn 8c98f99d39 noch fehlende Layer Omniflo und Flex Layer eingetragen. 2026-06-11 12:49:53 +02:00
g.jahn e07968981b Kabelbezeichnung WF_BX auf WF_B geändert 2026-06-10 08:07:42 +02:00
g.jahn b0af6f73dc BMK umbennant, BX = WF_B, WD_I zu BX = WF_BX, WD_I 2026-06-09 13:03:18 +02:00
g.jahn 143d790a1d [WF_BX-829534306] Scannerkabel zugeordnet 2026-06-09 12:54:15 +02:00
g.jahn 28dc81d21f Merge branch 'main' of http://gitea.schoenenberger.de/mistangl/kabellaengen 2026-04-29 10:50:28 +02:00
g.jahn e3be04ec39 ILS Layer hinzugefügt von den neuen Symbole;
790821103 = SCHALTSCHRANK 1200x2000x400 KPL. hinzugefügt
2026-04-29 10:49:30 +02:00
12 changed files with 826 additions and 82 deletions
+298
View File
@@ -0,0 +1,298 @@
# CLAUDE.md
This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.
## Overview
This is a Python-based cable routing automation tool for industrial plant layouts. The system reads DXF files containing equipment positions and cable trays, calculates optimal cable paths using graph algorithms, and generates cable lists with SIVAS article numbers for procurement.
## Architecture
The codebase follows a modular three-stage pipeline:
1. **Position Extraction** ([getpositions.py](lib/getpositions.py)) - Extracts equipment positions and cable tray geometries from DXF files
2. **Route Calculation** ([routing.py](lib/routing.py)) - Builds graph models and calculates shortest paths between equipment and distributors
3. **Output Generation** ([drawdxf.py](lib/drawdxf.py)) - Creates DXF files with cable paths and Excel lists with cable specifications
### Pipeline Data Flow
```
DXF file
→ getpositions.py → *_positionsdraw.json (positions, racks, distributors, mappings)
→ routing.py → *_todraw.json (cable routes with coordinates and lengths)
→ drawdxf.py → *.dxf + *.xlsx + BOM (final output files)
```
The JSON intermediate files serve as interfaces between stages and are valuable for debugging. Each stage can be run independently.
### Workflow Modes
The system supports four primary workflows:
1. **Full Cable Routing** (`getexdraw.bat`) - Complete pipeline from DXF input to cable paths and BOMs
2. **I/O Conversion** (`ioconverter.bat`) - Converts DXF equipment data to Excel formats for TIA, WSCAD, and other systems
3. **Text Extraction** (`extract.bat`) - Extracts all TEXT and MTEXT objects from DXF files to multiple formats (Excel, JSON, Text) for translation purposes
4. **Translation** (`tr2dxf.bat`, `tr2dxf_cs.bat`, etc.) - Translates DXF text content into target languages (Czech, English, French, Italian, Spanish)
### Core Modules
- **[plant.py](lib/plant.py)** - Main business logic containing the `Anlage` class that models industrial plants, manages equipment connections, and implements graph-based routing algorithms
- **[model.py](lib/model.py)** - Data classes for points, equipment, distributors, and cable trays using dataclasses and dacite
- **[graphbuild.py](lib/graphbuild.py)** - Graph construction utilities for network topology
- **[linesweep.py](lib/linesweep.py)** - Geometric algorithms for line intersection detection
### Utility Modules
- **[error_collector.py](lib/error_collector.py)** - Centralized error/warning collection system with two severity levels; used across getpositions and drawdxf
- **[utils.py](lib/utils.py)** - Common utility functions: file I/O, environment variable checks, JSON operations, DXF file handling, dictionary merging
- **[updateconfignames.py](lib/updateconfignames.py)** - Updates SIVAS article descriptions in `bezeichner.cfg` from external SIVAS database exports (CSV files in `data/`)
- **[flags.py](lib/flags.py)** - Icon/flag generation using PIL for language flags (EN, FR, IT, ES, CS)
### Export & Conversion Modules
- **[portalexport.py](lib/portalexport.py)** - Exports equipment I/O data to Excel formats for TIA Portal and WSCAD
- **[ioconverter.py](lib/ioconverter.py)** - `ExcelConverter` class for converting I/O lists with input/output identifier mappings
- **[translate.py](lib/translate.py)** - Comprehensive text extraction/translation: extracts TEXT, MTEXT, and block attributes from DXF/DWG files; supports Excel, JSON, Text export formats
### DXF Utility Modules
- **[create_dxf_symbols.py](lib/create_dxf_symbols.py)** - Creates DXF symbol blocks (grounding, switchboard, subdistribution, motor symbols)
- **[create_example.py](lib/create_example.py)** - `TestDataGenerator` for generating synthetic test DXF files with defined layouts
- **[create_numbers.py](lib/create_numbers.py)** - Generates/updates numbered symbols in DXF files based on RENAMER layer configuration
### Configuration System
The system uses configuration files in `cfg/`:
- **`BMK.cfg`** - Equipment identification codes, cable type mappings, routing inclusion/exclusion rules, cabinet/tunnel patterns, length adjustments
- **`kabel.cfg`** - SIVAS article number mappings for different cable types and lengths (sections like `[MA]`, `[WD_Q]`, `[WD_I]`, etc.)
- **`allgemein.cfg`** - Layer names for racks/distributors/tunnels, geometric tolerances, connection parameters
- **`bezeichner.cfg`** - Article number descriptions, auto-populated from SIVAS database
- **`translator.cfg`** - Text filtering for translation (wildcard and regex ignore patterns)
- **`enumerate.cfg`** - Symbol enumeration settings (RENAMER layers, polyline distances)
- **`translation/CS.cfg`** - Czech language translation key mappings
**Important**: When adding a new equipment prefix, it must be added to **both** `[Routing-Include]` and `[Cable-Mapping]` in `BMK.cfg`, and the corresponding cable section must exist in `kabel.cfg`.
**Article-specific mappings**: `[Cable-Mapping]` supports article-number-specific entries like `MB-929012603 = WD_Q-929012603` alongside generic prefix mappings like `MA = MA`. The specific entry takes precedence when the sensor's article number matches.
**Current prefixes in `[Routing-Include]`**: MA, MB, QM, BG, BP, BX, PO, SF, PF, GF
## Common Commands
### Main Execution
```bash
# Process a DXF file for cable routing (drag-and-drop onto desktop shortcut in production)
bin\getexdraw.bat <filename.dxf>
# Convert DXF to I/O lists for TIA Portal, WSCAD, etc.
bin\ioconverter.bat <filename.dxf>
# Extract text from DXF files for translation
bin\extract.bat <filename.dxf>
# Translate DXF to Czech (also: tr2dxf_en, tr2dxf_fr, tr2dxf_it, tr2dxf_es)
bin\tr2dxf_cs.bat <filename.dxf>
# PowerShell alternative for getexdraw
bin\getexdraw.ps1 <filename.dxf>
# Manual execution of pipeline stages
bin\getpositions.bat --filename <file.dxf> -s -r -w <output.json>
bin\routing.bat --filename <positions.json> -w <todraw.json>
bin\draw_dxf.bat --filename <todraw.json> --new <output.dxf> -x <output.xlsx>
bin\portalexport.bat --filename <positions.json> --outname <basename>
bin\translate.bat --filename <file.dxf> --extract --export-type excel,json --outname <output>
```
**Note**: All `.bat` scripts have corresponding `.sh` equivalents for Linux/macOS systems.
### Development and Testing
```bash
# Install Python dependencies
bin\install_py.bat
# Run automated test suite (all test files)
bin\run_tests.bat
# Run test for a single file (most common for development)
bin\run_test.bat <testname>
bin\run_test.bat easy
bin\run_test.bat easy --clean
# Run tests for specific file (alternative syntax)
bin\run_tests.bat --file <testname>
# Run tests in different modes
bin\run_test.bat <testname> --ioconverter
bin\run_test.bat <testname> --translation
bin\run_tests.bat --ioconverter
# Create reference files from current outputs
bin\run_tests.bat --create-references
# Clean up work folders after tests
bin\run_tests.bat --clean
# Run unit tests
bin\run_unittests.bat
# Individual component testing
python lib\getpositions.py --help
python lib\routing.py --graph # Shows visual graph
python lib\drawdxf.py --help
```
### Production Deployment
```bash
# Create desktop shortcuts with drag-and-drop icons for all tools
bin\dropItem_create.bat
# Remove desktop shortcuts
bin\dropItem_remove.bat
```
### Configuration Management
```bash
# Update SIVAS article descriptions
python lib\updateconfignames.py
# Convert between formats
python lib\ioconverter.py
```
## Development Guidelines
### Code Style
- Use German comments and variable names for consistency with existing codebase
- Follow dataclass patterns established in [model.py](lib/model.py)
- Maintain separation between geometric operations (Shapely) and graph algorithms (NetworkX)
### Configuration Changes
- Always update corresponding `.cfg` files when adding new equipment types or cable categories
- A new equipment prefix needs entries in: `[Routing-Include]`, `[Cable-Mapping]` (both in `BMK.cfg`), and a matching section in `kabel.cfg`
- Test configuration changes with sample DXF files in [testdata/](testdata/) directory
- Configuration files use Windows INI format with specific section naming conventions
### Error Handling
The system uses [error_collector.py](lib/error_collector.py) for centralized error/warning collection with two severity levels:
- **Errors** (critical issues that affect output correctness):
- Equipment connection failures (distance tolerances)
- Missing SIVAS article numbers
- Invalid DXF block attributes
- Graph routing failures
- Missing or overdefined tunnel positions
- Duplicate equipment IDs
- **Warnings** (potential issues, processing continues):
- Missing or incomplete block attributes
- Invalid KENNZEICHNUNG format
- Missing tunnel length specifications
All issues are collected in the `warnings` section of output JSON files (e.g., `*_positionsdraw.json`). Critical errors also generate separate `*_errors.json` files. See [doc/Anwenderdoku_kurz.md](doc/Anwenderdoku_kurz.md) for detailed error descriptions and resolution steps.
### Config Validation
On startup, `getpositions.py` validates configuration consistency and reports:
- Prefixes in `[Routing-Include]` without a `[Cable-Mapping]` entry
- Cable sections referenced in `[Cable-Mapping]` that are missing from `kabel.cfg`
### Testing
The project includes a comprehensive automated test suite:
- Test DXF files stored in [testdata/](testdata/) (e.g., `easy.dxf`, `easy_sps.dxf`, `easy_hoehe.dxf`, `easy_3tunnels.dxf`, `Erdungsbsp.dxf`)
- Reference JSON outputs stored alongside test DXF files
- Test runner ([run_tests.py](lib/run_tests.py)) compares generated outputs against references with diff reporting
- Supports `getexdraw`, `ioconverter`, and `translate` workflow testing
- Visual graph debugging available with `--graph` flag in routing
- Test cases cover: standard routing, SPS integration, height differences, tunnel overdefinition, grounding, duplicate IDs, translation
- Unit tests in `lib/` (`error_collector_test.py`, `utils_test.py`, `flags_test.py`, `create_numbers_test.py`, `getpositions_test.py`)
- Additional edge case tests in [tests/](tests/) directory (e.g., `test_ioconverter_errors.py`)
## File Structure
```text
bin/ # Batch scripts (.bat) and shell scripts (.sh) for all workflows
cfg/ # Configuration files (BMK, cable mappings, tolerances, translation filters)
cfg/translation/# Language-specific translation configs (CS.cfg)
lib/ # Python modules (core pipeline, utilities, tests)
work/ # Working directory for processing results (generated output)
testdata/ # Test DXF files and reference outputs for automated testing
tests/ # Additional test files and edge case test data
doc/ # Comprehensive German documentation (Markdown + PDF)
doc/img/Icons/ # Icons for desktop shortcuts
data/ # SIVAS article number CSV reference files (auto-populated)
translation/ # Translation configurations
```
## Dependencies
Key Python packages (see [lib/requirements.txt](lib/requirements.txt)):
- `ezdxf` - DXF file reading/writing
- `shapely` - Geometric operations
- `networkx` - Graph algorithms
- `openpyxl` - Excel output generation
- `pandas` - Data manipulation
- `matplotlib` - Graph visualization
- `dacite` - Dataclass conversion utilities
- `PyMuPDF` - PDF processing capabilities
- `pillow` - Image processing (flag/icon generation)
- `pytest` - Testing framework
## Output Files
### Cable Routing Workflow (getexdraw)
- `*_cables.dxf` - DXF with drawn cable paths
- `*_cables.xlsx` - Cable list with lengths and SIVAS numbers
- `*_BOM.xlsx` - Complete bill of materials
- `*_positionsdraw.json` - Intermediate position data with routing info
- `*_todraw.json` - Intermediate routing data for drawing
- `*_errors.json` - Error report (if validation fails)
### I/O Conversion Workflow (ioconverter)
- `*-TIA.xlsx` - Excel export for TIA Portal
- `*-WSCAD.xlsx` - Excel export for WSCAD
- `*_positionsconv.json` - Intermediate position data for conversion
- `*_errors.json` - Error report (if validation fails)
### Text Extraction Workflow (extract)
- `*_texts.xlsx` - Excel file with all TEXT and MTEXT entities from DXF for translation
### Translation Workflow (tr2dxf)
- Translated DXF files with text replaced in target language
## Environment Variables
The system uses environment variables defined in [bin/setenv.bat](bin/setenv.bat):
- `PROJECT` - Root directory of the project
- `PROJECT_BIN` - Binary/script directory
- `PROJECT_CFG` - Configuration directory
- `PROJECT_DOC` - Documentation directory
- `PROJECT_LIB` - Python library directory
- `PROJECT_DATA` - SIVAS reference data directory
- `PROJECT_WORK` - Working directory for outputs
- `PROJECT_TEST` - Test data directory (testdata/)
- `PROJECT_LOG` - Log directory
- `PROJECT_TRANSLATION` - Translation directory
- `PROJECT_IO_RESULTS` - Network location for I/O converter results
- `PROJECT_BOM_RESULTS` - Network location for BOM results
- `SIVAS_TEILESTAMM` - Path to SIVAS parts database export tool
- `SIVAS_EXCEL_EXPORT_DIR` - Output directory for SIVAS data exports
- `INSTALL_DIR` - Desktop shortcut installation location
Local overrides can be placed in `bin/_setenv.bat` (not tracked in git).
+114
View File
@@ -0,0 +1,114 @@
# Kabeltool - Automatisierte Kabellängenermittlung
Automatisiertes Toolset zur Ermittlung von Kabellängen in industriellen Anlagenlayouts. Aus einer DXF-Zeichnung werden Gerätepositionen und Kabeltrassen extrahiert, optimale Kabelwege berechnet und Stücklisten mit SIVAS-Artikelnummern erzeugt.
Die Übersetzungswerkzeuge ermöglichen den einfachen Transfer der .dxf Dateien in eine andere Sprache.
## Liste der vorhandenen Werkzeuge
| | Workflow | Skript | Beschreibung | Ausgabe |
|---|----------|--------|--------------|---------|
| <img src="doc/img/Icons/Icon_getex.png" width="128"> | **Cable Routing** | `getexdraw.bat` | Vollständige Kabelberechnung mit Wegführung und Stücklisten | `*_cables.dxf`, `*_cables.xlsx`, `*_BOM.xlsx` |
| <img src="doc/img/Icons/Icon_portal.png" width="128"> | **I/O Conversion** | `ioconverter.bat` | Export von Gerätelisten für TIA Portal, WSCAD u.a. | `*-TIA.xlsx`, `*-WSCAD.xlsx` |
| <img src="doc/img/Icons/dxf2txt.png" width="128"> | **Text Extraction** | `extract.bat` | Textextraktion aus DXF für Übersetzung | `*_texts.xlsx`, `*_texts.json` |
| <img src="doc/img/Icons/dxfCs.png" width="128"> | **Translation** | `tr2dxf_<lang>.bat` | Übersetzung von DXF-Texten (CS, EN, FR, IT, ES) | `*_<lang>.dxf` |
## Verwendung
DXF-Datei per **Drag & Drop** auf die Desktop-Verknüpfung ziehen (erstellt via `bin\dropItem_create.bat`) oder direkt aufrufen:
```bash
bin\getexdraw.bat <meine_anlage.dxf>
```
## Pipelines
### Cable Routing (`getexdraw.bat`)
```text
DXF-Datei
1. getpositions.py --> Positionen extrahieren --> *_positionsdraw.json
2. routing.py --> Kabelwege berechnen --> *_todraw.json
3. drawdxf.py --> DXF + Excel erzeugen --> *_cables.dxf, *_cables.xlsx, *_BOM.xlsx
```
### I/O Conversion (`ioconverter.bat`)
```text
DXF-Datei
1. getpositions.py --> Positionen extrahieren --> *_positionsconv.json
2. portalexport.py --> Excel-Export erzeugen --> *-TIA.xlsx, *-WSCAD.xlsx, *-EA.xlsx
```
### Text Extraction & Translation (`extract.bat` / `tr2dxf_<lang>.bat`)
```text
DXF-Datei
1. translate.py --extract --> Texte extrahieren --> *_texts.xlsx, *_texts.json
2. translate.py --translate --> Texte übersetzen --> *_<lang>.dxf
```
## Installation
```bash
# Repository klonen
git clone http://gitea.schoenenberger.de/mistangl/kabellaengen.git
# Python-Abhängigkeiten installieren
bin\install_py.bat
# Desktop-Verknüpfungen erstellen
bin\dropItem_create.bat
```
**Voraussetzung**: Python 3.x (lokal installiert oder via `NETWORK_INTERPRETER_PATH` Umgebungsvariable).
## Konfiguration
Konfigurationsdateien in `cfg/` steuern das Verhalten:
| Datei | Zweck |
|-------|-------|
| `allgemein.cfg` | Layernamen, geometrische Toleranzen |
| `BMK.cfg` | Betriebsmittelkennzeichnung, Kabeltyp-Zuordnung, Routing-Regeln |
| `kabel.cfg` | SIVAS-Artikelnummern je Kabeltyp und Kabellänge |
| `bezeichner.cfg` | Artikelnummern-Bezeichner (automatisch aus SIVAS ergänzt) |
> **Hinweis**: Neuer BMK-Prefix muss in `BMK.cfg` unter `[Routing-Include]` **und** `[Cable-Mapping]` eingetragen werden. Die zugewiesene Kabel-Sektion muss in `kabel.cfg` existieren.
## Tests
```bash
# Alle Tests
bin\run_tests.bat
# Einzeltest
bin\run_test.bat easy
# Unit-Tests
bin\run_unittests.bat
```
## Projektstruktur
```text
bin/ Batch- und Shell-Skripte
cfg/ Konfigurationsdateien
lib/ Python-Module
work/ Arbeitsverzeichnis (Ausgabedateien)
testdata/ Test-DXF-Dateien und Referenzdaten
data/ SIVAS-Artikeldaten (CSV)
doc/ Dokumentation (Deutsch)
```
## Dokumentation
- [Anwenderdokumentation](doc/Anwenderdoku.md) - Vollständige Anleitung mit Fehlerbehandlung
- [Kurzanleitung / Fehlerfälle](doc/Anwenderdoku_kurz.md) - Kompakte Referenz
- [I/O Converter](doc/Anwenderdoku_ioconverter.md) - EA-Listen und TIA-Portal/WSCAD-Export
- [Übersetzungsworkflow](doc/translate.md) - Dokumentation zum Textextraktions- und Übersetzungssystem
- [Symbole](doc/Symbole_und_Benennungen.md) - Beschreibung des Aufbaus und Attribute der zu verwendenden Symbole, damit die Erkennung funktioniert
## Lizenz
Intern - Schoenenberger
+9 -2
View File
@@ -13,6 +13,7 @@ BX
PO
SF
PF
GF
# Kürzel die im Routing Prozess ignoriert werden sollen, zum Beispiel bauteile innerhalb der Schaltschränke
@@ -52,17 +53,23 @@ TUNNEL\d+
[Cable-Mapping]
# Format: PREFIX = Cable-Section[, Section2, ...]
MA = MA
MB = WD_Q
MB-929012603 = WD_Q-929012603
QM = WD_Q
BG = WD_I
BG-829422026 = WD_I-829422026
BG-720002003 = WD_I-720002003
BG-822035037 = WD_I-822035037
BX = WF_B, WD_I
BG-200000375 = WD_I-200000375
BG-790000213 = WD_I-790000213
BG-200000525 = WD_I-200000525
BG-400101729 = WD_I-400101729
BG-827072102 = WD_I-827072102
BX = WF_BX, WD_I
PO = WD_PO
BP = WD_I
SF = WD_I
PF = WD_Q
GF = WF_GF
# Anpassung von berechneter kabellänge um Betrag x aufgrund von z.b. an Sensor existierenden Kabelschwänzen
+41
View File
@@ -36,6 +36,7 @@ UNTERVERTEILER
0-0_Omniflo_Busverteiler-Kennzeichnung
Schaltschrank-ILS
ILS_Schaltschrank
ILS_Busmodul
Omniflo_Schaltschrank
@@ -58,6 +59,23 @@ REALE_POSITION_IO
0-0_ILS_EINGANG
0-0_ILS_AUSGANG
0-0_ILS_MOTOR
ILS_Eingang
ILS_Eingang-F
ILS_BT-Eingang
ILS_BT-Eingang-F
ILS_BT-Kennzeichnung
ILS_Schaltschrank
ILS_Schaltschrank-Eingang
ILS_Schaltschrank-Eingang-F
ILS_Ausgang
ILS_BT-Ausgang
ILS_BT-Ausgang-F
ILS_Schaltschrank-Ausgang
ILS_Schaltschrank-Ausgang-F
ILS_Motor
ILS_Scanner
ILS_A-Gruppe
ILS_Encoder-800
0-0-Omniflo_EINGANG
0-0-Omniflo_AUSGANG
0-0-Omniflo_MOTOR
@@ -80,7 +98,10 @@ MOTOR
0-0_Omniflo_AM_POT_Pritsche
POT-Erdung
Omniflo_POT-Erdung
Omniflo_Tunnel
ILS_POT-Erdung
ILS_Tunnel
Omniflo_Schaltschrank
Omniflo_Schaltschrank-Eingang
Omniflo_Schaltschrank-Ausgang
Omniflo_Schaltschrank-Eingang-F
@@ -91,6 +112,26 @@ Omniflo_Motor
Omniflo_BT-Eingang
Omniflo_BT-Ausgang
Omniflo_BT-Eingang_F
Omniflo_BT-Kennzeichnung
Omniflo_Scanner
Omniflo_Busmodul
Flex_Ausgang
Flex_Eingang
Flex_BT-Ausgang
Flex_BT-Eingang
Flex_BT-Eingang-F
Flex_BT-Kennzeichnung
Flex_Encoder-800
Flex_Motor
Flex_Scanner
Flex_Schaltschrank
Flex_Schaltschrank-Ausgang
Flex_Schaltschrank-Ausgang-F
Flex_Schaltschrank-Eingang
Flex_Schaltschrank-Eingang-F
Flex_Tunnel
Flex_POT-Erdung
+17 -3
View File
@@ -3,7 +3,7 @@
200000215 = Camera DM280 m. Halter für Trolley Id.(AP110) - BG
610554001 = Sensorhalter für WT18-3P420 oder -BG
610554002 = CPC Sensorhalter mit Reflextaster P1NH601 -BG
720002003 = SENSOR INDUK. M18x1, SA=12MM N-BÜ/NO, KABEL-150MM
720002003 = Sensor Induk. M18x1, SA=12mm N-BÜ/NO, Kabel-150mm
722001300 = Verb.-Leitung M12 St-0°/ M8 Bu-0° PUR UL/CSA 1m
722001301 = Verb.-Leitung M12 St-0°/ M8 Bu-0° PUR UL/CSA 2m
722001302 = Verb.-Leitung M12 St-0°/ M8 Bu-0° PUR UL/CSA 3m
@@ -38,6 +38,13 @@
722001357 = Verb.-Leitung M12 St-0°/ M12 Bu-0° PUR UL/CSA 30m
722001358 = Verb.-Leitung M12 St-0°/ M12 Bu-0° PUR UL/CSA 2,5m
722001359 = Verb.-Leitung M12 St-0°/ M12 Bu-0° PUR UL/CSA 40m
722001252 = Verb.-Leitung M12 St-0°/ M12 Bu-0° PUR UL/CSA 3m
722001253 = Verb.-Leitung M12 St-0°/ M12 Bu-0° PUR UL/CSA 5m
722001254 = Verb.-Leitung M12 St-0°/ M12 Bu-0° PUR UL/CSA 10m
722001255 = Verb.-Leitung M12 St-0°/ M12 Bu-0° PUR UL/CSA 15m
722001256 = Verb.-Leitung M12 St-0°/ M12 Bu-0° PUR UL/CSA 20m
722001257 = Verb.-Leitung M12 St-0°/ M12 Bu-0° PUR UL/CSA 30m
722001259 = Verb.-Leitung M12 St-0°/ M12 Bu-0° PUR UL/CSA 40m
723000013 = ADERLEITUNG H07V-K 6MM² GELB/GRÜN (RING a`100m)
725000001 = 12G1,0mm², Steuerleitung
725000002 = 12G1,0mm², Steuerleitung
@@ -133,10 +140,11 @@
829422026 = INDUKT. SENSOR LP KPL.
720002011 = Sensor Induk. M18 8mm bündig/PNP-NO/ST M12
703001017 = HILFSCHALTER MIT ZUGFEDERANSCHLUSS F. 3RV2011
790000057 = Sirius act Tableau 4 F "LM-GN+PDT-GE+LDT-BL+NA"
790000057 = SIRIUS ACT Tableau 4 F "LM-GN+PDT-GE+LDT-BL+NA"
790801501 = Busverteiler kpl. ET 200SP DI+DQ, Exact -BG
790820400 = Unterverteiler 1 800x2100x400 -BG
790821106 = SCHALTSCHRANK 2000X2100X400 (HGF) -BG
790821103 = SCHALTSCHRANK 1200x2000x400 KPL.
829434314 = PINABFRAGE LI MECHANISCH KPL.
829534306 = Camera DM280 m. Halter (ILS) - BG
829624040 = UMLENKFLANSCH-c 800 MIT INKEMENTALGEBER KPL.
@@ -148,6 +156,7 @@
829434300 = LICHTTASTER LP+SP ALS STAUMELDER, KPL.
721002006 = Lichtleiterverstärke [Erweiterungseinheit]
721002005 = Lichtleiterverstärker [Basiseinheit]
721002008 = Lichtleiterkabel_M4 2St.
700002021 = AX-KOMPAKT-SCHALTSCHRANK 600X760X210
822035037 = ROLLENSCH. KPL. 1 NO FÜR KF
822035100 = ROLLENSCH. KPL. 1NO F. AFS/ST
@@ -162,7 +171,7 @@
790002024 = TABLEAU 1-F kpl. LDT BLAU
790002026 = Bedientableau 1 F kpl "DT-grün"
790002027 = Bedientableau 2 F -kpl. "LDT-GE+NA"
790002029 = Bedientableau 6 F - kpl.(LM-GN+LM-YE+LM-RD+BLIND+
790002029 = Bedientableau 6 F - kpl.(LM-GN+LM-YE+LM-RD+BLIND+2xSW)
790002039 = Bedientableau 2 F -kpl. "LDT-KL+NA" KPL.
790002040 = Bedientableau 3 F"LDT-BL+LDT-KL+NA" KPL.
790002041 = Bedientableau 4 F kpl."LDT-BL+LDT-BL+LDT-KL+NA"
@@ -173,6 +182,11 @@
790002061 = Bedientableau 4 F -kpl. "LM-GN+PDT-GE+LDT-BL+NA"
790002064 = Bedientableau 6 F, Not-halt, Ldt-bl, Ldt gn,Blind,
790002066 = Bedientableau 2 F -kpl. "PDT-GE+KN-RAST 1-0-2"
929012603 = WEGEVENT.5/2 MONOSTABIL SY5120-5WAOU-C6F-Q
200000436 = Camera DM280 m. Halter Gefälleprofil ILS
200000478 = Vereinzeler KB-Behängung links
790000213 = DB-Automatisierung für Doppelbügelerkennung kpl.
[Missing]
+105 -1
View File
@@ -68,9 +68,80 @@
30.0=722001357
40.0=722001359
# Kabel für Sensor 790000213
# cables for sensor 790000213
[WD_I-790000213]
2.5=722001358
3.0=722001352
5.0=722001353
10.0=722001354
15.0=722001355
20.0=722001356
30.0=722001357
40.0=722001359
# Kabel für Sensor 200000525
# cables for sensor 200000525
[WD_I-200000525]
3.0=722001252
5.0=722001253
10.0=722001254
15.0=722001255
20.0=722001256
30.0=722001257
40.0=722001259
# Kabel für Sensor 400101729
# cables for sensor 400101729
[WD_I-400101729]
3.0=722001252
5.0=722001253
10.0=722001254
15.0=722001255
20.0=722001256
30.0=722001257
40.0=722001259
# Kabel für Sensor 827072102
# cables for sensor 827072102
[WD_I-827072102]
3.0=722001252
5.0=722001253
10.0=722001254
15.0=722001255
20.0=722001256
30.0=722001257
40.0=722001259
# Daten-Kabel für Scanner (Patchkabel gruen)
# Data-cable for scanners (Patchcable green)
[WF_B]
[WF_BX]
0.25=726001062
0.5=726001040
1.0=726001041
1.5=726001042
2.0=726001043
3.0=726001044
5.0=726001045
10.0=726001046
15.0=726001047
20.0=726001048
25.0=726001049
30.0=726001050
35.0=726001051
40.0=726001052
45.0=726001053
50.0=726001054
55.0=726001055
60.0=726001056
65.0=726001057
85.0=726001060
95.0=726001061
# Daten-Kabel für ENCODER (Patchkabel gruen)
# Data-cable for encoder (Patchcable green)
# ist identisch mit Scanner Kabel
[WF_GF]
0.25=726001062
0.5=726001040
1.0=726001041
@@ -96,3 +167,36 @@
[WD_PO]
100.0=723000013
# Kabel für Sensor 200000375
# cables for sensor 200000375
[WD_I-200000375]
1.0=722001330
2.0=722001331
2.5=722001338
3.0=722001332
5.0=722001333
10.0=722001334
15.0=722001335
20.0=722001336
25.0=722001337
30.0=722001339
35.0=722001340
40.0=722001341
50.0=722001342
# Kabel für Ventil 929012603
# cables for valves 929012603
[WD_Q-929012603]
1.0=722001300
2.0=722001301
2.5=722001308
3.0=722001302
5.0=722001303
10.0=722001304
15.0=722001305
20.0=722001306
25.0=722001307
30.0=722001309
35.0=722001310
40.0=722001311
50.0=722001312
+30 -54
View File
@@ -32,7 +32,7 @@
- [Warum werden manche Kabeltrassen nicht mit anderen verbunden?](#warum-werden-manche-kabeltrassen-nicht-mit-anderen-verbunden)
- [Warum verbindet das Programm den Sensor mit genau dieser Kabeltrasse?](#warum-verbindet-das-programm-den-sensor-mit-genau-dieser-kabeltrasse)
- [5. Fehlerfälle und Fehlerbehandlung](#5-fehlerfälle-und-fehlerbehandlung)
- [Allgemeine Fehler und Warnungen (beide Workflows)](#allgemeine-fehler-und-warnungen-beide-workflows)
- [Allgemeine Fehler und Warnungen](#allgemeine-fehler-und-warnungen)
- [Detaillierte Beschreibung der Warnungen (Warnings)](#detaillierte-beschreibung-der-warnungen-warnings)
- [1. `missing_attributes` (Fehlende oder unvollständige Block-Attribute)](#1-missing_attributes-fehlende-oder-unvollständige-block-attribute)
- [2. `tunnel_missing_length` (Fehlende Längenangabe bei Tunnel)](#2-tunnel_missing_length-fehlende-längenangabe-bei-tunnel)
@@ -47,9 +47,6 @@
- [Routing Errors (ERR-Routing)](#routing-errors-err-routing)
- [Tunnel Connection Errors](#tunnel-connection-errors)
- [Hinweise zur Excel-Fehlerausgabe (Cable Routing)](#hinweise-zur-excel-fehlerausgabe-cable-routing)
- [I/O Conversion Workflow - Hinweise](#io-conversion-workflow---hinweise)
- [Ausgabedateien bei Fehlern](#ausgabedateien-bei-fehlern)
- [Wichtige Hinweise](#wichtige-hinweise)
# 1. Installation des Programmes und Schnellstart-Guide
@@ -67,17 +64,6 @@ Ist Python installiert, werden per Doppelklick automatisch auf die `bin\install_
## Schnellstart und Vewendung des Programms
Das Programm bietet **drei Hauptworkflows**, die je nach Anwendungsfall eingesetzt werden:
### Workflow-Übersicht
| Workflow | Batch-Datei | Zweck | Ausgabe | Verwendete Configs |
| -------- | ----------- | ----- | ------- | ------------------ |
| **Cable Routing** | `getexdraw.bat` | Vollständige Kabelberechnung mit Längen und Stücklisten | `*_cables.dxf`, `*_cables.xlsx`, `*_BOM.xlsx` | `allgemein.cfg`, `BMK.cfg`, `kabel.cfg`, `bezeichner.cfg` |
| **I/O Conversion** | `ioconverter.bat` | Export von Gerätelisten für TIA Portal, WSCAD, etc. | `*-TIA.xlsx`, `*-WSCAD.xlsx`, u.a. | `allgemein.cfg`, `BMK.cfg` |
| **Translation** | `extract.bat` + `tr2dxf_<lang>.bat` | Textextraktion und Übersetzung von DXF-Inhalten | `*_texts.json`/`.xlsx`, `*_<lang>.dxf` | `allgemein.cfg`, `translation/*.cfg` |
**Hauptworkflow (Cable Routing):**
Im auf dem Desktop erzeugten Ordner findet sich das eigentliche Programm *create_cables*. Um das Programm auszuführen, genügt es die zu verarbeitende .**dxf-Datei** per *Drag and Drop* auf das Programm zu ziehen. Das öffnen der *Command-Shell* bestätigt den Start des Programms und der Anwender wird über den Ablauf informiert.
Die Ausgabe schreibt:
@@ -100,13 +86,13 @@ creating new .dxf ..
done
creating excel file with cable information ..
done
C:\10-Develop\kabellaengen\work\dxfdatei_BOM.xlsx
C:\10-Develop\kabellaengen\work\dxfdatei_cables.dxf
C:\10-Develop\kabellaengen\work\dxfdatei_cables.xlsx
C:\10-Develop\kabellaengen\work\dxfdatei_positions.json
C:\10-Develop\kabellaengen\work\dxfdatei_reduziert.dxf
C:\10-Develop\kabellaengen\work\dxfdatei_positionsdraw.json
C:\10-Develop\kabellaengen\work\dxfdatei_todraw.json
5 Datei(en) verschoben.
Drücken sie eine beliebige Taste . . .
Drücken Sie eine beliebige Taste . . .
```
Das Drücken einer beliebigen Taste beendet das Programm und die Ausgabe kann verwendet werden.
@@ -117,14 +103,15 @@ Verwende z.B. projekt_123.dxf statt mein projekt #1.dxf.
## Standardmäßige Ausgabe des Programms
In den Ordner auf dem Desktop in dem das Kabeltool liegt werden nach Beendigung der Berechnungen die Ausgabedateien abgelegt. Standardmäßig sind dies vier Dateien, wovon letztlich zwei für den Anwender bestimmt sind. In der nachfolgenden Liste steht der name *dxfdatei* stellvertretend für die eingegebene Datei des Benutzers.
In den Ordner auf dem Desktop in dem das Kabeltool liegt werden nach Beendigung der Berechnungen die Ausgabedateien abgelegt. Standardmäßig sind dies fünf Dateien, wovon drei für den Anwender bestimmt sind. In der nachfolgenden Liste steht der Name *dxfdatei* stellvertretend für die eingegebene Datei des Benutzers.
| Dateiname | Details |
|---------------------------|---------------------------------------------------------------------------------------------------|
| `dxfdatei_cables.dxf` | `.dxf`-Datei, **mit Kabelwegen** (z.B. für Import ins Original-Layout als eigenes Layer) und gezeichneten Racks (ggf. in 3D) |
| `dxfdatei_cables.xlsx` | **Excel-Datei** mit Kabellängen, Längenübersicht und Fehler-Übersicht |
| `dxfdatei_positions` | **Zwischendatei** (nicht für Endnutzer bestimmt) |
| `dxfdatei_todraw` | **Zwischendatei** (nicht für Endnutzer bestimmt) |
| Dateiname | Details |
|--------------------------------|---------------------------------------------------------------------------------------------------|
| `dxfdatei_cables.dxf` | `.dxf`-Datei, **mit Kabelwegen** (z.B. für Import ins Original-Layout als eigenes Layer) und gezeichneten Racks (ggf. in 3D) |
| `dxfdatei_cables.xlsx` | **Excel-Datei** mit Kabellängen, Längenübersicht und Fehler-Übersicht |
| `dxfdatei_BOM.xlsx` | **Excel-Datei** mit Gesamtstückliste und Unterverteiler-spezifischer Stückliste |
| `dxfdatei_positionsdraw.json` | **Zwischendatei** (nicht für Endnutzer bestimmt) |
| `dxfdatei_todraw.json` | **Zwischendatei** (nicht für Endnutzer bestimmt) |
### .dxf-Datei: *dxfdatei*_cables.dxf
@@ -483,8 +470,8 @@ Dieses Toolset dient der **automatisierten** und **komfortablen** Ermittlung von
- eine strukturierte `.json`-Datei mit Kabellängen und Pfadkoordinaten
- eine visuelle `.dxf`-Datei mit eingezeichneten Kabelwegen
- eine weitere .dxf-Datei mit einem reduzierten Layout (Kabeltrassen + Kabel + Unterverteiler)
- zukünftig: tabellarische Aufbereitung der Kabellängen mit SIVAS-Nummern (z.B. `.xlsx`)
- eine tabellarische Aufbereitung der Kabellängen mit SIVAS-Nummern (`.xlsx`)
- eine Stückliste (BOM) mit Gesamtübersicht und UV-spezifischer Auflistung (`.xlsx`)
## Allgemeiner Programmablauf
@@ -502,15 +489,24 @@ Die Ausgabe schreibt:
```text
C:\10-Develop\kabellaengen\bin>getexdraw.bat easy.dxf
--hole Positionen
=== Fetching Positions ===
reading file ..done
Validating given configs: Checking for inconsistency.
No Inconsistencies found. Continuing with routing process.
writing results to a json file ...
done
--erzeuge Graph mit Routing
=== Creating Graph for Routing ===
writing results to a json file ...
done
--zeichne Kabel in dxf Datei
done
=== Writing Output Files ===
Cable-Routes exported to new dxf-file
Cable-Summary exported to Excel-file
BOM exported to Excel-file
```
## Ausgabe des Toolsets
@@ -521,6 +517,7 @@ Alle drei oben genannten Teilprogramme erzeugen eine eigene Ausgabedatei. Die Er
- Die .dxf-Datei mit den Kabelwegen: `NamederEingabedatei_cables.dxf`
- Die tabellarische Aufbereitung der Kabellängen mit zugehörigen Sachnummern für jeden Sensor / Aktor: `NamederEingabedatei_cables.xlsx`
- Die Stückliste (BOM): `NamederEingabedatei_BOM.xlsx`
## Informationen zu den Einzelprogrammen
@@ -770,9 +767,9 @@ Schritt 2: Bei Ausbleiben eines Schnittpunktes -> Vergrößern des Kreises. Bei
# 5. Fehlerfälle und Fehlerbehandlung
## Allgemeine Fehler und Warnungen (beide Workflows)
## Allgemeine Fehler und Warnungen
Die folgende Tabelle zeigt alle möglichen Fehler- und Warnungstypen, die von `getpositions.py` erkannt werden. Diese gelten **für beide Workflows** (Cable Routing und I/O Conversion):
Die folgende Tabelle zeigt alle möglichen Fehler- und Warnungstypen, die von `getpositions.py` erkannt werden:
| Fehlertyp | Kategorie | Beschreibung | Ursache | Behebung |
|-----------|-----------|--------------|---------|----------|
@@ -1091,24 +1088,3 @@ Die Fehler-Worksheets in `*_cables.xlsx` erscheinen **nur**, wenn tatsächlich F
3. Führen Sie das Programm erneut aus
4. Beheben Sie verbleibende Routing-Fehler
5. Wiederholen Sie, bis keine ERR-Worksheets mehr erstellt werden
---
## I/O Conversion Workflow - Hinweise
Der **I/O Conversion Workflow** (`ioconverter.bat`) führt **keine Routing-Berechnungen** durch und erzeugt daher auch keine Routing-spezifischen Fehler. Es werden ausschließlich die **allgemeinen Fehler und Warnungen** aus `getpositions.py` gemeldet (siehe [Allgemeine Fehler und Warnungen](#allgemeine-fehler-und-warnungen-beide-workflows)).
### Ausgabedateien bei Fehlern
- `*_errors.json` - enthält alle Fehler und Warnungen aus getpositions
- `*_positionsconv.json` - Zwischenergebnis mit extrahierten Positionen
- `*_TIA.xlsx`, `*_WSCAD.xlsx`, etc. - werden auch bei Warnungen erzeugt, können aber unvollständig sein
### Wichtige Hinweise
- **Fehlende Attribute** führen dazu, dass Elemente in den Export-Dateien fehlen
- **Fehlende KENNZEICHNUNG** verhindert die korrekte Zuordnung zu Unterverteilern
- **Doppelte IDs** können zu falschen Einträgen in den Excel-Listen führen
**Empfehlung:** Beheben Sie alle Warnungen aus `*_errors.json`, bevor Sie die Export-Dateien an nachgelagerte Systeme (TIA Portal, WSCAD) übergeben.
+197
View File
@@ -0,0 +1,197 @@
# Anwenderdoku zum I/O Converter (ioconverter) <!-- omit in toc -->
- [Zweck des Programms](#zweck-des-programms)
- [Schnellstart](#schnellstart)
- [Verwendung per Drag \& Drop](#verwendung-per-drag--drop)
- [Verwendung per Kommandozeile](#verwendung-per-kommandozeile)
- [Pipeline und Programmablauf](#pipeline-und-programmablauf)
- [Ausgabedateien](#ausgabedateien)
- [EA-Liste (`*_EA.xlsx`)](#ea-liste-_eaxlsx)
- [TIA-Portal-Export (`*_TIA.xlsx`)](#tia-portal-export-_tiaxlsx)
- [WSCAD-Export (`*_WSCAD.xlsx`)](#wscad-export-_wscadxlsx)
- [Konfiguration und Symbolerkennung](#konfiguration-und-symbolerkennung)
- [Fehlerfälle und Fehlerbehandlung](#fehlerfälle-und-fehlerbehandlung)
- [Allgemeine Fehler und Warnungen](#allgemeine-fehler-und-warnungen)
- [Ausgabedateien bei Fehlern](#ausgabedateien-bei-fehlern)
- [Empfohlene Vorgehensweise](#empfohlene-vorgehensweise)
- [Erweiterte Optionen](#erweiterte-optionen)
## Zweck des Programms
Der **I/O Converter** (`ioconverter.bat`) dient der vereinfachten Ableitung von **Ein-/Ausgangslisten (EA-Listen)** sowie der **Eingabedaten für das Siemens TIA Portal** und **WSCAD** aus einer DXF-Layoutzeichnung.
Das Programm extrahiert alle relevanten Geräteinformationen (Sensoren, Aktoren, Schaltschrankelemente) aus dem Layout und erzeugt daraus formatierte Excel-Dateien, die direkt in die jeweiligen Zielsysteme importiert werden können. Das Routing und die Kabelberechnung entfallen dabei vollständig - es geht ausschließlich um die **Geräte- und IO-Daten**.
## Schnellstart
### Verwendung per Drag & Drop
Im Desktop-Ordner *Kabeltool* (erstellt via `bin\dropItem_create.bat`) befindet sich die Verknüpfung *io_converter*. Die zu verarbeitende **.dxf-Datei** einfach per **Drag & Drop** auf diese Verknüpfung ziehen.
> [!IMPORTANT]
> Der Dateiname darf **keine Leerzeichen oder Sonderzeichen** enthalten.
> Verwende z. B. `projekt_123.dxf` statt `mein projekt #1.dxf`.
### Verwendung per Kommandozeile
```bash
bin\ioconverter.bat <meine_anlage.dxf>
```
Die Ausgabe schreibt:
```text
=== Fetching Positions ===
...
=== Creating Excel Files for TIA, WSCAD, .. ===
Export 'EA' erfolgreich: ...\work\meine_anlage_EA.xlsx
Export 'TIA' erfolgreich: ...\work\meine_anlage_TIA.xlsx
Export 'WSCAD' erfolgreich: ...\work\meine_anlage_WSCAD.xlsx
```
Die erzeugten Dateien werden automatisch in das Ergebnisverzeichnis (`PROJECT_IO_RESULTS`) verschoben.
## Pipeline und Programmablauf
Der I/O Converter arbeitet in zwei Schritten:
```text
DXF-Datei
1. getpositions.py --> Positionen und Attribute extrahieren --> *_positionsconv.json
2. portalexport.py --> Excel-Export erzeugen --> *_EA.xlsx, *_TIA.xlsx, *_WSCAD.xlsx
```
1. **Positionsextraktion** (`getpositions.py`): Liest die DXF-Datei ein und extrahiert alle Blöcke mit ihren Attributen (IO, SPS, KENNZEICHNUNG, BEZEICHNUNG, VERW, TEXT-D/E/ES/F, ARTINR). Das Ergebnis wird als `*_positionsconv.json` gespeichert.
2. **Excel-Export** (`portalexport.py`): Liest die JSON-Zwischendatei und erzeugt daraus die Excel-Dateien in den gewünschten Formaten. Die Daten werden dabei nach SPS-Nummer gruppiert - pro SPS entsteht ein eigener Satz Ausgabedateien (z.B. `anlage-SPS1_TIA.xlsx`, `anlage-SPS2_TIA.xlsx`).
## Ausgabedateien
Standardmäßig werden **drei Excel-Dateien** pro SPS erzeugt:
### EA-Liste (`*_EA.xlsx`)
Eine einfache Übersicht aller Ein- und Ausgänge. Die Datei enthält folgende Worksheets:
**Ein-, Ausgaenge**: Listet alle erkannten Eingänge und Ausgänge mit Name, Kommentar (Bezeichnung) und Bezug (Kennzeichnung) auf. Die Klassifizierung in Ein- oder Ausgang erfolgt automatisch anhand der Identifier aus dem Block (z.B. DI, FDI = Eingang; DQ, K, M = Ausgang).
**Duplikate / Errors**: Falls doppelte Namen oder fehlerhafte Einträge erkannt werden, werden diese in separaten Worksheets aufgeführt.
### TIA-Portal-Export (`*_TIA.xlsx`)
Im TIA-Portal-Importformat mit folgenden Worksheets:
**PLC Tags**: Enthält die Spalten `Name`, `Path`, `Data Type`, `Logical Address`, `Comment`, `Hmi Visible`, `Hmi Accessible`, `Hmi Writeable`, `Typeobject ID`, `Version ID`. Diese Datei kann direkt in das Siemens TIA Portal importiert werden.
**Constants**: Enthält Konstanten mit `Name`, `Path`, `Data Type`, `Value`, `Comment`.
### WSCAD-Export (`*_WSCAD.xlsx`)
Im WSCAD-Importformat mit den Spalten `Anschluss`, `Kommentar`, `Symboltext`, `Bezug`, `Sondertext 1-8`. Der Export enthält standardmäßig Bezugsinformationen. Mit der Option `--no_bezug` kann der Export ohne Bezüge erstellt werden.
Für Bauteile mit unvollständigen Anschlüssen werden fehlende Anschlüsse automatisch bis zur Standardanzahl (8 pro Bauteil) ergänzt.
## Konfiguration und Symbolerkennung
Der I/O Converter verwendet folgende Konfigurationsdateien aus `cfg/`:
| Datei | Relevanz für I/O Converter |
|-----------------|---------------------------|
| `allgemein.cfg` | Layernamen für Sensoren, Aktoren, Unterverteiler etc. - bestimmt, welche Blöcke aus der DXF-Datei extrahiert werden |
| `BMK.cfg` | Betriebsmittelkennzeichnungen (`[Routing-Include]`, `[Routing-Ignore]`) - bestimmt, welche Gerätetypen berücksichtigt werden |
> [!NOTE]
> Die Konfigurationsdateien `kabel.cfg` und `bezeichner.cfg` werden vom I/O Converter **nicht** benötigt, da keine Kabelberechnung stattfindet.
Die Erkennung der Symbole (Blöcke) in der DXF-Datei ist die gemeinsame Basis von I/O Converter und Kabelberechnung. Beide Programme nutzen `getpositions.py` mit denselben Regeln zur Symbolsuche:
- Welche **Layer** durchsucht werden, wird in `allgemein.cfg` unter `[GetPos-Layer_Equipment]`, `[GetPos-Layer_Distributors]` etc. festgelegt
- Welche **Betriebsmittelkennzeichen** (BMK-Präfixe) berücksichtigt werden, regelt `BMK.cfg` unter `[Routing-Include]` und `[Routing-Ignore]`
- Welche **Block-Attribute** erwartet werden (KENNZEICHNUNG, SPS, IO, ARTINR, etc.) und wie die Blöcke im Layout angelegt sein müssen
Eine ausführliche Beschreibung der Konfigurationsdateien sowie der Anforderungen an die Layouterstellung findet sich in der [Anwenderdokumentation zur Kabellängenermittlung](Anwenderdoku.md) in den Abschnitten "Anpassung des Verhaltens des Programms" und "Anwenderhinweise zur Layouterstellung".
## Fehlerfälle und Fehlerbehandlung
### Allgemeine Fehler und Warnungen
Der I/O Converter durchläuft dieselbe Positionsextraktion wie der Cable-Routing-Workflow. Es gelten daher die gleichen Fehler- und Warnungstypen aus `getpositions.py`. Die vollständige Fehlertabelle findet sich in der [Anwenderdoku](Anwenderdoku.md) bzw. [Kurzanleitung](Anwenderdoku_kurz.md) im Abschnitt "Fehlerfälle und Fehlerbehandlung".
Die für den I/O Converter relevantesten Fehler sind:
| Fehlertyp | Auswirkung |
|-----------------|------------|
| `double_ids` | **Abbruch** - Doppelte Geräte-IDs führen zum Programmabbruch. Die `*_errors.json` wird erzeugt, aber keine Excel-Dateien. |
| `missing_attributes` | Betroffene Elemente fehlen in den Export-Dateien |
| `mapping_warnings` (keine KENNZEICHNUNG) | Keine korrekte Zuordnung zu Unterverteilern möglich |
| `missing_sps_prefix` | Gerät kann keiner SPS zugeordnet werden |
### Ausgabedateien bei Fehlern
- `*_errors.json` - enthält alle Fehler und Warnungen aus der Positionsextraktion
- `*_positionsconv.json` - Zwischenergebnis mit extrahierten Positionen
- `*_EA.xlsx`, `*_TIA.xlsx`, `*_WSCAD.xlsx` - werden auch bei Warnungen erzeugt, können aber unvollständig sein
> [!IMPORTANT]
> Bei `double_ids`-Fehlern bricht das Programm nach der Positionsextraktion ab. Es werden **keine** Excel-Dateien erzeugt. Beheben Sie zuerst die doppelten IDs im Layout.
### Empfohlene Vorgehensweise
1. Programm ausführen
2. Falls `*_errors.json` erstellt wurde: Fehler prüfen und im Layout korrigieren
3. Erneut ausführen bis keine Fehler mehr auftreten
4. Export-Dateien an nachgelagerte Systeme (TIA Portal, WSCAD) übergeben
> [!TIP]
> Beheben Sie alle Warnungen aus `*_errors.json`, bevor Sie die Export-Dateien an nachgelagerte Systeme übergeben, um Vollständigkeit sicherzustellen.
## Erweiterte Optionen
### Einzelne Exportformate erzeugen
Der `portalexport.py` kann auch direkt aufgerufen werden, um nur bestimmte Exportformate zu erzeugen:
```bash
# Nur TIA-Export erzeugen
bin\portalexport.bat --filename <positionsconv.json> --outname <basename> --mode TIA
# Nur WSCAD-Export ohne Bezüge
bin\portalexport.bat --filename <positionsconv.json> --outname <basename> --mode WSCAD --no_bezug
# Nur EA-Liste
bin\portalexport.bat --filename <positionsconv.json> --outname <basename> --mode EA
```
### Spezialfall: Eingabe über Textdatei (ohne DXF)
Für den Fall, dass die IO-Daten **nicht aus einer DXF-Datei** stammen, sondern bereits in aufbereiteter Form vorliegen, kann `portalexport.py` auch direkt mit einer Textdatei als Eingabe arbeiten. Damit wird die gesamte DXF-Verarbeitung (`getpositions.py`) übersprungen.
**Anwendungsfälle:**
- IO-Listen aus einem **anderen System** (z.B. manuell gepflegte Excel-Listen, Datenbank-Exporte) sollen in das TIA- oder WSCAD-Format konvertiert werden
- Daten aus der DXF-Extraktion sollen **vorab korrigiert oder ergänzt** werden, bevor der Excel-Export erfolgt
- **Testen** des Exporters ohne eine DXF-Datei verarbeiten zu müssen
**Aufruf:**
```bash
bin\portalexport.bat --input <eingabe.txt> --mode TIA
```
**Format der Textdatei:** Die Datei muss pro Zeile einen Eintrag im folgenden CSV-Format mit einfachen Anführungszeichen enthalten:
```text
'<IO>','<BEZEICHNUNG>','<VERW>','<KENNZEICHNUNG>','<TEXT-D>','<TEXT-E>','<TEXT-ES>','<TEXT-F>'
```
**Beispiel:**
```text
'DI01','Stausensor 1 (ILS-CV M0108)','Jam detector','=A01+UC0101-KF1DI1','','','',''
'DQ04','Motor MA0062','CV-M0062_0,75','=A01+UH01-KF1DQ04','Motor MA0062','Motor MA0062','',''
```
Die Felder entsprechen den Block-Attributen aus der DXF-Datei. Dieses Format wird auch intern von `portalexport.py` erzeugt, wenn es die JSON-Daten aus `getpositions.py` verarbeitet.
> [!NOTE]
> Bei der Eingabe per Textdatei entfällt die Gruppierung nach SPS-Nummer - alle Einträge werden in einem Satz Ausgabedateien zusammengefasst. Ebenso werden keine `getpositions`-Fehler und -Warnungen in die Excel-Dateien geschrieben, da keine DXF-Validierung stattfindet.
+11 -18
View File
@@ -9,10 +9,10 @@
- [Excel-Datei: *dxfdatei*\_BOM.xlsx](#excel-datei-dxfdatei_bomxlsx)
- [Fehlerfälle und Fehlerbehandlung](#fehlerfälle-und-fehlerbehandlung)
- [Übersicht](#übersicht)
- [Zwei Haupt-Workflows](#zwei-haupt-workflows)
- [Programmablauf](#programmablauf)
- [Fehler- und Warnungskategorien](#fehler--und-warnungskategorien)
- [Fehlerausgabe](#fehlerausgabe)
- [Allgemeine Fehler und Warnungen (beide Workflows)](#allgemeine-fehler-und-warnungen-beide-workflows)
- [Allgemeine Fehler und Warnungen](#allgemeine-fehler-und-warnungen)
- [Struktur der Error-JSON-Datei](#struktur-der-error-json-datei)
- [Arbeiten mit Fehlerfällen](#arbeiten-mit-fehlerfällen)
- [Beispiele aus Testdaten](#beispiele-aus-testdaten)
@@ -187,20 +187,14 @@ Hinweis: Diese Ansicht ist besonders nützlich zur **vorbereitenden Bestellplanu
Das Programm führt während der Verarbeitung umfassende Validierungen durch und erkennt verschiedene Arten von Fehlern im Layout. Die Fehlerbehandlung unterscheidet sich je nach Anwendungsfall:
### Zwei Haupt-Workflows
### Programmablauf
Das Kabeltool unterstützt zwei verschiedene Workflows:
Das Kabeltool (`getexdraw.bat`) arbeitet in drei Schritten:
1. **Cable Routing Workflow** (`getexdraw.bat`):
- Schritt 1: `getpositions.py` - Extrahiert Positionen und validiert Layout
- Schritt 2: `routing.py` - Berechnet Kabelwege über Graph-Algorithmen
- Schritt 3: `drawdxf.py` - Erzeugt DXF mit Kabelwegen und Excel-Listen
- **Ausgabe**: `*_cables.dxf`, `*_cables.xlsx`, `*_BOM.xlsx`
2. **I/O Conversion Workflow** (`ioconverter.bat`):
- Schritt 1: `getpositions.py` - Extrahiert Positionen und validiert Layout
- Schritt 2: `portalexport.py` - Konvertiert zu Excel-Formaten (TIA, WSCAD, EA)
- **Ausgabe**: `*_TIA.xlsx`, `*_WSCAD.xlsx`, `*_EA.xlsx`
1. `getpositions.py` - Extrahiert Positionen und validiert Layout
2. `routing.py` - Berechnet Kabelwege über Graph-Algorithmen
3. `drawdxf.py` - Erzeugt DXF mit Kabelwegen und Excel-Listen
- **Ausgabe**: `*_cables.dxf`, `*_cables.xlsx`, `*_BOM.xlsx`
### Fehler- und Warnungskategorien
@@ -211,15 +205,14 @@ Die Fehlerbehandlung unterscheidet zwischen zwei Kategorien:
### Fehlerausgabe
**Für beide Workflows gilt:**
- Falls Fehler oder Warnungen auftreten, schreibt `getpositions.py` **automatisch** eine JSON-Datei `*_errors.json` in den `work`-Ordner
- Im **Cable Routing Workflow** werden zusätzliche Fehler in der Excel-Datei `*_cables.xlsx` als separate Worksheets ausgegeben (siehe [ERR-Worksheets](#erweiterte-ausgabe-im-fehlerfall))
- Zusätzliche Fehler werden in der Excel-Datei `*_cables.xlsx` als separate Worksheets ausgegeben (siehe [ERR-Worksheets](#erweiterte-ausgabe-im-fehlerfall))
Im Ordner [testdata/](testdata/) finden sich Beispiel-DXF-Dateien, die gezielt bestimmte Fehlerfälle demonstrieren (z.B. [easy_3tunnels_errors.json](testdata/easy_3tunnels_errors.json), [easy_tunnelerror1.json](testdata/easy_tunnelerror1.json)).
## Allgemeine Fehler und Warnungen (beide Workflows)
## Allgemeine Fehler und Warnungen
Die folgende Tabelle zeigt alle möglichen Fehler- und Warnungstypen, die von `getpositions.py` erkannt werden. Diese gelten **für beide Workflows** (Cable Routing und I/O Conversion):
Die folgende Tabelle zeigt alle möglichen Fehler- und Warnungstypen, die von `getpositions.py` erkannt werden:
| Fehlertyp | Kategorie | Beschreibung | Ursache | Behebung |
|-----------|-----------|--------------|---------|----------|
+2 -1
View File
@@ -34,10 +34,11 @@ Welche Geraete geroutet werden, bestimmt die `cfg/BMK.cfg`:
| `QM` | Ventile/Pumpen |
| `BG` | Sensoren/Naeherungsschalter |
| `BP` | Naeherungsschalter |
| `BX` | Mehrzweckgeraete |
| `BX` | Mehrzweckgeraete, z.B. Scanner |
| `PO` | Pneumatik-Elemente |
| `SF` | Sicherheitselemente |
| `PF` | Programmierbare Logik |
| `GF` | Encoder |
**Routing-Ignore** (Schaltschrankelemente, nicht geroutet):
+1 -2
View File
@@ -913,8 +913,7 @@ def map_sensor_to_cable_cfg(plines):
section_list = mapping[name_prefix]
else:
sens2cable[pl.id].append("Kein Kabeltyp zugewiesen (BMK.cfg)")
section_list = list()
# TODO was soll hier passieren wenn die Config falsch ist?
continue # Kein Mapping gefunden, Rest überspringen
# Liste aus evtl. mehreren Sektionen erzeugen
sections = [s.strip() for s in section_list.split(",")]
+1 -1
View File
@@ -99,7 +99,7 @@ def prepare_data(rawdata:dict):
for sname, sdata in sensors.items():
dsensors[sname] = {
"point": Point(sdata["pos"]),
"artinr": sdata.get("ARTINR","")
"artinr": sdata.get("ARTINR","").strip()
}
subdists = rawdata["distributors"]