# Diff-Analyse P1-Bausteine — HundM_Fortna

**Stand:** 2026-06-29
**Analysiert:** 22 Bausteine die in allen 5 Konfigurationen (UH01–UH05) vorhanden sind
**Methode:** Vollständiger Inhaltsvergleich aller Versionen

---

## Ergebnis-Übersicht

| Baustein | Gruppe | UH01 | UH02 | UH03 | UH04 | UH05 | Aktion |
|---|---|:---:|:---:|:---:|:---:|:---:|---|
| `FC_GET_PROFINET_DEVICE_STATES` | **A** | ✅ | ✅ | ✅ | ✅ | ✅ | In CommonLib → Projektbibliothek |
| `FB-OPC_UA_System-Stat` | **A** | ✅ | ✅ | ✅ | ✅ | ✅ | In CommonLib → Projektbibliothek |
| `FC_S7` | **A** | ✅ | ✅ | ✅ | ✅ | ✅ | In CommonLib → Projektbibliothek |
| `FC_CarrierManipulator` | **A** | ✅ | ✅ | ✅ | ✅ | ✅ | In CommonLib → Projektbibliothek |
| `FC_Int2String` | **A** | ✅ | ✅ | ✅ | ✅ | ✅ | In CommonLib → Projektbibliothek |
| `FB_FortnaTele_Placeholder` | **A** | ✅ | ✅ | ✅ | ✅ | ✅ | In CommonLib → Projektbibliothek |
| `Programming error` (OB) | **B** | ✅ | ⚠️ | ✅ | ✅ | ✅ | UH02 bereinigen (VAR_TEMP entfernen) |
| `FB_PerfTest` | **B** | ✅ | ✅ | ⚠️ | ✅ | ✅ | UH03 Default-Wert klären/entfernen |
| `FB_CommunicationLogger` | **B** | ✅ | ⚠️ | ✅ | ✅ | ✅ | connectionID + JAM-Ref. beachten! |
| `FB_Visu_Jam` | **B** | ⚠️ | ✅ | ✅ | ✅ | ✅ | UH01 cleanup: nInJamCount entfernt, REGION vereinheitlicht |
| `FB_Visu_JamStorage` | **B** | ✅ | ✅ | ⚠️ | — | — | UH03 hat HMI-Block auskommentiert (nur UH01/02/03) |
| `FB_Main` | **D** | ❌ | ❌ | ❌ | ❌ | ❌ | Nicht standardisierbar — TRO-Nummern, Topologie |
| `FB_PreMain` | **D** | ❌ | ❌ | ❌ | ❌ | ❌ | Nicht standardisierbar — EStop, Monitoring |
| `FB_CallSensors` | **D** | ❌ | ❌ | ❌ | ❌ | ❌ | Nicht standardisierbar — Sensor-IDs, Hardware |
| `FB_Visu` | **D** | ❌ | ❌ | ❌ | ❌ | ❌ | Nicht standardisierbar — TRO-Ranges, Config |
| `FB_CommunicationWCSBL` | **D** | ❌ | ❌ | ❌ | ❌ | ❌ | ConnectionID 10/20/30/40/50, Logik je UH reduziert |
| `FC_Call_Jams` | **D** | ❌ | ❌ | ❌ | ❌ | ❌ | Jam-Bereichsnummern je UH (0100/1100/2100/4000/5000) |
| `FC_Direction` | **D** | ❌ | ❌ | ❌ | ❌ | ❌ | Weichen-Nummern je UH |
| `FB_Visu_Jams` | **D** | ❌ | ❌ | ❌ | ❌ | ❌ | Jam-Instanzen je UH |
| `FC_CARR_GLOB_CORRECTION` | **D** | ❌ | ❌ | ❌ | ❌ | ❌ | 568–5826 Zeilen je UH (Faktor 10!) |
| `FC_BARCODE_SEARCH` | **D** | ❌ | ❌ | ❌ | ❌ | ❌ | UH01: 2 Lagerbereiche, UH02–UH05: 12 |
| `FC_Jam` | **D** | ❌ | ❌ | ❌ | ❌ | ❌ | UH02/UH03 mit erweiterter Storage-Logik |

**Legende:** ✅ = identisch mit Referenz | ⚠️ = kleine Abweichung | ❌ = topologie-spezifisch | — = nicht vorhanden

---

## Gruppe A — 100% identisch (6 Blöcke)

