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 0000000..682ff63 Binary files /dev/null and b/doc/TRO_Katalog/img/1sep.png differ diff --git a/doc/TRO_Katalog/img/1sep_1swi.png b/doc/TRO_Katalog/img/1sep_1swi.png new file mode 100644 index 0000000..e82b2a9 Binary files /dev/null and b/doc/TRO_Katalog/img/1sep_1swi.png differ diff --git a/doc/TRO_Katalog/img/1sep_sscc.png b/doc/TRO_Katalog/img/1sep_sscc.png new file mode 100644 index 0000000..4de8ec7 Binary files /dev/null and b/doc/TRO_Katalog/img/1sep_sscc.png differ diff --git a/doc/TRO_Katalog/img/Pinstore.png b/doc/TRO_Katalog/img/Pinstore.png new file mode 100644 index 0000000..d18d86d Binary files /dev/null and b/doc/TRO_Katalog/img/Pinstore.png differ diff --git a/doc/TRO_Katalog/img/README.md b/doc/TRO_Katalog/img/README.md new file mode 100644 index 0000000..78fd595 --- /dev/null +++ b/doc/TRO_Katalog/img/README.md @@ -0,0 +1,18 @@ +# Bilder-Ordner (Layout-Screenshots) + +Hier liegen die realen BricsCAD-Layout-Bilder je TRO-Typ. Dateinamen und +Beispiel-TROs siehe [Capture-Checkliste in TRO_Katalog.md](../TRO_Katalog.md#capture-checkliste). + +Erwartete Dateien: + +- `1sep_layout.png` +- `1sep1swi_layout.png` +- `1sep2swi_layout.png` +- `1sep_sscc_layout.png` +- `vario_layout.png` +- `pinstore_auto_layout.png` +- `vario_workstation_layout.png` +- `emptycarrbuffer_layout.png` +- `loadingboom_layout.png` + +Quelle: `Documents\Fortna-Layout\ST500592_10_5-13_ILS.dwg` (nur in BricsCAD zu öffnen). diff --git a/doc/TRO_Katalog/scl_templates/FB_EmptyCarrBuffer.scl b/doc/TRO_Katalog/scl_templates/FB_EmptyCarrBuffer.scl new file mode 100644 index 0000000..cff7f64 --- /dev/null +++ b/doc/TRO_Katalog/scl_templates/FB_EmptyCarrBuffer.scl @@ -0,0 +1,1236 @@ +FUNCTION_BLOCK "FB_EmptyCarrBuffer" +{ S7_Optimized_Access := 'TRUE' } +VERSION : 0.1 + VAR_INPUT + nInBufferNr : Int; // 101 oder 102 + xInBufferReq : Bool; // Es soll eingelagert werden + xInPause : Bool; // Es wird pausiert für den anderen Puffer + xInSftyOk : Bool; + xInConveyorRunOut : Bool; + xInBufferRelease : Bool; // Puffer leeren normal + xInBufferReleaseNext : Bool; // Puffer leeren für Nachbarn + arInSep : Array[1..5] of Struct // Separatoren der Linien + stSenTrolley : "UDT_Sensor"; + stSettings : "SettingsSeparator"; + END_STRUCT; + arInJamSensor : Array[1..5] of "UDT_Sensor"; // Jamsensoren der Linien + stInSenJamExit : "UDT_Sensor"; // Stausensor Exitstrecke + stInPriorityManager : "UDT_Response"; // Schnittstelle Prioritätenmanager (z.B. bei Kreuzungen) + stInSettings : Struct + nDestGeneral : Int; + nConvStations : Int; + nStationsMax : Int; + nStorageThreshold : Int := 10; + nNoOfLines : USInt := 5; + nNoOfPositions : USInt := 70; + sJamSrc : String; + sJamDest : String; + END_STRUCT; + END_VAR + + VAR_OUTPUT + xOutBypass : Bool; + nOutLineNr : Int; + xOutReadyToReceive : Bool; + nOutFillLevel : Int; // in Prozent + xOutFull : Bool; + arOutSwitchLine : Array[1..5] of Bool; + nOutStateLast : Int; + nOutActNo : Int; // aktuelle Linie 1-5, oder 0 falls inaktiv + xOutSwitchExitReady : Bool; + xOutSepExitRelease : Bool; + xOutCarouselReq : Bool; + stOutPriorityManager : "UDT_Request"; // Schnittstelle Prioritätenmanager (z.B. bei Kreuzungen) + arOutSeparatorStore : Array[1..5] of Bool; // Ausgänge Separator Lagerstrecken Ventil + END_VAR + + VAR_IN_OUT + stInOutControlUnitCabinet : "UDT_MainState"; // Hauptzustandsmaschine + arInOutStorageLines : Array[*] of "stStorageLine"; // Daten Lagerlinien + arInOutJamExit : Array[*] of "stCarrier"; // Jam nach Linien-Separatoren + stInOutJamExit : "stJamData"; // Konfig+Status-Daten Staubereich Ausgang 1 + stInOutHMI : "UDT_HMI_TRO_PinStore"; // HMI Schnittstelle Separator Lagerlinien + END_VAR + + VAR + fbStateManagerE : "FB_StateManager"; // Schrittkette eingangsseitig + fbStateManagerA : "FB_StateManager"; // Schrittkette ausgangsseitig + arfbSeparatorStorage { S7_SetPoint := 'False'} : Array[1..5] of "FB_ILS_STRO_Sep"; // Aufruf Separatoren Lagerlinien + nStateE : Int; // Schritt eingangsseitig + nStateA : Int; // Schritt ausgangsseitig + sStateTextE : String[100] := ''; // Aktueller State der Schrittkette (textuell) + sStateTextA : String[100]; + nLineNr { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : Int; + nSepNr : Int; + xBypassNextBoom : Bool; + xStart : Bool; + END_VAR + VAR RETAIN + nActLine : Int; + END_VAR + VAR + nLastLine : Int; + nTestStorageOut : Int := 1; + stDummyCarrier { S7_SetPoint := 'False'} : "stCarrier"; + tOnSvReleaseSep {InstructionName := 'TON_TIME'; LibVersion := '1.0'; S7_SetPoint := 'False'} : TON_TIME; // Supervision - Freigabe Separator + xVersatz : Bool; + fbCarrierWaitStore1 : "FB_CarrAccumulate1Sep"; + fbCarrierWaitStore2 : "FB_CarrAccumulate1Sep"; + fbCarrierWaitStore3 : "FB_CarrAccumulate1Sep"; + fbCarrierWaitStore4 : "FB_CarrAccumulate1Sep"; + fbCarrierWaitStore5 : "FB_CarrAccumulate1Sep"; + arArrayMax : Array[1..5] of Int; + stCarrierDummy { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'; S7_SetPoint := 'False'} : "stCarrier" := (1, (), 16#01); + nArrayMax : Int; + fbEventLog_Route2 : "FB_EventLog_Booking"; + fbEventLogCorrection1 : "FB_EventLog_Correction"; + fbEventLogCorrection2 : "FB_EventLog_Correction"; + fbEventLogCarrierUnknown : "FB_EventLog_Scan"; + fbEventLogCarrierNew : "FB_EventLog_Scan"; + fbEventLogGoodRead : "FB_EventLog_Scan"; + END_VAR + + VAR_TEMP + nIdx : Int; + tmpActUnivTonE : Bool; + tmpActUnivTonA : 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 + arTmpStorageData : Array[1..5] of "stJamData"; + arTmpSenJamLine : Array[1..5] of "UDT_Sensor"; + arTmpSenInSepLine : Array[1..5] of "UDT_Sensor"; + arLineRelease : Array[1..5] of Bool; + xTmpSepExitRelease : Bool; + nActNo : Int; + nTmpArrayMax1 : Int; + nTmpArrayMax2 : Int; + nTmpArrayMax3 : Int; + nTmpArrayMax4 : Int; + nTmpArrayMax5 : Int; + xTmpSwitchExitReady : Bool; + xTmpSwitch : Bool; + stCognexInterfaceDummy : "stCognexInterface"; + stEmptyCarrier : "stCarrier"; + tmpCarrierEmpty : "stCarrier"; + stBookingInfo : "stEventBookingInfo"; + arEmptyCarrier : Array[1..1] of "stCarrier"; + nCounter : DInt; + xResult : Bool; + xEventLogBookExit : Bool; + arEventCorrectionInfo : Array[0..1] of "stEventCorrectionInfo"; + xUnknownCarrier : Bool; + stEventGoodRead : "stEventScanInfo"; + stEventNew : "stEventScanInfo"; + stEventUnknown : "stEventScanInfo"; + xNewCarrier : Bool; + xGoodRead : Bool; + END_VAR + + VAR CONSTANT + c0000_StepOff : Int := 0; + c0100_StepUndefined : Int := 100; + c0200_StepIdle : Int := 200; + c0400_StepWaitAndSwitch : Int := 400; + c0800_StepSwitch : Int := 800; + c0900_StepWorking : Int := 900; + c1000_StepWaitForTrolley1 : Int := 1000; // Warte auf Trolley 1 + c1200_StepWaitForChange : Int := 1200; + c1400_StepCheckSep1 : Int := 1400; // Separator checken + c1500_StepReleaseSep1 : Int := 1500; // Freigabe an Separator + c2000_StepWaitForTrolley2 : Int := 2000; // Warte auf Trolley 2 + c2300_StepCheckSep2 : Int := 2300; // Separator checken + c2400_StepCheckJam : Int := 2400; // Stau überprüfen + c2500_StepReleaseSep2 : Int := 2500; // Freigabe an Separator + cCarrierDummy : Int := 1; + END_VAR + + +BEGIN + + + REGION Schrittkette Einlagern + + (* zum Kopieren + #cxxxx_Stepxxxx: + REGION xxxx: xxxx + // akt. Zustand + #sStateText := 'xxxx'; + ///////// Ausgänge ///////// + + ///////// Statics ////////// + + ///////// Timer ////////// + + //////// Transition //////// + #nState := #cxxxx_Stepxxxx; + END_REGION + *) + + CASE #nStateE OF + #c0000_StepOff: + REGION 0000: Off + // akt. Zustand + #sStateTextE := 'Off'; + ///////// Ausgänge ///////// + + ///////// Statics ////////// + + ///////// Timer ////////// + + //////// Transition //////// + // SCHRITT 0 WIRD GEBRAUCHT! + //STATE MANAGER KÜMMERT SICH UM TRANSITION! + END_REGION + + #c0100_StepUndefined: + REGION 0100: Undefined + // akt. Zustand + #sStateTextE := 'Undefined'; + ///////// Ausgänge ///////// + + ///////// Statics ////////// + + ///////// Timer ////////// + + //////// Transition //////// + #nStateE := #c0200_StepIdle; + END_REGION + + #c0200_StepIdle: + REGION 0200: Idle + // akt. Zustand + #sStateTextE := 'Idle'; + ///////// Ausgänge ///////// + + ///////// Statics ////////// + + ///////// Timer ////////// + + //////// Transition //////// + IF NOT #xInPause THEN + FOR #nIdx := 1 TO "cNoLines" DO + IF #arInOutStorageLines[#nIdx].stData.Status.nCount (* #arTmpStorageData[#nIdx].Status.nCount *)< #arInOutStorageLines[#nIdx].stData.Config.nCapacitySet AND + NOT #arInJamSensor[#nIdx].xJam (* #arTmpSenJamLine[#nIdx].xJam *)AND NOT #xInPause THEN + #nLineNr := #nIdx; + // #xBypassNextBoom := FALSE; + EXIT; + END_IF; + END_FOR; + ELSE + IF #nInBufferNr = "cMainTro101" THEN + #xBypassNextBoom := TRUE; //geradeaus + // ELSE + // #xBypassNextBoom := FALSE; + END_IF; + END_IF; + + IF #xInBufferReq AND NOT #xInPause AND #nLineNr <> 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 +