From f0c31024926d44eb76799ea49ef1488815912c8a Mon Sep 17 00:00:00 2001 From: Samer Ayadi Date: Tue, 6 Oct 2026 17:03:26 +0200 Subject: [PATCH] TRO-Katalog: Identifikationskriterien je TRO-Typ und Entscheidungsreihenfolge Co-Authored-By: Claude Opus 5.5 --- doc/TRO_Katalog/TRO_Katalog.md | 231 ++++++++++++++++++++++++++++++++- 1 file changed, 230 insertions(+), 1 deletion(-) diff --git a/doc/TRO_Katalog/TRO_Katalog.md b/doc/TRO_Katalog/TRO_Katalog.md index 14c4877..4656003 100644 --- a/doc/TRO_Katalog/TRO_Katalog.md +++ b/doc/TRO_Katalog/TRO_Katalog.md @@ -1,6 +1,6 @@ # TRO Catalog — Building Blocks of the Skeleton Program (UH01–UH05) -**As of: 2026-07-20** +**As of: 2026-10-06** This document is the **central image/concept catalog** for all TRO types of the Fortna conveyor system. Goal: one place where, per TRO type, everything the @@ -100,6 +100,55 @@ and line style in both the per-type schematics and the controller graphs: **Total: 250 TRO instances across 9 actively used types** (`2Sep1Swi` prepared, never instantiated). +### Deciding the type — evidence sources and decision order + +Each type section below ends with **Identification criteria** in three evidence layers: + +- **Layout** — what the mechanical drawing / CSV export shows (host object of the + separator: Kreisel, Gefällestrecke (GF), driven Strecke (VF); switches, scanners, drives, + station labels). Available first, before any electrical planning. +- **Topology** — the neighbourhood in the material flow (`connect.ini`: in/out edges and + their `kind`, shared JamAreas, typical predecessor/successor types). +- **SCL / I/O** — what the call site in `FB_Main` (or the I/O list) proves beyond doubt: + which parameters, outputs and sub-blocks the instance has. + +The layout is often ambiguous; the SCL call site never is. Recommended decision order +(it matches the derivation rules in `lib/tro_flow.py`): + +| Step | Question | → Type | +|---:|---|---| +| 1 | Boom with forth/back, foot up/down, tilt + distance sensing, no stopper core? | `LoadingBoom` | +| 2 | Group of ≥ 2 parallel gravity lines, one separator each, between an infeed and an outfeed conveyor, with encoder + scanner + returning Vario? | `PinStore_Auto` (one per block) | +| 3 | Small multi-line buffer for empty carriers behind an infeed separator (`TROnnn_IN`), one distribution output per line, no encoder/scanner? | `EmptyCarrBuffer` | +| 4 | Separator on a **driven** segment (VF, own drive motor)? | `Vario` — or `Vario_workStation` if a manual station (station sensor + release button) sits on it | +| 5 | Separator with **3** outgoing paths (two switches in series)? | `1Sep2Swi` | +| 6 | Separator with **2** outgoing paths (switch / Ausschleuselement)? | `1Sep1Swi` | +| 7 | Separator with barcode **and** SSCC scanner, end measurement and WCS telegram (behind a loading boom)? | `1Sep_SSCC` | +| 8 | Everything else with one stopper, one entry, one exit (Kreisel track, single GF line, last separator before re-entry onto the Kreisel) — with or without scanner | `1Sep` | +| — | Two separate entry separators + one switch in one node | `2Sep1Swi` — concept only; in production modelled as 2× `1Sep` + `1Sep1Swi` | + +**Summary per type** (details in each type's *Identification criteria*): + +| Type | Deciding feature | +|---|---| +| `LoadingBoom` | Boom forth/back, foot up/down, tilt and distance sensing (analog), no separator. Always between a `1Sep` with scanner and a `1Sep_SSCC`. | +| `PinStore_Auto` | At least 2 parallel gravity lines with one separator each, between an infeed and an outfeed conveyor, plus a returning Vario (loop TRO208 → `1Sep1Swi` TRO203 → `Vario` TRO209 → `1Sep` TRO210 → TRO208). One TRO per block. | +| `EmptyCarrBuffer` | Small buffer (5 lines) behind an infeed separator `TROnnn_IN`, one output per line. No encoder, no scanner. Its exit merges with another flow into a `1Sep1Swi` (hence the priority manager). | +| `Vario` | Separator on a driven segment with its own motor. The outgoing edge is a `finger` edge. Infeed is often from `EXTERN` (then `isBorner`) or from a switch branch. | +| `Vario_workStation` | Like `Vario`, plus a station sensor, release button and load-error sensor. Pattern: `1Sep1Swi → Vario → WS → 1Sep → next switch`. | +| `1Sep2Swi` | 3 exits, two switches in series, always with a scanner. | +| `1Sep1Swi` | 2 exits (`normal` + `dir2`), a switch or an Ausschleuselement on the Kreisel. Typically part of a chain of switches along the main line. | +| `1Sep_SSCC` | Two scanners (barcode + SSCC), end measurement, WCS telegram, directly after the LoadingBoom. Can't be recognized from the mechanical layout alone. | +| `1Sep` | Everything with one stopper, one entry and one exit, with or without a scanner. This includes the last separator before re-entry onto the Kreisel and a single gravity line. | +| `2Sep1Swi` | Concept only. In production this case is built as two `1Sep` feeding the shared entry of one `1Sep1Swi`. | + +The `PinStore_Auto` rule is confirmed by the SCL call site: it has exactly two conveyor +signals, `xInConveyorRunIn := fbSortConv1101` and `xInConveyorRunOut := fbExitConv1103`. + +> **Limitations:** `1Sep2Swi`, `1Sep_SSCC`, `EmptyCarrBuffer` and `LoadingBoom` have only +> 2 instances each, so their patterns rest on little evidence. Whether the +> `EmptyCarrBuffer` lines are driven or gravity lines is not documented and left open. + --- ## 1. `1Sep` — Standard Separator @@ -134,6 +183,25 @@ flowchart LR **All instances (96):** TRO100, TRO101_IN, TRO102_IN, TRO103, TRO104, TRO106, TRO108, TRO109, TRO111, TRO113, TRO116, TRO117, TRO122, TRO125, TRO129, TRO130, TRO201, TRO207, TRO210, TRO213, TRO216, TRO219, TRO221, TRO227, TRO230, TRO233, TRO236, TRO239, TRO241, TRO247, TRO250, TRO253, TRO256, TRO259, TRO261, TRO263, TRO265, TRO266, TRO269, TRO274, TRO275, TRO301, TRO304, TRO309, TRO310, TRO311, TRO312, TRO315, TRO316, TRO323, TRO325, TRO326, TRO329, TRO332, TRO335, TRO338, TRO345, TRO347, TRO348, TRO351, TRO354, TRO357, TRO360, TRO367, TRO369, TRO370, TRO373, TRO376, TRO379, TRO382, TRO386, TRO402, TRO404, TRO406, TRO409, TRO412, TRO415, TRO416, TRO417, TRO424, TRO501, TRO503, TRO504, TRO507, TRO509, TRO511, TRO513, TRO515, TRO517, TRO519, TRO521, TRO523, TRO525, TRO526, TRO528, TRO529. +**Identification criteria:** + +- **Layout:** exactly one separator (`S-SP`) with **no** switch and **no** own drive behind it. + Typical hosts: a separator on the (driven) Kreisel track; a single, isolated gravity line + (GF) with one separator; the **last** separator of a VF/GF chain right before it re-enters + the Kreisel (the Kreisel drives from there — alternating rule in `lib/tro_flow.py`); + manual stop points without drive (Aufgabestation, Qualitätskontrolle, fire-door stop + TRO402). +- **Topology:** one entry JamArea, one `normal` exit. Several predecessors may share its + entry JamArea (merge, e.g. TRO266 ← TRO263 + TRO274). Very common right **after a Vario** + (incoming `finger` edge): TRO209 → **TRO210** → PinStore TRO208, TRO408 → TRO421 → **TRO409** + → switch TRO410. Also the feeder before a switch chain (TRO424 → TRO405). +- **SCL / I/O:** one stopper output (`MB…`), `sensorInSep` (`BG…`), optional `sensorJam2`; + `xInCarouselRun` from an `fbCarouselNNNN`; single exit JamArea; **no** `xInSwitchNo`, **no** + Vario motor (`MA…`), no switch output. +- **Not this type if:** 2/3 outgoing paths → `1Sep1Swi`/`1Sep2Swi`; own drive → `Vario`; SSCC + scanner + WCS telegram → `1Sep_SSCC`. A **plain barcode scanner does not change the type** + (TRO104, TRO109, TRO113, TRO117, TRO269, TRO406 are `1Sep` + scanner). + --- ## 2. `1Sep1Swi` — Separator + 1 Switch @@ -169,6 +237,29 @@ flowchart LR **All instances (49):** TRO107, TRO112, TRO114, TRO124, TRO202, TRO203, TRO204, TRO205, TRO206, TRO222, TRO223, TRO224, TRO225, TRO226, TRO242, TRO243, TRO244, TRO245, TRO246, TRO313, TRO314, TRO317, TRO318, TRO319, TRO320, TRO321, TRO322, TRO339, TRO340, TRO341, TRO342, TRO343, TRO344, TRO361, TRO362, TRO363, TRO364, TRO365, TRO366, TRO405, TRO407, TRO410, TRO413, TRO505, TRO510, TRO514, TRO518, TRO522, TRO527. +**Identification criteria:** + +- **Layout:** separator directly in front of **one** switch (ILS Weiche, serial `W.…`) or an + **Ausschleuselement** where carriers leave the Kreisel track: one entry, two exits. Usually + with a barcode scanner in front (most UH02/UH04 instances carry `+Scanner(BXnnnn)`), since + the routing decision needs the carrier ID. +- **Topology:** exactly **two** outgoing edges — one `normal` (exit2/Dir1) and one `dir2` + (exit3). Typical patterns: + - **Switch chain along a main line**: each switch hands the main flow on via `dir2` to the + next switch and diverts via `normal` into a branch, which merges back into the next + switch's entry (UH04: TRO405 → 407 → 410 → 413; UH05: TRO505 → 510 → 514 → 518 → 522). + The branch is often `1Sep1Swi → Vario → (Vario_workStation) → 1Sep → merge`. + - **In front of / behind a PinStore block**: TRO202 feeds PinStore TRO211 via `dir2`; + TRO203 takes the PinStore exit and sends carriers to the returning Vario TRO209. + - **Merge with priority**: if the `dir2` exit is a JamArea also fed by a second flow + (TRO107 → JA0102_2 ← TRO101/TRO106), a `Dir2Manager` priority manager is used. +- **SCL / I/O:** in addition to `1Sep`: switch output `sw1ExTo3` (`MB…`), `sensorJam3`, + `xInSwitchNo := cSwiNNN.1`, `nTo1Destinations`, two exit JamAreas (`exit2`, `exit3`), and an + `FC_Direction` call with the switch number and the carrier source; optional + `PriorityManagerDir2In/Out`, `xInPrioDir2`. +- **Not this type if:** three exits → `1Sep2Swi`; two separate entry separators → + `2Sep1Swi` (concept only). + --- ## 3. `1Sep2Swi` — Separator + 2 Switches @@ -204,6 +295,22 @@ flowchart LR **All instances (2):** TRO267, TRO268. +**Identification criteria:** + +- **Layout:** one separator followed by **two switches in series** (cascade) → three + outgoing tracks; barcode scanner at the entry is always present. Sits at a distribution + point where carriers are handed over to other areas (handover JamAreas). +- **Topology:** **three** outgoing edges. TRO267 (entry JA1110_4, merge of TRO265 + TRO266): + `exit2`/`exit3` → handover JamAreas (`handoverJam5001`/`5000`), `exit4` → `dir3` → TRO275 + (local loop). Both instances sit on the same loop JA1110 one after the other + (TRO267 → TRO275 → TRO268 → `dir3` TRO269). +- **SCL / I/O:** `switch1` **and** `switch2` (each with `nTo1Destinations`, `newSwitch`), + outputs `sw1ExTo3` + `sw2ExTo3`, `sensorJam2`…`sensorJam4`, exits `exit2`…`exit4`, + Cognex scanner block (`cScannerBXnnnn`, `hwResults`, `checkASCII`, timeout), + `xInCarouselRun1/2`, `sepType_x2`, `pluggedScanner = true`. +- **Derivation in `lib/tro_flow.py`:** a host with 3 outgoing flow edges upgrades `1Sep` → + `1Sep2Swi`. + --- ## 4. `1Sep_SSCC` — Separator + SSCC Scanner @@ -238,6 +345,22 @@ flowchart LR **All instances (2):** TRO105, TRO110. +**Identification criteria:** + +- **Layout:** separator with **two** read points — a normal barcode scanner plus an **SSCC** + scanner — and an end-measurement sensor, placed at the **system inbound** directly behind + a loading boom. Mechanically it looks like a `1Sep` + scanner; the type is decided by the + WCS requirement (dock request), so it **cannot be derived from the mechanical layout + alone** (`lib/tro_flow.py` only emits a hint). +- **Topology:** 1 in / 1 out. Fixed pattern + `1Sep(+Scanner) → LoadingBoom → 1Sep_SSCC → 1Sep`: + TRO104 → fbLoadingBoom1 → **TRO105** → TRO106 and TRO109 → fbLoadingBoom2 → **TRO110** → TRO111. +- **SCL / I/O:** second Cognex interface (`CognexInterfaceSSCC`, second `hwResults` BX), + `sensorEndMeasurement`, WCS `DReqM` telegram fields; release coupled to the WCS + connection (`FB_CommunicationWCSBL_DB.fbTeleHandler.xOutConnectionActive`); + `pluggedScanner = true`; `xInCarouselRun := true`. +- **Not this type if:** only one barcode reader and no WCS telegram → `1Sep`. + --- ## 5. `Vario` — Chain Conveyor @@ -272,6 +395,27 @@ flowchart LR **All instances (70):** TRO115, TRO120, TRO121, TRO123, TRO126, TRO127, TRO128, TRO131, TRO133, TRO134, TRO200, TRO209, TRO212, TRO215, TRO218, TRO220, TRO229, TRO232, TRO235, TRO238, TRO240, TRO249, TRO252, TRO255, TRO258, TRO260, TRO262, TRO264, TRO270, TRO272, TRO300, TRO302, TRO303, TRO305, TRO306, TRO307, TRO308, TRO324, TRO328, TRO331, TRO334, TRO337, TRO346, TRO350, TRO353, TRO356, TRO359, TRO368, TRO372, TRO375, TRO378, TRO381, TRO400, TRO401, TRO403, TRO408, TRO411, TRO414, TRO418, TRO420, TRO500, TRO502, TRO506, TRO508, TRO512, TRO516, TRO520, TRO524, TRO530, TRO531. +**Identification criteria:** + +- **Layout:** separator at the start of a **driven** segment (VF — friction/chain drive with + its own motor `M.…`, layer `TX200FD`), i.e. host = driven "Strecke". One Vario TRO **per + separator**, not per Strecke. In a mixed VF/GF chain the alternating rule applies counted + back from the re-entry onto the Kreisel: last separator = `1Sep`, the one before = `Vario`, + etc.; a separator whose preceding segment actually loses height (> 30 mm, GF) is `1Sep`. +- **Topology:** the **outgoing** edge is of kind `finger` (index transfer to the next TRO, + usually a `1Sep`, another `Vario` or a `Vario_workStation`). Incoming typically: + - from **EXTERN** — system / PLC infeed (TRO115, TRO200, TRO220, TRO400; `isBorner`); + - from a `1Sep1Swi` branch exit (TRO203 → TRO209, TRO407 → TRO408); + - from another Vario via `finger` (TRO400 → TRO401, TRO500 → TRO530). + As the **returning Vario** of a PinStore block it closes the loop back to the store + entry (TRO209 → TRO210 → TRO208). +- **SCL / I/O:** Vario motor output (`MA…`) + motor protection (`FC…`), `automatic` and + `errorQuit` inputs, Vario sensors `carrInPos` / `finger` / `lastPos` / `jam`, Vario timings + (`waitForJog`, `convEmpty`, `rasterHigh/Low`…), optional `xInBorner`; JamAreas `entry` + + **`finger`** instead of `exit`; **no** `xInCarouselRun`. +- **Not this type if:** station sensor + release button → `Vario_workStation`; separator on + an undriven gravity piece → `1Sep`. F2H segments (UH03) are plain `Vario` (comment only). + --- ## 6. `PinStore_Auto` — Automatic Pin Storage @@ -309,6 +453,31 @@ flowchart LR **All instances (24):** TRO208, TRO211, TRO214, TRO217, TRO228, TRO231, TRO234, TRO237, TRO248, TRO251, TRO254, TRO257, TRO327, TRO330, TRO333, TRO336, TRO349, TRO352, TRO355, TRO358, TRO371, TRO374, TRO377, TRO380. +**Identification criteria:** + +- **Layout:** a **set of parallel gravity lines (GF, `ABH-GEF`) between two conveyors** — + an infeed/sorter conveyor that distributes onto the lines and an outfeed conveyor that + collects from them — plus a **returning Vario conveyor** that leads carriers back to the + store entry. Each line has its own line separator; at the infeed sit a pin separator, a + barcode scanner and an encoder on the infeed conveyor. ≥ 2 lines (`MIN_STORE_LANES` in + `lib/tro_flow.py`), up to 19 per block. **One TRO per block** (group of lines), never one + per line. +- **Topology** (UH02 block 1.1.x, repeated 4× per hall section): + - entry fed by a `1Sep1Swi` with scanner (TRO202 `dir2` → TRO211) **and** by the return + chain `Vario → finger → 1Sep` (TRO209 → TRO210 → TRO208); + - exit → `1Sep1Swi` (TRO208 → TRO203), whose branch leads into the returning Vario + (TRO203 → TRO209) — the loop store → switch → Vario → 1Sep → store; + - `bypass` edge from the neighbouring block (TRO211 → TRO208, TRO214 → TRO217); + - `EXTERN` storage edge (`Storage1.1.1`) = handshake with the storage intelligence. +- **SCL / I/O:** two conveyor signals **`xInConveyorRunIn`** (`fbSortConv…`) and + **`xInConveyorRunOut`** (`fbExitConv…`) — the SCL proof of "between two conveyors"; + `arInSep[1..N]` with `nJamLength` per line, `nNoOfLines`, encoder parameters + (`fbEncoderGF…`), `arInOutStorageLines := DB_Storage…`, `stMFRStorageRemovalInterface`, + `ConveyorStations`, jam bypass, `CognexInterfacePin`, line outputs `MB…` per line, unloading + jam sensors per line. No `xInCarouselRun`. +- **Not this type if:** a **single** GF line with one separator → `1Sep`; a small manual + empty-carrier buffer without encoder/scanner/storage handshake → `EmptyCarrBuffer`. + --- ## 7. `Vario_workStation` — Manual Work Station @@ -341,6 +510,21 @@ flowchart LR **All instances (3):** TRO421, TRO422, TRO423. +**Identification criteria:** + +- **Layout:** a **driven** Vario segment at a **manual work station** — operator place, + release button, station sensor, load-error sensor; station label in the drawing + (*Arbeitsplatz*). Without a drive a manual stop is **not** this type (Mubea: + Aufgabestation / Qualitätskontrolle → `1Sep`). +- **Topology:** both edges are `finger`: in from an upstream Vario, out to a `1Sep` that + merges back into the switch chain. Fixed branch pattern (UH04, 3×): + `1Sep1Swi → Vario → finger → Vario_workStation → finger → 1Sep → next 1Sep1Swi` + (TRO407 → TRO408 → **TRO421** → TRO409 → TRO410). +- **SCL / I/O:** all `Vario` parameters **plus** `station.sensor`, `releaseStation` + (edge-triggered button, `rTrig_Workstation…`), `loadErrorSensor`; internally + `FB_ILS_STRO_Vario_WorkStation` + `FB_CarrAccumulate1Sep`. +- **Not this type if:** no station sensor / release button → `Vario`. + --- ## 8. `EmptyCarrBuffer` — Empty Carrier Buffer @@ -375,6 +559,23 @@ flowchart LR **All instances (2):** TRO101, TRO102. +**Identification criteria:** + +- **Layout:** a **small multi-line buffer for empty carriers** (5 lines in UH01) branching + off the main line, with one distribution switch output per line and an **infeed + separator** (`TROnnn_IN`, a borner) in front of it. No encoder, no scanner. +- **Topology:** `1Sep → TROnnn_IN (1Sep) → JamBufferNNN → EmptyCarrBuffer`. The `_IN` + separators of several buffers sit in series on the same line (TRO100 → TRO101_IN → + TRO102_IN). The buffer exit **merges** into the entry of a `1Sep1Swi` together with another + flow (TRO101 → TRO112 at JA0102_2, TRO102 → TRO107 at JA0102_1) — hence the priority + manager. +- **SCL / I/O:** `FB_EmptyCarrBuffer` (not `FB_ILS_MTRO_*`), `numberOfLines`, + `storageDb := DB_JamBufferNNN`, `inTro` block (`isBorner`, `bornerDest`, own stopper), + `separatorLines[]` with `jamLength` + sensor, `switchLineOutputs` (`MB…` per line), + `jamSensors` per line, `exitSensor`, `PriorityManagerIn/Out`. +- **Not this type if:** encoder, scanner, storage-removal handshake, two conveyors and a + returning Vario → `PinStore_Auto`. + --- ## 9. `LoadingBoom` — Loading Boom @@ -406,6 +607,20 @@ flowchart LR **All instances (2):** fbLoadingBoom1 (→ TRO104), fbLoadingBoom2 (→ TRO109). +**Identification criteria:** + +- **Layout:** a telescopic **loading boom** at the system inbound (loading area): boom drive + forth/back, foot up/down, tilt and distance sensing. No separator/switch core — the only + structurally independent type. +- **Topology:** always between a `1Sep` with scanner and a `1Sep_SSCC`; its entry is the + stopper JamArea of the preceding TRO (`relatedTro`): TRO104 → **fbLoadingBoom1** → TRO105, + TRO109 → **fbLoadingBoom2** → TRO110. +- **SCL / I/O:** instance name `fbLoadingBoomN` instead of `TROnnn`; `FB_LoadingBoom_INBOUND` + with `FB_Tilt_TEST`, `FB_DistanceFoot`, `FB_BoomWorkStation`; **analog** inputs + (`wTiltSensor…`, `wDistanceSensor…`), limit switches boom forth/back (`BG…`) and foot + up/down (`SF…`), several motor protections (`FC…`), HMI under `stLoadingBoom` instead of + `stTRO`. No `FB_ILS_STRO_Sep` / `FB_ILS_STRO_Switch`. + --- ## 10. `2Sep1Swi` — Unused (Concept Block) @@ -436,6 +651,20 @@ flowchart LR ![2Sep1Swi – BricsCAD reference layout](img/2Sep1Swi_layout.png) > _BricsCAD reference capture (concept block, not instantiated in production). File: `img/2Sep1Swi_layout.png`._ +**Identification criteria:** + +- **Layout:** two separators, each on its own incoming track, directly in front of **one** + switch — merge and divert in a single hand-over point. +- **Topology:** two incoming edges into **separate** entry JamAreas, two outgoing edges + (`normal` + `dir2`). In the reference plants this situation is always modelled + differently: two `1Sep` feeding the **shared** entry JamArea of one `1Sep1Swi` + (TRO117 + TRO102 → TRO107 at JA0102_1). So: **do not choose this type** for production + code as long as the FB is not finished. +- **SCL / I/O:** `separator1`/`separator2` with `stopper1`/`stopper2`, + `xInCarouselReq1/2`, `switch1`, `prioDir1…4`, `car2NecRight/Left`. +- **Related:** `lib/tro_flow.py` derives a `2Sep2Swi` (Ausschleuselement + ILS Weiche + directly in a row on the Kreisel, Mubea) — that FB does not exist in the ILSLib yet either. + --- ## Controller topology graphs (UH01–UH05)