### FC_GET_PROFINET_DEVICE_STATES
- **Typ:** FC, 28 Zeilen
- **Funktion:** Liest PROFINET-Gerätezustände (vorhanden/gestört) via `DeviceStates()`
- **Status:** Alle 5 Versionen byte-identisch
- **Kanonische Version:** UH01 (gleichwertig)

### FB-OPC_UA_System-Stat
- **Typ:** FB, 73 Zeilen
- **Funktion:** Übersetzt internen Anlagenstatus in OPC-UA SCADA-Statuscodes
- **Status:** Alle 5 Versionen byte-identisch
- **Kanonische Version:** UH01 (gleichwertig)

### FC_S7
- **Typ:** FC, 63 Zeilen
- **Funktion:** S7-PUT Wrapper für CPU-zu-CPU-Datenaustausch
- **Status:** Alle 5 Versionen byte-identisch
- **Kanonische Version:** UH01 (gleichwertig)

### FC_CarrierManipulator
- **Typ:** FC, 159 Zeilen
- **Funktion:** HMI-gesteuerte Carrier-Manipulation in Jam-Listen (Löschen, Verschieben, HyperJam)
- **Status:** Alle 5 Versionen byte-identisch (MD5 identisch)
- **Kanonische Version:** UH01 (gleichwertig)

### FC_Int2String
- **Typ:** FC, 25 Zeilen
- **Funktion:** Wandelt INT in String, entfernt führendes "+" (Autor: Christian Forkl, 28.07.2021)
- **Status:** Alle 5 Versionen byte-identisch
- **Kanonische Version:** UH01 (gleichwertig)

### FB_FortnaTele_Placeholder
- **Typ:** FB, 37 Zeilen (nur Variablendeklaration, kein Code)
- **Funktion:** Platzhalter-Baustein mit allen Fortna WES/WCS UDT-Instanzen zur Typ-Aktivierung
- **Status:** Alle 5 Versionen byte-identisch
- **Kanonische Version:** UH01 (gleichwertig)

---

## Gruppe B — Kleine Abweichungen (5 Blöcke)

### Programming error (OB)
- **Typ:** OB (Organization Block), 33 Zeilen
- **Funktion:** Fehlerbehandlung bei Programmierfehler, schreibt Fehlerinfo in DB_Error
- **Abweichung UH02:** Hat zusätzliche `VAR_TEMP` Sektion mit ungenutzter `Temp_1 : Bool`
- **Entscheidung:** UH01-Version ist korrekt. UH02-VAR_TEMP ist redundant und sollte entfernt werden.
- **CommonLib-Version:** UH01 (ohne VAR_TEMP)

### FB_PerfTest
- **Typ:** FB, 105 Zeilen
- **Funktion:** Leistungsmessung — zählt Trolley-Releases und protokolliert Zeitstempel
- **Abweichung UH03:** `nInGoalFlags : Int := 498;` (Default-Wert = 498 = Array-Größe 500 minus 2)
- **Abweichung UH03:** Eine fehlende Leerzeile nach `END_IF`
- **Entscheidung:** Default-Wert in UH03 war vermutlich temporär für Tests gesetzt. UH01-Version (kein Default) ist der Standard. Falls UH03 den Default bewusst nutzt, muss dieser nach TIA-Import im Instanz-DB gesetzt werden.
- **CommonLib-Version:** UH01 (kein Default-Wert für `nInGoalFlags`)

### FB_CommunicationLogger
- **Typ:** FB, 229 Zeilen
- **Funktion:** TCP-Logger Kommunikation zu Fortna WCSBL, empfängt GOHDRespM-Telegramme
- **Abweichung UH02:** `connectionID := 100` (UH01/UH03/UH04/UH05 = 99)
- **Wichtig:** `connectionID` muss je PLC eindeutig sein! Dies ist KEIN Fehler in UH02, sondern möglicherweise bewusst.
- **Weitere Abweichung:** Zeilen 171–179 (Jam-Referenz auf `"DB_JamArea0102"`) sind UH01-spezifisch
- **Entscheidung:** CommonLib-Version nimmt UH01 als Basis mit explizitem Kommentar:
  - `connectionID` muss beim Import in UH02–UH05 angepasst werden
  - Jam-Referenz `"DB_JamArea0102"` bei anderen PLCs auskommentieren oder ersetzen
