TRO-Katalog: Identifikationskriterien je TRO-Typ und Entscheidungsreihenfolge

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
Samer Ayadi
2026-10-06 17:03:26 +02:00
co-authored by Claude Opus 5.5
parent a741dd0157
commit f0c3102492
+230 -1
View File
@@ -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)