From 94c69cbd0c2c71bd99ba523d512d5b71a6764aa6 Mon Sep 17 00:00:00 2001 From: Samer Ayadi Date: Tue, 21 Jul 2026 16:57:31 +0200 Subject: [PATCH] erste Fassung eines TRO Katalogs erstellt. Analyse des Graphen von HundM neu gezeichnet --- doc/TRO_Katalog/TRO_Katalog.md | 493 ++++ doc/TRO_Katalog/connect.ini | 646 +++++ doc/TRO_Katalog/img/1sep.png | Bin 0 -> 1352 bytes doc/TRO_Katalog/img/1sep_1swi.png | Bin 0 -> 19825 bytes doc/TRO_Katalog/img/1sep_sscc.png | Bin 0 -> 2934 bytes doc/TRO_Katalog/img/Pinstore.png | Bin 0 -> 24501 bytes doc/TRO_Katalog/img/README.md | 18 + .../scl_templates/FB_EmptyCarrBuffer.scl | 1236 +++++++++ .../scl_templates/FB_ILS_MTRO_1Sep.scl | 43 + .../scl_templates/FB_ILS_MTRO_1Sep1Swi.scl | 56 + .../scl_templates/FB_ILS_MTRO_1Sep2Swi.scl | 75 + .../scl_templates/FB_ILS_MTRO_1Sep_SSCC.scl | 93 + .../scl_templates/FB_ILS_MTRO_2Sep1Swi.scl | 1551 +++++++++++ .../FB_ILS_MTRO_PinStore_Auto.scl | 138 + .../scl_templates/FB_ILS_MTRO_Vario.scl | 66 + .../FB_ILS_MTRO_Vario_workStation.scl | 1301 +++++++++ ...FB_ILS_MTRO_Vario_workStation_CallSite.scl | 62 + .../scl_templates/FB_LoadingBoom_INBOUND.scl | 898 +++++++ doc/TRO_Katalog/tro_graphs/1sep.svg | 25 + doc/TRO_Katalog/tro_graphs/1sep1swi.svg | 31 + doc/TRO_Katalog/tro_graphs/1sep2swi.svg | 43 + doc/TRO_Katalog/tro_graphs/1sep_sscc.svg | 31 + doc/TRO_Katalog/tro_graphs/2sep1swi.svg | 32 + doc/TRO_Katalog/tro_graphs/edge_legend.svg | 36 + .../tro_graphs/emptycarrbuffer.svg | 37 + doc/TRO_Katalog/tro_graphs/gen_tro_graphs.py | 509 ++++ doc/TRO_Katalog/tro_graphs/loadingboom.svg | 26 + doc/TRO_Katalog/tro_graphs/pinstore_auto.svg | 37 + doc/TRO_Katalog/tro_graphs/uh01.dot | 108 + doc/TRO_Katalog/tro_graphs/uh01.svg | 814 ++++++ doc/TRO_Katalog/tro_graphs/uh02.dot | 239 ++ doc/TRO_Katalog/tro_graphs/uh02.svg | 2069 ++++++++++++++ doc/TRO_Katalog/tro_graphs/uh03.dot | 273 ++ doc/TRO_Katalog/tro_graphs/uh03.svg | 2384 +++++++++++++++++ doc/TRO_Katalog/tro_graphs/uh04.dot | 82 + doc/TRO_Katalog/tro_graphs/uh04.svg | 565 ++++ doc/TRO_Katalog/tro_graphs/uh05.dot | 105 + doc/TRO_Katalog/tro_graphs/uh05.svg | 774 ++++++ doc/TRO_Katalog/tro_graphs/vario.svg | 26 + .../tro_graphs/vario_workstation.svg | 30 + 40 files changed, 14952 insertions(+) create mode 100644 doc/TRO_Katalog/TRO_Katalog.md create mode 100644 doc/TRO_Katalog/connect.ini create mode 100644 doc/TRO_Katalog/img/1sep.png create mode 100644 doc/TRO_Katalog/img/1sep_1swi.png create mode 100644 doc/TRO_Katalog/img/1sep_sscc.png create mode 100644 doc/TRO_Katalog/img/Pinstore.png create mode 100644 doc/TRO_Katalog/img/README.md create mode 100644 doc/TRO_Katalog/scl_templates/FB_EmptyCarrBuffer.scl create mode 100644 doc/TRO_Katalog/scl_templates/FB_ILS_MTRO_1Sep.scl create mode 100644 doc/TRO_Katalog/scl_templates/FB_ILS_MTRO_1Sep1Swi.scl create mode 100644 doc/TRO_Katalog/scl_templates/FB_ILS_MTRO_1Sep2Swi.scl create mode 100644 doc/TRO_Katalog/scl_templates/FB_ILS_MTRO_1Sep_SSCC.scl create mode 100644 doc/TRO_Katalog/scl_templates/FB_ILS_MTRO_2Sep1Swi.scl create mode 100644 doc/TRO_Katalog/scl_templates/FB_ILS_MTRO_PinStore_Auto.scl create mode 100644 doc/TRO_Katalog/scl_templates/FB_ILS_MTRO_Vario.scl create mode 100644 doc/TRO_Katalog/scl_templates/FB_ILS_MTRO_Vario_workStation.scl create mode 100644 doc/TRO_Katalog/scl_templates/FB_ILS_MTRO_Vario_workStation_CallSite.scl create mode 100644 doc/TRO_Katalog/scl_templates/FB_LoadingBoom_INBOUND.scl create mode 100644 doc/TRO_Katalog/tro_graphs/1sep.svg create mode 100644 doc/TRO_Katalog/tro_graphs/1sep1swi.svg create mode 100644 doc/TRO_Katalog/tro_graphs/1sep2swi.svg create mode 100644 doc/TRO_Katalog/tro_graphs/1sep_sscc.svg create mode 100644 doc/TRO_Katalog/tro_graphs/2sep1swi.svg create mode 100644 doc/TRO_Katalog/tro_graphs/edge_legend.svg create mode 100644 doc/TRO_Katalog/tro_graphs/emptycarrbuffer.svg create mode 100644 doc/TRO_Katalog/tro_graphs/gen_tro_graphs.py create mode 100644 doc/TRO_Katalog/tro_graphs/loadingboom.svg create mode 100644 doc/TRO_Katalog/tro_graphs/pinstore_auto.svg create mode 100644 doc/TRO_Katalog/tro_graphs/uh01.dot create mode 100644 doc/TRO_Katalog/tro_graphs/uh01.svg create mode 100644 doc/TRO_Katalog/tro_graphs/uh02.dot create mode 100644 doc/TRO_Katalog/tro_graphs/uh02.svg create mode 100644 doc/TRO_Katalog/tro_graphs/uh03.dot create mode 100644 doc/TRO_Katalog/tro_graphs/uh03.svg create mode 100644 doc/TRO_Katalog/tro_graphs/uh04.dot create mode 100644 doc/TRO_Katalog/tro_graphs/uh04.svg create mode 100644 doc/TRO_Katalog/tro_graphs/uh05.dot create mode 100644 doc/TRO_Katalog/tro_graphs/uh05.svg create mode 100644 doc/TRO_Katalog/tro_graphs/vario.svg create mode 100644 doc/TRO_Katalog/tro_graphs/vario_workstation.svg diff --git a/doc/TRO_Katalog/TRO_Katalog.md b/doc/TRO_Katalog/TRO_Katalog.md new file mode 100644 index 0000000..0185502 --- /dev/null +++ b/doc/TRO_Katalog/TRO_Katalog.md @@ -0,0 +1,493 @@ +# TRO Catalog — Building Blocks of the Skeleton Program (UH01–UH05) + +**As of: 2026-07-20** + +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 +skeleton program needs comes together — **schematic diagram, real layout image, +SCL template, JSON example, and BricsCAD symbol attributes**. It links the +existing individual documents: + +- [TRO_Typen.md](../TRO_Typen.md) — type overview + JSON proposals per type +- [Json_Layout-Konzept.md](../Json_Layout-Konzept.md) — full JSON layout model +- [BricsCAD_TRO_Symbol.md](../BricsCAD_TRO_Symbol.md) — symbol / attribute definition +- [TRO_overview_table.md](../TRO_overview_table.md) — all 250 TRO instances with topology +- [scl_templates/](scl_templates/) — the 11 SCL template files (copied into this catalog) + +--- + +## How to populate the catalog (images) + +Each type now carries a **generated connection schematic** (`tro_graphs/.svg`) +next to its Mermaid diagram — it shows the block with its *possible* connecting edges +(normal / dir2 / dir3 / bypass / finger / PLC / EXTERN), each drawn with its own colour +and line style (see the [line-type legend](#edge--connection-line-types) below). These +SVGs, the shared `edge_legend.svg`, and the per-controller topology graphs +([UH01–UH05](#controller-topology-graphs-uh01uh05)) are all produced by +[`tro_graphs/gen_tro_graphs.py`](tro_graphs/gen_tro_graphs.py) from +[`connect.ini`](connect.ini) — re-run it after editing the topology: + +``` +py doc/TRO_Katalog/tro_graphs/gen_tro_graphs.py +``` + +The **real layout images** must still come from BricsCAD — the DWG layouts +(`ST500592_10_5-13_ILS.dwg`, `..._Omniflo.dwg`, ~265 MB) live under +`Documents\Fortna-Layout\` and can only be opened in BricsCAD. + +**Procedure per type:** + +1. In BricsCAD, locate the **example TRO** named in each table + (the instance lists below tell you which TROs are of that type). +2. Export/screenshot the view (`EXPORT` → PNG, or a screen capture). +3. Place the image as `img/.png` in this folder — the filename is already + given in each `![…]` placeholder. Once the file exists, the image appears. + +See the consolidated [Capture Checklist](#capture-checklist) at the end. + +--- + +## Color legend (as in the layout / Mermaid) + +Analogous to the `classDef` colors in Json_Layout-Konzept.md and the recommendation +to color the BricsCAD symbol per `TRO_TYPE`: + +| Color | Type group | +|---|---| +| 🔵 Blue | Separator (`1Sep`) | +| 🟠 Orange | Switch (`1Sep1Swi`, `1Sep2Swi`) | +| 🟣 Purple | Vario / chain conveyor (`Vario`, `Vario_workStation`) | +| 🔴 Red | Scanner (`1Sep_SSCC`) | +| 🟢 Green | Buffer / storage (`EmptyCarrBuffer`, `PinStore_Auto`) | +| ⚪ Gray | System infeed/outfeed, external, Loading Boom | + +--- + +## Edge / connection line types + +The connecting edges between TROs come in the kinds tracked in +[`connect.ini`](connect.ini) (`kind` column). Each is drawn with a consistent colour +and line style in both the per-type schematics and the controller graphs: + +![Edge / connection line-type legend](tro_graphs/edge_legend.svg) + +| Kind | Style | Meaning | +|---|---|---| +| `normal` | solid dark | standard transfer between two jam areas | +| `dir2` | orange dashed | switch output, direction 2 (from `FC_Direction`) | +| `dir3` | brown dotted | switch output, direction 3 (from `FC_Direction`) | +| `bypass` | blue long-dash | bypass around a storage block (`PinStore_Auto`) | +| `finger` | purple dash-dot | chain-conveyor finger / index transfer (`Vario`) | +| `PLC` | gray dotted | PLC / WCS boundary — telegram or storage handshake | +| `EXTERN` | blue-gray solid | infeed / outfeed to another PLC (system boundary) | + +--- + +## Overview of all TRO types + +| # | Type | FB block | Instances | Example | Source | Detail | +|---|---|---|---:|---|---|---| +| 1 | `1Sep` | `FB_ILS_MTRO_1Sep` | 96 | TRO100 | `.liblink` | [↓](#1-1sep--standard-separator) | +| 2 | `1Sep1Swi` | `FB_ILS_MTRO_1Sep1Swi` | 49 | TRO107 | `.liblink` | [↓](#2-1sep1swi--separator--1-switch) | +| 3 | `1Sep2Swi` | `FB_ILS_MTRO_1Sep2Swi` | 2 | TRO267 | `.liblink` | [↓](#3-1sep2swi--separator--2-switches) | +| 4 | `1Sep_SSCC` | `FB_ILS_MTRO_1Sep_SSCC` | 2 | TRO105 | `.liblink` | [↓](#4-1sep_sscc--separator--sscc-scanner) | +| 5 | `Vario` | `FB_ILS_MTRO_Vario` | 70 | TRO115 | `.liblink` | [↓](#5-vario--chain-conveyor) | +| 6 | `PinStore_Auto` | `FB_ILS_MTRO_PinStore_Auto` | 24 | TRO208 | `.liblink` | [↓](#6-pinstore_auto--automatic-pin-storage) | +| 7 | `Vario_workStation` | `FB_ILS_MTRO_Vario_workStation` | 3 | TRO421 | local | [↓](#7-vario_workstation--manual-work-station) | +| 8 | `EmptyCarrBuffer` | `FB_EmptyCarrBuffer` | 2 | TRO101 | local | [↓](#8-emptycarrbuffer--empty-carrier-buffer) | +| 9 | `LoadingBoom` | `FB_LoadingBoom_INBOUND` | 2 | fbLoadingBoom1 | local | [↓](#9-loadingboom--loading-boom) | +| 10 | `2Sep1Swi` | `FB_ILS_MTRO_2Sep1Swi` | 0 | — | local | [↓](#10-2sep1swi--unused-concept-block) | + +**Total: 250 TRO instances across 9 actively used types** (`2Sep1Swi` prepared, never instantiated). + +--- + +## 1. `1Sep` — Standard Separator + +**FB:** `FB_ILS_MTRO_1Sep` · **Example:** TRO100 (UH01) · **96 instances** +· **Template:** [scl_templates/FB_ILS_MTRO_1Sep.scl](scl_templates/FB_ILS_MTRO_1Sep.scl) +· **JSON:** [TRO_Typen.md §1](../TRO_Typen.md#1-tro-typ-1sep) + +A separator: holds the carrier at the stopper, then (after an optional scan) releases +exactly one carrier onward. One entry, one exit. + +**Schematic:** + +```mermaid +flowchart LR + classDef sep fill:#d4e8ff,stroke:#3388cc + IN([Entry JamArea]) -->|sensorInSep BG| S["1Sep
Stopper MB"]:::sep + S -->|"release"| OUT([Exit JamArea]) +``` + +**Connection schematic:** + +![1Sep connection schematic](tro_graphs/1sep.svg) + +**Real layout image:** + +![1Sep – layout example TRO100](img/1sep_layout.png) +> _Placeholder — BricsCAD screenshot of **TRO100** (or any other 1Sep instance). File: `img/1sep_layout.png`._ + +**Key symbol attributes:** `TRO_ID`, `TRO_TYPE=1Sep`, `SENSOR_IN_SEP`, `SENSOR_JAM2` (opt.), `STOPPER_OUTPUT`, `PRIORITY_TYPE`. + +**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. + +--- + +## 2. `1Sep1Swi` — Separator + 1 Switch + +**FB:** `FB_ILS_MTRO_1Sep1Swi` · **Example:** TRO107 (UH01) · **49 instances** +· **Template:** [scl_templates/FB_ILS_MTRO_1Sep1Swi.scl](scl_templates/FB_ILS_MTRO_1Sep1Swi.scl) +· **JSON:** [TRO_Typen.md §2](../TRO_Typen.md#2-tro-typ-1sep1swi) + +Separator with one switch → two routed exits (Dir1/Dir2). The routing decision comes +from `FC_Direction`. A priority manager is possible (`PRIORITY_TYPE=Dir2Manager`). + +**Schematic:** + +```mermaid +flowchart LR + classDef swi fill:#ffe4a0,stroke:#cc8800 + IN([Entry JamArea]) -->|sensorInSep| S["1Sep1Swi
Stopper + Switch"]:::swi + S -->|"Dir1 · exit2"| O2([Exit JamArea 2]) + S -->|"Dir2 · exit3"| O3([Exit JamArea 3]) +``` + +**Connection schematic:** + +![1Sep1Swi connection schematic](tro_graphs/1sep1swi.svg) + +**Real layout image:** + +![1Sep1Swi – layout example TRO107](img/1sep1swi_layout.png) +> _Placeholder — BricsCAD screenshot of **TRO107** (Switch Boom 1). File: `img/1sep1swi_layout.png`._ + +**Key symbol attributes:** in addition to `1Sep`: `SWITCH_OUTPUT`, `SENSOR_JAM3`, `N_TO_1_DESTINATIONS`, `PRIORITY_TYPE=Dir2Manager`. + +**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. + +--- + +## 3. `1Sep2Swi` — Separator + 2 Switches + +**FB:** `FB_ILS_MTRO_1Sep2Swi` · **Example:** TRO267 (UH02) · **2 instances** +· **Template:** [scl_templates/FB_ILS_MTRO_1Sep2Swi.scl](scl_templates/FB_ILS_MTRO_1Sep2Swi.scl) +· **JSON:** [TRO_Typen.md §3](../TRO_Typen.md#3-tro-typ-1sep2swi) + +Separator with two switches (`switch1`, `switch2`) and up to 3–4 exits +(`exit2`–`exit4`); additionally a barcode scanner at the entry. + +**Schematic:** + +```mermaid +flowchart LR + classDef swi fill:#ffe4a0,stroke:#cc8800 + IN([Entry JamArea]) -->|"sensorInSep + scanner"| S["1Sep2Swi
Stopper + 2 switches"]:::swi + S -->|"exit2 · dir3"| O2([Exit 2]) + S -->|"exit3"| O3([Exit 3]) + S -->|"exit4"| O4([Exit 4]) +``` + +**Connection schematic:** + +![1Sep2Swi connection schematic](tro_graphs/1sep2swi.svg) + +**Real layout image:** + +![1Sep2Swi – layout example TRO267](img/1sep2swi_layout.png) +> _Placeholder — BricsCAD screenshot of **TRO267** or **TRO268** (UH02). File: `img/1sep2swi_layout.png`._ + +**Key symbol attributes:** like `1Sep1Swi`, but two switch exits + `SCANNER_ID`. + +**All instances (2):** TRO267, TRO268. + +--- + +## 4. `1Sep_SSCC` — Separator + SSCC Scanner + +**FB:** `FB_ILS_MTRO_1Sep_SSCC` · **Example:** TRO105 (UH01) · **2 instances** +· **Template:** [scl_templates/FB_ILS_MTRO_1Sep_SSCC.scl](scl_templates/FB_ILS_MTRO_1Sep_SSCC.scl) +· **JSON:** [TRO_Typen.md §4](../TRO_Typen.md#4-tro-typ-1sep_sscc) + +`1Sep` + a second SSCC scanner + end-measurement sensor + WCS `DReqM` telegram +(dock request). + +**Schematic:** + +```mermaid +flowchart LR + classDef sscc fill:#ffd4d4,stroke:#cc3333 + IN([Entry JamArea]) -->|"sensorInSep"| S["1Sep_SSCC
Barcode + SSCC + end-meas."]:::sscc + S -.->|"DReqM telegram"| WCS([WCS/WES]) + S -->|"release"| OUT([Exit JamArea]) +``` + +**Connection schematic:** + +![1Sep_SSCC connection schematic](tro_graphs/1sep_sscc.svg) + +**Real layout image:** + +![1Sep_SSCC – layout example TRO105](img/1sep_sscc_layout.png) +> _Placeholder — BricsCAD screenshot of **TRO105** (SSCC Boom 1) or **TRO110** (Boom 2). File: `img/1sep_sscc_layout.png`._ + +**Key symbol attributes:** like `1Sep` + `SCANNER_ID`, `HAS_SSCC_SCANNER=true`. + +**All instances (2):** TRO105, TRO110. + +--- + +## 5. `Vario` — Chain Conveyor + +**FB:** `FB_ILS_MTRO_Vario` · **Example:** TRO115 (UH01) · **70 instances** +· **Template:** [scl_templates/FB_ILS_MTRO_Vario.scl](scl_templates/FB_ILS_MTRO_Vario.scl) +· **JSON:** [TRO_Typen.md §5](../TRO_Typen.md#5-tro-typ-vario) + +Driven chain conveyor segment with finger/position sensors (accumulate/index), motor +protection. In UH03 it is also reused for F2H segments (marked by comment only). + +**Schematic:** + +```mermaid +flowchart LR + classDef vario fill:#e8d4f0,stroke:#883388 + IN([Entry JamArea]) -->|"sensorInSep"| V["Vario
chain · finger/pos · motor MA"]:::vario + V -->|"finger · finger jam"| OUT([Finger Exit JamArea]) +``` + +**Connection schematic:** + +![Vario connection schematic](tro_graphs/vario.svg) + +**Real layout image:** + +![Vario – layout example TRO115](img/vario_layout.png) +> _Placeholder — BricsCAD screenshot of **TRO115** (Loaded to Storage). File: `img/vario_layout.png`._ + +**Key symbol attributes:** `SENSOR_IN_SEP`, `STOPPER_OUTPUT` (vario motor), `IS_BORNER` (at infeed points), Vario sensors via topology. + +**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. + +--- + +## 6. `PinStore_Auto` — Automatic Pin Storage + +**FB:** `FB_ILS_MTRO_PinStore_Auto` · **Example:** TRO208 (UH02, block 1.1.1) · **24 instances** +· **Template:** [scl_templates/FB_ILS_MTRO_PinStore_Auto.scl](scl_templates/FB_ILS_MTRO_PinStore_Auto.scl) +· **JSON:** [TRO_Typen.md §6](../TRO_Typen.md#6-tro-typ-pinstore_auto) + +Storage block: pin-band infeed + up to 19 line separators + encoder position sensing + +scanner. Interfaces with the restacking / storage-removal logic +(`FB_StockRemovalBLKModul` etc.). **Outlier** — really a storage controller, not a +routing TRO. + +**Schematic:** + +```mermaid +flowchart LR + classDef store fill:#d4f0d4,stroke:#338833 + IN([Entry JamArea]) -->|"pin sep + encoder + scanner"| P["PinStore_Auto
up to 19 storage lines"]:::store + P -->|"bypass / exit"| OUT([Exit JamArea]) + P <-.->|"StorageRemoval handshake"| MFR([restacking intelligence]) +``` + +**Connection schematic:** + +![PinStore_Auto connection schematic](tro_graphs/pinstore_auto.svg) + +**Real layout image:** + +![PinStore_Auto – layout example TRO208](img/pinstore_auto_layout.png) +> _Placeholder — BricsCAD screenshot of a storage block, e.g. **TRO208** (block 1.1.1). File: `img/pinstore_auto_layout.png`._ + +**Key symbol attributes:** special case — mostly via storage configuration (lines, encoder, scanner station) rather than the standard TRO symbol. + +**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. + +--- + +## 7. `Vario_workStation` — Manual Work Station + +**FB:** `FB_ILS_MTRO_Vario_workStation` · **Example:** TRO421 (UH04) · **3 instances** +· **Template:** [scl_templates/FB_ILS_MTRO_Vario_workStation.scl](scl_templates/FB_ILS_MTRO_Vario_workStation.scl) · [CallSite](scl_templates/FB_ILS_MTRO_Vario_workStation_CallSite.scl) +· **JSON:** [TRO_Typen.md §7](../TRO_Typen.md#7-tro-typ-vario_workstation) + +`Vario` variant for a manual work station: additional station sensor + release button + +load-error sensor. + +**Schematic:** + +```mermaid +flowchart LR + classDef vario fill:#e8d4f0,stroke:#883388 + IN([Entry JamArea]) -->|"sensorInSep"| V["Vario_workStation
chain + manual station"]:::vario + OP(["👤 operator · release button"]) -.-> V + V -->|"finger"| OUT([Finger Exit JamArea]) +``` + +**Connection schematic:** + +![Vario_workStation connection schematic](tro_graphs/vario_workstation.svg) + +**Real layout image:** + +![Vario_workStation – layout example TRO421](img/vario_workstation_layout.png) +> _Placeholder — BricsCAD screenshot of **TRO421/422/423** (work stations, UH04). File: `img/vario_workstation_layout.png`._ + +**All instances (3):** TRO421, TRO422, TRO423. + +--- + +## 8. `EmptyCarrBuffer` — Empty Carrier Buffer + +**FB:** `FB_EmptyCarrBuffer` · **Example:** TRO101 (UH01) · **2 instances** +· **Template:** [scl_templates/FB_EmptyCarrBuffer.scl](scl_templates/FB_EmptyCarrBuffer.scl) +· **JSON:** [TRO_Typen.md §8](../TRO_Typen.md#8-tro-typ-emptycarrbuffer) · [Json_Layout-Konzept.md §6](../Json_Layout-Konzept.md) + +Multi-line buffer for empty carriers with a distribution switch and a preceding TRO +(`inTro`, a borner). + +**Schematic:** + +```mermaid +flowchart LR + classDef buf fill:#d4f0d4,stroke:#338833 + IN([inTro · borner]) --> B["EmptyCarrBuffer
N lines + line separators"]:::buf + B --> L1[Line 1]:::buf + B --> L2[Line 2]:::buf + B --> LN[Line n]:::buf + B -->|"exit"| OUT([Exit JamArea]) +``` + +**Connection schematic:** + +![EmptyCarrBuffer connection schematic](tro_graphs/emptycarrbuffer.svg) + +**Real layout image:** + +![EmptyCarrBuffer – layout example TRO101](img/emptycarrbuffer_layout.png) +> _Placeholder — BricsCAD screenshot of **TRO101** (buffer right) or **TRO102** (left). File: `img/emptycarrbuffer_layout.png`._ + +**All instances (2):** TRO101, TRO102. + +--- + +## 9. `LoadingBoom` — Loading Boom + +**FB:** `FB_LoadingBoom_INBOUND` · **Example:** fbLoadingBoom1 (UH01) · **2 instances** +· **Template:** [scl_templates/FB_LoadingBoom_INBOUND.scl](scl_templates/FB_LoadingBoom_INBOUND.scl) +· **JSON:** [TRO_Typen.md §9](../TRO_Typen.md#9-tro-typ-loadingboom) · [Json_Layout-Konzept.md §5](../Json_Layout-Konzept.md) + +System infeed loading boom: boom, foot, stopper, tilt/distance sensing. No `TROnnn` +instance name (it is called `fbLoadingBoom1`), but it has a direct TRO link (`relatedTro`). + +**Schematic:** + +```mermaid +flowchart LR + classDef ext fill:#f0f0f0,stroke:#888,stroke-dasharray:5 + IN([Stopper JamArea]) --> LB["LoadingBoom
boom + foot + tilt/distance"]:::ext + LB -->|"exit"| OUT([Exit JamArea]) +``` + +**Connection schematic:** + +![LoadingBoom connection schematic](tro_graphs/loadingboom.svg) + +**Real layout image:** + +![LoadingBoom – layout example Boom1](img/loadingboom_layout.png) +> _Placeholder — BricsCAD screenshot of **LoadingBoom1** (at TRO104) or **LoadingBoom2** (at TRO109). File: `img/loadingboom_layout.png`._ + +**All instances (2):** fbLoadingBoom1 (→ TRO104), fbLoadingBoom2 (→ TRO109). + +--- + +## 10. `2Sep1Swi` — Unused (Concept Block) + +**FB:** `FB_ILS_MTRO_2Sep1Swi` · **Example:** — · **0 instances (never instantiated)** +· **Template:** [scl_templates/FB_ILS_MTRO_2Sep1Swi.scl](scl_templates/FB_ILS_MTRO_2Sep1Swi.scl) +· **JSON:** [TRO_Typen.md §10](../TRO_Typen.md#10-tro-typ-2sep1swi-unbenutzt) + +Dual separator + 1 switch, not wired in any `FB_Main.scl`, step chain mostly commented +out. **No layout image needed** (not in production). + +```mermaid +flowchart LR + classDef swi fill:#ffe4a0,stroke:#cc8800 + IN1([Entry 1]) --> S["2Sep1Swi
2 separators + switch"]:::swi + IN2([Entry 2]) --> S + S --> O2([Exit 2]) + S --> O3([Exit 3]) +``` + +**Connection schematic:** + +![2Sep1Swi connection schematic](tro_graphs/2sep1swi.svg) + +--- + +## Controller topology graphs (UH01–UH05) + +Full per-controller topology, generated from [`connect.ini`](connect.ini) via +[`tro_graphs/gen_tro_graphs.py`](tro_graphs/gen_tro_graphs.py). Nodes are coloured by TRO +type (see [colour legend](#color-legend-as-in-the-layout--mermaid)); edges are styled by +connection kind (see [line-type legend](#edge--connection-line-types)). `EXTERN` boundary +nodes mark infeed/outfeed to another PLC. Each `.svg` is scalable; the `.dot` source can +be re-rendered in any Graphviz viewer. + +| Controller | Focus | Nodes | Graph | Dot source | +|---|---|---:|---|---| +| UH01 | Inbound, loading booms, SSCC, empty-carrier buffers | 36 | [uh01.svg](tro_graphs/uh01.svg) | [uh01.dot](tro_graphs/uh01.dot) | +| UH02 | 3× PinStore blocks (automated storage) | 74 | [uh02.svg](tro_graphs/uh02.svg) | [uh02.dot](tro_graphs/uh02.dot) | +| UH03 | 3× PinStore blocks + F2H | 84 | [uh03.svg](tro_graphs/uh03.svg) | [uh03.dot](tro_graphs/uh03.dot) | +| UH04 | 3× manual work stations | 24 | [uh04.svg](tro_graphs/uh04.svg) | [uh04.dot](tro_graphs/uh04.dot) | +| UH05 | Length measurement + distribution | 32 | [uh05.svg](tro_graphs/uh05.svg) | [uh05.dot](tro_graphs/uh05.dot) | + +**UH01 — Inbound / loading booms / empty-carrier buffers:** + +![UH01 topology graph](tro_graphs/uh01.svg) + +**UH02 — automated storage (3× PinStore):** + +![UH02 topology graph](tro_graphs/uh02.svg) + +**UH03 — automated storage + F2H:** + +![UH03 topology graph](tro_graphs/uh03.svg) + +**UH04 — manual work stations:** + +![UH04 topology graph](tro_graphs/uh04.svg) + +**UH05 — length measurement / distribution:** + +![UH05 topology graph](tro_graphs/uh05.svg) + +--- + +## Capture Checklist + +Export all images from BricsCAD (`Documents\Fortna-Layout\ST500592_10_5-13_ILS.dwg`, or +`..._Omniflo.dwg` if needed) and save them as `img/.png`: + +| ✅ | Type | Example TRO (UH) | Target file | +|---|---|---|---| +| ☐ | `1Sep` | TRO100 (UH01) | `img/1sep_layout.png` | +| ☐ | `1Sep1Swi` | TRO107 (UH01) | `img/1sep1swi_layout.png` | +| ☐ | `1Sep2Swi` | TRO267 (UH02) | `img/1sep2swi_layout.png` | +| ☐ | `1Sep_SSCC` | TRO105 (UH01) | `img/1sep_sscc_layout.png` | +| ☐ | `Vario` | TRO115 (UH01) | `img/vario_layout.png` | +| ☐ | `PinStore_Auto` | TRO208 (UH02) | `img/pinstore_auto_layout.png` | +| ☐ | `Vario_workStation` | TRO421 (UH04) | `img/vario_workstation_layout.png` | +| ☐ | `EmptyCarrBuffer` | TRO101 (UH01) | `img/emptycarrbuffer_layout.png` | +| ☐ | `LoadingBoom` | fbLoadingBoom1 (UH01) | `img/loadingboom_layout.png` | +| — | `2Sep1Swi` | *(unused — no image)* | — | + +> Tip: In addition to the per-type example image, a full-layout screenshot per +> controller (UH01–UH05) is worth capturing as context — e.g. `img/uh01_overview.png`. diff --git a/doc/TRO_Katalog/connect.ini b/doc/TRO_Katalog/connect.ini new file mode 100644 index 0000000..2b381c8 --- /dev/null +++ b/doc/TRO_Katalog/connect.ini @@ -0,0 +1,646 @@ +; ============================================================ +; connect.ini — Routing / Zusammenhalt der TROs (hmf-connect-v1) +; Quelle: doc/img/TRO_Graph/ (inhaltsgleich zu connect.json) +; +; [UHxx.nodes] TRO = | +; [UHxx.connections] cNNN = -> | | +; kind: normal | dir2 | dir3 | bypass | finger +; (dir2/dir3 = Weichenausgang, Richtung aus FC_Direction) +; [UHxx.externals] eNNN = EXTERN -> | (Zulauf) +; eNNN = -> EXTERN | (Ablauf) +; JamArea JAxxxx_y entspricht "DB_JamAreaxxxx".stJamxxxx_y +; ============================================================ + +[UH01.nodes] +TRO100 = 1Sep | TRO 100 (1Sep) +TRO101 = EmptyCarrBuffer | TRO101 (Empty Buffer rechts) +TRO101_IN = 1Sep | TRO 101_IN(1Sep) +TRO102 = EmptyCarrBuffer | TRO102 (Empty Buffer links) +TRO102_IN = 1Sep | TRO 102_IN(1Sep) +TRO103 = 1Sep | TRO 103 (1Sep) +TRO104 = 1Sep | TRO 104 (1Sep)+Scanner +TRO105 = 1Sep_SSCC | TRO 105 (1Sep)+Scanner +TRO106 = 1Sep | TRO 106 (1Sep) +TRO107 = 1Sep1Swi | TRO 107(1Sep1Swi) +TRO108 = 1Sep | TRO 108 (1Sep) +TRO109 = 1Sep | TRO 109 (1Sep)+Scanner +TRO110 = 1Sep_SSCC | TRO 110 (1Sep)+Scanner +TRO111 = 1Sep | TRO 111 (1Sep) +TRO112 = 1Sep1Swi | TRO 112 (1Sep1Swi) +TRO113 = 1Sep | TRO 113 (1Sep)+Scanner +TRO114 = 1Sep1Swi | TRO 114 (1Sep1Switch)+Scanner +TRO115 = Vario | TRO 115 (Vario) +TRO116 = 1Sep | TRO 116 (1Sep) +TRO117 = 1Sep | TRO 117 (1Sep) + Scanner +TRO120 = Vario | TRO 120 (Vario) +TRO121 = Vario | TRO 121(Vario) +TRO122 = 1Sep | TRO 122 (1Sep) +TRO123 = Vario | TRO 123 (Vario) +TRO124 = 1Sep1Swi | TRO 124 (1Sep1Switch) +TRO125 = 1Sep | TRO 125 (1Sep) +TRO126 = Vario | TRO 126 (Vario) +TRO127 = Vario | TRO 127 (Vario) +TRO128 = Vario | TRO 128 (Vario) +TRO129 = 1Sep | TRO 129 (1Sep) +TRO130 = 1Sep | TRO 130 (1Sep) +TRO131 = Vario | TRO 131 (Vario) +TRO133 = Vario | TRO 133 (Vario) +TRO134 = Vario | TRO 134 (Vario) +fbLoadingBoom1 = LoadingBoom_INBOUND | LoadingBoom 1 +fbLoadingBoom2 = LoadingBoom_INBOUND | LoadingBoom 2 + +[UH01.connections] +c001 = TRO128 -> TRO100 | JA0100_1 | finger +c002 = TRO100 -> TRO101_IN | JA0101_1 | normal +c003 = TRO101_IN -> TRO102_IN | JA0101_2 | normal +c004 = TRO102 -> TRO107 | JA0102_1 | normal +c005 = TRO117 -> TRO107 | JA0102_1 | normal +c006 = TRO101 -> TRO112 | JA0102_2 | normal +c007 = TRO106 -> TRO112 | JA0102_2 | normal +c008 = TRO107 -> TRO112 | JA0102_2 | dir2 +c009 = TRO111 -> TRO113 | JA0102_3 | normal +c010 = TRO112 -> TRO113 | JA0102_3 | dir2 +c011 = TRO113 -> TRO114 | JA0102_4 | normal +c012 = TRO114 -> TRO116 | JA0102_5 | dir2 +c013 = TRO116 -> TRO117 | JA0102_6 | normal +c014 = TRO107 -> TRO103 | JA0103_1 | normal +c015 = TRO103 -> TRO104 | JA0104_1 | normal +c016 = TRO104 -> fbLoadingBoom1 | JA0104_2 | normal +c017 = fbLoadingBoom1 -> TRO105 | JA0104_3 | normal +c018 = TRO105 -> TRO106 | JA0106_2 | normal +c019 = TRO112 -> TRO108 | JA0107_1 | normal +c020 = TRO108 -> TRO109 | JA0108_1 | normal +c021 = TRO109 -> fbLoadingBoom2 | JA0108_2 | normal +c022 = fbLoadingBoom2 -> TRO110 | JA0108_3 | normal +c023 = TRO110 -> TRO111 | JA0110_2 | normal +c024 = TRO115 -> TRO120 | JA4103_1 | finger +c025 = TRO125 -> TRO126 | JA4203_1 | normal +c026 = TRO129 -> TRO130 | JA4204_1 | normal +c027 = TRO124 -> TRO125 | JA4204_2 | normal +c028 = TRO133 -> TRO129 | JA4302_2 | finger +c029 = TRO134 -> TRO131 | JA4403_1 | finger +c030 = TRO124 -> TRO127 | JA4501_1 | dir2 +c031 = TRO130 -> TRO127 | JA4501_1 | normal +c032 = TRO127 -> TRO128 | JA4501_2 | finger +c033 = TRO122 -> TRO123 | JA4502_1 | normal +c034 = TRO123 -> TRO124 | JA4502_2 | finger +c035 = TRO121 -> TRO122 | JA4503_2 | finger +c036 = TRO101_IN -> TRO101 | JamBuffer101 | normal +c037 = TRO102_IN -> TRO102 | JamBuffer102 | normal + +[UH01.externals] +e001 = EXTERN -> TRO115 | JA4104_1 +e002 = EXTERN -> TRO133 | JA4302_1 +e003 = EXTERN -> TRO134 | JA4402_1 +e004 = EXTERN -> TRO121 | JA4503_1 + +[UH02.nodes] +TRO200 = Vario | TRO 200 (Vario) +TRO201 = 1Sep | TRO 201 (1Sep) +TRO202 = 1Sep1Swi | TRO 202 (1Sep1Switch)+Scanner(BX2103) +TRO203 = 1Sep1Swi | TRO 203 (1Sep1Switch) + Scanner (BX2111) +TRO204 = 1Sep1Swi | TRO 204(1Sep1Switch) + Scanner(BX2112) +TRO205 = 1Sep1Swi | TRO 205 (1Sep1Switch) + Scanner(BX2114) +TRO206 = 1Sep1Swi | TRO 206 (1Sep1Switch)+Scanner(BX2113) +TRO207 = 1Sep | TRO 207(1Sep) +TRO208 = PinStore_Auto | Aufruf: TRO208 +TRO209 = Vario | TRO 209 (Vario) +TRO210 = 1Sep | TRO 210 (1Sep) +TRO211 = PinStore_Auto | Aufruf: TRO211 +TRO212 = Vario | TRO 212 (Vario) +TRO213 = 1Sep | TRO 213 (1Sep) +TRO214 = PinStore_Auto | Aufruf: TRO214 +TRO215 = Vario | TRO 215 (Vario) +TRO216 = 1Sep | TRO 216 (1Sep) +TRO217 = PinStore_Auto | Aufruf: TRO217 +TRO218 = Vario | TRO 218 (Vario) +TRO219 = 1Sep | TRO 219(1Sep) +TRO220 = Vario | TRO 220 (Vario) +TRO221 = 1Sep | TRO 221 (1Sep) +TRO222 = 1Sep1Swi | TRO 222 (1Sep1Switch)+Scanner(BX2121) +TRO223 = 1Sep1Swi | TRO 223 (1Sep1Switch)+Scanner(BX2126) +TRO224 = 1Sep1Swi | TRO 224 (1Sep1Switch)+Scanner(BX2127) +TRO225 = 1Sep1Swi | TRO 225(1Sep1Switch)+Scanner(BX2129) +TRO226 = 1Sep1Swi | TRO 226 (1Sep1Switch)+Scanner(BX2128) +TRO227 = 1Sep | TRO 227 (1Sep) +TRO228 = PinStore_Auto | Aufruf: TRO228 +TRO229 = Vario | TRO 229 (Vario) +TRO230 = 1Sep | TRO 230 (1Sep) +TRO231 = PinStore_Auto | Aufruf: TRO231 +TRO232 = Vario | TRO 232 (Vario) +TRO233 = 1Sep | TRO 233 (1Sep) +TRO234 = PinStore_Auto | Aufruf: TRO234 +TRO235 = Vario | TRO 235 (Vario) +TRO236 = 1Sep | TRO 236 (1Sep) +TRO237 = PinStore_Auto | Aufruf: TRO237 +TRO238 = Vario | TRO 238 (Vario) +TRO239 = 1Sep | TRO 239 (1Sep) +TRO240 = Vario | TRO 240 (Vario) +TRO241 = 1Sep | TRO 241(1Sep) +TRO242 = 1Sep1Swi | TRO 242 (1Sep1Switch)+Scanner(BX2130) +TRO243 = 1Sep1Swi | TRO 243 (1Sep1Switch)+Scanner(BX3137) +TRO244 = 1Sep1Swi | TRO 244 (1Sep1Switch)+Scanner(BX2136) +TRO245 = 1Sep1Swi | TRO 245 (1Sep1Switch)+Scanner(BX2138) +TRO246 = 1Sep1Swi | TRO 246 (1Sep1Switch)+Scanner(BX2137) +TRO247 = 1Sep | TRO 247(1Sep) +TRO248 = PinStore_Auto | Aufruf: TRO248 +TRO249 = Vario | TRO 249 (Vario) +TRO250 = 1Sep | TRO 250 (1Sep) +TRO251 = PinStore_Auto | Aufruf: TRO251 +TRO252 = Vario | TRO 252 (Vario) +TRO253 = 1Sep | TRO 253 (1Sep) +TRO254 = PinStore_Auto | Aufruf: TRO254 +TRO255 = Vario | TRO 255 (Vario) +TRO256 = 1Sep | TRO 256 (1Sep) +TRO257 = PinStore_Auto | Aufruf: TRO257 +TRO258 = Vario | TRO 258 (Vario) +TRO259 = 1Sep | TRO 259 (1Sep) +TRO260 = Vario | TRO 260 (Vario) + Scanner (BX2115) +TRO261 = 1Sep | TRO 261 (1Sep) +TRO262 = Vario | TRO 262 (Vario) + Scanner (BX2109) +TRO263 = 1Sep | TRO 263 (1Sep) +TRO264 = Vario | TRO 264 (Vario) + Scanner (BX2108) +TRO265 = 1Sep | TRO 265 (1Sep) +TRO266 = 1Sep | TRO 266(1Sep) +TRO267 = 1Sep2Swi | TRO 267 (1Sep2Switch)+Scanner(BX2100) +TRO268 = 1Sep2Swi | TRO 268 (1Sep2Switch)+Scanner(BX2101) +TRO269 = 1Sep | TRO 269 (1Sep)+Scanner (BX2102) +TRO270 = Vario | TRO 270 (Vario) +TRO272 = Vario | TRO 272 (Vario) +TRO274 = 1Sep | TRO 274 (1Sep) +TRO275 = 1Sep | TRO 275 (1Sep) + +[UH02.connections] +c001 = TRO202 -> TRO211 | JA1101_1 | dir2 +c002 = TRO213 -> TRO211 | JA1101_1 | normal +c003 = TRO211 -> TRO208 | JA1101_2 | bypass +c004 = TRO210 -> TRO208 | JA1101_2 | normal +c005 = TRO201 -> TRO202 | JA1102_1 | normal +c006 = TRO202 -> TRO214 | JA1102_2 | normal +c007 = TRO216 -> TRO214 | JA1102_2 | normal +c008 = TRO214 -> TRO217 | JA1102_3 | bypass +c009 = TRO219 -> TRO217 | JA1102_3 | normal +c010 = TRO208 -> TRO203 | JA1103_1 | normal +c011 = TRO211 -> TRO204 | JA1103_2 | normal +c012 = TRO203 -> TRO204 | JA1103_2 | dir2 +c013 = TRO217 -> TRO205 | JA1104_1 | normal +c014 = TRO214 -> TRO206 | JA1104_2 | normal +c015 = TRO205 -> TRO206 | JA1104_2 | normal +c016 = TRO204 -> TRO207 | JA1104_3 | dir2 +c017 = TRO206 -> TRO207 | JA1104_3 | normal +c018 = TRO203 -> TRO209 | JA1105_1 | normal +c019 = TRO209 -> TRO210 | JA1105_2 | finger +c020 = TRO204 -> TRO212 | JA1106_1 | normal +c021 = TRO212 -> TRO213 | JA1106_2 | finger +c022 = TRO206 -> TRO215 | JA1107_1 | dir2 +c023 = TRO215 -> TRO216 | JA1107_2 | finger +c024 = TRO205 -> TRO218 | JA1108_1 | dir2 +c025 = TRO218 -> TRO219 | JA1108_2 | finger +c026 = TRO200 -> TRO201 | JA1109_2 | finger +c027 = TRO268 -> TRO269 | JA1110_1 | dir3 +c028 = TRO261 -> TRO274 | JA1110_2 | normal +c029 = TRO269 -> TRO274 | JA1110_2 | normal +c030 = TRO263 -> TRO266 | JA1110_3 | normal +c031 = TRO274 -> TRO266 | JA1110_3 | normal +c032 = TRO265 -> TRO267 | JA1110_4 | normal +c033 = TRO266 -> TRO267 | JA1110_4 | normal +c034 = TRO267 -> TRO275 | JA1110_5 | dir3 +c035 = TRO275 -> TRO268 | JA1110_6 | normal +c036 = TRO222 -> TRO231 | JA1201_1 | dir2 +c037 = TRO233 -> TRO231 | JA1201_1 | normal +c038 = TRO231 -> TRO228 | JA1201_2 | bypass +c039 = TRO230 -> TRO228 | JA1201_2 | normal +c040 = TRO221 -> TRO222 | JA1202_1 | normal +c041 = TRO222 -> TRO234 | JA1202_2 | normal +c042 = TRO236 -> TRO234 | JA1202_2 | normal +c043 = TRO234 -> TRO237 | JA1202_3 | bypass +c044 = TRO239 -> TRO237 | JA1202_3 | normal +c045 = TRO228 -> TRO223 | JA1203_1 | normal +c046 = TRO231 -> TRO224 | JA1203_2 | normal +c047 = TRO223 -> TRO224 | JA1203_2 | dir2 +c048 = TRO237 -> TRO225 | JA1204_1 | normal +c049 = TRO234 -> TRO226 | JA1204_2 | normal +c050 = TRO225 -> TRO226 | JA1204_2 | normal +c051 = TRO224 -> TRO227 | JA1204_3 | dir2 +c052 = TRO226 -> TRO227 | JA1204_3 | normal +c053 = TRO223 -> TRO229 | JA1205_1 | normal +c054 = TRO229 -> TRO230 | JA1205_2 | finger +c055 = TRO224 -> TRO232 | JA1206_1 | normal +c056 = TRO232 -> TRO233 | JA1206_2 | finger +c057 = TRO226 -> TRO235 | JA1207_1 | dir2 +c058 = TRO235 -> TRO236 | JA1207_2 | finger +c059 = TRO225 -> TRO238 | JA1208_1 | dir2 +c060 = TRO238 -> TRO239 | JA1208_2 | finger +c061 = TRO220 -> TRO221 | JA1209_2 | finger +c062 = TRO248 -> TRO243 | JA1301_1 | normal +c063 = TRO251 -> TRO244 | JA1301_2 | normal +c064 = TRO243 -> TRO244 | JA1301_2 | normal +c065 = TRO257 -> TRO245 | JA1302_1 | normal +c066 = TRO254 -> TRO246 | JA1302_2 | normal +c067 = TRO245 -> TRO246 | JA1302_2 | dir2 +c068 = TRO242 -> TRO251 | JA1303_1 | normal +c069 = TRO253 -> TRO251 | JA1303_1 | normal +c070 = TRO251 -> TRO248 | JA1303_2 | bypass +c071 = TRO250 -> TRO248 | JA1303_2 | normal +c072 = TRO241 -> TRO242 | JA1304_1 | normal +c073 = TRO242 -> TRO254 | JA1304_2 | dir2 +c074 = TRO256 -> TRO254 | JA1304_2 | normal +c075 = TRO254 -> TRO257 | JA1304_3 | bypass +c076 = TRO259 -> TRO257 | JA1304_3 | normal +c077 = TRO243 -> TRO249 | JA1305_1 | dir2 +c078 = TRO249 -> TRO250 | JA1305_2 | finger +c079 = TRO244 -> TRO252 | JA1306_1 | dir2 +c080 = TRO252 -> TRO253 | JA1306_2 | finger +c081 = TRO246 -> TRO255 | JA1307_1 | normal +c082 = TRO255 -> TRO256 | JA1307_2 | finger +c083 = TRO245 -> TRO258 | JA1308_1 | normal +c084 = TRO258 -> TRO259 | JA1308_2 | finger +c085 = TRO240 -> TRO241 | JA1309_2 | finger +c086 = TRO264 -> TRO265 | JA1401_2 | finger +c087 = TRO262 -> TRO263 | JA1501_2 | finger +c088 = TRO260 -> TRO261 | JA1601_2 | finger + +[UH02.externals] +e001 = EXTERN -> TRO200 | JA1109_1 +e002 = EXTERN -> TRO220 | JA1209_1 +e003 = TRO244 -> EXTERN | JA1302_3 +e004 = TRO246 -> EXTERN | JA1302_3 +e005 = EXTERN -> TRO240 | JA1309_1 +e006 = EXTERN -> TRO264 | JA1401_1 +e007 = EXTERN -> TRO262 | JA1501_1 +e008 = EXTERN -> TRO260 | JA1601_1 +e009 = EXTERN -> TRO272 | JA1801_1 +e010 = EXTERN -> TRO270 | JA4701_1 +e011 = EXTERN -> TRO208 | Storage1.1.1 +e012 = EXTERN -> TRO211 | Storage1.1.2 +e013 = EXTERN -> TRO214 | Storage1.1.3 +e014 = EXTERN -> TRO217 | Storage1.1.4 +e015 = EXTERN -> TRO228 | Storage1.2.1 +e016 = EXTERN -> TRO231 | Storage1.2.2 +e017 = EXTERN -> TRO234 | Storage1.2.3 +e018 = EXTERN -> TRO237 | Storage1.2.4 +e019 = EXTERN -> TRO248 | Storage1.3.1 +e020 = EXTERN -> TRO251 | Storage1.3.2 +e021 = EXTERN -> TRO254 | Storage1.3.3 +e022 = EXTERN -> TRO257 | Storage1.3.4 +e023 = TRO207 -> EXTERN | IO_Device_UH02_TO_UH01.stCARRIER_INFO +e024 = TRO227 -> EXTERN | IO_Device_UH02_TO_UH01.stCARRIER_INFO_1 +e025 = TRO247 -> EXTERN | IO_Device_UH02_TO_UH01.stCARRIER_INFO_2 + +[UH03.nodes] +TRO300 = Vario | TRO 300 (Vario) +TRO301 = 1Sep | TRO 301(1Sep) +TRO302 = Vario | TRO 302 (Vario) +TRO303 = Vario | TRO 303 (Vario) +TRO304 = 1Sep | TRO 304(1Sep) +TRO305 = Vario | TRO 305 (Vario) +TRO306 = Vario | TRO 306 (Vario) +TRO307 = Vario | TRO 307 (Vario) +TRO308 = Vario | TRO 308 (Vario) +TRO309 = 1Sep | TRO 309 (1Sep) +TRO310 = 1Sep | TRO 310 (1Sep)+Scanner (BX3102) +TRO311 = 1Sep | TRO 311 (1Sep)+Scanner(BX3101) +TRO312 = 1Sep | TRO 312 (1Sep)+Scanner(BX3100) +TRO313 = 1Sep1Swi | TRO 313 (1Sep1Switch)+Scanner(BX3103) +TRO314 = 1Sep1Swi | TRO 314 (1Sep1Switch)+Scanner(BX3104) +TRO315 = 1Sep | TRO 315 (1Sep) +TRO316 = 1Sep | TRO 316 (1Sep) +TRO317 = 1Sep1Swi | TRO 317 (1Sep1Switch)+Scanner(BX3105) +TRO318 = 1Sep1Swi | TRO 318 (1Sep1Switch) + Scanner(BX3106) +TRO319 = 1Sep1Swi | TRO 319 (1Sep1Switch) + Scanner (BX3111) +TRO320 = 1Sep1Swi | TRO 320 (1Sep1Switch) + Scanner(BX3112) +TRO321 = 1Sep1Swi | TRO 321 (1Sep1Switch) + Scanner(BX3114) +TRO322 = 1Sep1Swi | TRO 322 (1Sep1Switch)+Scanner(BX3113) +TRO323 = 1Sep | TRO 323 (1Sep) +TRO324 = Vario | TRO 324 (Vario) +TRO325 = 1Sep | TRO 325 (1Sep) +TRO326 = 1Sep | TRO 326 (1Sep) +TRO327 = PinStore_Auto | Aufruf: TRO327 +TRO328 = Vario | TRO 328 (Vario) +TRO329 = 1Sep | TRO 329 (1Sep) +TRO330 = PinStore_Auto | Aufruf: TRO330 +TRO331 = Vario | TRO 331 (Vario) +TRO332 = 1Sep | TRO 332 (1Sep) +TRO333 = PinStore_Auto | Aufruf: TRO333 +TRO334 = Vario | TRO 334 (Vario) +TRO335 = 1Sep | TRO 335 (1Sep) +TRO336 = PinStore_Auto | Aufruf: TRO336 +TRO337 = Vario | TRO 337 (Vario) +TRO338 = 1Sep | TRO 338 (1Sep) +TRO339 = 1Sep1Swi | TRO 339 (1Sep1Switch)+Scanner(BX3120) +TRO340 = 1Sep1Swi | TRO 340 (1Sep1Switch)+Scanner(BX3121) +TRO341 = 1Sep1Swi | TRO 341 (1Sep1Switch)+Scanner(BX3126) +TRO342 = 1Sep1Swi | TRO 342 (1Sep1Switch)+Scanner(BX3127) +TRO343 = 1Sep1Swi | TRO 343 (1Sep1Switch)+Scanner(BX3129) +TRO344 = 1Sep1Swi | TRO 344 (1Sep1Switch)+Scanner(BX3128) +TRO345 = 1Sep | TRO 345 (1Sep) +TRO346 = Vario | TRO 346 (Vario) +TRO347 = 1Sep | TRO 347 (1Sep) +TRO348 = 1Sep | TRO 348 (1Sep) +TRO349 = PinStore_Auto | Aufruf: TRO349 +TRO350 = Vario | TRO 350 (Vario) +TRO351 = 1Sep | TRO 351 (1Sep) +TRO352 = PinStore_Auto | Aufruf: TRO352 +TRO353 = Vario | TRO 353 (Vario) +TRO354 = 1Sep | TRO 354 (1Sep) +TRO355 = PinStore_Auto | Aufruf: TRO355 +TRO356 = Vario | TRO 356 (Vario) +TRO357 = 1Sep | TRO 357 (1Sep) +TRO358 = PinStore_Auto | Aufruf: TRO358 +TRO359 = Vario | TRO 359 (Vario) +TRO360 = 1Sep | TRO 360 (1Sep) +TRO361 = 1Sep1Swi | TRO 361 (1Sep1Switch)+Scanner(BX3131) +TRO362 = 1Sep1Swi | TRO 362 (1Sep1Switch)+Scanner(BX3132) +TRO363 = 1Sep1Swi | TRO 363 (1Sep1Switch)+Scanner(BX3137) +TRO364 = 1Sep1Swi | TRO 364 (1Sep1Switch)+Scanner(BX3138) +TRO365 = 1Sep1Swi | TRO 365 (1Sep1Switch)+Scanner(BX3140) +TRO366 = 1Sep1Swi | TRO 366 (1Sep1Switch)+Scanner(BX3139) +TRO367 = 1Sep | TRO 367 (1Sep) +TRO368 = Vario | TRO 368 (Vario, from Lvl1) +TRO369 = 1Sep | TRO 369 (1Sep) +TRO370 = 1Sep | TRO 370 (1Sep) +TRO371 = PinStore_Auto | Aufruf: TRO371 +TRO372 = Vario | TRO 372 (Vario) +TRO373 = 1Sep | TRO 373 (1Sep) +TRO374 = PinStore_Auto | Aufruf: TRO374 +TRO375 = Vario | TRO 375 (Vario) +TRO376 = 1Sep | TRO 376 (1Sep) +TRO377 = PinStore_Auto | Aufruf: TRO377 +TRO378 = Vario | TRO 378 (Vario) +TRO379 = 1Sep | TRO 379 (1Sep) +TRO380 = PinStore_Auto | Aufruf: TRO380 +TRO381 = Vario | TRO 381 (Vario) +TRO382 = 1Sep | TRO 382 (1Sep) +TRO386 = 1Sep | TRO 386 (1Sep) - kam später dazu + +[UH03.connections] +c001 = TRO318 -> TRO330 | JA2101_1 | dir2 +c002 = TRO332 -> TRO330 | JA2101_1 | normal +c003 = TRO330 -> TRO327 | JA2101_2 | bypass +c004 = TRO329 -> TRO327 | JA2101_2 | normal +c005 = TRO315 -> TRO317 | JA2102_1 | normal +c006 = TRO317 -> TRO318 | JA2102_2 | normal +c007 = TRO318 -> TRO333 | JA2102_3 | normal +c008 = TRO335 -> TRO333 | JA2102_3 | normal +c009 = TRO333 -> TRO336 | JA2102_4 | bypass +c010 = TRO338 -> TRO336 | JA2102_4 | normal +c011 = TRO327 -> TRO319 | JA2103_1 | normal +c012 = TRO330 -> TRO320 | JA2103_2 | normal +c013 = TRO319 -> TRO320 | JA2103_2 | dir2 +c014 = TRO336 -> TRO321 | JA2104_1 | normal +c015 = TRO333 -> TRO322 | JA2104_2 | normal +c016 = TRO321 -> TRO322 | JA2104_2 | normal +c017 = TRO320 -> TRO323 | JA2104_3 | dir2 +c018 = TRO322 -> TRO323 | JA2104_3 | normal +c019 = TRO323 -> TRO326 | JA2104_4 | normal +c020 = TRO325 -> TRO326 | JA2104_4 | normal +c021 = TRO319 -> TRO328 | JA2105_1 | normal +c022 = TRO328 -> TRO329 | JA2105_2 | finger +c023 = TRO320 -> TRO331 | JA2106_1 | normal +c024 = TRO331 -> TRO332 | JA2106_2 | finger +c025 = TRO322 -> TRO334 | JA2107_1 | dir2 +c026 = TRO334 -> TRO335 | JA2107_2 | finger +c027 = TRO321 -> TRO337 | JA2108_1 | dir2 +c028 = TRO337 -> TRO338 | JA2108_2 | finger +c029 = TRO324 -> TRO325 | JA2109_2 | finger +c030 = TRO386 -> TRO310 | JA2110_1 | normal +c031 = TRO310 -> TRO313 | JA2110_2 | normal +c032 = TRO311 -> TRO313 | JA2110_2 | normal +c033 = TRO312 -> TRO313 | JA2110_2 | normal +c034 = TRO313 -> TRO314 | JA2110_3 | dir2 +c035 = TRO314 -> TRO315 | JA2110_4 | dir2 +c036 = TRO309 -> TRO386 | JA2110_5 | normal +c037 = TRO308 -> TRO309 | JA2111_2 | finger +c038 = TRO313 -> TRO316 | JA2112_1 | normal +c039 = TRO340 -> TRO352 | JA2201_1 | dir2 +c040 = TRO354 -> TRO352 | JA2201_1 | normal +c041 = TRO352 -> TRO349 | JA2201_2 | bypass +c042 = TRO351 -> TRO349 | JA2201_2 | normal +c043 = TRO314 -> TRO339 | JA2202_1 | normal +c044 = TRO339 -> TRO340 | JA2202_2 | normal +c045 = TRO340 -> TRO355 | JA2202_3 | normal +c046 = TRO357 -> TRO355 | JA2202_3 | normal +c047 = TRO355 -> TRO358 | JA2202_4 | bypass +c048 = TRO360 -> TRO358 | JA2202_4 | normal +c049 = TRO349 -> TRO341 | JA2203_1 | normal +c050 = TRO352 -> TRO342 | JA2203_2 | normal +c051 = TRO341 -> TRO342 | JA2203_2 | dir2 +c052 = TRO358 -> TRO343 | JA2204_1 | normal +c053 = TRO355 -> TRO344 | JA2204_2 | normal +c054 = TRO343 -> TRO344 | JA2204_2 | normal +c055 = TRO342 -> TRO345 | JA2204_3 | dir2 +c056 = TRO344 -> TRO345 | JA2204_3 | normal +c057 = TRO345 -> TRO348 | JA2204_4 | normal +c058 = TRO347 -> TRO348 | JA2204_4 | normal +c059 = TRO341 -> TRO350 | JA2205_1 | normal +c060 = TRO350 -> TRO351 | JA2205_2 | finger +c061 = TRO342 -> TRO353 | JA2206_1 | normal +c062 = TRO353 -> TRO354 | JA2206_2 | finger +c063 = TRO344 -> TRO356 | JA2207_1 | dir2 +c064 = TRO356 -> TRO357 | JA2207_2 | finger +c065 = TRO343 -> TRO359 | JA2208_1 | dir2 +c066 = TRO359 -> TRO360 | JA2208_2 | finger +c067 = TRO346 -> TRO347 | JA2209_2 | finger +c068 = TRO371 -> TRO363 | JA2301_1 | normal +c069 = TRO374 -> TRO364 | JA2301_2 | normal +c070 = TRO363 -> TRO364 | JA2301_2 | normal +c071 = TRO380 -> TRO365 | JA2302_1 | normal +c072 = TRO377 -> TRO366 | JA2302_2 | normal +c073 = TRO365 -> TRO366 | JA2302_2 | dir2 +c074 = TRO364 -> TRO367 | JA2302_3 | normal +c075 = TRO366 -> TRO367 | JA2302_3 | dir2 +c076 = TRO367 -> TRO370 | JA2302_4 | normal +c077 = TRO369 -> TRO370 | JA2302_4 | normal +c078 = TRO362 -> TRO374 | JA2303_1 | normal +c079 = TRO376 -> TRO374 | JA2303_1 | normal +c080 = TRO374 -> TRO371 | JA2303_2 | bypass +c081 = TRO373 -> TRO371 | JA2303_2 | normal +c082 = TRO316 -> TRO361 | JA2304_1 | normal +c083 = TRO361 -> TRO362 | JA2304_2 | dir2 +c084 = TRO362 -> TRO377 | JA2304_3 | dir2 +c085 = TRO379 -> TRO377 | JA2304_3 | normal +c086 = TRO377 -> TRO380 | JA2304_4 | bypass +c087 = TRO382 -> TRO380 | JA2304_4 | normal +c088 = TRO363 -> TRO372 | JA2305_1 | dir2 +c089 = TRO372 -> TRO373 | JA2305_2 | finger +c090 = TRO364 -> TRO375 | JA2306_1 | dir2 +c091 = TRO375 -> TRO376 | JA2306_2 | finger +c092 = TRO366 -> TRO378 | JA2307_1 | normal +c093 = TRO378 -> TRO379 | JA2307_2 | finger +c094 = TRO365 -> TRO381 | JA2308_1 | normal +c095 = TRO381 -> TRO382 | JA2308_2 | finger +c096 = TRO368 -> TRO369 | JA2309_2 | finger +c097 = TRO300 -> TRO302 | JA4101_1 | finger +c098 = TRO301 -> TRO302 | JA4101_1 | normal +c099 = TRO302 -> TRO311 | JA4101_2 | finger +c100 = TRO303 -> TRO305 | JA4201_1 | finger +c101 = TRO304 -> TRO305 | JA4201_1 | normal +c102 = TRO305 -> TRO312 | JA4201_2 | finger + +[UH03.externals] +e001 = TRO336 -> EXTERN | JA2102_5 +e002 = EXTERN -> TRO324 | JA2109_1 +e003 = EXTERN -> TRO308 | JA2111_1 +e004 = TRO358 -> EXTERN | JA2202_5 +e005 = EXTERN -> TRO346 | JA2209_1 +e006 = EXTERN -> TRO368 | JA2309_1 +e007 = EXTERN -> TRO300 | JA4102_1 +e008 = EXTERN -> TRO301 | JA4102_2 +e009 = EXTERN -> TRO303 | JA4202_1 +e010 = EXTERN -> TRO304 | JA4202_2 +e011 = EXTERN -> TRO306 | JA4301_1 +e012 = EXTERN -> TRO307 | JA4401_1 +e013 = EXTERN -> TRO327 | Storage2.1.1 +e014 = EXTERN -> TRO330 | Storage2.1.2 +e015 = EXTERN -> TRO333 | Storage2.1.3 +e016 = EXTERN -> TRO336 | Storage2.1.4 +e017 = EXTERN -> TRO349 | Storage2.2.1 +e018 = EXTERN -> TRO352 | Storage2.2.2 +e019 = EXTERN -> TRO355 | Storage2.2.3 +e020 = EXTERN -> TRO358 | Storage2.2.4 +e021 = EXTERN -> TRO371 | Storage2.3.1 +e022 = EXTERN -> TRO374 | Storage2.3.2 +e023 = EXTERN -> TRO377 | Storage2.3.3 +e024 = EXTERN -> TRO380 | Storage2.3.4 +e025 = TRO326 -> EXTERN | IO_Device_UH03_TO_UH01.stCARRIER_INFO +e026 = TRO348 -> EXTERN | IO_Device_UH03_TO_UH01.stCARRIER_INFO_1 +e027 = TRO370 -> EXTERN | IO_Device_UH03_TO_UH01.stCARRIER_INFO_2 +e028 = TRO317 -> EXTERN | IO_Device_UH03_TO_UH01.stCarrierL2toL1 +e029 = TRO339 -> EXTERN | IO_Device_UH03_TO_UH01.stCarrierL2toL1_2 +e030 = TRO361 -> EXTERN | IO_Device_UH03_TO_UH01.stCarrierL2toL1_3 + +[UH04.nodes] +TRO400 = Vario | TRO 400 (Vario) +TRO401 = Vario | TRO 401 (Vario) +TRO402 = 1Sep | TRO 402 (1Sep) (Vor Brandschutztor) +TRO403 = Vario | TRO 403 (Vario) +TRO404 = 1Sep | TRO 404 (1Sep) +TRO405 = 1Sep1Swi | TRO 405 (1Sep1Switch) + Scanner (BX4100) + Behangskontrolle +TRO406 = 1Sep | TRO 406 (1Sep) + Scanner (BX4101) +TRO407 = 1Sep1Swi | TRO 407 (1Sep1Switch) + Scanner (BX4102) +TRO408 = Vario | TRO 408 (Vario) +TRO409 = 1Sep | TRO 409 (1Sep) +TRO410 = 1Sep1Swi | TRO 410 (1Sep1Switch) + Scanner (BX4104) +TRO411 = Vario | TRO 411 (Vario) +TRO412 = 1Sep | TRO 412 (1Sep) +TRO413 = 1Sep1Swi | TRO 413(1Sep1Switch)+Scanner(BX4106) +TRO414 = Vario | TRO 414 (Vario) +TRO415 = 1Sep | TRO 415 (1Sep) +TRO416 = 1Sep | TRO 416 (1Sep) + Beladeprüfung +TRO417 = 1Sep | TRO 417 (1Sep) +TRO418 = Vario | TRO 418 (Vario) +TRO420 = Vario | TRO 420 (Vario) +TRO421 = Vario_workStation | TRO 421 (Vario) +TRO422 = Vario_workStation | TRO 422 (Vario) +TRO423 = Vario_workStation | TRO 423 (Vario) +TRO424 = 1Sep | TRO 424 (1Sep) vor Behangskontrolle + +[UH04.connections] +c001 = TRO400 -> TRO401 | JA4001_1 | finger +c002 = TRO401 -> TRO402 | JA4001_2 | finger +c003 = TRO402 -> TRO403 | JA4002_1 | normal +c004 = TRO403 -> TRO404 | JA4002_2 | finger +c005 = TRO424 -> TRO405 | JA4003_1 | normal +c006 = TRO405 -> TRO406 | JA4003_2 | dir2 +c007 = TRO406 -> TRO407 | JA4003_3 | normal +c008 = TRO407 -> TRO410 | JA4003_4 | dir2 +c009 = TRO409 -> TRO410 | JA4003_4 | normal +c010 = TRO410 -> TRO413 | JA4003_5 | dir2 +c011 = TRO412 -> TRO413 | JA4003_5 | normal +c012 = TRO413 -> TRO416 | JA4003_6 | dir2 +c013 = TRO415 -> TRO416 | JA4003_6 | normal +c014 = TRO416 -> TRO417 | JA4003_7 | normal +c015 = TRO404 -> TRO424 | JA4003_8 | normal +c016 = TRO417 -> TRO424 | JA4003_8 | normal +c017 = TRO407 -> TRO408 | JA4004_1 | normal +c018 = TRO408 -> TRO421 | JA4004_2 | finger +c019 = TRO410 -> TRO411 | JA4006_1 | normal +c020 = TRO411 -> TRO422 | JA4006_2 | finger +c021 = TRO422 -> TRO412 | JA4007_1 | finger +c022 = TRO413 -> TRO414 | JA4008_1 | normal +c023 = TRO414 -> TRO423 | JA4008_2 | finger +c024 = TRO423 -> TRO415 | JA4009_1 | finger +c025 = TRO418 -> TRO420 | JA4011_1 | finger + +[UH04.externals] +e001 = EXTERN -> TRO400 | JA4000_1 +e002 = TRO421 -> EXTERN | JA4005_1 +e003 = EXTERN -> TRO418 | JA4010_1 + +[UH05.nodes] +TRO500 = Vario | TRO 500 (Vario) - Stand: Vorbereitet für Umbau! +TRO501 = 1Sep | TRO 501 (1Sep) + Scanner (BX5101) +TRO502 = Vario | TRO 502 (Vario) - Stand: Vorbereitet für Umbau! +TRO503 = 1Sep | TRO 503 (1Sep)+ Scanner (BX5100) +TRO504 = 1Sep | TRO 504 (1Sep) +TRO505 = 1Sep1Swi | TRO 505 (1Sep1Switch) + Scanner (BX5102) +TRO506 = Vario | TRO 506 (Vario) +TRO507 = 1Sep | TRO 507 (1Sep) +TRO508 = Vario | TRO 508 (Vario)+Scanner(BX5103) +TRO509 = 1Sep | TRO 509 (1Sep) +TRO510 = 1Sep1Swi | TRO 510 (1Sep1Switch) + Scanner (BX5104) +TRO511 = 1Sep | TRO 511 (1Sep) +TRO512 = Vario | TRO 512 (Vario)+Scanner(BX5105) +TRO513 = 1Sep | TRO 513 (1Sep) +TRO514 = 1Sep1Swi | TRO 514 (1Sep1Switch) + Scanner (BX5106) +TRO515 = 1Sep | TRO 515 (1Sep) +TRO516 = Vario | TRO 516(Vario)+Scanner(BX5107) +TRO517 = 1Sep | TRO 517 (1Sep) +TRO518 = 1Sep1Swi | TRO 518 (1Sep1Switch) + Scanner (BX5108) +TRO519 = 1Sep | TRO 519 (1Sep) +TRO520 = Vario | TRO 520 (Vario)+Scanner(BX5109) +TRO521 = 1Sep | TRO 521(1Sep) +TRO522 = 1Sep1Swi | TRO 522 (1Sep1Switch) + Scanner (BX5110) +TRO523 = 1Sep | TRO 523 (1Sep) +TRO524 = Vario | TRO 524 (Vario)+Scanner(BX5231) +TRO525 = 1Sep | TRO 525(1Sep) +TRO526 = 1Sep | TRO 526 (1Sep) + Scanner (BX5112) +TRO527 = 1Sep1Swi | TRO 527 (1Sep1Switch) +TRO528 = 1Sep | TRO 528 (1Sep) +TRO529 = 1Sep | TRO 529 (1Sep) + Scanner (BX5113) +TRO530 = Vario | TRO 530 (Vario) +TRO531 = Vario | TRO 531 (Vario) + +[UH05.connections] +c001 = TRO502 -> TRO531 | JA5000_2 | finger +c002 = TRO531 -> TRO503 | JA5000_3 | finger +c003 = TRO500 -> TRO530 | JA5001_2 | finger +c004 = TRO530 -> TRO501 | JA5001_3 | finger +c005 = TRO501 -> TRO504 | JA5002_1 | normal +c006 = TRO503 -> TRO504 | JA5002_1 | normal +c007 = TRO529 -> TRO504 | JA5002_1 | normal +c008 = TRO528 -> TRO529 | JA5002_10 | normal +c009 = TRO504 -> TRO505 | JA5002_2 | normal +c010 = TRO505 -> TRO510 | JA5002_3 | dir2 +c011 = TRO509 -> TRO510 | JA5002_3 | normal +c012 = TRO510 -> TRO514 | JA5002_4 | dir2 +c013 = TRO513 -> TRO514 | JA5002_4 | normal +c014 = TRO514 -> TRO518 | JA5002_5 | dir2 +c015 = TRO517 -> TRO518 | JA5002_5 | normal +c016 = TRO518 -> TRO522 | JA5002_6 | dir2 +c017 = TRO521 -> TRO522 | JA5002_6 | normal +c018 = TRO522 -> TRO526 | JA5002_7 | dir2 +c019 = TRO525 -> TRO526 | JA5002_7 | normal +c020 = TRO526 -> TRO527 | JA5002_8 | normal +c021 = TRO527 -> TRO528 | JA5002_9 | dir2 +c022 = TRO505 -> TRO506 | JA5003_1 | normal +c023 = TRO506 -> TRO507 | JA5003_2 | finger +c024 = TRO507 -> TRO508 | JA5004_1 | normal +c025 = TRO510 -> TRO511 | JA5005_1 | normal +c026 = TRO511 -> TRO512 | JA5005_2 | normal +c027 = TRO514 -> TRO515 | JA5006_1 | normal +c028 = TRO515 -> TRO516 | JA5006_2 | normal +c029 = TRO518 -> TRO519 | JA5007_1 | normal +c030 = TRO519 -> TRO520 | JA5007_2 | normal +c031 = TRO522 -> TRO523 | JA5008_1 | normal +c032 = TRO523 -> TRO524 | JA5008_2 | normal + +[UH05.externals] +e001 = EXTERN -> TRO502 | JA5000_1 +e002 = EXTERN -> TRO500 | JA5001_1 +e003 = TRO508 -> EXTERN | JA5004_2 +e004 = TRO512 -> EXTERN | JA5005_3 +e005 = TRO516 -> EXTERN | JA5006_3 +e006 = TRO520 -> EXTERN | JA5007_3 +e007 = TRO524 -> EXTERN | JA5008_3 + diff --git a/doc/TRO_Katalog/img/1sep.png b/doc/TRO_Katalog/img/1sep.png new file mode 100644 index 0000000000000000000000000000000000000000..682ff635f2a3dd6053d247f3736ae46d4dde6aa1 GIT binary patch literal 1352 zcmc&!`%_a_5Dpzns~u2?l!De^(4;Lw5KNJm5eSB;5J{!T7=jFllVRi)Ug2q}3IS{; z6&yhWwF<4o0U7F;D+!??g;<^vA(4{Mf!l<4hMNiLg&@5le?))SvuD4v`|a+T+2vk{ zp*ZYu--AM-9H>!bI-&tY#2?!u=aDOW4T!R1(<$Mo_K|}Nh_UNhSacW))yezBlKdfJ z@6L)!V53mZxmK~$reO*Z9}SfpcCnDTq6y78K-qsQR$+JVF*!!GeS`ZjEAZ}^oyKoh zaumv_GOP#2MfKaKQZY$|{nUMTHVF z^~xpl!p2%3Q#+#Kl_ks>c^=TL&trzC3?K|n8}|&=|BO6IWkUBECYf0)!r-BB`PM~e(r33Mb^4ychEq=^X`|P(Dx0vztC`)T!P_aPET(-!#^yqrc{-D z)cU%U+;cn|Ljw;SkKQ;8)i>a_oZz!^4T0Zrdb$)1e~@3`fGw|J(Q6bKkJUzU89rNe z6e6fKCT_`X){hZjyj(y5UF8BQm|q}%zUs{6PV|IZ>C6sp?p(%b5R3$v9IK7ym( zATavxV)M+>JYi^j`@IrhKFJ>Snh%1AbKQFX)h)B`Sn0NN`qmV?+21U#@X?=r;B@`l zW3e!yGB4K!ZphD-`=luG- zTRb!Goxgvv9p1)bGZ}dq+-ggz%+gQX-sj3mk&VgEXlu(R5{-6PQiE^b0W6gER!x!W zA|kcwr4%x6hy=XLCRiq+L1nrw$?ZKj6{c(&bH~DV29V}G-g6E4DSyqw|4o{GBNch7=eZ6}k@h;-PQ8$zus zKl91>O{x^JF14t?;g;Yf1`~+T3V_8;G;CKS@Kv4=yoWb8SfyCf1p^v)OA$P#jH6lJ zMPLo&4m9pNMX<8(CUukKjWyH>dk*mnmKD42BDtBp{7(En&f#K%sSY8mV3-D~#J@^# z=Ve4!PPX?t@daUIGU+Et-6nTv*&zNKA7bu3sy{b@udxpHDjjaDLB?F45!V4&fkX5) z8<0GKw21&s^aUHhin9TqKFu1Aj0xd)T{5T`pd1}2oVRgYBTATTKAHwTYa2-Sv96B^ zQ@+iW+hmLVS~*B`4O}CSv=$*hgY1@f({F4f-6x@)G}i(si900Ai&Zuf%}VJG3A-xP cTB4cor+e}5kD9_SBij!}jf^3;hhM4q4{;8;N&o-= literal 0 HcmV?d00001 diff --git a/doc/TRO_Katalog/img/1sep_1swi.png b/doc/TRO_Katalog/img/1sep_1swi.png new file mode 100644 index 0000000000000000000000000000000000000000..e82b2a958b691cc288abd556cae26e283d48ae8d GIT binary patch literal 19825 zcma&Oc|6qJ`#(M;%h*MPOe#zE$dY9+ql5^_zTUDF!$g*{hM6HniIHrLB0E{emUTpS z%0AZY%h>nz_nPke{=7f$&-b6-|3<7}|weDyb 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 TO4JyT1<1$im?zgG>ZgAI1eAa1 literal 0 HcmV?d00001 diff --git a/doc/TRO_Katalog/img/1sep_sscc.png b/doc/TRO_Katalog/img/1sep_sscc.png new file mode 100644 index 0000000000000000000000000000000000000000..4de8ec78b3ad0f3158a90954df8f3675f0f13318 GIT binary patch literal 2934 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 literal 0 HcmV?d00001 diff --git a/doc/TRO_Katalog/img/Pinstore.png b/doc/TRO_Katalog/img/Pinstore.png new file mode 100644 index 0000000000000000000000000000000000000000..d18d86d479f88519194b4f4f5d8ff402111cbf41 GIT binary patch literal 24501 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%0A?dz?w?vauoo~`(x6& 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 Z*VP*~ZomG$6R_F`-Gl3>7Aji?{0}Z;WH 0 AND NOT #xOutFull THEN + #nStateE := #c0400_StepWaitAndSwitch; + END_IF; + + END_REGION + + #c0400_StepWaitAndSwitch: + REGION 0400: Wait and switch + // akt. Zustand + #sStateTextE := 'Wait and switch'; + ///////// Ausgänge ///////// + + ///////// Statics ////////// + + ///////// Timer ////////// + + //////// Transition //////// + IF ((NOT #xBypassNextBoom AND #nInBufferNr = "cMainTro101") OR + (#nInBufferNr = "cMainTro102")) AND #fbStateManagerE.tOutTimeInStep > T#3s THEN + #nStateE := #c0900_StepWorking; + ELSIF #xBypassNextBoom AND #nInBufferNr = "cMainTro101" AND #fbStateManagerE.tOutTimeInStep > T#12s THEN + #xBypassNextBoom := FALSE; + #nStateE := #c0900_StepWorking; + ELSIF NOT #xInBufferReq THEN + #nStateE := #c0200_StepIdle; + END_IF; + END_REGION + + #c0900_StepWorking: + REGION 900: Working + // akt. Zustand + #sStateTextE := 'Working'; + ///////// Ausgänge ///////// + // #arOutSwitchLine[#xLineNr] := TRUE; + ///////// Statics ////////// + + ///////// Timer ////////// + + //////// Transition //////// + IF (* NOT #xInBufferReq *) (#xInPause AND #fbStateManagerE.tOutTimeInStep > T#5s) OR + #arInOutStorageLines[#nLineNr].stData.Status.nCount (* #arTmpStorageData[#nLineNr].Status.nCount *)>= #arInOutStorageLines[#nLineNr].stData.Config.nCapacitySet OR + #arInJamSensor[#nLineNr].xJam (* #arTmpSenJamLine[#nLineNr].xJam *)THEN + #nStateE := #c1200_StepWaitForChange; + END_IF; + END_REGION + + #c1200_StepWaitForChange: + REGION 1200: Wait for change + // akt. Zustand + #sStateTextE := 'Wait for change'; + ///////// Ausgänge ///////// + // #arOutSwitchLine[#xLineNr] := TRUE; + ///////// Statics ////////// + + ///////// Timer ////////// + + //////// Transition //////// + IF #fbStateManagerE.tOutTimeInStep > T#8s THEN + #nStateE := #c0200_StepIdle; + END_IF; + END_REGION + END_CASE; + + END_REGION + + REGION Schrittkette Auslagern + + (* zum Kopieren + #cxxxx_Stepxxxx: + REGION xxxx: xxxx + // akt. Zustand + #sStateText := 'xxxx'; + ///////// Ausgänge ///////// + + ///////// Statics ////////// + + ///////// Timer ////////// + + //////// Transition //////// + #nState := #cxxxx_Stepxxxx; + END_REGION + *) + + CASE #nStateA OF + #c0000_StepOff: + REGION 0000: Off + // akt. Zustand + #sStateTextA := 'Off'; + ///////// Ausgänge ///////// + // #xTmpSepExitRelease := FALSE; + // #xTmpSwitchExitReady := FALSE; + // #xTmpSwitch := FALSE; + ///////// Statics ////////// + // #xBypassNextBoom := FALSE; + FOR #nIdx := 1 TO 5 DO + #arLineRelease[#nIdx] := FALSE; + END_FOR; + ///////// Timer ////////// + + //////// Transition //////// + // SCHRITT 0 WIRD GEBRAUCHT! + // #nSepNr := 0; + //STATE MANAGER KÜMMERT SICH UM TRANSITION! + END_REGION + + #c0100_StepUndefined: + REGION 0100: Undefined + // akt. Zustand + #sStateTextA := 'Undefined'; + ///////// Ausgänge ///////// + // #xTmpSepExitRelease := FALSE; + // #xTmpSwitchExitReady := FALSE; + // #xTmpSwitch := FALSE; + ///////// Statics ////////// + // #xBypassNextBoom := FALSE; + FOR #nIdx := 1 TO 5 DO + #arLineRelease[#nIdx] := FALSE; + END_FOR; + ///////// Timer ////////// + + //////// Transition //////// + // #nSepNr := 0; + #nStateA := #c1000_StepWaitForTrolley1; + END_REGION + + #c1000_StepWaitForTrolley1: + REGION 1000: Wait for Trolley + + ///////// Statics ////////// + FOR #nIdx := 1 TO 5 DO + #arLineRelease[#nIdx] := FALSE; + END_FOR; + + IF #xStart THEN + IF #nActLine = 0 THEN + #nActLine := 1; + END_IF; + + IF #nActLine <> #nLastLine THEN + #stDummyCarrier.nBarcode := 1000; + END_IF; + #nLastLine := #nActLine; + IF #arfbSeparatorStorage[#nActLine].stOutMainTro.xBtPresent AND #arInOutStorageLines[#nActLine].arCarrier[1].bStatus.%X0 THEN + #nStateA := #c1400_StepCheckSep1; + ELSIF (NOT #arfbSeparatorStorage[#nActLine].stOutMainTro.xBtPresent OR NOT #arInOutStorageLines[#nActLine].arCarrier[1].bStatus.%X0) AND + #fbStateManagerA.tOutTimeInStep > T#3s THEN + FOR #nIdx := 1 TO 5 DO + IF #arfbSeparatorStorage[#nIdx].stOutMainTro.xBtPresent AND #arInOutStorageLines[#nIdx].arCarrier[1].bStatus.%X0 = TRUE THEN + #nActLine := #nIdx; + #nLastLine := #nActLine; + #nStateA := #c1400_StepCheckSep1; + EXIT; + END_IF; + END_FOR; + END_IF; + END_IF; + END_REGION + #c1400_StepCheckSep1: + REGION 1400: Check Separator + + FOR #nIdx := 1 TO 5 DO + #arLineRelease[#nIdx] := FALSE; + END_FOR; + + CASE #nActLine OF + 1: + IF #arfbSeparatorStorage[#nActLine].stOutMainTro.nStatus = "SepState_WaitForReq" THEN // Separator ist bereit + #nStateA := #c1500_StepReleaseSep1; + ELSIF #fbStateManagerE.tOutUnivTonR > T#3s THEN + #tmpReasonForStop := "Rsn_SubError"; // SubTRO: Separator ist nicht bereit + END_IF; + 2: + IF #arfbSeparatorStorage[#nActLine].stOutMainTro.nStatus = "SepState_WaitForReq" THEN // Separator ist bereit + #nStateA := #c1500_StepReleaseSep1; + ELSIF #fbStateManagerE.tOutUnivTonR > T#3s THEN + #tmpReasonForStop := "Rsn_SubError"; // SubTRO: Separator ist nicht bereit + END_IF; + 3: + IF #arfbSeparatorStorage[#nActLine].stOutMainTro.nStatus = "SepState_WaitForReq" THEN // Separator ist bereit + #nStateA := #c1500_StepReleaseSep1; + ELSIF #fbStateManagerE.tOutUnivTonR > T#3s THEN + #tmpReasonForStop := "Rsn_SubError"; // SubTRO: Separator ist nicht bereit + END_IF; + 4: + IF #arfbSeparatorStorage[#nActLine].stOutMainTro.nStatus = "SepState_WaitForReq" THEN // Separator ist bereit + #nStateA := #c1500_StepReleaseSep1; + ELSIF #fbStateManagerE.tOutUnivTonR > T#3s THEN + #tmpReasonForStop := "Rsn_SubError"; // SubTRO: Separator ist nicht bereit + END_IF; + 5: + IF #arfbSeparatorStorage[#nActLine].stOutMainTro.nStatus = "SepState_WaitForReq" THEN // Separator ist bereit + #nStateA := #c1500_StepReleaseSep1; + ELSIF #fbStateManagerE.tOutUnivTonR > T#3s THEN + #tmpReasonForStop := "Rsn_SubError"; // SubTRO: Separator ist nicht bereit + END_IF; + END_CASE; + + END_REGION + + #c1500_StepReleaseSep1: + REGION 1500: Release Sep 1 + // akt. Zustand + #sStateTextA := 'Leave Sep 1'; + + ///////// Ausgänge ///////// + ///////// Statics ////////// + + FOR #nIdx := 1 TO 5 DO + IF #nIdx = #nActLine THEN + #arLineRelease[#nIdx] := TRUE; + ELSE + #arLineRelease[#nIdx] := FALSE; + END_IF; + END_FOR; + + + //////// Transition //////// + CASE #nActLine OF + 1: // Statement section case 1 + IF #arfbSeparatorStorage[#nActLine].stOutMainTro.nStatus = "SepState_Finish" THEN + #nStateA := #c2000_StepWaitForTrolley2; + ELSIF #arLineRelease[#nActLine] AND #tOnSvReleaseSep.Q THEN + #tmpReasonForStop := "Rsn_SubError"; // Timeout-Fehler im SubTRO "Separator": Freigabe erteilt, aber Separator gibt keine Rückmeldung an MainTRO + END_IF; + 2: + IF #arfbSeparatorStorage[#nActLine].stOutMainTro.nStatus = "SepState_Finish" THEN + #nStateA := #c2000_StepWaitForTrolley2; + ELSIF #arLineRelease[#nActLine] AND #tOnSvReleaseSep.Q THEN + #tmpReasonForStop := "Rsn_SubError"; // Timeout-Fehler im SubTRO "Separator": Freigabe erteilt, aber Separator gibt keine Rückmeldung an MainTRO + END_IF; + 3: + IF #arfbSeparatorStorage[#nActLine].stOutMainTro.nStatus = "SepState_Finish" THEN + #nStateA := #c2000_StepWaitForTrolley2; + ELSIF #arLineRelease[#nActLine] AND #tOnSvReleaseSep.Q THEN + #tmpReasonForStop := "Rsn_SubError"; // Timeout-Fehler im SubTRO "Separator": Freigabe erteilt, aber Separator gibt keine Rückmeldung an MainTRO + END_IF; + 4: + IF #arfbSeparatorStorage[#nActLine].stOutMainTro.nStatus = "SepState_Finish" THEN + #nStateA := #c2000_StepWaitForTrolley2; + ELSIF #arLineRelease[#nActLine] AND #tOnSvReleaseSep.Q THEN + #tmpReasonForStop := "Rsn_SubError"; // Timeout-Fehler im SubTRO "Separator": Freigabe erteilt, aber Separator gibt keine Rückmeldung an MainTRO + END_IF; + 5: + IF #arfbSeparatorStorage[#nActLine].stOutMainTro.nStatus = "SepState_Finish" THEN + #nStateA := #c2000_StepWaitForTrolley2; + ELSIF #arLineRelease[#nActLine] AND #tOnSvReleaseSep.Q THEN + #tmpReasonForStop := "Rsn_SubError"; // Timeout-Fehler im SubTRO "Separator": Freigabe erteilt, aber Separator gibt keine Rückmeldung an MainTRO + END_IF; + + END_CASE; + + END_REGION + + #c2000_StepWaitForTrolley2: + REGION 2000: Wait for Trolley 2 + //akt. Zustand + #sStateTextA := 'Wait for Trolley 2'; + ///////// Ausgänge ///////// + + ///////// Statics ////////// + + FOR #nIdx := 1 TO 5 DO + #arLineRelease[#nIdx] := FALSE; + END_FOR; + + + //Transition + CASE #nActLine OF + 1: // Statement section case 1 + IF #arfbSeparatorStorage[#nActLine].stOutMainTro.xBtPresent AND #arInOutStorageLines[#nActLine].arCarrier[1].bStatus.%X0 THEN + #nStateA := #c2300_StepCheckSep2; + END_IF; + 2: // Statement section case 1 + IF #arfbSeparatorStorage[#nActLine].stOutMainTro.xBtPresent AND #arInOutStorageLines[#nActLine].arCarrier[1].bStatus.%X0 THEN + #nStateA := #c2300_StepCheckSep2; + END_IF; + + 3: // Statement section case 1 + IF #arfbSeparatorStorage[#nActLine].stOutMainTro.xBtPresent AND #arInOutStorageLines[#nActLine].arCarrier[1].bStatus.%X0 THEN + #nStateA := #c2300_StepCheckSep2; + END_IF; + + 4: // Statement section case 1 + IF #arfbSeparatorStorage[#nActLine].stOutMainTro.xBtPresent AND #arInOutStorageLines[#nActLine].arCarrier[1].bStatus.%X0 THEN + #nStateA := #c2300_StepCheckSep2; + END_IF; + + 5: // Statement section case 1 + IF #arfbSeparatorStorage[#nActLine].stOutMainTro.xBtPresent AND #arInOutStorageLines[#nActLine].arCarrier[1].bStatus.%X0 THEN + #nStateA := #c2300_StepCheckSep2; + END_IF; + END_CASE; + END_REGION + + #c2300_StepCheckSep2: + REGION 2300: Check Separator + FOR #nIdx := 1 TO 5 DO + #arLineRelease[#nIdx] := FALSE; + END_FOR; + + //Transition + CASE #nActLine OF + 1: // Statement section case 1 + #tmpActUnivTonA := TRUE; + IF #arfbSeparatorStorage[#nActLine].stOutMainTro.nStatus = "SepState_WaitForReq" THEN // Separator ist bereit + #nStateA := #c2400_StepCheckJam; + ELSIF #fbStateManagerE.tOutUnivTonR > T#3s THEN + #tmpReasonForStop := "Rsn_SubError"; // SubTRO: Separator ist nicht bereit + END_IF; + 2: // Statement section case 1 + #tmpActUnivTonA := TRUE; + IF #arfbSeparatorStorage[#nActLine].stOutMainTro.nStatus = "SepState_WaitForReq" THEN // Separator ist bereit + #nStateA := #c2400_StepCheckJam; + ELSIF #fbStateManagerE.tOutUnivTonR > T#3s THEN + #tmpReasonForStop := "Rsn_SubError"; // SubTRO: Separator ist nicht bereit + END_IF; + 3: // Statement section case 1 + #tmpActUnivTonA := TRUE; + IF #arfbSeparatorStorage[#nActLine].stOutMainTro.nStatus = "SepState_WaitForReq" THEN // Separator ist bereit + #nStateA := #c2400_StepCheckJam; + ELSIF #fbStateManagerE.tOutUnivTonR > T#3s THEN + #tmpReasonForStop := "Rsn_SubError"; // SubTRO: Separator ist nicht bereit + END_IF; + 4: // Statement section case 1 + #tmpActUnivTonA := TRUE; + IF #arfbSeparatorStorage[#nActLine].stOutMainTro.nStatus = "SepState_WaitForReq" THEN // Separator ist bereit + #nStateA := #c2400_StepCheckJam; + ELSIF #fbStateManagerE.tOutUnivTonR > T#3s THEN + #tmpReasonForStop := "Rsn_SubError"; // SubTRO: Separator ist nicht bereit + END_IF; + 5: // Statement section case 1 + #tmpActUnivTonA := TRUE; + IF #arfbSeparatorStorage[#nActLine].stOutMainTro.nStatus = "SepState_WaitForReq" THEN // Separator ist bereit + #nStateA := #c2400_StepCheckJam; + ELSIF #fbStateManagerE.tOutUnivTonR > T#3s THEN + #tmpReasonForStop := "Rsn_SubError"; // SubTRO: Separator ist nicht bereit + END_IF; + END_CASE; + + END_REGION + + #c2400_StepCheckJam: + REGION 2400: Check Jam + // akt. Zustand + #sStateTextA := 'Check Jam'; + ///////// Ausgänge ///////// + ///////// Statics ////////// + FOR #nIdx := 1 TO 5 DO + #arLineRelease[#nIdx] := FALSE; + END_FOR; + + ///////// Timer ////////// + //////// Transition //////// + IF (#stInOutJamExit.Status.nCount = #stInOutJamExit.Config.nCapacitySet) //Zielstaubereich ist datentechnisch voll + OR (#arInSep[1].stSettings.xPluggedJam AND #stInSenJamExit.xJam) // Stausensor *) + THEN + #tmpReasonForStop := "Rsn_JamNextError"; + ELSE + #nStateA := #c2500_StepReleaseSep2; + END_IF; + END_REGION + + #c2500_StepReleaseSep2: + REGION 2500: Release Sep Second + // akt. Zustand + #sStateTextA := 'Leave Sep'; + + ///////// Ausgänge ///////// + ///////// Statics ////////// + #stOutPriorityManager.xTransportReq := #xInSftyOk AND #xInConveyorRunOut (* AND NOT #stInMfr.xPause *); + + FOR #nIdx := 1 TO 5 DO + IF #nIdx = #nActLine THEN + #arLineRelease[#nIdx] := #xInSftyOk AND #xInConveyorRunOut AND #stInPriorityManager.xReleaseOk AND NOT #arInOutStorageLines[#nIdx].stData.Status.bByte.%X3; + ELSE + #arLineRelease[#nIdx] := FALSE; + END_IF; + END_FOR; + + //////// Transition //////// + //Transition + + FOR #nIdx := 1 TO #nActLine DO + IF #nIdx = #nActLine THEN + IF #arfbSeparatorStorage[#nActLine].stOutMainTro.nStatus = "SepState_Finish" THEN + //Hier könnte man noch einbauen, ob optional nicht gebucht wird, z.B. für Fehlerkorrektur + REGION Daten buchen Store1 -> ExitJam + IF NOT #xVersatz THEN // Alles normal buchen + "FC_Route"(xInSingle := FALSE, + xInSeparate := FALSE, + xInSepEdge := TRUE, + xInSensor := FALSE, + xInDelay := FALSE, + stInCarrier := #stEmptyCarrier, + stOutBookingInfo => #stBookingInfo, + arJamEntr := #arInOutStorageLines[#nActLine].arCarrier, + arOnTheWay := #arEmptyCarrier, + arJamExit := #arInOutJamExit); + + ELSE // Dummy (=ohne Daten) buchen + "FC_TSHR_AddAtEnd"(stInTrolley := #stDummyCarrier, + nOutCounter => #nCounter, + xOutResult => #xResult, + arTSHR := #arInOutJamExit); + + #stDummyCarrier.nBarcode += 1; + + IF #stDummyCarrier.nBarcode > 1999 THEN + #stDummyCarrier.nBarcode := 1000; + END_IF; + END_IF; + #xVersatz := FALSE; + END_REGION ; + #xEventLogBookExit := TRUE; + #nStateA := #c1000_StepWaitForTrolley1; + EXIT; + END_IF; + END_IF; + END_FOR; + + END_REGION + END_CASE; + + END_REGION + + REGION StateManager Einlagern + #fbStateManagerE.stInSettings.nStartState := #c0100_StepUndefined; + #fbStateManagerE.stInSettings.nStartStateTestMode := #c0000_StepOff; + #fbStateManagerE.stInSettings.xActUnivTOn := TRUE; + #fbStateManagerE.stInSettings.xRestartAtStartState := FALSE; + #fbStateManagerE(xInFunctionEnabled := #stInOutControlUnitCabinet.xRunning, + // xInReset := (* #stInMfr.xCancel OR *)#xInCancel, + xInRunUnivTOn := #tmpActUnivTonE, + nInOutState := #nStateE); + END_REGION + + REGION StateManager Auslagern + #fbStateManagerA.stInSettings.nStartState := #c0100_StepUndefined; + #fbStateManagerA.stInSettings.nStartStateTestMode := #c0000_StepOff; + #fbStateManagerA.stInSettings.xActUnivTOn := TRUE; + #fbStateManagerA.stInSettings.xRestartAtStartState := FALSE; + #fbStateManagerA(xInFunctionEnabled := #stInOutControlUnitCabinet.xRunning, + // xInReset := (* #stInMfr.xCancel OR *)#xInCancel, + xInRunUnivTOn := #tmpActUnivTonA, + nInOutState := #nStateA); + END_REGION + + (* REGION Separator Buffer Lines + + // #fb1Sep1SwiExit.stInSeparator1.Settings.nSeparatorNo := #nActNo; + // #fb1Sep1SwiExit.stInSeparator1.Settings.tDelayToNextItem := "TimeForSepWaiting_Short"; + // #fb1Sep1SwiExit.stInSeparator1.Settings.tTrailingTime := t#0ms; + // #fb1Sep1SwiExit.stInSeparator1.Settings.tHandlingTime := t#0ms; + // #fb1Sep1SwiExit.stInSeparator1.Settings.tJam := "TimeForSepJam"; + // #fb1Sep1SwiExit.stInSeparator1.Settings.xPluggedJam := TRUE; + // #fb1Sep1SwiExit.stInSeparator1.Settings.xPluggedPart := FALSE; + // #fb1Sep1SwiExit.stInSeparator1.Settings.xPluggedScanner := FALSE; + // #fb1Sep1SwiExit.stInSenJam2 := #stInSenJamExitLeft; + // #fb1Sep1SwiExit.stInSenJam3 := #stInSenJamExitRight; + + // #fb1Sep1SwiExit.stInSwitch1.Settings.nSwitchNo := 1; + // #fb1Sep1SwiExit.stInSwitch1.Settings.xPluggedExSen3 := TRUE; + // #fb1Sep1SwiExit.stInSwitch1.Settings.xPluggedExSen4 := TRUE; + + // #fb1Sep1SwiExit.stInPriorityManager.xReleaseOk := #xTmpSwitchExitReady; + + // CASE #nActNo OF + // 1: + // #fb1Sep1SwiExit.stInSeparator1.stSenInSep := #stInSenInSep1; + // 2: + // #fb1Sep1SwiExit.stInSeparator1.stSenInSep := #stInSenInSep2; + // 3: + // #fb1Sep1SwiExit.stInSeparator1.stSenInSep := #stInSenInSep3; + // 4: + // #fb1Sep1SwiExit.stInSeparator1.stSenInSep := #stInSenInSep4; + // 5: + // #fb1Sep1SwiExit.stInSeparator1.stSenInSep := #stInSenInSep5; + // ELSE + // ; + // END_CASE; + + // #fb1Sep1SwiExit(nInMainTroNo := #nInBufferNr, + // xInSftyOk := #xInSafetyOk, + // xInAllRdyToStart := TRUE, + // xInCarouselRun1 := #xInCarRun, + // xInRelease := #xTmpSepExitRelease, + // stInOutMachineState := #stInOutMainState, + // stInOutCognexInterface := #stCognexInterfaceDummy, + // arInOutJamEntr1 := #arInOutCarrierLine[#nActNo], + // stInOutJamEntr1 := #arInOutJamDataLine[#nActNo], + // arInOutJamExit2 := #arInOutJamCarrierExitLeft, + // stInOutJamExit2 := #stInOutDataJamExitLeft, + // arInOutJamExit3:= #arInOutJamCarrierExitRight, + // stInOutJamExit3:= #stInOutDataJamExitRight, + // stInOutHMI := #stInOutHMI, + // nOutStateLast => #nOutStateLast, + // xOutSw1ExTo3 => #xOutSwitchExit); + + // CASE #nActNo OF + // 1: + // #arOutSepLine[1] := #fb1Sep1SwiExit.xOutStopper1; + // 2: + // #arOutSepLine[2] := #fb1Sep1SwiExit.xOutStopper1; + // 3: + // #arOutSepLine[3] := #fb1Sep1SwiExit.xOutStopper1; + // 4: + // #arOutSepLine[4] := #fb1Sep1SwiExit.xOutStopper1; + // 5: + // #arOutSepLine[5] := #fb1Sep1SwiExit.xOutStopper1; + // ELSE + // ; + // END_CASE; + + END_REGION *) + + REGION Separator BufferLines + + REGION Separator Freigabe + //Benötigtem Sep Freigabe erteilen + // FOR #nIdx1 := 1 TO #stInSettings.nNoOfLines DO + // IF #stInStorageCarrStats.stRdyToLeave.nLine = #nIdx1 THEN + // #arLineRelease[#nIdx1] := TRUE; + // END_IF; + // END_FOR; + END_REGION + + REGION Sep 1 + #nActNo := 1; + #arfbSeparatorStorage[#nActNo](stInSettings := #arInSep[#nActNo].stSettings, + xInConveyorRun := #xInConveyorRunOut, + stInTrolley := #arInSep[#nActNo].stSenTrolley, + xInReceiveReady := NOT #fbCarrierWaitStore1.xOutLockSep1 AND #arLineRelease[#nActNo] AND NOT #arInOutJamExit[#arInSep[#nActNo].stSettings.nJamLength].bStatus.%X0, + xOutStopper => #arOutSeparatorStore[#nActNo], + stInOutMainState := #stInOutControlUnitCabinet, + stInOutHMI := #stInOutHMI.UDT_Separator1, + stInOutCarrDataInJam := #arInOutStorageLines[#nActNo].arCarrier); + + REGION Carrier anstauen lassen + #fbCarrierWaitStore1.stInTimes.tFreeSen1 := T#2000ms; + #fbCarrierWaitStore1.stInTimes.tTimerWait := T#3000ms; + #fbCarrierWaitStore1(stInSensor1 := #arInSep[#nActNo].stSenTrolley, + xInConvActive := true); + END_REGION + + REGION Dummy Handling + + #arArrayMax[#nActNo] := 10; + + REGION Dummy erstellen + IF #arfbSeparatorStorage[#nActNo].stOutMainTro.xBtPresent AND + #arfbSeparatorStorage[#nActNo].stOutMainTro.nStatus = "SepState_WaitForReq" AND + #arInSep[#nActNo].stSenTrolley.tDirectChangeLast > T#3s AND // variabel machen, Dummy immer anlegen?, Unterscheidung bei Borner? + #arInOutStorageLines[#nActNo].arCarrier[1] = #tmpCarrierEmpty + THEN + #arInOutStorageLines[#nActNo].arCarrier[1].nBarcode := #cCarrierDummy; + #arInOutStorageLines[#nActNo].arCarrier[1].bStatus.%X0 := TRUE; + END_IF; + + END_REGION + + REGION Dummy löschen + IF #arArrayMax[#nActNo] > 1 THEN //Staubereich mit Capacity > 0 + IF (#arInOutStorageLines[#nActNo].arCarrier[1] = #stCarrierDummy) //Dummy an erster Position + AND #arInOutStorageLines[#nActNo].arCarrier[2] = #tmpCarrierEmpty AND //Keine Daten an zweiter Position + NOT #arInSep[#nActNo].stSenTrolley.xDirectSensor AND #arInSep[#nActNo].stSenTrolley.tDirectChangeLast > T#8s AND //keine Belegung + #arfbSeparatorStorage[#nActNo].stOutMainTro.nStatus = "SepState_WaitForBt" AND #arfbSeparatorStorage[#nActNo].#fbStateManager.tOutTimeInStep > T#8s //Separator Zustand abfragen + THEN + #arInOutStorageLines[#nActNo].arCarrier[1] := #tmpCarrierEmpty; //Dummy löschen + ELSIF (#arInOutStorageLines[#nActNo].arCarrier[1] = #stCarrierDummy) //Dasselbe wie oben aber mit nachrücken + AND (#arInOutStorageLines[#nActNo].arCarrier[2] = #stCarrierDummy OR #arInOutStorageLines[#nActNo].arCarrier[2] <> #stCarrierDummy) AND + NOT #arInSep[#nActNo].stSenTrolley.xDirectSensor AND #arInSep[#nActNo].stSenTrolley.tDirectChangeLast > T#8s AND + #arfbSeparatorStorage[#nActNo].stOutMainTro.nStatus = "SepState_WaitForBt" AND #arfbSeparatorStorage[#nActNo].#fbStateManager.tOutTimeInStep > T#8s //Separator Zustand abfragen + THEN + #arInOutStorageLines[#nActNo].arCarrier[1] := #tmpCarrierEmpty; + "FC_TSHR_Shift"(xInShiftBack := TRUE, + arTSHR := #arInOutStorageLines[#nActNo].arCarrier); + END_IF; + ELSIF #nArrayMax = 1 THEN + IF (#arInOutStorageLines[#nActNo].arCarrier[1] = #stCarrierDummy) AND + NOT #arInSep[#nActNo].stSenTrolley.xDirectSensor AND #arInSep[#nActNo].stSenTrolley.tDirectChangeLast > T#8s AND + #arfbSeparatorStorage[#nActNo].stOutMainTro.nStatus = "SepState_WaitForBt" AND #arfbSeparatorStorage[#nActNo].#fbStateManager.tOutTimeInStep > T#8s //Separator Zustand abfragen + THEN + #arInOutStorageLines[#nActNo].arCarrier[1] := #tmpCarrierEmpty; + END_IF; + END_IF; + + END_REGION + + END_REGION + + END_REGION + + REGION Sep 2 + #nActNo := 2; + IF #stInSettings.nNoOfLines >= #nActNo THEN + #arfbSeparatorStorage[#nActNo](stInSettings := #arInSep[#nActNo].stSettings, + xInConveyorRun := #xInConveyorRunOut, + stInTrolley := #arInSep[#nActNo].stSenTrolley, + xInReceiveReady := NOT #fbCarrierWaitStore2.xOutLockSep1 AND #arLineRelease[#nActNo] AND NOT #arInOutJamExit[#arInSep[#nActNo].stSettings.nJamLength].bStatus.%X0, + stInOutMainState := #stInOutControlUnitCabinet, + xOutStopper => #arOutSeparatorStore[#nActNo], + stInOutHMI := #stInOutHMI.UDT_Separator2, + stInOutCarrDataInJam := #arInOutStorageLines[#nActNo].arCarrier); + END_IF; + + REGION Carrier anstauen lassen + #fbCarrierWaitStore2.stInTimes.tFreeSen1 := T#2000ms; + #fbCarrierWaitStore2.stInTimes.tTimerWait := T#3000ms; + #fbCarrierWaitStore2(stInSensor1 := #arInSep[#nActNo].stSenTrolley, + xInConvActive := true); + END_REGION + + REGION Dummy Handling + + #arArrayMax[#nActNo] := 10; + + REGION Dummy erstellen + IF #arfbSeparatorStorage[#nActNo].stOutMainTro.xBtPresent AND + #arfbSeparatorStorage[#nActNo].stOutMainTro.nStatus = "SepState_WaitForReq" AND + #arInSep[#nActNo].stSenTrolley.tDirectChangeLast > T#3s AND // variabel machen, Dummy immer anlegen?, Unterscheidung bei Borner? + #arInOutStorageLines[#nActNo].arCarrier[1] = #tmpCarrierEmpty + THEN + #arInOutStorageLines[#nActNo].arCarrier[1].nBarcode := #cCarrierDummy; + #arInOutStorageLines[#nActNo].arCarrier[1].bStatus.%X0 := TRUE; + END_IF; + + END_REGION + + REGION Dummy löschen + IF #arArrayMax[#nActNo] > 1 THEN //Staubereich mit Capacity > 0 + IF (#arInOutStorageLines[#nActNo].arCarrier[1] = #stCarrierDummy) //Dummy an erster Position + AND #arInOutStorageLines[#nActNo].arCarrier[2] = #tmpCarrierEmpty AND //Keine Daten an zweiter Position + NOT #arInSep[#nActNo].stSenTrolley.xDirectSensor AND #arInSep[#nActNo].stSenTrolley.tDirectChangeLast > T#8s AND //keine Belegung + #arfbSeparatorStorage[#nActNo].stOutMainTro.nStatus = "SepState_WaitForBt" AND #arfbSeparatorStorage[#nActNo].#fbStateManager.tOutTimeInStep > T#8s //Separator Zustand abfragen + THEN + #arInOutStorageLines[#nActNo].arCarrier[1] := #tmpCarrierEmpty; //Dummy löschen + ELSIF (#arInOutStorageLines[#nActNo].arCarrier[1] = #stCarrierDummy) //Dasselbe wie oben aber mit nachrücken + AND (#arInOutStorageLines[#nActNo].arCarrier[2] = #stCarrierDummy OR #arInOutStorageLines[#nActNo].arCarrier[2] <> #stCarrierDummy) AND + NOT #arInSep[#nActNo].stSenTrolley.xDirectSensor AND #arInSep[#nActNo].stSenTrolley.tDirectChangeLast > T#8s AND + #arfbSeparatorStorage[#nActNo].stOutMainTro.nStatus = "SepState_WaitForBt" AND #arfbSeparatorStorage[#nActNo].#fbStateManager.tOutTimeInStep > T#8s //Separator Zustand abfragen + THEN + #arInOutStorageLines[#nActNo].arCarrier[1] := #tmpCarrierEmpty; + "FC_TSHR_Shift"(xInShiftBack := TRUE, + arTSHR := #arInOutStorageLines[#nActNo].arCarrier); + END_IF; + ELSIF #nArrayMax = 1 THEN + IF (#arInOutStorageLines[#nActNo].arCarrier[1] = #stCarrierDummy) AND + NOT #arInSep[#nActNo].stSenTrolley.xDirectSensor AND #arInSep[#nActNo].stSenTrolley.tDirectChangeLast > T#8s AND + #arfbSeparatorStorage[#nActNo].stOutMainTro.nStatus = "SepState_WaitForBt" AND #arfbSeparatorStorage[#nActNo].#fbStateManager.tOutTimeInStep > T#8s //Separator Zustand abfragen + THEN + #arInOutStorageLines[#nActNo].arCarrier[1] := #tmpCarrierEmpty; + END_IF; + END_IF; + + END_REGION + + END_REGION + + + END_REGION + + REGION Sep 3 + #nActNo := 3; + IF #stInSettings.nNoOfLines >= #nActNo THEN + #arfbSeparatorStorage[#nActNo](stInSettings := #arInSep[#nActNo].stSettings, + xInConveyorRun := #xInConveyorRunOut, + stInTrolley := #arInSep[#nActNo].stSenTrolley, + xInReceiveReady := #arLineRelease[#nActNo] AND NOT #arInOutJamExit[#arInSep[#nActNo].stSettings.nJamLength].bStatus.%X0, + stInOutMainState := #stInOutControlUnitCabinet, + xOutStopper => #arOutSeparatorStore[#nActNo], + stInOutHMI := #stInOutHMI.UDT_Separator3, + stInOutCarrDataInJam := #arInOutStorageLines[#nActNo].arCarrier); + END_IF; + + REGION Carrier anstauen lassen + #fbCarrierWaitStore3.stInTimes.tFreeSen1 := T#2000ms; + #fbCarrierWaitStore3.stInTimes.tTimerWait := T#3000ms; + #fbCarrierWaitStore3(stInSensor1 := #arInSep[#nActNo].stSenTrolley, + xInConvActive := true); + END_REGION + + REGION Dummy Handling + + #arArrayMax[#nActNo] := 10; + + REGION Dummy erstellen + IF #arfbSeparatorStorage[#nActNo].stOutMainTro.xBtPresent AND + #arfbSeparatorStorage[#nActNo].stOutMainTro.nStatus = "SepState_WaitForReq" AND + #arInSep[#nActNo].stSenTrolley.tDirectChangeLast > T#3s AND // variabel machen, Dummy immer anlegen?, Unterscheidung bei Borner? + #arInOutStorageLines[#nActNo].arCarrier[1] = #tmpCarrierEmpty + THEN + #arInOutStorageLines[#nActNo].arCarrier[1].nBarcode := #cCarrierDummy; + #arInOutStorageLines[#nActNo].arCarrier[1].bStatus.%X0 := TRUE; + END_IF; + + END_REGION + + REGION Dummy löschen + IF #arArrayMax[#nActNo] > 1 THEN //Staubereich mit Capacity > 0 + IF (#arInOutStorageLines[#nActNo].arCarrier[1] = #stCarrierDummy) //Dummy an erster Position + AND #arInOutStorageLines[#nActNo].arCarrier[2] = #tmpCarrierEmpty AND //Keine Daten an zweiter Position + NOT #arInSep[#nActNo].stSenTrolley.xDirectSensor AND #arInSep[#nActNo].stSenTrolley.tDirectChangeLast > T#8s AND //keine Belegung + #arfbSeparatorStorage[#nActNo].stOutMainTro.nStatus = "SepState_WaitForBt" AND #arfbSeparatorStorage[#nActNo].#fbStateManager.tOutTimeInStep > T#8s //Separator Zustand abfragen + THEN + #arInOutStorageLines[#nActNo].arCarrier[1] := #tmpCarrierEmpty; //Dummy löschen + ELSIF (#arInOutStorageLines[#nActNo].arCarrier[1] = #stCarrierDummy) //Dasselbe wie oben aber mit nachrücken + AND (#arInOutStorageLines[#nActNo].arCarrier[2] = #stCarrierDummy OR #arInOutStorageLines[#nActNo].arCarrier[2] <> #stCarrierDummy) AND + NOT #arInSep[#nActNo].stSenTrolley.xDirectSensor AND #arInSep[#nActNo].stSenTrolley.tDirectChangeLast > T#8s AND + #arfbSeparatorStorage[#nActNo].stOutMainTro.nStatus = "SepState_WaitForBt" AND #arfbSeparatorStorage[#nActNo].#fbStateManager.tOutTimeInStep > T#8s //Separator Zustand abfragen + THEN + #arInOutStorageLines[#nActNo].arCarrier[1] := #tmpCarrierEmpty; + "FC_TSHR_Shift"(xInShiftBack := TRUE, + arTSHR := #arInOutStorageLines[#nActNo].arCarrier); + END_IF; + ELSIF #nArrayMax = 1 THEN + IF (#arInOutStorageLines[#nActNo].arCarrier[1] = #stCarrierDummy) AND + NOT #arInSep[#nActNo].stSenTrolley.xDirectSensor AND #arInSep[#nActNo].stSenTrolley.tDirectChangeLast > T#8s AND + #arfbSeparatorStorage[#nActNo].stOutMainTro.nStatus = "SepState_WaitForBt" AND #arfbSeparatorStorage[#nActNo].#fbStateManager.tOutTimeInStep > T#8s //Separator Zustand abfragen + THEN + #arInOutStorageLines[#nActNo].arCarrier[1] := #tmpCarrierEmpty; + END_IF; + END_IF; + + END_REGION + + END_REGION + + END_REGION + + REGION Sep 4 + #nActNo := 4; + IF #stInSettings.nNoOfLines >= #nActNo THEN + #arfbSeparatorStorage[#nActNo](stInSettings := #arInSep[#nActNo].stSettings, + xInConveyorRun := #xInConveyorRunOut, + stInTrolley := #arInSep[#nActNo].stSenTrolley, + xInReceiveReady := #arLineRelease[#nActNo] AND NOT #arInOutJamExit[#arInSep[#nActNo].stSettings.nJamLength].bStatus.%X0, + stInOutMainState := #stInOutControlUnitCabinet, + xOutStopper => #arOutSeparatorStore[#nActNo], + stInOutHMI := #stInOutHMI.UDT_Separator4, + stInOutCarrDataInJam := #arInOutStorageLines[#nActNo].arCarrier); + END_IF; + + REGION Carrier anstauen lassen + #fbCarrierWaitStore4.stInTimes.tFreeSen1 := T#2000ms; + #fbCarrierWaitStore4.stInTimes.tTimerWait := T#3000ms; + #fbCarrierWaitStore4(stInSensor1 := #arInSep[#nActNo].stSenTrolley, + xInConvActive := true); + END_REGION + + REGION Dummy Handling + + #arArrayMax[#nActNo] := 10; + + REGION Dummy erstellen + IF #arfbSeparatorStorage[#nActNo].stOutMainTro.xBtPresent AND + #arfbSeparatorStorage[#nActNo].stOutMainTro.nStatus = "SepState_WaitForReq" AND + #arInSep[#nActNo].stSenTrolley.tDirectChangeLast > T#3s AND // variabel machen, Dummy immer anlegen?, Unterscheidung bei Borner? + #arInOutStorageLines[#nActNo].arCarrier[1] = #tmpCarrierEmpty + THEN + #arInOutStorageLines[#nActNo].arCarrier[1].nBarcode := #cCarrierDummy; + #arInOutStorageLines[#nActNo].arCarrier[1].bStatus.%X0 := TRUE; + END_IF; + + END_REGION + + REGION Dummy löschen + IF #arArrayMax[#nActNo] > 1 THEN //Staubereich mit Capacity > 0 + IF (#arInOutStorageLines[#nActNo].arCarrier[1] = #stCarrierDummy) //Dummy an erster Position + AND #arInOutStorageLines[#nActNo].arCarrier[2] = #tmpCarrierEmpty AND //Keine Daten an zweiter Position + NOT #arInSep[#nActNo].stSenTrolley.xDirectSensor AND #arInSep[#nActNo].stSenTrolley.tDirectChangeLast > T#8s AND //keine Belegung + #arfbSeparatorStorage[#nActNo].stOutMainTro.nStatus = "SepState_WaitForBt" AND #arfbSeparatorStorage[#nActNo].#fbStateManager.tOutTimeInStep > T#8s //Separator Zustand abfragen + THEN + #arInOutStorageLines[#nActNo].arCarrier[1] := #tmpCarrierEmpty; //Dummy löschen + ELSIF (#arInOutStorageLines[#nActNo].arCarrier[1] = #stCarrierDummy) //Dasselbe wie oben aber mit nachrücken + AND (#arInOutStorageLines[#nActNo].arCarrier[2] = #stCarrierDummy OR #arInOutStorageLines[#nActNo].arCarrier[2] <> #stCarrierDummy) AND + NOT #arInSep[#nActNo].stSenTrolley.xDirectSensor AND #arInSep[#nActNo].stSenTrolley.tDirectChangeLast > T#8s AND + #arfbSeparatorStorage[#nActNo].stOutMainTro.nStatus = "SepState_WaitForBt" AND #arfbSeparatorStorage[#nActNo].#fbStateManager.tOutTimeInStep > T#8s //Separator Zustand abfragen + THEN + #arInOutStorageLines[#nActNo].arCarrier[1] := #tmpCarrierEmpty; + "FC_TSHR_Shift"(xInShiftBack := TRUE, + arTSHR := #arInOutStorageLines[#nActNo].arCarrier); + END_IF; + ELSIF #nArrayMax = 1 THEN + IF (#arInOutStorageLines[#nActNo].arCarrier[1] = #stCarrierDummy) AND + NOT #arInSep[#nActNo].stSenTrolley.xDirectSensor AND #arInSep[#nActNo].stSenTrolley.tDirectChangeLast > T#8s AND + #arfbSeparatorStorage[#nActNo].stOutMainTro.nStatus = "SepState_WaitForBt" AND #arfbSeparatorStorage[#nActNo].#fbStateManager.tOutTimeInStep > T#8s //Separator Zustand abfragen + THEN + #arInOutStorageLines[#nActNo].arCarrier[1] := #tmpCarrierEmpty; + END_IF; + END_IF; + + END_REGION + + END_REGION + END_REGION + + REGION Sep 5 + #nActNo := 5; + IF #stInSettings.nNoOfLines >= #nActNo THEN + #arfbSeparatorStorage[#nActNo](stInSettings := #arInSep[#nActNo].stSettings, + xInConveyorRun := #xInConveyorRunOut, + stInTrolley := #arInSep[#nActNo].stSenTrolley, + xInReceiveReady := #arLineRelease[#nActNo] AND NOT #arInOutJamExit[#arInSep[#nActNo].stSettings.nJamLength].bStatus.%X0, + stInOutMainState := #stInOutControlUnitCabinet, + xOutStopper => #arOutSeparatorStore[#nActNo], + stInOutHMI := #stInOutHMI.UDT_Separator5, + stInOutCarrDataInJam := #arInOutStorageLines[#nActNo].arCarrier); + END_IF; + + REGION Carrier anstauen lassen + #fbCarrierWaitStore5.stInTimes.tFreeSen1 := T#2000ms; + #fbCarrierWaitStore5.stInTimes.tTimerWait := T#3000ms; + #fbCarrierWaitStore5(stInSensor1 := #arInSep[#nActNo].stSenTrolley, + xInConvActive := true); + END_REGION + + REGION Dummy Handling + + #arArrayMax[#nActNo] := 10; + + REGION Dummy erstellen + IF #arfbSeparatorStorage[#nActNo].stOutMainTro.xBtPresent AND + #arfbSeparatorStorage[#nActNo].stOutMainTro.nStatus = "SepState_WaitForReq" AND + #arInSep[#nActNo].stSenTrolley.tDirectChangeLast > T#3s AND // variabel machen, Dummy immer anlegen?, Unterscheidung bei Borner? + #arInOutStorageLines[#nActNo].arCarrier[1] = #tmpCarrierEmpty + THEN + #arInOutStorageLines[#nActNo].arCarrier[1].nBarcode := #cCarrierDummy; + #arInOutStorageLines[#nActNo].arCarrier[1].bStatus.%X0 := TRUE; + END_IF; + + END_REGION + + REGION Dummy löschen + IF #arArrayMax[#nActNo] > 1 THEN //Staubereich mit Capacity > 0 + IF (#arInOutStorageLines[#nActNo].arCarrier[1] = #stCarrierDummy) //Dummy an erster Position + AND #arInOutStorageLines[#nActNo].arCarrier[2] = #tmpCarrierEmpty AND //Keine Daten an zweiter Position + NOT #arInSep[#nActNo].stSenTrolley.xDirectSensor AND #arInSep[#nActNo].stSenTrolley.tDirectChangeLast > T#8s AND //keine Belegung + #arfbSeparatorStorage[#nActNo].stOutMainTro.nStatus = "SepState_WaitForBt" AND #arfbSeparatorStorage[#nActNo].#fbStateManager.tOutTimeInStep > T#8s //Separator Zustand abfragen + THEN + #arInOutStorageLines[#nActNo].arCarrier[1] := #tmpCarrierEmpty; //Dummy löschen + ELSIF (#arInOutStorageLines[#nActNo].arCarrier[1] = #stCarrierDummy) //Dasselbe wie oben aber mit nachrücken + AND (#arInOutStorageLines[#nActNo].arCarrier[2] = #stCarrierDummy OR #arInOutStorageLines[#nActNo].arCarrier[2] <> #stCarrierDummy) AND + NOT #arInSep[#nActNo].stSenTrolley.xDirectSensor AND #arInSep[#nActNo].stSenTrolley.tDirectChangeLast > T#8s AND + #arfbSeparatorStorage[#nActNo].stOutMainTro.nStatus = "SepState_WaitForBt" AND #arfbSeparatorStorage[#nActNo].#fbStateManager.tOutTimeInStep > T#8s //Separator Zustand abfragen + THEN + #arInOutStorageLines[#nActNo].arCarrier[1] := #tmpCarrierEmpty; + "FC_TSHR_Shift"(xInShiftBack := TRUE, + arTSHR := #arInOutStorageLines[#nActNo].arCarrier); + END_IF; + ELSIF #nArrayMax = 1 THEN + IF (#arInOutStorageLines[#nActNo].arCarrier[1] = #stCarrierDummy) AND + NOT #arInSep[#nActNo].stSenTrolley.xDirectSensor AND #arInSep[#nActNo].stSenTrolley.tDirectChangeLast > T#8s AND + #arfbSeparatorStorage[#nActNo].stOutMainTro.nStatus = "SepState_WaitForBt" AND #arfbSeparatorStorage[#nActNo].#fbStateManager.tOutTimeInStep > T#8s //Separator Zustand abfragen + THEN + #arInOutStorageLines[#nActNo].arCarrier[1] := #tmpCarrierEmpty; + END_IF; + END_IF; + + END_REGION + + END_REGION + END_REGION + + END_REGION + + REGION Ausgänge + + (* VON PIN STORE KOPIERT + REGION Output + #xOutConvReqSort := (#nStateE = #c1500_StepReleaseSep1) OR (#nStateE = #c2500_StepReleaseSep2); //TRUE;//#fbSeparatorPin.xOutConveyorRequest; + #xOutConvReqExit := (#nStateA = #c1500_StepReleaseSep1) OR (#nStateA = #c2500_StepReleaseSep2); + + FOR #nIdx2 := 1 TO #cUnloadingStations DO + IF #arfbStationUnloadPin[#nIdx2].xOutUnloadingError THEN + #xOutUnloadingError := TRUE; + EXIT; + ELSE + #xOutUnloadingError := FALSE; + END_IF; + END_FOR; + + #xOutCorrection := #xTmpCorrection; + END_REGION + *) + + + REGION Einlagern + IF #nLineNr = 0 (* AND #nInBufferNr = "cMainTro102" *) THEN + #nOutLineNr := 1; //nur um Bereichslängenfehler zu vermeiden + ELSE + #nOutLineNr := #nLineNr; + END_IF; + #xOutBypass := #nInBufferNr = "cMainTro101" AND #xBypassNextBoom AND #nStateE = #c0200_StepIdle; + #xOutReadyToReceive := #nStateE = #c0900_StepWorking; + #nOutFillLevel := ( + (* 100/(5*#stInStorageData1.Config.nCapacitySet)* *) + // (#stInStorageData1.Status.nCount + + // #stInStorageData2.Status.nCount + + // #stInStorageData3.Status.nCount + + // #stInStorageData4.Status.nCount + + // #stInStorageData5.Status.nCount) + (#arInOutStorageLines[1].stData.Status.nCount + + #arInOutStorageLines[2].stData.Status.nCount + + #arInOutStorageLines[3].stData.Status.nCount + + #arInOutStorageLines[4].stData.Status.nCount + + #arInOutStorageLines[5].stData.Status.nCount) + ); + IF #nOutFillLevel >= (#arInOutStorageLines[1].stData.Config.nCapacitySet + + #arInOutStorageLines[2].stData.Config.nCapacitySet + + #arInOutStorageLines[3].stData.Config.nCapacitySet + + #arInOutStorageLines[4].stData.Config.nCapacitySet + + #arInOutStorageLines[5].stData.Config.nCapacitySet) THEN + #xOutFull := TRUE; + ELSE + #xOutFull := FALSE; + END_IF; + + FOR #nIdx := 1 TO 5 DO + #arOutSwitchLine[#nIdx] := FALSE; + END_FOR; + IF #nLineNr <> 0 (* AND #nLineNr <> 6 *) AND #nStateE > #c0400_StepWaitAndSwitch THEN + #arOutSwitchLine[#nLineNr] := TRUE; + END_IF; + END_REGION + + REGION Auslagern + // chjchjc + #xOutSepExitRelease := #xTmpSepExitRelease; + #xOutSwitchExitReady := #xTmpSwitchExitReady; + + + #nOutActNo := #nSepNr; + #xOutCarouselReq := #nStateA = #c2500_StepReleaseSep2; + + END_REGION + + END_REGION + + REGION Event Logs + + REGION Event: Umbuchung Lagerlinie auf Exit + IF #nActLine = 1 THEN + #stBookingInfo.sJamSrc := 'JamStore1'; + ELSIF #nActLine = 2 THEN + #stBookingInfo.sJamSrc := 'JamStore2'; + END_IF; + + #stBookingInfo.sJamDest := #stInSettings.sJamDest; + + #fbEventLog_Route2(xInTrigger := #xEventLogBookExit, + stInEventBookingInfo := #stBookingInfo); + END_REGION + + // Pro Event wird ein Aufruf benötigt + REGION Korrekturvorgänge loggen + + #fbEventLogCorrection1(xInTrigger := #arEventCorrectionInfo[0].xTrigger, + stInEventCorrectionInfo := #arEventCorrectionInfo[0]); + + #fbEventLogCorrection2(xInTrigger := #arEventCorrectionInfo[1].xTrigger, + stInEventCorrectionInfo := #arEventCorrectionInfo[1]); + + END_REGION + + #fbEventLogCarrierUnknown(xInTrigger := #xUnknownCarrier, + stInEventScanInfo := #stEventUnknown); + + #fbEventLogCarrierNew(xInTrigger := #xNewCarrier, + stInEventScanInfo := #stEventNew); + + #fbEventLogGoodRead(xInTrigger := #xGoodRead, + stInEventScanInfo := #stEventGoodRead); + + END_REGION + REGION Letzten Schritt wegschreiben + #nOutStateLast := #fbStateManagerA.nStateLast; + END_REGION + REGION Priority Manager + #stOutPriorityManager.nTroId := #nInBufferNr; + #stOutPriorityManager.stJamExit := #stInOutJamExit; + // #stOutPriorityManager.stJamEntry := ; todo + IF #nActNo > 0 THEN + #stOutPriorityManager.stSensor := #arInSep[#nActNo].stSenTrolley; + END_IF; + #stOutPriorityManager.xMovement := #xInConveyorRunOut; + // #stOutPriorityManager.xTrolleyPresent := ; // todo für mengengesteuert + #stOutPriorityManager.xTransportReq := (* (#stActRequest.nDirection = 1) AND *)#nStateA = #c2500_StepReleaseSep2 AND #xStart; + + END_REGION + + REGION HMI + #stInOutHMI.UDT_UnloadingStation1.xInHome := NOT #arOutSwitchLine[1]; + #stInOutHMI.UDT_UnloadingStation1.xInWork := #arOutSwitchLine[1]; + + #stInOutHMI.UDT_UnloadingStation2.xInHome := NOT #arOutSwitchLine[2]; + #stInOutHMI.UDT_UnloadingStation2.xInWork := #arOutSwitchLine[2]; + + #stInOutHMI.UDT_UnloadingStation3.xInHome := NOT #arOutSwitchLine[3]; + #stInOutHMI.UDT_UnloadingStation3.xInWork := #arOutSwitchLine[3]; + + #stInOutHMI.UDT_UnloadingStation4.xInHome := NOT #arOutSwitchLine[4]; + #stInOutHMI.UDT_UnloadingStation4.xInWork := #arOutSwitchLine[4]; + + #stInOutHMI.UDT_UnloadingStation5.xInHome := NOT #arOutSwitchLine[5]; + #stInOutHMI.UDT_UnloadingStation5.xInWork := #arOutSwitchLine[5]; + + END_REGION + + +END_FUNCTION_BLOCK + diff --git a/doc/TRO_Katalog/scl_templates/FB_ILS_MTRO_1Sep.scl b/doc/TRO_Katalog/scl_templates/FB_ILS_MTRO_1Sep.scl new file mode 100644 index 0000000..d0e255f --- /dev/null +++ b/doc/TRO_Katalog/scl_templates/FB_ILS_MTRO_1Sep.scl @@ -0,0 +1,43 @@ +// TEMPLATE: Instanziierungs-/Aufruf-Code für FB_ILS_MTRO_1Sep +// ------------------------------------------------------------------------------------------ +// HINWEIS: FB_ILS_MTRO_1Sep ist ausschliesslich als .liblink (externe ILSLib-Bibliothek) +// im Repository vorhanden, der FB-Quellcode selbst liegt NICHT im Git-Repo (siehe CLAUDE.md). +// Dieses Template zeigt daher den realen AUFRUF (Parametrierung) des Bausteins in FB_Main, +// extrahiert aus: +// =A01+UH01-KF00\Programmbausteine\100_Main\FB_Main.scl (REGION "TRO 100 (1Sep)") +// Es dient als Vorlage für die Ableitung der JSON-Attribute (siehe Json_Layout-Konzept.md +// Abschnitt 4 und TRO_Typen.md). +// ------------------------------------------------------------------------------------------ + +REGION TRO 100 (1Sep) + #TRO100.stInSeparator1.Settings.nSeparatorNo := "cSep100.1"; + #TRO100.stInSeparator1.Settings.tDelayToNextItem := "TimeForSepWaiting_Short"; + #TRO100.stInSeparator1.Settings.tTrailingTime := t#600ms; + #TRO100.stInSeparator1.Settings.tHandlingTime := t#200ms; + #TRO100.stInSeparator1.Settings.tJam := "TimeForSepJam"; + #TRO100.stInSeparator1.Settings.xPluggedJam := TRUE; + #TRO100.stInSeparator1.Settings.xPluggedPart := FALSE; + #TRO100.stInSeparator1.Settings.xPluggedScanner := FALSE; + #TRO100.stInSeparator1.stSenInSep := "DB_Inputs".Sensors["cInBG3242"]; + #TRO100.stInSenJam2 := "DB_Inputs".Sensors["cInBG3243"]; + + #TRO100.stInSeparator1.Settings.tSenFree := T#1500ms; + #TRO100.stInSeparator1.Settings.tSenWait := T#4000ms; + + #TRO100.stInPriorityManager.xReleaseOk := TRUE; //braucht keine Vorfahrtsregelung + + #TRO100(nInMainTroNo := "cMainTro100", + xInSftyOk := "DB_InterfaceSafety".stFromSafety.EStopMainOF1.Q, + xInAllRdyToStart := TRUE, + xInCarouselRun := #fbCarousel0101.xOutConveyorFullSpeed, + xInRelease := "DB_TRO_TEST".TRO100, + stInOutMachineState := #stInOutControlUnitCabinetOF1, + stInOutCognexInterface := #stCognexInterfaceDummy, + arInOutJamEntr1 := "DB_JamArea0100".stJam0100_1.arCarrier, + stInOutJamEntr1 := "DB_JamArea0100".stJam0100_1.stData, + arInOutJamExit2 := "DB_JamArea0101".stJam0101_1.arCarrier, + stInOutJamExit2 := "DB_JamArea0101".stJam0101_1.stData, + xOutStopper1 => "MB3242", + nOutStateLast => "DB_GLOB_TroState".arTroState["cMainTro100"], + stInOutHMI := "DB_Interface_HMI".stTRO.TRO100); +END_REGION diff --git a/doc/TRO_Katalog/scl_templates/FB_ILS_MTRO_1Sep1Swi.scl b/doc/TRO_Katalog/scl_templates/FB_ILS_MTRO_1Sep1Swi.scl new file mode 100644 index 0000000..3daf505 --- /dev/null +++ b/doc/TRO_Katalog/scl_templates/FB_ILS_MTRO_1Sep1Swi.scl @@ -0,0 +1,56 @@ +// TEMPLATE: Instanziierungs-/Aufruf-Code für FB_ILS_MTRO_1Sep1Swi +// ------------------------------------------------------------------------------------------ +// HINWEIS: FB_ILS_MTRO_1Sep1Swi ist ausschliesslich als .liblink (externe ILSLib-Bibliothek) +// im Repository vorhanden, der FB-Quellcode selbst liegt NICHT im Git-Repo. +// Dieses Template zeigt den realen AUFRUF (Parametrierung) des Bausteins in FB_Main, +// extrahiert aus: +// =A01+UH01-KF00\Programmbausteine\100_Main\FB_Main.scl (REGION "TRO 107(1Sep1Swi)") +// inkl. der zugehörigen FC_Direction-Weichenlogik. +// ------------------------------------------------------------------------------------------ + +REGION TRO 107(1Sep1Swi) + #TRO107.stInSeparator1.Settings.nSeparatorNo := "cSep107.1"; + #TRO107.stInSeparator1.Settings.tDelayToNextItem := "TimeForSepWaiting_Short"; + #TRO107.stInSeparator1.Settings.tTrailingTime := t#100ms; + #TRO107.stInSeparator1.Settings.tHandlingTime := t#50ms; + #TRO107.stInSeparator1.Settings.tJam := "TimeForSepJam"; + #TRO107.stInSeparator1.Settings.xPluggedJam := TRUE; + #TRO107.stInSeparator1.Settings.xPluggedPart := FALSE; + #TRO107.stInSeparator1.Settings.xPluggedScanner := FALSE; + #TRO107.stInSeparator1.stSenInSep := "DB_Inputs".Sensors["cInBG3306"]; + #TRO107.stInSenJam2 := "DB_Inputs".Sensors["cInBG3305"]; + #TRO107.stInSenJam3 := "DB_Inputs".Sensors["cInBG3330"]; + + #TRO107.stInSwitch1.Settings.nSwitchNo := "cSwi107.1"; + #TRO107.stInSwitch1.Settings.xPluggedExSen3 := FALSE; + #TRO107.stInSwitch1.Settings.xPluggedExSen4 := FALSE; + #TRO107.stInSwitch1.Settings.nTo1Destinations := 3; //Info nötig für HMI + + #TRO107.stInSettings.xPrioDir2 := TRUE; + #TRO107(stInPriorityManagerDir2 := "DB_Prozessdaten".stPriorityManager.udt_TRO107.TroIn, + stOutPriorityManagerDir2 => "DB_Prozessdaten".stPriorityManager.udt_TRO107.TroOut, + nInMainTroNo := "cMainTro107", + xInSftyOk := "DB_InterfaceSafety".stFromSafety.EStopMainOF1.Q, + xInAllRdyToStart := TRUE, + xInCarouselRun1 := #fbCarousel0102.xOutConveyorFullSpeed, + xInRelease := TRUE, + stInOutMachineState := #stInOutControlUnitCabinetOF1, + stInOutCognexInterface := #stCognexInterfaceDummy, + arInOutJamEntr1 := "DB_JamArea0102".stJam0102_1.arCarrier, + stInOutJamEntr1 := "DB_JamArea0102".stJam0102_1.stData, + arInOutJamExit2 := "DB_JamArea0103".stJam0103_1.arCarrier, + stInOutJamExit2 := "DB_JamArea0103".stJam0103_1.stData, + arInOutJamExit3 := "DB_JamArea0102".stJam0102_2.arCarrier, + stInOutJamExit3 := "DB_JamArea0102".stJam0102_2.stData, + stInOutHMI := "DB_Interface_HMI".stTRO.TRO107, + nOutStateLast => "DB_GLOB_TroState".arTroState["cMainTro107"], + xOutStopper1 => "MB3306", + xOutSw1ExTo3 => "MB3304"); + + REGION Direction + "FC_Direction"(nInSwitchNo := "cSwi107.1", + nOutDirection => #TRO107.nInDirection, + InOutCarrier := "DB_JamArea0102".stJam0102_1.arCarrier[1]); + + END_REGION +END_REGION diff --git a/doc/TRO_Katalog/scl_templates/FB_ILS_MTRO_1Sep2Swi.scl b/doc/TRO_Katalog/scl_templates/FB_ILS_MTRO_1Sep2Swi.scl new file mode 100644 index 0000000..be23475 --- /dev/null +++ b/doc/TRO_Katalog/scl_templates/FB_ILS_MTRO_1Sep2Swi.scl @@ -0,0 +1,75 @@ +// TEMPLATE: Instanziierungs-/Aufruf-Code für FB_ILS_MTRO_1Sep2Swi +// ------------------------------------------------------------------------------------------ +// HINWEIS: FB_ILS_MTRO_1Sep2Swi ist ausschliesslich als .liblink vorhanden (nur UH02, +// =A01+UH02-KF00\Programmbausteine\ILSLib\Prepare\FB_ILS_MTRO_1Sep2Swi.liblink), +// der FB-Quellcode liegt NICHT im Git-Repo. Dieses Template zeigt den realen AUFRUF, +// extrahiert aus: +// =A01+UH02-KF00\Programmbausteine\100_Main\FB_Main.scl +// (REGION "TRO 267 (1Sep2Switch)+Scanner(BX2100)") +// Separator + 2 Weichen (Switch1/Switch2) mit je eigenen Settings und Exit-Slots. +// ------------------------------------------------------------------------------------------ + +REGION TRO 267 (1Sep2Switch)+Scanner(BX2100) + #TRO267.stInSeparator1.Settings.nSeparatorNo := "cSep267.1"; + #TRO267.stInSeparator1.Settings.tDelayToNextItem := "TimeForSepWaiting_Medium"; + #TRO267.stInSeparator1.Settings.xPluggedJam := TRUE; + #TRO267.stInSeparator1.Settings.xPluggedPart := TRUE; + #TRO267.stInSeparator1.Settings.xPluggedScanner := TRUE; + #TRO267.stInSeparator1.stSenInSep := "DB_Inputs".Sensors["cInBG4440"]; + #TRO267.stInSeparator1.stSenPart := "DB_Inputs".Sensors["cInBG4465"]; + #TRO267.stInSenJam2 := "DB_Inputs".Sensors["cInBG4444"]; + #TRO267.stInSenJam3 := "DB_Inputs".Sensors["cInBG4455"]; + #TRO267.stInSenJam4 := "DB_Inputs".Sensors["cInBG4454"]; + + #TRO267.stInSwitch1.Settings.nSwitchNo := "cSwi267.1"; + #TRO267.stInSwitch1.Settings.xPluggedExSen3 := FALSE; + #TRO267.stInSwitch1.Settings.xPluggedExSen4 := FALSE; + #TRO267.stInSwitch1.Settings.xNewSwitch := TRUE; + #TRO267.stInSwitch1.Settings.nTo1Destinations := 3; //Info nötig für HMI + + #TRO267.stInSwitch2.Settings.xPluggedExSen3 := FALSE; + #TRO267.stInSwitch2.Settings.xPluggedExSen4 := FALSE; + #TRO267.stInSwitch2.Settings.xNewSwitch := TRUE; + #TRO267.stInSwitch2.Settings.nTo1Destinations := 3; //Info nötig für HMI + + #TRO267.stInBarcodeReader.Settings.xActivateCheckASCI := TRUE; + #TRO267.stInBarcodeReader.Settings.tTimeout := T#5s; + + #arCognexInterface["cScannerBX2100"].xInCamTriggerReady := "bx2100-TriggerReady"; + #arCognexInterface["cScannerBX2100"].xInCamTriggerAck := "bx2100-TriggerAck"; + #arCognexInterface["cScannerBX2100"].xInCamResultsAvailable := "bx2100-Results Available"; + #arCognexInterface["cScannerBX2100"].xInCamGeneralFault := "bx2100-General Fault"; + #arCognexInterface["cScannerBX2100"].hwInCamInspectionResults := "=A01+UC021-BX2100~Ergebnisse_–_64_Bytes_1"; + + #TRO267.stInPriorityManager.xReleaseOk := TRUE; // braucht keine Vorfahrtsregelung + + #TRO267.stInSettings.bSepType.%X2 := TRUE; + + #TRO267(nInMainTroNo := "cMainTro267", + xInSftyOk := "cTodoTRUE", + xInAllRdyToStart := TRUE, + xInCancel := "cTodoFalse", + xInRelease := "DB_TRO_Test".TRO267, + xInCarouselRun1 := #fbCarousel1110.xOutConveyorFullSpeed, + xInCarouselRun2 := #fbCarousel1110.xOutConveyorFullSpeed, + stInOutMachineState := #stInOutControlUnitCabinetOF1, + stInOutCognexInterface := #arCognexInterface["cScannerBX2100"], + arInOutJamEntr1 := "DB_JamArea1110".stJam1110_4.arCarrier, + stInOutJamEntr1 := "DB_JamArea1110".stJam1110_4.stData, + arInOutJamExit2 := #arCarrierHandoverJam5001, + stInOutJamExit2 := #stJamDataHandoverJam5001, + arInOutJamExit3 := #arCarrierHandoverJam5000, + stInOutJamExit3 := #stJamDataHandoverJam5000, + arInOutJamExit4 := "DB_JamArea1110".stJam1110_5.arCarrier, + stInOutJamExit4 := "DB_JamArea1110".stJam1110_5.stData, + xOutStopper1 => "MB4440", + xOutSw1ExTo3 => "MB4444", + xOutSw2ExTo3 => "MB4455", + stInOutHMI := "DB_Interface_HMI".stTRO.TRO267); + + "bx2100-TriggerEnable" := #arCognexInterface["cScannerBX2100"].xOutCamTriggerEnable; + "bx2100-Trigger" := #arCognexInterface["cScannerBX2100"].xOutCamTrigger; + "bx2100-ResultsAck" := #arCognexInterface["cScannerBX2100"].xOutCamResultsAck; + + // Fortsetzung im Original: IF #TRO267.xOutNewScan THEN "FC_Send_GOHDReqM"(...) -> WCS-Telegramm +END_REGION diff --git a/doc/TRO_Katalog/scl_templates/FB_ILS_MTRO_1Sep_SSCC.scl b/doc/TRO_Katalog/scl_templates/FB_ILS_MTRO_1Sep_SSCC.scl new file mode 100644 index 0000000..bcf81a4 --- /dev/null +++ b/doc/TRO_Katalog/scl_templates/FB_ILS_MTRO_1Sep_SSCC.scl @@ -0,0 +1,93 @@ +// TEMPLATE: Instanziierungs-/Aufruf-Code für FB_ILS_MTRO_1Sep_SSCC +// ------------------------------------------------------------------------------------------ +// HINWEIS: FB_ILS_MTRO_1Sep_SSCC ist ausschliesslich als .liblink (nur in UH01) vorhanden, +// der FB-Quellcode liegt NICHT im Git-Repo. Dieses Template zeigt den realen AUFRUF, +// extrahiert aus: +// =A01+UH01-KF00\Programmbausteine\100_Main\FB_Main.scl (REGION "TRO 105 (1Sep)+Scanner") +// inkl. Cognex-Scanner- und SSCC-Scanner-Verdrahtung sowie Korrektur- und HMI-Bindung. +// ------------------------------------------------------------------------------------------ + +REGION TRO 105 (1Sep)+Scanner + #TRO105.stInSeparator1.Settings.nSeparatorNo := "cSep105.1"; + #TRO105.stInSeparator1.Settings.tDelayToNextItem := "TimeForSepWaiting_Short"; + #TRO105.stInSeparator1.Settings.tTrailingTime := t#600ms; + #TRO105.stInSeparator1.Settings.tHandlingTime := t#200ms; + #TRO105.stInSeparator1.Settings.tJam := "TimeForSepJam"; + #TRO105.stInSeparator1.Settings.xPluggedConfirm := FALSE; + #TRO105.stInSeparator1.Settings.xPluggedNullBT := FALSE; + #TRO105.stInSeparator1.Settings.xPluggedJam := TRUE; + #TRO105.stInSeparator1.Settings.xPluggedPart := FALSE; + #TRO105.stInSeparator1.Settings.xPluggedScanner := TRUE; + #TRO105.stInSeparator1.stSenInSep := "DB_Inputs".Sensors["cInBG3280"]; + #TRO105.stInSenJam2 := "DB_Inputs".Sensors["cInBG3281"]; + + #TRO105.stInSeparator1.Settings.tSenFree := T#1500ms; + #TRO105.stInSeparator1.Settings.tSenWait := T#4000ms; + + #TRO105.stInBarcodeReader.Settings.xActivateCheckASCI := TRUE; + #TRO105.stInBarcodeReader.Settings.tTimeout := T#3000ms; + + #arCognexInterface["cScannerBX1104"].xInCamTriggerReady := "bx1104-TriggerReady"; + #arCognexInterface["cScannerBX1104"].xInCamTriggerAck := "bx1104-TriggerAck"; + #arCognexInterface["cScannerBX1104"].xInCamResultsAvailable := "bx1104-Results Available"; + #arCognexInterface["cScannerBX1104"].xInCamGeneralFault := "bx1104-General Fault"; + #arCognexInterface["cScannerBX1104"].hwInCamInspectionResults := "BX1104~Ergebnisse_–_64_Bytes_1"; + + //SSCC + #stCognexIntfTro105.xInCamTriggerReady := "bx1107-TriggerReady"; + #stCognexIntfTro105.xInCamTriggerAck := "bx1107-TriggerAck"; + #stCognexIntfTro105.xInCamResultsAvailable := "bx1107-Results Available"; + #stCognexIntfTro105.xInCamGeneralFault := "bx1107-General Fault"; + #stCognexIntfTro105.hwInCamInspectionResults := "BX1107~Ergebnisse_–_64_Bytes_1"; + + #TRO105.stInBarcodeReaderSSCC.Settings.xActivateCheckASCI := TRUE; + #TRO105.stInBarcodeReaderSSCC.Settings.tTimeout := T#3s; + #TRO105.stInBarcodeReaderSSCC.xInPluggedSSCC := TRUE; + #TRO105.stInBarcodeReaderSSCC.stSenEndMeasurement := "DB_Inputs".Sensors["cInBG3281"]; + + #TRO105.stInPriorityManager.xReleaseOk := TRUE; //braucht keine Vorfahrtsregelung + + #TRO105(nInMainTroNo := "cMainTro105", + xInSftyOk := "DB_InterfaceSafety".stFromSafety.EStopMainOF1.Q, + xInAllRdyToStart := TRUE, + xInCancel := "cTodoFalse", + xInCarouselRun := TRUE,// Gefälle + xInRelease := "FB_CommunicationWCSBL_DB".fbTeleHandler.xOutConnectionActive OR "IBN".xFahrenOhneTcpPartner, + stInOutMachineState := #stInOutControlUnitCabinetOF1, + stInOutCognexInterface := #arCognexInterface["cScannerBX1104"], + stInOutCognexInterfaceSSCC := #stCognexIntfTro105, + arInOutJamEntr1 := "DB_JamArea0104".stJam0104_3.arCarrier, + stInOutJamEntr1 := "DB_JamArea0104".stJam0104_3.stData, + arInOutJamExit2 := "DB_JamArea0106".stJam0106_2.arCarrier, + stInOutJamExit2 := "DB_JamArea0106".stJam0106_2.stData, + stInOutHMI := "DB_Interface_HMI".stTRO.TRO105, + nOutStateLast => "DB_GLOB_TroState".arTroState["cMainTro105"], + xOutStopper1 => "MB3280"); + + "bx1104-TriggerEnable" := #arCognexInterface["cScannerBX1104"].xOutCamTriggerEnable; + "bx1104-Trigger" := #arCognexInterface["cScannerBX1104"].xOutCamTrigger; + "bx1104-ResultsAck" := #arCognexInterface["cScannerBX1104"].xOutCamResultsAck; + + //SSCC + "bx1107-TriggerEnable" := #stCognexIntfTro105.xOutCamTriggerEnable; + "bx1107-Trigger" := #stCognexIntfTro105.xOutCamTrigger; + "bx1107-ResultsAck" := #stCognexIntfTro105.xOutCamResultsAck; + + REGION Carr_Glob_Correction + "FC_CARR_GLOB_CORRECTION"(xInStart := #TRO105.xOutCorrection, //Führe Korrektur aus + nInBarcodeScan := #TRO105.nBarcodeResult, + nInStation := 0, + arOutEventLogInfo => #arDummyEventCorrectionInfo, + InOutCarrierExpect := "DB_JamArea0104".stJam0104_3.arCarrier[1]); + END_REGION + + REGION Write SSCC result TO HMI Interface + IF #TRO105.xOutNewScanSSCC THEN + "DB_Interface_HMI".stSSCC.SSCC1107.stLastMeasurement.nBarcodeTrolley := "DB_JamArea0104".stJam0104_3.arCarrier[1].nBarcode; + "DB_Interface_HMI".stSSCC.SSCC1107.stLastMeasurement.sSSCC := LINT_TO_STRING(#TRO105.nOutScanResultSSCC); + END_IF; + END_REGION + + // Fortsetzung im Original: REGION "Send DReqM to Fortna WCS (SSCC)" -> WCS-Telegrammversand, + // siehe Json_Layout-Konzept.md Abschnitt 4 "wcsTelegram" +END_REGION diff --git a/doc/TRO_Katalog/scl_templates/FB_ILS_MTRO_2Sep1Swi.scl b/doc/TRO_Katalog/scl_templates/FB_ILS_MTRO_2Sep1Swi.scl new file mode 100644 index 0000000..f295e47 --- /dev/null +++ b/doc/TRO_Katalog/scl_templates/FB_ILS_MTRO_2Sep1Swi.scl @@ -0,0 +1,1551 @@ +FUNCTION_BLOCK "FB_ILS_MTRO_2Sep1Swi" +{ S7_Optimized_Access := 'TRUE' } +VERSION : 0.1 + VAR_INPUT + stInSettings : Struct + nTroStopper1 : Int; + nTroStopper2 : Int; + nTroSwitchExit2 : Int; + nTroSwitchExit3 : Int; + xCar2NecRight : Bool; // 2. Kreisel ist notwendig für Richtung rechts + xCar2NecLeft : Bool; // 2. Kreisel ist notwendig für Richtung links + xPrioDir1 : Bool; // Für diese Direction ist Prio Funktion relevant + xPrioDir2 : Bool; // Für diese Direction ist Prio Funktion relevant + xPrioDir3 : Bool; + xPrioDir4 : Bool; + bSep1Type : Byte := 16#0; // X0: TRUE - erstes Bein halten, X1: TRUE- Beladekontrolle, X2: TRUE - Beladeerfassung + bSep2Type : Byte := 16#0; // X0: TRUE - erstes Bein halten, X1: TRUE- Beladekontrolle, X2: TRUE - Beladeerfassung + tPartSenHigh : Time := T#500ms; + tInSenHigh : Time := T#500ms; + xIsBorner1 : Bool; // Hiermit werden Dummys mit Barcode 1000-2000 angelegt + xIsBorner2 : Bool; // Hiermit werden Dummys mit Barcode 1000-2000 angelegt + nBornerDest1 : Int; // Standard Destination festlegen für Borner (variabel) + nBornerDest2 : Int; // Standard Destination festlegen für Borner (variabel) + tDummyTimeNormal : Time := T#3s; // Zeit für Dummy anlegen (Dummy = 1) + tDummyTimeBorner : Time := T#0ms; // Zeit für Dummy anlegen (Dummy = 1000-2000) schneller... + END_STRUCT; + stInSeparator1 : Struct + stSenInSep : "UDT_Sensor"; // Sensor in Stopper + stSenSepLeft : "UDT_Sensor"; // Sensor nach Stopper + stSenPart : "UDT_Sensor"; // Checkt, ob der Bügelträger beladen ist + stSenStartScan : "UDT_Sensor"; // Sensor nach Stopper wenn Scanner vorhanden. Vermutlich startet dieser Sensor den Scanner + Settings : "SettingsSeparator"; + END_STRUCT; + stInSeparator2 : Struct + stSenInSep : "UDT_Sensor"; // Sensor in Stopper + stSenSepLeft : "UDT_Sensor"; // Sensor nach Stopper + stSenPart : "UDT_Sensor"; // Checkt, ob der Bügelträger beladen ist + stSenStartScan : "UDT_Sensor"; // Sensor nach Stopper wenn Scanner vorhanden. Vermutlich startet dieser Sensor den Scanner + Settings : "SettingsSeparator"; + END_STRUCT; + stInSwitch1 : Struct + stSenExit3 : "UDT_Sensor"; + stSenExit4 : "UDT_Sensor"; + Settings : "SettingsSwitch"; + END_STRUCT; + stInBarcodeReader1 : Struct + Settings : "UDT_SettingsBarcodeReader"; + END_STRUCT; + stInBarcodeReader2 : Struct + Settings : "UDT_SettingsBarcodeReader"; + END_STRUCT; + stInPriorityManagerDir1 : "UDT_Response"; // Schnittstelle Prioritätenmanager (z.B. bei Kreuzungen) + stInPriorityManagerDir2 : "UDT_Response"; + stInPriorityManagerDir3 : "UDT_Response"; + stInPriorityManagerDir4 : "UDT_Response"; + stInSenJam2 : "UDT_Sensor"; // Stausensor Exit 2 + stInSenJam3 : "UDT_Sensor"; // Stausensor Exit 3 + nInMainTroNo : UInt; + xInSftyOk : Bool; + xInAllRdyToStart : Bool; + xInJamAtExit2 : Bool; // NIU Stau Exit 2 + xInJamAtExit3 : Bool; // NIU Stau Exit 3 + xInCarouselRun1 : Bool; // Rückmeldesignal von Carousel1: Motor läuft + xInCarouselRun2 : Bool; // Rückmeldesignal von Carousel2: Motor läuft + xInTestMode : Bool; + xInCancel : Bool; + xInAreaStopActive : Bool; // Bereichshalt + xInRelease : Bool; // Freigabe/Anforderung + nInDirection : USInt; + END_VAR + + VAR_OUTPUT + xOutStopper1 : Bool; + xOutStopper2 : Bool; + xOutSw1EntrTo1 : Bool; // Weiche auf Eingang 1 stellen + xOutSw1EntrTo2 : Bool; // Weiche auf Eingang 2 stellen + xOutSw1ExTo3 : Bool; // Weiche auf Ausgang 3 stellen + xOutSw1ExTo4 : Bool; // Weiche auf Ausgang 4 stellen + xOutJamAtEntry1 : Bool; + xOutJamAtEntry2 : Bool; + xOutCarouselReq1 : Bool; // Motor 1 anfordern + xOutCarouselReq2 : Bool; // Motor 2 anfordern + xOutCorrection : Bool; + nOutStateLast : Int; + stOutPriorityManagerDir1 : "UDT_Request"; + stOutPriorityManagerDir2 : "UDT_Request"; + stOutPriorityManagerDir3 : "UDT_Request"; + stOutPriorityManagerDir4 : "UDT_Request"; + xOutBookedDir1 : Bool; + xOutBookedDir2 : Bool; + xOutBookedDir3 : Bool; + xOutBookedDir4 : Bool; + stOutLastCarrier : "stCarrier"; + nOutScanResult : DInt; + xOutNewScan : Bool; + END_VAR + + VAR_IN_OUT + stInOutMachineState : "UDT_MainState"; + stInOutCognexInterface1 : "stCognexInterface"; + stInOutCognexInterface2 : "stCognexInterface"; + arInOutJamEntr1 : Array[*] of "stCarrier"; // Daten Staubereich Eingang 1 + stInOutJamEntr1 : "stJamData"; + arInOutJamEntr2 : Array[*] of "stCarrier"; // Daten Staubereich Eingang 2 + stInOutJamEntr2 : "stJamData"; + arInOutJamExit2 : Array[*] of "stCarrier"; // Daten Staubereich Ausgang 2 + stInOutJamExit2 : "stJamData"; + arInOutJamExit3 : Array[*] of "stCarrier"; // Daten Staubereich Ausgang 3 + stInOutJamExit3 : "stJamData"; + stInOutHMI : "UDT_HMI_TRO"; + END_VAR + + VAR + fbStateManager { S7_SetPoint := 'False'} : "FB_StateManager"; + fbSeparator1 { S7_SetPoint := 'False'} : "FB_ILS_STRO_Sep"; + fbSeparator2 : "FB_ILS_STRO_Sep"; + fbSwitch1 { S7_SetPoint := 'False'} : "FB_ILS_STRO_Switch"; + fbBarcodeReader1 { S7_SetPoint := 'False'} : "FB_BarcodeReaderCognex"; // Instanz Barcode-Reader1 + fbBarcodeReader2 : "FB_BarcodeReaderCognex"; // Instanz Barcode-Reader2 + END_VAR + VAR RETAIN + stActRequest : Struct + xNBT : Bool; // Es handelt sich um einen Nullbügelträger + xCancelled : Bool; // Abbruchanforderung durch MFR + xDirectionChange : Bool; + nActReqIndex : USInt; // 0 = nichts zu tun | 1-200: Aktuell bearbeiteter Index + nActArrIndex : USInt; + nDirection : USInt; // 0: Es bleibt hier alles so wie es ist! | 1: E1->A3 | 2: E1->A4 | 3: E2->A3 | 4: E2->A4 + nLastDirection : USInt; + nRequestedNoBT : USInt; // Anzahl Trolleys die ausgefahren werden sollen + nReasonForStop : USInt; // 0: Nichts | 5: Alle BT ausgefahren | 10: Fehler in SubTro | 15: Kein BT/NBT am Eingang | 20: Stau im nächsten MTRO | 25: NBT | 30: Falsch gefahren | 35: Initial-BT kam nicht am Ziel an | 40: Allgemeiner Fehler | 45: Abbruch durch MFR | 50: Fehler in Anfrage von MRF + nActNoStopper : USInt; // Anzahl der Stopper-öffnungen in diesem Auftrag + nActNoInSwitch : USInt; // Anzahl BT die sich noch in Weiche befinden müssten + nActNoInSwitchLast : USInt; + xLongSignal : Bool; + END_STRUCT; + nState : Int; + END_VAR + VAR + sStateText : String["cStateText"]; // Aktueller State der Schrittkette (textuell) + END_VAR + VAR RETAIN + nSetSwitch1 : USInt; // 0: Es bleibt hier alles so wie es ist! | 1: E1->A2 | 2: E1->A3 + xReleaseTrolleySep1 : Bool; // Öffne-Befehl + xReleaseTrolleySep2 : Bool; + xErrorMotor : Bool; // Fehler weil Motor-Run fehlt + xMTRORdy { S7_SetPoint := 'True'} : Bool; // MainTRO ist bereit für neue Aufträge (Signal an JobManager) + xWrongDirDetect : Bool; // Wrong Dir wurde erkannt + END_VAR + VAR + tOnSvReleaseSep1 {InstructionName := 'TON_TIME'; LibVersion := '1.0'; S7_SetPoint := 'False'} : TON_TIME; // Supervision - Freigabe Separator1 + tOnSvReleaseSep2 {InstructionName := 'TON_TIME'; LibVersion := '1.0'} : TON_TIME; // Supervision - Freigabe Separator2 + xStartScan : Bool; + xHandshakeScan : Bool; + nBarcodeResult : DInt; + nBarcodeHelp : DInt; + sBarcodeString : String; + xCodeEven : Bool; + xTrolleyWithPart1 : Bool; + xTrolleyWithPart2 : Bool; + xTrolleyWoPart1 : Bool; + xTrolleyWoPart2 : Bool; + xReadSecondLeg : Bool; + wErrorWord1 : Word; + wErrorWord2 : Word; + nLastDirection : USInt; + tOnSwitchDelay {InstructionName := 'TON_TIME'; LibVersion := '1.0'} : TON_TIME; + stCarrierDummy { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'; S7_SetPoint := 'False'} : "stCarrier" := (1, (), 16#01); + nArrayMax1 : Int; + nArrayMax2 : Int; + nBarcodeEmpty1 : Int := 0; + nBarcodeEmpty2 : Int; + tOnMonCarrArrive1 {InstructionName := 'TON_TIME'; LibVersion := '1.0'} : TON_TIME; // Überwachungszeit zwischen Carrier Online & Separator Sensor Belegung + tOnMonCarrArrive2 {InstructionName := 'TON_TIME'; LibVersion := '1.0'} : TON_TIME; + fbMonitoringCarrNotArrive1 : "FB_Monitoring"; + fbMonitoringCarrNotArrive2 : "FB_Monitoring"; + fbMonitoringCarrWoData1 : "FB_Monitoring"; + fbMonitoringCarrWoData2 : "FB_Monitoring"; + END_VAR + + VAR_TEMP + nIndex : USInt; + tmpActUnivTon : Bool; + tmpReqFinished : Bool; // Temp Signal für Switch + xBtEmpty : Bool; + xCarouselRun : Bool; + tmpReasonForStop : USInt; // Anhaltegrund in der Schrittkette | 0: Nichts | 5: Alle BT ausgefahren | 10: Fehler in SubTro | 15: Kein BT/NBT am Eingang | 20: Stau im nächsten MTRO | 25: NBT | 30: Falsch gefahren | 35: Initial-BT kam nicht am Ziel an | 40: Allgemeiner Fehler | 45: Abbruch durch MFR | 50: Fehler in Anfrage von MRF | 55: MFR hat TRO pausiert + stEmptyCarrier : "stCarrier"; + stBookingInfo : "stEventBookingInfo"; + arEmptyCarrier : Array[1..1] of "stCarrier"; // Platzhalter für CarrierArray + xGoodRead : Bool; + stEventGoodRead : "stEventScanInfo"; + arEventCorrectionInfo : Array[0..1] of "stEventCorrectionInfo"; + stEventNew : "stEventScanInfo"; + stEventUnknown : "stEventScanInfo"; + xTemp : Bool; + xNewCarrier : Bool; + xUnknownCarrier : Bool; + xTmpCorrection : Bool; + xStartSwitchDelay : Bool; + xBookedDir1 : Bool; + xBookedDir2 : Bool; + xBookedDir3 : Bool; + xBookedDir4 : Bool; + stTempCarrier : "stCarrier"; + tmpCarrierEmpty : "stCarrier"; + END_VAR + + VAR CONSTANT + "2SEP1SWITCH" : USInt := 3; + c0000_StepOff : Int := 0; // Schrittkette aus + c0100_StepUndefined : Int := 100; // Schrittkette undefiniert / Init + c1000_StepWaitForTrolley1 : Int := 1000; // Warte auf Trolley 1 + c1100_StepScannerTrig1 : Int := 1100; // Scanner Triggern + c1200_StepScannerEval1 : Int := 1200; // Scanergebnis auswerten + c1300_StepCheckLoad : Int := 1300; // Beladung prüfen + c1400_StepCheckSep1 : Int := 1400; // Separator checken + c1500_StepReleaseSep1 : Int := 1500; // Freigabe an Separator + c2000_StepWaitForTrolley2 : Int := 2000; // Warte auf Trolley 2 + c2100_StepScannerTrig2 : Int := 2100; // Scanner Triggern (nur wenn 1.Achse kein Ergebnis) + c2200_StepScannerEval2 : Int := 2200; // Scanergebnis auswerten (nur wenn 1.Achse kein Ergebnis) + c2250_StepCheckDir : Int := 2250; + c2225_StepGetDir : Int := 2225; + c2300_StepCheckSep2 : Int := 2300; // Separator checken + c2350_StepCheckSwi : Int := 2350; + c2400_StepCheckJam : Int := 2400; // Stau überprüfen + c2500_StepReleaseSep2 : Int := 2500; // Freigabe an Separator + cCarrierDummy : Int := 1; + cCarrierUnknown : Int := 2; + END_VAR + + +BEGIN + // (* Company: Schönenberger Systeme GmbH / (C) Copyright (2025). All rights reserved. + // ----------------------------------------------------------------------------------------- + // Title: FB_MTRO_1Sep1Swi + // Comment/Function: MainTRO-Function block for controlling TRO with 1x Sep and 1x Switch + // Library/Family: "MainTRO" + // Author: department: "Automatisierung" ; person in charge / contact: E.Yüksel, T. Molina, T.Schiller + // Target System: CPU 1518F-4 PN/DP + // Engineering: TIA Portal V20 + // Restrictions: - + // Requirements: (hardware, technological package, etc.) + // ----------------------------------------------------------------------------------------- + // Change log table: + // Version | Date | Signature (Safety) | Expert in charge | Changes applied + // ------------|------------|--------------------|------------------|----------------------- + // 001.000.000 | 2022-12-15 | - | Yüksel, Molina | Header added on 15.12.2022 + // 002.000.000 | 2025-02-11 | - | Yüksel | Adapt to ILS with Minitrolley, without external MFR + // + // *) + + // REGION Zweiten Motor einbinden + // IF #stInSettings.xCar2NecLeft AND + // (#stActRequest.nDirection = 1 OR #stActRequest.nDirection = 3) THEN + // #xCarouselRun := #xInCarouselRun1 AND #xInCarouselRun2; //Nach links wird 2. Motor gebraucht und aktuelle Richtung ist LINKS + // ELSIF #stInSettings.xCar2NecLeft AND + // (#stActRequest.nDirection = 2 OR #stActRequest.nDirection = 4) THEN + // #xCarouselRun := #xInCarouselRun1; //Nach links wird 2. Motor gebraucht und aktuelle Richtung ist RECHTS + // ELSIF #stInSettings.xCar2NecRight AND + // (#stActRequest.nDirection = 1 OR #stActRequest.nDirection = 3) THEN + // #xCarouselRun := #xInCarouselRun1; //Nach rechts wird 2. Motor gebraucht und aktuelle Richtung ist LINKS + // ELSIF #stInSettings.xCar2NecRight AND + // (#stActRequest.nDirection = 2 OR #stActRequest.nDirection = 4) THEN + // #xCarouselRun := #xInCarouselRun1 AND #xInCarouselRun2; //Nach rechts wird 2. Motor gebraucht und aktuelle Richtung ist RECHTS + // ELSE + // #xCarouselRun := #xInCarouselRun1; //normal + // END_IF; + // END_REGION + + // REGION Schrittkette + // REGION !!!IN ARBEIT - NUR VORBEREITET!!!!! + // (* + // Um Schrittkette herum alles für 2 Seps erweitert, also ganz simpel 1Sep1Swi genommen und alles für den zweiten kopiert, Schrittkette noch nicht gemacht. + // Prinzip lässt sich so aber nicht ohne weiteres umsetzen + // *) + + // END_REGION + + // CASE #nState OF + + // #c0000_StepOff: + // REGION 0000: Off + // //akt. Zustand + // #sStateText := 'OFF'; + // ///////// Ausgänge ///////// + + // ///////// Statics ////////// + // #xReleaseTrolleySep1 := FALSE; + // #xReleaseTrolleySep2 := FALSE; + // #nSetSwitch1 := 0; + // #xOutNewScan := FALSE; + // ///////// Timer ////////// + + // //////// Transition //////// + + // END_REGION + + // #c0100_StepUndefined: + + // REGION 0100: Undefined + // // akt. Zustand + // #sStateText := 'Undefined'; + // ///////// Ausgänge ///////// + + // ///////// Statics ////////// + // #xReleaseTrolleySep1 := FALSE; + // #xReleaseTrolleySep2 := FALSE; + // #nSetSwitch1 := 0; + // #xMTRORdy := FALSE; + // #xCodeEven := FALSE; + + // ///////// Timer ////////// + + // //////// Transition //////// + + // #nState := #c1000_StepWaitForTrolley1; + + // END_REGION + + // #c1000_StepWaitForTrolley1: + // REGION 1000: Wait for Trolley + // //akt. Zustand + // #sStateText := 'Wait for Trolley'; + // ///////// Ausgänge ///////// + + // ///////// Statics ////////// + + // #xReleaseTrolleySep1 := FALSE; + // #xReleaseTrolleySep2 := FALSE; + // #xCodeEven := FALSE; + // #xMTRORdy := TRUE; + // #xOutNewScan := FALSE; + + // //Transition + // IF NOT #stInOutHMI.UDT_Ctrl.xPause THEN + // IF #fbSeparator1.stOutMainTro.xBtPresent THEN //Separator meldet Belegung + // IF #stInSeparator1.Settings.xPluggedScanner THEN //Scanner verbaut? + // #nState := #c1100_StepScannerTrig1; //Nächster Schritt -> Scannen + // ELSIF #arInOutJamEntr1[1].bStatus.%X0 THEN // Kein Scanner verbaut, aber Carrier online (z.B. Dummy wurde angelegt) + // IF #stInSeparator1.Settings.xPluggedPart THEN + // #nState := #c1300_StepCheckLoad; // Nächster Schritt -> Beladung prüfen + // ELSE + // #nState := #c1400_StepCheckSep1; //Nächster Schritt -> Separator chekcen + // END_IF; + // END_IF; + // END_IF; + // END_IF; + + // END_REGION + + // #c1100_StepScannerTrig1: + // REGION 1100: Scanner Trigger 1 + + // // akt. Zustand + // #sStateText := 'Scanner Trigger 1'; + + // ///////// Ausgänge ///////// + + // ///////// Statics ////////// + // #xReleaseTrolleySep1 := FALSE; + + // IF #fbBarcodeReader1.xOutReadyForNewScan THEN //Scanner bereit + // #xStartScan := TRUE; //Startbefehl + // END_IF; + + // ///////// Timer ////////// + + // //////// Transition //////// + + // IF #fbBarcodeReader1.xOutReadingDone THEN //Scanner Rückmeldung + // #xStartScan := FALSE; + // #nState := #c1200_StepScannerEval1; //Weiter + // END_IF; + // END_REGION + + // #c1200_StepScannerEval1: + // REGION 1200: Scanner Evaluation 1 + + // // akt. Zustand + // #sStateText := 'Scanner Evaluation 1'; + + // ///////// Ausgänge ///////// + + // ///////// Statics ////////// + // #xReleaseTrolleySep1 := FALSE; + + // // Logic - TODO in eigenen FC packen?.. + + // IF #fbBarcodeReader1.xOutCodeGood THEN + // #nBarcodeResult := LINT_TO_DINT(#fbBarcodeReader1.#nOutBarcode); // Good read vom Barcode reader übernehmen + + // REGION Event log Good read + // #xGoodRead := TRUE; // Trigger + // #stEventGoodRead.nScanType := 4; + // #stEventGoodRead.sBarcode := DELETE(IN := DINT_TO_STRING(#nBarcodeResult), L := 1, P := 1); + // #stEventGoodRead.sReaderId := DELETE(IN := INT_TO_STRING(#stInBarcodeReader1.Settings.#nStation), L := 1, P := 1); + // END_REGION + + // REGION Gerade Zahl erkannt + // IF (((#nBarcodeResult / 10) MOD 100) MOD 2 <> 1) THEN //anderes Ergebnis als 1 bedeutet, (xxxxxYYx) YY=gerade, also hinteres Bein von MiniTrolley + // #xCodeEven := TRUE; //Bit sagt Separator dass hinteres Bein und nicht erstes zur Korrektur in Schrittkette + // // #nBarcodeTarget := #nBarcodeTarget - 10; //Mache danach die gerade Zahl zur ungeraden UPDATE: WEGEN 8. ZIFFER KLAPPT DAS SO NICHT + // #nBarcodeHelp := (#nBarcodeResult / 10) - 1; + + // "FC_Ean8_CheckDigit"(sInDigits := DELETE(IN := DINT_TO_STRING(IN := #nBarcodeHelp), L := 1, P := 1), + // sOutBarcode => #sBarcodeString, + // nOutBarcode => #nBarcodeResult); + + // // #sOutBarcode := #sBarcodeString; + // END_IF; + // END_REGION + + // ELSIF #fbBarcodeReader1.#xOutCodeBad THEN + // #nBarcodeResult := #arInOutJamEntr1[1].nBarcode; //erwarteter Barcode wird aus JamDaten übernommen + // END_IF; + + // IF (#nBarcodeResult > 100) AND + // (#nBarcodeResult < 2147483647) AND // Good Read (2.147.483.647 Maximum von DINT) + // (#arInOutJamEntr1[1].nBarcode = 0 OR #arInOutJamEntr1[1].nBarcode = 1) THEN //Wenn keine Daten oder ein Dummy erwartet werden + + // #xTmpCorrection := TRUE; + // // REGION Carr_Glob_Correction + + + // // "FC_CARR_GLOB_CORRECTION"(xInStart := TRUE, //Führe Korrektur aus + // // nInBarcodeScan := #nBarcodeResult, + // // nInStation := #stInBarcodeReader.Settings.nStation, + // // xOutNotFound => #xTemp, + // // arOutEventLogInfo => #arEventCorrectionInfo, + // // InOutCarrierExpect := #arInOutJamEntr1[1]); + // // END_REGION + + + // // IF NOT #xTemp THEN + // // ; + // // // #stInOutCarrier.stCarrData.nNrOfScans += 1; + // // ELSE + // // #arInOutJamEntr1[1].nDestination := "cDestNONE"; //neuer Carrier // TODO + // // // #stInOutCarrier.stCarrData.nNrOfScans += 1; + // // #arInOutJamEntr1[1].nBarcode := #nBarcodeResult; //Hier werden neue Carrier im System angelegt + // // #arInOutJamEntr1[1].bStatus.%X0 := TRUE; + // // END_IF; + + // // REGION Event Log New Carrier + + // // #xNewCarrier := TRUE; // Trigger + // // #stEventNew.nScanType := 2; + // // #stEventNew.sBarcode := DELETE(IN := DINT_TO_STRING(#arInOutJamEntr1[1].nBarcode), L := 1, P := 1); + // // #stEventNew.sDest := DELETE(IN := INT_TO_STRING(#arInOutJamEntr1[1].nDestination), L := 1, P := 1); + // // #stEventNew.sReaderId := DELETE(IN := INT_TO_STRING(#stInBarcodeReader.Settings.#nStation), L := 1, P := 1); + + // // END_REGION + + // ELSIF + // (#nBarcodeResult > 100) AND + // (#nBarcodeResult < 2147483647) AND // Good Read (2.147.483.647 Maximum von DINT) + // #arInOutJamEntr1[1].nBarcode = #nBarcodeResult THEN //Barcodes stimmen überein ODER es wird hier gelandet mit BadRead wobei normaler Barcode erwartet wird-> mache normal weiter + // ; + // ELSIF + // (#nBarcodeResult > 100) AND + // (#nBarcodeResult < 2147483647) AND + // #arInOutJamEntr1[1].nBarcode <> #nBarcodeResult AND //Barcodes stimmen nicht überein, erwarteter Carrier enthält aber normalen Barcode + // #arInOutJamEntr1[1].nBarcode <> 0 AND + // #arInOutJamEntr1[1].nBarcode <> 1 THEN + + // #xTmpCorrection := TRUE; + + // // REGION Carr_Glob_Correction + + // // "FC_CARR_GLOB_CORRECTION"(xInStart := TRUE, //Führe Korrektur aus + // // nInBarcodeScan := #nBarcodeResult, + // // nInStation := #stInBarcodeReader.Settings.nStation, + // // xOutNotFound => #xTemp, + // // arOutEventLogInfo => #arEventCorrectionInfo, + // // InOutCarrierExpect := #arInOutJamEntr1[1]); + // // END_REGION + + // // IF NOT #xTemp THEN + // // ; + // // // #stInOutCarrier.stCarrData.nNrOfScans += 1; + // // ELSE + // // #arInOutJamEntr1[1].nDestination := "cDestNONE"; //neuer Carrier // TODO + // // // #stInOutCarrier.stCarrData.nNrOfScans += 1; + // // #arInOutJamEntr1[1].nBarcode := #nBarcodeResult; //Hier werden neue Carrier im System angelegt + // // #arInOutJamEntr1[1].bStatus.%X0 := TRUE; + // // END_IF; + + // // REGION Event Log New Carrier + + // // #xNewCarrier := TRUE; // Trigger + // // #stEventNew.nScanType := 2; + // // #stEventNew.sBarcode := DELETE(IN := DINT_TO_STRING(#arInOutJamEntr1[1].nBarcode), L := 1, P := 1); + // // #stEventNew.sDest := DELETE(IN := INT_TO_STRING(#arInOutJamEntr1[1].nDestination), L := 1, P := 1); + // // #stEventNew.sReaderId := DELETE(IN := INT_TO_STRING(#stInBarcodeReader.Settings.#nStation), L := 1, P := 1); + + // // END_REGION + + + // ELSE // Bad Read, falls nichts oder Dummy erwartet wird -> HANDLING TO DO!!!!!!!!!!!!!!!!!!!!!!!!!!!! + // #arInOutJamEntr1[1].bStatus.%X0 := TRUE; + // #arInOutJamEntr1[1].nBarcode := 2; //unbekannter Carrier mit Badread, erwartet 0 und physikalisch vorhanden + // #arInOutJamEntr1[1].nDestination := 123; //todo + + // REGION Event Log unknown Carrier + + // #xUnknownCarrier := TRUE; // Trigger + // #stEventUnknown.nScanType := 3; + // #stEventUnknown.sBarcode := DELETE(IN := DINT_TO_STRING(#arInOutJamEntr1[1].nBarcode), L := 1, P := 1); + // #stEventUnknown.sDest := DELETE(IN := INT_TO_STRING(#arInOutJamEntr1[1].nDestination), L := 1, P := 1); + // #stEventUnknown.sReaderId := DELETE(IN := INT_TO_STRING(#stInBarcodeReader1.Settings.#nStation + 50), L := 1, P := 1); + + // END_REGION + + // END_IF; + + // #xHandshakeScan := TRUE; + + // #nOutScanResult := #nBarcodeResult; + // #xOutNewScan := TRUE; + // ///////// Timer ////////// + + // //////// Transition //////// + // IF #stInSeparator1.Settings.xPluggedPart AND #stInSettings.bSep1Type.%X2 THEN + // #nState := #c1300_StepCheckLoad; + // ELSIF #xCodeEven THEN + // #xCodeEven := FALSE; + // #nState := #c2000_StepWaitForTrolley2; //Scanner bestätigt zweites Bein gelesen -> Korrigieren! + // ELSE + // #nState := #c1400_StepCheckSep1; + // END_IF; + + // END_REGION + + // #c1300_StepCheckLoad: + // REGION 1300: Check Load + + // // akt. Zustand + // #sStateText := 'Check Load'; + + // ///////// Ausgänge ///////// + // ///////// Statics ////////// + // #xHandshakeScan := FALSE; + // #xReleaseTrolleySep1 := FALSE; + // #xOutNewScan := FALSE; + // ///////// Timer ////////// + + // //////// Transition //////// + // #tmpActUnivTon := TRUE; + // IF (#arInOutJamEntr1[1].bStatus.%X1 AND #xTrolleyWithPart1) OR //Daten und physikalisch -> beladen Ok! + // (NOT #arInOutJamEntr1[1].bStatus.%X1 AND #xTrolleyWoPart1) //Daten und physikalisch -> unbeladen Ok! + // THEN + // #nState := #c1400_StepCheckSep1; // Weiter + // ELSIF #fbStateManager.tOutUnivTonR > T#3s THEN + // #tmpReasonForStop := 123; // TODO: Beladekontrolle Fehler + // END_IF; + + // END_REGION + + // #c1400_StepCheckSep1: + // REGION 1400: Check Separator + // // akt. Zustand + // #sStateText := 'Check Sep'; + + // ///////// Ausgänge ///////// + // ///////// Statics ////////// + // #xReleaseTrolleySep1 := FALSE; + // #xHandshakeScan := FALSE; + // #xOutNewScan := FALSE; + // ///////// Timer ////////// + + // //////// Transition //////// + // #tmpActUnivTon := TRUE; + // IF #fbSeparator1.stOutMainTro.nStatus = "SepState_WaitForReq" THEN // Separator ist bereit + // #nState := #c1500_StepReleaseSep1; + // ELSIF #fbStateManager.tOutUnivTonR > T#3s THEN + // #tmpReasonForStop := "Rsn_SubError"; // SubTRO: Separator ist nicht bereit + // END_IF; + + // END_REGION + + + // #c1500_StepReleaseSep1: + // REGION 1500: Release Sep 1 + // // akt. Zustand + // #sStateText := 'Leave Sep 1'; + + // ///////// Ausgänge ///////// + // ///////// Statics ////////// + + // #xReleaseTrolleySep1 := (#xCarouselRun AND #xInSftyOk) AND + // (NOT #stInSettings.bSep1Type.%X0 OR + // (#xInRelease AND #stInSettings.bSep1Type.%X0 AND NOT #stInSettings.bSep1Type.%X1) OR + // (#xInRelease AND #stInSettings.bSep1Type.%X0 AND #stInSettings.bSep1Type.%X1 AND + // ((#arInOutJamEntr1[1].bStatus.%X1 AND #xTrolleyWithPart1) OR + // (NOT #arInOutJamEntr1[1].bStatus.%X1 AND #xTrolleyWoPart1)))); // Erste Achse darf vereinzelt werden + + // //////// Transition //////// + // IF #fbSeparator1.stOutMainTro.nStatus = "SepState_Finish" THEN + // #nState := #c2000_StepWaitForTrolley2; + // ELSIF #xReleaseTrolleySep1 AND #tOnSvReleaseSep1.Q THEN + // #tmpReasonForStop := "Rsn_SubError"; // Timeout-Fehler im SubTRO "Separator": Freigabe erteilt, aber Separator gibt keine Rückmeldung an MainTRO + // END_IF; + + // END_REGION + + // #c2000_StepWaitForTrolley2: + // REGION 2000: Wait for Trolley 2 + // //akt. Zustand + // #sStateText := 'Wait for Trolley 2'; + // ///////// Ausgänge ///////// + + // ///////// Statics ////////// + + // #xReleaseTrolleySep1 := FALSE; + // #xHandshakeScan := FALSE; + // #xOutNewScan := FALSE; + + // //Korrektur 2.Bein kommt nicht + // (* IF NOT #fbSeparator1.stOutMainTro.xBtPresent (* AND #xInCarouselRun *)AND NOT #stInSeparator1.Settings.xPluggedScanner AND #fbStateManager.tOutTimeInStep > T#3s THEN + // #nState := #c1000_StepWaitForTrolley1; + // END_IF; *) + + + // //Transition + // IF NOT #stInOutHMI.UDT_Ctrl.xPause THEN + // IF #fbSeparator1.stOutMainTro.xBtPresent AND //Separator meldet Belegung + // #arInOutJamEntr1[1].bStatus.%X0 // Carrier ist online + // AND ((#xInRelease AND NOT #stInSettings.bSep1Type.%X0) OR #stInSettings.bSep1Type.%X0)//Freigabe + // THEN + // IF #xReadSecondLeg // zweites Bein muss gelesen werden (TODO!!!!) + // AND #stInSeparator1.Settings.xPluggedScanner // Scanner verbaut? + // THEN + // #nState := #c2100_StepScannerTrig2; // Nächster Schritt -> Scannen + // ELSE + // #nState := #c2225_StepGetDir;//#c2250_StepCheckDir; // Nächster Schritt -> Check Direction + // END_IF; + // END_IF; + // END_IF; + // END_REGION + + // #c2100_StepScannerTrig2: + // REGION 2100: Scanner Trigger 2 + + // // akt. Zustand + // #sStateText := 'Scanner Trigger 2'; + + // ///////// Ausgänge ///////// + + // ///////// Statics ////////// + // #xReleaseTrolleySep1 := FALSE; + + // IF #fbBarcodeReader1.xOutReadyForNewScan THEN + // #xStartScan := TRUE; + // END_IF; + + // ///////// Timer ////////// + + // //////// Transition //////// + + // IF #fbBarcodeReader1.xOutReadingDone THEN + // #xStartScan := FALSE; + // #nState := #c2200_StepScannerEval2; + // END_IF; + // END_REGION + + // #c2200_StepScannerEval2: + // REGION 2200: Scanner Evaluation 2 + + // // akt. Zustand + // #sStateText := 'Scanner Evaluation 2'; + + // ///////// Ausgänge ///////// + + // ///////// Statics ////////// + // #xReleaseTrolleySep1 := FALSE; + + // // Logic + + // IF #fbBarcodeReader1.xOutCodeGood THEN + // #nBarcodeResult := LINT_TO_DINT(#fbBarcodeReader1.#nOutBarcode); // Good read vom Barcode reader + // ELSIF #fbBarcodeReader1.#xOutCodeBad THEN + // #nBarcodeResult := #arInOutJamEntr1[1].nBarcode; //erwarteter Barcode wird aus JamDaten übernommen + // END_IF; + + // IF (#nBarcodeResult > 100) AND + // (#nBarcodeResult < 2147483647) AND // Good Read (2.147.483.647 Maximum von DINT) + // (#arInOutJamEntr1[1].nBarcode = 0 OR #arInOutJamEntr1[1].nBarcode = 1) THEN //Wenn keine Daten oder ein Dummy erwartet werden + // REGION TODO + // (* "FC_CARR_GLOB_CORRECTION"(xInStart := TRUE, //Führe Korrektur aus + // nInBarcodeScan := #nBarcodeResult, + // nInStation := 0, // todo + // xOutNotFound => #xTemp, + // arOutEventLogInfo => #arEventCorrectionInfo, + // InOutCarrierExpect := #arInOutJamEntr1[1]); *) + // END_REGION + + + // IF NOT #xTemp THEN + // ; + // // #stInOutCarrier.stCarrData.nNrOfScans += 1; + // ELSE + // #arInOutJamEntr1[1].nDestination := "cDestNONE"; //neuer Carrier // TODO + // // #stInOutCarrier.stCarrData.nNrOfScans += 1; + // #arInOutJamEntr1[1].nBarcode := #nBarcodeResult; //Hier werden neue Carrier im System angelegt + // #arInOutJamEntr1[1].bStatus.%X0 := TRUE; + // END_IF; + // ELSIF + // (#nBarcodeResult > 100) AND + // (#nBarcodeResult < 2147483647) AND // Good Read (2.147.483.647 Maximum von DINT) + // #arInOutJamEntr1[1].nBarcode = #nBarcodeResult THEN //Barcodes stimmen überein ODER es wird hier gelandet mit BadRead wobei normaler Barcode erwartet wird-> mache normal weiter + // ; + // ELSIF + // (#nBarcodeResult > 100) AND + // (#nBarcodeResult < 2147483647) AND + // #arInOutJamEntr1[1].nBarcode <> #nBarcodeResult AND //Barcodes stimmen nicht überein, erwarteter Carrier enthält aber normalen Barcode + // #arInOutJamEntr1[1].nBarcode <> 0 AND + // #arInOutJamEntr1[1].nBarcode <> 1 THEN + // ; + // REGION TODO + // (* "FC_CARR_GLOB_CORRECTION"(xInStart := TRUE, //Führe Korrektur aus + // nInBarcodeScan := #nBarcodeResult, + // nInStation := 0, // todo + // xOutNotFound => #xTemp, + // arOutEventLogInfo => #arEventCorrectionInfo, + // InOutCarrierExpect := #arInOutJamEntr1[1]); *) + // END_REGION + + // ELSE // Bad Read, falls nichts oder Dummy erwartet wird -> HANDLING TO DO!!!!!!!!!!!!!!!!!!!!!!!!!!!! + // #arInOutJamEntr1[1].bStatus.%X0 := TRUE; + // #arInOutJamEntr1[1].nBarcode := 2; //unbekannter Carrier mit Badread, erwartet 0 und physikalisch vorhanden + // #arInOutJamEntr1[1].nDestination := 123; //todo + // END_IF; + + // #xHandshakeScan := TRUE; + + // ///////// Timer ////////// + + // //////// Transition //////// + // #nState := #c2225_StepGetDir;//#c2250_StepCheckDir; + // END_REGION ; + + // #c2225_StepGetDir: + // REGION 2225: Get Direction + // // akt. Zustand + // #sStateText := 'Get Dir'; + + // ///////// Ausgänge ///////// + + // ///////// Statics ////////// + // #xReleaseTrolleySep1 := FALSE; + + // #stActRequest.nDirection := #nInDirection; + + // IF #stActRequest.nDirection = 0 THEN + // #tmpReasonForStop := "Rsn_MfrMistake"; + // ELSE + // #nState := #c2250_StepCheckDir; + // END_IF; + // END_REGION + + + + // #c2250_StepCheckDir: + // REGION 2250: Check Direction + + // // akt. Zustand + // #sStateText := 'Check Dir'; + + // ///////// Ausgänge ///////// + + // ///////// Statics ////////// + // #xReleaseTrolleySep1 := FALSE; + + // //Richtungswechsel muss noch berücksichtigt werden! + // IF #nLastDirection <> #stActRequest.nDirection THEN // Richtungswechsel -> Warten + // // #tmpActUnivTon := TRUE; + // #xStartSwitchDelay := true; + // IF #tOnSwitchDelay.Q THEN + // #nSetSwitch1 := #stActRequest.nDirection; + // #nLastDirection := #stActRequest.nDirection; + // #nState := #c2300_StepCheckSep2; + // END_IF; + // ELSIF #nLastDirection = #nInDirection THEN // Gleiche Richtung -> Weiter + // #nSetSwitch1 := #stActRequest.nDirection; + // #nLastDirection := #stActRequest.nDirection; + // #nState := #c2300_StepCheckSep2; + // END_IF; + // END_REGION + + + // #c2300_StepCheckSep2: + // REGION 2300: Check Separator + // // akt. Zustand + // #sStateText := 'Check Sep'; + + // ///////// Ausgänge ///////// + // ///////// Statics ////////// + // #xHandshakeScan := FALSE; + // #xReleaseTrolleySep1 := FALSE; + // ///////// Timer ////////// + + // //////// Transition //////// + // #tmpActUnivTon := TRUE; + // IF #fbSeparator1.stOutMainTro.nStatus = "SepState_WaitForReq" THEN // Separator ist bereit + // #nState := #c2350_StepCheckSwi; + // ELSIF #fbStateManager.tOutUnivTonR > T#3s THEN + // #tmpReasonForStop := "Rsn_SubError"; // SubTRO: Separator ist nicht bereit + // END_IF; + + // END_REGION + + + // #c2350_StepCheckSwi: + // REGION 2300: Check Switch + + // //akt. Zustand + // #sStateText := 'Check Switch'; + + // ///////// Ausgänge ///////// + + // ///////// Statics ////////// + // #xReleaseTrolleySep1 := FALSE; + + // #nSetSwitch1 := #stActRequest.nDirection; + // ///////// Timer ////////// + + // //////// Transition //////// + + // CASE #stActRequest.nDirection OF + // 1: + // IF NOT #fbSwitch1.stOutMainTro.xStatusIn AND + // NOT #fbSwitch1.stOutMainTro.xStatusOut AND NOT #fbSwitch1.xOutPermSigOutSen3 THEN + // #fbSwitch1.xInOutEnq := FALSE; + // #nState := #c2400_StepCheckJam; + // ELSE + // #tmpReasonForStop := "Rsn_SubError"; // Fehler im SubTRO: Weiche + // END_IF; + // 2: + // IF NOT #fbSwitch1.stOutMainTro.xStatusIn AND + // #fbSwitch1.stOutMainTro.xStatusOut AND NOT #fbSwitch1.xOutPermSigOutSen4 THEN + // #fbSwitch1.xInOutEnq := FALSE; + // #nState := #c2400_StepCheckJam; + // ELSE + // #tmpReasonForStop := "Rsn_SubError"; // Fehler im SubTRO: Weiche + // END_IF; + // ELSE + // #tmpReasonForStop := "Rsn_GeneralError"; // Allgemeiner Fehler falls Direction irgendetwas anderes ist als 1 oder 2 + // #nState := #c2225_StepGetDir; // zurückgehen zu Get Direction + // END_CASE; + // END_REGION + + // #c2400_StepCheckJam: + // REGION 2400: Check Jam + // // akt. Zustand + // #sStateText := 'Check Jam'; + // ///////// Ausgänge ///////// + // ///////// Statics ////////// + // #xReleaseTrolleySep1 := FALSE; + // #nSetSwitch1 := #stActRequest.nDirection; + + // ///////// Timer ////////// + // //////// Transition //////// + // CASE #stActRequest.nDirection OF + // 1: //Ausgang 2 wird auf Stau geprüft + // IF (#stInOutJamExit2.Status.nCount = #stInOutJamExit2.Config.nCapacitySet) OR #stInSenJam2.xJam THEN //Stau vom nächsten MainTro wird gemeldet + // #tmpReasonForStop := "Rsn_JamNextError"; + // ELSIF #fbSwitch1.stOutMainTro.xJamAtExit3 THEN //Stau vom SubTro wird gemeldet + // #tmpReasonForStop := "Rsn_SubError"; + // ELSE + // #nState := #c2500_StepReleaseSep2; //ohne Stau nächster Schritt + // END_IF; + // 2: //Ausgang 3 wird auf Stau geprüft + // IF (#stInOutJamExit3.Status.nCount = #stInOutJamExit3.Config.nCapacitySet) OR #stInSenJam3.xJam THEN //Stau vom nächsten MainTro wird gemeldet + // #tmpReasonForStop := "Rsn_JamNextError"; + // ELSIF #fbSwitch1.stOutMainTro.xJamAtExit4 THEN //Stau vom SubTro wird gemeldet + // #tmpReasonForStop := "Rsn_SubError"; + // ELSE + // #nState := #c2500_StepReleaseSep2; //ohne Stau nächster Schritt + // END_IF; + // ELSE + // #tmpReasonForStop := "Rsn_GeneralError"; // Allgemeiner Fehler falls Direction irgendetwas anderes ist als 1 oder 2 + // #nState := #c2225_StepGetDir; // zurückgehen zu Get Direction + // END_CASE; + + // END_REGION + + // #c2500_StepReleaseSep2: + // REGION 2500: Leave, Switch confirmed + + // // aktueller Zustand + + // #sStateText := 'Leave Separator'; + + // ///////// Ausgänge ///////// + + // ///////// Statics ////////// + // // Freigabe an Separator, wenn alle Bedingungen erfüllt + // #xReleaseTrolleySep1 := #xInSftyOk AND + // #xCarouselRun AND + // NOT #xWrongDirDetect AND + // NOT #stActRequest.xLongSignal AND + // NOT #stInOutJamEntr1.Status.bByte.%X3 AND + + // (#stInPriorityManagerDir1.xReleaseOk AND #stActRequest.nDirection = 1 AND #stInSettings.xPrioDir1) + // OR (#stActRequest.nDirection = 1 AND NOT #stInSettings.xPrioDir1) + // OR (#stInPriorityManagerDir2.xReleaseOk AND #stActRequest.nDirection = 2 AND #stInSettings.xPrioDir2) + // OR (#stActRequest.nDirection = 2 AND NOT #stInSettings.xPrioDir2) + // OR (NOT #stInSettings.xPrioDir1 AND NOT #stInSettings.xPrioDir2) AND + + // (#stActRequest.nDirection = 1 OR #stActRequest.nDirection = 2); + + // #nSetSwitch1 := #stActRequest.nDirection; + // ///////// Timer ////////// + + // // Reason for Stop + + // // IF #stInMfr.xPause THEN + // // #tmpReasonForStop := "Rsn_MfrPausedTro"; + // // END_IF; + + // IF NOT #xCarouselRun THEN + // #tmpReasonForStop := "Rsn_CarouselError"; + // END_IF; + + // IF #xWrongDirDetect THEN + // #tmpReasonForStop := "Rsn_WrongDirection"; + // END_IF; + + // IF #stActRequest.xLongSignal THEN + // #tmpReasonForStop := "Rsn_LongSignalDetected"; + // END_IF; + + // //////// Transition //////// + + // CASE #stActRequest.nDirection OF + // 1, 2: + // IF #fbSeparator1.stOutMainTro.nStatus = "SepState_Finish" THEN // Separator meldet erfolgreiches Vereinzeln + // REGION NEU: Buchen 1->3 + // IF #stActRequest.nDirection = 1 THEN + // #stTempCarrier := #arInOutJamEntr1[1]; + + // "FC_Route"(xInSingle := FALSE, + // xInSeparate := FALSE, + // xInSepEdge := TRUE, + // xInSensor := FALSE, + // xInDelay := FALSE, + // stInCarrier := #stEmptyCarrier, + // stOutBookingInfo => #stBookingInfo, + // arJamEntr := #arInOutJamEntr1, + // arOnTheWay := #arEmptyCarrier, + // arJamExit := #arInOutJamExit2); + // #xBookedDir1 := TRUE; + // END_IF; + // END_REGION + + // REGION NEU: Buchen 1->4 + // IF #stActRequest.nDirection = 2 THEN + // #stTempCarrier := #arInOutJamEntr1[1]; + // "FC_Route"(xInSingle := FALSE, + // xInSeparate := FALSE, + // xInSepEdge := TRUE, + // xInSensor := FALSE, + // xInDelay := FALSE, + // stInCarrier := #stEmptyCarrier, + // stOutBookingInfo => #stBookingInfo, + // arJamEntr := #arInOutJamEntr1, + // arOnTheWay := #arEmptyCarrier, + // arJamExit := #arInOutJamExit3); + + // #xBookedDir2 := TRUE; + // END_IF; + // END_REGION + + + + // #nState := #c1000_StepWaitForTrolley1; // Nächster Schritt + // ELSIF #xReleaseTrolleySep1 AND #tOnSvReleaseSep1.Q THEN // Überwachungszeit nach Freigabe an Separator abgelaufen + // #tmpReasonForStop := "Rsn_SubError"; // Timeout-Fehler im Separator: Freigabe erteilt, aber Separator gibt keine Rückmeldung an MainTRO + // END_IF; + // ELSE + // #tmpReasonForStop := "Rsn_GeneralError"; // Allgemeiner Fehler + // #nState := #c2225_StepGetDir; + // END_CASE; + // END_REGION + // END_CASE; + + // END_REGION + + // REGION Beladekontrolle + // //Beladekontrolle aktiviert + // REGION Sep1 + // IF #stInSeparator1.Settings.xPluggedPart THEN + + // //Trolley beladen + // #xTrolleyWithPart1 := + // #stInSeparator1.Settings.xPluggedPart AND + // #stInSeparator1.stSenInSep.xDbncdSensor + // AND #stInSeparator1.stSenPart.xDirectSensor + // AND #stInSeparator1.stSenPart.tDirectChangeLast > #stInSettings.tPartSenHigh; + + // //Trolley nicht beladen + // #xTrolleyWoPart1 := + // #stInSeparator1.Settings.xPluggedPart AND + // #stInSeparator1.stSenInSep.xDbncdSensor AND + // #stInSeparator1.stSenInSep.tDirectChangeLast > #stInSettings.tInSenHigh AND + // NOT #stInSeparator1.stSenPart.xDirectSensor; + + // //Plausibel? + // IF #stInSeparator1.Settings.xPluggedPart AND ((#arInOutJamEntr1[1].bStatus.%X1 AND #xTrolleyWoPart1) OR + // (NOT #arInOutJamEntr1[1].bStatus.%X1 AND #xTrolleyWithPart1)) + // THEN + // #wErrorWord1.%X2 := TRUE; + // ELSE + // #wErrorWord1.%X2 := FALSE; + // END_IF; + // ELSE + // #xTrolleyWithPart1 := #xTrolleyWoPart1 := FALSE; // Beladekontrolle (Sensor) nicht verbaut + // END_IF; + // END_REGION + + // REGION Sep2 + // IF #stInSeparator2.Settings.xPluggedPart THEN + + // //Trolley beladen + // #xTrolleyWithPart2 := + // #stInSeparator2.Settings.xPluggedPart AND + // #stInSeparator2.stSenInSep.xDbncdSensor + // AND #stInSeparator2.stSenPart.xDirectSensor + // AND #stInSeparator2.stSenPart.tDirectChangeLast > #stInSettings.tPartSenHigh; + + // //Trolley nicht beladen + // #xTrolleyWoPart2 := + // #stInSeparator2.Settings.xPluggedPart AND + // #stInSeparator2.stSenInSep.xDbncdSensor AND + // #stInSeparator2.stSenInSep.tDirectChangeLast > #stInSettings.tInSenHigh AND + // NOT #stInSeparator2.stSenPart.xDirectSensor; + + // //Plausibel? + // IF #stInSeparator2.Settings.xPluggedPart AND ((#arInOutJamEntr2[1].bStatus.%X1 AND #xTrolleyWoPart2) OR + // (NOT #arInOutJamEntr2[1].bStatus.%X1 AND #xTrolleyWithPart2)) + // THEN + // #wErrorWord2.%X2 := TRUE; + // ELSE + // #wErrorWord2.%X2 := FALSE; + // END_IF; + // ELSE + // #xTrolleyWithPart2 := #xTrolleyWoPart2 := FALSE; // Beladekontrolle (Sensor) nicht verbaut + // END_IF; + // END_REGION + // END_REGION + + // REGION Dummy Handling + + // #nArrayMax1 := DINT_TO_INT(UPPER_BOUND(ARR := #arInOutJamEntr1, DIM := 1)); + // #nArrayMax2 := DINT_TO_INT(UPPER_BOUND(ARR := #arInOutJamEntr2, DIM := 1)); + + // REGION Dummy erstellen + // REGION Sep1 + // IF #stInSettings.xIsBorner1 THEN + // IF #nBarcodeEmpty1 > 1999 OR #nBarcodeEmpty1 < 1000 THEN + // #nBarcodeEmpty1 := 1000; + // ELSE + // IF #nState = 2500 AND #fbSeparator1.xOutTrolleyReleasedEdge THEN + // #nBarcodeEmpty1 += 1; + // END_IF; + // END_IF; + + // IF #fbSeparator1.stOutMainTro.xBtPresent AND + // #fbSeparator1.stOutMainTro.nStatus = "SepState_WaitForReq" AND + // #stInSeparator1.stSenInSep.tDirectChangeLast > #stInSettings.tDummyTimeBorner AND + // #arInOutJamEntr1[1] = #tmpCarrierEmpty + // THEN + // #arInOutJamEntr1[1].nBarcode := #nBarcodeEmpty1; + // #arInOutJamEntr1[1].bStatus.%X0 := TRUE; + // #arInOutJamEntr1[1].nDestination := #stInSettings.nBornerDest1; + // END_IF; + // ELSE + // IF #fbSeparator1.stOutMainTro.xBtPresent AND + // #fbSeparator1.stOutMainTro.nStatus = "SepState_WaitForReq" AND + // #stInSeparator1.stSenInSep.tDirectChangeLast > #stInSettings.tDummyTimeNormal AND //Unterscheidung bei Borner? + // #arInOutJamEntr1[1] = #tmpCarrierEmpty + // THEN + // #arInOutJamEntr1[1].nBarcode := #cCarrierDummy; + // #arInOutJamEntr1[1].bStatus.%X0 := TRUE; + // END_IF; + // END_IF; + // END_REGION + // REGION Sep2 + // IF #stInSettings.xIsBorner2 THEN + // IF #nBarcodeEmpty2 > 1999 OR #nBarcodeEmpty2 < 1000 THEN + // #nBarcodeEmpty2 := 1000; + // ELSE + // IF #nState = 2500 AND #fbSeparator2.xOutTrolleyReleasedEdge THEN + // #nBarcodeEmpty2 += 1; + // END_IF; + // END_IF; + + // IF #fbSeparator2.stOutMainTro.xBtPresent AND + // #fbSeparator2.stOutMainTro.nStatus = "SepState_WaitForReq" AND + // #stInSeparator2.stSenInSep.tDirectChangeLast > #stInSettings.tDummyTimeBorner AND + // #arInOutJamEntr2[1] = #tmpCarrierEmpty + // THEN + // #arInOutJamEntr2[1].nBarcode := #nBarcodeEmpty2; + // #arInOutJamEntr2[1].bStatus.%X0 := TRUE; + // #arInOutJamEntr2[1].nDestination := #stInSettings.nBornerDest2; + // END_IF; + // ELSE + // IF #fbSeparator2.stOutMainTro.xBtPresent AND + // #fbSeparator2.stOutMainTro.nStatus = "SepState_WaitForReq" AND + // #stInSeparator2.stSenInSep.tDirectChangeLast > #stInSettings.tDummyTimeNormal AND //Unterscheidung bei Borner? + // #arInOutJamEntr2[1] = #tmpCarrierEmpty + // THEN + // #arInOutJamEntr2[1].nBarcode := #cCarrierDummy; + // #arInOutJamEntr2[1].bStatus.%X0 := TRUE; + // END_IF; + // END_IF; + // END_REGION + + // END_REGION + + // REGION Dummy löschen + // REGION Sep1 + // IF #nArrayMax1 > 1 THEN //Staubereich mit Capacity > 0 + // IF (#arInOutJamEntr1[1] = #stCarrierDummy) //Dummy an erster Position + // AND #arInOutJamEntr1[2] = #tmpCarrierEmpty AND //Keine Daten an zweiter Position + // NOT #stInSeparator1.stSenInSep.xDirectSensor AND #stInSeparator1.stSenInSep.tDirectChangeLast > T#8s AND //keine Belegung + // #fbSeparator1.stOutMainTro.nStatus = "SepState_WaitForBt" AND #fbSeparator1.#fbStateManager.tOutTimeInStep > T#8s //Separator Zustand abfragen + // THEN + // #arInOutJamEntr1[1] := #tmpCarrierEmpty; //Dummy löschen + // ELSIF (#arInOutJamEntr1[1] = #stCarrierDummy) //Dasselbe wie oben aber mit nachrücken + // AND (#arInOutJamEntr1[2] = #stCarrierDummy OR #arInOutJamEntr1[2] <> #stCarrierDummy) AND + // NOT #stInSeparator1.stSenInSep.xDirectSensor AND #stInSeparator1.stSenInSep.tDirectChangeLast > T#8s AND + // #fbSeparator1.stOutMainTro.nStatus = "SepState_WaitForBt" AND #fbSeparator1.#fbStateManager.tOutTimeInStep > T#8s //Separator Zustand abfragen + // THEN + // #arInOutJamEntr1[1] := #tmpCarrierEmpty; + // "FC_TSHR_Shift"(xInShiftBack := TRUE, + // arTSHR := #arInOutJamEntr1); + // END_IF; + // ELSIF #nArrayMax1 = 1 THEN + // IF (#arInOutJamEntr1[1] = #stCarrierDummy) AND + // NOT #stInSeparator1.stSenInSep.xDirectSensor AND #stInSeparator1.stSenInSep.tDirectChangeLast > T#8s AND + // #fbSeparator1.stOutMainTro.nStatus = "SepState_WaitForBt" AND #fbSeparator1.#fbStateManager.tOutTimeInStep > T#8s //Separator Zustand abfragen + // THEN + // #arInOutJamEntr1[1] := #tmpCarrierEmpty; + // END_IF; + // END_IF; + // END_REGION + // REGION Sep2 + // IF #nArrayMax2 > 1 THEN //Staubereich mit Capacity > 0 + // IF (#arInOutJamEntr2[1] = #stCarrierDummy) //Dummy an erster Position + // AND #arInOutJamEntr2[2] = #tmpCarrierEmpty AND //Keine Daten an zweiter Position + // NOT #stInSeparator2.stSenInSep.xDirectSensor AND #stInSeparator2.stSenInSep.tDirectChangeLast > T#8s AND //keine Belegung + // #fbSeparator2.stOutMainTro.nStatus = "SepState_WaitForBt" AND #fbSeparator2.#fbStateManager.tOutTimeInStep > T#8s //Separator Zustand abfragen + // THEN + // #arInOutJamEntr2[1] := #tmpCarrierEmpty; //Dummy löschen + // ELSIF (#arInOutJamEntr2[1] = #stCarrierDummy) //Dasselbe wie oben aber mit nachrücken + // AND (#arInOutJamEntr2[2] = #stCarrierDummy OR #arInOutJamEntr2[2] <> #stCarrierDummy) AND + // NOT #stInSeparator2.stSenInSep.xDirectSensor AND #stInSeparator2.stSenInSep.tDirectChangeLast > T#8s AND + // #fbSeparator2.stOutMainTro.nStatus = "SepState_WaitForBt" AND #fbSeparator2.#fbStateManager.tOutTimeInStep > T#8s //Separator Zustand abfragen + // THEN + // #arInOutJamEntr2[1] := #tmpCarrierEmpty; + // "FC_TSHR_Shift"(xInShiftBack := TRUE, + // arTSHR := #arInOutJamEntr2); + // END_IF; + // ELSIF #nArrayMax2 = 1 THEN + // IF (#arInOutJamEntr2[1] = #stCarrierDummy) AND + // NOT #stInSeparator2.stSenInSep.xDirectSensor AND #stInSeparator2.stSenInSep.tDirectChangeLast > T#8s AND + // #fbSeparator2.stOutMainTro.nStatus = "SepState_WaitForBt" AND #fbSeparator2.#fbStateManager.tOutTimeInStep > T#8s //Separator Zustand abfragen + // THEN + // #arInOutJamEntr2[1] := #tmpCarrierEmpty; + // END_IF; + // END_IF; + // END_REGION + + // END_REGION + + // END_REGION + + // REGION Monitoring + + // REGION Carrier kommt nicht an / Daten ohne Belegung + // REGION Sep1 + // #tOnMonCarrArrive1(IN := #arInOutJamEntr1[1].bStatus.%X0 AND NOT #stInSeparator1.stSenInSep.xDirectSensor, + // PT := #stInSeparator1.Settings.tDelayToNextItem, + // Q => #wErrorWord1.%X10); //TODO + + // #fbMonitoringCarrNotArrive1.stSettings.nErrorType := 1; + // #fbMonitoringCarrNotArrive1.stSettings.xErrLedIfMachineIsOff := TRUE; + // #fbMonitoringCarrNotArrive1.stSettings.xSelfQuit := TRUE; + // #fbMonitoringCarrNotArrive1(wInTextListId_Function := 1000, + // sInPrefix := #stInOutHMI.UDT_Config.sName, + // wInTextListId_Message := 1000, + // sInSuffix := '', + // xInQuitError := #stInOutMachineState.xQuitError, + // xInSignal := NOT #wErrorWord1.%X10, + // sInAlarmMessage := 'Carrier kommt nicht am Separator 1 an', + // InOutMachineState := #stInOutMachineState); + // END_REGION + // REGION Sep2 + // #tOnMonCarrArrive2(IN := #arInOutJamEntr2[1].bStatus.%X0 AND NOT #stInSeparator2.stSenInSep.xDirectSensor, + // PT := #stInSeparator2.Settings.tDelayToNextItem, + // Q => #wErrorWord2.%X10); //TODO + + // #fbMonitoringCarrNotArrive2.stSettings.nErrorType := 1; + // #fbMonitoringCarrNotArrive2.stSettings.xErrLedIfMachineIsOff := TRUE; + // #fbMonitoringCarrNotArrive2.stSettings.xSelfQuit := TRUE; + // #fbMonitoringCarrNotArrive2(wInTextListId_Function := 1000, + // sInPrefix := #stInOutHMI.UDT_Config.sName, + // wInTextListId_Message := 1000, + // sInSuffix := '', + // xInQuitError := #stInOutMachineState.xQuitError, + // xInSignal := NOT #wErrorWord2.%X10, + // sInAlarmMessage := 'Carrier kommt nicht am Separator 2 an', + // InOutMachineState := #stInOutMachineState); + // END_REGION + + // END_REGION + + // REGION Carrier ohne Daten + + // REGION Sep1 + // IF #stInSeparator1.stSenInSep.xDbncdSensor AND #stInSeparator1.stSenInSep.tDirectChangeLast > T#5s AND NOT #arInOutJamEntr1[1].bStatus.%X0 THEN + // #wErrorWord1.%X5 := TRUE; + // ELSE + // #wErrorWord1.%X5 := FALSE; + // END_IF; + + // #fbMonitoringCarrWoData1.stSettings.nErrorType := 1; + // #fbMonitoringCarrWoData1.stSettings.xErrLedIfMachineIsOff := TRUE; + // #fbMonitoringCarrWoData1.stSettings.xSelfQuit := TRUE; + // #fbMonitoringCarrWoData1(wInTextListId_Function := 1000, + // sInPrefix := #stInOutHMI.UDT_Config.sName, + // wInTextListId_Message := 1001, + // sInSuffix := '', + // InOutMachineState := #stInOutMachineState, + // xInQuitError := #stInOutMachineState.xQuitError, + // xInSignal := NOT #wErrorWord1.%X5, + // sInAlarmMessage := 'Sep1-Belegung ohne Daten'); + // END_REGION + // REGION Sep2 + // IF #stInSeparator2.stSenInSep.xDbncdSensor AND #stInSeparator2.stSenInSep.tDirectChangeLast > T#5s AND NOT #arInOutJamEntr2[1].bStatus.%X0 THEN + // #wErrorWord2.%X5 := TRUE; + // ELSE + // #wErrorWord2.%X5 := FALSE; + // END_IF; + + // #fbMonitoringCarrWoData2.stSettings.nErrorType := 1; + // #fbMonitoringCarrWoData2.stSettings.xErrLedIfMachineIsOff := TRUE; + // #fbMonitoringCarrWoData2.stSettings.xSelfQuit := TRUE; + // #fbMonitoringCarrWoData2(wInTextListId_Function := 1000, + // sInPrefix := #stInOutHMI.UDT_Config.sName, + // wInTextListId_Message := 1001, + // sInSuffix := '', + // InOutMachineState := #stInOutMachineState, + // xInQuitError := #stInOutMachineState.xQuitError, + // xInSignal := NOT #wErrorWord2.%X5, + // sInAlarmMessage := 'Sep2-Belegung ohne Daten'); + // END_REGION + // END_REGION + + // END_REGION + + // REGION Timer - Überwachungszeit + + // #tOnSwitchDelay(IN := #xStartSwitchDelay, + // PT := T#5s); + + // #tOnSvReleaseSep1(IN := ((#nState = #c1500_StepReleaseSep1) OR (#nState = #c2500_StepReleaseSep2)) AND #xReleaseTrolleySep1, + // PT := T#3s); + + // #tOnSvReleaseSep2(IN := ((#nState = #c1500_StepReleaseSep1) OR (#nState = #c2500_StepReleaseSep2)) AND #xReleaseTrolleySep2, + // PT := T#3s); + + // END_REGION + + // REGION Haltegrund Schrittkette + + // #stActRequest.nReasonForStop := #tmpReasonForStop; //tmp aus Schrittkette übernehmen + + // END_REGION + + // REGION Motorüberwachung + + // IF (#nState >= #c1500_StepReleaseSep1) AND (#nState <= #c2500_StepReleaseSep2) AND #fbStateManager.tOutTimeInStep > T#4s AND NOT #xCarouselRun THEN + // #xErrorMotor := TRUE; + // ELSE + // #xErrorMotor := FALSE; + // END_IF; + + // END_REGION + + // REGION StateManager + + // #fbStateManager.stInSettings.nStartState := #c0100_StepUndefined; + // #fbStateManager.stInSettings.nStartStateTestMode := #c0000_StepOff; + // #fbStateManager.stInSettings.xActUnivTOn := TRUE; + // #fbStateManager.stInSettings.xRestartAtStartState := FALSE; + // #fbStateManager(xInFunctionEnabled := #stInOutMachineState.xRunning, + // xInReset := #stInOutHMI.UDT_Ctrl.xReset OR #xInCancel, + // xInRunUnivTOn := #tmpActUnivTon, + // xInTestMode := #xInTestMode, + // nInOutState := #nState); + // END_REGION + + // REGION Aufruf der Sub-TROs + + // REGION Separator 1 + // #fbSeparator1(xInReset := #stInOutHMI.UDT_Ctrl.xReset OR #xInCancel, + // xInErrQuit := #stInOutHMI.UDT_Ctrl.xErrorQuit, + // stInOutMainState := #stInOutMachineState, + // stInSettings := #stInSeparator1.Settings, + // xInConveyorRun := #xCarouselRun, + // stInTrolley := #stInSeparator1.stSenInSep, + // xInReceiveReady := #xReleaseTrolleySep1, + // stInOutHMI := #stInOutHMI.UDT_Separator1, + // stInOutCarrDataInJam := #arInOutJamEntr1); + + // #stInOutHMI.UDT_Separator1.stStatus.xNullBt := #stInOutHMI.UDT_Ctrl.xPause; + // #stInOutHMI.UDT_Separator2.stStatus.xNullBt := #stInOutHMI.UDT_Ctrl.xPause; + // END_REGION + + // REGION Separator 2 + // #fbSeparator2(xInReset := #stInOutHMI.UDT_Ctrl.xReset OR #xInCancel, + // xInErrQuit := #stInOutHMI.UDT_Ctrl.xErrorQuit, + // stInOutMainState := #stInOutMachineState, + // stInSettings := #stInSeparator2.Settings, + // xInConveyorRun := #xCarouselRun, + // stInTrolley := #stInSeparator2.stSenInSep, + // xInReceiveReady := #xReleaseTrolleySep2, + // stInOutHMI := #stInOutHMI.UDT_Separator2, + // stInOutCarrDataInJam := #arInOutJamEntr2); + + // #stInOutHMI.UDT_Separator1.stStatus.xNullBt := #stInOutHMI.UDT_Ctrl.xPause; + // #stInOutHMI.UDT_Separator2.stStatus.xNullBt := #stInOutHMI.UDT_Ctrl.xPause; + // END_REGION + + // REGION Switch 1 + // #fbSwitch1(stInSettings := #stInSwitch1.Settings, + // stInSenExit3 := #stInSwitch1.stSenExit3, + // stInSenExit4 := #stInSwitch1.stSenExit4, + // nInMainTroNo := #nInMainTroNo, + // nInSetSwitch := #nSetSwitch1, + // nInSwitchNo := 0, + // xInErrorQuit := "cTodoFalse", + // xInSftyOk := #xInSftyOk, + // xInAllRdyToStart := #xInAllRdyToStart, + // xInCarouselRun := #xCarouselRun, + // xInCancel := #stInOutHMI.UDT_Ctrl.xReset OR #xInCancel, + // xInReqFinished := #tmpReqFinished, + // xOutSwEntrTo1 => #xOutSw1EntrTo1, + // xOutSwEntrTo2 => #xOutSw1EntrTo2, + // xOutSwExTo3 => #xOutSw1ExTo3, + // xOutSwExTo4 => #xOutSw1ExTo4, + // stInOutMachineState := #stInOutMachineState, + // stInOutHMI := #stInOutHMI.UDT_Switch1); + // END_REGION ; + + // REGION Barcode Reader 1 + // #fbBarcodeReader1(stInSettings := #stInBarcodeReader1.Settings, + // xInHWError := false, // todo + // xInStartReading := #xStartScan, + // xInHandshakeDone := #xHandshakeScan, + // stInOutInterface := #stInOutCognexInterface1, + // stInOutControlUnitCabinet := #stInOutMachineState, + // stInOutHMI := #stInOutHMI.UDT_BarcodeReader1); + // END_REGION + + // REGION Barcode Reader 2 + // #fbBarcodeReader2(stInSettings := #stInBarcodeReader2.Settings, + // xInHWError := false, // todo + // xInStartReading := #xStartScan, + // xInHandshakeDone := #xHandshakeScan, + // stInOutInterface := #stInOutCognexInterface2, + // stInOutControlUnitCabinet := #stInOutMachineState, + // stInOutHMI := #stInOutHMI.UDT_BarcodeReader2); + // END_REGION + // END_REGION + + // REGION BT und NBT zählen + + // #stActRequest.nActNoInSwitch := #fbSwitch1.stOutMainTro.nFifoElementCount; + + // END_REGION + + // REGION Long-Signale von Switch verarbeiten + + // (* //Switch gibt LongSignal aus und hier wird es für MainTRO gemerkt + // IF (#stActRequest.nDirection = 1 AND #fbSwitch1.stOutMainTro.xSen3Long) OR + // (#stActRequest.nDirection = 2 AND #fbSwitch1.stOutMainTro.xSen4Long) THEN + // #stActRequest.xLongSignal := TRUE; + // ELSIF #fbSwitch1.stOutMainTro.xFifoEmpty THEN + // #stActRequest.xLongSignal := FALSE; + // END_IF; + // + // #tOnLongSignal(IN := #stActRequest.xLongSignal, //Extra Timer für Long-Signal um nach dieser Zeit einen einzelnen BT der noch im Switch ist zu quittieren + // PT := #stInSwitch1.Settings.tSenWaitAfterLong); //"TimeLongSignalQuitMax" + // + // #fbSwitch1.xInDeqExternal := //Dequeue wird hier an Switch weitergegeben falls (nachdem Sep gesperrt wurde) nur noch ein einzelenr BT vermisst wird nach LongSignal + // NOT #fbSwitch1.xOutBtLeftSwitchWrongDir AND + // ((#nSetSwitch1 = 1 OR #nSetSwitch1 = 2 OR #nSetSwitch1 = 3 OR #nSetSwitch1 = 4) AND #stActRequest.xLongSignal AND #tOnLongSignal.Q AND #stActRequest.nActNoInSwitch = 1); + // + // + // IF #stActRequest.xLongSignal AND #tOnLongSignal.Q AND #stActRequest.nActNoInSwitch > 1 THEN //Falls nach LongSignal mehrere BT vermisst werden, werden die entsprechenden FIFO-Indizes an MFR als Missing ausgegeben + // #nIndex := 1; + // WHILE #nIndex <= 6 DO + // IF #fbSwitch1.arOutFifo[#nIndex] > 0 AND #fbSwitch1.arOutFifo[#nIndex] <= 6 THEN + // #arReq[#nIndex].xMissingBT := TRUE; + // ELSIF #fbSwitch1.arOutFifo[#nIndex] = 0 THEN + // #arReq[#nIndex].xMissingBT := FALSE; + // END_IF; + // #nIndex += 1; + // END_WHILE; + // ELSE //Wenn FIFO leer z.B. wegen Cancel, dann verschwinden hier die Missing Bits + // #arReq[1].xMissingBT := FALSE; + // #arReq[2].xMissingBT := FALSE; + // #arReq[3].xMissingBT := FALSE; + // #arReq[4].xMissingBT := FALSE; + // #arReq[5].xMissingBT := FALSE; + // #arReq[6].xMissingBT := FALSE; + // END_IF; *) + + // END_REGION + + // REGION WrongDirection Handling + + // (* IF #fbSwitch1.xOutBtLeftSwitchWrongDir THEN + // #xWrongDirDetect := TRUE; + // ELSIF #fbSwitch1.stOutMainTro.xFifoEmpty OR #stActRequest.xCancelled THEN + // #xWrongDirDetect := FALSE; + // END_IF; + // + // IF #xWrongDirDetect THEN + // #nIndex := 1; + // WHILE #nIndex <= 6 DO + // IF #fbSwitch1.arOutFifo[#nIndex] > 0 AND #fbSwitch1.arOutFifo[#nIndex] <= 6 THEN + // #arReq[#fbSwitch1.arOutFifo[#nIndex]].xWrongDirection := TRUE; + // ELSE + // #nIndex += 1; + // END_IF; + // #nIndex += 1; + // END_WHILE; + // ELSE + // #arReq[1].xWrongDirection := FALSE; + // #arReq[2].xWrongDirection := FALSE; + // #arReq[3].xWrongDirection := FALSE; + // #arReq[4].xWrongDirection := FALSE; + // #arReq[5].xWrongDirection := FALSE; + // #arReq[6].xWrongDirection := FALSE; + // END_IF; *) + + // END_REGION + + // REGION HMI + // #stInOutHMI.UDT_Config.nTroType := 4; //1Sep + + // #stInOutHMI.UDT_State.nState := #nState; + // #stInOutHMI.UDT_State.sState := #sStateText; + + // #stInOutHMI.UDT_State.xError := // Error TRO -> + // #fbSeparator1.wOutErrorWord > 0 OR // Error Separator + // #stInOutHMI.UDT_Separator1.stStatus.bStatus = 2 OR //Error Separator + // #wErrorWord1.%X5 OR //Belegung ohne Daten + // #wErrorWord1.%X10 OR // Carrier kommt nicht an + // #stInOutHMI.UDT_BarcodeReader1.bStatus = 2 OR //Error Reader + + // #fbSeparator2.wOutErrorWord > 0 OR // Error Separator + // #stInOutHMI.UDT_Separator2.stStatus.bStatus = 2 OR //Error Separator + // #wErrorWord2.%X5 OR //Belegung ohne Daten + // #wErrorWord2.%X10 OR // Carrier kommt nicht an + // #stInOutHMI.UDT_BarcodeReader2.bStatus = 2; //Error Reader + // //Switch... + // END_REGION + + // REGION Ausgänge schreiben + + // REGION Output + // #xOutCorrection := #xTmpCorrection; + // #xOutBookedDir1 := #xBookedDir1; + // #xOutBookedDir2 := #xBookedDir2; + // #xOutBookedDir3 := #xBookedDir3; + // #xOutBookedDir4 := #xBookedDir4; + // #stOutLastCarrier := #stTempCarrier; + + // #xOutStopper1 := #fbSeparator1.xOutStopper; + // #xOutStopper2 := #fbSeparator2.xOutStopper; + // #xOutSw1EntrTo1 := #fbSwitch1.xOutSwEntrTo1; + // #xOutSw1EntrTo2 := #fbSwitch1.xOutSwEntrTo2; + // #xOutSw1ExTo3 := #fbSwitch1.xOutSwExTo3; + // #xOutSw1ExTo4 := #fbSwitch1.#xOutSwExTo4; + // #xOutJamAtEntry1 := #fbSeparator1.stOutMainTro.xJamAtEntry; + // #xOutJamAtEntry2 := #fbSeparator2.stOutMainTro.xJamAtEntry; + // #xOutCarouselReq1 := (#nState >= #c1500_StepReleaseSep1) AND (#nState <= #c2500_StepReleaseSep2) AND NOT #stInOutHMI.UDT_Ctrl.xPause AND NOT #xInAreaStopActive; + // #xOutCarouselReq2 := #xOutCarouselReq1 AND + // ((#stInSettings.xCar2NecLeft AND (#stActRequest.nDirection = 1 OR #stActRequest.nDirection = 3)) OR + // (#stInSettings.xCar2NecRight AND (#stActRequest.nDirection = 2 OR #stActRequest.nDirection = 4))); + // END_REGION + + // END_REGION + + // REGION Letzten Schritt wegschreiben + // #nOutStateLast := #fbStateManager.nStateLast; + // END_REGION + + // REGION Priority Manager + // #stOutPriorityManagerDir1.nTroId := #nInMainTroNo; + // #stOutPriorityManagerDir1.stJamExit := #stInOutJamExit2; + // // #stOutPriorityManagerDir1.stJamEntry := ; todo + // #stOutPriorityManagerDir1.stSensor := #stInSeparator1.stSenInSep; + // #stOutPriorityManagerDir1.xMovement := #xInCarouselRun1 AND #xInCarouselRun2; + // //#stOutPriorityManagerDir1.xTrolleyPresent := ; // todo für mengengesteuert + + // #stOutPriorityManagerDir2.nTroId := #nInMainTroNo; + // #stOutPriorityManagerDir2.stJamExit := #stInOutJamExit3; + // // #stOutPriorityManagerDir2.stJamEntry := ; todo + // #stOutPriorityManagerDir2.stSensor := #stInSeparator1.stSenInSep; + // #stOutPriorityManagerDir2.xMovement := #xInCarouselRun1 AND #xInCarouselRun2; + // //#stOutPriorityManagerDir2.xTrolleyPresent := ; // todo für mengengesteuert + + // #stOutPriorityManagerDir3.nTroId := #nInMainTroNo; + // #stOutPriorityManagerDir3.stJamExit := #stInOutJamExit2; + // // #stOutPriorityManagerDir3.stJamEntry := ; todo + // #stOutPriorityManagerDir3.stSensor := #stInSeparator2.stSenInSep; + // #stOutPriorityManagerDir3.xMovement := #xInCarouselRun1 AND #xInCarouselRun2; + // //#stOutPriorityManagerDir3.xTrolleyPresent := ; // todo für mengengesteuert + + // #stOutPriorityManagerDir4.nTroId := #nInMainTroNo; + // #stOutPriorityManagerDir4.stJamExit := #stInOutJamExit3; + // // #stOutPriorityManagerDir4.stJamEntry := ; todo + // #stOutPriorityManagerDir4.stSensor := #stInSeparator2.stSenInSep; + // #stOutPriorityManagerDir4.xMovement := #xInCarouselRun1 AND #xInCarouselRun2; + // //#stOutPriorityManagerDir4.xTrolleyPresent := ; // todo für mengengesteuert + + // IF #stInSettings.xPrioDir1 THEN + // #stOutPriorityManagerDir1.xTransportReq := (#stActRequest.nDirection = 1) AND #nState = #c2500_StepReleaseSep2; + // END_IF; + + // IF #stInSettings.xPrioDir2 THEN + // #stOutPriorityManagerDir2.xTransportReq := (#stActRequest.nDirection = 2) AND #nState = #c2500_StepReleaseSep2; + // END_IF; + + // IF #stInSettings.xPrioDir3 THEN + // #stOutPriorityManagerDir3.xTransportReq := (#stActRequest.nDirection = 3) AND #nState = #c2500_StepReleaseSep2; + // END_IF; + + // IF #stInSettings.xPrioDir4 THEN + // #stOutPriorityManagerDir4.xTransportReq := (#stActRequest.nDirection = 4) AND #nState = #c2500_StepReleaseSep2; + // END_IF; + // END_REGION +END_FUNCTION_BLOCK + diff --git a/doc/TRO_Katalog/scl_templates/FB_ILS_MTRO_PinStore_Auto.scl b/doc/TRO_Katalog/scl_templates/FB_ILS_MTRO_PinStore_Auto.scl new file mode 100644 index 0000000..b55501b --- /dev/null +++ b/doc/TRO_Katalog/scl_templates/FB_ILS_MTRO_PinStore_Auto.scl @@ -0,0 +1,138 @@ +// TEMPLATE: Instanziierungs-/Aufruf-Code für FB_ILS_MTRO_PinStore_Auto +// ------------------------------------------------------------------------------------------ +// HINWEIS: FB_ILS_MTRO_PinStore_Auto ist ausschliesslich als .liblink vorhanden +// (UH02: ...\ILSLib\FB\MTRO\FB_ILS_MTRO_PinStore_Auto.liblink, ebenso UH03), +// der FB-Quellcode liegt NICHT im Git-Repo. Dieses Template zeigt den realen AUFRUF, +// extrahiert aus: +// =A01+UH02-KF00\Programmbausteine\100_Main\FB_Main.scl (REGION "BLOCK 1.1.1 (TRO 208)") +// Automatisches Pin-Lager (19 Speicherlinien "arInSep[1..19]" je Block). Zur Übersicht +// sind hier nur Sep Store 1-3 als repräsentatives Muster ausgeschrieben; Store 4-19 und +// arInJamSensor[4..19] folgen demselben Schema (siehe Original für alle 19 Zeilen). +// ------------------------------------------------------------------------------------------ + +REGION BLOCK 1.1.1 (TRO 208) + REGION Encoder Settings + #TRO208.stInEncoderParameter.nPosActDif := #fbEncoderGF2200.nOutPosActDif; + #TRO208.stInEncoderParameter.nPosPitchPart := #fbEncoderGF2200.nOutPosPitchPart; + END_REGION + + REGION ConveyorStation Settings + #TRO208.stInSettings.nDestGeneral := "cDest11100"; + #TRO208.stInSettings.nConvStations := "cHooksSorterMaxPin111"; + #TRO208.stInSettings.nStationsMax := "cStationsMax111"; + #TRO208.stInSettings.nStorageThreshold := "cNoPositionsBlock1"; + #TRO208.stInSettings.nNoOfLines := 19; + END_REGION + + REGION Pin Query / "Zappler" + #TRO208.stInSensorReference := "DB_Inputs".Sensors["cInBG3001"]; + END_REGION + + REGION Barcode Reader In (BX2104) + #TRO208.stInBarcodeReader.Settings.nStation := 111; + #TRO208.stInBarcodeReader.Settings.nScannerPurpose := 0; + #TRO208.stInBarcodeReader.Settings.tTimeout := T#5s; + #TRO208.stInBarcodeReader.Settings.xActivateCheckASCI := TRUE; + + #arCognexInterface["cScannerBX2104"].xInCamTriggerReady := "bx2104-TriggerReady"; + #arCognexInterface["cScannerBX2104"].xInCamTriggerAck := "bx2104-TriggerAck"; + #arCognexInterface["cScannerBX2104"].xInCamResultsAvailable := "bx2104-Results Available"; + #arCognexInterface["cScannerBX2104"].xInCamGeneralFault := "bx2104-General Fault"; + #arCognexInterface["cScannerBX2104"].hwInCamInspectionResults := "=A01+UH02-BX2104~Ergebnisse_–_64_Bytes_1"; + END_REGION + + REGION Separator Settings + REGION Sep Pin + #TRO208.stInSeparatorPin.stSenTrolley := "DB_Inputs".Sensors["cInBG3000"]; + #TRO208.stInSeparatorPin.stSettings.tHandlingTime := T#0ms; + #TRO208.stInSeparatorPin.stSettings.tTrailingTime := T#50ms; + #TRO208.stInSeparatorPin.stSettings.xPluggedScanner := TRUE; + END_REGION + + REGION Sep Store 1 + #nActNo := 1; + #TRO208.arInSep[#nActNo].stSettings.nJamLength := 4; + #TRO208.arInSep[#nActNo].stSenTrolley := "DB_Inputs".Sensors["cInBG3270"]; + #TRO208.arInSep[#nActNo].stSettings.tHandlingTime := "cTimeSepHandlingStorageLine"; + #TRO208.arInSep[#nActNo].stSettings.tTrailingTime := "cTimeSepTrailingStorageLine"; + #TRO208.arInSep[#nActNo].stSettings.xPluggedScanner := FALSE; + END_REGION + + REGION Sep Store 2 + #nActNo := 2; + #TRO208.arInSep[#nActNo].stSettings.nJamLength := "cStorage111ExitJam2"; + #TRO208.arInSep[#nActNo].stSenTrolley := "DB_Inputs".Sensors["cInBG3271"]; + #TRO208.arInSep[#nActNo].stSettings.tHandlingTime := "cTimeSepHandlingStorageLine"; + #TRO208.arInSep[#nActNo].stSettings.tTrailingTime := "cTimeSepTrailingStorageLine"; + #TRO208.arInSep[#nActNo].stSettings.xPluggedScanner := FALSE; + END_REGION + + REGION Sep Store 3 + #nActNo := 3; + #TRO208.arInSep[#nActNo].stSettings.nJamLength := "cStorage111ExitJam3"; + #TRO208.arInSep[#nActNo].stSenTrolley := "DB_Inputs".Sensors["cInBG3272"]; + #TRO208.arInSep[#nActNo].stSettings.tHandlingTime := "cTimeSepHandlingStorageLine"; + #TRO208.arInSep[#nActNo].stSettings.tTrailingTime := "cTimeSepTrailingStorageLine"; + #TRO208.arInSep[#nActNo].stSettings.xPluggedScanner := FALSE; + END_REGION + + // ... REGION "Sep Store 4" bis "Sep Store 19" folgen demselben Schema + // (nActNo hochzählend, stSenTrolley auf fortlaufende BG-Sensoradressen, + // arInSep[7..19] zusätzlich mit stSettings.stSimu.* für Simulationsmodus) + END_REGION + + REGION UnloadingStations Settings + #TRO208.xInQuitLocal := "SF0121" OR "SF0117"; + + #TRO208.arInJamSensor[1] := "DB_Inputs".Sensors["cInBG3030"]; + #TRO208.arInJamSensor[2] := "DB_Inputs".Sensors["cInBG3031"]; + #TRO208.arInJamSensor[3] := "DB_Inputs".Sensors["cInBG3032"]; + // ... arInJamSensor[4] bis arInJamSensor[19] folgen fortlaufenden BG-Sensoradressen + END_REGION + + REGION Aufruf: TRO208 + #TRO208.stInPriorityManager.xReleaseOk := TRUE; + + #TRO208(xInSftyOk := "DB_InterfaceSafety".stFromSafety.EStopMainOF2.Q, + nInTestTarget := "IBN".nTestTarget111, + xInAllRdyToStart := TRUE, + xInCancel := "cTodoFalse", + xInRelease := "DB_TRO_Test".TRO208, + xInConveyorRunIn := #fbSortConv1101.xOutConveyorFullSpeed, + xInConveyorRunOut := #fbExitConv1103.xOutConveyorFullSpeed, + stInOutControlUnitCabinet := #stInOutControlUnitCabinetOF2, + arInOutStorageLines := "DB_Storage1.1.1".arLine, + arInOutJamEntr := "DB_JamArea1101".stJam1101_2.arCarrier, + stInOutJamEntr := "DB_JamArea1101".stJam1101_2.stData, + arInOutJamExit := "DB_JamArea1103".stJam1103_1.arCarrier, + stInOutJamExit := "DB_JamArea1103".stJam1103_1.stData, + arInOutJamBypass := #arCarrierPlaceHolder, + stInOutJamBypass := #stJamDataPlaceHolder, + stInOutHMI := "DB_Interface_HMI".stTRO.TRO208, + stMFRStorageRemovalInterface := "DB_HandshakeStorage".Str_StorageRemoval.arrudt_StorageRemovalHandshakeTROsLvl1[1], + xOutSeparatorPin => "MB3000", + stCognexInterfacePin := #arCognexInterface["cScannerBX2104"], + stConveyorStations:= "DB_ConveyorStations".stConveyorStations111); + END_REGION + + REGION CARR_GLOB_CORRECTION + "FC_CARR_GLOB_CORRECTION"(xInStart := #TRO208.xOutCorrection, + nInBarcodeScan := #TRO208.nBarcodeResult, + nInStation := 1, + arOutEventLogInfo => #arDummyEventCorrectionInfo, + InOutCarrierExpect := "DB_JamArea1101".stJam1101_2.arCarrier[1]); + END_REGION + + REGION Barcode Reader Out (BX2104) + "bx2104-TriggerEnable" := #arCognexInterface["cScannerBX2104"].xOutCamTriggerEnable; + "bx2104-Trigger" := #arCognexInterface["cScannerBX2104"].xOutCamTrigger; + "bx2104-ResultsAck" := #arCognexInterface["cScannerBX2104"].xOutCamResultsAck; + END_REGION + + REGION Separator Store Out + "MB3270" := #TRO208.arOutSeparatorStore[1]; + // ... weitere arOutSeparatorStore[n] -> MBxxxx analog für Store 2-19 + END_REGION + // stMFRStorageRemovalInterface koppelt an FB_StockRemovalBLKModul / FB_StorageManagement + // (siehe SCL_Analyse_Standardisierung.md, Abschnitt "Sonderanalyse: StockRemoval") +END_REGION diff --git a/doc/TRO_Katalog/scl_templates/FB_ILS_MTRO_Vario.scl b/doc/TRO_Katalog/scl_templates/FB_ILS_MTRO_Vario.scl new file mode 100644 index 0000000..312ffce --- /dev/null +++ b/doc/TRO_Katalog/scl_templates/FB_ILS_MTRO_Vario.scl @@ -0,0 +1,66 @@ +// TEMPLATE: Instanziierungs-/Aufruf-Code für FB_ILS_MTRO_Vario +// ------------------------------------------------------------------------------------------ +// HINWEIS: FB_ILS_MTRO_Vario ist ausschliesslich als .liblink (externe ILSLib-Bibliothek) +// im Repository vorhanden, der FB-Quellcode selbst liegt NICHT im Git-Repo. +// Dieses Template zeigt den realen AUFRUF, extrahiert aus: +// =A01+UH01-KF00\Programmbausteine\100_Main\FB_Main.scl (REGION "TRO 115 (Vario)") +// Derselbe FB-Typ wird in UH03 auch für F2H-Streckenabschnitte wiederverwendet +// (z.B. TRO308, TRO383 - Kommentar "Vario von F2H" in FB_Main UH03), ohne eigene Variante. +// ------------------------------------------------------------------------------------------ + +REGION TRO 115 (Vario) + #TRO115.stInSeparator1.Settings.nSeparatorNo := "cSep115.1"; + #TRO115.stInSeparator1.Settings.tDelayToNextItem := "TimeForSepWaiting_Short"; + #TRO115.stInSeparator1.Settings.tTrailingTime := t#800ms; + #TRO115.stInSeparator1.Settings.tHandlingTime := t#300ms; + #TRO115.stInSeparator1.Settings.tJam := "TimeForSepJam"; + #TRO115.stInSeparator1.Settings.xPluggedJam := FALSE; + #TRO115.stInSeparator1.Settings.xPluggedPart := FALSE; + #TRO115.stInSeparator1.Settings.xPluggedScanner := FALSE; + #TRO115.stInSeparator1.stSenInSep := "DB_Inputs".Sensors["cInBG3025"]; + + #TRO115.stInSeparator1.Settings.tSenFree := t#2000ms; + #TRO115.stInSeparator1.Settings.tSenWait := T#5000ms; + + #TRO115.stInVario.Settings.xContinousEmptying := FALSE; + #TRO115.stInVario.Settings.tWaitForJog := T#300ms; + #TRO115.stInVario.Settings.tConvEmpty := T#45000ms; + #TRO115.stInVario.Settings.nCountCarrier := 1; + #TRO115.stInVario.Settings.tWaitForStop := t#3s; + + #TRO115.stInVario.Settings.tCarrierInPosDelay := t#1200ms; + #TRO115.stInVario.Settings.tCarrierInPosEdgeDelay := t#100ms; + + #TRO115.stInVario.Settings.tRasterHigh := t#5s; + #TRO115.stInVario.Settings.tRasterLow := t#5s; + + #TRO115.stInVario.stSenCarrInPos := "DB_Inputs".Sensors["cInBG3026"]; // MT in Pos + #TRO115.stInVario.stSenFinger := "DB_Inputs".Sensors["cInBG3027"]; // Pusher Dog in Pos + #TRO115.stInVario.stSenLastPos := "DB_Inputs".Sensors["cInBG3000"]; // Conveyor full + #TRO115.stInVario.stSenJam := "DB_Inputs".Sensors["cInBG3001"]; // Jam detector + + #TRO115.stInPriorityManager.xReleaseOk := TRUE; //braucht keine Vorfahrtsregelung + #TRO115.stInVario.Settings.xJamSenDelayActive := TRUE; + #TRO115.stInVario.Settings.tJamSenDelay := T#2s; + + #TRO115.stInSettings.xIsBorner := TRUE; + + #TRO115(nInMainTroNo := "cMainTro115", + xInSftyOk := "DB_InterfaceSafety".stFromSafety.EStopMainOF1.Q, + xInMotorProtection := "FC0145", + xInAllRdyToStart := TRUE, + xInReset := "cTodoFalse", + xInErrorQuit := "SF0002", + xInAutomatic := #t_Automatik_OF1 AND "SF0120", + xInRelease := "DB_TRO_TEST".TRO115, + arInOutJamEntr := "DB_JamArea4104".stJam4104_1.arCarrier, + stInOutJamEntr := "DB_JamArea4104".stJam4104_1.stData, + arInOutJamFinger := "DB_JamArea4103".stJam4103_1.arCarrier, + stInOutJamFinger := "DB_JamArea4103".stJam4103_1.stData, + stInOutMachineState := #stInOutControlUnitCabinetOF1, + stInOutCognexInterface := #stCognexInterfaceDummy, + stInOutHMI := "DB_Interface_HMI".stTRO.TRO115, + nOutStateLast => "DB_GLOB_TroState".arTroState["cMainTro115"], + xOutStopper => "MB3025", + xOutVarioMotor => "MA0145"); +END_REGION diff --git a/doc/TRO_Katalog/scl_templates/FB_ILS_MTRO_Vario_workStation.scl b/doc/TRO_Katalog/scl_templates/FB_ILS_MTRO_Vario_workStation.scl new file mode 100644 index 0000000..bba1314 --- /dev/null +++ b/doc/TRO_Katalog/scl_templates/FB_ILS_MTRO_Vario_workStation.scl @@ -0,0 +1,1301 @@ +FUNCTION_BLOCK "FB_ILS_MTRO_Vario_workStation" +{ S7_Optimized_Access := 'TRUE' } +VERSION : 0.1 + VAR_INPUT + stInSettings : Struct // Einstellungen MTRO + nTroStopper1 : Int; + xIsBorner : Bool; // Bei diesem TRO werden immer neue Carrier angelegt (z.B. erster TRO bei Einfahrt in Gesamtanlage) + sJamSrc : String[16]; + sJamDest : String[16]; + bSepType : Byte := 16#0; // X0: TRUE - erstes Bein halten, X1: TRUE- Beladekontrolle, X2: TRUE - Beladeerfassung + tPartSenHigh : Time := T#500ms; + tInSenHigh : Time := T#500ms; + nBornerDest : Int; // Standard Destination festlegen für Borner (variabel) + tDummyTimeNormal : Time := T#3s; // Zeit für Dummy anlegen (Dummy = 1) + tDummyTimeBorner : Time := T#0ms; // Zeit für Dummy anlegen (Dummy = 1000-2000) schneller... + END_STRUCT; + stInVario : Struct // Schnittstelle Vario + stSenFinger : "UDT_Sensor"; + stSenNextSep : "UDT_Sensor"; + stSenJam : "UDT_Sensor"; + stSenLastPos : "UDT_Sensor"; + stSenSepVario : "UDT_Sensor"; + stSenCarrInPos : "UDT_Sensor"; + Settings : "SettingsVario"; + SettingsVarioFingerMonitoring : "UDT_SettingsVarioFingerMonitoring"; + END_STRUCT; + stInSeparator1 : Struct // Schnittstelle Separator (vor Vario Förderer) + stSenInSep : "UDT_Sensor"; // Sensor in Stopper + stSenSepLeft : "UDT_Sensor"; // Sensor nach Stopper + stSenPart : "UDT_Sensor"; // Checkt, ob der Bügelträger beladen ist + stSenStartScan : "UDT_Sensor"; // Sensor nach Stopper wenn Scanner vorhanden. Vermutlich startet dieser Sensor den Scanner + Settings : "SettingsSeparator"; + END_STRUCT; + stInBarcodeReader : Struct // Schnittstelle Barcode-Leser + Settings : "UDT_SettingsBarcodeReader"; + END_STRUCT; + stInPriorityManager : "UDT_Response"; // Schnittstelle Prioritätenmanager (z.B. bei Kreuzungen) + nInMainTroNo : UInt; // TRO Nummer + xInRelease : Bool; + xInSftyOk : Bool; // Safety + xInMotorProtection : Bool; // Motorschutz Vario + xInAllRdyToStart : Bool; // Alles bereit + xInJamAtExit2 : Bool; // Stau am Ausgang + xInTestMode : Bool; // Testmodus + xInReset : Bool; // Baustein Reset + xInErrorQuit : Bool; + xInAutomatic : Bool; + stInStationSensor : "UDT_Sensor"; + xInReleaseStation : Bool; + END_VAR + + VAR_OUTPUT + stOutPriorityManager : "UDT_Request"; // Schnittstelle Prioritätenmanager (z.B. bei Kreuzungen) + xOutStopper : Bool; // Separator Stopper + xOutVarioMotor : Bool; // Vario Motor + xOutJamAtEntry1 : Bool; // Stau Eingang + xOutCarouselReq : Bool; // Motor anfordern (Prüfen) + xOutCorrection : Bool; + nOutStateLast : Int; + nOutScanResult : DInt; + xOutNewScan : Bool; + xOutBooked : Bool; + stOutLastCarrier : "stCarrier"; + END_VAR + + VAR_IN_OUT + arInOutJamEntr : Array[*] of "stCarrier"; // Daten Staubereich Eingang 1 + stInOutJamEntr : "stJamData"; + arInOutJamFinger : Array[*] of "stCarrier"; // Daten Staubereich Finger + stInOutJamFinger : "stJamData"; + stInOutMachineState : "UDT_MainState"; // Maschinenzustand (Allgemien) + stInOutCognexInterface : "stCognexInterface"; // Cognex Barcode Reader Interface + stInOutHMI : "UDT_HMI_TRO"; // HMI TRO + END_VAR + + VAR + fbBarcodeReader : "FB_BarcodeReaderCognex"; + fbStateManager { S7_SetPoint := 'False'} : "FB_StateManager"; + fbSeparator1 { S7_SetPoint := 'False'} : "FB_ILS_STRO_Sep"; + fbConvVario : "FB_ILS_STRO_Vario_WorkStation"; + fbSepWait : "FB_CarrAccumulate1Sep"; + END_VAR + VAR RETAIN + stActRequest : Struct + xNBT : Bool; // Es handelt sich um einen Nullbügelträger + xCancelled : Bool; // Abbruchanforderung durch MFR + nActArrIndex : USInt; + nActReqIndex : USInt; // 0 = nichts zu tun | 1-200: Aktuell bearbeiteter Index + nDirection : USInt; // 0: Es bleibt hier alles so wie es ist! | 1: E1->A2 + nRequestedNoBT : USInt; // Anzahl Trolleys die ausgefahren werden sollen + nReasonForStop : USInt; // 0: Nichts | 5: Alle BT ausgefahren | 10: Fehler in SubTro | 15: Kein BT/NBT am Eingang | 20: Stau im nächsten MTRO | 25: NBT | 30: Falsch gefahren | 35: Initial-BT kam nicht am Ziel an | 40: Allgemeiner Fehler | 45: Abbruch durch MFR | 50: Fehler in Anfrage von MRF | 55: MFR hat TRO pausiert + nActNoStopper : USInt; // Anzahl der Stopper-öffnungen in diesem Auftrag + nCntAtStartSep1 : UDInt; // Absoluter Zähler an Separator 1 bei Start des Auftrages + nCntAtStartExit2 : UDInt; // Absoluter Zähler an Exit 2 bei Start des Auftrages + END_STRUCT; + END_VAR + VAR + sStateText : String["cStateText"]; // Aktueller State der Schrittkette (textuell) + END_VAR + VAR RETAIN + nState : Int; + END_VAR + VAR + nLastReqIndex : USInt; + tOfLastPos {InstructionName := 'TOF_TIME'; LibVersion := '1.0'} : TOF_TIME; // Flanke des letzten Trolleys verarbeiten + tOnSvReleaseSep {InstructionName := 'TON_TIME'; LibVersion := '1.0'; S7_SetPoint := 'False'} : TON_TIME; // Supervision - Freigabe Separator + END_VAR + VAR RETAIN + xReleaseTrolleySep1 : Bool; // Öffne-Befehl + xLastPosReached : Bool; + xErrorMotor : Bool; // Fehler weil Motor-Run fehlt + xMTRORdy : Bool; + END_VAR + VAR + xStartScan { S7_SetPoint := 'True'} : Bool; + xHandshakeScan : Bool; + nBarcodeResult : DInt; + xTrolleyWithPart : Bool; + xTrolleyWoPart : Bool; + xVarioReq : Bool; + xReadSecondLeg : Bool; + wErrorWord : Word; + stCarrierDummy { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'; S7_SetPoint := 'False'} : "stCarrier" := (1, (), 16#01); + nArrayMax : Int; + fbMonitoringCarrNotArrive : "FB_Monitoring"; + fbMonitoringCarrWoData : "FB_Monitoring"; + tOnMonCarrArrive {InstructionName := 'TON_TIME'; LibVersion := '1.0'} : TON_TIME; // Überwachungszeit zwischen Carrier Online & Separator Sensor Belegung + fbEventLog_Route : "FB_EventLog_Booking"; + xCodeEven : Bool; + nBarcodeHelp : DInt; + sBarcodeString : String; + fbEventLogCorrection1 : "FB_EventLog_Correction"; + fbEventLogCorrection2 : "FB_EventLog_Correction"; + fbEventLogCarrierUnknown : "FB_EventLog_Scan"; + fbEventLogCarrierNew : "FB_EventLog_Scan"; + fbEventLogGoodRead : "FB_EventLog_Scan"; + fbAlarmVarioMTinPos : "FB_SetAlarmAndLog"; + nBarcodeEmpty : Int; + nBarcodeReader_Result : DInt; + FTrig_CarrInPos {InstructionName := 'F_TRIG'; LibVersion := '1.0'} : F_TRIG; + xCarrierSensorPass : Bool; + END_VAR + + VAR_TEMP + xTemp : Bool; + nIndex : USInt; + tmpActUnivTon : Bool; + xBtEmpty : Bool; + xVarioRelease : Bool; + xVarioTrigger : Bool; + tmpReasonForStop : USInt; // Anhaltegrund in der Schrittkette | 0: Nichts | 5: Alle BT ausgefahren | 10: Fehler in SubTro | 15: Kein BT/NBT am Eingang | 20: Stau im nächsten MTRO | 25: NBT | 30: Falsch gefahren | 35: Initial-BT kam nicht am Ziel an | 40: Allgemeiner Fehler | 45: Abbruch durch MFR | 50: Fehler in Anfrage von MRF | 55: MFR hat TRO pausiert + nArrayMaxEntry : DInt; + nArrayMaxFinger : DInt; + nArrayMaxExit : DInt; + stEmptyCarrier : "stCarrier"; + stBookingInfo : "stEventBookingInfo"; + arEmptyCarrier : Array[1..1] of "stCarrier"; // Platzhalter für CarrierArray + tmpCarrierEmpty : "stCarrier"; + xEventLogRoute : Bool; + arEventCorrectionInfo : Array[0..1] of "stEventCorrectionInfo"; + stEventNew : "stEventScanInfo"; + stEventUnknown : "stEventScanInfo"; + xNewCarrier : Bool; + xGoodRead : Bool; + xTmpCorrection : Bool; + xUnknownCarrier : Bool; + stEventGoodRead : "stEventScanInfo"; + xBooked : Bool; + stTempCarrier : "stCarrier"; + END_VAR + + VAR CONSTANT + c0000_StepOff : Int := 0; // Aus + c0100_StepUndefined : Int := 100; // Undefiniert + c1000_StepWaitForTrolley1 : Int := 1000; // Warte auf Trolley + c1100_StepScannerTrig1 : Int := 1100; // Scanner Triggern + c1200_StepScannerEval1 : Int := 1200; // Scanergebnis auswerten + c1300_StepCheckLoad : Int := 1300; // Beladung prüfen + c1400_StepCheckSep1 : Int := 1400; // Separator checken + c1500_StepReleaseSep1 : Int := 1500; // Freigabe an Separator + c2000_StepWaitForTrolley2 : Int := 2000; // Warte auf Trolley 2 + c2100_StepScannerTrig2 : Int := 2100; // Scanner Triggern (nur wenn 1.Achse kein Ergebnis) + c2200_StepScannerEval2 : Int := 2200; // Scanergebnis auswerten (nur wenn 1.Achse kein Ergebnis) + c2300_StepCheckSep2 : Int := 2300; // Separator checken + c2400_StepCheckJam : Int := 2400; // Stau prüfen + c2500_StepWaitForConvRdy : Int := 2500; // Vario anforderung + c2600_StepReleaseSep2 : Int := 2600; // Freigabe an Separator + c2700_WaitForCarrInPos : Int := 2700; // Warte bis Carrier den Sensor "In Position" erreicht + cCarrierDummy : Int := 1; + END_VAR + + +BEGIN + REGION Arraygrößen + #nArrayMaxEntry := UPPER_BOUND(ARR := #arInOutJamEntr, DIM := 1); + #nArrayMaxFinger := UPPER_BOUND(ARR := #arInOutJamFinger, DIM := 1); + END_REGION + + REGION Schrittkette + + CASE #nState OF + #c0000_StepOff: + REGION 0000: Off + // akt. Zustand + #sStateText := 'OFF'; + ///////// Ausgänge ///////// + #xLastPosReached := FALSE; + ///////// Statics ////////// + #xReleaseTrolleySep1 := FALSE; + #xVarioTrigger := FALSE; + // #xVarioReq := FALSE; + #xCodeEven := FALSE; + #xOutNewScan := FALSE; + ///////// Timer ////////// + + //////// Transition //////// + + //STATE MANAGER KÜMMERT SICH UM TRANSITION! + END_REGION + + #c0100_StepUndefined: + REGION 0100: Undefined + // akt. Zustand + #sStateText := 'Undefined'; + ///////// Ausgänge ///////// + #xLastPosReached := FALSE; + ///////// Statics ////////// + #xReleaseTrolleySep1 := FALSE; + #xVarioTrigger := FALSE; + // #xVarioReq := FALSE; + #xMTRORdy := FALSE; + #xCodeEven := FALSE; + ///////// Timer ////////// + + //////// Transition //////// + #nState := #c1000_StepWaitForTrolley1; + END_REGION + + #c1000_StepWaitForTrolley1: + REGION 1000: Wait for Trolley + //akt. Zustand + #sStateText := 'Wait for Trolley'; + ///////// Ausgänge ///////// + #xLastPosReached := FALSE; + #xCarrierSensorPass := FALSE; + + ///////// Statics ////////// + + #xReleaseTrolleySep1 := FALSE; + #xVarioReq := FALSE; + #xVarioTrigger := FALSE; + #xMTRORdy := TRUE; + #xCodeEven := FALSE; + #xOutNewScan := FALSE; + + //Transition + IF NOT #stInOutHMI.UDT_Ctrl.xPause THEN + IF #fbSeparator1.stOutMainTro.xBtPresent THEN //Separator meldet Belegung + IF #stInSeparator1.Settings.xPluggedScanner THEN //Scanner verbaut? + #nState := #c1100_StepScannerTrig1; //Nächster Schritt -> Scannen + ELSIF #arInOutJamEntr[1].bStatus.%X0 THEN // Kein Scanner verbaut, aber Carrier online (z.B. Dummy wurde angelegt) + IF #stInSeparator1.Settings.xPluggedPart THEN + #nState := #c1300_StepCheckLoad; // Nächster Schritt -> Beladung prüfen + ELSE + #nState := #c1400_StepCheckSep1; //Nächster Schritt -> Separator chekcen + END_IF; + END_IF; + END_IF; + END_IF; + END_REGION + + (* "VarioStep_Emptying": + REGION 1500: Emptying + // akt. Zustand + #sStateText := 'Emptying'; + + ///////// Ausgänge ///////// + + ///////// Statics ////////// + #xReleaseTrolleySep1 := FALSE; + #xVarioTrigger := FALSE; + #xMTRORdy := FALSE; // Handshake an JobManager! + + ///////// Timer ////////// + + //////// Transition //////// + + IF #stInVario.SenJam.xDirectEdgePos OR #stInVario.SenNextSep.xDirectEdgePos OR #fbStateManager.tOutTimeInStep > T#20s THEN + #xVarioRelease := FALSE; + ELSE + #xVarioRelease := TRUE; + END_IF; + + IF #stInVario.SenLastPos.xDirectEdgePos AND NOT #tOfLastPos.Q AND #arInOutJamFinger[1].bStatus.%X0 THEN + "FC_Route"(xInSingle := FALSE, + xInSeparate := FALSE, + xInSepEdge := TRUE, + xInSensor := FALSE, + xInDelay := FALSE, + stInCarrier := #stEmptyCarrier, + stOutBookingInfo => #stBookingInfo, + arJamEntr := #arInOutJamFinger, + arOnTheWay := #arEmptyCarrier, + arJamExit := #arInOutJamExit); + END_IF; + + IF #fbConvVario.xOutConveyorReady THEN + #nState := "VarioStep_WaitForMfr"; + ELSE + #tmpReasonForStop := "Rsn_GeneralError"; + END_IF; + END_REGION *) + + #c1100_StepScannerTrig1: + REGION 1100: Scanner Trigger 1 + + // akt. Zustand + #sStateText := 'Scanner Trigger 1'; + + ///////// Ausgänge ///////// + + ///////// Statics ////////// + #xReleaseTrolleySep1 := FALSE; + + IF #fbBarcodeReader.xOutReadyForNewScan THEN //Scanner bereit + #xStartScan := TRUE; //Startbefehl + END_IF; + + ///////// Timer ////////// + + //////// Transition //////// + + IF #fbBarcodeReader.xOutReadingDone THEN //Scanner Rückmeldung + #xStartScan := FALSE; + #nState := #c1200_StepScannerEval1; //Weiter + END_IF; + END_REGION + + #c1200_StepScannerEval1: + REGION 1200: Scanner Evaluation 1 + + // akt. Zustand + #sStateText := 'Scanner Evaluation 1'; + + ///////// Ausgänge ///////// + + ///////// Statics ////////// + #xReleaseTrolleySep1 := FALSE; + + // Logic - TODO in eigenen FC packen?.. + + IF #fbBarcodeReader.xOutCodeGood THEN + #nBarcodeResult := LINT_TO_DINT(#fbBarcodeReader.#nOutBarcode); // Good read vom Barcode reader übernehmen + + REGION Event log Good read + #xGoodRead := TRUE; // Trigger + #stEventGoodRead.nScanType := 4; + #stEventGoodRead.sBarcode := DELETE(IN := DINT_TO_STRING(#nBarcodeResult), L := 1, P := 1); + #stEventGoodRead.sReaderId := DELETE(IN := INT_TO_STRING(#stInBarcodeReader.Settings.#nStation), L := 1, P := 1); + END_REGION + REGION Gerade Zahl erkannt + IF (((#nBarcodeResult / 10) MOD 100) MOD 2 <> 1) THEN //anderes Ergebnis als 1 bedeutet, (xxxxxYYx) YY=gerade, also hinteres Bein von MiniTrolley + #xCodeEven := TRUE; //Bit sagt Separator dass hinteres Bein und nicht erstes zur Korrektur in Schrittkette + // #nBarcodeTarget := #nBarcodeTarget - 10; //Mache danach die gerade Zahl zur ungeraden UPDATE: WEGEN 8. ZIFFER KLAPPT DAS SO NICHT + #nBarcodeHelp := (#nBarcodeResult / 10) - 1; + + "FC_Ean8_CheckDigit"(sInDigits := DELETE(IN := DINT_TO_STRING(IN := #nBarcodeHelp), L := 1, P := 1), + sOutBarcode => #sBarcodeString, + nOutBarcode => #nBarcodeResult); + + // #sOutBarcode := #sBarcodeString; + END_IF; + END_REGION + + ELSIF #fbBarcodeReader.#xOutCodeBad THEN + #nBarcodeResult := #arInOutJamEntr[1].nBarcode; //erwarteter Barcode wird aus JamDaten übernommen + END_IF; + + IF (#nBarcodeResult > 100) AND + (#nBarcodeResult < 2147483647) AND // Good Read (2.147.483.647 Maximum von DINT) + (#arInOutJamEntr[1].nBarcode = 0 OR #arInOutJamEntr[1].nBarcode = 1) THEN //Wenn keine Daten oder ein Dummy erwartet werden + + #xTmpCorrection := TRUE; + + // REGION Carr_Glob_Correction + + // "FC_CARR_GLOB_CORRECTION_INBOUND"(xInStart := TRUE, //Führe Korrektur aus + // nInBarcodeScan := #nBarcodeResult, + // nInStation := #stInBarcodeReader.Settings.nStation, + // arOutEventLogInfo => #arEventCorrectionInfo, + // InOutCarrierExpect := #arInOutJamEntr[1]); + // END_REGION + + + // IF NOT #xTemp THEN + // ; + // // #stInOutCarrier.stCarrData.nNrOfScans += 1; + // ELSE + // #arInOutJamEntr[1].nDestination := "cDestNONE"; //neuer Carrier // TODO + // // #stInOutCarrier.stCarrData.nNrOfScans += 1; + // #arInOutJamEntr[1].nBarcode := #nBarcodeResult; //Hier werden neue Carrier im System angelegt + // #arInOutJamEntr[1].bStatus.%X0 := TRUE; + // END_IF; + + // REGION Event Log New Carrier + + // #xNewCarrier := TRUE; // Trigger + // #stEventNew.nScanType := 2; + // #stEventNew.sBarcode := DELETE(IN := DINT_TO_STRING(#arInOutJamEntr[1].nBarcode), L := 1, P := 1); + // #stEventNew.sDest := DELETE(IN := INT_TO_STRING(#arInOutJamEntr[1].nDestination), L := 1, P := 1); + // #stEventNew.sReaderId := DELETE(IN := INT_TO_STRING(#stInBarcodeReader.Settings.#nStation), L := 1, P := 1); + + // END_REGION + ELSIF + (#nBarcodeResult > 100) AND + (#nBarcodeResult < 2147483647) AND // Good Read (2.147.483.647 Maximum von DINT) + #arInOutJamEntr[1].nBarcode = #nBarcodeResult THEN //Barcodes stimmen überein ODER es wird hier gelandet mit BadRead wobei normaler Barcode erwartet wird-> mache normal weiter + ; + ELSIF + (#nBarcodeResult > 100) AND + (#nBarcodeResult < 2147483647) AND + #arInOutJamEntr[1].nBarcode <> #nBarcodeResult AND //Barcodes stimmen nicht überein, erwarteter Carrier enthält aber normalen Barcode + #arInOutJamEntr[1].nBarcode <> 0 AND + #arInOutJamEntr[1].nBarcode <> 1 THEN + + #xTmpCorrection := TRUE; + + // REGION Carr_Glob_Correction + + // "FC_CARR_GLOB_CORRECTION_INBOUND"(xInStart := TRUE, //Führe Korrektur aus + // nInBarcodeScan := #nBarcodeResult, + // nInStation:= #stInBarcodeReader.Settings.nStation, + // arOutEventLogInfo => #arEventCorrectionInfo, + // InOutCarrierExpect := #arInOutJamEntr[1]); + // END_REGION + + // IF NOT #xTemp THEN + // ; + // // #stInOutCarrier.stCarrData.nNrOfScans += 1; + // ELSE + // #arInOutJamEntr[1].nDestination := "cDestNONE"; //neuer Carrier // TODO + // // #stInOutCarrier.stCarrData.nNrOfScans += 1; + // #arInOutJamEntr[1].nBarcode := #nBarcodeResult; //Hier werden neue Carrier im System angelegt + // #arInOutJamEntr[1].bStatus.%X0 := TRUE; + // END_IF; + + // REGION Event Log New Carrier + + // #xNewCarrier := TRUE; // Trigger + // #stEventNew.nScanType := 2; + // #stEventNew.sBarcode := DELETE(IN := DINT_TO_STRING(#arInOutJamEntr[1].nBarcode), L := 1, P := 1); + // #stEventNew.sDest := DELETE(IN := INT_TO_STRING(#arInOutJamEntr[1].nDestination), L := 1, P := 1); + // #stEventNew.sReaderId := DELETE(IN := INT_TO_STRING(#stInBarcodeReader.Settings.#nStation), L := 1, P := 1); + + // END_REGION + + + ELSE // Bad Read, falls nichts oder Dummy erwartet wird -> HANDLING TO DO!!!!!!!!!!!!!!!!!!!!!!!!!!!! + #arInOutJamEntr[1].bStatus.%X0 := TRUE; + #arInOutJamEntr[1].nBarcode := 2; //unbekannter Carrier mit Badread, erwartet 0 und physikalisch vorhanden + #arInOutJamEntr[1].nDestination := 123; //todo + + REGION Event Log unknown Carrier + + #xUnknownCarrier := TRUE; // Trigger + #stEventUnknown.nScanType := 3; + #stEventUnknown.sBarcode := DELETE(IN := DINT_TO_STRING(#arInOutJamEntr[1].nBarcode), L := 1, P := 1); + #stEventUnknown.sDest := DELETE(IN := INT_TO_STRING(#arInOutJamEntr[1].nDestination), L := 1, P := 1); + #stEventUnknown.sReaderId := DELETE(IN := INT_TO_STRING(#stInBarcodeReader.Settings.#nStation + 50), L := 1, P := 1); + + END_REGION + END_IF; + + #xHandshakeScan := TRUE; + + #nOutScanResult := #nBarcodeResult; + #xOutNewScan := TRUE; + ///////// Timer ////////// + + //////// Transition //////// + IF #stInSeparator1.Settings.xPluggedPart THEN + #nState := #c1300_StepCheckLoad; + ELSIF #xCodeEven THEN + #xCodeEven := FALSE; + #nState := #c2000_StepWaitForTrolley2; //Scanner bestätigt zweites Bein gelesen -> Korrigieren! + ELSE + #nState := #c1400_StepCheckSep1; + END_IF; + + END_REGION + + #c1300_StepCheckLoad: + REGION 1300: Check Load + + // akt. Zustand + #sStateText := 'Check Load'; + + ///////// Ausgänge ///////// + ///////// Statics ////////// + #xHandshakeScan := FALSE; + #xReleaseTrolleySep1 := FALSE; + #xOutNewScan := FALSE; + ///////// Timer ////////// + + //////// Transition //////// + #tmpActUnivTon := TRUE; + IF (#arInOutJamEntr[1].bStatus.%X1 AND #xTrolleyWithPart) OR //Daten und physikalisch -> beladen Ok! + (NOT #arInOutJamEntr[1].bStatus.%X1 AND #xTrolleyWoPart) //Daten und physikalisch -> unbeladen Ok! + THEN + #nState := #c1400_StepCheckSep1; // Weiter + ELSIF #fbStateManager.tOutUnivTonR > T#3s THEN + #tmpReasonForStop := 123; // TODO: Beladekontrolle Fehler + END_IF; + + END_REGION + + #c1400_StepCheckSep1: + REGION 1400: Check Separator + // akt. Zustand + #sStateText := 'Check Sep'; + + ///////// Ausgänge ///////// + ///////// Statics ////////// + #xReleaseTrolleySep1 := FALSE; + #xOutNewScan := FALSE; + ///////// Timer ////////// + + //////// Transition //////// + #xVarioReq := TRUE; + #tmpActUnivTon := TRUE; + IF #fbSeparator1.stOutMainTro.nStatus = "SepState_WaitForReq" THEN // Separator ist bereit + #nState := #c1500_StepReleaseSep1; + ELSIF #fbStateManager.tOutUnivTonR > T#3s THEN + #tmpReasonForStop := "Rsn_SubError"; // SubTRO: Separator ist nicht bereit + END_IF; + + END_REGION + + #c1500_StepReleaseSep1: + REGION 1500: Release Sep 1 + // akt. Zustand + #sStateText := 'Leave Sep 1'; + + ///////// Ausgänge ///////// + ///////// Statics ////////// + #stOutPriorityManager.xTransportReq := FALSE; // Beim ersten Bein noch nicht nötig + + #xReleaseTrolleySep1 := + (NOT #fbSepWait.xOutLockSep1 AND (* #xInCarouselRun AND *)#xInSftyOk) AND // Erste Achse darf vereinzelt werden + (NOT #stInSettings.bSepType.%X0 OR + (#xInRelease AND #stInSettings.bSepType.%X0)) + ; + + //////// Transition //////// + IF #fbSeparator1.stOutMainTro.nStatus = "SepState_Finish" THEN + #nState := #c2000_StepWaitForTrolley2; + ELSIF #xReleaseTrolleySep1 AND #tOnSvReleaseSep.Q THEN + #tmpReasonForStop := "Rsn_SubError"; // Timeout-Fehler im SubTRO "Separator": Freigabe erteilt, aber Separator gibt keine Rückmeldung an MainTRO + END_IF; + + END_REGION + + #c2000_StepWaitForTrolley2: + REGION 2000: Wait for Trolley 2 + //akt. Zustand + #sStateText := 'Wait for Trolley 2'; + ///////// Ausgänge ///////// + + ///////// Statics ////////// + + #xReleaseTrolleySep1 := FALSE; + #xOutNewScan := FALSE; + //Korrektur 2.Bein kommt nicht + // IF NOT #fbSeparator1.stOutMainTro.xBtPresent (* AND #xInCarouselRun *) AND NOT #stInSeparator1.Settings.xPluggedScanner AND #fbStateManager.tOutTimeInStep > T#3s THEN + // #nState := #c1000_StepWaitForTrolley1; + // END_IF; + + //Transition + IF NOT #stInOutHMI.UDT_Ctrl.xPause THEN + IF #fbSeparator1.stOutMainTro.xBtPresent AND //Separator meldet Belegung + #arInOutJamEntr[1].bStatus.%X0 // Carrier ist online + AND (#xInRelease AND NOT #stInSettings.bSepType.%X0) OR #stInSettings.bSepType.%X0 + THEN + IF #xReadSecondLeg // zweites Bein muss gelesen werden (TODO!!!!) + AND #stInSeparator1.Settings.xPluggedScanner // Scanner verbaut? + THEN + #nState := #c2100_StepScannerTrig2; // Nächster Schritt -> Scannen + ELSE + #nState := #c2300_StepCheckSep2; // Nächster Schritt -> Separator + END_IF; + END_IF; + END_IF; + END_REGION + + #c2100_StepScannerTrig2: + REGION 2100: Scanner Trigger 2 + + // akt. Zustand + #sStateText := 'Scanner Trigger 2'; + + ///////// Ausgänge ///////// + + ///////// Statics ////////// + #xReleaseTrolleySep1 := FALSE; + + IF #fbBarcodeReader.xOutReadyForNewScan THEN + #xStartScan := TRUE; + END_IF; + + ///////// Timer ////////// + + //////// Transition //////// + + IF #fbBarcodeReader.xOutReadingDone THEN + #xStartScan := FALSE; + #nState := #c2200_StepScannerEval2; + END_IF; + END_REGION + + #c2200_StepScannerEval2: + REGION 2200: Scanner Evaluation 2 + + // akt. Zustand + #sStateText := 'Scanner Evaluation 2'; + + ///////// Ausgänge ///////// + + ///////// Statics ////////// + #xReleaseTrolleySep1 := FALSE; + + // Logic + + IF #fbBarcodeReader.xOutCodeGood THEN + #nBarcodeResult := LINT_TO_DINT(#fbBarcodeReader.#nOutBarcode); // Good read vom Barcode reader + ELSIF #fbBarcodeReader.#xOutCodeBad THEN + #nBarcodeResult := #arInOutJamEntr[1].nBarcode; //erwarteter Barcode wird aus JamDaten übernommen + END_IF; + + IF (#nBarcodeResult > 100) AND + (#nBarcodeResult < 2147483647) AND // Good Read (2.147.483.647 Maximum von DINT) + (#arInOutJamEntr[1].nBarcode = 0 OR #arInOutJamEntr[1].nBarcode = 1) THEN //Wenn keine Daten oder ein Dummy erwartet werden + REGION TODO + (* "FC_CARR_GLOB_CORRECTION"(xInStart := TRUE, //Führe Korrektur aus + nInBarcodeScan := #nBarcodeResult, + nInStation := 0, // todo + xOutNotFound => #xTemp, + arOutEventLogInfo => #arEventCorrectionInfo, + InOutCarrierExpect := #arInOutJamEntr1[1]); *) + END_REGION + + + IF NOT #xTemp THEN + ; + // #stInOutCarrier.stCarrData.nNrOfScans += 1; + ELSE + #arInOutJamEntr[1].nDestination := "cDestNONE"; //neuer Carrier // TODO + // #stInOutCarrier.stCarrData.nNrOfScans += 1; + #arInOutJamEntr[1].nBarcode := #nBarcodeResult; //Hier werden neue Carrier im System angelegt + #arInOutJamEntr[1].bStatus.%X0 := TRUE; + END_IF; + ELSIF + (#nBarcodeResult > 100) AND + (#nBarcodeResult < 2147483647) AND // Good Read (2.147.483.647 Maximum von DINT) + #arInOutJamEntr[1].nBarcode = #nBarcodeResult THEN //Barcodes stimmen überein ODER es wird hier gelandet mit BadRead wobei normaler Barcode erwartet wird-> mache normal weiter + ; + ELSIF + (#nBarcodeResult > 100) AND + (#nBarcodeResult < 2147483647) AND + #arInOutJamEntr[1].nBarcode <> #nBarcodeResult AND //Barcodes stimmen nicht überein, erwarteter Carrier enthält aber normalen Barcode + #arInOutJamEntr[1].nBarcode <> 0 AND + #arInOutJamEntr[1].nBarcode <> 1 THEN + ; + REGION TODO + (* "FC_CARR_GLOB_CORRECTION"(xInStart := TRUE, //Führe Korrektur aus + nInBarcodeScan := #nBarcodeResult, + nInStation := 0, // todo + xOutNotFound => #xTemp, + arOutEventLogInfo => #arEventCorrectionInfo, + InOutCarrierExpect := #arInOutJamEntr1[1]); *) + END_REGION + + ELSE // Bad Read, falls nichts oder Dummy erwartet wird -> HANDLING TO DO!!!!!!!!!!!!!!!!!!!!!!!!!!!! + #arInOutJamEntr[1].bStatus.%X0 := TRUE; + #arInOutJamEntr[1].nBarcode := 2; //unbekannter Carrier mit Badread, erwartet 0 und physikalisch vorhanden + #arInOutJamEntr[1].nDestination := 123; //todo + END_IF; + + #xHandshakeScan := TRUE; + + ///////// Timer ////////// + + //////// Transition //////// + #nState := #c2300_StepCheckSep2; + + END_REGION + + #c2300_StepCheckSep2: + REGION 2300: Check Separator + // akt. Zustand + #sStateText := 'Check Sep'; + + ///////// Ausgänge ///////// + ///////// Statics ////////// + #xHandshakeScan := FALSE; + #xReleaseTrolleySep1 := FALSE; + ///////// Timer ////////// + + //////// Transition //////// + #tmpActUnivTon := TRUE; + IF #fbSeparator1.stOutMainTro.nStatus = "SepState_WaitForReq" THEN // Separator ist bereit + #nState := #c2400_StepCheckJam; + ELSIF #fbStateManager.tOutUnivTonR > T#3s THEN + #tmpReasonForStop := "Rsn_SubError"; // SubTRO: Separator ist nicht bereit + END_IF; + + END_REGION + + #c2400_StepCheckJam: + REGION 2400: Check Jam + // akt. Zustand + #sStateText := 'Check Jam'; + ///////// Ausgänge ///////// + ///////// Statics ////////// + #xReleaseTrolleySep1 := FALSE; + + ///////// Timer ////////// + //////// Transition //////// + + IF (#stInOutJamFinger.Status.nCount = #stInOutJamFinger.Config.nCapacitySet) //Zielstaubereich ist datentechnisch voll + THEN + #tmpReasonForStop := "Rsn_JamNextError"; + ELSE + #nState := #c2500_StepWaitForConvRdy; + END_IF; + + END_REGION + + #c2500_StepWaitForConvRdy: + REGION 2500: Wait for Finger Conveyor + // akt. Zustand + #sStateText := 'Wait Finger Conv'; + ///////// Ausgänge ///////// + ///////// Statics ////////// + #xReleaseTrolleySep1 := FALSE; + // #xVarioReq := TRUE; // Anforderung an Fingerförderer + + ///////// Timer ////////// + //////// Transition //////// + IF #fbConvVario.xOutConveyorReady THEN + #nState := #c2600_StepReleaseSep2; + END_IF; + END_REGION + + #c2600_StepReleaseSep2: + REGION 2600: Leave Sep + + // akt. Zustand + #sStateText := 'Leave Sep'; + + ///////// Ausgänge ///////// + ///////// Statics ////////// + + #xReleaseTrolleySep1 := #xInSftyOk AND #fbConvVario.xOutConveyorReady (* AND NOT #stInMfr.xPause *)AND + #stInOutJamFinger.Status.nCount < #stInOutJamFinger.Config.nCapacitySet AND + NOT #stInOutJamFinger.Status.bByte.%X2 AND NOT #stInOutJamEntr.Status.bByte.%X3 AND + NOT #fbSepWait.xOutLockSep1; + #xVarioTrigger := FALSE; + ///////// Timer ////////// + + // Reason for Stop + (* IF #stInMfr.xPause THEN + #tmpReasonForStop := "Rsn_MfrPausedTro"; + END_IF; *) + + IF NOT #fbConvVario.xOutConveyorReady THEN + #tmpReasonForStop := "Rsn_CarouselError"; + END_IF; + + //////// Transition //////// + IF #fbSeparator1.stOutMainTro.nStatus = "SepState_Finish" THEN + + // REGION Buchen Entry -> Finger + // "FC_Route_1"(xInSingle := FALSE, + // xInSeparate := FALSE, + // xInSepEdge := TRUE, + // xInSensor := FALSE, + // xInDelay := FALSE, + // stInCarrier := #stEmptyCarrier, + // stOutBookingInfo => #stBookingInfo, + // arJamEntr := #arInOutJamEntr, + // arOnTheWay := #arEmptyCarrier, + // arJamExit := #arInOutJamFinger); + // END_REGION + + // #xVarioTrigger := TRUE; + // #xEventLogRoute := TRUE; + // #nState := #c1000_StepWaitForTrolley1; + //NEU!!!!!!!!!! + #xLastPosReached := TRUE; + + #nState := #c2700_WaitForCarrInPos; + ELSIF #xReleaseTrolleySep1 AND #tOnSvReleaseSep.Q THEN + #tmpReasonForStop := "Rsn_SubError"; // Timeout-Fehler im SubTRO "Separator": Freigabe erteilt, aber Separator gibt keine Rückmeldung an MainTRO + END_IF; + + END_REGION + + #c2700_WaitForCarrInPos: + REGION 2700: Wait for Sensor "In Pos" + + // akt. Zustand + #sStateText := 'Wait for Sensor "In Pos"'; + + ///////// Ausgänge ///////// + ///////// Statics ////////// + + #xReleaseTrolleySep1 := FALSE; + ///////// Timer ////////// + + IF NOT #fbConvVario.xOutConveyorReady THEN + #tmpReasonForStop := "Rsn_CarouselError"; + END_IF; + + //////// Transition //////// + + IF (#stInVario.stSenCarrInPos.xDbncdSensor AND (#stInVario.stSenCarrInPos.tDirectChangeLast > #stInVario.Settings.tCarrierInPosDelay)) OR //Timer ggf. umbennen, wird ansonsten aktuell nirgendwo verwendet + //#FTrig_CarrInPos.Q + #xCarrierSensorPass + THEN + // IF (#stInVario.stSenCarrInPos.xDbncdSensor AND #stInVario.stSenCarrInPos.tDirectChangeLast > T#1s AND #fbStateManager.tOutTimeInStep > T#1s) OR // Sensor belegt + Mindestzeit vergangen + // (#fbStateManager.tOutTimeInStep > t#3s) // Timeout + // THEN + #stTempCarrier := #arInOutJamEntr[1]; + + REGION Buchen Entry -> Finger + "FC_Route"(xInSingle := FALSE, + xInSeparate := FALSE, + xInSepEdge := TRUE, + xInSensor := FALSE, + xInDelay := FALSE, + stInCarrier := #stEmptyCarrier, + stOutBookingInfo => #stBookingInfo, + arJamEntr := #arInOutJamEntr, + arOnTheWay := #arEmptyCarrier, + arJamExit := #arInOutJamFinger); + END_REGION + + #xCarrierSensorPass := FALSE; + + #xBooked := TRUE; + + #xLastPosReached := FALSE; + + #xVarioTrigger := TRUE; + #xEventLogRoute := TRUE; + #nState := #c1000_StepWaitForTrolley1; + ELSIF #fbStateManager.tOutTimeInStep > #stInVario.Settings.tTimeOutCarrierInPos AND NOT #stInVario.stSenCarrInPos.xDirectSensor AND #stInVario.stSenCarrInPos.tDirectChangeLast > #stInVario.Settings.tTimeOutCarrierInPos THEN // Wenn wir hier stecken bleiben, könnte man eine Korrektur versuchen... z.B. zurück zu nState = 2000 + #nState := #c2000_StepWaitForTrolley2; + #tmpReasonForStop := "Rsn_SubError"; + #xBtEmpty := TRUE; //provisorisch + END_IF; + + // //ELSIF #fbStateManager.tOutTimeInStep > T#5s THEN + // #tmpReasonForStop := "Rsn_SubError"; + // #xBtEmpty := TRUE; //provisorisch + // END_IF; + END_REGION ; + + + (* // "VarioStep_CheckVario": + // REGION 2550: Check Vario + + // // akt. Zustand + // #sStateText := 'Check Vario'; + + // ///////// Ausgänge ///////// + // ///////// Statics ////////// + + // #xReleaseTrolleySep1 := FALSE; + // ///////// Timer ////////// + + // // Reason for Stop + + // //////// Transition //////// + // IF NOT #arInOutJamExit[#nArrayMaxExit].bStatus.%X0 AND NOT #stInVario.SenJam.xDbncdSensor AND + // #xLastPosReached AND NOT #stInMfr.xPause THEN //darf takten wenn letzte Position erreicht und nachfolgender Bereich frei ist + // #xLastPosReached := FALSE; + // #xVarioTrigger := TRUE; + // #nState := "VarioStep_VarioMove"; + // //vorderstes Teil (LastPos) wird in Exit-Jam geschoben + // REGION Buchen Finger -> Exit + // "FC_Route"(xInSingle := FALSE, + // xInSeparate := FALSE, + // xInSepEdge := TRUE, + // xInSensor := FALSE, + // xInDelay := FALSE, + // stInCarrier := #stEmptyCarrier, + // stOutBookingInfo => #stBookingInfo, + // arJamEntr := #arInOutJamFinger, + // arOnTheWay := #arEmptyCarrier, + // arJamExit := #arInOutJamExit); + // END_REGION + + // ELSIF NOT #xLastPosReached AND NOT #stInMfr.xPause THEN //darf takten wenn letzte Position zuvor noch nicht erreicht wurde + // REGION Takten ohne Buchen + // #xLastPosReached := FALSE; + // #xVarioTrigger := TRUE; + // #nState := "VarioStep_VarioMove"; + // END_REGION + + // END_IF; + + // END_REGION + + // "VarioStep_VarioMove": + // REGION 2575: Vario Move + + // // akt. Zustand + // #sStateText := 'Vario Move'; + + // ///////// Ausgänge ///////// + // ///////// Statics ////////// + + // #xReleaseTrolleySep1 := FALSE; + // #xVarioTrigger := FALSE; + // ///////// Timer ////////// + + + // //////// Transition //////// + + // IF #stInVario.SenLastPos.xDirectEdgePos AND NOT #tOfLastPos.Q THEN + // #xLastPosReached := TRUE; + // END_IF; + + // IF #fbConvVario.xOutConveyorReady THEN + // #nState := "VarioStep_WaitForMfr"; + // END_IF; + + // END_REGION *) + + END_CASE; + + END_REGION + + REGION Timer - Überwachungszeit + + REGION Separator + #tOnSvReleaseSep(IN := (#nState = #c1500_StepReleaseSep1 OR #nState = #c2600_StepReleaseSep2) AND #xReleaseTrolleySep1, + PT := T#3s); + END_REGION + + REGION Carrier in Pos + #tOfLastPos(IN := ((#nState = #c2600_StepReleaseSep2) OR (#nState = #c2700_WaitForCarrInPos)) AND #stInVario.stSenCarrInPos.xDirectEdgePos, + PT := #stInVario.Settings.tCarrierInPosEdgeDelay); //z.B. + + #FTrig_CarrInPos(CLK := #tOfLastPos.Q); + + IF #FTrig_CarrInPos.Q THEN + #xCarrierSensorPass := true;//#FTrig_CarrInPos.Q; + END_IF; + END_REGION + + END_REGION + + REGION Haltegrund Schrittkette + #stActRequest.nReasonForStop := #tmpReasonForStop; //tmp aus Schrittkette übernehmen + END_REGION + + REGION Beladekontrolle + //Beladekontrolle aktiviert + IF #stInSeparator1.Settings.xPluggedPart THEN + + //Trolley beladen + #xTrolleyWithPart := + #stInSeparator1.Settings.xPluggedPart AND + #stInSeparator1.stSenInSep.xDbncdSensor + AND #stInSeparator1.stSenPart.xDirectSensor + AND #stInSeparator1.stSenPart.tDirectChangeLast > #stInSettings.tPartSenHigh; + + //Trolley nicht beladen + #xTrolleyWoPart := + #stInSeparator1.Settings.xPluggedPart AND + #stInSeparator1.stSenInSep.xDbncdSensor AND + #stInSeparator1.stSenInSep.tDirectChangeLast > #stInSettings.tInSenHigh AND + NOT #stInSeparator1.stSenPart.xDirectSensor; + + //Plausibel? + IF #stInSeparator1.Settings.xPluggedPart AND ((#arInOutJamEntr[1].bStatus.%X1 AND #xTrolleyWoPart) OR + (NOT #arInOutJamEntr[1].bStatus.%X1 AND #xTrolleyWithPart)) + THEN + #wErrorWord.%X2 := TRUE; + ELSE + #wErrorWord.%X2 := FALSE; + END_IF; + ELSE + #xTrolleyWithPart := #xTrolleyWoPart := FALSE; // Beladekontrolle (Sensor) nicht verbaut + END_IF; + END_REGION + + REGION Dummy Handling + + #nArrayMax := DINT_TO_INT(UPPER_BOUND(ARR := #arInOutJamEntr, DIM := 1)); + + REGION Dummy erstellen + IF #stInSettings.xIsBorner THEN + IF #nBarcodeEmpty > 1999 OR #nBarcodeEmpty < 1000 THEN + #nBarcodeEmpty := 1000; + ELSE + IF #nState = 2600 AND #fbSeparator1.xOutTrolleyReleasedEdge THEN + #nBarcodeEmpty += 1; + END_IF; + END_IF; + + IF #fbSeparator1.stOutMainTro.xBtPresent AND + #fbSeparator1.stOutMainTro.nStatus = "SepState_WaitForReq" AND + #stInSeparator1.stSenInSep.tDirectChangeLast > #stInSettings.tDummyTimeBorner AND + #arInOutJamEntr[1] = #tmpCarrierEmpty + THEN + #arInOutJamEntr[1].nBarcode := #nBarcodeEmpty; + #arInOutJamEntr[1].bStatus.%X0 := TRUE; + #arInOutJamEntr[1].nDestination := #stInSettings.nBornerDest; + END_IF; + ELSE + IF #fbSeparator1.stOutMainTro.xBtPresent AND + #fbSeparator1.stOutMainTro.nStatus = "SepState_WaitForReq" AND + #stInSeparator1.stSenInSep.tDirectChangeLast > T#3s AND // variabel machen, Dummy immer anlegen?, Unterscheidung bei Borner? + #arInOutJamEntr[1] = #tmpCarrierEmpty + THEN + #arInOutJamEntr[1].nBarcode := #cCarrierDummy; + #arInOutJamEntr[1].bStatus.%X0 := TRUE; + END_IF; + + END_IF; + + END_REGION + + REGION Dummy löschen - ÜBERARBEITEN! + IF #nArrayMax > 1 THEN //Wenn ein einzelner Dummy oder Barcode 2 vorhanden ohne Belegung nach 2 Min löschen (Ausnahme in Qualität) + IF (#arInOutJamEntr[1] = #stCarrierDummy) + AND #arInOutJamEntr[2] = #tmpCarrierEmpty AND + NOT #stInSeparator1.stSenInSep.xDirectSensor AND #stInSeparator1.stSenInSep.tDirectChangeLast > T#8s AND + #fbSeparator1.stOutMainTro.nStatus = "SepState_WaitForBt" AND #fbSeparator1.#fbStateManager.tOutTimeInStep > T#8s + THEN + #arInOutJamEntr[1] := #tmpCarrierEmpty; + ELSIF (#arInOutJamEntr[1] = #stCarrierDummy) + AND (#arInOutJamEntr[2] = #stCarrierDummy OR #arInOutJamEntr[2] <> #stCarrierDummy) AND + NOT #stInSeparator1.stSenInSep.xDirectSensor AND #stInSeparator1.stSenInSep.tDirectChangeLast > T#8s AND + #fbSeparator1.stOutMainTro.nStatus = "SepState_WaitForBt" AND #fbSeparator1.#fbStateManager.tOutTimeInStep > T#8s + THEN + #arInOutJamEntr[1] := #tmpCarrierEmpty; + "FC_TSHR_Shift"(xInShiftBack := TRUE, + arTSHR := #arInOutJamEntr); + END_IF; + ELSIF #nArrayMax = 1 THEN + IF (#arInOutJamEntr[1] = #stCarrierDummy) AND + NOT #stInSeparator1.stSenInSep.xDirectSensor AND #stInSeparator1.stSenInSep.tDirectChangeLast > T#8s AND + #fbSeparator1.stOutMainTro.nStatus = "SepState_WaitForBt" AND #fbSeparator1.#fbStateManager.tOutTimeInStep > T#8s + THEN + #arInOutJamEntr[1] := #tmpCarrierEmpty; + END_IF; + END_IF; + + END_REGION + + END_REGION + + REGION Monitoring + + REGION Carrier kommt nicht an / Daten ohne Belegung + #tOnMonCarrArrive(IN := #arInOutJamEntr[1].bStatus.%X0 AND NOT #stInSeparator1.stSenInSep.xDirectSensor, + PT := #stInSeparator1.Settings.tDelayToNextItem, + Q => #wErrorWord.%X10); //TODO + + #fbMonitoringCarrNotArrive.stSettings.nErrorType := 1; + #fbMonitoringCarrNotArrive.stSettings.xErrLedIfMachineIsOff := TRUE; + #fbMonitoringCarrNotArrive.stSettings.xSelfQuit := TRUE; + #fbMonitoringCarrNotArrive(sInFctnName := '', + wInTextListId_Function := 1000, + wInTextListId_Message := 1000, + sInPrefix := #stInOutHMI.UDT_Config.sName, + sInSuffix := #stInOutHMI.UDT_Separator1.stConfig.sName, + xInQuitError := #stInOutMachineState.xQuitError, + xInSignal := NOT #wErrorWord.%X10, + sInAlarmMessage := 'Carrier kommt nicht am Separator an', + InOutMachineState := #stInOutMachineState); + + END_REGION + + REGION Carrier ohne Daten + + IF #stInSeparator1.stSenInSep.xDbncdSensor AND #stInSeparator1.stSenInSep.tDirectChangeLast > T#5s AND NOT #arInOutJamEntr[1].bStatus.%X0 THEN + #wErrorWord.%X5 := TRUE; + ELSE + #wErrorWord.%X5 := FALSE; + END_IF; + + #fbMonitoringCarrWoData.stSettings.nErrorType := 1; + #fbMonitoringCarrWoData.stSettings.xErrLedIfMachineIsOff := TRUE; + #fbMonitoringCarrWoData.stSettings.xSelfQuit := TRUE; + #fbMonitoringCarrWoData(sInFctnName := '', + wInTextListId_Function := 1000, + wInTextListId_Message := 1001, + sInPrefix := #stInOutHMI.UDT_Config.sName, + sInSuffix := #stInOutHMI.UDT_Separator1.stConfig.sName, + InOutMachineState := #stInOutMachineState, + xInQuitError := #stInOutMachineState.xQuitError, + xInSignal := NOT #wErrorWord.%X5, + sInAlarmMessage := 'Sep-Belegung ohne Daten'); + END_REGION + + #fbAlarmVarioMTinPos.stSettings.nNoMaxErrors := 1; + #fbAlarmVarioMTinPos.stSettings.nType := 2; + #fbAlarmVarioMTinPos.stSettings.sFctnName := ''; + #fbAlarmVarioMTinPos(xInAlarm := #xBtEmpty, + nInAlarmNumber := 0, + sInPrefix := 'MT in Pos', + sInSuffix := '', + wInTextListId_Message := 300, + wInTextListId_Function := 300, + stInOutControlUnitCabinet := #stInOutMachineState); + + END_REGION + + + REGION Motorüberwachung - todo + IF #nState = 40000 AND #fbStateManager.tOutTimeInStep > T#4s THEN + #xErrorMotor := TRUE; + ELSE + #xErrorMotor := FALSE; + END_IF; + END_REGION + + REGION Fahrbedingungen für Vario + + // IF #arInOutJamExit[1].bStatus.%X0 AND + // NOT #stInVario.SenJam.xDirectSensor AND #stInVario.SenJam.tDirectChangeLast > #stInVario.Settings.tFreeJam AND + // NOT #stInVario.SenNextSep.xDirectSensor AND #stInVario.SenNextSep.tDirectChangeLast > #stInVario.Settings.tFreeNextSep AND + // NOT #stInVario.SenSepVario.xDirectSensor AND #stInVario.SenSepVario.tDirectChangeLast > #stInVario.Settings.tFreeVarioSep THEN + // #xVarioRelease := TRUE; + // ELSE + // #xVarioRelease := FALSE; + // END_IF; + + END_REGION + + REGION Wartezeit Separator + + #fbSepWait.stInTimes.tFreeSen1 := #stInSeparator1.Settings.tSenFree; + #fbSepWait.stInTimes.tTimerWait := #stInSeparator1.Settings.tSenWait; + #fbSepWait(stInSensor1 := #stInSeparator1.stSenInSep, + xInConvActive := TRUE); + + END_REGION + + REGION StateManager + + #fbStateManager.stInSettings.nStartState := #c0100_StepUndefined; + #fbStateManager.stInSettings.nStartStateTestMode := #c0000_StepOff; + #fbStateManager.stInSettings.xActUnivTOn := TRUE; + #fbStateManager.stInSettings.xRestartAtStartState := FALSE; + #fbStateManager(xInFunctionEnabled := #stInOutMachineState.xRunning, // AND #xInSftyOk, + xInReset := #stInOutHMI.UDT_Ctrl.xReset OR #xInReset, + xInRunUnivTOn := #tmpActUnivTon, + xInTestMode := #xInTestMode, + nInOutState := #nState); + + END_REGION + + REGION Aufruf der Sub-TROs + + REGION Separator 1 + + #fbSeparator1(xInReset := #stInOutHMI.UDT_Ctrl.xReset OR #xInReset, + xInErrQuit := #stInOutHMI.UDT_Ctrl.xErrorQuit OR #xInErrorQuit, + stInOutMainState := #stInOutMachineState, + stInSettings := #stInSeparator1.Settings, + xInConveyorRun := TRUE, //Gefälle... + stInTrolley := #stInSeparator1.stSenInSep, + xInReceiveReady := #xReleaseTrolleySep1, + stInOutHMI := #stInOutHMI.UDT_Separator1, + stInOutCarrDataInJam := #arInOutJamEntr); + + #stInOutHMI.UDT_Separator1.stStatus.xNullBt := #stInOutHMI.UDT_Ctrl.xPause; + #stInOutHMI.UDT_Separator2.stStatus.xNullBt := #stInOutHMI.UDT_Ctrl.xPause; + END_REGION + + REGION Vario Förderer + + + + + + #fbConvVario(stInSettings := #stInVario.Settings, + xInAutomatic := #xInAutomatic, + xInErrorQuit := #xInErrorQuit OR #stInOutHMI.UDT_Ctrl.xErrorQuit, + xInReleaseEdge := #xVarioTrigger, // Separator Release Edge + stInSenConvFingerInPos := #stInVario.stSenFinger, + stInSenJam := #stInVario.stSenJam, + stInSenLastPos := #stInVario.stSenLastPos, + stInSenCarrInPos := #stInVario.stSenCarrInPos, + xInRequest := #xVarioReq AND (NOT #fbSepWait.xOutLockSep1 OR #xLastPosReached),//#xVarioReq AND NOT #fbSepWait.xOutLockSep1 AND NOT #stInOutHMI.UDT_Separator1.stControl.xLockSeparator, + xInMotorProtection := #xInMotorProtection, + stInStationSensor:= #stInStationSensor,// TEST + xInReleaseStation:= #xInReleaseStation,// TEST + xOutMotor => #xOutVarioMotor, + stInOutControlUnitCabinet := #stInOutMachineState, + stInOutHMI := #stInOutHMI.UDT_Vario1, + arInOutJamFinger := #arInOutJamFinger); + + + + END_REGION + + REGION Barcode Reader 1 + #fbBarcodeReader(stInSettings := #stInBarcodeReader.Settings, + xInReset := #stInOutHMI.UDT_Ctrl.xReset, + xInHWError := false, // todo + xInStartReading := #xStartScan, + xInHandshakeDone := #xHandshakeScan, + stInOutInterface := #stInOutCognexInterface, + stInOutControlUnitCabinet := #stInOutMachineState, + stInOutHMI := #stInOutHMI.UDT_BarcodeReader2); + END_REGION + + END_REGION + + REGION BT zählen - NIU + + CASE #stActRequest.nDirection OF + 0: + #stActRequest.nActNoStopper := 0; + 1: + #stActRequest.nActNoStopper := UDINT_TO_USINT(#fbSeparator1.stOutMainTro.nCounterBt - #stActRequest.nCntAtStartSep1); + END_CASE; + + + END_REGION + + REGION HMI + #stInOutHMI.UDT_Config.nTroType := 5; //Vario + + #stInOutHMI.UDT_State.nState := #nState; + #stInOutHMI.UDT_State.sState := #sStateText; + + #stInOutHMI.UDT_State.xError := + #fbSeparator1.wOutErrorWord > 0 OR + #stInOutHMI.UDT_Separator1.stStatus.bStatus = 2; + //usw. + + END_REGION + + REGION Ausgänge schreiben + #xOutBooked := #xBooked; + #stOutLastCarrier := #stTempCarrier; + + REGION Output + + #xOutStopper := #fbSeparator1.xOutStopper; + #xOutJamAtEntry1 := #fbSeparator1.stOutMainTro.xJamAtEntry; + #xOutCorrection := #xTmpCorrection; + // #xOutCarouselReq := ((#nState >= "VarioStep_CheckCorrectBt" AND #nState <= "VarioStep_LeaveSep")) (* AND + // NOT #stInMfr.xPause *); + + END_REGION + + END_REGION + + REGION Event Logs + REGION Event: Route (Umbuchung) + #stBookingInfo.sJamSrc := #stInSettings.sJamSrc; + #stBookingInfo.sJamDest := #stInSettings.sJamDest; + #fbEventLog_Route(xInTrigger := #xEventLogRoute, + stInEventBookingInfo := #stBookingInfo); + END_REGION + END_REGION + + // Pro Event wird ein Aufruf benötigt + REGION Korrekturvorgänge loggen + + #fbEventLogCorrection1(xInTrigger := #arEventCorrectionInfo[0].xTrigger, + stInEventCorrectionInfo := #arEventCorrectionInfo[0]); + + #fbEventLogCorrection2(xInTrigger := #arEventCorrectionInfo[1].xTrigger, + stInEventCorrectionInfo := #arEventCorrectionInfo[1]); + + END_REGION + + #fbEventLogCarrierUnknown(xInTrigger := #xUnknownCarrier, + stInEventScanInfo := #stEventUnknown); + + #fbEventLogCarrierNew(xInTrigger := #xNewCarrier, + stInEventScanInfo := #stEventNew); + + #fbEventLogGoodRead(xInTrigger := #xGoodRead, + stInEventScanInfo := #stEventGoodRead); + + REGION Letzten Schritt wegschreiben + #nOutStateLast := #fbStateManager.nStateLast; + END_REGION +END_FUNCTION_BLOCK + diff --git a/doc/TRO_Katalog/scl_templates/FB_ILS_MTRO_Vario_workStation_CallSite.scl b/doc/TRO_Katalog/scl_templates/FB_ILS_MTRO_Vario_workStation_CallSite.scl new file mode 100644 index 0000000..fd6e6b7 --- /dev/null +++ b/doc/TRO_Katalog/scl_templates/FB_ILS_MTRO_Vario_workStation_CallSite.scl @@ -0,0 +1,62 @@ +// TEMPLATE (ERGÄNZEND): Realer Instanziierungs-/Aufruf-Code für FB_ILS_MTRO_Vario_workStation +// ------------------------------------------------------------------------------------------ +// Der volle FB-Körper liegt bereits lokal vor: FB_ILS_MTRO_Vario_workStation.scl (dieser Ordner). +// Diese Datei ergänzt zusätzlich die reale AUFRUFSTELLE (Parametrierung) aus: +// =A01+UH04-KF00\Programmbausteine\100_Main\FB_Main.scl (REGION "TRO 421 (Vario)") +// ------------------------------------------------------------------------------------------ + +REGION TRO 421 (Vario) + #TRO421.stInSeparator1.Settings.nSeparatorNo := "cSep421.1"; + #TRO421.stInSeparator1.Settings.tTrailingTime := "cTimeSepTrailing"; + #TRO421.stInSeparator1.Settings.tHandlingTime := t#200ms; + #TRO421.stInSeparator1.Settings.tDelayToNextItem := "TimeForSepWaiting_Short"; + #TRO421.stInSeparator1.Settings.tJam := "TimeForSepJam"; + #TRO421.stInSeparator1.Settings.xPluggedJam := FALSE; + #TRO421.stInSeparator1.Settings.xPluggedPart := FALSE; + #TRO421.stInSeparator1.Settings.xPluggedScanner := FALSE; + #TRO421.stInSeparator1.stSenInSep := "DB_Inputs".Sensors["cInBG3326"]; + + #TRO421.stInSeparator1.Settings.tSenFree := T#1200ms; + #TRO421.stInSeparator1.Settings.tSenWait := T#4300ms; + + #TRO421.stInVario.stSenFinger := "DB_Inputs".Sensors["cInBG3315"]; //Finger in Pos + #TRO421.stInVario.stSenLastPos := "DB_Inputs".Sensors["cInBG3317"]; // Conveyor full + #TRO421.stInVario.stSenCarrInPos := "DB_Inputs".Sensors["cInBG3324"]; // MT in Position + #TRO421.stInVario.stSenJam := "DB_Inputs".Sensors["cInBG3320"]; // Jam Detector + + #TRO421.stInVario.Settings.xContinousEmptying := FALSE; + #TRO421.stInVario.Settings.tWaitForJog := T#400ms; + #TRO421.stInVario.Settings.tConvEmpty := T#30000ms; + #TRO421.stInVario.Settings.nCountCarrier := 1; + #TRO421.stInVario.Settings.tWaitForStop := T#3s; + + #TRO421.stInVario.Settings.xJamSenDelayActive := TRUE; + #TRO421.stInVario.Settings.tJamSenDelay := T#2s; + + #TRO421.stInVario.Settings.tCarrierInPosDelay := t#1200ms; + #TRO421.stInVario.Settings.tCarrierInPosEdgeDelay := t#100ms; + + #TRO421.stInPriorityManager.xReleaseOk := TRUE; //braucht keine Vorfahrtsregelung + + #TRO421.fbConvVario.xBeladenError := "DB_Inputs".Sensors["cInBG3325"].xDirectSensor; + + #TRO421(nInMainTroNo := "cMainTro421", + xInSftyOk := "DB_InterfaceSafety".stFromSafety.EStopMain.Q, + xInAllRdyToStart := TRUE, + xInAutomatic := #t_automatik, + xInReset := "cTodoFalse", + xInRelease := "DB_TRO_Test".TRO421, + xInMotorProtection := "FC0062", + stInStationSensor:="DB_Inputs".Sensors["cInBG3314"], + xInReleaseStation:= #"rTrig_Workstation 1".CLK, + arInOutJamEntr := "DB_JamArea4004".stJam4004_2.arCarrier, + stInOutJamEntr := "DB_JamArea4004".stJam4004_2.stData, + arInOutJamFinger := "DB_JamArea4005".stJam4005_1.arCarrier, + stInOutJamFinger := "DB_JamArea4005".stJam4005_1.stData, + stInOutMachineState := #stInOutControlUnitCabinet, + stInOutCognexInterface := #stCognexInterfaceDummy, + stInOutHMI := "DB_Interface_HMI".stTRO.TRO421, + nOutStateLast => "DB_GLOB_TroState".arTroState["cMainTro421"], + xOutStopper => "MB3326", + xOutVarioMotor => "MA0062"); +END_REGION diff --git a/doc/TRO_Katalog/scl_templates/FB_LoadingBoom_INBOUND.scl b/doc/TRO_Katalog/scl_templates/FB_LoadingBoom_INBOUND.scl new file mode 100644 index 0000000..df75c9c --- /dev/null +++ b/doc/TRO_Katalog/scl_templates/FB_LoadingBoom_INBOUND.scl @@ -0,0 +1,898 @@ +FUNCTION_BLOCK "FB_LoadingBoom_INBOUND" +{ S7_Optimized_Access := 'TRUE' } +VERSION : 0.1 + VAR_INPUT + stInControl : Struct // Bedienelemente + xBtnReleaseMT1 : Bool; // Taster 1 Freigabe für MT + xSwitchLoadingPos2 : Bool; // Knebelschalter Loading Pos 1 oder 2, true=2, false=1 + xBtnBack : Bool; // Taster "Einfahren" + xBtnForth : Bool; // Taster "Ausfahren" + xBtnReleaseMT2 : Bool; // Taster 2 Freigabe für MT + xSwitchFootUp : Bool; // Knebelschalter "Hochfahren" + xSwitchFootDown : Bool; // Knebelschalter "Runterfahren" + xSwitchLightOnOff : Bool; // Knebelschalter Licht AN/AUS + xBtnBoomActive : Bool; // Taster Ladeschleife AN/AUS + xBtnReset : Bool; // Taster Reset + xSwitchFootManual : Bool; // Schlüsselschalter "Stützfuß verfahren" + END_STRUCT; + stInBoom : Struct // In Signale für Ausleger + xMotorProtection1 : Bool; // Meldekontakt Motorschutzschalter Motor 1 + xMotorProtection2 : Bool; // **NIU**Meldekontakt Motorschutzschalter Motor 2 + xLimitForth : Bool; // Endlage Vorne normal + xLimitForthEmergency : Bool; // Endlage Vorne NOT (normal überschritten) + xLimitBack : Bool; // Endlage Hinten normal + xLimitBackEmergency : Bool; // Endlage Hinten NOT (normal überschritten) + xBumperOk : Bool; // Bumper Stirnseitig + END_STRUCT; + stInFoot : Struct // In Signale für Stützfuß + xMotorProtection : Bool; // Meldekontakt Motorschutzschalter Stützfuß + xLimitUp : Bool; // Obere Endlage + xLimitDown : Bool; // Untere Endlage + END_STRUCT; + stInSettings : Struct + tBoomInput : Time := T#3500ms; // Zeit für Bediener-Eingabe Boom + tWheelInput : Time := T#3500ms; // Zeit für Bediener-Eingabe Wheel + tWaitForMove : Time := T#2500ms; // Zeit die bei Bewegungswunsch gewartet wird + tSenWaitStopper1 : Time := T#300ms; // Wartezeit zwischen Sensor und Stopper Clamp + tWaitAfterReleaseStopper1 : Time := T#4000ms; // Wartezeit nach MT Release + tWaitBeforeSwitchStopper2 : Time := T#4000ms; + tTrailingStopper2 : Time := T#1500ms; // Zeit wie lange ohne Belegung offen sein muss + END_STRUCT; + stInTilt : Struct // Neigungssensorik + wTilt : Word; // Eingangswert von Sensor + xClock : Bool; // Frequenz für Mittelwert Ermittlung + tDiff : Time; // Solange muss Abweichung bestehen damit nachgeregelt wird + tZero : Time; // Solange muss ca. Null bestehen damit gestoppt wird + nDiff : Int; // Abweichung > oder < als nDiff? ---> Nachregeln + nZeroOk : Int; // Bereich um Null in welchem nachregeln aufgehört wird + xComp : Bool; // Flanke um Kompensationswert einzustellen + nTiltComp : Int; // Wert von User um Tilt zu kompensieren, +X um größer zu werden, -X um kleiner zu werden + END_STRUCT; + stInDistance : Struct // Signale für Distanzsensor + wDistance : Word; // Rohwerte von Sensor + nStartSlow : Int; // Unterhalb diesen Wertes wird langsam gefahren + nStartFast : Int; // Oberhalb diesen Wertes wird schnell gefahren + nDistanceZero : Int; // Abstand der für Bodenkontakt steht + nDiff : Int; // Dieser Wert +- ist die Grenze ab der ein Fehler generiert wird bei Bodenkontakt + tDiff : Time; // Zeit wie lange die Differenz ansteht bis ein Fehler generiert wird + xComp : Bool; // Teach Bit um die Werte beizubringen + END_STRUCT; + stInSen2mThreshold : "UDT_Sensor"; // Induktiver Sensor Position 2m, true= unter 2m. false=über 2m + stInSenJamEntr : "UDT_Sensor"; // Sensor Stau nach Vario am Eingang + stInSenJamExit1 : "UDT_Sensor"; // Sensor Stau vor Vario am Ausgang + stInSenJamExit2 : "UDT_Sensor"; // Sensor Stau am Ende von Vario + stInSenStopper1 : "UDT_Sensor"; // Sensor KURZ VOR Stopper 1 von Arbeitsplatz + stInSenStopper2 : "UDT_Sensor"; // Sensor IN Stopper 2 von Arbeitsplatz + stInSenGrid : "UDT_Sensor"; // Sensor "Karussell dreht sich" + xInMachineRunning : Bool; // Machine Running + xInTrolleyInSep : Bool; // Separator vor dem Stopper hat einen Trolley + xInSafety : Bool; // Safety ok + END_VAR + + VAR_OUTPUT + xOutLedMovement : Bool; // Orangene Warn Leuchte für Bewegung der Ladeschleife + xOutLight : Bool; // Beleuchtung Ladeschleife an der Decke + xOutBoomActive : Bool; // LS eingeschaltet, ready for use + xOutReady : Bool; // Bereit für TROs + xOutMoveReq : Bool; // Bereit um auf Bewegung der Ladeschleife umzuschalten + END_VAR + VAR_OUTPUT RETAIN + stOutStopper : Struct // Ausgänge Stopper allgemein + xStopper1Clamp : Bool; // Schiebe Stopper 1 vor + xStopper1Finger : Bool; // Schalte Stopper 1 runter + xStopper2 : Bool; // Öffne Stopper 2 + xStopperEmpty : Bool; // Stopperstatus leer + xStopperFreeEdge : Bool; // Flanke dass Stopper frei wird + xStopperReceive : Bool; // Flanke dass Stopper aufnehmen will + END_STRUCT; + END_VAR + VAR_OUTPUT + stOutBoom : Struct // Ausgänge Ladeschleife allgemein + xBoomForth1 : Bool; // Rausfahren Motor 1 + xBoomForth2 : Bool; // Rausfahren Motor 2 + xBoomBack1 : Bool; // Zurückfahren Motor 1 + xBoomBack2 : Bool; // Zurückfahren Motor 2 + END_STRUCT; + stOutFoot : Struct // Ausgänge Stützfuß allgemein + xFootUp : Bool; // Hochfahren + xFootDown : Bool; // Runterfahren + xFootSpeed1 : Bool; // Geschwindigkeit 1 (Kriechgang) + END_STRUCT; + xOutCarousel : Bool; // Rechtslauf drehen + nOutState : Int; // Zustand des Bausteins + xOutLedBumper : Bool; // LED Bumper ausgelöst + xOutStopperState : Bool; + END_VAR + + VAR_IN_OUT + arInOutCarrierStopper : Array[1..1] of "stCarrier"; // Carrierdaten im Stopper + arInOutCarrierExit : Array[*] of "stCarrier"; // Carrierdaten im Exitbereich + stInOutCarrierExit : "stJamData"; // JamStatus im Exitbereich + END_VAR + + VAR + fbTiltSensor : "FB_Tilt_TEST"; + fbDistanceFoot : "FB_DistanceFoot"; + fbWorkSation : "FB_BoomWorkStation"; + END_VAR + VAR RETAIN + nState : Int; + END_VAR + VAR + fbStateManager : "FB_StateManager"; + rTrigBoomActive {InstructionName := 'R_TRIG'; LibVersion := '1.0'} : R_TRIG; // Flanke von Ladeschleife einschalten + rTrigBtnForth {InstructionName := 'R_TRIG'; LibVersion := '1.0'} : R_TRIG; // Flanke für VOR-Taster + rTrigBtnBack {InstructionName := 'R_TRIG'; LibVersion := '1.0'} : R_TRIG; // Flanke für ZURÜCK-Taster + rTrigBtnReleaseMT {InstructionName := 'R_TRIG'; LibVersion := '1.0'} : R_TRIG; // Flanke für Taster 1 und 2 am Arbeitsplatz + rTrigBtnReset {InstructionName := 'R_TRIG'; LibVersion := '1.0'} : R_TRIG; // Flanke für Resettaster + rTrigLimitForth {InstructionName := 'R_TRIG'; LibVersion := '1.0'} : R_TRIG; // Flanke für Endlage Vorne + rTrigLimitForthEmergency {InstructionName := 'R_TRIG'; LibVersion := '1.0'} : R_TRIG; // Flanke für Endlage Vorne Rollenschalter + rTrigLimitBack {InstructionName := 'R_TRIG'; LibVersion := '1.0'} : R_TRIG; // Flanke für Endlage Hinten + rTrigLimitBackEmergency {InstructionName := 'R_TRIG'; LibVersion := '1.0'} : R_TRIG; // Flanke für Endlage Hinten Rollenschalter + rTrigLimitUp {InstructionName := 'R_TRIG'; LibVersion := '1.0'} : R_TRIG; // Flanke für Endlage Oben + rTrigLimitDown {InstructionName := 'R_TRIG'; LibVersion := '1.0'} : R_TRIG; // Flanke für Endlage Unten + rTrigStopperFull {InstructionName := 'R_TRIG'; LibVersion := '1.0'} : R_TRIG; // Flanke für das Einfahren in den Stopper + tOnBoomInput {InstructionName := 'TON_TIME'; LibVersion := '1.0'} : TON_TIME; // Timer der abläuft wenn länger keine Eingabe durch Bediener erfolgt + tOnFootInput {InstructionName := 'TON_TIME'; LibVersion := '1.0'} : TON_TIME; // Timer der abläuft wenn länger keine Eingabe durch Bediener erfolgt + END_VAR + VAR RETAIN + tOnStopper2 {InstructionName := 'TON_TIME'; LibVersion := '1.0'} : TON_TIME; // Timer für Stopper 2 Release + tOnStopper1 {InstructionName := 'TON_TIME'; LibVersion := '1.0'} : TON_TIME; // Timer für Stopper 1 Release + xBoomActive : Bool; // Ladeschleife ist eingeschaltet + xErrorLogical : Bool; // Fehlerbit Schrittkette + xErrorSensor : Bool; // **NIU**Fehlerbit Sensorik + xHightInvalid : Bool; // Höhenanpassung notwendig + xFloorReached : Bool; // Bodenhöhe erreicht für Schleichfahrt + xAbove2m : Bool; // Ausleger 2 m überschritten + xLight : Bool; // Lichtbit + xStopper1Active : Bool; // Stopper 1 ist aktiviert + xStopperBusy : Bool; // jeweiliger Stopper belegt + stTilt : Struct + nTiltRaw : Int; + nTiltMed : Int; + nTiltComp : Int; + xTiltPositive : Bool; // Neigungssensor zu hoch + xTiltNegative : Bool; // Neigungssensor zu niedrig + END_STRUCT; + END_VAR + + VAR_TEMP + stTmpActuator : Struct + xForth : Bool; + xBack : Bool; + xUp : Bool; + xDown : Bool; + xCarousel : Bool; + END_STRUCT; + xTmpReady : Bool; // Signal dass Ausleger einsatzbereit bereit + xTmpMoveReq : Bool; + xTmpActUnivTon : Bool; + xTmpMtOnTheWay : Bool; // Es wird MT an Stopper geschickt + END_VAR + + VAR CONSTANT + cStepOff : Int := 0; + cStepUndefined : Int := 100; + cStepIdle : Int := 200; + cStepStopper : Int := 250; + cStepWait : Int := 300; + cStepWaitForBoom : Int := 1000; + cStepMoveBoom : Int := 1500; + cStepWaitForFootMan : Int := 2000; + cStepMoveFootMan : Int := 2500; + cStepWaitForFootAutUp : Int := 3000; + cStepMoveFootAutUp : Int := 3500; + cStepWaitForFootAutDown : Int := 4000; + cStepMoveFootAutDown : Int := 4500; + cStepError : Int := 9999; + END_VAR + + +BEGIN + (* + Vor- und Zurückfahren: Nur manuell per Button. Nach Bumperauslösung nur zurück. + Normale induktive Endlagen melden Limit. Werden diese überfahren, dann kommt Rollenschalter der Strom abschaltet. + + Hoch- und Runterfahren: 4 Bit => 1 oder 2 entspr. L oder R, beide false oder beide true entspr. AUS. 3 oder 4 entspr. v1 oder v2, 3 und 4 entspr. v1+v2 + Nach induktivem 2m-Sensor -> automatisches Ausfahren + + Baustein managed: + - das Verfahren vor/zurück/hoch/runter + - die Logik für den Arbeitsplatz + - das Regeln des Auslegers + - den Zustand des Auslegers (bereit aufzunehmen, Anforderung das Teile benötigt werden, busy, Position des Auslegers, Stoppen aller MTROs wenn gerade verfahren wird, Kreisel fahren/stoppen) + + TROs auf dem Ausleger sind separat und kommunizieren extern mit ihm. Aufwand zu groß, die Schnittstellen der MainTROs nach außen zu führen, + sowie extra für Loading Boom alles extra mit SubTROs intern zu realisieren. + + -Wenn zu viel MT nach Vario sind, dann darf nicht zurückgefahren werden + -normaler Separator vor Arbeiter hat Scanner + -Am Arbeitsplatz NACH Separator ist ein besonderer Stopper an der Strinseite und danach zusätzlich ein einfacher Stopper (Sep mit nur einem Stachel) + -Wird begonnen seitlich -> MT fährt an offenem ersten Stopper vorbei und Taster 1 lässt MT am zweiten Stopper raus + -Später wenn Boom weiter draußen ist wird am geschlossnem ersten Stopper gearbeitet und MT mit Taster 2 rausgelassen, worauf MT danach durch offenen zweiten Stopper fährt + *) + + REGION Eingänge + (* + Beispiel: + c==========================Ausleger + |___ Abstand zu Boden 2 m + | + |___ Abstand zu Boden 60cm (>= 60cm schnell fahren - xFloorReachedEnd) + | + |___ Abstand zu Boden 50cm (<= 40cm langsam fahren - xFloorReachedStart) + | + O + + ///////////////////////////////Boden + *) + + IF #fbDistanceFoot.xOutBelowThreshold(* #stInFoot.xFloorReachedStart *) THEN + #xFloorReached := TRUE; + ELSIF #fbDistanceFoot.xOutAboveThreshold (* #stInFoot.xFloorReachedEnd *) THEN + #xFloorReached := FALSE; + END_IF; + + //ab 2 m ist Verwendung des Stützrades notwenig + // #x2mReached := #stInSen2mThreshold.xDbncdSensor; //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! Regelung für Foot außerhalb von Schrittkette mit FB aufrufen!!!!!!!!!!!!! + IF (#stInSen2mThreshold.xDbncdEdgeNeg AND #stInControl.xBtnForth) OR (NOT #stInSen2mThreshold.xDbncdSensor AND #stInSen2mThreshold.tDirectChangeLast > T#500ms) THEN + #xAbove2m := TRUE; //provisorisch + ELSIF (#stInSen2mThreshold.xDbncdEdgePos AND #stInControl.xBtnBack) OR (#stInSen2mThreshold.xDbncdSensor AND #stInSen2mThreshold.tDirectChangeLast > T#500ms) THEN + #xAbove2m := FALSE; + // ELSIF #rTrigBtnBack.Q OR #rTrigBtnForth.Q THEN + // #xAbove2m := FALSE; //provisorisch + END_IF; + + REGION Flanken + + #rTrigBoomActive(CLK:=#stInControl.xBtnBoomActive); //Ladeschleife einschalten + + #rTrigBtnForth(CLK := #stInControl.xBtnForth); //Flanke für VOR-Taster + #rTrigBtnBack(CLK := #stInControl.xBtnBack); //Flanke für ZURÜCK-Taster + #rTrigBtnReleaseMT(CLK := #stInControl.xBtnReleaseMT1 OR #stInControl.xBtnReleaseMT2); //Flanke für Taster 1 und 2 am Arbeitsplatz + #rTrigBtnReset(CLK := #stInControl.xBtnReset); //Flanke für Resettaster + + #rTrigLimitForth(CLK := #stInBoom.xLimitForth); //Flanke für Endlage Vorne + #rTrigLimitForthEmergency(CLK := #stInBoom.xLimitForthEmergency); //Flanke für Endlage Vorne Rollenschalter + #rTrigLimitBack(CLK := #stInBoom.xLimitBack); //Flanke für Endlage Hinten + #rTrigLimitBackEmergency(CLK := #stInBoom.xLimitBackEmergency); //Flanke für Endlage Hinten Rollenschalter + #rTrigLimitUp(CLK := #stInFoot.xLimitUp); //Flanke für Endlage Oben + #rTrigLimitDown(CLK := #stInFoot.xLimitDown); //Flanke für Endlage Unten + END_REGION + + END_REGION + + REGION Timer + //In Schritt MoveBoom wird Eingabe erwartet, wenn nichts kommt -> Schrittwechsel + #tOnBoomInput(IN := #nState = #cStepMoveBoom AND NOT #stInControl.xBtnForth AND NOT #stInControl.xBtnBack, + PT := #stInSettings.tBoomInput); + + //In Schritt MoveWheel wird Eingabe erwartet, wenn nichts kommt -> Schrittwechsel + #tOnFootInput(IN := #nState = #cStepMoveFootMan AND NOT #stInControl.xSwitchFootUp AND NOT #stInControl.xSwitchFootDown, + PT := #stInSettings.tWheelInput); + + // #tOnStopper1(IN:=#xStopper1Active AND #fbStopper1.nOutState >= 500, + // PT:=_time_in_); + + END_REGION + + REGION Distance Sensor + //IBN + // IF #fbDistanceFoot.nDistanceZero = 0 THEN + // //Entsrpicht in LL ungefähr dem Distance Abstand am Boden + // #fbDistanceFoot.nDistanceZero := 2460; + // END_IF; + // IF #fbDistanceFoot.nDiff = 0 THEN + // #fbDistanceFoot.nDiff := 50; + // END_IF; + //IBN + + #fbDistanceFoot(xInUp:=#stOutFoot.xFootUp, + xInDown:=#stOutFoot.xFootDown, + wInDistance := #stInDistance.wDistance, + nInStartSlow := #stInDistance.nStartSlow, // Format z.B. 2799 für 2799mm + nInStartFast := #stInDistance.nStartFast, + nInDistanceZero := #stInDistance.nDistanceZero, + nInDiff := #stInDistance.nDiff, + tInDiff := #stInDistance.tDiff, + xInComp := #stInDistance.xComp, + xInOver2m := NOT #stInSen2mThreshold.xDbncdSensor); + // nOutDistance => "IBN".nDistance); VERSCHALTEN!!!!!!!! + END_REGION + + REGION Logik Regelung / Neigung + + //Ab Winkel +-X starte Nachregeln + // #xHightInvalid := "cTodoFalse"; //Höhenanpassung notwendig - to do + + #fbTiltSensor.stInSettings.tDiff := #stInTilt.tDiff;//"DB_Interface_HMI_INBOUND".stBoomData1.tDiff; + #fbTiltSensor.stInSettings.tZero := #stInTilt.tZero;//"DB_Interface_HMI_INBOUND".stBoomData1.tZero; + #fbTiltSensor.stInSettings.nDiff := #stInTilt.nDiff;//"DB_Interface_HMI_INBOUND".stBoomData1.nTiltAbweichung; + #fbTiltSensor.stInSettings.nZeroOk := #stInTilt.nZeroOk;//"DB_Interface_HMI_INBOUND".stBoomData1.nTiltBereichZero; + #fbTiltSensor.stInSettings.xComp := #stInTilt.xComp;//"DB_Interface_HMI_INBOUND".stBoomData1.xComp; + #fbTiltSensor.stInSettings.nTiltComp := #stInTilt.nTiltComp;//"DB_Interface_HMI_INBOUND".stBoomData1.nTiltNullen; + #fbTiltSensor(wInTilt := #stInTilt.wTilt, //"wTiltSensor" + xInClock := #stInTilt.xClock, //"Clock_10Hz",// + xInTiltActive:= NOT #stInSen2mThreshold.xDbncdSensor,//"DB_Interface_HMI_INBOUND".stBoomData1.xTiltÜberwachungActive, + xInTiltAdjust:= #nState = #cStepWait); + + #stTilt.nTiltMed := #fbTiltSensor.stOutTilt.nTiltCompMed; + + #xHightInvalid := #fbTiltSensor.xOutToHigh OR #fbTiltSensor.xOutToLow; + + + //Format 1/100 Grad + //Beispiel: + //+4 = +0.04 Grad + //+14 = +0.14 Grad + //+114 = +1.14 Grad + //etc. + + END_REGION + + REGION Schrittkette + CASE #nState OF + #cStepOff: + REGION 000: Off + #nOutState := #cStepOff; + + #stTmpActuator.xForth := FALSE; + #stTmpActuator.xBack := FALSE; + #stTmpActuator.xUp := FALSE; + #stTmpActuator.xDown := FALSE; + #stTmpActuator.xCarousel := FALSE; + + #xTmpReady := FALSE; + #xTmpMoveReq := FALSE; + END_REGION + + #cStepUndefined: + REGION 100: Undefined + #nOutState := #cStepUndefined; + + #stTmpActuator.xForth := FALSE; + #stTmpActuator.xBack := FALSE; + #stTmpActuator.xUp := FALSE; + #stTmpActuator.xDown := FALSE; + #stTmpActuator.xCarousel := FALSE; + + #xTmpReady := FALSE; + #xTmpMoveReq := FALSE; + ////////////////////////////////////// + + + IF NOT #xErrorLogical AND #fbStateManager.tOutTimeInStep > T#1000ms THEN + #nState := #cStepIdle; + END_IF; + END_REGION + + #cStepIdle: + REGION 200: Idle + //Idle Zustand in welchem Kreisel bereit ist und die MTROs normal arbeiten können + #nOutState := #cStepIdle; + + #stTmpActuator.xForth := FALSE; + #stTmpActuator.xBack := FALSE; + #stTmpActuator.xUp := FALSE; + #stTmpActuator.xDown := FALSE; + #stTmpActuator.xCarousel := FALSE; + + #xTmpReady := TRUE; + #xTmpMoveReq := FALSE; + /////////////////////////////////////// + + IF ((#rTrigBtnBack.Q AND NOT #stInBoom.xLimitBack) OR (#rTrigBtnForth.Q AND NOT #stInBoom.xLimitForth) OR NOT #stInBoom.xBumperOk) AND + NOT #fbWorkSation.xOutStationMovement THEN + #nState := #cStepWaitForBoom; + END_IF; + + IF (#stInControl.xSwitchFootManual AND ((#stInControl.xSwitchFootUp AND NOT #stInFoot.xLimitUp) OR (#stInControl.xSwitchFootDown AND NOT #stInFoot.xLimitDown (* AND NOT #fbDistanceFoot.xOutGroundContact *)))) AND + NOT #fbWorkSation.xOutStationMovement THEN + #nState := #cStepWaitForFootMan; + END_IF; + + // IF #xStopperBusy THEN + // #xTmpMtOnTheWay := TRUE; + // #nState := #cStepStopper; + // END_IF; + + // IF #xHightInvalid THEN + // #nState := #cStepWait; + // END_IF; + + IF #xErrorLogical THEN + #nState := #cStepError; + END_IF; + END_REGION + + // #cStepStopper: + // REGION 250: Stopper arbeitet + // // Warten für Stopperarbeit + // #nOutState := #cStepStopper; + + // #stTmpActuator.xForth := FALSE; + // #stTmpActuator.xBack := FALSE; + // #stTmpActuator.xUp := FALSE; + // #stTmpActuator.xDown := FALSE; + // #stTmpActuator.xCarousel := FALSE; + + // #xTmpReady := TRUE; + // #xTmpMoveReq := FALSE; + // ////////////////////////////////////////////// + + // // IF NOT #xHightInvalid THEN + // // #nState := #cStepMoveBoom;//#cStepUndefined; + // // END_IF; + + // // AND NOT #fbWorkSation.xOutStationMovement .... + + + // // IF ((#rTrigBtnBack.Q AND NOT #stInBoom.xLimitBack) OR (#rTrigBtnForth.Q AND NOT #stInBoom.xLimitForth) OR NOT #stInBoom.xBumperOk) AND + // // ((#xStopper1Active AND NOT #fbStopper1.xOutStopper) OR (NOT #xStopper1Active AND NOT #fbStopper2.xOutStopper)) THEN + // // #nState := #cStepWaitForBoom; + // // END_IF; + + // // IF (#stInControl.xSwitchFootManual AND ((#stInControl.xSwitchFootUp AND NOT #stInFoot.xLimitUp) OR (#stInControl.xSwitchFootDown AND NOT #stInFoot.xLimitDown AND NOT #fbDistanceFoot.xOutGroundContact))) AND + // // ((#xStopper1Active AND NOT #fbStopper1.xOutStopper) OR (NOT #xStopper1Active AND NOT #fbStopper2.xOutStopper)) THEN + // // #nState := #cStepWaitForFootMan; + // // END_IF; + + // // IF (NOT #xStopper1Active AND #fbStopper2.xOutReleaseDone) OR + // // (#xStopper1Active AND #fbStopper1.xOutReleaseDone) THEN + // // #xStopperBusy := FALSE; + // // #xTmpStopperFreeEdge := TRUE; + // // #nState := #cStepIdle; + // // END_IF; + + // IF #xErrorLogical THEN + // #nState := #cStepError; + // END_IF; + // END_REGION + + #cStepWait: + REGION 300: Wait + // Warten für Zustandswechsel + #nOutState := #cStepWait; + + #stTmpActuator.xForth := FALSE; + #stTmpActuator.xBack := FALSE; + #stTmpActuator.xUp := #fbTiltSensor.xOutToHigh; + #stTmpActuator.xDown := #fbTiltSensor.xOutToLow; + #stTmpActuator.xCarousel := FALSE; + + #xTmpReady := FALSE; + #xTmpMoveReq := FALSE; + ////////////////////////////////////////////// + + IF NOT #xHightInvalid THEN + #nState := #cStepMoveBoom;//#cStepUndefined; + END_IF; + + IF #xErrorLogical THEN + #nState := #cStepError; + END_IF; + END_REGION + + #cStepWaitForBoom: + REGION 1000: Wait for Boom + #nOutState := #cStepWaitForBoom; + + #stTmpActuator.xForth := FALSE; + #stTmpActuator.xBack := FALSE; + #stTmpActuator.xUp := FALSE; + #stTmpActuator.xDown := FALSE; + #stTmpActuator.xCarousel := FALSE; + + #xTmpReady := FALSE; + #xTmpMoveReq := TRUE; + /////////////////////////////////////////////// + + + IF #fbStateManager.tOutTimeInStep > #stInSettings.tWaitForMove OR NOT #stInBoom.xBumperOk THEN + #nState := #cStepMoveBoom; + END_IF; + + // IF #xHightInvalid THEN + // #nState := #cStepWait; + // END_IF; + + IF #xErrorLogical THEN + #nState := #cStepError; + END_IF; + END_REGION + + #cStepMoveBoom: + REGION 1500: Move Boom + #nOutState := #cStepMoveBoom; + + #stTmpActuator.xForth := #stInControl.xBtnForth AND NOT #stInControl.xBtnBack AND NOT #stInBoom.xLimitForth AND NOT #fbDistanceFoot.xOutError AND ((NOT #xAbove2m AND #stInFoot.xLimitUp) OR (#xAbove2m AND #fbDistanceFoot.xOutGroundContact)); + #stTmpActuator.xBack := #stInControl.xBtnBack AND NOT #stInControl.xBtnForth AND NOT #stInBoom.xLimitBack AND NOT #fbDistanceFoot.xOutError AND ((NOT #xAbove2m AND #stInFoot.xLimitUp) OR (#xAbove2m AND #fbDistanceFoot.xOutGroundContact)); + #stTmpActuator.xUp := FALSE; + #stTmpActuator.xDown := FALSE; + #stTmpActuator.xCarousel := FALSE; + + #xTmpReady := FALSE; + #xTmpMoveReq := FALSE; + //////////////////////////////////////////// + + // IF #stInLimitBoom.stSenThreshold.xDbncdSensor + + IF #tOnBoomInput.Q AND #stInBoom.xBumperOk THEN + #nState := #cStepIdle; + END_IF; + + IF #stInSen2mThreshold.xDbncdEdgeNeg AND #stInControl.xBtnForth THEN + #nState := #cStepWaitForFootAutDown; + END_IF; + + IF (#stInSen2mThreshold.xDbncdEdgePos AND #stInControl.xBtnBack) OR + (#stInSen2mThreshold.xDirectSensor AND NOT #stInFoot.xLimitUp AND #stInControl.xBtnBack) THEN + #nState := #cStepWaitForFootAutUp; + END_IF; + + IF #xHightInvalid THEN + #nState := #cStepWait; + END_IF; + + IF #xErrorLogical THEN + #nState := #cStepError; + END_IF; + END_REGION + + #cStepWaitForFootMan: + REGION 2000: Wait for Foot Manually + #nOutState := #cStepWaitForFootMan; + + #stTmpActuator.xForth := FALSE; + #stTmpActuator.xBack := FALSE; + #stTmpActuator.xUp := FALSE;//#stInControl.xSwitchFootUp AND NOT #stInControl.xSwitchFootDown AND NOT #stInFoot.xLimitUp; + #stTmpActuator.xDown := FALSE;//#stInControl.xSwitchFootDown AND NOT #stInControl.xSwitchFootUp AND NOT #stInFoot.xLimitDown; + #stTmpActuator.xCarousel := FALSE; + + #xTmpReady := FALSE; + #xTmpMoveReq := TRUE; + /////////////////////////////////////////////// + + IF NOT #stInControl.xSwitchFootManual THEN + #nState := #cStepIdle; + END_IF; + + IF #fbStateManager.tOutTimeInStep > #stInSettings.tWaitForMove THEN + #nState := #cStepMoveFootMan; + END_IF; + + // IF #xHightInvalid THEN + // #nState := #cStepWait; + // END_IF; + + IF #xErrorLogical THEN + #nState := #cStepError; + END_IF; + END_REGION + + #cStepMoveFootMan: + REGION 2500: Move Foot Manually + #nOutState := #cStepMoveFootMan; + + #stTmpActuator.xForth := FALSE; + #stTmpActuator.xBack := FALSE; + #stTmpActuator.xUp := #stInControl.xSwitchFootUp AND NOT #stInControl.xSwitchFootDown AND NOT #stInFoot.xLimitUp; + #stTmpActuator.xDown := #stInControl.xSwitchFootDown AND NOT #stInControl.xSwitchFootUp AND NOT #stInFoot.xLimitDown(* AND NOT #fbDistanceFoot.xOutGroundContact *); + #stTmpActuator.xCarousel := FALSE; + + #xTmpReady := FALSE; + #xTmpMoveReq := FALSE; + ///////////////////////////////////////////// + + + IF #tOnFootInput.Q OR NOT #stInControl.xSwitchFootManual THEN + #nState := #cStepIdle; + END_IF; + + // IF #xHightInvalid THEN + // #nState := #cStepWait; + // END_IF; + + IF #xErrorLogical THEN + #nState := #cStepError; + END_IF; + END_REGION + + + #cStepWaitForFootAutUp: + REGION 3000: Wait for Foot Automatic Up + #nOutState := #cStepWaitForFootAutUp; + + #stTmpActuator.xForth := FALSE; + #stTmpActuator.xBack := FALSE; + #stTmpActuator.xUp := FALSE; + #stTmpActuator.xDown := FALSE; + #stTmpActuator.xCarousel := FALSE; + + #xTmpReady := FALSE; + #xTmpMoveReq := FALSE; + /////////////////////////////////////////////// + + IF #fbStateManager.tOutTimeInStep > #stInSettings.tWaitForMove THEN + #nState := #cStepMoveFootAutUp; + END_IF; + + // IF #xHightInvalid THEN + // #nState := #cStepWait; + // END_IF; + + IF #xErrorLogical THEN + #nState := #cStepError; + END_IF; + END_REGION + + #cStepMoveFootAutUp: + REGION 3500: Move Foot Automatic Up + #nOutState := #cStepMoveFootAutUp; + + #stTmpActuator.xForth := FALSE; + #stTmpActuator.xBack := FALSE; + #stTmpActuator.xUp := NOT #stInFoot.xLimitUp; + #stTmpActuator.xDown := FALSE; + #stTmpActuator.xCarousel := FALSE; + + #xTmpReady := FALSE; + #xTmpMoveReq := FALSE; + ///////////////////////////////////////////// + + //Nur zum Testen dieses IF + IF #stInFoot.xLimitUp THEN + #nState := #cStepIdle; + END_IF; + + // IF #xHightInvalid THEN + // #nState := #cStepWait; + // END_IF; + + IF #xErrorLogical THEN + #nState := #cStepError; + END_IF; + END_REGION + + #cStepWaitForFootAutDown: + REGION 4000: Wait for Foot Automatic Down + #nOutState := #cStepWaitForFootAutDown; + + #stTmpActuator.xForth := FALSE; + #stTmpActuator.xBack := FALSE; + #stTmpActuator.xUp := FALSE; + #stTmpActuator.xDown := FALSE; + #stTmpActuator.xCarousel := FALSE; + + #xTmpReady := FALSE; + #xTmpMoveReq := FALSE; + /////////////////////////////////////////////// + + IF #fbStateManager.tOutTimeInStep > #stInSettings.tWaitForMove THEN + #nState := #cStepMoveFootAutDown; + END_IF; + + // IF #xHightInvalid THEN + // #nState := #cStepWait; + // END_IF; + + IF #xErrorLogical THEN + #nState := #cStepError; + END_IF; + END_REGION + + #cStepMoveFootAutDown: + REGION 4500: Move Foot Automatic Down + #nOutState := #cStepMoveFootAutDown; + + #stTmpActuator.xForth := FALSE; + #stTmpActuator.xBack := FALSE; + #stTmpActuator.xUp := FALSE; + #stTmpActuator.xDown := NOT (#fbDistanceFoot.nOutDistance <= 2460 AND #fbDistanceFoot.nOutDistance >= 2455) AND #stInControl.xBtnForth; + #stTmpActuator.xCarousel := FALSE; + + #xTmpReady := FALSE; + #xTmpMoveReq := FALSE; + ///////////////////////////////////////////// + + + IF #fbDistanceFoot.nOutDistance <= 2460 AND #fbDistanceFoot.nOutDistance >= 2455 THEN + #nState := #cStepIdle; + END_IF; + + // IF #xHightInvalid THEN + // #nState := #cStepWait; + // END_IF; + + IF #xErrorLogical THEN + #nState := #cStepError; + END_IF; + END_REGION + + #cStepError: + REGION 9999: Error + #nOutState := #cStepError; + + #stTmpActuator.xForth := FALSE; + #stTmpActuator.xBack := FALSE; + #stTmpActuator.xUp := FALSE; + #stTmpActuator.xDown := FALSE; + #stTmpActuator.xCarousel := FALSE; + + #xTmpReady := FALSE; + #xTmpMoveReq := FALSE; + ///////////////////////////////////////////////// + + + IF NOT #xErrorLogical THEN + #nState := #cStepUndefined; + END_IF; + END_REGION + + ELSE // Statement section ELSE + #stTmpActuator.xForth := FALSE; + #stTmpActuator.xBack := FALSE; + #stTmpActuator.xUp := FALSE; + #stTmpActuator.xDown := FALSE; + #stTmpActuator.xCarousel := FALSE; + + #xTmpReady := FALSE; + #xTmpMoveReq := FALSE; + + #nState := #cStepUndefined; + END_CASE; + END_REGION + + REGION State Manager + + IF #rTrigBoomActive.Q AND #xInMachineRunning AND #xInSafety(* AND NOT #xAbove2m AND #stInBoom.xLimitBack AND #stInFoot.xLimitUp AND NOT #xErrorLogical *) THEN + // IF #nState = #cStepIdle THEN + #xBoomActive := NOT #xBoomActive; + // END_IF; + ELSIF NOT #xInMachineRunning OR NOT #xInSafety THEN + #xBoomActive := FALSE; + END_IF; + + #fbStateManager.stInSettings.nStartState := #cStepUndefined; + #fbStateManager.stInSettings.xActUnivTOn := TRUE; + #fbStateManager.stInSettings.xRestartAtStartState := FALSE; + #fbStateManager(xInFunctionEnabled := #xBoomActive,// stInControl.xBtnBoomActive + xInRunUnivTOn := #xTmpActUnivTon, + nInOutState := #nState); + END_REGION + + + REGION Stopper Arbeitsplatz + + #fbWorkSation(xInRunning := #xBoomActive, + xInSwitchPosition2 := #stInControl.xSwitchLoadingPos2, + xInReceivingMT := #xInTrolleyInSep, + xInReleaseMT := #rTrigBtnReleaseMT.Q AND #nState = #cStepIdle, + stInSenStopper1 := #stInSenStopper1, + stInSenStopper2 := #stInSenStopper2, + stInSenJamExit1:= #stInSenJamExit1, + stInSenJamExit2:= #stInSenJamExit2, + tInSenWaitStopper1 := #stInSettings.tSenWaitStopper1, + tInWaitAfterReleaseStopper1 := #stInSettings.tWaitAfterReleaseStopper1, + tInWaitBeforeSwitchStopper2:=#stInSettings.tWaitBeforeSwitchStopper2, + tInTrailingStopper2 := #stInSettings.tTrailingStopper2, + // xOutReadyForReceiving => #stOutStopper.xStopperReceive, + xOutStopper1Clamp => #stOutStopper.xStopper1Clamp, + xOutStopper1 => #stOutStopper.xStopper1Finger, + xOutStopper2 => #stOutStopper.xStopper2, + arInOutCarrierStopper := #arInOutCarrierStopper, + arInOutCarrierExit := #arInOutCarrierExit, + stInOutCarrierExit:= #stInOutCarrierExit); + + #xOutStopperState := #fbWorkSation.xStopperFull; + + // #rTrigStopperFull(CLK:=#arInOutCarrierStopper[1].bStatus.%X0 OR #xInTrolleyInSep); + // IF #rTrigStopperFull.Q THEN + // #xStopperBusy := TRUE; + // //wird in Schrittkette zurückgesetzt + // END_IF; + + // IF #nState = #cStepIdle THEN + + // IF #stInControl.xSwitchLoadingPos1 AND NOT #xStopperBusy THEN + // #xStopper1Active := TRUE; + // ELSIF NOT #stInControl.xSwitchLoadingPos1 AND NOT #xStopperBusy THEN + // #xStopper1Active := FALSE; + // END_IF; + + // END_IF; + + + + // #fbStopper1(stInSensor := #stInSenStopper1, + // stInSensorNext:=#stInSenStopper2, + // tInSenWait := #stInSettings.tStopper1SenWait,//T#300ms, + // tInWaitAfterRelease := #stInSettings.tStopper1WaitAfterRelease,//T#4000ms, + // xInActive:=#xStopper1Active, + // xInSwitchReq:=NOT #stInControl.xSwitchLoadingPos1, + // xInRelease := #rTrigBtnReleaseMT.Q AND #nState = #cStepStopper, + // xInReceive := #xTmpMtOnTheWay, + // xOutClamp => #stOutStopper.xStopper1Clamp, + // xOutStopper => #stOutStopper.xStopper1Finger); + + // #fbStopper2(stInSensor := #stInSenStopper2, + // tInTrailing := #stInSettings.tStopper2Trailing,//T#1500ms, + // xInActive := NOT #xStopper1Active, + // xInRelease := #rTrigBtnReleaseMT.Q AND #nState = #cStepStopper, + // xInReceive := #xTmpMtOnTheWay, + // xOutStopper => #stOutStopper.xStopper2); + + END_REGION + REGION Fehler Handling + + IF (* NOT #xInSafety OR *) NOT #stInBoom.xMotorProtection1 OR NOT #stInFoot.xMotorProtection OR + #fbTiltSensor.xOutTeachNec OR #fbDistanceFoot.xOutTeachNec OR + (#stInBoom.xLimitForth AND #stInBoom.xLimitBack) OR + (#stInBoom.xLimitForthEmergency AND #stInBoom.xLimitBackEmergency) OR + (#stInFoot.xLimitUp AND #stInFoot.xLimitDown) OR + (#stTmpActuator.xForth AND (#rTrigLimitBack.Q OR #rTrigLimitBackEmergency.Q OR #rTrigLimitForthEmergency.Q)) OR + (#stTmpActuator.xBack AND (#rTrigLimitForth.Q OR #rTrigLimitForthEmergency.Q OR #rTrigLimitBackEmergency.Q)) OR + (#stTmpActuator.xUp AND #rTrigLimitDown.Q) OR + (#stTmpActuator.xDown AND #rTrigLimitUp.Q) THEN + #xErrorLogical := TRUE; //Fehler + ELSIF #xInSafety AND #stInBoom.xMotorProtection1 AND #stInFoot.xMotorProtection AND #stInControl.xBtnReset THEN + #xErrorLogical := FALSE; + END_IF; + + END_REGION + + REGION Ausgänge + + REGION Licht / Leuchtmelder + // IF #rTrigBtnLight.Q THEN + // #xLight := NOT #xLight; + // END_IF; + + //Licht an-/ausschalten am Arbeitsplatz + #xOutLight := #xLight := #stInControl.xSwitchLightOnOff; + + //LED Boom ready for use + #xOutBoomActive := #xBoomActive; + + #xOutLedMovement := + //Dauerleuchten=Boom wartet und Sep stoppt + //Langsam blinken=Nivellieren + //Schnell blinken=Boom oder Foot fährt + //Sehr schnell blinken = Endlage bereits erreicht + (#nState = #cStepWaitForBoom OR #nState = #cStepWaitForFootMan OR #nState = #cStepWaitForFootAutDown OR #nState = #cStepWaitForFootAutUp) OR + (#nState = #cStepWait AND "Clock_1Hz") OR + ((#nState = #cStepMoveBoom OR #nState = #cStepMoveFootMan OR #nState = #cStepMoveFootAutUp OR #nState = #cStepMoveFootAutDown) AND "Clock_2.5Hz") OR + (((#nState = #cStepIdle (* OR #nState = #cStepStopper *)) AND ((#stInControl.xBtnBack AND #stInBoom.xLimitBack) OR (#stInControl.xBtnForth AND #stInBoom.xLimitForth) OR (#stInControl.xSwitchFootDown AND #fbDistanceFoot.xOutGroundContact AND #stInControl.xSwitchFootManual) OR (#stInControl.xSwitchFootUp AND #stInFoot.xLimitUp AND #stInControl.xSwitchFootManual))) AND "Clock_10Hz"); + + #xOutLedBumper := NOT #stInBoom.xBumperOk; + END_REGION + + REGION Antriebe + + #xOutCarousel := #stTmpActuator.xCarousel; + + #stOutBoom.xBoomForth2 := #stOutBoom.xBoomForth1 := #stTmpActuator.xForth AND #stInBoom.xBumperOk; + #stOutBoom.xBoomBack2 := #stOutBoom.xBoomBack1 := #stTmpActuator.xBack; + + // #xOutFoot400V := "cTodoFalse"; //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + #stOutFoot.xFootUp := #stTmpActuator.xUp; + #stOutFoot.xFootDown := #stTmpActuator.xDown; + IF #xFloorReached THEN //Boden erreicht + #stOutFoot.xFootSpeed1 := TRUE; //langsam + // #xOutFootSpeed2 := FALSE; //schnell NIU + ELSE //Boden noch nicht erreicht + #stOutFoot.xFootSpeed1 := FALSE; //langsam + // #xOutFootSpeed2 := TRUE; //schnell NIU + END_IF; + END_REGION + + #xOutReady := #xTmpReady; + #xOutMoveReq := #xTmpMoveReq; + + #stOutStopper.xStopperEmpty := NOT #xStopperBusy; + #stOutStopper.xStopperReceive := #nState = #cStepIdle AND NOT #fbWorkSation.xOutStationMovement AND #fbWorkSation.xOutReadyForReceiving; + + END_REGION + +END_FUNCTION_BLOCK + diff --git a/doc/TRO_Katalog/tro_graphs/1sep.svg b/doc/TRO_Katalog/tro_graphs/1sep.svg new file mode 100644 index 0000000..01ca9ed --- /dev/null +++ b/doc/TRO_Katalog/tro_graphs/1sep.svg @@ -0,0 +1,25 @@ + +1Sep - standard separator + + + + + +1Sep +FB_ILS_MTRO_1Sep + + +Entry JamArea + +1Sep +Stopper MB · sensor BG + +Exit JamArea + + +in + + +release +one entry → one exit; holds carrier at the stopper, releases one + diff --git a/doc/TRO_Katalog/tro_graphs/1sep1swi.svg b/doc/TRO_Katalog/tro_graphs/1sep1swi.svg new file mode 100644 index 0000000..ee73e73 --- /dev/null +++ b/doc/TRO_Katalog/tro_graphs/1sep1swi.svg @@ -0,0 +1,31 @@ + +1Sep1Swi - separator + 1 switch + + + + + + +1Sep1Swi +FB_ILS_MTRO_1Sep1Swi + + +Entry JamArea + +1Sep1Swi +Stopper + Switch + +Exit · Dir1 + +Exit · Dir2 + + +in + + +Dir1 + + +Dir2 +switch routes to two exits; direction from FC_Direction + diff --git a/doc/TRO_Katalog/tro_graphs/1sep2swi.svg b/doc/TRO_Katalog/tro_graphs/1sep2swi.svg new file mode 100644 index 0000000..a1816fb --- /dev/null +++ b/doc/TRO_Katalog/tro_graphs/1sep2swi.svg @@ -0,0 +1,43 @@ + +1Sep2Swi - separator + 2 switches + + + + + + + + +1Sep2Swi +FB_ILS_MTRO_1Sep2Swi + + +Entry JamArea + +Scanner (barcode) + +1Sep2Swi +Stopper + 2 switches + +Exit 2 · dir + +Exit 3 + +Exit 4 + + +in + + +scan + + +exit2 + + +exit3 + + +exit4 +two switches → up to three routed exits + entry scanner + diff --git a/doc/TRO_Katalog/tro_graphs/1sep_sscc.svg b/doc/TRO_Katalog/tro_graphs/1sep_sscc.svg new file mode 100644 index 0000000..035d848 --- /dev/null +++ b/doc/TRO_Katalog/tro_graphs/1sep_sscc.svg @@ -0,0 +1,31 @@ + +1Sep_SSCC - separator + SSCC scanner + + + + + + +1Sep_SSCC +FB_ILS_MTRO_1Sep_SSCC + + +Entry JamArea + +1Sep_SSCC +Barcode + SSCC + end-meas. + +Exit JamArea + +WCS / WES + + +in + + +release + + +DReqM +1Sep + second SSCC scanner + dock-request telegram to WCS + diff --git a/doc/TRO_Katalog/tro_graphs/2sep1swi.svg b/doc/TRO_Katalog/tro_graphs/2sep1swi.svg new file mode 100644 index 0000000..e788c81 --- /dev/null +++ b/doc/TRO_Katalog/tro_graphs/2sep1swi.svg @@ -0,0 +1,32 @@ + +2Sep1Swi - unused concept block + + + + + + +2Sep1Swi +FB_ILS_MTRO_2Sep1Swi + + +Entry 1 + +Entry 2 + +2Sep1Swi +2 separators + switch + +Exit 2 + +Exit 3 + + + + +exit2 + + +exit3 +prepared but never instantiated in any FB_Main (concept only) + diff --git a/doc/TRO_Katalog/tro_graphs/edge_legend.svg b/doc/TRO_Katalog/tro_graphs/edge_legend.svg new file mode 100644 index 0000000..ab85da6 --- /dev/null +++ b/doc/TRO_Katalog/tro_graphs/edge_legend.svg @@ -0,0 +1,36 @@ + +Edge / connection line-type legend + + + + + + + + + + +Connection line types + + +normal +standard transfer (jam area to jam area) + +dir2 +switch output, direction 2 (FC_Direction) + +dir3 +switch output, direction 3 (FC_Direction) + +bypass +bypass around a storage block (PinStore) + +finger +chain-conveyor finger / index transfer + +PLC +PLC / WCS boundary, telegram or handshake + +EXTERN +infeed / outfeed to another PLC (EXTERN) + diff --git a/doc/TRO_Katalog/tro_graphs/emptycarrbuffer.svg b/doc/TRO_Katalog/tro_graphs/emptycarrbuffer.svg new file mode 100644 index 0000000..8dc6210 --- /dev/null +++ b/doc/TRO_Katalog/tro_graphs/emptycarrbuffer.svg @@ -0,0 +1,37 @@ + +EmptyCarrBuffer - empty carrier buffer + + + + + + +EmptyCarrBuffer +FB_EmptyCarrBuffer + + +inTro · borner + +EmptyCarrBuffer +distribution switch + +Line 1 + +Line 2 + +Line n + +Exit JamArea + + +in + + + + +lines + + +exit +multi-line buffer for empty carriers, fed by a preceding borner (inTro) + diff --git a/doc/TRO_Katalog/tro_graphs/gen_tro_graphs.py b/doc/TRO_Katalog/tro_graphs/gen_tro_graphs.py new file mode 100644 index 0000000..b5a2ffb --- /dev/null +++ b/doc/TRO_Katalog/tro_graphs/gen_tro_graphs.py @@ -0,0 +1,509 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- +""" +gen_tro_graphs.py -- Documentation image generator for the TRO catalog. + +Produces two families of pictures into this folder (doc/TRO_Katalog/tro_graphs/): + + 1. Schematic SVGs, one per TRO type, showing the block together with its + *possible* connecting edges (normal / dir2 / dir3 / bypass / finger / PLC-EXTERN), + each edge drawn with its own colour + line style. Plus a shared `edge_legend.svg`. + + 2. One Graphviz `.dot` file per controller (uh01..uh05) built from `../connect.ini`, + rendered to `.svg`. Nodes are coloured by TRO type, edges styled by connection kind. + +This is a *doc tooling* script (not the SCL generator that belongs in lib/). +Re-run after editing connect.ini: + + py doc/TRO_Katalog/tro_graphs/gen_tro_graphs.py + +Requires Graphviz `dot` on PATH or at the default Windows install location. +""" +from __future__ import annotations +import configparser +import os +import shutil +import subprocess +import sys + +HERE = os.path.dirname(os.path.abspath(__file__)) +CONNECT_INI = os.path.join(HERE, "..", "connect.ini") + +# ---------------------------------------------------------------------------- +# Shared style system (kept identical between the schematics and the dot graphs) +# ---------------------------------------------------------------------------- + +# TRO type -> (fill, stroke) -- matches the colour legend in TRO_Katalog.md +TYPE_STYLE = { + "1Sep": ("#d4e8ff", "#3388cc"), + "1Sep1Swi": ("#ffe4a0", "#cc8800"), + "1Sep2Swi": ("#ffe4a0", "#cc8800"), + "1Sep_SSCC": ("#ffd4d4", "#cc3333"), + "Vario": ("#e8d4f0", "#883388"), + "Vario_workStation": ("#e8d4f0", "#883388"), + "PinStore_Auto": ("#d4f0d4", "#338833"), + "EmptyCarrBuffer": ("#d4f0d4", "#338833"), + "LoadingBoom": ("#f0f0f0", "#888888"), + "LoadingBoom_INBOUND": ("#f0f0f0", "#888888"), + "2Sep1Swi": ("#ffe4a0", "#cc8800"), +} + +# connection kind -> (colour, svg-dash, dot-style, label, human description) +EDGE = { + "normal": ("#444444", None, "solid", "normal", "standard transfer (jam area to jam area)"), + "dir2": ("#cc8800", "7,4", "dashed", "dir2", "switch output, direction 2 (FC_Direction)"), + "dir3": ("#b35900", "2,3", "dotted", "dir3", "switch output, direction 3 (FC_Direction)"), + "bypass": ("#3388cc", "13,5", "dashed", "bypass", "bypass around a storage block (PinStore)"), + "finger": ("#883388", "9,3,2,3", "dashdot","finger", "chain-conveyor finger / index transfer"), + "plc": ("#777777", "1,4", "dashed", "PLC", "PLC / WCS boundary, telegram or handshake"), + "extern": ("#557799", None, "solid", "EXTERN", "infeed / outfeed to another PLC (EXTERN)"), +} + +FONT = "Segoe UI, Helvetica, Arial, sans-serif" + + +# ---------------------------------------------------------------------------- +# Minimal SVG builder for the per-type schematics +# ---------------------------------------------------------------------------- +class Svg: + def __init__(self, w, h, title): + self.w, self.h = w, h + self.title = title + self.body = [] + self._markers = set() + + def marker_id(self, color): + mid = "arw_" + color.lstrip("#") + self._markers.add(color) + return mid + + def node(self, x, y, w, h, fill, stroke, title, sub=None, rx=10, dash=None, + title_size=15, sub_size=11): + d = f' stroke-dasharray="{dash}"' if dash else "" + self.body.append( + f'') + cx = x + w / 2 + if sub: + self.body.append( + f'{esc(title)}') + self.body.append( + f'{esc(sub)}') + else: + self.body.append( + f'{esc(title)}') + + def stadium(self, x, y, w, h, title, fill="#f4f4f4", stroke="#999", size=11): + self.node(x, y, w, h, fill, stroke, title, rx=h / 2, title_size=size) + + def edge(self, x1, y1, x2, y2, kind, label=None, label_dy=-6, curve=0): + color, dash, _, _, _ = EDGE[kind] + mid = self.marker_id(color) + d = f' stroke-dasharray="{dash}"' if dash else "" + w = 2.6 if kind in ("finger", "bypass", "extern") else 2.0 + if curve: + mx = (x1 + x2) / 2 + path = f'M {x1} {y1} C {mx} {y1+curve}, {mx} {y2+curve}, {x2} {y2}' + self.body.append( + f'') + else: + self.body.append( + f'') + if label: + lx, ly = (x1 + x2) / 2, (y1 + y2) / 2 + label_dy + self.body.append( + f'') + self.body.append( + f'{esc(label)}') + + def text(self, x, y, s, size=12, anchor="start", color="#333", weight="400", italic=False): + st = ' font-style="italic"' if italic else "" + self.body.append( + f'{esc(s)}') + + def render(self): + defs = [''] + for color in sorted(self._markers): + mid = "arw_" + color.lstrip("#") + defs.append( + f'' + f'') + defs.append('') + return ( + f'\n' + f'{esc(self.title)}\n' + + "\n".join(defs) + "\n" + f'\n' + + "\n".join(self.body) + "\n\n") + + +def esc(s): + return (str(s).replace("&", "&").replace("<", "<").replace(">", ">")) + + +def write(name, content): + path = os.path.join(HERE, name) + with open(path, "w", encoding="utf-8") as f: + f.write(content) + print(" wrote", os.path.relpath(path, HERE)) + + +# ---------------------------------------------------------------------------- +# Per-type schematic diagrams +# ---------------------------------------------------------------------------- +def hdr(svg, ttype, fb): + fill, stroke = TYPE_STYLE[ttype] + svg.body.append( + f'') + svg.text(36, 25, ttype, size=16, weight="700", color="#111") + svg.text(svg.w - 12, 25, fb, size=12, anchor="end", color="#888") + svg.body.append(f'') + + +def type_block(svg, ttype, x, y, w, h, title, sub, dash=None): + fill, stroke = TYPE_STYLE[ttype] + svg.node(x, y, w, h, fill, stroke, title, sub, dash=dash) + + +def gen_type_svgs(): + print("Type schematics:") + + # 1) 1Sep ----------------------------------------------------------------- + s = Svg(720, 200, "1Sep - standard separator") + hdr(s, "1Sep", "FB_ILS_MTRO_1Sep") + s.stadium(30, 100, 150, 44, "Entry JamArea") + type_block(s, "1Sep", 285, 88, 150, 68, "1Sep", "Stopper MB · sensor BG") + s.stadium(540, 100, 150, 44, "Exit JamArea") + s.edge(180, 122, 285, 122, "normal", "in") + s.edge(435, 122, 540, 122, "normal", "release") + s.text(360, 180, "one entry → one exit; holds carrier at the stopper, releases one", + size=11, anchor="middle", color="#777", italic=True) + write("1sep.svg", s.render()) + + # 2) 1Sep1Swi ------------------------------------------------------------- + s = Svg(720, 240, "1Sep1Swi - separator + 1 switch") + hdr(s, "1Sep1Swi", "FB_ILS_MTRO_1Sep1Swi") + s.stadium(30, 100, 150, 44, "Entry JamArea") + type_block(s, "1Sep1Swi", 275, 88, 165, 68, "1Sep1Swi", "Stopper + Switch") + s.stadium(545, 58, 150, 42, "Exit · Dir1") + s.stadium(545, 148, 150, 42, "Exit · Dir2") + s.edge(180, 122, 275, 122, "normal", "in") + s.edge(440, 112, 545, 79, "normal", "Dir1") + s.edge(440, 132, 545, 169, "dir2", "Dir2") + s.text(360, 222, "switch routes to two exits; direction from FC_Direction", + size=11, anchor="middle", color="#777", italic=True) + write("1sep1swi.svg", s.render()) + + # 3) 1Sep2Swi ------------------------------------------------------------- + s = Svg(760, 300, "1Sep2Swi - separator + 2 switches") + hdr(s, "1Sep2Swi", "FB_ILS_MTRO_1Sep2Swi") + s.stadium(24, 128, 150, 42, "Entry JamArea") + s.stadium(24, 46, 150, 36, "Scanner (barcode)", fill="#ffecec", stroke="#cc3333") + type_block(s, "1Sep2Swi", 260, 116, 175, 70, "1Sep2Swi", "Stopper + 2 switches") + s.stadium(575, 44, 160, 40, "Exit 2 · dir") + s.stadium(575, 130, 160, 40, "Exit 3") + s.stadium(575, 216, 160, 40, "Exit 4") + s.edge(174, 149, 260, 149, "normal", "in") + s.edge(174, 64, 300, 116, "plc", "scan") + s.edge(435, 138, 575, 64, "dir2", "exit2") + s.edge(435, 151, 575, 150, "normal", "exit3") + s.edge(435, 164, 575, 236, "dir3", "exit4") + s.text(380, 288, "two switches → up to three routed exits + entry scanner", + size=11, anchor="middle", color="#777", italic=True) + write("1sep2swi.svg", s.render()) + + # 4) 1Sep_SSCC ------------------------------------------------------------ + s = Svg(760, 240, "1Sep_SSCC - separator + SSCC scanner") + hdr(s, "1Sep_SSCC", "FB_ILS_MTRO_1Sep_SSCC") + s.stadium(24, 110, 150, 44, "Entry JamArea") + type_block(s, "1Sep_SSCC", 265, 96, 190, 72, "1Sep_SSCC", "Barcode + SSCC + end-meas.") + s.stadium(585, 110, 150, 44, "Exit JamArea") + s.stadium(300, 24, 150, 36, "WCS / WES", fill="#eef2f7", stroke="#557799") + s.edge(174, 132, 265, 132, "normal", "in") + s.edge(455, 132, 585, 132, "normal", "release") + s.edge(360, 96, 375, 60, "plc", "DReqM") + s.text(380, 220, "1Sep + second SSCC scanner + dock-request telegram to WCS", + size=11, anchor="middle", color="#777", italic=True) + write("1sep_sscc.svg", s.render()) + + # 5) Vario ---------------------------------------------------------------- + s = Svg(720, 210, "Vario - chain conveyor") + hdr(s, "Vario", "FB_ILS_MTRO_Vario") + s.stadium(30, 104, 150, 44, "Entry JamArea") + type_block(s, "Vario", 280, 92, 160, 68, "Vario", "chain · pos/finger · motor MA") + s.stadium(545, 104, 155, 44, "Finger Exit") + s.edge(180, 126, 280, 126, "normal", "in") + s.edge(440, 126, 545, 126, "finger", "finger") + s.text(360, 192, "driven chain segment; transfers to the next block via finger/index", + size=11, anchor="middle", color="#777", italic=True) + write("vario.svg", s.render()) + + # 6) PinStore_Auto -------------------------------------------------------- + s = Svg(760, 270, "PinStore_Auto - automatic pin storage") + hdr(s, "PinStore_Auto", "FB_ILS_MTRO_PinStore_Auto") + s.stadium(24, 60, 150, 42, "Entry JamArea") + s.stadium(24, 150, 150, 42, "Bypass in") + type_block(s, "PinStore_Auto", 265, 90, 190, 78, "PinStore_Auto", "up to 19 storage lines") + s.stadium(585, 100, 150, 44, "Exit JamArea") + s.stadium(300, 210, 170, 40, "restacking intelligence", fill="#eef7ee", stroke="#338833") + s.edge(174, 81, 265, 110, "normal", "normal") + s.edge(174, 171, 265, 150, "bypass", "bypass") + s.edge(455, 128, 585, 122, "normal", "exit") + s.edge(360, 168, 375, 210, "plc", "handshake") + s.text(380, 262, "storage block: pin-band infeed + line separators + encoder + scanner", + size=11, anchor="middle", color="#777", italic=True) + write("pinstore_auto.svg", s.render()) + + # 7) Vario_workStation ---------------------------------------------------- + s = Svg(720, 240, "Vario_workStation - manual work station") + hdr(s, "Vario_workStation", "FB_ILS_MTRO_Vario_workStation") + s.stadium(30, 110, 150, 44, "Entry JamArea") + type_block(s, "Vario_workStation", 270, 98, 175, 68, "Vario_workStation", "chain + manual station") + s.stadium(555, 110, 150, 44, "Finger Exit") + s.stadium(285, 30, 175, 38, "operator · release button", fill="#f4f4f4", stroke="#999") + s.edge(180, 132, 270, 132, "normal", "in") + s.edge(445, 132, 555, 132, "finger", "finger") + s.edge(357, 68, 357, 98, "plc", None) + s.text(360, 222, "Vario variant: station sensor + release button + load-error sensor", + size=11, anchor="middle", color="#777", italic=True) + write("vario_workstation.svg", s.render()) + + # 8) EmptyCarrBuffer ------------------------------------------------------ + s = Svg(760, 290, "EmptyCarrBuffer - empty carrier buffer") + hdr(s, "EmptyCarrBuffer", "FB_EmptyCarrBuffer") + s.stadium(24, 120, 150, 42, "inTro · borner") + type_block(s, "EmptyCarrBuffer", 250, 108, 175, 70, "EmptyCarrBuffer", "distribution switch") + for i, ly in enumerate((44, 108, 172)): + lbl = "Line 1" if i == 0 else ("Line 2" if i == 1 else "Line n") + s.stadium(560, ly, 120, 36, lbl, fill="#eef7ee", stroke="#338833") + s.stadium(560, 236, 120, 36, "Exit JamArea") + s.edge(174, 141, 250, 141, "normal", "in") + s.edge(425, 128, 560, 62, "dir2", None) + s.edge(425, 140, 560, 126, "dir2", None) + s.edge(425, 152, 560, 190, "dir2", "lines") + s.edge(425, 165, 560, 254, "normal", "exit") + s.text(380, 282, "multi-line buffer for empty carriers, fed by a preceding borner (inTro)", + size=11, anchor="middle", color="#777", italic=True) + write("emptycarrbuffer.svg", s.render()) + + # 9) LoadingBoom ---------------------------------------------------------- + s = Svg(720, 210, "LoadingBoom - system infeed loading boom") + hdr(s, "LoadingBoom", "FB_LoadingBoom_INBOUND") + s.stadium(30, 104, 150, 44, "Stopper JamArea") + type_block(s, "LoadingBoom", 275, 92, 175, 68, "LoadingBoom", "boom + foot + tilt/dist", dash="6,4") + s.stadium(560, 104, 145, 44, "Exit JamArea") + s.edge(180, 126, 275, 126, "extern", "infeed") + s.edge(450, 126, 560, 126, "normal", "exit") + s.text(360, 192, "system infeed boom (fbLoadingBoomN); linked to a TRO via relatedTro", + size=11, anchor="middle", color="#777", italic=True) + write("loadingboom.svg", s.render()) + + # 10) 2Sep1Swi ------------------------------------------------------------ + s = Svg(720, 250, "2Sep1Swi - unused concept block") + hdr(s, "2Sep1Swi", "FB_ILS_MTRO_2Sep1Swi") + s.stadium(30, 48, 150, 42, "Entry 1") + s.stadium(30, 150, 150, 42, "Entry 2") + type_block(s, "2Sep1Swi", 285, 96, 165, 70, "2Sep1Swi", "2 separators + switch") + s.stadium(545, 60, 150, 42, "Exit 2") + s.stadium(545, 150, 150, 42, "Exit 3") + s.edge(180, 69, 285, 115, "normal", None) + s.edge(180, 171, 285, 150, "normal", None) + s.edge(450, 118, 545, 81, "normal", "exit2") + s.edge(450, 142, 545, 171, "dir2", "exit3") + s.text(360, 232, "prepared but never instantiated in any FB_Main (concept only)", + size=11, anchor="middle", color="#777", italic=True) + write("2sep1swi.svg", s.render()) + + +# ---------------------------------------------------------------------------- +# Edge / line-type legend +# ---------------------------------------------------------------------------- +def gen_edge_legend(): + order = ["normal", "dir2", "dir3", "bypass", "finger", "plc", "extern"] + row_h = 34 + s = Svg(560, 60 + row_h * len(order), "Edge / connection line-type legend") + s.text(16, 30, "Connection line types", size=17, weight="700", color="#111") + s.body.append(f'') + y = 66 + for kind in order: + color, dash, _, label, desc = EDGE[kind] + mid = s.marker_id(color) + d = f' stroke-dasharray="{dash}"' if dash else "" + w = 2.6 if kind in ("finger", "bypass", "extern") else 2.0 + s.body.append( + f'') + s.text(134, y + 4, label, size=13, weight="700", color=color) + s.text(210, y + 4, desc, size=12, color="#555") + y += row_h + write("edge_legend.svg", s.render()) + + +# ---------------------------------------------------------------------------- +# Controller topology .dot files from connect.ini +# ---------------------------------------------------------------------------- +def parse_ini(): + cp = configparser.ConfigParser() + cp.optionxform = str # keep key case (TRO101_IN etc.) + with open(CONNECT_INI, encoding="utf-8") as f: + cp.read_file(f) + controllers = {} + for sec in cp.sections(): + uh, kind = sec.split(".", 1) + controllers.setdefault(uh, {"nodes": {}, "connections": [], "externals": []}) + if kind == "nodes": + for key, val in cp.items(sec): + ttype = val.split("|", 1)[0].strip() + comment = val.split("|", 1)[1].strip() if "|" in val else "" + controllers[uh]["nodes"][key] = (ttype, comment) + elif kind == "connections": + for key, val in cp.items(sec): + parts = [p.strip() for p in val.split("|")] + endpoints = [e.strip() for e in parts[0].split("->")] + jam = parts[1] if len(parts) > 1 else "" + ck = parts[2] if len(parts) > 2 else "normal" + controllers[uh]["connections"].append((endpoints[0], endpoints[1], jam, ck)) + elif kind == "externals": + for key, val in cp.items(sec): + parts = [p.strip() for p in val.split("|")] + endpoints = [e.strip() for e in parts[0].split("->")] + jam = parts[1] if len(parts) > 1 else "" + controllers[uh]["externals"].append((key, endpoints[0], endpoints[1], jam)) + return controllers + + +def dot_edge_attrs(ck): + color, _, style, label, _ = EDGE.get(ck, EDGE["normal"]) + pen = "2.2" if ck in ("finger", "bypass") else ("1.8" if ck == "dir3" else "1.3") + attrs = [f'color="{color}"', f'penwidth={pen}'] + if style != "solid": + attrs.append(f'style="{style}"') + if ck != "normal": + attrs.append(f'label="{label}"') + attrs.append(f'fontcolor="{color}"') + return ", ".join(attrs) + + +def build_dot(uh, data): + lines = [] + lines.append(f'digraph {uh} {{') + lines.append(' rankdir=LR;') + lines.append(' bgcolor="white";') + lines.append(' labelloc="t";') + lines.append(f' label=<{uh} — TRO topology (nodes coloured by type, edges by connection kind)>;') + lines.append(' fontname="Segoe UI"; fontsize=18;') + lines.append(' node [fontname="Segoe UI", fontsize=11, style="rounded,filled", shape=box, penwidth=1.6];') + lines.append(' edge [fontname="Segoe UI", fontsize=9, arrowsize=0.8];') + lines.append('') + + # nodes + for tro, (ttype, comment) in data["nodes"].items(): + fill, stroke = TYPE_STYLE.get(ttype, ("#f0f0f0", "#888888")) + shape = "box" + extra = 'style="rounded,filled"' + if ttype in ("PinStore_Auto", "EmptyCarrBuffer"): + shape = "box3d"; extra = 'style="filled"' + elif ttype.startswith("LoadingBoom"): + extra = 'style="rounded,filled,dashed"' + tip = comment.replace('"', "'") + lines.append( + f' "{tro}" [label="{tro}\\n{ttype}", fillcolor="{fill}", color="{stroke}", ' + f'shape={shape}, {extra}, tooltip="{tip}"];') + lines.append('') + + # external boundary nodes (one per external record) + for key, a, b, jam in data["externals"]: + node = f'EXT_{uh}_{key}' + lines.append( + f' "{node}" [label="EXTERN\\n{jam}", shape=cds, fillcolor="#eef2f7", ' + f'color="#557799", style="filled", fontsize=9];') + lines.append('') + + # connections + for a, b, jam, ck in data["connections"]: + lines.append(f' "{a}" -> "{b}" [{dot_edge_attrs(ck)}, tooltip="{jam} ({ck})"];') + lines.append('') + + # externals as edges + for key, a, b, jam in data["externals"]: + node = f'EXT_{uh}_{key}' + if a == "EXTERN": + lines.append(f' "{node}" -> "{b}" [{dot_edge_attrs("extern")}, tooltip="{jam}"];') + else: + lines.append(f' "{a}" -> "{node}" [{dot_edge_attrs("extern")}, tooltip="{jam}"];') + lines.append('') + + # legend cluster + lines.append(' subgraph cluster_legend {') + lines.append(' label="Legend"; fontsize=12; color="#cccccc"; style="rounded";') + lines.append(' node [shape=plaintext, style="", fillcolor="none", fontsize=10];') + lines.append(' legend [label=<') + lines.append(' ') + for kind in ["normal", "dir2", "dir3", "bypass", "finger", "extern"]: + color, _, _, label, desc = EDGE[kind] + lines.append( + f' ' + f'') + lines.append('
—— {label}{desc}
>];') + lines.append(' }') + + lines.append('}') + return "\n".join(lines) + "\n" + + +def find_dot(): + exe = shutil.which("dot") + if exe: + return exe + for cand in (r"C:\Program Files\Graphviz\bin\dot.exe", + r"C:\Program Files (x86)\Graphviz\bin\dot.exe"): + if os.path.exists(cand): + return cand + return None + + +def gen_controllers(): + print("Controller dot graphs:") + controllers = parse_ini() + dot_exe = find_dot() + for uh in sorted(controllers): + data = controllers[uh] + dot_src = build_dot(uh, data) + dot_name = f"{uh.lower()}.dot" + write(dot_name, dot_src) + if dot_exe: + svg_path = os.path.join(HERE, f"{uh.lower()}.svg") + try: + subprocess.run([dot_exe, "-Tsvg", os.path.join(HERE, dot_name), + "-o", svg_path], check=True, capture_output=True) + print(" rendered", f"{uh.lower()}.svg", + f"({len(data['nodes'])} nodes, " + f"{len(data['connections'])+len(data['externals'])} edges)") + except subprocess.CalledProcessError as e: + print(" !! dot failed for", uh, e.stderr.decode(errors="replace")[:400]) + if not dot_exe: + print(" !! Graphviz 'dot' not found - .dot files written but not rendered.") + + +def main(): + print("Generating TRO catalog graphs into", HERE) + gen_edge_legend() + gen_type_svgs() + gen_controllers() + print("Done.") + + +if __name__ == "__main__": + main() diff --git a/doc/TRO_Katalog/tro_graphs/loadingboom.svg b/doc/TRO_Katalog/tro_graphs/loadingboom.svg new file mode 100644 index 0000000..a6a29c5 --- /dev/null +++ b/doc/TRO_Katalog/tro_graphs/loadingboom.svg @@ -0,0 +1,26 @@ + +LoadingBoom - system infeed loading boom + + + + + + +LoadingBoom +FB_LoadingBoom_INBOUND + + +Stopper JamArea + +LoadingBoom +boom + foot + tilt/dist + +Exit JamArea + + +infeed + + +exit +system infeed boom (fbLoadingBoomN); linked to a TRO via relatedTro + diff --git a/doc/TRO_Katalog/tro_graphs/pinstore_auto.svg b/doc/TRO_Katalog/tro_graphs/pinstore_auto.svg new file mode 100644 index 0000000..eeedc5a --- /dev/null +++ b/doc/TRO_Katalog/tro_graphs/pinstore_auto.svg @@ -0,0 +1,37 @@ + +PinStore_Auto - automatic pin storage + + + + + + + +PinStore_Auto +FB_ILS_MTRO_PinStore_Auto + + +Entry JamArea + +Bypass in + +PinStore_Auto +up to 19 storage lines + +Exit JamArea + +restacking intelligence + + +normal + + +bypass + + +exit + + +handshake +storage block: pin-band infeed + line separators + encoder + scanner + diff --git a/doc/TRO_Katalog/tro_graphs/uh01.dot b/doc/TRO_Katalog/tro_graphs/uh01.dot new file mode 100644 index 0000000..999812b --- /dev/null +++ b/doc/TRO_Katalog/tro_graphs/uh01.dot @@ -0,0 +1,108 @@ +digraph UH01 { + rankdir=LR; + bgcolor="white"; + labelloc="t"; + label=<UH01 — TRO topology (nodes coloured by type, edges by connection kind)>; + fontname="Segoe UI"; fontsize=18; + node [fontname="Segoe UI", fontsize=11, style="rounded,filled", shape=box, penwidth=1.6]; + edge [fontname="Segoe UI", fontsize=9, arrowsize=0.8]; + + "TRO100" [label="TRO100\n1Sep", fillcolor="#d4e8ff", color="#3388cc", shape=box, style="rounded,filled", tooltip="TRO 100 (1Sep)"]; + "TRO101" [label="TRO101\nEmptyCarrBuffer", fillcolor="#d4f0d4", color="#338833", shape=box3d, style="filled", tooltip="TRO101 (Empty Buffer rechts)"]; + "TRO101_IN" [label="TRO101_IN\n1Sep", fillcolor="#d4e8ff", color="#3388cc", shape=box, style="rounded,filled", tooltip="TRO 101_IN(1Sep)"]; + "TRO102" [label="TRO102\nEmptyCarrBuffer", fillcolor="#d4f0d4", color="#338833", shape=box3d, style="filled", tooltip="TRO102 (Empty Buffer links)"]; + "TRO102_IN" [label="TRO102_IN\n1Sep", fillcolor="#d4e8ff", color="#3388cc", shape=box, style="rounded,filled", tooltip="TRO 102_IN(1Sep)"]; + "TRO103" [label="TRO103\n1Sep", fillcolor="#d4e8ff", color="#3388cc", shape=box, style="rounded,filled", tooltip="TRO 103 (1Sep)"]; + "TRO104" [label="TRO104\n1Sep", fillcolor="#d4e8ff", color="#3388cc", shape=box, style="rounded,filled", tooltip="TRO 104 (1Sep)+Scanner"]; + "TRO105" [label="TRO105\n1Sep_SSCC", fillcolor="#ffd4d4", color="#cc3333", shape=box, style="rounded,filled", tooltip="TRO 105 (1Sep)+Scanner"]; + "TRO106" [label="TRO106\n1Sep", fillcolor="#d4e8ff", color="#3388cc", shape=box, style="rounded,filled", tooltip="TRO 106 (1Sep)"]; + "TRO107" [label="TRO107\n1Sep1Swi", fillcolor="#ffe4a0", color="#cc8800", shape=box, style="rounded,filled", tooltip="TRO 107(1Sep1Swi)"]; + "TRO108" [label="TRO108\n1Sep", fillcolor="#d4e8ff", color="#3388cc", shape=box, style="rounded,filled", tooltip="TRO 108 (1Sep)"]; + "TRO109" [label="TRO109\n1Sep", fillcolor="#d4e8ff", color="#3388cc", shape=box, style="rounded,filled", tooltip="TRO 109 (1Sep)+Scanner"]; + "TRO110" [label="TRO110\n1Sep_SSCC", fillcolor="#ffd4d4", color="#cc3333", shape=box, style="rounded,filled", tooltip="TRO 110 (1Sep)+Scanner"]; + "TRO111" [label="TRO111\n1Sep", fillcolor="#d4e8ff", color="#3388cc", shape=box, style="rounded,filled", tooltip="TRO 111 (1Sep)"]; + "TRO112" [label="TRO112\n1Sep1Swi", fillcolor="#ffe4a0", color="#cc8800", shape=box, style="rounded,filled", tooltip="TRO 112 (1Sep1Swi)"]; + "TRO113" [label="TRO113\n1Sep", fillcolor="#d4e8ff", color="#3388cc", shape=box, style="rounded,filled", tooltip="TRO 113 (1Sep)+Scanner"]; + "TRO114" [label="TRO114\n1Sep1Swi", fillcolor="#ffe4a0", color="#cc8800", shape=box, style="rounded,filled", tooltip="TRO 114 (1Sep1Switch)+Scanner"]; + "TRO115" [label="TRO115\nVario", fillcolor="#e8d4f0", color="#883388", shape=box, style="rounded,filled", tooltip="TRO 115 (Vario)"]; + "TRO116" [label="TRO116\n1Sep", fillcolor="#d4e8ff", color="#3388cc", shape=box, style="rounded,filled", tooltip="TRO 116 (1Sep)"]; + "TRO117" [label="TRO117\n1Sep", fillcolor="#d4e8ff", color="#3388cc", shape=box, style="rounded,filled", tooltip="TRO 117 (1Sep) + Scanner"]; + "TRO120" [label="TRO120\nVario", fillcolor="#e8d4f0", color="#883388", shape=box, style="rounded,filled", tooltip="TRO 120 (Vario)"]; + "TRO121" [label="TRO121\nVario", fillcolor="#e8d4f0", color="#883388", shape=box, style="rounded,filled", tooltip="TRO 121(Vario)"]; + "TRO122" [label="TRO122\n1Sep", fillcolor="#d4e8ff", color="#3388cc", shape=box, style="rounded,filled", tooltip="TRO 122 (1Sep)"]; + "TRO123" [label="TRO123\nVario", fillcolor="#e8d4f0", color="#883388", shape=box, style="rounded,filled", tooltip="TRO 123 (Vario)"]; + "TRO124" [label="TRO124\n1Sep1Swi", fillcolor="#ffe4a0", color="#cc8800", shape=box, style="rounded,filled", tooltip="TRO 124 (1Sep1Switch)"]; + "TRO125" [label="TRO125\n1Sep", fillcolor="#d4e8ff", color="#3388cc", shape=box, style="rounded,filled", tooltip="TRO 125 (1Sep)"]; + "TRO126" [label="TRO126\nVario", fillcolor="#e8d4f0", color="#883388", shape=box, style="rounded,filled", tooltip="TRO 126 (Vario)"]; + "TRO127" [label="TRO127\nVario", fillcolor="#e8d4f0", color="#883388", shape=box, style="rounded,filled", tooltip="TRO 127 (Vario)"]; + "TRO128" [label="TRO128\nVario", fillcolor="#e8d4f0", color="#883388", shape=box, style="rounded,filled", tooltip="TRO 128 (Vario)"]; + "TRO129" [label="TRO129\n1Sep", fillcolor="#d4e8ff", color="#3388cc", shape=box, style="rounded,filled", tooltip="TRO 129 (1Sep)"]; + "TRO130" [label="TRO130\n1Sep", fillcolor="#d4e8ff", color="#3388cc", shape=box, style="rounded,filled", tooltip="TRO 130 (1Sep)"]; + "TRO131" [label="TRO131\nVario", fillcolor="#e8d4f0", color="#883388", shape=box, style="rounded,filled", tooltip="TRO 131 (Vario)"]; + "TRO133" [label="TRO133\nVario", fillcolor="#e8d4f0", color="#883388", shape=box, style="rounded,filled", tooltip="TRO 133 (Vario)"]; + "TRO134" [label="TRO134\nVario", fillcolor="#e8d4f0", color="#883388", shape=box, style="rounded,filled", tooltip="TRO 134 (Vario)"]; + "fbLoadingBoom1" [label="fbLoadingBoom1\nLoadingBoom_INBOUND", fillcolor="#f0f0f0", color="#888888", shape=box, style="rounded,filled,dashed", tooltip="LoadingBoom 1"]; + "fbLoadingBoom2" [label="fbLoadingBoom2\nLoadingBoom_INBOUND", fillcolor="#f0f0f0", color="#888888", shape=box, style="rounded,filled,dashed", tooltip="LoadingBoom 2"]; + + "EXT_UH01_e001" [label="EXTERN\nJA4104_1", shape=cds, fillcolor="#eef2f7", color="#557799", style="filled", fontsize=9]; + "EXT_UH01_e002" [label="EXTERN\nJA4302_1", shape=cds, fillcolor="#eef2f7", color="#557799", style="filled", fontsize=9]; + "EXT_UH01_e003" [label="EXTERN\nJA4402_1", shape=cds, fillcolor="#eef2f7", color="#557799", style="filled", fontsize=9]; + "EXT_UH01_e004" [label="EXTERN\nJA4503_1", shape=cds, fillcolor="#eef2f7", color="#557799", style="filled", fontsize=9]; + + "TRO128" -> "TRO100" [color="#883388", penwidth=2.2, style="dashdot", label="finger", fontcolor="#883388", tooltip="JA0100_1 (finger)"]; + "TRO100" -> "TRO101_IN" [color="#444444", penwidth=1.3, tooltip="JA0101_1 (normal)"]; + "TRO101_IN" -> "TRO102_IN" [color="#444444", penwidth=1.3, tooltip="JA0101_2 (normal)"]; + "TRO102" -> "TRO107" [color="#444444", penwidth=1.3, tooltip="JA0102_1 (normal)"]; + "TRO117" -> "TRO107" [color="#444444", penwidth=1.3, tooltip="JA0102_1 (normal)"]; + "TRO101" -> "TRO112" [color="#444444", penwidth=1.3, tooltip="JA0102_2 (normal)"]; + "TRO106" -> "TRO112" [color="#444444", penwidth=1.3, tooltip="JA0102_2 (normal)"]; + "TRO107" -> "TRO112" [color="#cc8800", penwidth=1.3, style="dashed", label="dir2", fontcolor="#cc8800", tooltip="JA0102_2 (dir2)"]; + "TRO111" -> "TRO113" [color="#444444", penwidth=1.3, tooltip="JA0102_3 (normal)"]; + "TRO112" -> "TRO113" [color="#cc8800", penwidth=1.3, style="dashed", label="dir2", fontcolor="#cc8800", tooltip="JA0102_3 (dir2)"]; + "TRO113" -> "TRO114" [color="#444444", penwidth=1.3, tooltip="JA0102_4 (normal)"]; + "TRO114" -> "TRO116" [color="#cc8800", penwidth=1.3, style="dashed", label="dir2", fontcolor="#cc8800", tooltip="JA0102_5 (dir2)"]; + "TRO116" -> "TRO117" [color="#444444", penwidth=1.3, tooltip="JA0102_6 (normal)"]; + "TRO107" -> "TRO103" [color="#444444", penwidth=1.3, tooltip="JA0103_1 (normal)"]; + "TRO103" -> "TRO104" [color="#444444", penwidth=1.3, tooltip="JA0104_1 (normal)"]; + "TRO104" -> "fbLoadingBoom1" [color="#444444", penwidth=1.3, tooltip="JA0104_2 (normal)"]; + "fbLoadingBoom1" -> "TRO105" [color="#444444", penwidth=1.3, tooltip="JA0104_3 (normal)"]; + "TRO105" -> "TRO106" [color="#444444", penwidth=1.3, tooltip="JA0106_2 (normal)"]; + "TRO112" -> "TRO108" [color="#444444", penwidth=1.3, tooltip="JA0107_1 (normal)"]; + "TRO108" -> "TRO109" [color="#444444", penwidth=1.3, tooltip="JA0108_1 (normal)"]; + "TRO109" -> "fbLoadingBoom2" [color="#444444", penwidth=1.3, tooltip="JA0108_2 (normal)"]; + "fbLoadingBoom2" -> "TRO110" [color="#444444", penwidth=1.3, tooltip="JA0108_3 (normal)"]; + "TRO110" -> "TRO111" [color="#444444", penwidth=1.3, tooltip="JA0110_2 (normal)"]; + "TRO115" -> "TRO120" [color="#883388", penwidth=2.2, style="dashdot", label="finger", fontcolor="#883388", tooltip="JA4103_1 (finger)"]; + "TRO125" -> "TRO126" [color="#444444", penwidth=1.3, tooltip="JA4203_1 (normal)"]; + "TRO129" -> "TRO130" [color="#444444", penwidth=1.3, tooltip="JA4204_1 (normal)"]; + "TRO124" -> "TRO125" [color="#444444", penwidth=1.3, tooltip="JA4204_2 (normal)"]; + "TRO133" -> "TRO129" [color="#883388", penwidth=2.2, style="dashdot", label="finger", fontcolor="#883388", tooltip="JA4302_2 (finger)"]; + "TRO134" -> "TRO131" [color="#883388", penwidth=2.2, style="dashdot", label="finger", fontcolor="#883388", tooltip="JA4403_1 (finger)"]; + "TRO124" -> "TRO127" [color="#cc8800", penwidth=1.3, style="dashed", label="dir2", fontcolor="#cc8800", tooltip="JA4501_1 (dir2)"]; + "TRO130" -> "TRO127" [color="#444444", penwidth=1.3, tooltip="JA4501_1 (normal)"]; + "TRO127" -> "TRO128" [color="#883388", penwidth=2.2, style="dashdot", label="finger", fontcolor="#883388", tooltip="JA4501_2 (finger)"]; + "TRO122" -> "TRO123" [color="#444444", penwidth=1.3, tooltip="JA4502_1 (normal)"]; + "TRO123" -> "TRO124" [color="#883388", penwidth=2.2, style="dashdot", label="finger", fontcolor="#883388", tooltip="JA4502_2 (finger)"]; + "TRO121" -> "TRO122" [color="#883388", penwidth=2.2, style="dashdot", label="finger", fontcolor="#883388", tooltip="JA4503_2 (finger)"]; + "TRO101_IN" -> "TRO101" [color="#444444", penwidth=1.3, tooltip="JamBuffer101 (normal)"]; + "TRO102_IN" -> "TRO102" [color="#444444", penwidth=1.3, tooltip="JamBuffer102 (normal)"]; + + "EXT_UH01_e001" -> "TRO115" [color="#557799", penwidth=1.3, label="EXTERN", fontcolor="#557799", tooltip="JA4104_1"]; + "EXT_UH01_e002" -> "TRO133" [color="#557799", penwidth=1.3, label="EXTERN", fontcolor="#557799", tooltip="JA4302_1"]; + "EXT_UH01_e003" -> "TRO134" [color="#557799", penwidth=1.3, label="EXTERN", fontcolor="#557799", tooltip="JA4402_1"]; + "EXT_UH01_e004" -> "TRO121" [color="#557799", penwidth=1.3, label="EXTERN", fontcolor="#557799", tooltip="JA4503_1"]; + + subgraph cluster_legend { + label="Legend"; fontsize=12; color="#cccccc"; style="rounded"; + node [shape=plaintext, style="", fillcolor="none", fontsize=10]; + legend [label=< + + + + + + + +
—— normalstandard transfer (jam area to jam area)
—— dir2switch output, direction 2 (FC_Direction)
—— dir3switch output, direction 3 (FC_Direction)
—— bypassbypass around a storage block (PinStore)
—— fingerchain-conveyor finger / index transfer
—— EXTERNinfeed / outfeed to another PLC (EXTERN)
>]; + } +} diff --git a/doc/TRO_Katalog/tro_graphs/uh01.svg b/doc/TRO_Katalog/tro_graphs/uh01.svg new file mode 100644 index 0000000..5c9626d --- /dev/null +++ b/doc/TRO_Katalog/tro_graphs/uh01.svg @@ -0,0 +1,814 @@ + + + + + + +UH01 + +UH01 + — TRO topology (nodes coloured by type, edges by connection kind) + +cluster_legend + +Legend + + + +TRO100 + + +TRO100 +1Sep + + + + + +TRO101_IN + + +TRO101_IN +1Sep + + + + + +TRO100->TRO101_IN + + + + + + + + +TRO101 + + + + + +TRO101 +EmptyCarrBuffer + + + + + +TRO112 + + +TRO112 +1Sep1Swi + + + + + +TRO101->TRO112 + + + + + + + + +TRO101_IN->TRO101 + + + + + + + + +TRO102_IN + + +TRO102_IN +1Sep + + + + + +TRO101_IN->TRO102_IN + + + + + + + + +TRO102 + + + + + +TRO102 +EmptyCarrBuffer + + + + + +TRO107 + + +TRO107 +1Sep1Swi + + + + + +TRO102->TRO107 + + + + + + + + +TRO102_IN->TRO102 + + + + + + + + +TRO103 + + +TRO103 +1Sep + + + + + +TRO104 + + +TRO104 +1Sep + + + + + +TRO103->TRO104 + + + + + + + + +fbLoadingBoom1 + + +fbLoadingBoom1 +LoadingBoom_INBOUND + + + + + +TRO104->fbLoadingBoom1 + + + + + + + + +TRO105 + + +TRO105 +1Sep_SSCC + + + + + +TRO106 + + +TRO106 +1Sep + + + + + +TRO105->TRO106 + + + + + + + + +TRO106->TRO112 + + + + + + + + +TRO107->TRO103 + + + + + + + + +TRO107->TRO112 + + + + + +dir2 + + + +TRO108 + + +TRO108 +1Sep + + + + + +TRO109 + + +TRO109 +1Sep + + + + + +TRO108->TRO109 + + + + + + + + +fbLoadingBoom2 + + +fbLoadingBoom2 +LoadingBoom_INBOUND + + + + + +TRO109->fbLoadingBoom2 + + + + + + + + +TRO110 + + +TRO110 +1Sep_SSCC + + + + + +TRO111 + + +TRO111 +1Sep + + + + + +TRO110->TRO111 + + + + + + + + +TRO113 + + +TRO113 +1Sep + + + + + +TRO111->TRO113 + + + + + + + + +TRO112->TRO108 + + + + + + + + +TRO112->TRO113 + + + + + +dir2 + + + +TRO114 + + +TRO114 +1Sep1Swi + + + + + +TRO113->TRO114 + + + + + + + + +TRO116 + + +TRO116 +1Sep + + + + + +TRO114->TRO116 + + + + + +dir2 + + + +TRO115 + + +TRO115 +Vario + + + + + +TRO120 + + +TRO120 +Vario + + + + + +TRO115->TRO120 + + + + + +finger + + + +TRO117 + + +TRO117 +1Sep + + + + + +TRO116->TRO117 + + + + + + + + +TRO117->TRO107 + + + + + + + + +TRO121 + + +TRO121 +Vario + + + + + +TRO122 + + +TRO122 +1Sep + + + + + +TRO121->TRO122 + + + + + +finger + + + +TRO123 + + +TRO123 +Vario + + + + + +TRO122->TRO123 + + + + + + + + +TRO124 + + +TRO124 +1Sep1Swi + + + + + +TRO123->TRO124 + + + + + +finger + + + +TRO125 + + +TRO125 +1Sep + + + + + +TRO124->TRO125 + + + + + + + + +TRO127 + + +TRO127 +Vario + + + + + +TRO124->TRO127 + + + + + +dir2 + + + +TRO126 + + +TRO126 +Vario + + + + + +TRO125->TRO126 + + + + + + + + +TRO128 + + +TRO128 +Vario + + + + + +TRO127->TRO128 + + + + + +finger + + + +TRO128->TRO100 + + + + + +finger + + + +TRO129 + + +TRO129 +1Sep + + + + + +TRO130 + + +TRO130 +1Sep + + + + + +TRO129->TRO130 + + + + + + + + +TRO130->TRO127 + + + + + + + + +TRO131 + + +TRO131 +Vario + + + + + +TRO133 + + +TRO133 +Vario + + + + + +TRO133->TRO129 + + + + + +finger + + + +TRO134 + + +TRO134 +Vario + + + + + +TRO134->TRO131 + + + + + +finger + + + +fbLoadingBoom1->TRO105 + + + + + + + + +fbLoadingBoom2->TRO110 + + + + + + + + +EXT_UH01_e001 + +EXTERN +JA4104_1 + + + +EXT_UH01_e001->TRO115 + + + + + +EXTERN + + + +EXT_UH01_e002 + +EXTERN +JA4302_1 + + + +EXT_UH01_e002->TRO133 + + + + + +EXTERN + + + +EXT_UH01_e003 + +EXTERN +JA4402_1 + + + +EXT_UH01_e003->TRO134 + + + + + +EXTERN + + + +EXT_UH01_e004 + +EXTERN +JA4503_1 + + + +EXT_UH01_e004->TRO121 + + + + + +EXTERN + + + +legend +—— normal +standard transfer (jam area to jam area) +—— dir2 +switch output, direction 2 (FC_Direction) +—— dir3 +switch output, direction 3 (FC_Direction) +—— bypass +bypass around a storage block (PinStore) +—— finger +chain-conveyor finger / index transfer +—— EXTERN +infeed / outfeed to another PLC (EXTERN) + + + diff --git a/doc/TRO_Katalog/tro_graphs/uh02.dot b/doc/TRO_Katalog/tro_graphs/uh02.dot new file mode 100644 index 0000000..aaef423 --- /dev/null +++ b/doc/TRO_Katalog/tro_graphs/uh02.dot @@ -0,0 +1,239 @@ +digraph UH02 { + rankdir=LR; + bgcolor="white"; + labelloc="t"; + label=<UH02 — TRO topology (nodes coloured by type, edges by connection kind)>; + fontname="Segoe UI"; fontsize=18; + node [fontname="Segoe UI", fontsize=11, style="rounded,filled", shape=box, penwidth=1.6]; + edge [fontname="Segoe UI", fontsize=9, arrowsize=0.8]; + + "TRO200" [label="TRO200\nVario", fillcolor="#e8d4f0", color="#883388", shape=box, style="rounded,filled", tooltip="TRO 200 (Vario)"]; + "TRO201" [label="TRO201\n1Sep", fillcolor="#d4e8ff", color="#3388cc", shape=box, style="rounded,filled", tooltip="TRO 201 (1Sep)"]; + "TRO202" [label="TRO202\n1Sep1Swi", fillcolor="#ffe4a0", color="#cc8800", shape=box, style="rounded,filled", tooltip="TRO 202 (1Sep1Switch)+Scanner(BX2103)"]; + "TRO203" [label="TRO203\n1Sep1Swi", fillcolor="#ffe4a0", color="#cc8800", shape=box, style="rounded,filled", tooltip="TRO 203 (1Sep1Switch) + Scanner (BX2111)"]; + "TRO204" [label="TRO204\n1Sep1Swi", fillcolor="#ffe4a0", color="#cc8800", shape=box, style="rounded,filled", tooltip="TRO 204(1Sep1Switch) + Scanner(BX2112)"]; + "TRO205" [label="TRO205\n1Sep1Swi", fillcolor="#ffe4a0", color="#cc8800", shape=box, style="rounded,filled", tooltip="TRO 205 (1Sep1Switch) + Scanner(BX2114)"]; + "TRO206" [label="TRO206\n1Sep1Swi", fillcolor="#ffe4a0", color="#cc8800", shape=box, style="rounded,filled", tooltip="TRO 206 (1Sep1Switch)+Scanner(BX2113)"]; + "TRO207" [label="TRO207\n1Sep", fillcolor="#d4e8ff", color="#3388cc", shape=box, style="rounded,filled", tooltip="TRO 207(1Sep)"]; + "TRO208" [label="TRO208\nPinStore_Auto", fillcolor="#d4f0d4", color="#338833", shape=box3d, style="filled", tooltip="Aufruf: TRO208"]; + "TRO209" [label="TRO209\nVario", fillcolor="#e8d4f0", color="#883388", shape=box, style="rounded,filled", tooltip="TRO 209 (Vario)"]; + "TRO210" [label="TRO210\n1Sep", fillcolor="#d4e8ff", color="#3388cc", shape=box, style="rounded,filled", tooltip="TRO 210 (1Sep)"]; + "TRO211" [label="TRO211\nPinStore_Auto", fillcolor="#d4f0d4", color="#338833", shape=box3d, style="filled", tooltip="Aufruf: TRO211"]; + "TRO212" [label="TRO212\nVario", fillcolor="#e8d4f0", color="#883388", shape=box, style="rounded,filled", tooltip="TRO 212 (Vario)"]; + "TRO213" [label="TRO213\n1Sep", fillcolor="#d4e8ff", color="#3388cc", shape=box, style="rounded,filled", tooltip="TRO 213 (1Sep)"]; + "TRO214" [label="TRO214\nPinStore_Auto", fillcolor="#d4f0d4", color="#338833", shape=box3d, style="filled", tooltip="Aufruf: TRO214"]; + "TRO215" [label="TRO215\nVario", fillcolor="#e8d4f0", color="#883388", shape=box, style="rounded,filled", tooltip="TRO 215 (Vario)"]; + "TRO216" [label="TRO216\n1Sep", fillcolor="#d4e8ff", color="#3388cc", shape=box, style="rounded,filled", tooltip="TRO 216 (1Sep)"]; + "TRO217" [label="TRO217\nPinStore_Auto", fillcolor="#d4f0d4", color="#338833", shape=box3d, style="filled", tooltip="Aufruf: TRO217"]; + "TRO218" [label="TRO218\nVario", fillcolor="#e8d4f0", color="#883388", shape=box, style="rounded,filled", tooltip="TRO 218 (Vario)"]; + "TRO219" [label="TRO219\n1Sep", fillcolor="#d4e8ff", color="#3388cc", shape=box, style="rounded,filled", tooltip="TRO 219(1Sep)"]; + "TRO220" [label="TRO220\nVario", fillcolor="#e8d4f0", color="#883388", shape=box, style="rounded,filled", tooltip="TRO 220 (Vario)"]; + "TRO221" [label="TRO221\n1Sep", fillcolor="#d4e8ff", color="#3388cc", shape=box, style="rounded,filled", tooltip="TRO 221 (1Sep)"]; + "TRO222" [label="TRO222\n1Sep1Swi", fillcolor="#ffe4a0", color="#cc8800", shape=box, style="rounded,filled", tooltip="TRO 222 (1Sep1Switch)+Scanner(BX2121)"]; + "TRO223" [label="TRO223\n1Sep1Swi", fillcolor="#ffe4a0", color="#cc8800", shape=box, style="rounded,filled", tooltip="TRO 223 (1Sep1Switch)+Scanner(BX2126)"]; + "TRO224" [label="TRO224\n1Sep1Swi", fillcolor="#ffe4a0", color="#cc8800", shape=box, style="rounded,filled", tooltip="TRO 224 (1Sep1Switch)+Scanner(BX2127)"]; + "TRO225" [label="TRO225\n1Sep1Swi", fillcolor="#ffe4a0", color="#cc8800", shape=box, style="rounded,filled", tooltip="TRO 225(1Sep1Switch)+Scanner(BX2129)"]; + "TRO226" [label="TRO226\n1Sep1Swi", fillcolor="#ffe4a0", color="#cc8800", shape=box, style="rounded,filled", tooltip="TRO 226 (1Sep1Switch)+Scanner(BX2128)"]; + "TRO227" [label="TRO227\n1Sep", fillcolor="#d4e8ff", color="#3388cc", shape=box, style="rounded,filled", tooltip="TRO 227 (1Sep)"]; + "TRO228" [label="TRO228\nPinStore_Auto", fillcolor="#d4f0d4", color="#338833", shape=box3d, style="filled", tooltip="Aufruf: TRO228"]; + "TRO229" [label="TRO229\nVario", fillcolor="#e8d4f0", color="#883388", shape=box, style="rounded,filled", tooltip="TRO 229 (Vario)"]; + "TRO230" [label="TRO230\n1Sep", fillcolor="#d4e8ff", color="#3388cc", shape=box, style="rounded,filled", tooltip="TRO 230 (1Sep)"]; + "TRO231" [label="TRO231\nPinStore_Auto", fillcolor="#d4f0d4", color="#338833", shape=box3d, style="filled", tooltip="Aufruf: TRO231"]; + "TRO232" [label="TRO232\nVario", fillcolor="#e8d4f0", color="#883388", shape=box, style="rounded,filled", tooltip="TRO 232 (Vario)"]; + "TRO233" [label="TRO233\n1Sep", fillcolor="#d4e8ff", color="#3388cc", shape=box, style="rounded,filled", tooltip="TRO 233 (1Sep)"]; + "TRO234" [label="TRO234\nPinStore_Auto", fillcolor="#d4f0d4", color="#338833", shape=box3d, style="filled", tooltip="Aufruf: TRO234"]; + "TRO235" [label="TRO235\nVario", fillcolor="#e8d4f0", color="#883388", shape=box, style="rounded,filled", tooltip="TRO 235 (Vario)"]; + "TRO236" [label="TRO236\n1Sep", fillcolor="#d4e8ff", color="#3388cc", shape=box, style="rounded,filled", tooltip="TRO 236 (1Sep)"]; + "TRO237" [label="TRO237\nPinStore_Auto", fillcolor="#d4f0d4", color="#338833", shape=box3d, style="filled", tooltip="Aufruf: TRO237"]; + "TRO238" [label="TRO238\nVario", fillcolor="#e8d4f0", color="#883388", shape=box, style="rounded,filled", tooltip="TRO 238 (Vario)"]; + "TRO239" [label="TRO239\n1Sep", fillcolor="#d4e8ff", color="#3388cc", shape=box, style="rounded,filled", tooltip="TRO 239 (1Sep)"]; + "TRO240" [label="TRO240\nVario", fillcolor="#e8d4f0", color="#883388", shape=box, style="rounded,filled", tooltip="TRO 240 (Vario)"]; + "TRO241" [label="TRO241\n1Sep", fillcolor="#d4e8ff", color="#3388cc", shape=box, style="rounded,filled", tooltip="TRO 241(1Sep)"]; + "TRO242" [label="TRO242\n1Sep1Swi", fillcolor="#ffe4a0", color="#cc8800", shape=box, style="rounded,filled", tooltip="TRO 242 (1Sep1Switch)+Scanner(BX2130)"]; + "TRO243" [label="TRO243\n1Sep1Swi", fillcolor="#ffe4a0", color="#cc8800", shape=box, style="rounded,filled", tooltip="TRO 243 (1Sep1Switch)+Scanner(BX3137)"]; + "TRO244" [label="TRO244\n1Sep1Swi", fillcolor="#ffe4a0", color="#cc8800", shape=box, style="rounded,filled", tooltip="TRO 244 (1Sep1Switch)+Scanner(BX2136)"]; + "TRO245" [label="TRO245\n1Sep1Swi", fillcolor="#ffe4a0", color="#cc8800", shape=box, style="rounded,filled", tooltip="TRO 245 (1Sep1Switch)+Scanner(BX2138)"]; + "TRO246" [label="TRO246\n1Sep1Swi", fillcolor="#ffe4a0", color="#cc8800", shape=box, style="rounded,filled", tooltip="TRO 246 (1Sep1Switch)+Scanner(BX2137)"]; + "TRO247" [label="TRO247\n1Sep", fillcolor="#d4e8ff", color="#3388cc", shape=box, style="rounded,filled", tooltip="TRO 247(1Sep)"]; + "TRO248" [label="TRO248\nPinStore_Auto", fillcolor="#d4f0d4", color="#338833", shape=box3d, style="filled", tooltip="Aufruf: TRO248"]; + "TRO249" [label="TRO249\nVario", fillcolor="#e8d4f0", color="#883388", shape=box, style="rounded,filled", tooltip="TRO 249 (Vario)"]; + "TRO250" [label="TRO250\n1Sep", fillcolor="#d4e8ff", color="#3388cc", shape=box, style="rounded,filled", tooltip="TRO 250 (1Sep)"]; + "TRO251" [label="TRO251\nPinStore_Auto", fillcolor="#d4f0d4", color="#338833", shape=box3d, style="filled", tooltip="Aufruf: TRO251"]; + "TRO252" [label="TRO252\nVario", fillcolor="#e8d4f0", color="#883388", shape=box, style="rounded,filled", tooltip="TRO 252 (Vario)"]; + "TRO253" [label="TRO253\n1Sep", fillcolor="#d4e8ff", color="#3388cc", shape=box, style="rounded,filled", tooltip="TRO 253 (1Sep)"]; + "TRO254" [label="TRO254\nPinStore_Auto", fillcolor="#d4f0d4", color="#338833", shape=box3d, style="filled", tooltip="Aufruf: TRO254"]; + "TRO255" [label="TRO255\nVario", fillcolor="#e8d4f0", color="#883388", shape=box, style="rounded,filled", tooltip="TRO 255 (Vario)"]; + "TRO256" [label="TRO256\n1Sep", fillcolor="#d4e8ff", color="#3388cc", shape=box, style="rounded,filled", tooltip="TRO 256 (1Sep)"]; + "TRO257" [label="TRO257\nPinStore_Auto", fillcolor="#d4f0d4", color="#338833", shape=box3d, style="filled", tooltip="Aufruf: TRO257"]; + "TRO258" [label="TRO258\nVario", fillcolor="#e8d4f0", color="#883388", shape=box, style="rounded,filled", tooltip="TRO 258 (Vario)"]; + "TRO259" [label="TRO259\n1Sep", fillcolor="#d4e8ff", color="#3388cc", shape=box, style="rounded,filled", tooltip="TRO 259 (1Sep)"]; + "TRO260" [label="TRO260\nVario", fillcolor="#e8d4f0", color="#883388", shape=box, style="rounded,filled", tooltip="TRO 260 (Vario) + Scanner (BX2115)"]; + "TRO261" [label="TRO261\n1Sep", fillcolor="#d4e8ff", color="#3388cc", shape=box, style="rounded,filled", tooltip="TRO 261 (1Sep)"]; + "TRO262" [label="TRO262\nVario", fillcolor="#e8d4f0", color="#883388", shape=box, style="rounded,filled", tooltip="TRO 262 (Vario) + Scanner (BX2109)"]; + "TRO263" [label="TRO263\n1Sep", fillcolor="#d4e8ff", color="#3388cc", shape=box, style="rounded,filled", tooltip="TRO 263 (1Sep)"]; + "TRO264" [label="TRO264\nVario", fillcolor="#e8d4f0", color="#883388", shape=box, style="rounded,filled", tooltip="TRO 264 (Vario) + Scanner (BX2108)"]; + "TRO265" [label="TRO265\n1Sep", fillcolor="#d4e8ff", color="#3388cc", shape=box, style="rounded,filled", tooltip="TRO 265 (1Sep)"]; + "TRO266" [label="TRO266\n1Sep", fillcolor="#d4e8ff", color="#3388cc", shape=box, style="rounded,filled", tooltip="TRO 266(1Sep)"]; + "TRO267" [label="TRO267\n1Sep2Swi", fillcolor="#ffe4a0", color="#cc8800", shape=box, style="rounded,filled", tooltip="TRO 267 (1Sep2Switch)+Scanner(BX2100)"]; + "TRO268" [label="TRO268\n1Sep2Swi", fillcolor="#ffe4a0", color="#cc8800", shape=box, style="rounded,filled", tooltip="TRO 268 (1Sep2Switch)+Scanner(BX2101)"]; + "TRO269" [label="TRO269\n1Sep", fillcolor="#d4e8ff", color="#3388cc", shape=box, style="rounded,filled", tooltip="TRO 269 (1Sep)+Scanner (BX2102)"]; + "TRO270" [label="TRO270\nVario", fillcolor="#e8d4f0", color="#883388", shape=box, style="rounded,filled", tooltip="TRO 270 (Vario)"]; + "TRO272" [label="TRO272\nVario", fillcolor="#e8d4f0", color="#883388", shape=box, style="rounded,filled", tooltip="TRO 272 (Vario)"]; + "TRO274" [label="TRO274\n1Sep", fillcolor="#d4e8ff", color="#3388cc", shape=box, style="rounded,filled", tooltip="TRO 274 (1Sep)"]; + "TRO275" [label="TRO275\n1Sep", fillcolor="#d4e8ff", color="#3388cc", shape=box, style="rounded,filled", tooltip="TRO 275 (1Sep)"]; + + "EXT_UH02_e001" [label="EXTERN\nJA1109_1", shape=cds, fillcolor="#eef2f7", color="#557799", style="filled", fontsize=9]; + "EXT_UH02_e002" [label="EXTERN\nJA1209_1", shape=cds, fillcolor="#eef2f7", color="#557799", style="filled", fontsize=9]; + "EXT_UH02_e003" [label="EXTERN\nJA1302_3", shape=cds, fillcolor="#eef2f7", color="#557799", style="filled", fontsize=9]; + "EXT_UH02_e004" [label="EXTERN\nJA1302_3", shape=cds, fillcolor="#eef2f7", color="#557799", style="filled", fontsize=9]; + "EXT_UH02_e005" [label="EXTERN\nJA1309_1", shape=cds, fillcolor="#eef2f7", color="#557799", style="filled", fontsize=9]; + "EXT_UH02_e006" [label="EXTERN\nJA1401_1", shape=cds, fillcolor="#eef2f7", color="#557799", style="filled", fontsize=9]; + "EXT_UH02_e007" [label="EXTERN\nJA1501_1", shape=cds, fillcolor="#eef2f7", color="#557799", style="filled", fontsize=9]; + "EXT_UH02_e008" [label="EXTERN\nJA1601_1", shape=cds, fillcolor="#eef2f7", color="#557799", style="filled", fontsize=9]; + "EXT_UH02_e009" [label="EXTERN\nJA1801_1", shape=cds, fillcolor="#eef2f7", color="#557799", style="filled", fontsize=9]; + "EXT_UH02_e010" [label="EXTERN\nJA4701_1", shape=cds, fillcolor="#eef2f7", color="#557799", style="filled", fontsize=9]; + "EXT_UH02_e011" [label="EXTERN\nStorage1.1.1", shape=cds, fillcolor="#eef2f7", color="#557799", style="filled", fontsize=9]; + "EXT_UH02_e012" [label="EXTERN\nStorage1.1.2", shape=cds, fillcolor="#eef2f7", color="#557799", style="filled", fontsize=9]; + "EXT_UH02_e013" [label="EXTERN\nStorage1.1.3", shape=cds, fillcolor="#eef2f7", color="#557799", style="filled", fontsize=9]; + "EXT_UH02_e014" [label="EXTERN\nStorage1.1.4", shape=cds, fillcolor="#eef2f7", color="#557799", style="filled", fontsize=9]; + "EXT_UH02_e015" [label="EXTERN\nStorage1.2.1", shape=cds, fillcolor="#eef2f7", color="#557799", style="filled", fontsize=9]; + "EXT_UH02_e016" [label="EXTERN\nStorage1.2.2", shape=cds, fillcolor="#eef2f7", color="#557799", style="filled", fontsize=9]; + "EXT_UH02_e017" [label="EXTERN\nStorage1.2.3", shape=cds, fillcolor="#eef2f7", color="#557799", style="filled", fontsize=9]; + "EXT_UH02_e018" [label="EXTERN\nStorage1.2.4", shape=cds, fillcolor="#eef2f7", color="#557799", style="filled", fontsize=9]; + "EXT_UH02_e019" [label="EXTERN\nStorage1.3.1", shape=cds, fillcolor="#eef2f7", color="#557799", style="filled", fontsize=9]; + "EXT_UH02_e020" [label="EXTERN\nStorage1.3.2", shape=cds, fillcolor="#eef2f7", color="#557799", style="filled", fontsize=9]; + "EXT_UH02_e021" [label="EXTERN\nStorage1.3.3", shape=cds, fillcolor="#eef2f7", color="#557799", style="filled", fontsize=9]; + "EXT_UH02_e022" [label="EXTERN\nStorage1.3.4", shape=cds, fillcolor="#eef2f7", color="#557799", style="filled", fontsize=9]; + "EXT_UH02_e023" [label="EXTERN\nIO_Device_UH02_TO_UH01.stCARRIER_INFO", shape=cds, fillcolor="#eef2f7", color="#557799", style="filled", fontsize=9]; + "EXT_UH02_e024" [label="EXTERN\nIO_Device_UH02_TO_UH01.stCARRIER_INFO_1", shape=cds, fillcolor="#eef2f7", color="#557799", style="filled", fontsize=9]; + "EXT_UH02_e025" [label="EXTERN\nIO_Device_UH02_TO_UH01.stCARRIER_INFO_2", shape=cds, fillcolor="#eef2f7", color="#557799", style="filled", fontsize=9]; + + "TRO202" -> "TRO211" [color="#cc8800", penwidth=1.3, style="dashed", label="dir2", fontcolor="#cc8800", tooltip="JA1101_1 (dir2)"]; + "TRO213" -> "TRO211" [color="#444444", penwidth=1.3, tooltip="JA1101_1 (normal)"]; + "TRO211" -> "TRO208" [color="#3388cc", penwidth=2.2, style="dashed", label="bypass", fontcolor="#3388cc", tooltip="JA1101_2 (bypass)"]; + "TRO210" -> "TRO208" [color="#444444", penwidth=1.3, tooltip="JA1101_2 (normal)"]; + "TRO201" -> "TRO202" [color="#444444", penwidth=1.3, tooltip="JA1102_1 (normal)"]; + "TRO202" -> "TRO214" [color="#444444", penwidth=1.3, tooltip="JA1102_2 (normal)"]; + "TRO216" -> "TRO214" [color="#444444", penwidth=1.3, tooltip="JA1102_2 (normal)"]; + "TRO214" -> "TRO217" [color="#3388cc", penwidth=2.2, style="dashed", label="bypass", fontcolor="#3388cc", tooltip="JA1102_3 (bypass)"]; + "TRO219" -> "TRO217" [color="#444444", penwidth=1.3, tooltip="JA1102_3 (normal)"]; + "TRO208" -> "TRO203" [color="#444444", penwidth=1.3, tooltip="JA1103_1 (normal)"]; + "TRO211" -> "TRO204" [color="#444444", penwidth=1.3, tooltip="JA1103_2 (normal)"]; + "TRO203" -> "TRO204" [color="#cc8800", penwidth=1.3, style="dashed", label="dir2", fontcolor="#cc8800", tooltip="JA1103_2 (dir2)"]; + "TRO217" -> "TRO205" [color="#444444", penwidth=1.3, tooltip="JA1104_1 (normal)"]; + "TRO214" -> "TRO206" [color="#444444", penwidth=1.3, tooltip="JA1104_2 (normal)"]; + "TRO205" -> "TRO206" [color="#444444", penwidth=1.3, tooltip="JA1104_2 (normal)"]; + "TRO204" -> "TRO207" [color="#cc8800", penwidth=1.3, style="dashed", label="dir2", fontcolor="#cc8800", tooltip="JA1104_3 (dir2)"]; + "TRO206" -> "TRO207" [color="#444444", penwidth=1.3, tooltip="JA1104_3 (normal)"]; + "TRO203" -> "TRO209" [color="#444444", penwidth=1.3, tooltip="JA1105_1 (normal)"]; + "TRO209" -> "TRO210" [color="#883388", penwidth=2.2, style="dashdot", label="finger", fontcolor="#883388", tooltip="JA1105_2 (finger)"]; + "TRO204" -> "TRO212" [color="#444444", penwidth=1.3, tooltip="JA1106_1 (normal)"]; + "TRO212" -> "TRO213" [color="#883388", penwidth=2.2, style="dashdot", label="finger", fontcolor="#883388", tooltip="JA1106_2 (finger)"]; + "TRO206" -> "TRO215" [color="#cc8800", penwidth=1.3, style="dashed", label="dir2", fontcolor="#cc8800", tooltip="JA1107_1 (dir2)"]; + "TRO215" -> "TRO216" [color="#883388", penwidth=2.2, style="dashdot", label="finger", fontcolor="#883388", tooltip="JA1107_2 (finger)"]; + "TRO205" -> "TRO218" [color="#cc8800", penwidth=1.3, style="dashed", label="dir2", fontcolor="#cc8800", tooltip="JA1108_1 (dir2)"]; + "TRO218" -> "TRO219" [color="#883388", penwidth=2.2, style="dashdot", label="finger", fontcolor="#883388", tooltip="JA1108_2 (finger)"]; + "TRO200" -> "TRO201" [color="#883388", penwidth=2.2, style="dashdot", label="finger", fontcolor="#883388", tooltip="JA1109_2 (finger)"]; + "TRO268" -> "TRO269" [color="#b35900", penwidth=1.8, style="dotted", label="dir3", fontcolor="#b35900", tooltip="JA1110_1 (dir3)"]; + "TRO261" -> "TRO274" [color="#444444", penwidth=1.3, tooltip="JA1110_2 (normal)"]; + "TRO269" -> "TRO274" [color="#444444", penwidth=1.3, tooltip="JA1110_2 (normal)"]; + "TRO263" -> "TRO266" [color="#444444", penwidth=1.3, tooltip="JA1110_3 (normal)"]; + "TRO274" -> "TRO266" [color="#444444", penwidth=1.3, tooltip="JA1110_3 (normal)"]; + "TRO265" -> "TRO267" [color="#444444", penwidth=1.3, tooltip="JA1110_4 (normal)"]; + "TRO266" -> "TRO267" [color="#444444", penwidth=1.3, tooltip="JA1110_4 (normal)"]; + "TRO267" -> "TRO275" [color="#b35900", penwidth=1.8, style="dotted", label="dir3", fontcolor="#b35900", tooltip="JA1110_5 (dir3)"]; + "TRO275" -> "TRO268" [color="#444444", penwidth=1.3, tooltip="JA1110_6 (normal)"]; + "TRO222" -> "TRO231" [color="#cc8800", penwidth=1.3, style="dashed", label="dir2", fontcolor="#cc8800", tooltip="JA1201_1 (dir2)"]; + "TRO233" -> "TRO231" [color="#444444", penwidth=1.3, tooltip="JA1201_1 (normal)"]; + "TRO231" -> "TRO228" [color="#3388cc", penwidth=2.2, style="dashed", label="bypass", fontcolor="#3388cc", tooltip="JA1201_2 (bypass)"]; + "TRO230" -> "TRO228" [color="#444444", penwidth=1.3, tooltip="JA1201_2 (normal)"]; + "TRO221" -> "TRO222" [color="#444444", penwidth=1.3, tooltip="JA1202_1 (normal)"]; + "TRO222" -> "TRO234" [color="#444444", penwidth=1.3, tooltip="JA1202_2 (normal)"]; + "TRO236" -> "TRO234" [color="#444444", penwidth=1.3, tooltip="JA1202_2 (normal)"]; + "TRO234" -> "TRO237" [color="#3388cc", penwidth=2.2, style="dashed", label="bypass", fontcolor="#3388cc", tooltip="JA1202_3 (bypass)"]; + "TRO239" -> "TRO237" [color="#444444", penwidth=1.3, tooltip="JA1202_3 (normal)"]; + "TRO228" -> "TRO223" [color="#444444", penwidth=1.3, tooltip="JA1203_1 (normal)"]; + "TRO231" -> "TRO224" [color="#444444", penwidth=1.3, tooltip="JA1203_2 (normal)"]; + "TRO223" -> "TRO224" [color="#cc8800", penwidth=1.3, style="dashed", label="dir2", fontcolor="#cc8800", tooltip="JA1203_2 (dir2)"]; + "TRO237" -> "TRO225" [color="#444444", penwidth=1.3, tooltip="JA1204_1 (normal)"]; + "TRO234" -> "TRO226" [color="#444444", penwidth=1.3, tooltip="JA1204_2 (normal)"]; + "TRO225" -> "TRO226" [color="#444444", penwidth=1.3, tooltip="JA1204_2 (normal)"]; + "TRO224" -> "TRO227" [color="#cc8800", penwidth=1.3, style="dashed", label="dir2", fontcolor="#cc8800", tooltip="JA1204_3 (dir2)"]; + "TRO226" -> "TRO227" [color="#444444", penwidth=1.3, tooltip="JA1204_3 (normal)"]; + "TRO223" -> "TRO229" [color="#444444", penwidth=1.3, tooltip="JA1205_1 (normal)"]; + "TRO229" -> "TRO230" [color="#883388", penwidth=2.2, style="dashdot", label="finger", fontcolor="#883388", tooltip="JA1205_2 (finger)"]; + "TRO224" -> "TRO232" [color="#444444", penwidth=1.3, tooltip="JA1206_1 (normal)"]; + "TRO232" -> "TRO233" [color="#883388", penwidth=2.2, style="dashdot", label="finger", fontcolor="#883388", tooltip="JA1206_2 (finger)"]; + "TRO226" -> "TRO235" [color="#cc8800", penwidth=1.3, style="dashed", label="dir2", fontcolor="#cc8800", tooltip="JA1207_1 (dir2)"]; + "TRO235" -> "TRO236" [color="#883388", penwidth=2.2, style="dashdot", label="finger", fontcolor="#883388", tooltip="JA1207_2 (finger)"]; + "TRO225" -> "TRO238" [color="#cc8800", penwidth=1.3, style="dashed", label="dir2", fontcolor="#cc8800", tooltip="JA1208_1 (dir2)"]; + "TRO238" -> "TRO239" [color="#883388", penwidth=2.2, style="dashdot", label="finger", fontcolor="#883388", tooltip="JA1208_2 (finger)"]; + "TRO220" -> "TRO221" [color="#883388", penwidth=2.2, style="dashdot", label="finger", fontcolor="#883388", tooltip="JA1209_2 (finger)"]; + "TRO248" -> "TRO243" [color="#444444", penwidth=1.3, tooltip="JA1301_1 (normal)"]; + "TRO251" -> "TRO244" [color="#444444", penwidth=1.3, tooltip="JA1301_2 (normal)"]; + "TRO243" -> "TRO244" [color="#444444", penwidth=1.3, tooltip="JA1301_2 (normal)"]; + "TRO257" -> "TRO245" [color="#444444", penwidth=1.3, tooltip="JA1302_1 (normal)"]; + "TRO254" -> "TRO246" [color="#444444", penwidth=1.3, tooltip="JA1302_2 (normal)"]; + "TRO245" -> "TRO246" [color="#cc8800", penwidth=1.3, style="dashed", label="dir2", fontcolor="#cc8800", tooltip="JA1302_2 (dir2)"]; + "TRO242" -> "TRO251" [color="#444444", penwidth=1.3, tooltip="JA1303_1 (normal)"]; + "TRO253" -> "TRO251" [color="#444444", penwidth=1.3, tooltip="JA1303_1 (normal)"]; + "TRO251" -> "TRO248" [color="#3388cc", penwidth=2.2, style="dashed", label="bypass", fontcolor="#3388cc", tooltip="JA1303_2 (bypass)"]; + "TRO250" -> "TRO248" [color="#444444", penwidth=1.3, tooltip="JA1303_2 (normal)"]; + "TRO241" -> "TRO242" [color="#444444", penwidth=1.3, tooltip="JA1304_1 (normal)"]; + "TRO242" -> "TRO254" [color="#cc8800", penwidth=1.3, style="dashed", label="dir2", fontcolor="#cc8800", tooltip="JA1304_2 (dir2)"]; + "TRO256" -> "TRO254" [color="#444444", penwidth=1.3, tooltip="JA1304_2 (normal)"]; + "TRO254" -> "TRO257" [color="#3388cc", penwidth=2.2, style="dashed", label="bypass", fontcolor="#3388cc", tooltip="JA1304_3 (bypass)"]; + "TRO259" -> "TRO257" [color="#444444", penwidth=1.3, tooltip="JA1304_3 (normal)"]; + "TRO243" -> "TRO249" [color="#cc8800", penwidth=1.3, style="dashed", label="dir2", fontcolor="#cc8800", tooltip="JA1305_1 (dir2)"]; + "TRO249" -> "TRO250" [color="#883388", penwidth=2.2, style="dashdot", label="finger", fontcolor="#883388", tooltip="JA1305_2 (finger)"]; + "TRO244" -> "TRO252" [color="#cc8800", penwidth=1.3, style="dashed", label="dir2", fontcolor="#cc8800", tooltip="JA1306_1 (dir2)"]; + "TRO252" -> "TRO253" [color="#883388", penwidth=2.2, style="dashdot", label="finger", fontcolor="#883388", tooltip="JA1306_2 (finger)"]; + "TRO246" -> "TRO255" [color="#444444", penwidth=1.3, tooltip="JA1307_1 (normal)"]; + "TRO255" -> "TRO256" [color="#883388", penwidth=2.2, style="dashdot", label="finger", fontcolor="#883388", tooltip="JA1307_2 (finger)"]; + "TRO245" -> "TRO258" [color="#444444", penwidth=1.3, tooltip="JA1308_1 (normal)"]; + "TRO258" -> "TRO259" [color="#883388", penwidth=2.2, style="dashdot", label="finger", fontcolor="#883388", tooltip="JA1308_2 (finger)"]; + "TRO240" -> "TRO241" [color="#883388", penwidth=2.2, style="dashdot", label="finger", fontcolor="#883388", tooltip="JA1309_2 (finger)"]; + "TRO264" -> "TRO265" [color="#883388", penwidth=2.2, style="dashdot", label="finger", fontcolor="#883388", tooltip="JA1401_2 (finger)"]; + "TRO262" -> "TRO263" [color="#883388", penwidth=2.2, style="dashdot", label="finger", fontcolor="#883388", tooltip="JA1501_2 (finger)"]; + "TRO260" -> "TRO261" [color="#883388", penwidth=2.2, style="dashdot", label="finger", fontcolor="#883388", tooltip="JA1601_2 (finger)"]; + + "EXT_UH02_e001" -> "TRO200" [color="#557799", penwidth=1.3, label="EXTERN", fontcolor="#557799", tooltip="JA1109_1"]; + "EXT_UH02_e002" -> "TRO220" [color="#557799", penwidth=1.3, label="EXTERN", fontcolor="#557799", tooltip="JA1209_1"]; + "TRO244" -> "EXT_UH02_e003" [color="#557799", penwidth=1.3, label="EXTERN", fontcolor="#557799", tooltip="JA1302_3"]; + "TRO246" -> "EXT_UH02_e004" [color="#557799", penwidth=1.3, label="EXTERN", fontcolor="#557799", tooltip="JA1302_3"]; + "EXT_UH02_e005" -> "TRO240" [color="#557799", penwidth=1.3, label="EXTERN", fontcolor="#557799", tooltip="JA1309_1"]; + "EXT_UH02_e006" -> "TRO264" [color="#557799", penwidth=1.3, label="EXTERN", fontcolor="#557799", tooltip="JA1401_1"]; + "EXT_UH02_e007" -> "TRO262" [color="#557799", penwidth=1.3, label="EXTERN", fontcolor="#557799", tooltip="JA1501_1"]; + "EXT_UH02_e008" -> "TRO260" [color="#557799", penwidth=1.3, label="EXTERN", fontcolor="#557799", tooltip="JA1601_1"]; + "EXT_UH02_e009" -> "TRO272" [color="#557799", penwidth=1.3, label="EXTERN", fontcolor="#557799", tooltip="JA1801_1"]; + "EXT_UH02_e010" -> "TRO270" [color="#557799", penwidth=1.3, label="EXTERN", fontcolor="#557799", tooltip="JA4701_1"]; + "EXT_UH02_e011" -> "TRO208" [color="#557799", penwidth=1.3, label="EXTERN", fontcolor="#557799", tooltip="Storage1.1.1"]; + "EXT_UH02_e012" -> "TRO211" [color="#557799", penwidth=1.3, label="EXTERN", fontcolor="#557799", tooltip="Storage1.1.2"]; + "EXT_UH02_e013" -> "TRO214" [color="#557799", penwidth=1.3, label="EXTERN", fontcolor="#557799", tooltip="Storage1.1.3"]; + "EXT_UH02_e014" -> "TRO217" [color="#557799", penwidth=1.3, label="EXTERN", fontcolor="#557799", tooltip="Storage1.1.4"]; + "EXT_UH02_e015" -> "TRO228" [color="#557799", penwidth=1.3, label="EXTERN", fontcolor="#557799", tooltip="Storage1.2.1"]; + "EXT_UH02_e016" -> "TRO231" [color="#557799", penwidth=1.3, label="EXTERN", fontcolor="#557799", tooltip="Storage1.2.2"]; + "EXT_UH02_e017" -> "TRO234" [color="#557799", penwidth=1.3, label="EXTERN", fontcolor="#557799", tooltip="Storage1.2.3"]; + "EXT_UH02_e018" -> "TRO237" [color="#557799", penwidth=1.3, label="EXTERN", fontcolor="#557799", tooltip="Storage1.2.4"]; + "EXT_UH02_e019" -> "TRO248" [color="#557799", penwidth=1.3, label="EXTERN", fontcolor="#557799", tooltip="Storage1.3.1"]; + "EXT_UH02_e020" -> "TRO251" [color="#557799", penwidth=1.3, label="EXTERN", fontcolor="#557799", tooltip="Storage1.3.2"]; + "EXT_UH02_e021" -> "TRO254" [color="#557799", penwidth=1.3, label="EXTERN", fontcolor="#557799", tooltip="Storage1.3.3"]; + "EXT_UH02_e022" -> "TRO257" [color="#557799", penwidth=1.3, label="EXTERN", fontcolor="#557799", tooltip="Storage1.3.4"]; + "TRO207" -> "EXT_UH02_e023" [color="#557799", penwidth=1.3, label="EXTERN", fontcolor="#557799", tooltip="IO_Device_UH02_TO_UH01.stCARRIER_INFO"]; + "TRO227" -> "EXT_UH02_e024" [color="#557799", penwidth=1.3, label="EXTERN", fontcolor="#557799", tooltip="IO_Device_UH02_TO_UH01.stCARRIER_INFO_1"]; + "TRO247" -> "EXT_UH02_e025" [color="#557799", penwidth=1.3, label="EXTERN", fontcolor="#557799", tooltip="IO_Device_UH02_TO_UH01.stCARRIER_INFO_2"]; + + subgraph cluster_legend { + label="Legend"; fontsize=12; color="#cccccc"; style="rounded"; + node [shape=plaintext, style="", fillcolor="none", fontsize=10]; + legend [label=< + + + + + + + +
—— normalstandard transfer (jam area to jam area)
—— dir2switch output, direction 2 (FC_Direction)
—— dir3switch output, direction 3 (FC_Direction)
—— bypassbypass around a storage block (PinStore)
—— fingerchain-conveyor finger / index transfer
—— EXTERNinfeed / outfeed to another PLC (EXTERN)
>]; + } +} diff --git a/doc/TRO_Katalog/tro_graphs/uh02.svg b/doc/TRO_Katalog/tro_graphs/uh02.svg new file mode 100644 index 0000000..5dc2955 --- /dev/null +++ b/doc/TRO_Katalog/tro_graphs/uh02.svg @@ -0,0 +1,2069 @@ + + + + + + +UH02 + +UH02 + — TRO topology (nodes coloured by type, edges by connection kind) + +cluster_legend + +Legend + + + +TRO200 + + +TRO200 +Vario + + + + + +TRO201 + + +TRO201 +1Sep + + + + + +TRO200->TRO201 + + + + + +finger + + + +TRO202 + + +TRO202 +1Sep1Swi + + + + + +TRO201->TRO202 + + + + + + + + +TRO211 + + + + + +TRO211 +PinStore_Auto + + + + + +TRO202->TRO211 + + + + + +dir2 + + + +TRO214 + + + + + +TRO214 +PinStore_Auto + + + + + +TRO202->TRO214 + + + + + + + + +TRO203 + + +TRO203 +1Sep1Swi + + + + + +TRO204 + + +TRO204 +1Sep1Swi + + + + + +TRO203->TRO204 + + + + + +dir2 + + + +TRO209 + + +TRO209 +Vario + + + + + +TRO203->TRO209 + + + + + + + + +TRO207 + + +TRO207 +1Sep + + + + + +TRO204->TRO207 + + + + + +dir2 + + + +TRO212 + + +TRO212 +Vario + + + + + +TRO204->TRO212 + + + + + + + + +TRO205 + + +TRO205 +1Sep1Swi + + + + + +TRO206 + + +TRO206 +1Sep1Swi + + + + + +TRO205->TRO206 + + + + + + + + +TRO218 + + +TRO218 +Vario + + + + + +TRO205->TRO218 + + + + + +dir2 + + + +TRO206->TRO207 + + + + + + + + +TRO215 + + +TRO215 +Vario + + + + + +TRO206->TRO215 + + + + + +dir2 + + + +EXT_UH02_e023 + +EXTERN +IO_Device_UH02_TO_UH01.stCARRIER_INFO + + + +TRO207->EXT_UH02_e023 + + + + + +EXTERN + + + +TRO208 + + + + + +TRO208 +PinStore_Auto + + + + + +TRO208->TRO203 + + + + + + + + +TRO210 + + +TRO210 +1Sep + + + + + +TRO209->TRO210 + + + + + +finger + + + +TRO210->TRO208 + + + + + + + + +TRO211->TRO204 + + + + + + + + +TRO211->TRO208 + + + + + +bypass + + + +TRO213 + + +TRO213 +1Sep + + + + + +TRO212->TRO213 + + + + + +finger + + + +TRO213->TRO211 + + + + + + + + +TRO214->TRO206 + + + + + + + + +TRO217 + + + + + +TRO217 +PinStore_Auto + + + + + +TRO214->TRO217 + + + + + +bypass + + + +TRO216 + + +TRO216 +1Sep + + + + + +TRO215->TRO216 + + + + + +finger + + + +TRO216->TRO214 + + + + + + + + +TRO217->TRO205 + + + + + + + + +TRO219 + + +TRO219 +1Sep + + + + + +TRO218->TRO219 + + + + + +finger + + + +TRO219->TRO217 + + + + + + + + +TRO220 + + +TRO220 +Vario + + + + + +TRO221 + + +TRO221 +1Sep + + + + + +TRO220->TRO221 + + + + + +finger + + + +TRO222 + + +TRO222 +1Sep1Swi + + + + + +TRO221->TRO222 + + + + + + + + +TRO231 + + + + + +TRO231 +PinStore_Auto + + + + + +TRO222->TRO231 + + + + + +dir2 + + + +TRO234 + + + + + +TRO234 +PinStore_Auto + + + + + +TRO222->TRO234 + + + + + + + + +TRO223 + + +TRO223 +1Sep1Swi + + + + + +TRO224 + + +TRO224 +1Sep1Swi + + + + + +TRO223->TRO224 + + + + + +dir2 + + + +TRO229 + + +TRO229 +Vario + + + + + +TRO223->TRO229 + + + + + + + + +TRO227 + + +TRO227 +1Sep + + + + + +TRO224->TRO227 + + + + + +dir2 + + + +TRO232 + + +TRO232 +Vario + + + + + +TRO224->TRO232 + + + + + + + + +TRO225 + + +TRO225 +1Sep1Swi + + + + + +TRO226 + + +TRO226 +1Sep1Swi + + + + + +TRO225->TRO226 + + + + + + + + +TRO238 + + +TRO238 +Vario + + + + + +TRO225->TRO238 + + + + + +dir2 + + + +TRO226->TRO227 + + + + + + + + +TRO235 + + +TRO235 +Vario + + + + + +TRO226->TRO235 + + + + + +dir2 + + + +EXT_UH02_e024 + +EXTERN +IO_Device_UH02_TO_UH01.stCARRIER_INFO_1 + + + +TRO227->EXT_UH02_e024 + + + + + +EXTERN + + + +TRO228 + + + + + +TRO228 +PinStore_Auto + + + + + +TRO228->TRO223 + + + + + + + + +TRO230 + + +TRO230 +1Sep + + + + + +TRO229->TRO230 + + + + + +finger + + + +TRO230->TRO228 + + + + + + + + +TRO231->TRO224 + + + + + + + + +TRO231->TRO228 + + + + + +bypass + + + +TRO233 + + +TRO233 +1Sep + + + + + +TRO232->TRO233 + + + + + +finger + + + +TRO233->TRO231 + + + + + + + + +TRO234->TRO226 + + + + + + + + +TRO237 + + + + + +TRO237 +PinStore_Auto + + + + + +TRO234->TRO237 + + + + + +bypass + + + +TRO236 + + +TRO236 +1Sep + + + + + +TRO235->TRO236 + + + + + +finger + + + +TRO236->TRO234 + + + + + + + + +TRO237->TRO225 + + + + + + + + +TRO239 + + +TRO239 +1Sep + + + + + +TRO238->TRO239 + + + + + +finger + + + +TRO239->TRO237 + + + + + + + + +TRO240 + + +TRO240 +Vario + + + + + +TRO241 + + +TRO241 +1Sep + + + + + +TRO240->TRO241 + + + + + +finger + + + +TRO242 + + +TRO242 +1Sep1Swi + + + + + +TRO241->TRO242 + + + + + + + + +TRO251 + + + + + +TRO251 +PinStore_Auto + + + + + +TRO242->TRO251 + + + + + + + + +TRO254 + + + + + +TRO254 +PinStore_Auto + + + + + +TRO242->TRO254 + + + + + +dir2 + + + +TRO243 + + +TRO243 +1Sep1Swi + + + + + +TRO244 + + +TRO244 +1Sep1Swi + + + + + +TRO243->TRO244 + + + + + + + + +TRO249 + + +TRO249 +Vario + + + + + +TRO243->TRO249 + + + + + +dir2 + + + +TRO252 + + +TRO252 +Vario + + + + + +TRO244->TRO252 + + + + + +dir2 + + + +EXT_UH02_e003 + +EXTERN +JA1302_3 + + + +TRO244->EXT_UH02_e003 + + + + + +EXTERN + + + +TRO245 + + +TRO245 +1Sep1Swi + + + + + +TRO246 + + +TRO246 +1Sep1Swi + + + + + +TRO245->TRO246 + + + + + +dir2 + + + +TRO258 + + +TRO258 +Vario + + + + + +TRO245->TRO258 + + + + + + + + +TRO255 + + +TRO255 +Vario + + + + + +TRO246->TRO255 + + + + + + + + +EXT_UH02_e004 + +EXTERN +JA1302_3 + + + +TRO246->EXT_UH02_e004 + + + + + +EXTERN + + + +TRO247 + + +TRO247 +1Sep + + + + + +EXT_UH02_e025 + +EXTERN +IO_Device_UH02_TO_UH01.stCARRIER_INFO_2 + + + +TRO247->EXT_UH02_e025 + + + + + +EXTERN + + + +TRO248 + + + + + +TRO248 +PinStore_Auto + + + + + +TRO248->TRO243 + + + + + + + + +TRO250 + + +TRO250 +1Sep + + + + + +TRO249->TRO250 + + + + + +finger + + + +TRO250->TRO248 + + + + + + + + +TRO251->TRO244 + + + + + + + + +TRO251->TRO248 + + + + + +bypass + + + +TRO253 + + +TRO253 +1Sep + + + + + +TRO252->TRO253 + + + + + +finger + + + +TRO253->TRO251 + + + + + + + + +TRO254->TRO246 + + + + + + + + +TRO257 + + + + + +TRO257 +PinStore_Auto + + + + + +TRO254->TRO257 + + + + + +bypass + + + +TRO256 + + +TRO256 +1Sep + + + + + +TRO255->TRO256 + + + + + +finger + + + +TRO256->TRO254 + + + + + + + + +TRO257->TRO245 + + + + + + + + +TRO259 + + +TRO259 +1Sep + + + + + +TRO258->TRO259 + + + + + +finger + + + +TRO259->TRO257 + + + + + + + + +TRO260 + + +TRO260 +Vario + + + + + +TRO261 + + +TRO261 +1Sep + + + + + +TRO260->TRO261 + + + + + +finger + + + +TRO274 + + +TRO274 +1Sep + + + + + +TRO261->TRO274 + + + + + + + + +TRO262 + + +TRO262 +Vario + + + + + +TRO263 + + +TRO263 +1Sep + + + + + +TRO262->TRO263 + + + + + +finger + + + +TRO266 + + +TRO266 +1Sep + + + + + +TRO263->TRO266 + + + + + + + + +TRO264 + + +TRO264 +Vario + + + + + +TRO265 + + +TRO265 +1Sep + + + + + +TRO264->TRO265 + + + + + +finger + + + +TRO267 + + +TRO267 +1Sep2Swi + + + + + +TRO265->TRO267 + + + + + + + + +TRO266->TRO267 + + + + + + + + +TRO275 + + +TRO275 +1Sep + + + + + +TRO267->TRO275 + + + + + +dir3 + + + +TRO268 + + +TRO268 +1Sep2Swi + + + + + +TRO269 + + +TRO269 +1Sep + + + + + +TRO268->TRO269 + + + + + +dir3 + + + +TRO269->TRO274 + + + + + + + + +TRO270 + + +TRO270 +Vario + + + + + +TRO272 + + +TRO272 +Vario + + + + + +TRO274->TRO266 + + + + + + + + +TRO275->TRO268 + + + + + + + + +EXT_UH02_e001 + +EXTERN +JA1109_1 + + + +EXT_UH02_e001->TRO200 + + + + + +EXTERN + + + +EXT_UH02_e002 + +EXTERN +JA1209_1 + + + +EXT_UH02_e002->TRO220 + + + + + +EXTERN + + + +EXT_UH02_e005 + +EXTERN +JA1309_1 + + + +EXT_UH02_e005->TRO240 + + + + + +EXTERN + + + +EXT_UH02_e006 + +EXTERN +JA1401_1 + + + +EXT_UH02_e006->TRO264 + + + + + +EXTERN + + + +EXT_UH02_e007 + +EXTERN +JA1501_1 + + + +EXT_UH02_e007->TRO262 + + + + + +EXTERN + + + +EXT_UH02_e008 + +EXTERN +JA1601_1 + + + +EXT_UH02_e008->TRO260 + + + + + +EXTERN + + + +EXT_UH02_e009 + +EXTERN +JA1801_1 + + + +EXT_UH02_e009->TRO272 + + + + + +EXTERN + + + +EXT_UH02_e010 + +EXTERN +JA4701_1 + + + +EXT_UH02_e010->TRO270 + + + + + +EXTERN + + + +EXT_UH02_e011 + +EXTERN +Storage1.1.1 + + + +EXT_UH02_e011->TRO208 + + + + + +EXTERN + + + +EXT_UH02_e012 + +EXTERN +Storage1.1.2 + + + +EXT_UH02_e012->TRO211 + + + + + +EXTERN + + + +EXT_UH02_e013 + +EXTERN +Storage1.1.3 + + + +EXT_UH02_e013->TRO214 + + + + + +EXTERN + + + +EXT_UH02_e014 + +EXTERN +Storage1.1.4 + + + +EXT_UH02_e014->TRO217 + + + + + +EXTERN + + + +EXT_UH02_e015 + +EXTERN +Storage1.2.1 + + + +EXT_UH02_e015->TRO228 + + + + + +EXTERN + + + +EXT_UH02_e016 + +EXTERN +Storage1.2.2 + + + +EXT_UH02_e016->TRO231 + + + + + +EXTERN + + + +EXT_UH02_e017 + +EXTERN +Storage1.2.3 + + + +EXT_UH02_e017->TRO234 + + + + + +EXTERN + + + +EXT_UH02_e018 + +EXTERN +Storage1.2.4 + + + +EXT_UH02_e018->TRO237 + + + + + +EXTERN + + + +EXT_UH02_e019 + +EXTERN +Storage1.3.1 + + + +EXT_UH02_e019->TRO248 + + + + + +EXTERN + + + +EXT_UH02_e020 + +EXTERN +Storage1.3.2 + + + +EXT_UH02_e020->TRO251 + + + + + +EXTERN + + + +EXT_UH02_e021 + +EXTERN +Storage1.3.3 + + + +EXT_UH02_e021->TRO254 + + + + + +EXTERN + + + +EXT_UH02_e022 + +EXTERN +Storage1.3.4 + + + +EXT_UH02_e022->TRO257 + + + + + +EXTERN + + + +legend +—— normal +standard transfer (jam area to jam area) +—— dir2 +switch output, direction 2 (FC_Direction) +—— dir3 +switch output, direction 3 (FC_Direction) +—— bypass +bypass around a storage block (PinStore) +—— finger +chain-conveyor finger / index transfer +—— EXTERN +infeed / outfeed to another PLC (EXTERN) + + + diff --git a/doc/TRO_Katalog/tro_graphs/uh03.dot b/doc/TRO_Katalog/tro_graphs/uh03.dot new file mode 100644 index 0000000..61dc6ba --- /dev/null +++ b/doc/TRO_Katalog/tro_graphs/uh03.dot @@ -0,0 +1,273 @@ +digraph UH03 { + rankdir=LR; + bgcolor="white"; + labelloc="t"; + label=<UH03 — TRO topology (nodes coloured by type, edges by connection kind)>; + fontname="Segoe UI"; fontsize=18; + node [fontname="Segoe UI", fontsize=11, style="rounded,filled", shape=box, penwidth=1.6]; + edge [fontname="Segoe UI", fontsize=9, arrowsize=0.8]; + + "TRO300" [label="TRO300\nVario", fillcolor="#e8d4f0", color="#883388", shape=box, style="rounded,filled", tooltip="TRO 300 (Vario)"]; + "TRO301" [label="TRO301\n1Sep", fillcolor="#d4e8ff", color="#3388cc", shape=box, style="rounded,filled", tooltip="TRO 301(1Sep)"]; + "TRO302" [label="TRO302\nVario", fillcolor="#e8d4f0", color="#883388", shape=box, style="rounded,filled", tooltip="TRO 302 (Vario)"]; + "TRO303" [label="TRO303\nVario", fillcolor="#e8d4f0", color="#883388", shape=box, style="rounded,filled", tooltip="TRO 303 (Vario)"]; + "TRO304" [label="TRO304\n1Sep", fillcolor="#d4e8ff", color="#3388cc", shape=box, style="rounded,filled", tooltip="TRO 304(1Sep)"]; + "TRO305" [label="TRO305\nVario", fillcolor="#e8d4f0", color="#883388", shape=box, style="rounded,filled", tooltip="TRO 305 (Vario)"]; + "TRO306" [label="TRO306\nVario", fillcolor="#e8d4f0", color="#883388", shape=box, style="rounded,filled", tooltip="TRO 306 (Vario)"]; + "TRO307" [label="TRO307\nVario", fillcolor="#e8d4f0", color="#883388", shape=box, style="rounded,filled", tooltip="TRO 307 (Vario)"]; + "TRO308" [label="TRO308\nVario", fillcolor="#e8d4f0", color="#883388", shape=box, style="rounded,filled", tooltip="TRO 308 (Vario)"]; + "TRO309" [label="TRO309\n1Sep", fillcolor="#d4e8ff", color="#3388cc", shape=box, style="rounded,filled", tooltip="TRO 309 (1Sep)"]; + "TRO310" [label="TRO310\n1Sep", fillcolor="#d4e8ff", color="#3388cc", shape=box, style="rounded,filled", tooltip="TRO 310 (1Sep)+Scanner (BX3102)"]; + "TRO311" [label="TRO311\n1Sep", fillcolor="#d4e8ff", color="#3388cc", shape=box, style="rounded,filled", tooltip="TRO 311 (1Sep)+Scanner(BX3101)"]; + "TRO312" [label="TRO312\n1Sep", fillcolor="#d4e8ff", color="#3388cc", shape=box, style="rounded,filled", tooltip="TRO 312 (1Sep)+Scanner(BX3100)"]; + "TRO313" [label="TRO313\n1Sep1Swi", fillcolor="#ffe4a0", color="#cc8800", shape=box, style="rounded,filled", tooltip="TRO 313 (1Sep1Switch)+Scanner(BX3103)"]; + "TRO314" [label="TRO314\n1Sep1Swi", fillcolor="#ffe4a0", color="#cc8800", shape=box, style="rounded,filled", tooltip="TRO 314 (1Sep1Switch)+Scanner(BX3104)"]; + "TRO315" [label="TRO315\n1Sep", fillcolor="#d4e8ff", color="#3388cc", shape=box, style="rounded,filled", tooltip="TRO 315 (1Sep)"]; + "TRO316" [label="TRO316\n1Sep", fillcolor="#d4e8ff", color="#3388cc", shape=box, style="rounded,filled", tooltip="TRO 316 (1Sep)"]; + "TRO317" [label="TRO317\n1Sep1Swi", fillcolor="#ffe4a0", color="#cc8800", shape=box, style="rounded,filled", tooltip="TRO 317 (1Sep1Switch)+Scanner(BX3105)"]; + "TRO318" [label="TRO318\n1Sep1Swi", fillcolor="#ffe4a0", color="#cc8800", shape=box, style="rounded,filled", tooltip="TRO 318 (1Sep1Switch) + Scanner(BX3106)"]; + "TRO319" [label="TRO319\n1Sep1Swi", fillcolor="#ffe4a0", color="#cc8800", shape=box, style="rounded,filled", tooltip="TRO 319 (1Sep1Switch) + Scanner (BX3111)"]; + "TRO320" [label="TRO320\n1Sep1Swi", fillcolor="#ffe4a0", color="#cc8800", shape=box, style="rounded,filled", tooltip="TRO 320 (1Sep1Switch) + Scanner(BX3112)"]; + "TRO321" [label="TRO321\n1Sep1Swi", fillcolor="#ffe4a0", color="#cc8800", shape=box, style="rounded,filled", tooltip="TRO 321 (1Sep1Switch) + Scanner(BX3114)"]; + "TRO322" [label="TRO322\n1Sep1Swi", fillcolor="#ffe4a0", color="#cc8800", shape=box, style="rounded,filled", tooltip="TRO 322 (1Sep1Switch)+Scanner(BX3113)"]; + "TRO323" [label="TRO323\n1Sep", fillcolor="#d4e8ff", color="#3388cc", shape=box, style="rounded,filled", tooltip="TRO 323 (1Sep)"]; + "TRO324" [label="TRO324\nVario", fillcolor="#e8d4f0", color="#883388", shape=box, style="rounded,filled", tooltip="TRO 324 (Vario)"]; + "TRO325" [label="TRO325\n1Sep", fillcolor="#d4e8ff", color="#3388cc", shape=box, style="rounded,filled", tooltip="TRO 325 (1Sep)"]; + "TRO326" [label="TRO326\n1Sep", fillcolor="#d4e8ff", color="#3388cc", shape=box, style="rounded,filled", tooltip="TRO 326 (1Sep)"]; + "TRO327" [label="TRO327\nPinStore_Auto", fillcolor="#d4f0d4", color="#338833", shape=box3d, style="filled", tooltip="Aufruf: TRO327"]; + "TRO328" [label="TRO328\nVario", fillcolor="#e8d4f0", color="#883388", shape=box, style="rounded,filled", tooltip="TRO 328 (Vario)"]; + "TRO329" [label="TRO329\n1Sep", fillcolor="#d4e8ff", color="#3388cc", shape=box, style="rounded,filled", tooltip="TRO 329 (1Sep)"]; + "TRO330" [label="TRO330\nPinStore_Auto", fillcolor="#d4f0d4", color="#338833", shape=box3d, style="filled", tooltip="Aufruf: TRO330"]; + "TRO331" [label="TRO331\nVario", fillcolor="#e8d4f0", color="#883388", shape=box, style="rounded,filled", tooltip="TRO 331 (Vario)"]; + "TRO332" [label="TRO332\n1Sep", fillcolor="#d4e8ff", color="#3388cc", shape=box, style="rounded,filled", tooltip="TRO 332 (1Sep)"]; + "TRO333" [label="TRO333\nPinStore_Auto", fillcolor="#d4f0d4", color="#338833", shape=box3d, style="filled", tooltip="Aufruf: TRO333"]; + "TRO334" [label="TRO334\nVario", fillcolor="#e8d4f0", color="#883388", shape=box, style="rounded,filled", tooltip="TRO 334 (Vario)"]; + "TRO335" [label="TRO335\n1Sep", fillcolor="#d4e8ff", color="#3388cc", shape=box, style="rounded,filled", tooltip="TRO 335 (1Sep)"]; + "TRO336" [label="TRO336\nPinStore_Auto", fillcolor="#d4f0d4", color="#338833", shape=box3d, style="filled", tooltip="Aufruf: TRO336"]; + "TRO337" [label="TRO337\nVario", fillcolor="#e8d4f0", color="#883388", shape=box, style="rounded,filled", tooltip="TRO 337 (Vario)"]; + "TRO338" [label="TRO338\n1Sep", fillcolor="#d4e8ff", color="#3388cc", shape=box, style="rounded,filled", tooltip="TRO 338 (1Sep)"]; + "TRO339" [label="TRO339\n1Sep1Swi", fillcolor="#ffe4a0", color="#cc8800", shape=box, style="rounded,filled", tooltip="TRO 339 (1Sep1Switch)+Scanner(BX3120)"]; + "TRO340" [label="TRO340\n1Sep1Swi", fillcolor="#ffe4a0", color="#cc8800", shape=box, style="rounded,filled", tooltip="TRO 340 (1Sep1Switch)+Scanner(BX3121)"]; + "TRO341" [label="TRO341\n1Sep1Swi", fillcolor="#ffe4a0", color="#cc8800", shape=box, style="rounded,filled", tooltip="TRO 341 (1Sep1Switch)+Scanner(BX3126)"]; + "TRO342" [label="TRO342\n1Sep1Swi", fillcolor="#ffe4a0", color="#cc8800", shape=box, style="rounded,filled", tooltip="TRO 342 (1Sep1Switch)+Scanner(BX3127)"]; + "TRO343" [label="TRO343\n1Sep1Swi", fillcolor="#ffe4a0", color="#cc8800", shape=box, style="rounded,filled", tooltip="TRO 343 (1Sep1Switch)+Scanner(BX3129)"]; + "TRO344" [label="TRO344\n1Sep1Swi", fillcolor="#ffe4a0", color="#cc8800", shape=box, style="rounded,filled", tooltip="TRO 344 (1Sep1Switch)+Scanner(BX3128)"]; + "TRO345" [label="TRO345\n1Sep", fillcolor="#d4e8ff", color="#3388cc", shape=box, style="rounded,filled", tooltip="TRO 345 (1Sep)"]; + "TRO346" [label="TRO346\nVario", fillcolor="#e8d4f0", color="#883388", shape=box, style="rounded,filled", tooltip="TRO 346 (Vario)"]; + "TRO347" [label="TRO347\n1Sep", fillcolor="#d4e8ff", color="#3388cc", shape=box, style="rounded,filled", tooltip="TRO 347 (1Sep)"]; + "TRO348" [label="TRO348\n1Sep", fillcolor="#d4e8ff", color="#3388cc", shape=box, style="rounded,filled", tooltip="TRO 348 (1Sep)"]; + "TRO349" [label="TRO349\nPinStore_Auto", fillcolor="#d4f0d4", color="#338833", shape=box3d, style="filled", tooltip="Aufruf: TRO349"]; + "TRO350" [label="TRO350\nVario", fillcolor="#e8d4f0", color="#883388", shape=box, style="rounded,filled", tooltip="TRO 350 (Vario)"]; + "TRO351" [label="TRO351\n1Sep", fillcolor="#d4e8ff", color="#3388cc", shape=box, style="rounded,filled", tooltip="TRO 351 (1Sep)"]; + "TRO352" [label="TRO352\nPinStore_Auto", fillcolor="#d4f0d4", color="#338833", shape=box3d, style="filled", tooltip="Aufruf: TRO352"]; + "TRO353" [label="TRO353\nVario", fillcolor="#e8d4f0", color="#883388", shape=box, style="rounded,filled", tooltip="TRO 353 (Vario)"]; + "TRO354" [label="TRO354\n1Sep", fillcolor="#d4e8ff", color="#3388cc", shape=box, style="rounded,filled", tooltip="TRO 354 (1Sep)"]; + "TRO355" [label="TRO355\nPinStore_Auto", fillcolor="#d4f0d4", color="#338833", shape=box3d, style="filled", tooltip="Aufruf: TRO355"]; + "TRO356" [label="TRO356\nVario", fillcolor="#e8d4f0", color="#883388", shape=box, style="rounded,filled", tooltip="TRO 356 (Vario)"]; + "TRO357" [label="TRO357\n1Sep", fillcolor="#d4e8ff", color="#3388cc", shape=box, style="rounded,filled", tooltip="TRO 357 (1Sep)"]; + "TRO358" [label="TRO358\nPinStore_Auto", fillcolor="#d4f0d4", color="#338833", shape=box3d, style="filled", tooltip="Aufruf: TRO358"]; + "TRO359" [label="TRO359\nVario", fillcolor="#e8d4f0", color="#883388", shape=box, style="rounded,filled", tooltip="TRO 359 (Vario)"]; + "TRO360" [label="TRO360\n1Sep", fillcolor="#d4e8ff", color="#3388cc", shape=box, style="rounded,filled", tooltip="TRO 360 (1Sep)"]; + "TRO361" [label="TRO361\n1Sep1Swi", fillcolor="#ffe4a0", color="#cc8800", shape=box, style="rounded,filled", tooltip="TRO 361 (1Sep1Switch)+Scanner(BX3131)"]; + "TRO362" [label="TRO362\n1Sep1Swi", fillcolor="#ffe4a0", color="#cc8800", shape=box, style="rounded,filled", tooltip="TRO 362 (1Sep1Switch)+Scanner(BX3132)"]; + "TRO363" [label="TRO363\n1Sep1Swi", fillcolor="#ffe4a0", color="#cc8800", shape=box, style="rounded,filled", tooltip="TRO 363 (1Sep1Switch)+Scanner(BX3137)"]; + "TRO364" [label="TRO364\n1Sep1Swi", fillcolor="#ffe4a0", color="#cc8800", shape=box, style="rounded,filled", tooltip="TRO 364 (1Sep1Switch)+Scanner(BX3138)"]; + "TRO365" [label="TRO365\n1Sep1Swi", fillcolor="#ffe4a0", color="#cc8800", shape=box, style="rounded,filled", tooltip="TRO 365 (1Sep1Switch)+Scanner(BX3140)"]; + "TRO366" [label="TRO366\n1Sep1Swi", fillcolor="#ffe4a0", color="#cc8800", shape=box, style="rounded,filled", tooltip="TRO 366 (1Sep1Switch)+Scanner(BX3139)"]; + "TRO367" [label="TRO367\n1Sep", fillcolor="#d4e8ff", color="#3388cc", shape=box, style="rounded,filled", tooltip="TRO 367 (1Sep)"]; + "TRO368" [label="TRO368\nVario", fillcolor="#e8d4f0", color="#883388", shape=box, style="rounded,filled", tooltip="TRO 368 (Vario, from Lvl1)"]; + "TRO369" [label="TRO369\n1Sep", fillcolor="#d4e8ff", color="#3388cc", shape=box, style="rounded,filled", tooltip="TRO 369 (1Sep)"]; + "TRO370" [label="TRO370\n1Sep", fillcolor="#d4e8ff", color="#3388cc", shape=box, style="rounded,filled", tooltip="TRO 370 (1Sep)"]; + "TRO371" [label="TRO371\nPinStore_Auto", fillcolor="#d4f0d4", color="#338833", shape=box3d, style="filled", tooltip="Aufruf: TRO371"]; + "TRO372" [label="TRO372\nVario", fillcolor="#e8d4f0", color="#883388", shape=box, style="rounded,filled", tooltip="TRO 372 (Vario)"]; + "TRO373" [label="TRO373\n1Sep", fillcolor="#d4e8ff", color="#3388cc", shape=box, style="rounded,filled", tooltip="TRO 373 (1Sep)"]; + "TRO374" [label="TRO374\nPinStore_Auto", fillcolor="#d4f0d4", color="#338833", shape=box3d, style="filled", tooltip="Aufruf: TRO374"]; + "TRO375" [label="TRO375\nVario", fillcolor="#e8d4f0", color="#883388", shape=box, style="rounded,filled", tooltip="TRO 375 (Vario)"]; + "TRO376" [label="TRO376\n1Sep", fillcolor="#d4e8ff", color="#3388cc", shape=box, style="rounded,filled", tooltip="TRO 376 (1Sep)"]; + "TRO377" [label="TRO377\nPinStore_Auto", fillcolor="#d4f0d4", color="#338833", shape=box3d, style="filled", tooltip="Aufruf: TRO377"]; + "TRO378" [label="TRO378\nVario", fillcolor="#e8d4f0", color="#883388", shape=box, style="rounded,filled", tooltip="TRO 378 (Vario)"]; + "TRO379" [label="TRO379\n1Sep", fillcolor="#d4e8ff", color="#3388cc", shape=box, style="rounded,filled", tooltip="TRO 379 (1Sep)"]; + "TRO380" [label="TRO380\nPinStore_Auto", fillcolor="#d4f0d4", color="#338833", shape=box3d, style="filled", tooltip="Aufruf: TRO380"]; + "TRO381" [label="TRO381\nVario", fillcolor="#e8d4f0", color="#883388", shape=box, style="rounded,filled", tooltip="TRO 381 (Vario)"]; + "TRO382" [label="TRO382\n1Sep", fillcolor="#d4e8ff", color="#3388cc", shape=box, style="rounded,filled", tooltip="TRO 382 (1Sep)"]; + "TRO386" [label="TRO386\n1Sep", fillcolor="#d4e8ff", color="#3388cc", shape=box, style="rounded,filled", tooltip="TRO 386 (1Sep) - kam später dazu"]; + + "EXT_UH03_e001" [label="EXTERN\nJA2102_5", shape=cds, fillcolor="#eef2f7", color="#557799", style="filled", fontsize=9]; + "EXT_UH03_e002" [label="EXTERN\nJA2109_1", shape=cds, fillcolor="#eef2f7", color="#557799", style="filled", fontsize=9]; + "EXT_UH03_e003" [label="EXTERN\nJA2111_1", shape=cds, fillcolor="#eef2f7", color="#557799", style="filled", fontsize=9]; + "EXT_UH03_e004" [label="EXTERN\nJA2202_5", shape=cds, fillcolor="#eef2f7", color="#557799", style="filled", fontsize=9]; + "EXT_UH03_e005" [label="EXTERN\nJA2209_1", shape=cds, fillcolor="#eef2f7", color="#557799", style="filled", fontsize=9]; + "EXT_UH03_e006" [label="EXTERN\nJA2309_1", shape=cds, fillcolor="#eef2f7", color="#557799", style="filled", fontsize=9]; + "EXT_UH03_e007" [label="EXTERN\nJA4102_1", shape=cds, fillcolor="#eef2f7", color="#557799", style="filled", fontsize=9]; + "EXT_UH03_e008" [label="EXTERN\nJA4102_2", shape=cds, fillcolor="#eef2f7", color="#557799", style="filled", fontsize=9]; + "EXT_UH03_e009" [label="EXTERN\nJA4202_1", shape=cds, fillcolor="#eef2f7", color="#557799", style="filled", fontsize=9]; + "EXT_UH03_e010" [label="EXTERN\nJA4202_2", shape=cds, fillcolor="#eef2f7", color="#557799", style="filled", fontsize=9]; + "EXT_UH03_e011" [label="EXTERN\nJA4301_1", shape=cds, fillcolor="#eef2f7", color="#557799", style="filled", fontsize=9]; + "EXT_UH03_e012" [label="EXTERN\nJA4401_1", shape=cds, fillcolor="#eef2f7", color="#557799", style="filled", fontsize=9]; + "EXT_UH03_e013" [label="EXTERN\nStorage2.1.1", shape=cds, fillcolor="#eef2f7", color="#557799", style="filled", fontsize=9]; + "EXT_UH03_e014" [label="EXTERN\nStorage2.1.2", shape=cds, fillcolor="#eef2f7", color="#557799", style="filled", fontsize=9]; + "EXT_UH03_e015" [label="EXTERN\nStorage2.1.3", shape=cds, fillcolor="#eef2f7", color="#557799", style="filled", fontsize=9]; + "EXT_UH03_e016" [label="EXTERN\nStorage2.1.4", shape=cds, fillcolor="#eef2f7", color="#557799", style="filled", fontsize=9]; + "EXT_UH03_e017" [label="EXTERN\nStorage2.2.1", shape=cds, fillcolor="#eef2f7", color="#557799", style="filled", fontsize=9]; + "EXT_UH03_e018" [label="EXTERN\nStorage2.2.2", shape=cds, fillcolor="#eef2f7", color="#557799", style="filled", fontsize=9]; + "EXT_UH03_e019" [label="EXTERN\nStorage2.2.3", shape=cds, fillcolor="#eef2f7", color="#557799", style="filled", fontsize=9]; + "EXT_UH03_e020" [label="EXTERN\nStorage2.2.4", shape=cds, fillcolor="#eef2f7", color="#557799", style="filled", fontsize=9]; + "EXT_UH03_e021" [label="EXTERN\nStorage2.3.1", shape=cds, fillcolor="#eef2f7", color="#557799", style="filled", fontsize=9]; + "EXT_UH03_e022" [label="EXTERN\nStorage2.3.2", shape=cds, fillcolor="#eef2f7", color="#557799", style="filled", fontsize=9]; + "EXT_UH03_e023" [label="EXTERN\nStorage2.3.3", shape=cds, fillcolor="#eef2f7", color="#557799", style="filled", fontsize=9]; + "EXT_UH03_e024" [label="EXTERN\nStorage2.3.4", shape=cds, fillcolor="#eef2f7", color="#557799", style="filled", fontsize=9]; + "EXT_UH03_e025" [label="EXTERN\nIO_Device_UH03_TO_UH01.stCARRIER_INFO", shape=cds, fillcolor="#eef2f7", color="#557799", style="filled", fontsize=9]; + "EXT_UH03_e026" [label="EXTERN\nIO_Device_UH03_TO_UH01.stCARRIER_INFO_1", shape=cds, fillcolor="#eef2f7", color="#557799", style="filled", fontsize=9]; + "EXT_UH03_e027" [label="EXTERN\nIO_Device_UH03_TO_UH01.stCARRIER_INFO_2", shape=cds, fillcolor="#eef2f7", color="#557799", style="filled", fontsize=9]; + "EXT_UH03_e028" [label="EXTERN\nIO_Device_UH03_TO_UH01.stCarrierL2toL1", shape=cds, fillcolor="#eef2f7", color="#557799", style="filled", fontsize=9]; + "EXT_UH03_e029" [label="EXTERN\nIO_Device_UH03_TO_UH01.stCarrierL2toL1_2", shape=cds, fillcolor="#eef2f7", color="#557799", style="filled", fontsize=9]; + "EXT_UH03_e030" [label="EXTERN\nIO_Device_UH03_TO_UH01.stCarrierL2toL1_3", shape=cds, fillcolor="#eef2f7", color="#557799", style="filled", fontsize=9]; + + "TRO318" -> "TRO330" [color="#cc8800", penwidth=1.3, style="dashed", label="dir2", fontcolor="#cc8800", tooltip="JA2101_1 (dir2)"]; + "TRO332" -> "TRO330" [color="#444444", penwidth=1.3, tooltip="JA2101_1 (normal)"]; + "TRO330" -> "TRO327" [color="#3388cc", penwidth=2.2, style="dashed", label="bypass", fontcolor="#3388cc", tooltip="JA2101_2 (bypass)"]; + "TRO329" -> "TRO327" [color="#444444", penwidth=1.3, tooltip="JA2101_2 (normal)"]; + "TRO315" -> "TRO317" [color="#444444", penwidth=1.3, tooltip="JA2102_1 (normal)"]; + "TRO317" -> "TRO318" [color="#444444", penwidth=1.3, tooltip="JA2102_2 (normal)"]; + "TRO318" -> "TRO333" [color="#444444", penwidth=1.3, tooltip="JA2102_3 (normal)"]; + "TRO335" -> "TRO333" [color="#444444", penwidth=1.3, tooltip="JA2102_3 (normal)"]; + "TRO333" -> "TRO336" [color="#3388cc", penwidth=2.2, style="dashed", label="bypass", fontcolor="#3388cc", tooltip="JA2102_4 (bypass)"]; + "TRO338" -> "TRO336" [color="#444444", penwidth=1.3, tooltip="JA2102_4 (normal)"]; + "TRO327" -> "TRO319" [color="#444444", penwidth=1.3, tooltip="JA2103_1 (normal)"]; + "TRO330" -> "TRO320" [color="#444444", penwidth=1.3, tooltip="JA2103_2 (normal)"]; + "TRO319" -> "TRO320" [color="#cc8800", penwidth=1.3, style="dashed", label="dir2", fontcolor="#cc8800", tooltip="JA2103_2 (dir2)"]; + "TRO336" -> "TRO321" [color="#444444", penwidth=1.3, tooltip="JA2104_1 (normal)"]; + "TRO333" -> "TRO322" [color="#444444", penwidth=1.3, tooltip="JA2104_2 (normal)"]; + "TRO321" -> "TRO322" [color="#444444", penwidth=1.3, tooltip="JA2104_2 (normal)"]; + "TRO320" -> "TRO323" [color="#cc8800", penwidth=1.3, style="dashed", label="dir2", fontcolor="#cc8800", tooltip="JA2104_3 (dir2)"]; + "TRO322" -> "TRO323" [color="#444444", penwidth=1.3, tooltip="JA2104_3 (normal)"]; + "TRO323" -> "TRO326" [color="#444444", penwidth=1.3, tooltip="JA2104_4 (normal)"]; + "TRO325" -> "TRO326" [color="#444444", penwidth=1.3, tooltip="JA2104_4 (normal)"]; + "TRO319" -> "TRO328" [color="#444444", penwidth=1.3, tooltip="JA2105_1 (normal)"]; + "TRO328" -> "TRO329" [color="#883388", penwidth=2.2, style="dashdot", label="finger", fontcolor="#883388", tooltip="JA2105_2 (finger)"]; + "TRO320" -> "TRO331" [color="#444444", penwidth=1.3, tooltip="JA2106_1 (normal)"]; + "TRO331" -> "TRO332" [color="#883388", penwidth=2.2, style="dashdot", label="finger", fontcolor="#883388", tooltip="JA2106_2 (finger)"]; + "TRO322" -> "TRO334" [color="#cc8800", penwidth=1.3, style="dashed", label="dir2", fontcolor="#cc8800", tooltip="JA2107_1 (dir2)"]; + "TRO334" -> "TRO335" [color="#883388", penwidth=2.2, style="dashdot", label="finger", fontcolor="#883388", tooltip="JA2107_2 (finger)"]; + "TRO321" -> "TRO337" [color="#cc8800", penwidth=1.3, style="dashed", label="dir2", fontcolor="#cc8800", tooltip="JA2108_1 (dir2)"]; + "TRO337" -> "TRO338" [color="#883388", penwidth=2.2, style="dashdot", label="finger", fontcolor="#883388", tooltip="JA2108_2 (finger)"]; + "TRO324" -> "TRO325" [color="#883388", penwidth=2.2, style="dashdot", label="finger", fontcolor="#883388", tooltip="JA2109_2 (finger)"]; + "TRO386" -> "TRO310" [color="#444444", penwidth=1.3, tooltip="JA2110_1 (normal)"]; + "TRO310" -> "TRO313" [color="#444444", penwidth=1.3, tooltip="JA2110_2 (normal)"]; + "TRO311" -> "TRO313" [color="#444444", penwidth=1.3, tooltip="JA2110_2 (normal)"]; + "TRO312" -> "TRO313" [color="#444444", penwidth=1.3, tooltip="JA2110_2 (normal)"]; + "TRO313" -> "TRO314" [color="#cc8800", penwidth=1.3, style="dashed", label="dir2", fontcolor="#cc8800", tooltip="JA2110_3 (dir2)"]; + "TRO314" -> "TRO315" [color="#cc8800", penwidth=1.3, style="dashed", label="dir2", fontcolor="#cc8800", tooltip="JA2110_4 (dir2)"]; + "TRO309" -> "TRO386" [color="#444444", penwidth=1.3, tooltip="JA2110_5 (normal)"]; + "TRO308" -> "TRO309" [color="#883388", penwidth=2.2, style="dashdot", label="finger", fontcolor="#883388", tooltip="JA2111_2 (finger)"]; + "TRO313" -> "TRO316" [color="#444444", penwidth=1.3, tooltip="JA2112_1 (normal)"]; + "TRO340" -> "TRO352" [color="#cc8800", penwidth=1.3, style="dashed", label="dir2", fontcolor="#cc8800", tooltip="JA2201_1 (dir2)"]; + "TRO354" -> "TRO352" [color="#444444", penwidth=1.3, tooltip="JA2201_1 (normal)"]; + "TRO352" -> "TRO349" [color="#3388cc", penwidth=2.2, style="dashed", label="bypass", fontcolor="#3388cc", tooltip="JA2201_2 (bypass)"]; + "TRO351" -> "TRO349" [color="#444444", penwidth=1.3, tooltip="JA2201_2 (normal)"]; + "TRO314" -> "TRO339" [color="#444444", penwidth=1.3, tooltip="JA2202_1 (normal)"]; + "TRO339" -> "TRO340" [color="#444444", penwidth=1.3, tooltip="JA2202_2 (normal)"]; + "TRO340" -> "TRO355" [color="#444444", penwidth=1.3, tooltip="JA2202_3 (normal)"]; + "TRO357" -> "TRO355" [color="#444444", penwidth=1.3, tooltip="JA2202_3 (normal)"]; + "TRO355" -> "TRO358" [color="#3388cc", penwidth=2.2, style="dashed", label="bypass", fontcolor="#3388cc", tooltip="JA2202_4 (bypass)"]; + "TRO360" -> "TRO358" [color="#444444", penwidth=1.3, tooltip="JA2202_4 (normal)"]; + "TRO349" -> "TRO341" [color="#444444", penwidth=1.3, tooltip="JA2203_1 (normal)"]; + "TRO352" -> "TRO342" [color="#444444", penwidth=1.3, tooltip="JA2203_2 (normal)"]; + "TRO341" -> "TRO342" [color="#cc8800", penwidth=1.3, style="dashed", label="dir2", fontcolor="#cc8800", tooltip="JA2203_2 (dir2)"]; + "TRO358" -> "TRO343" [color="#444444", penwidth=1.3, tooltip="JA2204_1 (normal)"]; + "TRO355" -> "TRO344" [color="#444444", penwidth=1.3, tooltip="JA2204_2 (normal)"]; + "TRO343" -> "TRO344" [color="#444444", penwidth=1.3, tooltip="JA2204_2 (normal)"]; + "TRO342" -> "TRO345" [color="#cc8800", penwidth=1.3, style="dashed", label="dir2", fontcolor="#cc8800", tooltip="JA2204_3 (dir2)"]; + "TRO344" -> "TRO345" [color="#444444", penwidth=1.3, tooltip="JA2204_3 (normal)"]; + "TRO345" -> "TRO348" [color="#444444", penwidth=1.3, tooltip="JA2204_4 (normal)"]; + "TRO347" -> "TRO348" [color="#444444", penwidth=1.3, tooltip="JA2204_4 (normal)"]; + "TRO341" -> "TRO350" [color="#444444", penwidth=1.3, tooltip="JA2205_1 (normal)"]; + "TRO350" -> "TRO351" [color="#883388", penwidth=2.2, style="dashdot", label="finger", fontcolor="#883388", tooltip="JA2205_2 (finger)"]; + "TRO342" -> "TRO353" [color="#444444", penwidth=1.3, tooltip="JA2206_1 (normal)"]; + "TRO353" -> "TRO354" [color="#883388", penwidth=2.2, style="dashdot", label="finger", fontcolor="#883388", tooltip="JA2206_2 (finger)"]; + "TRO344" -> "TRO356" [color="#cc8800", penwidth=1.3, style="dashed", label="dir2", fontcolor="#cc8800", tooltip="JA2207_1 (dir2)"]; + "TRO356" -> "TRO357" [color="#883388", penwidth=2.2, style="dashdot", label="finger", fontcolor="#883388", tooltip="JA2207_2 (finger)"]; + "TRO343" -> "TRO359" [color="#cc8800", penwidth=1.3, style="dashed", label="dir2", fontcolor="#cc8800", tooltip="JA2208_1 (dir2)"]; + "TRO359" -> "TRO360" [color="#883388", penwidth=2.2, style="dashdot", label="finger", fontcolor="#883388", tooltip="JA2208_2 (finger)"]; + "TRO346" -> "TRO347" [color="#883388", penwidth=2.2, style="dashdot", label="finger", fontcolor="#883388", tooltip="JA2209_2 (finger)"]; + "TRO371" -> "TRO363" [color="#444444", penwidth=1.3, tooltip="JA2301_1 (normal)"]; + "TRO374" -> "TRO364" [color="#444444", penwidth=1.3, tooltip="JA2301_2 (normal)"]; + "TRO363" -> "TRO364" [color="#444444", penwidth=1.3, tooltip="JA2301_2 (normal)"]; + "TRO380" -> "TRO365" [color="#444444", penwidth=1.3, tooltip="JA2302_1 (normal)"]; + "TRO377" -> "TRO366" [color="#444444", penwidth=1.3, tooltip="JA2302_2 (normal)"]; + "TRO365" -> "TRO366" [color="#cc8800", penwidth=1.3, style="dashed", label="dir2", fontcolor="#cc8800", tooltip="JA2302_2 (dir2)"]; + "TRO364" -> "TRO367" [color="#444444", penwidth=1.3, tooltip="JA2302_3 (normal)"]; + "TRO366" -> "TRO367" [color="#cc8800", penwidth=1.3, style="dashed", label="dir2", fontcolor="#cc8800", tooltip="JA2302_3 (dir2)"]; + "TRO367" -> "TRO370" [color="#444444", penwidth=1.3, tooltip="JA2302_4 (normal)"]; + "TRO369" -> "TRO370" [color="#444444", penwidth=1.3, tooltip="JA2302_4 (normal)"]; + "TRO362" -> "TRO374" [color="#444444", penwidth=1.3, tooltip="JA2303_1 (normal)"]; + "TRO376" -> "TRO374" [color="#444444", penwidth=1.3, tooltip="JA2303_1 (normal)"]; + "TRO374" -> "TRO371" [color="#3388cc", penwidth=2.2, style="dashed", label="bypass", fontcolor="#3388cc", tooltip="JA2303_2 (bypass)"]; + "TRO373" -> "TRO371" [color="#444444", penwidth=1.3, tooltip="JA2303_2 (normal)"]; + "TRO316" -> "TRO361" [color="#444444", penwidth=1.3, tooltip="JA2304_1 (normal)"]; + "TRO361" -> "TRO362" [color="#cc8800", penwidth=1.3, style="dashed", label="dir2", fontcolor="#cc8800", tooltip="JA2304_2 (dir2)"]; + "TRO362" -> "TRO377" [color="#cc8800", penwidth=1.3, style="dashed", label="dir2", fontcolor="#cc8800", tooltip="JA2304_3 (dir2)"]; + "TRO379" -> "TRO377" [color="#444444", penwidth=1.3, tooltip="JA2304_3 (normal)"]; + "TRO377" -> "TRO380" [color="#3388cc", penwidth=2.2, style="dashed", label="bypass", fontcolor="#3388cc", tooltip="JA2304_4 (bypass)"]; + "TRO382" -> "TRO380" [color="#444444", penwidth=1.3, tooltip="JA2304_4 (normal)"]; + "TRO363" -> "TRO372" [color="#cc8800", penwidth=1.3, style="dashed", label="dir2", fontcolor="#cc8800", tooltip="JA2305_1 (dir2)"]; + "TRO372" -> "TRO373" [color="#883388", penwidth=2.2, style="dashdot", label="finger", fontcolor="#883388", tooltip="JA2305_2 (finger)"]; + "TRO364" -> "TRO375" [color="#cc8800", penwidth=1.3, style="dashed", label="dir2", fontcolor="#cc8800", tooltip="JA2306_1 (dir2)"]; + "TRO375" -> "TRO376" [color="#883388", penwidth=2.2, style="dashdot", label="finger", fontcolor="#883388", tooltip="JA2306_2 (finger)"]; + "TRO366" -> "TRO378" [color="#444444", penwidth=1.3, tooltip="JA2307_1 (normal)"]; + "TRO378" -> "TRO379" [color="#883388", penwidth=2.2, style="dashdot", label="finger", fontcolor="#883388", tooltip="JA2307_2 (finger)"]; + "TRO365" -> "TRO381" [color="#444444", penwidth=1.3, tooltip="JA2308_1 (normal)"]; + "TRO381" -> "TRO382" [color="#883388", penwidth=2.2, style="dashdot", label="finger", fontcolor="#883388", tooltip="JA2308_2 (finger)"]; + "TRO368" -> "TRO369" [color="#883388", penwidth=2.2, style="dashdot", label="finger", fontcolor="#883388", tooltip="JA2309_2 (finger)"]; + "TRO300" -> "TRO302" [color="#883388", penwidth=2.2, style="dashdot", label="finger", fontcolor="#883388", tooltip="JA4101_1 (finger)"]; + "TRO301" -> "TRO302" [color="#444444", penwidth=1.3, tooltip="JA4101_1 (normal)"]; + "TRO302" -> "TRO311" [color="#883388", penwidth=2.2, style="dashdot", label="finger", fontcolor="#883388", tooltip="JA4101_2 (finger)"]; + "TRO303" -> "TRO305" [color="#883388", penwidth=2.2, style="dashdot", label="finger", fontcolor="#883388", tooltip="JA4201_1 (finger)"]; + "TRO304" -> "TRO305" [color="#444444", penwidth=1.3, tooltip="JA4201_1 (normal)"]; + "TRO305" -> "TRO312" [color="#883388", penwidth=2.2, style="dashdot", label="finger", fontcolor="#883388", tooltip="JA4201_2 (finger)"]; + + "TRO336" -> "EXT_UH03_e001" [color="#557799", penwidth=1.3, label="EXTERN", fontcolor="#557799", tooltip="JA2102_5"]; + "EXT_UH03_e002" -> "TRO324" [color="#557799", penwidth=1.3, label="EXTERN", fontcolor="#557799", tooltip="JA2109_1"]; + "EXT_UH03_e003" -> "TRO308" [color="#557799", penwidth=1.3, label="EXTERN", fontcolor="#557799", tooltip="JA2111_1"]; + "TRO358" -> "EXT_UH03_e004" [color="#557799", penwidth=1.3, label="EXTERN", fontcolor="#557799", tooltip="JA2202_5"]; + "EXT_UH03_e005" -> "TRO346" [color="#557799", penwidth=1.3, label="EXTERN", fontcolor="#557799", tooltip="JA2209_1"]; + "EXT_UH03_e006" -> "TRO368" [color="#557799", penwidth=1.3, label="EXTERN", fontcolor="#557799", tooltip="JA2309_1"]; + "EXT_UH03_e007" -> "TRO300" [color="#557799", penwidth=1.3, label="EXTERN", fontcolor="#557799", tooltip="JA4102_1"]; + "EXT_UH03_e008" -> "TRO301" [color="#557799", penwidth=1.3, label="EXTERN", fontcolor="#557799", tooltip="JA4102_2"]; + "EXT_UH03_e009" -> "TRO303" [color="#557799", penwidth=1.3, label="EXTERN", fontcolor="#557799", tooltip="JA4202_1"]; + "EXT_UH03_e010" -> "TRO304" [color="#557799", penwidth=1.3, label="EXTERN", fontcolor="#557799", tooltip="JA4202_2"]; + "EXT_UH03_e011" -> "TRO306" [color="#557799", penwidth=1.3, label="EXTERN", fontcolor="#557799", tooltip="JA4301_1"]; + "EXT_UH03_e012" -> "TRO307" [color="#557799", penwidth=1.3, label="EXTERN", fontcolor="#557799", tooltip="JA4401_1"]; + "EXT_UH03_e013" -> "TRO327" [color="#557799", penwidth=1.3, label="EXTERN", fontcolor="#557799", tooltip="Storage2.1.1"]; + "EXT_UH03_e014" -> "TRO330" [color="#557799", penwidth=1.3, label="EXTERN", fontcolor="#557799", tooltip="Storage2.1.2"]; + "EXT_UH03_e015" -> "TRO333" [color="#557799", penwidth=1.3, label="EXTERN", fontcolor="#557799", tooltip="Storage2.1.3"]; + "EXT_UH03_e016" -> "TRO336" [color="#557799", penwidth=1.3, label="EXTERN", fontcolor="#557799", tooltip="Storage2.1.4"]; + "EXT_UH03_e017" -> "TRO349" [color="#557799", penwidth=1.3, label="EXTERN", fontcolor="#557799", tooltip="Storage2.2.1"]; + "EXT_UH03_e018" -> "TRO352" [color="#557799", penwidth=1.3, label="EXTERN", fontcolor="#557799", tooltip="Storage2.2.2"]; + "EXT_UH03_e019" -> "TRO355" [color="#557799", penwidth=1.3, label="EXTERN", fontcolor="#557799", tooltip="Storage2.2.3"]; + "EXT_UH03_e020" -> "TRO358" [color="#557799", penwidth=1.3, label="EXTERN", fontcolor="#557799", tooltip="Storage2.2.4"]; + "EXT_UH03_e021" -> "TRO371" [color="#557799", penwidth=1.3, label="EXTERN", fontcolor="#557799", tooltip="Storage2.3.1"]; + "EXT_UH03_e022" -> "TRO374" [color="#557799", penwidth=1.3, label="EXTERN", fontcolor="#557799", tooltip="Storage2.3.2"]; + "EXT_UH03_e023" -> "TRO377" [color="#557799", penwidth=1.3, label="EXTERN", fontcolor="#557799", tooltip="Storage2.3.3"]; + "EXT_UH03_e024" -> "TRO380" [color="#557799", penwidth=1.3, label="EXTERN", fontcolor="#557799", tooltip="Storage2.3.4"]; + "TRO326" -> "EXT_UH03_e025" [color="#557799", penwidth=1.3, label="EXTERN", fontcolor="#557799", tooltip="IO_Device_UH03_TO_UH01.stCARRIER_INFO"]; + "TRO348" -> "EXT_UH03_e026" [color="#557799", penwidth=1.3, label="EXTERN", fontcolor="#557799", tooltip="IO_Device_UH03_TO_UH01.stCARRIER_INFO_1"]; + "TRO370" -> "EXT_UH03_e027" [color="#557799", penwidth=1.3, label="EXTERN", fontcolor="#557799", tooltip="IO_Device_UH03_TO_UH01.stCARRIER_INFO_2"]; + "TRO317" -> "EXT_UH03_e028" [color="#557799", penwidth=1.3, label="EXTERN", fontcolor="#557799", tooltip="IO_Device_UH03_TO_UH01.stCarrierL2toL1"]; + "TRO339" -> "EXT_UH03_e029" [color="#557799", penwidth=1.3, label="EXTERN", fontcolor="#557799", tooltip="IO_Device_UH03_TO_UH01.stCarrierL2toL1_2"]; + "TRO361" -> "EXT_UH03_e030" [color="#557799", penwidth=1.3, label="EXTERN", fontcolor="#557799", tooltip="IO_Device_UH03_TO_UH01.stCarrierL2toL1_3"]; + + subgraph cluster_legend { + label="Legend"; fontsize=12; color="#cccccc"; style="rounded"; + node [shape=plaintext, style="", fillcolor="none", fontsize=10]; + legend [label=< + + + + + + + +
—— normalstandard transfer (jam area to jam area)
—— dir2switch output, direction 2 (FC_Direction)
—— dir3switch output, direction 3 (FC_Direction)
—— bypassbypass around a storage block (PinStore)
—— fingerchain-conveyor finger / index transfer
—— EXTERNinfeed / outfeed to another PLC (EXTERN)
>]; + } +} diff --git a/doc/TRO_Katalog/tro_graphs/uh03.svg b/doc/TRO_Katalog/tro_graphs/uh03.svg new file mode 100644 index 0000000..75e2f42 --- /dev/null +++ b/doc/TRO_Katalog/tro_graphs/uh03.svg @@ -0,0 +1,2384 @@ + + + + + + +UH03 + +UH03 + — TRO topology (nodes coloured by type, edges by connection kind) + +cluster_legend + +Legend + + + +TRO300 + + +TRO300 +Vario + + + + + +TRO302 + + +TRO302 +Vario + + + + + +TRO300->TRO302 + + + + + +finger + + + +TRO301 + + +TRO301 +1Sep + + + + + +TRO301->TRO302 + + + + + + + + +TRO311 + + +TRO311 +1Sep + + + + + +TRO302->TRO311 + + + + + +finger + + + +TRO303 + + +TRO303 +Vario + + + + + +TRO305 + + +TRO305 +Vario + + + + + +TRO303->TRO305 + + + + + +finger + + + +TRO304 + + +TRO304 +1Sep + + + + + +TRO304->TRO305 + + + + + + + + +TRO312 + + +TRO312 +1Sep + + + + + +TRO305->TRO312 + + + + + +finger + + + +TRO306 + + +TRO306 +Vario + + + + + +TRO307 + + +TRO307 +Vario + + + + + +TRO308 + + +TRO308 +Vario + + + + + +TRO309 + + +TRO309 +1Sep + + + + + +TRO308->TRO309 + + + + + +finger + + + +TRO386 + + +TRO386 +1Sep + + + + + +TRO309->TRO386 + + + + + + + + +TRO310 + + +TRO310 +1Sep + + + + + +TRO313 + + +TRO313 +1Sep1Swi + + + + + +TRO310->TRO313 + + + + + + + + +TRO311->TRO313 + + + + + + + + +TRO312->TRO313 + + + + + + + + +TRO314 + + +TRO314 +1Sep1Swi + + + + + +TRO313->TRO314 + + + + + +dir2 + + + +TRO316 + + +TRO316 +1Sep + + + + + +TRO313->TRO316 + + + + + + + + +TRO315 + + +TRO315 +1Sep + + + + + +TRO314->TRO315 + + + + + +dir2 + + + +TRO339 + + +TRO339 +1Sep1Swi + + + + + +TRO314->TRO339 + + + + + + + + +TRO317 + + +TRO317 +1Sep1Swi + + + + + +TRO315->TRO317 + + + + + + + + +TRO361 + + +TRO361 +1Sep1Swi + + + + + +TRO316->TRO361 + + + + + + + + +TRO318 + + +TRO318 +1Sep1Swi + + + + + +TRO317->TRO318 + + + + + + + + +EXT_UH03_e028 + +EXTERN +IO_Device_UH03_TO_UH01.stCarrierL2toL1 + + + +TRO317->EXT_UH03_e028 + + + + + +EXTERN + + + +TRO330 + + + + + +TRO330 +PinStore_Auto + + + + + +TRO318->TRO330 + + + + + +dir2 + + + +TRO333 + + + + + +TRO333 +PinStore_Auto + + + + + +TRO318->TRO333 + + + + + + + + +TRO319 + + +TRO319 +1Sep1Swi + + + + + +TRO320 + + +TRO320 +1Sep1Swi + + + + + +TRO319->TRO320 + + + + + +dir2 + + + +TRO328 + + +TRO328 +Vario + + + + + +TRO319->TRO328 + + + + + + + + +TRO323 + + +TRO323 +1Sep + + + + + +TRO320->TRO323 + + + + + +dir2 + + + +TRO331 + + +TRO331 +Vario + + + + + +TRO320->TRO331 + + + + + + + + +TRO321 + + +TRO321 +1Sep1Swi + + + + + +TRO322 + + +TRO322 +1Sep1Swi + + + + + +TRO321->TRO322 + + + + + + + + +TRO337 + + +TRO337 +Vario + + + + + +TRO321->TRO337 + + + + + +dir2 + + + +TRO322->TRO323 + + + + + + + + +TRO334 + + +TRO334 +Vario + + + + + +TRO322->TRO334 + + + + + +dir2 + + + +TRO326 + + +TRO326 +1Sep + + + + + +TRO323->TRO326 + + + + + + + + +TRO324 + + +TRO324 +Vario + + + + + +TRO325 + + +TRO325 +1Sep + + + + + +TRO324->TRO325 + + + + + +finger + + + +TRO325->TRO326 + + + + + + + + +EXT_UH03_e025 + +EXTERN +IO_Device_UH03_TO_UH01.stCARRIER_INFO + + + +TRO326->EXT_UH03_e025 + + + + + +EXTERN + + + +TRO327 + + + + + +TRO327 +PinStore_Auto + + + + + +TRO327->TRO319 + + + + + + + + +TRO329 + + +TRO329 +1Sep + + + + + +TRO328->TRO329 + + + + + +finger + + + +TRO329->TRO327 + + + + + + + + +TRO330->TRO320 + + + + + + + + +TRO330->TRO327 + + + + + +bypass + + + +TRO332 + + +TRO332 +1Sep + + + + + +TRO331->TRO332 + + + + + +finger + + + +TRO332->TRO330 + + + + + + + + +TRO333->TRO322 + + + + + + + + +TRO336 + + + + + +TRO336 +PinStore_Auto + + + + + +TRO333->TRO336 + + + + + +bypass + + + +TRO335 + + +TRO335 +1Sep + + + + + +TRO334->TRO335 + + + + + +finger + + + +TRO335->TRO333 + + + + + + + + +TRO336->TRO321 + + + + + + + + +EXT_UH03_e001 + +EXTERN +JA2102_5 + + + +TRO336->EXT_UH03_e001 + + + + + +EXTERN + + + +TRO338 + + +TRO338 +1Sep + + + + + +TRO337->TRO338 + + + + + +finger + + + +TRO338->TRO336 + + + + + + + + +TRO340 + + +TRO340 +1Sep1Swi + + + + + +TRO339->TRO340 + + + + + + + + +EXT_UH03_e029 + +EXTERN +IO_Device_UH03_TO_UH01.stCarrierL2toL1_2 + + + +TRO339->EXT_UH03_e029 + + + + + +EXTERN + + + +TRO352 + + + + + +TRO352 +PinStore_Auto + + + + + +TRO340->TRO352 + + + + + +dir2 + + + +TRO355 + + + + + +TRO355 +PinStore_Auto + + + + + +TRO340->TRO355 + + + + + + + + +TRO341 + + +TRO341 +1Sep1Swi + + + + + +TRO342 + + +TRO342 +1Sep1Swi + + + + + +TRO341->TRO342 + + + + + +dir2 + + + +TRO350 + + +TRO350 +Vario + + + + + +TRO341->TRO350 + + + + + + + + +TRO345 + + +TRO345 +1Sep + + + + + +TRO342->TRO345 + + + + + +dir2 + + + +TRO353 + + +TRO353 +Vario + + + + + +TRO342->TRO353 + + + + + + + + +TRO343 + + +TRO343 +1Sep1Swi + + + + + +TRO344 + + +TRO344 +1Sep1Swi + + + + + +TRO343->TRO344 + + + + + + + + +TRO359 + + +TRO359 +Vario + + + + + +TRO343->TRO359 + + + + + +dir2 + + + +TRO344->TRO345 + + + + + + + + +TRO356 + + +TRO356 +Vario + + + + + +TRO344->TRO356 + + + + + +dir2 + + + +TRO348 + + +TRO348 +1Sep + + + + + +TRO345->TRO348 + + + + + + + + +TRO346 + + +TRO346 +Vario + + + + + +TRO347 + + +TRO347 +1Sep + + + + + +TRO346->TRO347 + + + + + +finger + + + +TRO347->TRO348 + + + + + + + + +EXT_UH03_e026 + +EXTERN +IO_Device_UH03_TO_UH01.stCARRIER_INFO_1 + + + +TRO348->EXT_UH03_e026 + + + + + +EXTERN + + + +TRO349 + + + + + +TRO349 +PinStore_Auto + + + + + +TRO349->TRO341 + + + + + + + + +TRO351 + + +TRO351 +1Sep + + + + + +TRO350->TRO351 + + + + + +finger + + + +TRO351->TRO349 + + + + + + + + +TRO352->TRO342 + + + + + + + + +TRO352->TRO349 + + + + + +bypass + + + +TRO354 + + +TRO354 +1Sep + + + + + +TRO353->TRO354 + + + + + +finger + + + +TRO354->TRO352 + + + + + + + + +TRO355->TRO344 + + + + + + + + +TRO358 + + + + + +TRO358 +PinStore_Auto + + + + + +TRO355->TRO358 + + + + + +bypass + + + +TRO357 + + +TRO357 +1Sep + + + + + +TRO356->TRO357 + + + + + +finger + + + +TRO357->TRO355 + + + + + + + + +TRO358->TRO343 + + + + + + + + +EXT_UH03_e004 + +EXTERN +JA2202_5 + + + +TRO358->EXT_UH03_e004 + + + + + +EXTERN + + + +TRO360 + + +TRO360 +1Sep + + + + + +TRO359->TRO360 + + + + + +finger + + + +TRO360->TRO358 + + + + + + + + +TRO362 + + +TRO362 +1Sep1Swi + + + + + +TRO361->TRO362 + + + + + +dir2 + + + +EXT_UH03_e030 + +EXTERN +IO_Device_UH03_TO_UH01.stCarrierL2toL1_3 + + + +TRO361->EXT_UH03_e030 + + + + + +EXTERN + + + +TRO374 + + + + + +TRO374 +PinStore_Auto + + + + + +TRO362->TRO374 + + + + + + + + +TRO377 + + + + + +TRO377 +PinStore_Auto + + + + + +TRO362->TRO377 + + + + + +dir2 + + + +TRO363 + + +TRO363 +1Sep1Swi + + + + + +TRO364 + + +TRO364 +1Sep1Swi + + + + + +TRO363->TRO364 + + + + + + + + +TRO372 + + +TRO372 +Vario + + + + + +TRO363->TRO372 + + + + + +dir2 + + + +TRO367 + + +TRO367 +1Sep + + + + + +TRO364->TRO367 + + + + + + + + +TRO375 + + +TRO375 +Vario + + + + + +TRO364->TRO375 + + + + + +dir2 + + + +TRO365 + + +TRO365 +1Sep1Swi + + + + + +TRO366 + + +TRO366 +1Sep1Swi + + + + + +TRO365->TRO366 + + + + + +dir2 + + + +TRO381 + + +TRO381 +Vario + + + + + +TRO365->TRO381 + + + + + + + + +TRO366->TRO367 + + + + + +dir2 + + + +TRO378 + + +TRO378 +Vario + + + + + +TRO366->TRO378 + + + + + + + + +TRO370 + + +TRO370 +1Sep + + + + + +TRO367->TRO370 + + + + + + + + +TRO368 + + +TRO368 +Vario + + + + + +TRO369 + + +TRO369 +1Sep + + + + + +TRO368->TRO369 + + + + + +finger + + + +TRO369->TRO370 + + + + + + + + +EXT_UH03_e027 + +EXTERN +IO_Device_UH03_TO_UH01.stCARRIER_INFO_2 + + + +TRO370->EXT_UH03_e027 + + + + + +EXTERN + + + +TRO371 + + + + + +TRO371 +PinStore_Auto + + + + + +TRO371->TRO363 + + + + + + + + +TRO373 + + +TRO373 +1Sep + + + + + +TRO372->TRO373 + + + + + +finger + + + +TRO373->TRO371 + + + + + + + + +TRO374->TRO364 + + + + + + + + +TRO374->TRO371 + + + + + +bypass + + + +TRO376 + + +TRO376 +1Sep + + + + + +TRO375->TRO376 + + + + + +finger + + + +TRO376->TRO374 + + + + + + + + +TRO377->TRO366 + + + + + + + + +TRO380 + + + + + +TRO380 +PinStore_Auto + + + + + +TRO377->TRO380 + + + + + +bypass + + + +TRO379 + + +TRO379 +1Sep + + + + + +TRO378->TRO379 + + + + + +finger + + + +TRO379->TRO377 + + + + + + + + +TRO380->TRO365 + + + + + + + + +TRO382 + + +TRO382 +1Sep + + + + + +TRO381->TRO382 + + + + + +finger + + + +TRO382->TRO380 + + + + + + + + +TRO386->TRO310 + + + + + + + + +EXT_UH03_e002 + +EXTERN +JA2109_1 + + + +EXT_UH03_e002->TRO324 + + + + + +EXTERN + + + +EXT_UH03_e003 + +EXTERN +JA2111_1 + + + +EXT_UH03_e003->TRO308 + + + + + +EXTERN + + + +EXT_UH03_e005 + +EXTERN +JA2209_1 + + + +EXT_UH03_e005->TRO346 + + + + + +EXTERN + + + +EXT_UH03_e006 + +EXTERN +JA2309_1 + + + +EXT_UH03_e006->TRO368 + + + + + +EXTERN + + + +EXT_UH03_e007 + +EXTERN +JA4102_1 + + + +EXT_UH03_e007->TRO300 + + + + + +EXTERN + + + +EXT_UH03_e008 + +EXTERN +JA4102_2 + + + +EXT_UH03_e008->TRO301 + + + + + +EXTERN + + + +EXT_UH03_e009 + +EXTERN +JA4202_1 + + + +EXT_UH03_e009->TRO303 + + + + + +EXTERN + + + +EXT_UH03_e010 + +EXTERN +JA4202_2 + + + +EXT_UH03_e010->TRO304 + + + + + +EXTERN + + + +EXT_UH03_e011 + +EXTERN +JA4301_1 + + + +EXT_UH03_e011->TRO306 + + + + + +EXTERN + + + +EXT_UH03_e012 + +EXTERN +JA4401_1 + + + +EXT_UH03_e012->TRO307 + + + + + +EXTERN + + + +EXT_UH03_e013 + +EXTERN +Storage2.1.1 + + + +EXT_UH03_e013->TRO327 + + + + + +EXTERN + + + +EXT_UH03_e014 + +EXTERN +Storage2.1.2 + + + +EXT_UH03_e014->TRO330 + + + + + +EXTERN + + + +EXT_UH03_e015 + +EXTERN +Storage2.1.3 + + + +EXT_UH03_e015->TRO333 + + + + + +EXTERN + + + +EXT_UH03_e016 + +EXTERN +Storage2.1.4 + + + +EXT_UH03_e016->TRO336 + + + + + +EXTERN + + + +EXT_UH03_e017 + +EXTERN +Storage2.2.1 + + + +EXT_UH03_e017->TRO349 + + + + + +EXTERN + + + +EXT_UH03_e018 + +EXTERN +Storage2.2.2 + + + +EXT_UH03_e018->TRO352 + + + + + +EXTERN + + + +EXT_UH03_e019 + +EXTERN +Storage2.2.3 + + + +EXT_UH03_e019->TRO355 + + + + + +EXTERN + + + +EXT_UH03_e020 + +EXTERN +Storage2.2.4 + + + +EXT_UH03_e020->TRO358 + + + + + +EXTERN + + + +EXT_UH03_e021 + +EXTERN +Storage2.3.1 + + + +EXT_UH03_e021->TRO371 + + + + + +EXTERN + + + +EXT_UH03_e022 + +EXTERN +Storage2.3.2 + + + +EXT_UH03_e022->TRO374 + + + + + +EXTERN + + + +EXT_UH03_e023 + +EXTERN +Storage2.3.3 + + + +EXT_UH03_e023->TRO377 + + + + + +EXTERN + + + +EXT_UH03_e024 + +EXTERN +Storage2.3.4 + + + +EXT_UH03_e024->TRO380 + + + + + +EXTERN + + + +legend +—— normal +standard transfer (jam area to jam area) +—— dir2 +switch output, direction 2 (FC_Direction) +—— dir3 +switch output, direction 3 (FC_Direction) +—— bypass +bypass around a storage block (PinStore) +—— finger +chain-conveyor finger / index transfer +—— EXTERN +infeed / outfeed to another PLC (EXTERN) + + + diff --git a/doc/TRO_Katalog/tro_graphs/uh04.dot b/doc/TRO_Katalog/tro_graphs/uh04.dot new file mode 100644 index 0000000..7f05031 --- /dev/null +++ b/doc/TRO_Katalog/tro_graphs/uh04.dot @@ -0,0 +1,82 @@ +digraph UH04 { + rankdir=LR; + bgcolor="white"; + labelloc="t"; + label=<UH04 — TRO topology (nodes coloured by type, edges by connection kind)>; + fontname="Segoe UI"; fontsize=18; + node [fontname="Segoe UI", fontsize=11, style="rounded,filled", shape=box, penwidth=1.6]; + edge [fontname="Segoe UI", fontsize=9, arrowsize=0.8]; + + "TRO400" [label="TRO400\nVario", fillcolor="#e8d4f0", color="#883388", shape=box, style="rounded,filled", tooltip="TRO 400 (Vario)"]; + "TRO401" [label="TRO401\nVario", fillcolor="#e8d4f0", color="#883388", shape=box, style="rounded,filled", tooltip="TRO 401 (Vario)"]; + "TRO402" [label="TRO402\n1Sep", fillcolor="#d4e8ff", color="#3388cc", shape=box, style="rounded,filled", tooltip="TRO 402 (1Sep) (Vor Brandschutztor)"]; + "TRO403" [label="TRO403\nVario", fillcolor="#e8d4f0", color="#883388", shape=box, style="rounded,filled", tooltip="TRO 403 (Vario)"]; + "TRO404" [label="TRO404\n1Sep", fillcolor="#d4e8ff", color="#3388cc", shape=box, style="rounded,filled", tooltip="TRO 404 (1Sep)"]; + "TRO405" [label="TRO405\n1Sep1Swi", fillcolor="#ffe4a0", color="#cc8800", shape=box, style="rounded,filled", tooltip="TRO 405 (1Sep1Switch) + Scanner (BX4100) + Behangskontrolle"]; + "TRO406" [label="TRO406\n1Sep", fillcolor="#d4e8ff", color="#3388cc", shape=box, style="rounded,filled", tooltip="TRO 406 (1Sep) + Scanner (BX4101)"]; + "TRO407" [label="TRO407\n1Sep1Swi", fillcolor="#ffe4a0", color="#cc8800", shape=box, style="rounded,filled", tooltip="TRO 407 (1Sep1Switch) + Scanner (BX4102)"]; + "TRO408" [label="TRO408\nVario", fillcolor="#e8d4f0", color="#883388", shape=box, style="rounded,filled", tooltip="TRO 408 (Vario)"]; + "TRO409" [label="TRO409\n1Sep", fillcolor="#d4e8ff", color="#3388cc", shape=box, style="rounded,filled", tooltip="TRO 409 (1Sep)"]; + "TRO410" [label="TRO410\n1Sep1Swi", fillcolor="#ffe4a0", color="#cc8800", shape=box, style="rounded,filled", tooltip="TRO 410 (1Sep1Switch) + Scanner (BX4104)"]; + "TRO411" [label="TRO411\nVario", fillcolor="#e8d4f0", color="#883388", shape=box, style="rounded,filled", tooltip="TRO 411 (Vario)"]; + "TRO412" [label="TRO412\n1Sep", fillcolor="#d4e8ff", color="#3388cc", shape=box, style="rounded,filled", tooltip="TRO 412 (1Sep)"]; + "TRO413" [label="TRO413\n1Sep1Swi", fillcolor="#ffe4a0", color="#cc8800", shape=box, style="rounded,filled", tooltip="TRO 413(1Sep1Switch)+Scanner(BX4106)"]; + "TRO414" [label="TRO414\nVario", fillcolor="#e8d4f0", color="#883388", shape=box, style="rounded,filled", tooltip="TRO 414 (Vario)"]; + "TRO415" [label="TRO415\n1Sep", fillcolor="#d4e8ff", color="#3388cc", shape=box, style="rounded,filled", tooltip="TRO 415 (1Sep)"]; + "TRO416" [label="TRO416\n1Sep", fillcolor="#d4e8ff", color="#3388cc", shape=box, style="rounded,filled", tooltip="TRO 416 (1Sep) + Beladeprüfung"]; + "TRO417" [label="TRO417\n1Sep", fillcolor="#d4e8ff", color="#3388cc", shape=box, style="rounded,filled", tooltip="TRO 417 (1Sep)"]; + "TRO418" [label="TRO418\nVario", fillcolor="#e8d4f0", color="#883388", shape=box, style="rounded,filled", tooltip="TRO 418 (Vario)"]; + "TRO420" [label="TRO420\nVario", fillcolor="#e8d4f0", color="#883388", shape=box, style="rounded,filled", tooltip="TRO 420 (Vario)"]; + "TRO421" [label="TRO421\nVario_workStation", fillcolor="#e8d4f0", color="#883388", shape=box, style="rounded,filled", tooltip="TRO 421 (Vario)"]; + "TRO422" [label="TRO422\nVario_workStation", fillcolor="#e8d4f0", color="#883388", shape=box, style="rounded,filled", tooltip="TRO 422 (Vario)"]; + "TRO423" [label="TRO423\nVario_workStation", fillcolor="#e8d4f0", color="#883388", shape=box, style="rounded,filled", tooltip="TRO 423 (Vario)"]; + "TRO424" [label="TRO424\n1Sep", fillcolor="#d4e8ff", color="#3388cc", shape=box, style="rounded,filled", tooltip="TRO 424 (1Sep) vor Behangskontrolle"]; + + "EXT_UH04_e001" [label="EXTERN\nJA4000_1", shape=cds, fillcolor="#eef2f7", color="#557799", style="filled", fontsize=9]; + "EXT_UH04_e002" [label="EXTERN\nJA4005_1", shape=cds, fillcolor="#eef2f7", color="#557799", style="filled", fontsize=9]; + "EXT_UH04_e003" [label="EXTERN\nJA4010_1", shape=cds, fillcolor="#eef2f7", color="#557799", style="filled", fontsize=9]; + + "TRO400" -> "TRO401" [color="#883388", penwidth=2.2, style="dashdot", label="finger", fontcolor="#883388", tooltip="JA4001_1 (finger)"]; + "TRO401" -> "TRO402" [color="#883388", penwidth=2.2, style="dashdot", label="finger", fontcolor="#883388", tooltip="JA4001_2 (finger)"]; + "TRO402" -> "TRO403" [color="#444444", penwidth=1.3, tooltip="JA4002_1 (normal)"]; + "TRO403" -> "TRO404" [color="#883388", penwidth=2.2, style="dashdot", label="finger", fontcolor="#883388", tooltip="JA4002_2 (finger)"]; + "TRO424" -> "TRO405" [color="#444444", penwidth=1.3, tooltip="JA4003_1 (normal)"]; + "TRO405" -> "TRO406" [color="#cc8800", penwidth=1.3, style="dashed", label="dir2", fontcolor="#cc8800", tooltip="JA4003_2 (dir2)"]; + "TRO406" -> "TRO407" [color="#444444", penwidth=1.3, tooltip="JA4003_3 (normal)"]; + "TRO407" -> "TRO410" [color="#cc8800", penwidth=1.3, style="dashed", label="dir2", fontcolor="#cc8800", tooltip="JA4003_4 (dir2)"]; + "TRO409" -> "TRO410" [color="#444444", penwidth=1.3, tooltip="JA4003_4 (normal)"]; + "TRO410" -> "TRO413" [color="#cc8800", penwidth=1.3, style="dashed", label="dir2", fontcolor="#cc8800", tooltip="JA4003_5 (dir2)"]; + "TRO412" -> "TRO413" [color="#444444", penwidth=1.3, tooltip="JA4003_5 (normal)"]; + "TRO413" -> "TRO416" [color="#cc8800", penwidth=1.3, style="dashed", label="dir2", fontcolor="#cc8800", tooltip="JA4003_6 (dir2)"]; + "TRO415" -> "TRO416" [color="#444444", penwidth=1.3, tooltip="JA4003_6 (normal)"]; + "TRO416" -> "TRO417" [color="#444444", penwidth=1.3, tooltip="JA4003_7 (normal)"]; + "TRO404" -> "TRO424" [color="#444444", penwidth=1.3, tooltip="JA4003_8 (normal)"]; + "TRO417" -> "TRO424" [color="#444444", penwidth=1.3, tooltip="JA4003_8 (normal)"]; + "TRO407" -> "TRO408" [color="#444444", penwidth=1.3, tooltip="JA4004_1 (normal)"]; + "TRO408" -> "TRO421" [color="#883388", penwidth=2.2, style="dashdot", label="finger", fontcolor="#883388", tooltip="JA4004_2 (finger)"]; + "TRO410" -> "TRO411" [color="#444444", penwidth=1.3, tooltip="JA4006_1 (normal)"]; + "TRO411" -> "TRO422" [color="#883388", penwidth=2.2, style="dashdot", label="finger", fontcolor="#883388", tooltip="JA4006_2 (finger)"]; + "TRO422" -> "TRO412" [color="#883388", penwidth=2.2, style="dashdot", label="finger", fontcolor="#883388", tooltip="JA4007_1 (finger)"]; + "TRO413" -> "TRO414" [color="#444444", penwidth=1.3, tooltip="JA4008_1 (normal)"]; + "TRO414" -> "TRO423" [color="#883388", penwidth=2.2, style="dashdot", label="finger", fontcolor="#883388", tooltip="JA4008_2 (finger)"]; + "TRO423" -> "TRO415" [color="#883388", penwidth=2.2, style="dashdot", label="finger", fontcolor="#883388", tooltip="JA4009_1 (finger)"]; + "TRO418" -> "TRO420" [color="#883388", penwidth=2.2, style="dashdot", label="finger", fontcolor="#883388", tooltip="JA4011_1 (finger)"]; + + "EXT_UH04_e001" -> "TRO400" [color="#557799", penwidth=1.3, label="EXTERN", fontcolor="#557799", tooltip="JA4000_1"]; + "TRO421" -> "EXT_UH04_e002" [color="#557799", penwidth=1.3, label="EXTERN", fontcolor="#557799", tooltip="JA4005_1"]; + "EXT_UH04_e003" -> "TRO418" [color="#557799", penwidth=1.3, label="EXTERN", fontcolor="#557799", tooltip="JA4010_1"]; + + subgraph cluster_legend { + label="Legend"; fontsize=12; color="#cccccc"; style="rounded"; + node [shape=plaintext, style="", fillcolor="none", fontsize=10]; + legend [label=< + + + + + + + +
—— normalstandard transfer (jam area to jam area)
—— dir2switch output, direction 2 (FC_Direction)
—— dir3switch output, direction 3 (FC_Direction)
—— bypassbypass around a storage block (PinStore)
—— fingerchain-conveyor finger / index transfer
—— EXTERNinfeed / outfeed to another PLC (EXTERN)
>]; + } +} diff --git a/doc/TRO_Katalog/tro_graphs/uh04.svg b/doc/TRO_Katalog/tro_graphs/uh04.svg new file mode 100644 index 0000000..084d89b --- /dev/null +++ b/doc/TRO_Katalog/tro_graphs/uh04.svg @@ -0,0 +1,565 @@ + + + + + + +UH04 + +UH04 + — TRO topology (nodes coloured by type, edges by connection kind) + +cluster_legend + +Legend + + + +TRO400 + + +TRO400 +Vario + + + + + +TRO401 + + +TRO401 +Vario + + + + + +TRO400->TRO401 + + + + + +finger + + + +TRO402 + + +TRO402 +1Sep + + + + + +TRO401->TRO402 + + + + + +finger + + + +TRO403 + + +TRO403 +Vario + + + + + +TRO402->TRO403 + + + + + + + + +TRO404 + + +TRO404 +1Sep + + + + + +TRO403->TRO404 + + + + + +finger + + + +TRO424 + + +TRO424 +1Sep + + + + + +TRO404->TRO424 + + + + + + + + +TRO405 + + +TRO405 +1Sep1Swi + + + + + +TRO406 + + +TRO406 +1Sep + + + + + +TRO405->TRO406 + + + + + +dir2 + + + +TRO407 + + +TRO407 +1Sep1Swi + + + + + +TRO406->TRO407 + + + + + + + + +TRO408 + + +TRO408 +Vario + + + + + +TRO407->TRO408 + + + + + + + + +TRO410 + + +TRO410 +1Sep1Swi + + + + + +TRO407->TRO410 + + + + + +dir2 + + + +TRO421 + + +TRO421 +Vario_workStation + + + + + +TRO408->TRO421 + + + + + +finger + + + +TRO409 + + +TRO409 +1Sep + + + + + +TRO409->TRO410 + + + + + + + + +TRO411 + + +TRO411 +Vario + + + + + +TRO410->TRO411 + + + + + + + + +TRO413 + + +TRO413 +1Sep1Swi + + + + + +TRO410->TRO413 + + + + + +dir2 + + + +TRO422 + + +TRO422 +Vario_workStation + + + + + +TRO411->TRO422 + + + + + +finger + + + +TRO412 + + +TRO412 +1Sep + + + + + +TRO412->TRO413 + + + + + + + + +TRO414 + + +TRO414 +Vario + + + + + +TRO413->TRO414 + + + + + + + + +TRO416 + + +TRO416 +1Sep + + + + + +TRO413->TRO416 + + + + + +dir2 + + + +TRO423 + + +TRO423 +Vario_workStation + + + + + +TRO414->TRO423 + + + + + +finger + + + +TRO415 + + +TRO415 +1Sep + + + + + +TRO415->TRO416 + + + + + + + + +TRO417 + + +TRO417 +1Sep + + + + + +TRO416->TRO417 + + + + + + + + +TRO417->TRO424 + + + + + + + + +TRO418 + + +TRO418 +Vario + + + + + +TRO420 + + +TRO420 +Vario + + + + + +TRO418->TRO420 + + + + + +finger + + + +EXT_UH04_e002 + +EXTERN +JA4005_1 + + + +TRO421->EXT_UH04_e002 + + + + + +EXTERN + + + +TRO422->TRO412 + + + + + +finger + + + +TRO423->TRO415 + + + + + +finger + + + +TRO424->TRO405 + + + + + + + + +EXT_UH04_e001 + +EXTERN +JA4000_1 + + + +EXT_UH04_e001->TRO400 + + + + + +EXTERN + + + +EXT_UH04_e003 + +EXTERN +JA4010_1 + + + +EXT_UH04_e003->TRO418 + + + + + +EXTERN + + + +legend +—— normal +standard transfer (jam area to jam area) +—— dir2 +switch output, direction 2 (FC_Direction) +—— dir3 +switch output, direction 3 (FC_Direction) +—— bypass +bypass around a storage block (PinStore) +—— finger +chain-conveyor finger / index transfer +—— EXTERN +infeed / outfeed to another PLC (EXTERN) + + + diff --git a/doc/TRO_Katalog/tro_graphs/uh05.dot b/doc/TRO_Katalog/tro_graphs/uh05.dot new file mode 100644 index 0000000..2d81d5b --- /dev/null +++ b/doc/TRO_Katalog/tro_graphs/uh05.dot @@ -0,0 +1,105 @@ +digraph UH05 { + rankdir=LR; + bgcolor="white"; + labelloc="t"; + label=<UH05 — TRO topology (nodes coloured by type, edges by connection kind)>; + fontname="Segoe UI"; fontsize=18; + node [fontname="Segoe UI", fontsize=11, style="rounded,filled", shape=box, penwidth=1.6]; + edge [fontname="Segoe UI", fontsize=9, arrowsize=0.8]; + + "TRO500" [label="TRO500\nVario", fillcolor="#e8d4f0", color="#883388", shape=box, style="rounded,filled", tooltip="TRO 500 (Vario) - Stand: Vorbereitet für Umbau!"]; + "TRO501" [label="TRO501\n1Sep", fillcolor="#d4e8ff", color="#3388cc", shape=box, style="rounded,filled", tooltip="TRO 501 (1Sep) + Scanner (BX5101)"]; + "TRO502" [label="TRO502\nVario", fillcolor="#e8d4f0", color="#883388", shape=box, style="rounded,filled", tooltip="TRO 502 (Vario) - Stand: Vorbereitet für Umbau!"]; + "TRO503" [label="TRO503\n1Sep", fillcolor="#d4e8ff", color="#3388cc", shape=box, style="rounded,filled", tooltip="TRO 503 (1Sep)+ Scanner (BX5100)"]; + "TRO504" [label="TRO504\n1Sep", fillcolor="#d4e8ff", color="#3388cc", shape=box, style="rounded,filled", tooltip="TRO 504 (1Sep)"]; + "TRO505" [label="TRO505\n1Sep1Swi", fillcolor="#ffe4a0", color="#cc8800", shape=box, style="rounded,filled", tooltip="TRO 505 (1Sep1Switch) + Scanner (BX5102)"]; + "TRO506" [label="TRO506\nVario", fillcolor="#e8d4f0", color="#883388", shape=box, style="rounded,filled", tooltip="TRO 506 (Vario)"]; + "TRO507" [label="TRO507\n1Sep", fillcolor="#d4e8ff", color="#3388cc", shape=box, style="rounded,filled", tooltip="TRO 507 (1Sep)"]; + "TRO508" [label="TRO508\nVario", fillcolor="#e8d4f0", color="#883388", shape=box, style="rounded,filled", tooltip="TRO 508 (Vario)+Scanner(BX5103)"]; + "TRO509" [label="TRO509\n1Sep", fillcolor="#d4e8ff", color="#3388cc", shape=box, style="rounded,filled", tooltip="TRO 509 (1Sep)"]; + "TRO510" [label="TRO510\n1Sep1Swi", fillcolor="#ffe4a0", color="#cc8800", shape=box, style="rounded,filled", tooltip="TRO 510 (1Sep1Switch) + Scanner (BX5104)"]; + "TRO511" [label="TRO511\n1Sep", fillcolor="#d4e8ff", color="#3388cc", shape=box, style="rounded,filled", tooltip="TRO 511 (1Sep)"]; + "TRO512" [label="TRO512\nVario", fillcolor="#e8d4f0", color="#883388", shape=box, style="rounded,filled", tooltip="TRO 512 (Vario)+Scanner(BX5105)"]; + "TRO513" [label="TRO513\n1Sep", fillcolor="#d4e8ff", color="#3388cc", shape=box, style="rounded,filled", tooltip="TRO 513 (1Sep)"]; + "TRO514" [label="TRO514\n1Sep1Swi", fillcolor="#ffe4a0", color="#cc8800", shape=box, style="rounded,filled", tooltip="TRO 514 (1Sep1Switch) + Scanner (BX5106)"]; + "TRO515" [label="TRO515\n1Sep", fillcolor="#d4e8ff", color="#3388cc", shape=box, style="rounded,filled", tooltip="TRO 515 (1Sep)"]; + "TRO516" [label="TRO516\nVario", fillcolor="#e8d4f0", color="#883388", shape=box, style="rounded,filled", tooltip="TRO 516(Vario)+Scanner(BX5107)"]; + "TRO517" [label="TRO517\n1Sep", fillcolor="#d4e8ff", color="#3388cc", shape=box, style="rounded,filled", tooltip="TRO 517 (1Sep)"]; + "TRO518" [label="TRO518\n1Sep1Swi", fillcolor="#ffe4a0", color="#cc8800", shape=box, style="rounded,filled", tooltip="TRO 518 (1Sep1Switch) + Scanner (BX5108)"]; + "TRO519" [label="TRO519\n1Sep", fillcolor="#d4e8ff", color="#3388cc", shape=box, style="rounded,filled", tooltip="TRO 519 (1Sep)"]; + "TRO520" [label="TRO520\nVario", fillcolor="#e8d4f0", color="#883388", shape=box, style="rounded,filled", tooltip="TRO 520 (Vario)+Scanner(BX5109)"]; + "TRO521" [label="TRO521\n1Sep", fillcolor="#d4e8ff", color="#3388cc", shape=box, style="rounded,filled", tooltip="TRO 521(1Sep)"]; + "TRO522" [label="TRO522\n1Sep1Swi", fillcolor="#ffe4a0", color="#cc8800", shape=box, style="rounded,filled", tooltip="TRO 522 (1Sep1Switch) + Scanner (BX5110)"]; + "TRO523" [label="TRO523\n1Sep", fillcolor="#d4e8ff", color="#3388cc", shape=box, style="rounded,filled", tooltip="TRO 523 (1Sep)"]; + "TRO524" [label="TRO524\nVario", fillcolor="#e8d4f0", color="#883388", shape=box, style="rounded,filled", tooltip="TRO 524 (Vario)+Scanner(BX5231)"]; + "TRO525" [label="TRO525\n1Sep", fillcolor="#d4e8ff", color="#3388cc", shape=box, style="rounded,filled", tooltip="TRO 525(1Sep)"]; + "TRO526" [label="TRO526\n1Sep", fillcolor="#d4e8ff", color="#3388cc", shape=box, style="rounded,filled", tooltip="TRO 526 (1Sep) + Scanner (BX5112)"]; + "TRO527" [label="TRO527\n1Sep1Swi", fillcolor="#ffe4a0", color="#cc8800", shape=box, style="rounded,filled", tooltip="TRO 527 (1Sep1Switch)"]; + "TRO528" [label="TRO528\n1Sep", fillcolor="#d4e8ff", color="#3388cc", shape=box, style="rounded,filled", tooltip="TRO 528 (1Sep)"]; + "TRO529" [label="TRO529\n1Sep", fillcolor="#d4e8ff", color="#3388cc", shape=box, style="rounded,filled", tooltip="TRO 529 (1Sep) + Scanner (BX5113)"]; + "TRO530" [label="TRO530\nVario", fillcolor="#e8d4f0", color="#883388", shape=box, style="rounded,filled", tooltip="TRO 530 (Vario)"]; + "TRO531" [label="TRO531\nVario", fillcolor="#e8d4f0", color="#883388", shape=box, style="rounded,filled", tooltip="TRO 531 (Vario)"]; + + "EXT_UH05_e001" [label="EXTERN\nJA5000_1", shape=cds, fillcolor="#eef2f7", color="#557799", style="filled", fontsize=9]; + "EXT_UH05_e002" [label="EXTERN\nJA5001_1", shape=cds, fillcolor="#eef2f7", color="#557799", style="filled", fontsize=9]; + "EXT_UH05_e003" [label="EXTERN\nJA5004_2", shape=cds, fillcolor="#eef2f7", color="#557799", style="filled", fontsize=9]; + "EXT_UH05_e004" [label="EXTERN\nJA5005_3", shape=cds, fillcolor="#eef2f7", color="#557799", style="filled", fontsize=9]; + "EXT_UH05_e005" [label="EXTERN\nJA5006_3", shape=cds, fillcolor="#eef2f7", color="#557799", style="filled", fontsize=9]; + "EXT_UH05_e006" [label="EXTERN\nJA5007_3", shape=cds, fillcolor="#eef2f7", color="#557799", style="filled", fontsize=9]; + "EXT_UH05_e007" [label="EXTERN\nJA5008_3", shape=cds, fillcolor="#eef2f7", color="#557799", style="filled", fontsize=9]; + + "TRO502" -> "TRO531" [color="#883388", penwidth=2.2, style="dashdot", label="finger", fontcolor="#883388", tooltip="JA5000_2 (finger)"]; + "TRO531" -> "TRO503" [color="#883388", penwidth=2.2, style="dashdot", label="finger", fontcolor="#883388", tooltip="JA5000_3 (finger)"]; + "TRO500" -> "TRO530" [color="#883388", penwidth=2.2, style="dashdot", label="finger", fontcolor="#883388", tooltip="JA5001_2 (finger)"]; + "TRO530" -> "TRO501" [color="#883388", penwidth=2.2, style="dashdot", label="finger", fontcolor="#883388", tooltip="JA5001_3 (finger)"]; + "TRO501" -> "TRO504" [color="#444444", penwidth=1.3, tooltip="JA5002_1 (normal)"]; + "TRO503" -> "TRO504" [color="#444444", penwidth=1.3, tooltip="JA5002_1 (normal)"]; + "TRO529" -> "TRO504" [color="#444444", penwidth=1.3, tooltip="JA5002_1 (normal)"]; + "TRO528" -> "TRO529" [color="#444444", penwidth=1.3, tooltip="JA5002_10 (normal)"]; + "TRO504" -> "TRO505" [color="#444444", penwidth=1.3, tooltip="JA5002_2 (normal)"]; + "TRO505" -> "TRO510" [color="#cc8800", penwidth=1.3, style="dashed", label="dir2", fontcolor="#cc8800", tooltip="JA5002_3 (dir2)"]; + "TRO509" -> "TRO510" [color="#444444", penwidth=1.3, tooltip="JA5002_3 (normal)"]; + "TRO510" -> "TRO514" [color="#cc8800", penwidth=1.3, style="dashed", label="dir2", fontcolor="#cc8800", tooltip="JA5002_4 (dir2)"]; + "TRO513" -> "TRO514" [color="#444444", penwidth=1.3, tooltip="JA5002_4 (normal)"]; + "TRO514" -> "TRO518" [color="#cc8800", penwidth=1.3, style="dashed", label="dir2", fontcolor="#cc8800", tooltip="JA5002_5 (dir2)"]; + "TRO517" -> "TRO518" [color="#444444", penwidth=1.3, tooltip="JA5002_5 (normal)"]; + "TRO518" -> "TRO522" [color="#cc8800", penwidth=1.3, style="dashed", label="dir2", fontcolor="#cc8800", tooltip="JA5002_6 (dir2)"]; + "TRO521" -> "TRO522" [color="#444444", penwidth=1.3, tooltip="JA5002_6 (normal)"]; + "TRO522" -> "TRO526" [color="#cc8800", penwidth=1.3, style="dashed", label="dir2", fontcolor="#cc8800", tooltip="JA5002_7 (dir2)"]; + "TRO525" -> "TRO526" [color="#444444", penwidth=1.3, tooltip="JA5002_7 (normal)"]; + "TRO526" -> "TRO527" [color="#444444", penwidth=1.3, tooltip="JA5002_8 (normal)"]; + "TRO527" -> "TRO528" [color="#cc8800", penwidth=1.3, style="dashed", label="dir2", fontcolor="#cc8800", tooltip="JA5002_9 (dir2)"]; + "TRO505" -> "TRO506" [color="#444444", penwidth=1.3, tooltip="JA5003_1 (normal)"]; + "TRO506" -> "TRO507" [color="#883388", penwidth=2.2, style="dashdot", label="finger", fontcolor="#883388", tooltip="JA5003_2 (finger)"]; + "TRO507" -> "TRO508" [color="#444444", penwidth=1.3, tooltip="JA5004_1 (normal)"]; + "TRO510" -> "TRO511" [color="#444444", penwidth=1.3, tooltip="JA5005_1 (normal)"]; + "TRO511" -> "TRO512" [color="#444444", penwidth=1.3, tooltip="JA5005_2 (normal)"]; + "TRO514" -> "TRO515" [color="#444444", penwidth=1.3, tooltip="JA5006_1 (normal)"]; + "TRO515" -> "TRO516" [color="#444444", penwidth=1.3, tooltip="JA5006_2 (normal)"]; + "TRO518" -> "TRO519" [color="#444444", penwidth=1.3, tooltip="JA5007_1 (normal)"]; + "TRO519" -> "TRO520" [color="#444444", penwidth=1.3, tooltip="JA5007_2 (normal)"]; + "TRO522" -> "TRO523" [color="#444444", penwidth=1.3, tooltip="JA5008_1 (normal)"]; + "TRO523" -> "TRO524" [color="#444444", penwidth=1.3, tooltip="JA5008_2 (normal)"]; + + "EXT_UH05_e001" -> "TRO502" [color="#557799", penwidth=1.3, label="EXTERN", fontcolor="#557799", tooltip="JA5000_1"]; + "EXT_UH05_e002" -> "TRO500" [color="#557799", penwidth=1.3, label="EXTERN", fontcolor="#557799", tooltip="JA5001_1"]; + "TRO508" -> "EXT_UH05_e003" [color="#557799", penwidth=1.3, label="EXTERN", fontcolor="#557799", tooltip="JA5004_2"]; + "TRO512" -> "EXT_UH05_e004" [color="#557799", penwidth=1.3, label="EXTERN", fontcolor="#557799", tooltip="JA5005_3"]; + "TRO516" -> "EXT_UH05_e005" [color="#557799", penwidth=1.3, label="EXTERN", fontcolor="#557799", tooltip="JA5006_3"]; + "TRO520" -> "EXT_UH05_e006" [color="#557799", penwidth=1.3, label="EXTERN", fontcolor="#557799", tooltip="JA5007_3"]; + "TRO524" -> "EXT_UH05_e007" [color="#557799", penwidth=1.3, label="EXTERN", fontcolor="#557799", tooltip="JA5008_3"]; + + subgraph cluster_legend { + label="Legend"; fontsize=12; color="#cccccc"; style="rounded"; + node [shape=plaintext, style="", fillcolor="none", fontsize=10]; + legend [label=< + + + + + + + +
—— normalstandard transfer (jam area to jam area)
—— dir2switch output, direction 2 (FC_Direction)
—— dir3switch output, direction 3 (FC_Direction)
—— bypassbypass around a storage block (PinStore)
—— fingerchain-conveyor finger / index transfer
—— EXTERNinfeed / outfeed to another PLC (EXTERN)
>]; + } +} diff --git a/doc/TRO_Katalog/tro_graphs/uh05.svg b/doc/TRO_Katalog/tro_graphs/uh05.svg new file mode 100644 index 0000000..05a6bc3 --- /dev/null +++ b/doc/TRO_Katalog/tro_graphs/uh05.svg @@ -0,0 +1,774 @@ + + + + + + +UH05 + +UH05 + — TRO topology (nodes coloured by type, edges by connection kind) + +cluster_legend + +Legend + + + +TRO500 + + +TRO500 +Vario + + + + + +TRO530 + + +TRO530 +Vario + + + + + +TRO500->TRO530 + + + + + +finger + + + +TRO501 + + +TRO501 +1Sep + + + + + +TRO504 + + +TRO504 +1Sep + + + + + +TRO501->TRO504 + + + + + + + + +TRO502 + + +TRO502 +Vario + + + + + +TRO531 + + +TRO531 +Vario + + + + + +TRO502->TRO531 + + + + + +finger + + + +TRO503 + + +TRO503 +1Sep + + + + + +TRO503->TRO504 + + + + + + + + +TRO505 + + +TRO505 +1Sep1Swi + + + + + +TRO504->TRO505 + + + + + + + + +TRO506 + + +TRO506 +Vario + + + + + +TRO505->TRO506 + + + + + + + + +TRO510 + + +TRO510 +1Sep1Swi + + + + + +TRO505->TRO510 + + + + + +dir2 + + + +TRO507 + + +TRO507 +1Sep + + + + + +TRO506->TRO507 + + + + + +finger + + + +TRO508 + + +TRO508 +Vario + + + + + +TRO507->TRO508 + + + + + + + + +EXT_UH05_e003 + +EXTERN +JA5004_2 + + + +TRO508->EXT_UH05_e003 + + + + + +EXTERN + + + +TRO509 + + +TRO509 +1Sep + + + + + +TRO509->TRO510 + + + + + + + + +TRO511 + + +TRO511 +1Sep + + + + + +TRO510->TRO511 + + + + + + + + +TRO514 + + +TRO514 +1Sep1Swi + + + + + +TRO510->TRO514 + + + + + +dir2 + + + +TRO512 + + +TRO512 +Vario + + + + + +TRO511->TRO512 + + + + + + + + +EXT_UH05_e004 + +EXTERN +JA5005_3 + + + +TRO512->EXT_UH05_e004 + + + + + +EXTERN + + + +TRO513 + + +TRO513 +1Sep + + + + + +TRO513->TRO514 + + + + + + + + +TRO515 + + +TRO515 +1Sep + + + + + +TRO514->TRO515 + + + + + + + + +TRO518 + + +TRO518 +1Sep1Swi + + + + + +TRO514->TRO518 + + + + + +dir2 + + + +TRO516 + + +TRO516 +Vario + + + + + +TRO515->TRO516 + + + + + + + + +EXT_UH05_e005 + +EXTERN +JA5006_3 + + + +TRO516->EXT_UH05_e005 + + + + + +EXTERN + + + +TRO517 + + +TRO517 +1Sep + + + + + +TRO517->TRO518 + + + + + + + + +TRO519 + + +TRO519 +1Sep + + + + + +TRO518->TRO519 + + + + + + + + +TRO522 + + +TRO522 +1Sep1Swi + + + + + +TRO518->TRO522 + + + + + +dir2 + + + +TRO520 + + +TRO520 +Vario + + + + + +TRO519->TRO520 + + + + + + + + +EXT_UH05_e006 + +EXTERN +JA5007_3 + + + +TRO520->EXT_UH05_e006 + + + + + +EXTERN + + + +TRO521 + + +TRO521 +1Sep + + + + + +TRO521->TRO522 + + + + + + + + +TRO523 + + +TRO523 +1Sep + + + + + +TRO522->TRO523 + + + + + + + + +TRO526 + + +TRO526 +1Sep + + + + + +TRO522->TRO526 + + + + + +dir2 + + + +TRO524 + + +TRO524 +Vario + + + + + +TRO523->TRO524 + + + + + + + + +EXT_UH05_e007 + +EXTERN +JA5008_3 + + + +TRO524->EXT_UH05_e007 + + + + + +EXTERN + + + +TRO525 + + +TRO525 +1Sep + + + + + +TRO525->TRO526 + + + + + + + + +TRO527 + + +TRO527 +1Sep1Swi + + + + + +TRO526->TRO527 + + + + + + + + +TRO528 + + +TRO528 +1Sep + + + + + +TRO527->TRO528 + + + + + +dir2 + + + +TRO529 + + +TRO529 +1Sep + + + + + +TRO528->TRO529 + + + + + + + + +TRO529->TRO504 + + + + + + + + +TRO530->TRO501 + + + + + +finger + + + +TRO531->TRO503 + + + + + +finger + + + +EXT_UH05_e001 + +EXTERN +JA5000_1 + + + +EXT_UH05_e001->TRO502 + + + + + +EXTERN + + + +EXT_UH05_e002 + +EXTERN +JA5001_1 + + + +EXT_UH05_e002->TRO500 + + + + + +EXTERN + + + +legend +—— normal +standard transfer (jam area to jam area) +—— dir2 +switch output, direction 2 (FC_Direction) +—— dir3 +switch output, direction 3 (FC_Direction) +—— bypass +bypass around a storage block (PinStore) +—— finger +chain-conveyor finger / index transfer +—— EXTERN +infeed / outfeed to another PLC (EXTERN) + + + diff --git a/doc/TRO_Katalog/tro_graphs/vario.svg b/doc/TRO_Katalog/tro_graphs/vario.svg new file mode 100644 index 0000000..83c805f --- /dev/null +++ b/doc/TRO_Katalog/tro_graphs/vario.svg @@ -0,0 +1,26 @@ + +Vario - chain conveyor + + + + + + +Vario +FB_ILS_MTRO_Vario + + +Entry JamArea + +Vario +chain · pos/finger · motor MA + +Finger Exit + + +in + + +finger +driven chain segment; transfers to the next block via finger/index + diff --git a/doc/TRO_Katalog/tro_graphs/vario_workstation.svg b/doc/TRO_Katalog/tro_graphs/vario_workstation.svg new file mode 100644 index 0000000..d134d83 --- /dev/null +++ b/doc/TRO_Katalog/tro_graphs/vario_workstation.svg @@ -0,0 +1,30 @@ + +Vario_workStation - manual work station + + + + + + + +Vario_workStation +FB_ILS_MTRO_Vario_workStation + + +Entry JamArea + +Vario_workStation +chain + manual station + +Finger Exit + +operator · release button + + +in + + +finger + +Vario variant: station sensor + release button + load-error sensor +