- **CommonLib-Version:** UH01 mit Hinweis-Kommentaren

### FB_Visu_Jam
- **Typ:** FB, 207 Zeilen
- **Funktion:** HMI-Listenverwaltung für Jam-Carrier-Anzeige (Scroll, Carrier-Manipulation)
- **Abweichung UH01:** Hat ungenutzten `VAR_INPUT nInJamCount : UInt` — in UH02/UH03/UH04/UH05 nicht vorhanden
- **Abweichung UH01:** REGION-Name "Carrier Manipulation" — in anderen UH "FC_CAR_MOVE"
- **Bereinigungen in CommonLib-Version:**
  - `VAR_INPUT` Sektion vollständig entfernt (`nInJamCount` war unbenutzt)
  - REGION umbenannt zu "FC_CAR_MOVE" (einheitlich mit UH02–UH05)
- **CommonLib-Version:** Bereinigt

### FB_Visu_JamStorage
- **Typ:** FB, 200 Zeilen
- **Funktion:** HMI-Listenverwaltung für Lager-Jam-Carrier-Anzeige (nur in UH01/UH02/UH03)
- **Nicht vorhanden in:** UH04, UH05
- **Abweichung UH03:** HMI-REGION (Zeilen 193–196) ist auskommentiert — `nCapacitySetHMI`-Zuweisung deaktiviert
- **Entscheidung:** UH01-Version ist die vollständigste (aktive HMI-Logik). UH03 hat bewusst deaktiviert.
- **CommonLib-Version:** UH01 (aktive HMI-Logik)

---

## Gruppe D — Topologie-spezifisch (11 Blöcke)

Diese Blöcke können **nicht ohne vollständiges Redesign** standardisiert werden, da sie
hartcodierte Werte enthalten, die die physikalische Anlagentopologie abbilden.

| Baustein | Hartcodierte Topologie-Werte | Größenunterschied |
|---|---|---|
| `FB_Main` | TRO-Nummern (100er/200er/300er/400er/500er), Workstations, Carousel-IDs, UDT-Referenzen | 1835–9293 Zeilen |
| `FB_PreMain` | EStop-Konstanten (10–31 je UH), Monitoring-Instanzen, Befeuerungs-Konfiguration (1x/2x/4x) | 491–2373 Zeilen |
| `FB_CallSensors` | Sensor-IDs (BG0280/BG3240 etc.), Schaltschrank-State-Referenzen | 769–11649 Zeilen |
| `FB_Visu` | TRO-Ranges, Schaltschrank-IDs, EStop-Array-Größen | 70–1796 Zeilen |
| `FB_CommunicationWCSBL` | ConnectionID 10/20/30/40/50 je UH, Telegramm-Logik je UH verschieden | — |
| `FC_Call_Jams` | Jam-Bereichsnummern (0100er/1100er/2100er/4000er/5000er) | — |
| `FC_Direction` | Weichen-Nummern (cSwi107/cSwi202/cSwi313/cSwi405/cSwi505) | — |
| `FB_Visu_Jams` | Jam-Instanzen (Anzahl und Art je UH) | 32–52 KB |
| `FC_CARR_GLOB_CORRECTION` | Jam-Bereiche, Stationsnummern | 568–5826 Zeilen |
| `FC_BARCODE_SEARCH` | Lagerbereiche: UH01=2, UH02–UH05=12 | — |
| `FC_Jam` | UH02/UH03 mit erweiterter `CarrierStatisticsStorage`-Logik | 85–203 Zeilen |

### Empfehlung für Gruppe-D-Blöcke

Langfristig könnten diese Blöcke durch **Code-Generierung** aus einer zentralen
Topologie-Konfigurationsdatei (z.B. UDT-Array oder JSON) erstellt werden.
Kurzfristig: Getrennte Pflege je UH bleibt notwendig.

---

## Entscheidungsstatus FC_StorageLines (Sonderfall)

`FC_StorageLines` war zunächst als P1-Kandidat eingestuft:
- **UH01, UH03, UH05:** identisch (gleiches MD5)
- **UH02, UH04:** abweichend (unterschiedliche Storage-Strukturen)

Da nicht alle 5 UH identisch sind, wurde dieser Block **nicht** in die CommonLib aufgenommen.
Möglichkeit: Separate CommonLib-Instanz nur für UH01/UH03/UH05 — bei Bedarf ergänzen.
