From 41df84131766a8db9ceb93204faf8a0b5e2ae7a6 Mon Sep 17 00:00:00 2001 From: Samer Ayadi Date: Mon, 12 Oct 2026 13:13:55 +0200 Subject: [PATCH] SCL-Templates fuer alle Typen mit Referenz-Aufrufstelle (Schritt 5) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - neue Templates: FB_ILS_MTRO_1Sep (TRO100), _Vario (TRO115), _Vario_workStation (TRO421), _1Sep2Swi (TRO267), _1Sep_SSCC (TRO105), _PinStore_Auto (TRO208); zusammen mit dem Pilot 1Sep1Swi 7 von 11 Typen. 2Sep1Swi, EmptyCarrBuffer, LoadingBoom, 2Sep2Swi bleiben generisch (keine reale Aufrufstelle) - scl_context: Felder nur fuer die Templates - Cognex-Verdrahtung je Scanner, part_sensor, carriers/data je Staubereich, jam_in/jam_out (dieselben Objekte wie erster Ein-/Ausgang), error_quit, automatic, is_border, correction_station, Bloecke sscc/work_station/store (PinStore: eine Linie je Speicherbahn aus dem Layout statt der 19 aus dem Katalog) - _macros: cognex_in/cognex_out/cognex, correction, todo_mehr - tests/test_scl_templates.py: Rundlauf je Template gegen seine Referenz (PinStore: von der Referenz abgekuerzte Teile ausgenommen); Normalisierung vereinheitlicht ":="/"=>"-Abstaende - Golden-Files *_templates neu geschrieben (gewollt: mehr TROs aus Templates); generische Golden-Files unveraendert - Doku: SCL_Templates.md (§6 Entscheidungen je Template, §11 Schritt 5, §13 offene Fragen 9-12), Python_Scripts.md, CLAUDE.md, README.md Zeilenentscheidungen sind Vorschlaege, noch mit den SPS-Kollegen zu bestaetigen. Geprueft: 39 Tests gruen, jede Rundlauf-Pruefung erkennt eine geaenderte Zeile; tro_flow --json + scl_skeleton --templates auf allen 8 CSVs ohne Fehler. Co-Authored-By: Claude Opus 5.5 --- CLAUDE.md | 4 +- README.md | 2 +- doc/Python_Scripts.md | 12 +- doc/SCL_Templates.md | 69 +- lib/scl_context.py | 198 ++++- lib/scl_templates/FB_ILS_MTRO_1Sep.scl.j2 | 66 ++ lib/scl_templates/FB_ILS_MTRO_1Sep2Swi.scl.j2 | 105 +++ .../FB_ILS_MTRO_1Sep_SSCC.scl.j2 | 112 +++ .../FB_ILS_MTRO_PinStore_Auto.scl.j2 | 132 +++ lib/scl_templates/FB_ILS_MTRO_Vario.scl.j2 | 83 ++ .../FB_ILS_MTRO_Vario_workStation.scl.j2 | 85 ++ lib/scl_templates/_macros.scl.j2 | 37 + .../scl/HundM05_FB_Main_templates.scl | 592 ++++++++----- .../fixtures/scl/mubea_FB_Main_templates.scl | 811 +++++++++++++----- tests/test_scl_templates.py | 227 ++++- 15 files changed, 2044 insertions(+), 491 deletions(-) create mode 100644 lib/scl_templates/FB_ILS_MTRO_1Sep.scl.j2 create mode 100644 lib/scl_templates/FB_ILS_MTRO_1Sep2Swi.scl.j2 create mode 100644 lib/scl_templates/FB_ILS_MTRO_1Sep_SSCC.scl.j2 create mode 100644 lib/scl_templates/FB_ILS_MTRO_PinStore_Auto.scl.j2 create mode 100644 lib/scl_templates/FB_ILS_MTRO_Vario.scl.j2 create mode 100644 lib/scl_templates/FB_ILS_MTRO_Vario_workStation.scl.j2 diff --git a/CLAUDE.md b/CLAUDE.md index 0ff79aa..f4003da 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -158,7 +158,9 @@ from the catalog via the TRO type, never stored. See `doc/Python_Scripts.md` §6 Inside the SCL output, `lib/scl_context.py` (TRO-JSON → render context, all derivations) sits between `model.py` and `scl_skeleton.py` (context → text only). With `--templates` (opt-in) REGIONs come from Jinja2 templates in `lib/scl_templates/.scl.j2` -(pilot: `FB_ILS_MTRO_1Sep1Swi`), each round-trip tested against its reference call site +(all 7 types with a reference call site: `1Sep`, `1Sep1Swi`, `1Sep2Swi`, `1Sep_SSCC`, +`Vario`, `Vario_workStation`, `PinStore_Auto`; `2Sep1Swi`, `EmptyCarrBuffer`, `LoadingBoom`, +`2Sep2Swi` stay generic until a call site exists), each round-trip tested against its reference call site in `doc/TRO_Katalog/scl_templates/` (`tests/test_scl_templates.py`); every line holding a placeholder must carry `TODO(E-Planung)`. Migration steps, decisions per template line and status: `doc/SCL_Templates.md`. Golden files in `tests/fixtures/scl/` pin the SCL output byte for diff --git a/README.md b/README.md index f49893d..1f76d53 100644 --- a/README.md +++ b/README.md @@ -23,7 +23,7 @@ einem CSV-Export der mechanischen Planung (ILS 2.0) entstehen automatisch: (Sensor-/Aktoradressen, Separator-/Weichennummern, Staubereiche, ungeprüfte Zeiten), ist als `TODO(E-Planung)` markiert statt geraten. Optional (`--templates`) kommen die REGIONs aus Jinja2-Templates - (`lib/scl_templates/.scl.j2`, Pilot: `FB_ILS_MTRO_1Sep1Swi`), + (`lib/scl_templates/.scl.j2`, für alle 7 Typen mit Referenz-Aufrufstelle), - zur Sichtkontrolle eine **annotierte Kopie der BricsCAD-Zeichnung** mit einem Marker-Symbol pro TRO. Die Zeichnung ist nur Ansicht, keine Datenquelle für die SCL. diff --git a/doc/Python_Scripts.md b/doc/Python_Scripts.md index 8e1e526..df1d2a7 100644 --- a/doc/Python_Scripts.md +++ b/doc/Python_Scripts.md @@ -485,11 +485,13 @@ per-project naming rules described in [`SCL_Templates.md`](SCL_Templates.md). **Templates (opt-in, `--templates [DIR]`).** With this switch every TRO whose FB has a template in `lib/scl_templates/.scl.j2` (Jinja2) is rendered from it; the others keep the generic text above. The header and the console summary -name which FB types came from a template. Today only the pilot -`FB_ILS_MTRO_1Sep1Swi` exists — it follows the real call site of TRO107 line for -line (priority manager `Dir2`, `stInSenJam`, `xInCarouselRun1`, reference -times 100/50 ms), and every value that is still open carries -`TODO(E-Planung)`. `--strict` stops (exit `1`, no SCL) if any FB type has no +name which FB types came from a template. Templates exist for the seven types +with a real reference call site (`1Sep`, `1Sep1Swi`, `1Sep2Swi`, `1Sep_SSCC`, +`Vario`, `Vario_workStation`, `PinStore_Auto`); each follows its call site in +`doc/TRO_Katalog/scl_templates/` line for line, and every value that is still +open carries `TODO(E-Planung)`. The line decisions are proposals to be confirmed +by a PLC engineer (`doc/SCL_Templates.md` §6). `2Sep1Swi`, `EmptyCarrBuffer`, +`LoadingBoom` and `2Sep2Swi` have no call site yet and stay generic. `--strict` stops (exit `1`, no SCL) if any FB type has no template. Without `--templates` the output is unchanged. Tests: `tests/test_scl_context.py` (the derivations one by one), diff --git a/doc/SCL_Templates.md b/doc/SCL_Templates.md index 6aca04c..f48ae12 100644 --- a/doc/SCL_Templates.md +++ b/doc/SCL_Templates.md @@ -1,7 +1,9 @@ # SCL Generation from Parameterised Templates — Concept -**Status:** steps 1–3 of §11 done — pilot template `FB_ILS_MTRO_1Sep1Swi` usable with -`--templates`, default output unchanged · **As of:** 2026-10-09 +**Status:** steps 1–3 and 5 of §11 done — templates for all 7 types with a reference call +site (`1Sep`, `1Sep1Swi`, `1Sep2Swi`, `1Sep_SSCC`, `Vario`, `Vario_workStation`, +`PinStore_Auto`) usable with `--templates`, default output unchanged; the line decisions +(§6) are proposals still to be confirmed by a PLC engineer · **As of:** 2026-10-12 This is the plan for moving `scl_skeleton.py` from hard-coded SCL (Python f-strings in the `emit_*` functions) to **parameterised templates**: the SCL structure for each FB @@ -54,13 +56,13 @@ Coverage per catalog type (`lib/tro_catalog.py`): | Catalog type | FB | Call site | FB source | Template possible | |---|---|---|---|---| -| `1Sep` | `FB_ILS_MTRO_1Sep` | yes (TRO 100) | — | yes | -| `1Sep1Swi` | `FB_ILS_MTRO_1Sep1Swi` | yes (TRO 107) | — | yes — **first pilot** | -| `1Sep2Swi` | `FB_ILS_MTRO_1Sep2Swi` | yes (TRO 267) | — | yes | -| `1Sep_SSCC` | `FB_ILS_MTRO_1Sep_SSCC` | yes (TRO 105) | — | yes | -| `Vario` | `FB_ILS_MTRO_Vario` | yes (TRO 115) | — | yes | -| `PinStore_Auto` | `FB_ILS_MTRO_PinStore_Auto` | yes (TRO 208) | — | yes (outlier, largest) | -| `Vario_workStation` | `FB_ILS_MTRO_Vario_workStation` | yes (TRO 421, `_CallSite.scl`) | yes | yes, with interface check | +| `1Sep` | `FB_ILS_MTRO_1Sep` | yes (TRO 100) | — | ✅ done | +| `1Sep1Swi` | `FB_ILS_MTRO_1Sep1Swi` | yes (TRO 107) | — | ✅ done (first pilot) | +| `1Sep2Swi` | `FB_ILS_MTRO_1Sep2Swi` | yes (TRO 267) | — | ✅ done | +| `1Sep_SSCC` | `FB_ILS_MTRO_1Sep_SSCC` | yes (TRO 105) | — | ✅ done | +| `Vario` | `FB_ILS_MTRO_Vario` | yes (TRO 115) | — | ✅ done | +| `PinStore_Auto` | `FB_ILS_MTRO_PinStore_Auto` | yes (TRO 208) | — | ✅ done (outlier, largest) | +| `Vario_workStation` | `FB_ILS_MTRO_Vario_workStation` | yes (TRO 421, `_CallSite.scl`) | yes | ✅ done (interface check §8.2 still open) | | `2Sep1Swi` | `FB_ILS_MTRO_2Sep1Swi` | **no** | yes | from interface only — needs a real call site | | `EmptyCarrBuffer` | `FB_EmptyCarrBuffer` | **no** | yes | from interface only — needs a real call site | | `LoadingBoom` | `FB_LoadingBoom_INBOUND` | **no** | yes | from interface only — needs a real call site | @@ -103,8 +105,13 @@ sps_skel/ │ ├── scl_naming.py NEW: reads the naming config, resolves names │ └── scl_templates/ NEW: the parameterised templates │ ├── _macros.scl.j2 shared blocks (separator, switch, jam, call, direction) +│ ├── FB_ILS_MTRO_1Sep.scl.j2 ✅ │ ├── FB_ILS_MTRO_1Sep1Swi.scl.j2 pilot ✅ -│ └── ... one per FB, named exactly like fbType +│ ├── FB_ILS_MTRO_1Sep2Swi.scl.j2 ✅ +│ ├── FB_ILS_MTRO_1Sep_SSCC.scl.j2 ✅ +│ ├── FB_ILS_MTRO_Vario.scl.j2 ✅ +│ ├── FB_ILS_MTRO_Vario_workStation.scl.j2 ✅ +│ └── FB_ILS_MTRO_PinStore_Auto.scl.j2 ✅ (one per FB, named exactly like fbType) ├── cfg/ │ ├── scl_naming.ini NEW: default naming rules (from the reference plant) │ └── _scl_naming.ini NEW, optional: per-project override @@ -260,11 +267,31 @@ template as a comment. For the pilot `1Sep1Swi` (TRO107): | `nTo1Destinations := 3` (TRO107 has **2** exits) | number of exits, marked `pruefen` — the reference suggests it counts destinations, not exits (§13) | `switches[].to1_destinations` | open | | `stInPriorityManager.xReleaseOk` (generic only) | not written — not in the reference | — | to confirm | -The same table is filled in for every template before it is switched on (§11, step 3). +The same decisions were made for the other six templates (step 5). Each template's +header comment lists them in full; this is the summary of what deviates from "copy the +reference line": -Effect on the open-value count with `--templates`: mubea 282 → 302, HundM05 323 → 377 -`TODO(E-Planung)`. More reference lines are written and every open value is now marked; -it drops again with the naming rules (step 4). +| Template (reference) | Decisions to confirm | +|---|---| +| `1Sep` (TRO100) | times 600/200 ms and `tSenFree`/`tSenWait` 1500/4000 ms as in the reference (`pruefen`); `xInCarouselRun` always written as TODO; `xInRelease := "DB_TRO_TEST".` as in the reference | +| `Vario` (TRO115) | times 800/300 ms, `xPluggedJam FALSE`, `tSenFree`/`tSenWait` 2000/5000 ms, `tRasterHigh/Low` 5 s (`pruefen`); `stInSettings.xIsBorner := TRUE` marked TODO (meaning unclear); `JamEntr` = first predecessor, `JamFinger` = first successor; `xInErrorQuit`/`xInAutomatic` open | +| `Vario_workStation` (TRO421) | `xPluggedScanner FALSE` although the catalog lists a scanner (it sits at the work station, not the separator — `pruefen`); work-station sensor, release and `xBeladenError` sensor open | +| `1Sep2Swi` (TRO267) | separator without times, `xPluggedPart TRUE` + `stSenPart` as in the reference; **switch 2 has no `nSwitchNo` in the reference** — written as a commented-out proposal; `nTo1Destinations` per switch open (split of the exits); `bSepType.%X2 := TRUE` marked `pruefen`; one `xInCarouselRun` per switch; **no `FC_Direction`** at this place in the reference — only the destination list as a comment; no `nOutStateLast` (not in the reference) | +| `1Sep_SSCC` (TRO105) | second (SSCC) camera with its own interface structure, end-measurement sensor and HMI key open; `xInRelease` written as `"DB_TRO_TEST".` with a TODO (the reference releases via the WCS connection); `FC_CARR_GLOB_CORRECTION` with `nInStation` open; the WCS telegram region of the reference is only noted as TODO | +| `PinStore_Auto` (TRO208) | **number of lines from the layout** (one per storage lane, `nNoOfLines`), not the 19 of the reference; all plant constants (encoder, destinations, stations, thresholds, storage DB, removal handshake) open; pin separator times 0/50 ms (`pruefen`); simulation settings `stSimu` of the reference not written; the FB has one `JamEntr`/`JamExit` — a store with more feeds/exits (mubea: 2/2) gets a TODO in the REGION header | + +New context fields for these templates (`lib/scl_context.py`): Cognex wiring per scanner +(`interface`, `tag`, `hw_results`), `part_sensor` per separator, `carriers`/`data` per jam +area (handover jams use their own variables), `jam_in`/`jam_out` (same objects as the +first entry/exit), `error_quit`, `automatic`, `is_border`, `correction_station`, and the +blocks `sscc`, `work_station`, `store` (with one `SclStoreLine` per lane). The generic +path does not use them — its golden files are unchanged. + +Effect on the open-value count with `--templates`: with the pilot only, mubea 282 → 302 +and HundM05 323 → 377; with all seven templates mubea → 489 and HundM05 → 475 +`TODO(E-Planung)` (HundM05 now comes completely from templates, mubea except the +`2Sep2Swi`). More reference lines are written and every open value is marked; the count +drops again with the naming rules (step 4). --- @@ -392,8 +419,8 @@ With `--templates` the console summary gets a `Templates` line (implemented); th `Namensregeln` line follows with step 4. Real output for mubea today: ``` -Templates = 1 von 5 Typen (generisch: FB_ILS_MTRO_1Sep, FB_ILS_MTRO_2Sep2Swi, FB_ILS_MTRO_PinStore_Auto, FB_ILS_MTRO_Vario) -Offene Stellen = 302 (Marker 'TODO(E-Planung)') +Templates = 4 von 5 Typen (generisch: FB_ILS_MTRO_2Sep2Swi) +Offene Stellen = 489 (Marker 'TODO(E-Planung)') ``` --- @@ -424,7 +451,7 @@ Each step ends with all tests green and is usable on its own. | 2 ✅ | `scl_context.py`: build the render context from `TroDocument`; `emit_*` read from it — `tests/test_scl_context.py` | golden files byte-identical (also checked on dematic and showroom, with and without `--start`) | | 3 ✅ | Pilot `FB_ILS_MTRO_1Sep1Swi.scl.j2` + `_macros`; switches `--templates`, `--strict`; class-C table (§6) filled with proposals — **still to be confirmed by a PLC engineer**; round-trip test | round trip against TRO107 passes; only the 1Sep1Swi REGIONs (+ header) differ from the generic golden files | | 4 | `scl_naming.py` + `cfg/scl_naming.ini`; switch `--naming` | naming tests pass; Mubea renders with names instead of TODOs where a rule exists | -| 5 | Remaining call-site templates one by one (`1Sep`, `Vario`, `1Sep2Swi`, `1Sep_SSCC`, `Vario_workStation`, `PinStore_Auto`), each with round trip; interface check for the FB-source types | each type moved off the fallback | +| 5 ✅ | Remaining call-site templates (`1Sep`, `Vario`, `1Sep2Swi`, `1Sep_SSCC`, `Vario_workStation`, `PinStore_Auto`), each with round trip against its reference (`PinStore_Auto`: the parts the reference abbreviates are left out of the comparison); decisions in §6 — **still to be confirmed by a PLC engineer**. Interface check (§8.2) for `Vario_workStation` still open | every round trip passes; HundM05 fully from templates, mubea except `2Sep2Swi` | | 6 | Templates on by default; new `--no-templates` keeps the old path for one release | golden files updated and reviewed; one import into TIA Portal (as for Mubea) | | 7 | Remove `emit_*` once every type in use has a template (`2Sep2Swi` needs a call site first) | fallback only for types without FB | @@ -490,3 +517,11 @@ jam-area DBs) until an E-Planung export exists, and the `pruefen` timings. destinations — the per-exit target lists in the skeleton could supply them. 8. `xInCarouselRun1`: how do we know a TRO sits at a carousel? `tro_flow` would need to mark it (e.g. a carousel neighbour per TRO); today the line is always written as TODO. +9. `1Sep2Swi` (TRO267): switch 2 has no `nSwitchNo` and the REGION has no + `FC_Direction` call — omission in the reference, or intended (direction elsewhere)? +10. Meaning of `stInSettings.xIsBorner` (Vario) and `stInSettings.bSepType.%X2` + (`1Sep2Swi`) — always `TRUE`, or depending on the location? +11. `PinStore_Auto` with more than one feed/exit (mubea: 2/2): the FB has one + `JamEntr`/`JamExit` plus `JamBypass` — how are the others connected? +12. `Vario_workStation`: is `xPluggedScanner FALSE` right in general (scanner at the work + station, not at the separator)? diff --git a/lib/scl_context.py b/lib/scl_context.py index 997e1f4..fce9a3e 100644 --- a/lib/scl_context.py +++ b/lib/scl_context.py @@ -39,6 +39,10 @@ __all__ = [ "SclSwitchExit", "SclScanner", "SclJam", + "SclSscc", + "SclWorkStation", + "SclStoreLine", + "SclStore", "SclTro", "SclFile", "build_context", @@ -77,6 +81,8 @@ class SclSeparator(BaseModel): no: SclName sensor: SclName stopper: SclName + # Teilesensor (stSenPart) - nur in Templates, deren Referenz ihn hat (1Sep2Swi) + part_sensor: SclName class SclSwitchExit(BaseModel): @@ -106,12 +112,21 @@ class SclSwitch(BaseModel): class SclScanner(BaseModel): - """Ein stInBarcodeReader-Block ("" als Suffix, wenn es nur einen gibt).""" + """Ein stInBarcodeReader-Block ("" als Suffix, wenn es nur einen gibt). + + Die Cognex-Verdrahtung (nur in den Templates): ``interface`` ist der + Schluessel in #arCognexInterface (z. B. "cScannerBX2100"), ``tag`` der + Praefix der Hardware-Symbole ("bx2100-TriggerReady" ...), ``hw_results`` + das Ergebnis-Symbol der Kamera. + """ model_config = _CONFIG n: int suffix: str + interface: SclName + tag: SclName + hw_results: SclName class SclJam(BaseModel): @@ -125,6 +140,74 @@ class SclJam(BaseModel): db: SclName # Stausensor des Ausgangs (stInSenJam); None an Eingaengen sensor: SclName | None = None + # Traeger-Array und Staudaten des Bereichs - im Normalfall .arCarrier + # bzw. .stData; an Uebergaben auch eigene Variablen (#arCarrierHandover...) + carriers: SclName + data: SclName + + +class SclSscc(BaseModel): + """SSCC-Scanner eines 1Sep_SSCC: zweite Kamera, Endmessung, HMI-Anzeige.""" + + model_config = _CONFIG + + # interface ist hier die Struktur selbst (z. B. "#stCognexIntfTro105") + scanner: SclScanner + end_sensor: SclName + # Schluessel der HMI-Anzeige, z. B. "SSCC1107" + hmi: SclName + + +class SclWorkStation(BaseModel): + """Arbeitsplatz eines Vario_workStation.""" + + model_config = _CONFIG + + station_sensor: SclName + station_release: SclName + loaded_error_sensor: SclName + + +class SclStoreLine(BaseModel): + """Eine Speicherlinie eines PinStore_Auto (arInSep[n]).""" + + model_config = _CONFIG + + n: int + # Separatornummer der Linie aus dem Layout + layout: str + jam_length: SclName + sensor: SclName + jam_sensor: SclName + stopper: SclName + + +class SclStore(BaseModel): + """Alles fuer ein automatisches Pin-Lager (PinStore_Auto).""" + + model_config = _CONFIG + + encoder: SclName + dest: SclName + conv_stations: SclName + stations_max: SclName + threshold: SclName + reference_sensor: SclName + station: SclName + quit_local: SclName + test_target: SclName + run_in: SclName + run_out: SclName + db: SclName + removal: SclName + conv_db: SclName + # Einschleus-Separator (Pin) - aus dem Layout, wenn tro_flow einen + # steuernden Separator vor den Linien gefunden hat, sonst "?" + pin_layout: str + pin_sensor: SclName + pin_stopper: SclName + # Eine Linie je Speicherbahn im Layout (nicht die 19 aus dem Katalog) + lines: list[SclStoreLine] class SclTro(BaseModel): @@ -169,6 +252,22 @@ class SclTro(BaseModel): # nicht in der TRO-JSON - deshalb immer offen (doc/SCL_Templates.md §6). carousel_run: SclName + # -- nur fuer die Templates (Referenz-Aufrufstellen, doc/SCL_Templates.md §6) + # Einziger Staubereich am Ein-/Ausgang fuer FBs ohne Nummerierung + # (Vario: JamEntr/JamFinger, PinStore: JamEntr/JamExit): der erste + # Vorgaenger bzw. Nachfolger, sonst ein offener Platzhalter + jam_in: SclJam + jam_out: SclJam + error_quit: SclName + automatic: SclName + # Vario: stInSettings.xIsBorner (Bedeutung mit SPS klaeren) + is_border: SclName + # Station fuer FC_CARR_GLOB_CORRECTION (1Sep_SSCC, PinStore_Auto) + correction_station: SclName + sscc: SclSscc | None = None + work_station: SclWorkStation | None = None + store: SclStore | None = None + @property def has_scanner(self) -> bool: return bool(self.scanners) @@ -282,6 +381,59 @@ def _nummer(tro_id: str) -> str: # Kontext bauen # --------------------------------------------------------------------------- +def _scanner(n: int, suffix: str, interface: str = "cScanner____") -> SclScanner: + return SclScanner( + n=n, suffix=suffix, interface=_offen(interface), tag=_offen("bx____"), + hw_results=_offen("BX____~Ergebnisse_\u2013_64_Bytes_1"), + ) + + +def _jam(n: int, neighbour: str, jam_db: str, sensor: SclName | None = None) -> SclJam: + return SclJam( + n=n, neighbour=neighbour, db=_offen(jam_db), sensor=sensor, + carriers=_offen(f"{jam_db}.arCarrier"), data=_offen(f"{jam_db}.stData"), + ) + + +def _store(tro: TroBase) -> SclStore: + """PinStore_Auto: eine Linie je Speicherbahn (Host) des Layouts. + + tro_flow legt die Separatoren als [steuernde ..., Linien ...] ab; die + Linien sind die letzten len(hosts). Fehlen Hosts (fremde JSON), zaehlt + jeder Separator als Linie. + """ + hosts = list(getattr(tro, "hosts", []) or []) + seps = list(tro.separators) + anzahl = len(hosts) if 0 < len(hosts) <= len(seps) else len(seps) + steuer, linien = seps[:len(seps) - anzahl], seps[len(seps) - anzahl:] + return SclStore( + encoder=_offen("#fbEncoder____"), + dest=_offen("cDest____"), + conv_stations=_offen("cHooksSorterMaxPin____"), + stations_max=_offen("cStationsMax____"), + threshold=_offen("cNoPositionsBlock____"), + reference_sensor=_offen("cInBG____"), + station=_offen("____"), + quit_local=_offen('"SF____"'), + test_target=_offen('"IBN".nTestTarget____'), + run_in=_offen("#fbSortConv____.xOutConveyorFullSpeed"), + run_out=_offen("#fbExitConv____.xOutConveyorFullSpeed"), + db=_offen('"DB_Storage____"'), + removal=_offen('"DB_HandshakeStorage".Str_StorageRemoval.' + 'arrudt_StorageRemovalHandshakeTROsLvl1[____]'), + conv_db=_offen('"DB_ConveyorStations".stConveyorStations____'), + pin_layout=", ".join(steuer) or "?", + pin_sensor=_offen("cInBG____"), + pin_stopper=_offen("MB____"), + lines=[ + SclStoreLine(n=n, layout=sep, jam_length=_offen('"cStorage____ExitJam"'), + sensor=_offen("cInBG____"), jam_sensor=_offen("cInBG____"), + stopper=_offen("MB____")) + for n, sep in enumerate(linien, start=1) + ], + ) + + def _tro_context(tro: TroBase, alle: dict[str, TroBase]) -> SclTro: items = tro.items n_sep = items.get(TroItem.SEPARATOR, 1) @@ -297,6 +449,7 @@ def _tro_context(tro: TroBase, alle: dict[str, TroBase]) -> SclTro: no=_offen("cSep_____"), sensor=_offen("cInBG____"), stopper=_offen("MB____"), + part_sensor=_offen("cInBG____"), ) for i in range(1, n_sep + 1) ] @@ -322,6 +475,17 @@ def _tro_context(tro: TroBase, alle: dict[str, TroBase]) -> SclTro: SclSwitchExit(via=abgang, targets=reachable_via(tro_id, abgang, alle)) for abgang in tro.successors ] if n_swi else [] + # Staubereiche: je ankommender/abgehender Verbindung einer. Welche + # DB-Struktur dahintersteht, ist eine Planungsentscheidung - hier steht + # nur, WIE VIELE es sein muessen und zu welchem Nachbarn sie gehoeren. + jam_entries = [ + _jam(n, _nachbar(vor, alle), jam_db) + for n, vor in enumerate(tro.predecessors, start=1) + ] + jam_exits = [ + _jam(n, _nachbar(nach, alle), jam_db, sensor=_offen("cInBG____")) + for n, nach in enumerate(tro.successors, start=2) + ] return SclTro( id=tro_id, @@ -340,22 +504,12 @@ def _tro_context(tro: TroBase, alle: dict[str, TroBase]) -> SclTro: has_vario=has_vario, vario_sensors=vario_sensors, scanners=[ - SclScanner(n=i, suffix="" if n_scan == 1 else str(i)) + _scanner(i, "" if n_scan == 1 else str(i)) for i in range(1, n_scan + 1) ], storage_lines=items.get(TroItem.STORAGE_LINE, 0), - # Staubereiche: je ankommender/abgehender Verbindung einer. Welche - # DB-Struktur dahintersteht, ist eine Planungsentscheidung - hier steht - # nur, WIE VIELE es sein muessen und zu welchem Nachbarn sie gehoeren. - jam_entries=[ - SclJam(n=n, neighbour=_nachbar(vor, alle), db=_offen(jam_db)) - for n, vor in enumerate(tro.predecessors, start=1) - ], - jam_exits=[ - SclJam(n=n, neighbour=_nachbar(nach, alle), db=_offen(jam_db), - sensor=_offen("cInBG____")) - for n, nach in enumerate(tro.successors, start=2) - ], + jam_entries=jam_entries, + jam_exits=jam_exits, main_tro=_offen("cMainTro____"), safety=_offen('"DB_InterfaceSafety".stFromSafety.EStopMain.Q'), release=f'"DB_TRO_TEST".{tro_id}', @@ -367,6 +521,22 @@ def _tro_context(tro: TroBase, alle: dict[str, TroBase]) -> SclTro: # Vorschlag aus der Referenz TRO107, Prioritaet bleibt Planungsentscheidung prio_dir2=_offen("TRUE"), carousel_run=_offen("#fbCarousel____.xOutConveyorFullSpeed"), + # dasselbe Objekt wie der erste Ein-/Ausgang: ein Name, den die + # Namensregeln dort setzen, gilt damit auch hier + jam_in=jam_entries[0] if jam_entries else _jam(1, "-", jam_db), + jam_out=jam_exits[0] if jam_exits else _jam(2, "-", jam_db), + error_quit=_offen('"SF____"'), + automatic=_offen("#t_automatik"), + is_border=_offen("TRUE"), + correction_station=_offen("0"), + sscc=(SclSscc(scanner=_scanner(1, "SSCC", "#stCognexIntf____"), + end_sensor=_offen("cInBG____"), hmi=_offen("SSCC____")) + if items.get(TroItem.SSCC) else None), + work_station=(SclWorkStation(station_sensor=_offen("cInBG____"), + station_release=_offen('#"rTrig_Workstation ____".CLK'), + loaded_error_sensor=_offen("cInBG____")) + if items.get(TroItem.WORK_STATION) else None), + store=_store(tro) if items.get(TroItem.STORAGE_LINE) else None, ) diff --git a/lib/scl_templates/FB_ILS_MTRO_1Sep.scl.j2 b/lib/scl_templates/FB_ILS_MTRO_1Sep.scl.j2 new file mode 100644 index 0000000..414b243 --- /dev/null +++ b/lib/scl_templates/FB_ILS_MTRO_1Sep.scl.j2 @@ -0,0 +1,66 @@ +{#- + FB_ILS_MTRO_1Sep - Aufrufstelle in FB_Main + + Referenz: doc/TRO_Katalog/scl_templates/FB_ILS_MTRO_1Sep.scl + (TRO 100, =A01+UH01-KF00 FB_Main). Zeilen und Reihenfolge folgen + dieser Aufrufstelle; geprueft per tests/test_scl_templates.py. + + Entscheidungen zu den ortsgebundenen Zeilen (doc/SCL_Templates.md §6): + Separatorzeiten 600/200 ms wie Referenz, "pruefen" + tSenFree/tSenWait 1500/4000 ms wie Referenz, "pruefen" + stInSenJam je Ausgang einer, Sensor offen + xReleaseOk TRUE wie Referenz (braucht keine Vorfahrtsregelung) + xInCarouselRun immer, offen - ob der TRO am Kreisel liegt, steht + nicht in der TRO-JSON; sonst Zeile loeschen + xInRelease "DB_TRO_TEST". wie Referenz + stInOutMachineState Schaltschrank offen (anlagenspezifisch) + Alle noch mit den SPS-Kollegen zu bestaetigen. +-#} +{% import "_macros.scl.j2" as m %} +REGION {{ t.region_title }} +{{ m.kopf(t) }} + +{% for s in t.separators %} + // Separator {{ s.n }} = Bauteil {{ s.layout }} aus dem Layout + #{{ t.id }}.stInSeparator{{ s.n }}.Settings.nSeparatorNo := "{{ s.no.value }}";{{ m.todo(s.no) }} + #{{ t.id }}.stInSeparator{{ s.n }}.Settings.tDelayToNextItem := "TimeForSepWaiting_Short"; + #{{ t.id }}.stInSeparator{{ s.n }}.Settings.tTrailingTime := t#600ms; // {{ TODO }}: pruefen + #{{ t.id }}.stInSeparator{{ s.n }}.Settings.tHandlingTime := t#200ms; // {{ TODO }}: pruefen + #{{ t.id }}.stInSeparator{{ s.n }}.Settings.tJam := "TimeForSepJam"; + #{{ t.id }}.stInSeparator{{ s.n }}.Settings.xPluggedJam := TRUE; + #{{ t.id }}.stInSeparator{{ s.n }}.Settings.xPluggedPart := FALSE; + #{{ t.id }}.stInSeparator{{ s.n }}.Settings.xPluggedScanner := {{ "TRUE" if t.has_scanner else "FALSE" }}; + #{{ t.id }}.stInSeparator{{ s.n }}.stSenInSep := "DB_Inputs".Sensors["{{ s.sensor.value }}"];{{ m.todo(s.sensor) }} +{% endfor %} +{{ m.jam_sensors(t) }} + +{% for s in t.separators %} + #{{ t.id }}.stInSeparator{{ s.n }}.Settings.tSenFree := T#1500ms; // {{ TODO }}: pruefen + #{{ t.id }}.stInSeparator{{ s.n }}.Settings.tSenWait := T#4000ms; // {{ TODO }}: pruefen +{% endfor %} + + #{{ t.id }}.stInPriorityManager.xReleaseOk := TRUE; // braucht keine Vorfahrtsregelung + +{% set z = [] %} +{% set _ = z.append(('nInMainTroNo := "' ~ t.main_tro.value ~ '"', m.note(t.main_tro))) %} +{% set _ = z.append(("xInSftyOk := " ~ t.safety.value, m.note(t.safety))) %} +{% set _ = z.append(("xInAllRdyToStart := TRUE", "")) %} +{% set _ = z.append(("xInCarouselRun := " ~ t.carousel_run.value, m.note(t.carousel_run, "nur am Kreisel, sonst Zeile loeschen"))) %} +{% set _ = z.append(("xInRelease := " ~ t.release, "")) %} +{% set _ = z.append(("stInOutMachineState := " ~ t.machine_state.value, m.note(t.machine_state, "Schaltschrank"))) %} +{% set _ = z.append(("stInOutCognexInterface := #stCognexInterfaceDummy", "")) %} +{% for j in t.jam_entries %} +{% set _ = z.append(("arInOutJamEntr" ~ j.n ~ " := " ~ j.carriers.value, m.note(j.carriers, "Staubereich von " ~ j.neighbour))) %} +{% set _ = z.append(("stInOutJamEntr" ~ j.n ~ " := " ~ j.data.value, m.note(j.data))) %} +{% endfor %} +{% for j in t.jam_exits %} +{% set _ = z.append(("arInOutJamExit" ~ j.n ~ " := " ~ j.carriers.value, m.note(j.carriers, "Staubereich nach " ~ j.neighbour))) %} +{% set _ = z.append(("stInOutJamExit" ~ j.n ~ " := " ~ j.data.value, m.note(j.data))) %} +{% endfor %} +{% for s in t.separators %} +{% set _ = z.append(("xOutStopper" ~ s.n ~ ' => "' ~ s.stopper.value ~ '"', m.note(s.stopper))) %} +{% endfor %} +{% set _ = z.append(('nOutStateLast => "DB_GLOB_TroState".arTroState["' ~ t.main_tro.value ~ '"]', m.note(t.main_tro))) %} +{% set _ = z.append(('stInOutHMI := "DB_Interface_HMI".stTRO.' ~ t.id, "")) %} +{{ m.call(t, z) }} +END_REGION diff --git a/lib/scl_templates/FB_ILS_MTRO_1Sep2Swi.scl.j2 b/lib/scl_templates/FB_ILS_MTRO_1Sep2Swi.scl.j2 new file mode 100644 index 0000000..9dbb99a --- /dev/null +++ b/lib/scl_templates/FB_ILS_MTRO_1Sep2Swi.scl.j2 @@ -0,0 +1,105 @@ +{#- + FB_ILS_MTRO_1Sep2Swi - Aufrufstelle in FB_Main + + Referenz: doc/TRO_Katalog/scl_templates/FB_ILS_MTRO_1Sep2Swi.scl + (TRO 267 mit Scanner BX2100). Zeilen und Reihenfolge folgen dieser + Aufrufstelle; geprueft per tests/test_scl_templates.py. + + Entscheidungen zu den ortsgebundenen Zeilen (doc/SCL_Templates.md §6): + Separator tDelayToNextItem "_Medium", xPluggedPart TRUE und + stSenPart wie Referenz; keine Separatorzeiten + (stehen in der Referenz nicht) + stInSenJam je Ausgang einer, Sensor offen + nSwitchNo nur Weiche 1 wie Referenz; fuer Weiche 2 fehlt die + Zeile in der Referenz - als Kommentar vorgeschlagen + xNewSwitch TRUE wie Referenz + nTo1Destinations Aufteilung der Abgaenge auf die Weichen offen + tTimeout Scanner 5 s wie Referenz + stInSettings.bSepType.%X2 TRUE wie Referenz, Bedeutung klaeren ("pruefen") + xInCarouselRun je Weiche einer, offen (Kreisel steht nicht in der JSON) + nOutStateLast fehlt in der Referenz - nicht geschrieben + FC_Direction steht in der Referenz nicht an dieser Stelle - + nur die Zielliste als Kommentar + Alle noch mit den SPS-Kollegen zu bestaetigen. +-#} +{% import "_macros.scl.j2" as m %} +REGION {{ t.region_title }} +{{ m.kopf(t) }} + +{% for s in t.separators %} + // Separator {{ s.n }} = Bauteil {{ s.layout }} aus dem Layout + #{{ t.id }}.stInSeparator{{ s.n }}.Settings.nSeparatorNo := "{{ s.no.value }}";{{ m.todo(s.no) }} + #{{ t.id }}.stInSeparator{{ s.n }}.Settings.tDelayToNextItem := "TimeForSepWaiting_Medium"; + #{{ t.id }}.stInSeparator{{ s.n }}.Settings.xPluggedJam := TRUE; + #{{ t.id }}.stInSeparator{{ s.n }}.Settings.xPluggedPart := TRUE; + #{{ t.id }}.stInSeparator{{ s.n }}.Settings.xPluggedScanner := {{ "TRUE" if t.has_scanner else "FALSE" }}; + #{{ t.id }}.stInSeparator{{ s.n }}.stSenInSep := "DB_Inputs".Sensors["{{ s.sensor.value }}"];{{ m.todo(s.sensor) }} + #{{ t.id }}.stInSeparator{{ s.n }}.stSenPart := "DB_Inputs".Sensors["{{ s.part_sensor.value }}"];{{ m.todo(s.part_sensor) }} +{% endfor %} +{{ m.jam_sensors(t) }} + +{% for w in t.switches %} +{% if loop.first %} + #{{ t.id }}.stInSwitch{{ w.n }}.Settings.nSwitchNo := "{{ w.no.value }}";{{ m.todo(w.no) }} +{% else %} + // #{{ t.id }}.stInSwitch{{ w.n }}.Settings.nSwitchNo := "{{ w.no.value }}"; // {{ TODO }}: pruefen - fehlt in der Referenz TRO267 +{% endif %} + #{{ t.id }}.stInSwitch{{ w.n }}.Settings.xPluggedExSen3 := FALSE; + #{{ t.id }}.stInSwitch{{ w.n }}.Settings.xPluggedExSen4 := FALSE; + #{{ t.id }}.stInSwitch{{ w.n }}.Settings.xNewSwitch := TRUE; +{% if w.to1_destinations is not none %} + #{{ t.id }}.stInSwitch{{ w.n }}.Settings.nTo1Destinations := {{ w.to1_destinations }}; // Info noetig fuer HMI - {{ TODO }}: pruefen +{% else %} + #{{ t.id }}.stInSwitch{{ w.n }}.Settings.nTo1Destinations := _; // {{ TODO }}: {{ t.successors|length }} Abgaenge auf {{ t.switches|length }} Weichen - Aufteilung festlegen +{% endif %} + +{% endfor %} +{{ m.ziele(t) }} + +{% for sc in t.scanners %} + #{{ t.id }}.stInBarcodeReader{{ sc.suffix }}.Settings.xActivateCheckASCI := TRUE; + #{{ t.id }}.stInBarcodeReader{{ sc.suffix }}.Settings.tTimeout := T#5s; + +{{ m.cognex_in(m.cognex(sc), sc) }} + +{% endfor %} + #{{ t.id }}.stInPriorityManager.xReleaseOk := TRUE; // braucht keine Vorfahrtsregelung + + #{{ t.id }}.stInSettings.bSepType.%X2 := TRUE; // {{ TODO }}: pruefen (Bedeutung) + +{% set z = [] %} +{% set _ = z.append(('nInMainTroNo := "' ~ t.main_tro.value ~ '"', m.note(t.main_tro))) %} +{% set _ = z.append(("xInSftyOk := " ~ t.safety.value, m.note(t.safety))) %} +{% set _ = z.append(("xInAllRdyToStart := TRUE", "")) %} +{% set _ = z.append(('xInCancel := "cTodoFalse"', "")) %} +{% set _ = z.append(("xInRelease := " ~ t.release, "")) %} +{% for w in t.switches %} +{% set _ = z.append(("xInCarouselRun" ~ w.n ~ " := " ~ t.carousel_run.value, m.note(t.carousel_run, "nur am Kreisel, sonst Zeile loeschen"))) %} +{% endfor %} +{% set _ = z.append(("stInOutMachineState := " ~ t.machine_state.value, m.note(t.machine_state, "Schaltschrank"))) %} +{% if t.scanners %} +{% set _ = z.append(("stInOutCognexInterface := " ~ m.cognex(t.scanners[0]), m.note(t.scanners[0].interface))) %} +{% else %} +{% set _ = z.append(("stInOutCognexInterface := #stCognexInterfaceDummy", "")) %} +{% endif %} +{% for j in t.jam_entries %} +{% set _ = z.append(("arInOutJamEntr" ~ j.n ~ " := " ~ j.carriers.value, m.note(j.carriers, "Staubereich von " ~ j.neighbour))) %} +{% set _ = z.append(("stInOutJamEntr" ~ j.n ~ " := " ~ j.data.value, m.note(j.data))) %} +{% endfor %} +{% for j in t.jam_exits %} +{% set _ = z.append(("arInOutJamExit" ~ j.n ~ " := " ~ j.carriers.value, m.note(j.carriers, "Staubereich nach " ~ j.neighbour))) %} +{% set _ = z.append(("stInOutJamExit" ~ j.n ~ " := " ~ j.data.value, m.note(j.data))) %} +{% endfor %} +{% for s in t.separators %} +{% set _ = z.append(("xOutStopper" ~ s.n ~ ' => "' ~ s.stopper.value ~ '"', m.note(s.stopper))) %} +{% endfor %} +{% for w in t.switches %} +{% set _ = z.append(("xOutSw" ~ w.n ~ 'ExTo3 => "' ~ w.valve.value ~ '"', m.note(w.valve))) %} +{% endfor %} +{% set _ = z.append(('stInOutHMI := "DB_Interface_HMI".stTRO.' ~ t.id, "")) %} +{{ m.call(t, z) }} + +{% for sc in t.scanners %} +{{ m.cognex_out(m.cognex(sc), sc) }} +{% endfor %} +END_REGION diff --git a/lib/scl_templates/FB_ILS_MTRO_1Sep_SSCC.scl.j2 b/lib/scl_templates/FB_ILS_MTRO_1Sep_SSCC.scl.j2 new file mode 100644 index 0000000..53b2bc8 --- /dev/null +++ b/lib/scl_templates/FB_ILS_MTRO_1Sep_SSCC.scl.j2 @@ -0,0 +1,112 @@ +{#- + FB_ILS_MTRO_1Sep_SSCC - Aufrufstelle in FB_Main + + Referenz: doc/TRO_Katalog/scl_templates/FB_ILS_MTRO_1Sep_SSCC.scl + (TRO 105, =A01+UH01-KF00 FB_Main, Scanner BX1104 + SSCC-Scanner + BX1107). Zeilen und Reihenfolge folgen dieser Aufrufstelle; + geprueft per tests/test_scl_templates.py. + + Entscheidungen zu den ortsgebundenen Zeilen (doc/SCL_Templates.md §6): + Separatorzeiten 600/200 ms, xPluggedConfirm/NullBT FALSE wie Referenz, "pruefen" + tSenFree/tSenWait 1500/4000 ms wie Referenz, "pruefen" + Scanner/SSCC-Scanner Cognex-Verdrahtung mit offenen Symbolen (E) + stSenEndMeasurement Sensor offen (Referenz: derselbe wie stInSenJam2) + xInCarouselRun offen (Referenz: TRUE "Gefaelle") + xInRelease "DB_TRO_TEST". - in der Referenz haengt die + Freigabe an der WCS-Verbindung (Kommentar, offen) + Carr_Glob_Correction nInStation offen (Referenz 0), Traeger vom Eingang + SSCC an HMI Schluessel der HMI-Anzeige offen (Referenz SSCC1107) + WCS-Telegramm in der Referenz nur angedeutet - als TODO vermerkt + Alle noch mit den SPS-Kollegen zu bestaetigen. +-#} +{% import "_macros.scl.j2" as m %} +{% set ss = t.sscc %} +REGION {{ t.region_title }} +{{ m.kopf(t) }} + +{% for s in t.separators %} + // Separator {{ s.n }} = Bauteil {{ s.layout }} aus dem Layout + #{{ t.id }}.stInSeparator{{ s.n }}.Settings.nSeparatorNo := "{{ s.no.value }}";{{ m.todo(s.no) }} + #{{ t.id }}.stInSeparator{{ s.n }}.Settings.tDelayToNextItem := "TimeForSepWaiting_Short"; + #{{ t.id }}.stInSeparator{{ s.n }}.Settings.tTrailingTime := t#600ms; // {{ TODO }}: pruefen + #{{ t.id }}.stInSeparator{{ s.n }}.Settings.tHandlingTime := t#200ms; // {{ TODO }}: pruefen + #{{ t.id }}.stInSeparator{{ s.n }}.Settings.tJam := "TimeForSepJam"; + #{{ t.id }}.stInSeparator{{ s.n }}.Settings.xPluggedConfirm := FALSE; + #{{ t.id }}.stInSeparator{{ s.n }}.Settings.xPluggedNullBT := FALSE; + #{{ t.id }}.stInSeparator{{ s.n }}.Settings.xPluggedJam := TRUE; + #{{ t.id }}.stInSeparator{{ s.n }}.Settings.xPluggedPart := FALSE; + #{{ t.id }}.stInSeparator{{ s.n }}.Settings.xPluggedScanner := {{ "TRUE" if t.has_scanner else "FALSE" }}; + #{{ t.id }}.stInSeparator{{ s.n }}.stSenInSep := "DB_Inputs".Sensors["{{ s.sensor.value }}"];{{ m.todo(s.sensor) }} +{% endfor %} +{{ m.jam_sensors(t) }} + +{% for s in t.separators %} + #{{ t.id }}.stInSeparator{{ s.n }}.Settings.tSenFree := T#1500ms; // {{ TODO }}: pruefen + #{{ t.id }}.stInSeparator{{ s.n }}.Settings.tSenWait := T#4000ms; // {{ TODO }}: pruefen +{% endfor %} + +{% for sc in t.scanners %} + #{{ t.id }}.stInBarcodeReader{{ sc.suffix }}.Settings.xActivateCheckASCI := TRUE; + #{{ t.id }}.stInBarcodeReader{{ sc.suffix }}.Settings.tTimeout := T#3000ms; + +{{ m.cognex_in(m.cognex(sc), sc) }} + +{% endfor %} + //SSCC +{{ m.cognex_in(ss.scanner.interface.value, ss.scanner) }} + + #{{ t.id }}.stInBarcodeReaderSSCC.Settings.xActivateCheckASCI := TRUE; + #{{ t.id }}.stInBarcodeReaderSSCC.Settings.tTimeout := T#3s; + #{{ t.id }}.stInBarcodeReaderSSCC.xInPluggedSSCC := TRUE; + #{{ t.id }}.stInBarcodeReaderSSCC.stSenEndMeasurement := "DB_Inputs".Sensors["{{ ss.end_sensor.value }}"];{{ m.todo(ss.end_sensor) }} + + #{{ t.id }}.stInPriorityManager.xReleaseOk := TRUE; // braucht keine Vorfahrtsregelung + +{% set z = [] %} +{% set _ = z.append(('nInMainTroNo := "' ~ t.main_tro.value ~ '"', m.note(t.main_tro))) %} +{% set _ = z.append(("xInSftyOk := " ~ t.safety.value, m.note(t.safety))) %} +{% set _ = z.append(("xInAllRdyToStart := TRUE", "")) %} +{% set _ = z.append(('xInCancel := "cTodoFalse"', "")) %} +{% set _ = z.append(("xInCarouselRun := " ~ t.carousel_run.value, m.note(t.carousel_run, "am Kreisel dessen Freigabe, im Gefaelle TRUE"))) %} +{% set _ = z.append(("xInRelease := " ~ t.release, TODO ~ " - Referenz: Freigabe ueber die WCS-Verbindung")) %} +{% set _ = z.append(("stInOutMachineState := " ~ t.machine_state.value, m.note(t.machine_state, "Schaltschrank"))) %} +{% if t.scanners %} +{% set _ = z.append(("stInOutCognexInterface := " ~ m.cognex(t.scanners[0]), m.note(t.scanners[0].interface))) %} +{% else %} +{% set _ = z.append(("stInOutCognexInterface := #stCognexInterfaceDummy", "")) %} +{% endif %} +{% set _ = z.append(("stInOutCognexInterfaceSSCC := " ~ ss.scanner.interface.value, m.note(ss.scanner.interface))) %} +{% for j in t.jam_entries %} +{% set _ = z.append(("arInOutJamEntr" ~ j.n ~ " := " ~ j.carriers.value, m.note(j.carriers, "Staubereich von " ~ j.neighbour))) %} +{% set _ = z.append(("stInOutJamEntr" ~ j.n ~ " := " ~ j.data.value, m.note(j.data))) %} +{% endfor %} +{% for j in t.jam_exits %} +{% set _ = z.append(("arInOutJamExit" ~ j.n ~ " := " ~ j.carriers.value, m.note(j.carriers, "Staubereich nach " ~ j.neighbour))) %} +{% set _ = z.append(("stInOutJamExit" ~ j.n ~ " := " ~ j.data.value, m.note(j.data))) %} +{% endfor %} +{% set _ = z.append(('stInOutHMI := "DB_Interface_HMI".stTRO.' ~ t.id, "")) %} +{% set _ = z.append(('nOutStateLast => "DB_GLOB_TroState".arTroState["' ~ t.main_tro.value ~ '"]', m.note(t.main_tro))) %} +{% for s in t.separators %} +{% set _ = z.append(("xOutStopper" ~ s.n ~ ' => "' ~ s.stopper.value ~ '"', m.note(s.stopper))) %} +{% endfor %} +{{ m.call(t, z) }} + +{% for sc in t.scanners %} +{{ m.cognex_out(m.cognex(sc), sc) }} + +{% endfor %} + //SSCC +{{ m.cognex_out(ss.scanner.interface.value, ss.scanner) }} + +{{ m.correction(t, "Carr_Glob_Correction") }} + + REGION Write SSCC result TO HMI Interface + IF #{{ t.id }}.xOutNewScanSSCC THEN + "DB_Interface_HMI".stSSCC.{{ ss.hmi.value }}.stLastMeasurement.nBarcodeTrolley := {{ t.jam_in.carriers.value }}[1].nBarcode;{{ m.todo(ss.hmi) }} + "DB_Interface_HMI".stSSCC.{{ ss.hmi.value }}.stLastMeasurement.sSSCC := LINT_TO_STRING(#{{ t.id }}.nOutScanResultSSCC);{{ m.todo(ss.hmi) }} + END_IF; + END_REGION + + // {{ TODO }}: WCS-Telegramm (SSCC) - in der Referenz eigene REGION + // "Send DReqM to Fortna WCS (SSCC)", siehe Json_Layout-Konzept.md Abschnitt 4 +END_REGION diff --git a/lib/scl_templates/FB_ILS_MTRO_PinStore_Auto.scl.j2 b/lib/scl_templates/FB_ILS_MTRO_PinStore_Auto.scl.j2 new file mode 100644 index 0000000..e29b4e4 --- /dev/null +++ b/lib/scl_templates/FB_ILS_MTRO_PinStore_Auto.scl.j2 @@ -0,0 +1,132 @@ +{#- + FB_ILS_MTRO_PinStore_Auto - Aufrufstelle in FB_Main + + Referenz: doc/TRO_Katalog/scl_templates/FB_ILS_MTRO_PinStore_Auto.scl + (BLOCK 1.1.1 / TRO 208, =A01+UH02-KF00 FB_Main, Scanner BX2104). + Die Referenz schreibt nur 3 der 19 Linien aus; der Rest folgt + demselben Schema. Geprueft per tests/test_scl_templates.py. + + Entscheidungen zu den ortsgebundenen Zeilen (doc/SCL_Templates.md §6): + Anzahl Linien aus dem Layout: eine je Speicherbahn (nNoOfLines), + nicht die 19 der Referenz + Encoder, Stationen, + Ziele, Schwellen offen (anlagenspezifische Konstanten) + Sep Pin Einschleus-Separator; Zeiten 0/50 ms wie Referenz, "pruefen" + Sep Store n nJamLength offen (Referenz: 4 bzw. "cStorage111ExitJam"), + Zeiten ueber die Konstanten cTimeSep...StorageLine + arInSep[7..19].stSimu Simulationsmodus der Referenz - nicht geschrieben + JamEntr/JamExit je einer: erster Vorgaenger/Nachfolger. Hat das + Lager mehr Zu-/Ablaeufe, steht ein TODO im Kopf. + JamBypass Platzhalter wie Referenz + Carr_Glob_Correction nInStation offen (Referenz 1), Traeger vom Eingang + Alle noch mit den SPS-Kollegen zu bestaetigen. +-#} +{% import "_macros.scl.j2" as m %} +{% set st = t.store %} +{% set sc = t.scanners[0] %} +{#- Kameraname im REGION-Titel nur, wenn bekannt (kein TODO-Kommentar im Titel) -#} +{% set kamera = "" if sc.tag.todo else " (" ~ (sc.tag.value|upper) ~ ")" %} +REGION {{ t.region_title }} +{{ m.kopf(t) }} +{% if t.predecessors|length > 1 or t.successors|length > 1 %} + // {{ TODO }}: {{ t.predecessors|length }} Zulaeufe / {{ t.successors|length }} Ablaeufe im Layout - + // der FB hat je nur einen Staubereich (JamEntr/JamExit, dazu JamBypass) +{% endif %} + // Linien (Separatoren aus dem Layout): {{ st.lines|map(attribute="layout")|join(", ") or "-" }} + + REGION Encoder Settings + #{{ t.id }}.stInEncoderParameter.nPosActDif := {{ st.encoder.value }}.nOutPosActDif;{{ m.todo(st.encoder) }} + #{{ t.id }}.stInEncoderParameter.nPosPitchPart := {{ st.encoder.value }}.nOutPosPitchPart;{{ m.todo(st.encoder) }} + END_REGION + + REGION ConveyorStation Settings + #{{ t.id }}.stInSettings.nDestGeneral := "{{ st.dest.value }}";{{ m.todo(st.dest) }} + #{{ t.id }}.stInSettings.nConvStations := "{{ st.conv_stations.value }}";{{ m.todo(st.conv_stations) }} + #{{ t.id }}.stInSettings.nStationsMax := "{{ st.stations_max.value }}";{{ m.todo(st.stations_max) }} + #{{ t.id }}.stInSettings.nStorageThreshold := "{{ st.threshold.value }}";{{ m.todo(st.threshold) }} + #{{ t.id }}.stInSettings.nNoOfLines := {{ st.lines|length }}; + END_REGION + + REGION Pin Query / "Zappler" + #{{ t.id }}.stInSensorReference := "DB_Inputs".Sensors["{{ st.reference_sensor.value }}"];{{ m.todo(st.reference_sensor) }} + END_REGION + + REGION Barcode Reader In{{ kamera }} + #{{ t.id }}.stInBarcodeReader.Settings.nStation := {{ st.station.value }};{{ m.todo(st.station) }} + #{{ t.id }}.stInBarcodeReader.Settings.nScannerPurpose := 0; + #{{ t.id }}.stInBarcodeReader.Settings.tTimeout := T#5s; + #{{ t.id }}.stInBarcodeReader.Settings.xActivateCheckASCI := TRUE; + +{{ m.cognex_in(m.cognex(sc), sc, " ") }} + END_REGION + + REGION Separator Settings + REGION Sep Pin + // Einschleus-Separator = Bauteil {{ st.pin_layout }} aus dem Layout + #{{ t.id }}.stInSeparatorPin.stSenTrolley := "DB_Inputs".Sensors["{{ st.pin_sensor.value }}"];{{ m.todo(st.pin_sensor) }} + #{{ t.id }}.stInSeparatorPin.stSettings.tHandlingTime := T#0ms; // {{ TODO }}: pruefen + #{{ t.id }}.stInSeparatorPin.stSettings.tTrailingTime := T#50ms; // {{ TODO }}: pruefen + #{{ t.id }}.stInSeparatorPin.stSettings.xPluggedScanner := TRUE; + END_REGION +{% for l in st.lines %} + + REGION Sep Store {{ l.n }} + // Linie {{ l.n }} = Separator {{ l.layout }} aus dem Layout + #nActNo := {{ l.n }}; + #{{ t.id }}.arInSep[#nActNo].stSettings.nJamLength := {{ l.jam_length.value }};{{ m.todo(l.jam_length) }} + #{{ t.id }}.arInSep[#nActNo].stSenTrolley := "DB_Inputs".Sensors["{{ l.sensor.value }}"];{{ m.todo(l.sensor) }} + #{{ t.id }}.arInSep[#nActNo].stSettings.tHandlingTime := "cTimeSepHandlingStorageLine"; + #{{ t.id }}.arInSep[#nActNo].stSettings.tTrailingTime := "cTimeSepTrailingStorageLine"; + #{{ t.id }}.arInSep[#nActNo].stSettings.xPluggedScanner := FALSE; + END_REGION +{% endfor %} + END_REGION + + REGION UnloadingStations Settings + #{{ t.id }}.xInQuitLocal := {{ st.quit_local.value }};{{ m.todo(st.quit_local) }} + +{% for l in st.lines %} + #{{ t.id }}.arInJamSensor[{{ l.n }}] := "DB_Inputs".Sensors["{{ l.jam_sensor.value }}"];{{ m.todo(l.jam_sensor) }} +{% endfor %} + END_REGION + + REGION Aufruf: {{ t.id }} + #{{ t.id }}.stInPriorityManager.xReleaseOk := TRUE; + +{% set z = [] %} +{% set _ = z.append(("xInSftyOk := " ~ t.safety.value, m.note(t.safety))) %} +{% set _ = z.append(("nInTestTarget := " ~ st.test_target.value, m.note(st.test_target))) %} +{% set _ = z.append(("xInAllRdyToStart := TRUE", "")) %} +{% set _ = z.append(('xInCancel := "cTodoFalse"', "")) %} +{% set _ = z.append(("xInRelease := " ~ t.release, "")) %} +{% set _ = z.append(("xInConveyorRunIn := " ~ st.run_in.value, m.note(st.run_in, "Foerderer am Zulauf"))) %} +{% set _ = z.append(("xInConveyorRunOut := " ~ st.run_out.value, m.note(st.run_out, "Foerderer am Ablauf"))) %} +{% set _ = z.append(("stInOutControlUnitCabinet := " ~ t.machine_state.value, m.note(t.machine_state, "Schaltschrank"))) %} +{% set _ = z.append(("arInOutStorageLines := " ~ st.db.value ~ ".arLine", m.note(st.db))) %} +{% set _ = z.append(("arInOutJamEntr := " ~ t.jam_in.carriers.value, m.note(t.jam_in.carriers, "Staubereich von " ~ t.jam_in.neighbour))) %} +{% set _ = z.append(("stInOutJamEntr := " ~ t.jam_in.data.value, m.note(t.jam_in.data))) %} +{% set _ = z.append(("arInOutJamExit := " ~ t.jam_out.carriers.value, m.note(t.jam_out.carriers, "Staubereich nach " ~ t.jam_out.neighbour))) %} +{% set _ = z.append(("stInOutJamExit := " ~ t.jam_out.data.value, m.note(t.jam_out.data))) %} +{% set _ = z.append(("arInOutJamBypass := #arCarrierPlaceHolder", "")) %} +{% set _ = z.append(("stInOutJamBypass := #stJamDataPlaceHolder", "")) %} +{% set _ = z.append(('stInOutHMI := "DB_Interface_HMI".stTRO.' ~ t.id, "")) %} +{% set _ = z.append(("stMFRStorageRemovalInterface := " ~ st.removal.value, m.note(st.removal))) %} +{% set _ = z.append(('xOutSeparatorPin => "' ~ st.pin_stopper.value ~ '"', m.note(st.pin_stopper))) %} +{% set _ = z.append(("stCognexInterfacePin := " ~ m.cognex(sc), m.note(sc.interface))) %} +{% set _ = z.append(("stConveyorStations := " ~ st.conv_db.value, m.note(st.conv_db))) %} +{{ m.call(t, z) }} + END_REGION + +{{ m.correction(t, "CARR_GLOB_CORRECTION") }} + + REGION Barcode Reader Out{{ kamera }} +{{ m.cognex_out(m.cognex(sc), sc, " ") }} + END_REGION + + REGION Separator Store Out +{% for l in st.lines %} + "{{ l.stopper.value }}" := #{{ t.id }}.arOutSeparatorStore[{{ l.n }}];{{ m.todo(l.stopper) }} +{% endfor %} + END_REGION + // stMFRStorageRemovalInterface koppelt an FB_StockRemovalBLKModul / FB_StorageManagement +END_REGION diff --git a/lib/scl_templates/FB_ILS_MTRO_Vario.scl.j2 b/lib/scl_templates/FB_ILS_MTRO_Vario.scl.j2 new file mode 100644 index 0000000..21f5ce2 --- /dev/null +++ b/lib/scl_templates/FB_ILS_MTRO_Vario.scl.j2 @@ -0,0 +1,83 @@ +{#- + FB_ILS_MTRO_Vario - Aufrufstelle in FB_Main + + Referenz: doc/TRO_Katalog/scl_templates/FB_ILS_MTRO_Vario.scl + (TRO 115). Zeilen und Reihenfolge folgen dieser Aufrufstelle; + geprueft per tests/test_scl_templates.py. + + Entscheidungen zu den ortsgebundenen Zeilen (doc/SCL_Templates.md §6): + Separatorzeiten 800/300 ms, xPluggedJam FALSE wie Referenz, "pruefen" + tSenFree/tSenWait 2000/5000 ms wie Referenz, "pruefen" + Vario-Zeiten wie Referenz; tWaitForJog/tConvEmpty/nCountCarrier "pruefen" + tRasterHigh/Low 5 s wie Referenz, "pruefen" + stInSettings.xIsBorner TRUE wie Referenz, aber offen (Bedeutung klaeren) + arInOutJamEntr Staubereich zum (ersten) Vorgaenger + arInOutJamFinger Staubereich zum (ersten) Nachfolger + xInErrorQuit/xInAutomatic offen (Quittier-Taster, Automatik des Schranks) + Alle noch mit den SPS-Kollegen zu bestaetigen. +-#} +{% import "_macros.scl.j2" as m %} +{% set v = t.vario_sensors %} +REGION {{ t.region_title }} +{{ m.kopf(t) }} + +{% for s in t.separators %} + // Separator {{ s.n }} = Bauteil {{ s.layout }} aus dem Layout + #{{ t.id }}.stInSeparator{{ s.n }}.Settings.nSeparatorNo := "{{ s.no.value }}";{{ m.todo(s.no) }} + #{{ t.id }}.stInSeparator{{ s.n }}.Settings.tDelayToNextItem := "TimeForSepWaiting_Short"; + #{{ t.id }}.stInSeparator{{ s.n }}.Settings.tTrailingTime := t#800ms; // {{ TODO }}: pruefen + #{{ t.id }}.stInSeparator{{ s.n }}.Settings.tHandlingTime := t#300ms; // {{ TODO }}: pruefen + #{{ t.id }}.stInSeparator{{ s.n }}.Settings.tJam := "TimeForSepJam"; + #{{ t.id }}.stInSeparator{{ s.n }}.Settings.xPluggedJam := FALSE; + #{{ t.id }}.stInSeparator{{ s.n }}.Settings.xPluggedPart := FALSE; + #{{ t.id }}.stInSeparator{{ s.n }}.Settings.xPluggedScanner := {{ "TRUE" if t.has_scanner else "FALSE" }}; + #{{ t.id }}.stInSeparator{{ s.n }}.stSenInSep := "DB_Inputs".Sensors["{{ s.sensor.value }}"];{{ m.todo(s.sensor) }} + + #{{ t.id }}.stInSeparator{{ s.n }}.Settings.tSenFree := t#2000ms; // {{ TODO }}: pruefen + #{{ t.id }}.stInSeparator{{ s.n }}.Settings.tSenWait := T#5000ms; // {{ TODO }}: pruefen +{% endfor %} + + #{{ t.id }}.stInVario.Settings.xContinousEmptying := FALSE; + #{{ t.id }}.stInVario.Settings.tWaitForJog := T#300ms; // {{ TODO }}: pruefen + #{{ t.id }}.stInVario.Settings.tConvEmpty := T#45000ms; // {{ TODO }}: pruefen + #{{ t.id }}.stInVario.Settings.nCountCarrier := 1; // {{ TODO }}: pruefen + #{{ t.id }}.stInVario.Settings.tWaitForStop := t#3s; + + #{{ t.id }}.stInVario.Settings.tCarrierInPosDelay := t#1200ms; + #{{ t.id }}.stInVario.Settings.tCarrierInPosEdgeDelay := t#100ms; + + #{{ t.id }}.stInVario.Settings.tRasterHigh := t#5s; // {{ TODO }}: pruefen + #{{ t.id }}.stInVario.Settings.tRasterLow := t#5s; // {{ TODO }}: pruefen + + #{{ t.id }}.stInVario.stSenCarrInPos := "DB_Inputs".Sensors["{{ v.stSenCarrInPos.value }}"]; // MT in Pos{{ m.todo_mehr(v.stSenCarrInPos) }} + #{{ t.id }}.stInVario.stSenFinger := "DB_Inputs".Sensors["{{ v.stSenFinger.value }}"]; // Pusher Dog in Pos{{ m.todo_mehr(v.stSenFinger) }} + #{{ t.id }}.stInVario.stSenLastPos := "DB_Inputs".Sensors["{{ v.stSenLastPos.value }}"]; // Conveyor full{{ m.todo_mehr(v.stSenLastPos) }} + #{{ t.id }}.stInVario.stSenJam := "DB_Inputs".Sensors["{{ v.stSenJam.value }}"]; // Jam detector{{ m.todo_mehr(v.stSenJam) }} + + #{{ t.id }}.stInPriorityManager.xReleaseOk := TRUE; // braucht keine Vorfahrtsregelung + #{{ t.id }}.stInVario.Settings.xJamSenDelayActive := TRUE; + #{{ t.id }}.stInVario.Settings.tJamSenDelay := T#2s; + + #{{ t.id }}.stInSettings.xIsBorner := {{ t.is_border.value }}; // {{ m.note(t.is_border, "pruefen - Bedeutung mit SPS klaeren") }} + +{% set z = [] %} +{% set _ = z.append(('nInMainTroNo := "' ~ t.main_tro.value ~ '"', m.note(t.main_tro))) %} +{% set _ = z.append(("xInSftyOk := " ~ t.safety.value, m.note(t.safety))) %} +{% set _ = z.append(("xInMotorProtection := " ~ t.motor_protection.value, m.note(t.motor_protection))) %} +{% set _ = z.append(("xInAllRdyToStart := TRUE", "")) %} +{% set _ = z.append(('xInReset := "cTodoFalse"', "")) %} +{% set _ = z.append(("xInErrorQuit := " ~ t.error_quit.value, m.note(t.error_quit, "Quittierung"))) %} +{% set _ = z.append(("xInAutomatic := " ~ t.automatic.value, m.note(t.automatic, "Automatik des Schaltschranks"))) %} +{% set _ = z.append(("xInRelease := " ~ t.release, "")) %} +{% set _ = z.append(("arInOutJamEntr := " ~ t.jam_in.carriers.value, m.note(t.jam_in.carriers, "Staubereich von " ~ t.jam_in.neighbour))) %} +{% set _ = z.append(("stInOutJamEntr := " ~ t.jam_in.data.value, m.note(t.jam_in.data))) %} +{% set _ = z.append(("arInOutJamFinger := " ~ t.jam_out.carriers.value, m.note(t.jam_out.carriers, "Staubereich nach " ~ t.jam_out.neighbour))) %} +{% set _ = z.append(("stInOutJamFinger := " ~ t.jam_out.data.value, m.note(t.jam_out.data))) %} +{% set _ = z.append(("stInOutMachineState := " ~ t.machine_state.value, m.note(t.machine_state, "Schaltschrank"))) %} +{% set _ = z.append(("stInOutCognexInterface := #stCognexInterfaceDummy", "")) %} +{% set _ = z.append(('stInOutHMI := "DB_Interface_HMI".stTRO.' ~ t.id, "")) %} +{% set _ = z.append(('nOutStateLast => "DB_GLOB_TroState".arTroState["' ~ t.main_tro.value ~ '"]', m.note(t.main_tro))) %} +{% set _ = z.append(('xOutStopper => "' ~ t.separators[0].stopper.value ~ '"', m.note(t.separators[0].stopper))) %} +{% set _ = z.append(('xOutVarioMotor => "' ~ t.vario_motor.value ~ '"', m.note(t.vario_motor))) %} +{{ m.call(t, z) }} +END_REGION diff --git a/lib/scl_templates/FB_ILS_MTRO_Vario_workStation.scl.j2 b/lib/scl_templates/FB_ILS_MTRO_Vario_workStation.scl.j2 new file mode 100644 index 0000000..98c0a68 --- /dev/null +++ b/lib/scl_templates/FB_ILS_MTRO_Vario_workStation.scl.j2 @@ -0,0 +1,85 @@ +{#- + FB_ILS_MTRO_Vario_workStation - Aufrufstelle in FB_Main + + Referenz: doc/TRO_Katalog/scl_templates/FB_ILS_MTRO_Vario_workStation_CallSite.scl + (TRO 421, =A01+UH04-KF00 FB_Main). Der FB-Koerper liegt daneben + (FB_ILS_MTRO_Vario_workStation.scl). Zeilen und Reihenfolge folgen + der Aufrufstelle; geprueft per tests/test_scl_templates.py. + + Entscheidungen zu den ortsgebundenen Zeilen (doc/SCL_Templates.md §6): + Separatorzeiten tTrailingTime "cTimeSepTrailing", tHandlingTime 200 ms + wie Referenz, "pruefen" + xPluggedScanner FALSE wie Referenz - der Scanner des FB sitzt am + Arbeitsplatz, nicht am Separator ("pruefen") + tSenFree/tSenWait 1200/4300 ms wie Referenz, "pruefen" + Vario-Zeiten wie Referenz (tWaitForJog 400 ms, tConvEmpty 30 s), "pruefen" + fbConvVario.xBeladenError Sensor offen (E) + stInStationSensor/xInReleaseStation Arbeitsplatz-Sensor und -Freigabe offen (E) + arInOutJamEntr/JamFinger Staubereich zum (ersten) Vorgaenger / Nachfolger + Alle noch mit den SPS-Kollegen zu bestaetigen. +-#} +{% import "_macros.scl.j2" as m %} +{% set v = t.vario_sensors %} +{% set ws = t.work_station %} +REGION {{ t.region_title }} +{{ m.kopf(t) }} + +{% for s in t.separators %} + // Separator {{ s.n }} = Bauteil {{ s.layout }} aus dem Layout + #{{ t.id }}.stInSeparator{{ s.n }}.Settings.nSeparatorNo := "{{ s.no.value }}";{{ m.todo(s.no) }} + #{{ t.id }}.stInSeparator{{ s.n }}.Settings.tTrailingTime := "cTimeSepTrailing"; // {{ TODO }}: pruefen + #{{ t.id }}.stInSeparator{{ s.n }}.Settings.tHandlingTime := t#200ms; // {{ TODO }}: pruefen + #{{ t.id }}.stInSeparator{{ s.n }}.Settings.tDelayToNextItem := "TimeForSepWaiting_Short"; + #{{ t.id }}.stInSeparator{{ s.n }}.Settings.tJam := "TimeForSepJam"; + #{{ t.id }}.stInSeparator{{ s.n }}.Settings.xPluggedJam := FALSE; + #{{ t.id }}.stInSeparator{{ s.n }}.Settings.xPluggedPart := FALSE; + #{{ t.id }}.stInSeparator{{ s.n }}.Settings.xPluggedScanner := FALSE; // {{ TODO }}: pruefen + #{{ t.id }}.stInSeparator{{ s.n }}.stSenInSep := "DB_Inputs".Sensors["{{ s.sensor.value }}"];{{ m.todo(s.sensor) }} + + #{{ t.id }}.stInSeparator{{ s.n }}.Settings.tSenFree := T#1200ms; // {{ TODO }}: pruefen + #{{ t.id }}.stInSeparator{{ s.n }}.Settings.tSenWait := T#4300ms; // {{ TODO }}: pruefen +{% endfor %} + + #{{ t.id }}.stInVario.stSenFinger := "DB_Inputs".Sensors["{{ v.stSenFinger.value }}"]; // Finger in Pos{{ m.todo_mehr(v.stSenFinger) }} + #{{ t.id }}.stInVario.stSenLastPos := "DB_Inputs".Sensors["{{ v.stSenLastPos.value }}"]; // Conveyor full{{ m.todo_mehr(v.stSenLastPos) }} + #{{ t.id }}.stInVario.stSenCarrInPos := "DB_Inputs".Sensors["{{ v.stSenCarrInPos.value }}"]; // MT in Position{{ m.todo_mehr(v.stSenCarrInPos) }} + #{{ t.id }}.stInVario.stSenJam := "DB_Inputs".Sensors["{{ v.stSenJam.value }}"]; // Jam Detector{{ m.todo_mehr(v.stSenJam) }} + + #{{ t.id }}.stInVario.Settings.xContinousEmptying := FALSE; + #{{ t.id }}.stInVario.Settings.tWaitForJog := T#400ms; // {{ TODO }}: pruefen + #{{ t.id }}.stInVario.Settings.tConvEmpty := T#30000ms; // {{ TODO }}: pruefen + #{{ t.id }}.stInVario.Settings.nCountCarrier := 1; // {{ TODO }}: pruefen + #{{ t.id }}.stInVario.Settings.tWaitForStop := T#3s; + + #{{ t.id }}.stInVario.Settings.xJamSenDelayActive := TRUE; + #{{ t.id }}.stInVario.Settings.tJamSenDelay := T#2s; + + #{{ t.id }}.stInVario.Settings.tCarrierInPosDelay := t#1200ms; + #{{ t.id }}.stInVario.Settings.tCarrierInPosEdgeDelay := t#100ms; + + #{{ t.id }}.stInPriorityManager.xReleaseOk := TRUE; // braucht keine Vorfahrtsregelung + + #{{ t.id }}.fbConvVario.xBeladenError := "DB_Inputs".Sensors["{{ ws.loaded_error_sensor.value }}"].xDirectSensor;{{ m.todo(ws.loaded_error_sensor) }} + +{% set z = [] %} +{% set _ = z.append(('nInMainTroNo := "' ~ t.main_tro.value ~ '"', m.note(t.main_tro))) %} +{% set _ = z.append(("xInSftyOk := " ~ t.safety.value, m.note(t.safety))) %} +{% set _ = z.append(("xInAllRdyToStart := TRUE", "")) %} +{% set _ = z.append(("xInAutomatic := " ~ t.automatic.value, m.note(t.automatic, "Automatik des Schaltschranks"))) %} +{% set _ = z.append(('xInReset := "cTodoFalse"', "")) %} +{% set _ = z.append(("xInRelease := " ~ t.release, "")) %} +{% set _ = z.append(("xInMotorProtection := " ~ t.motor_protection.value, m.note(t.motor_protection))) %} +{% set _ = z.append(('stInStationSensor := "DB_Inputs".Sensors["' ~ ws.station_sensor.value ~ '"]', m.note(ws.station_sensor, "Arbeitsplatz"))) %} +{% set _ = z.append(("xInReleaseStation := " ~ ws.station_release.value, m.note(ws.station_release, "Freigabe Arbeitsplatz"))) %} +{% set _ = z.append(("arInOutJamEntr := " ~ t.jam_in.carriers.value, m.note(t.jam_in.carriers, "Staubereich von " ~ t.jam_in.neighbour))) %} +{% set _ = z.append(("stInOutJamEntr := " ~ t.jam_in.data.value, m.note(t.jam_in.data))) %} +{% set _ = z.append(("arInOutJamFinger := " ~ t.jam_out.carriers.value, m.note(t.jam_out.carriers, "Staubereich nach " ~ t.jam_out.neighbour))) %} +{% set _ = z.append(("stInOutJamFinger := " ~ t.jam_out.data.value, m.note(t.jam_out.data))) %} +{% set _ = z.append(("stInOutMachineState := " ~ t.machine_state.value, m.note(t.machine_state, "Schaltschrank"))) %} +{% set _ = z.append(("stInOutCognexInterface := #stCognexInterfaceDummy", "")) %} +{% set _ = z.append(('stInOutHMI := "DB_Interface_HMI".stTRO.' ~ t.id, "")) %} +{% set _ = z.append(('nOutStateLast => "DB_GLOB_TroState".arTroState["' ~ t.main_tro.value ~ '"]', m.note(t.main_tro))) %} +{% set _ = z.append(('xOutStopper => "' ~ t.separators[0].stopper.value ~ '"', m.note(t.separators[0].stopper))) %} +{% set _ = z.append(('xOutVarioMotor => "' ~ t.vario_motor.value ~ '"', m.note(t.vario_motor))) %} +{{ m.call(t, z) }} +END_REGION diff --git a/lib/scl_templates/_macros.scl.j2 b/lib/scl_templates/_macros.scl.j2 index bcefce8..98c3364 100644 --- a/lib/scl_templates/_macros.scl.j2 +++ b/lib/scl_templates/_macros.scl.j2 @@ -14,6 +14,11 @@ {% if name.todo %}{{ abstand }}// {{ TODO }}{% endif %} {%- endmacro %} +{#- TODO an einen schon vorhandenen Kommentar anhaengen ("// MT in Pos - TODO(E-Planung)") -#} +{% macro todo_mehr(name) -%} +{% if name.todo %} - {{ TODO }}{% endif %} +{%- endmacro %} + {#- Kommentartext fuer eine Parameterzeile des Aufrufs -#} {% macro note(name, text="") -%} {% if name.todo %}{{ TODO }}{% if text %} - {{ text }}{% endif %}{% else %}{{ text }}{% endif %} @@ -87,6 +92,38 @@ {% endfor %} {%- endmacro %} +{#- Cognex-Kamera: Eingaenge der Schnittstelle (E). ziel = "#arCognexInterface[...]" oder eine eigene Struktur -#} +{% macro cognex_in(ziel, sc, einzug=" ") %} +{{ einzug }}{{ ziel }}.xInCamTriggerReady := "{{ sc.tag.value }}-TriggerReady";{{ todo(sc.tag) }} +{{ einzug }}{{ ziel }}.xInCamTriggerAck := "{{ sc.tag.value }}-TriggerAck";{{ todo(sc.tag) }} +{{ einzug }}{{ ziel }}.xInCamResultsAvailable := "{{ sc.tag.value }}-Results Available";{{ todo(sc.tag) }} +{{ einzug }}{{ ziel }}.xInCamGeneralFault := "{{ sc.tag.value }}-General Fault";{{ todo(sc.tag) }} +{{ einzug }}{{ ziel }}.hwInCamInspectionResults := "{{ sc.hw_results.value }}";{{ todo(sc.hw_results) }} +{%- endmacro %} + +{#- Cognex-Kamera: Ausgaenge zurueck auf die Hardware-Symbole (E) -#} +{% macro cognex_out(ziel, sc, einzug=" ") %} +{{ einzug }}"{{ sc.tag.value }}-TriggerEnable" := {{ ziel }}.xOutCamTriggerEnable;{{ todo(sc.tag) }} +{{ einzug }}"{{ sc.tag.value }}-Trigger" := {{ ziel }}.xOutCamTrigger;{{ todo(sc.tag) }} +{{ einzug }}"{{ sc.tag.value }}-ResultsAck" := {{ ziel }}.xOutCamResultsAck;{{ todo(sc.tag) }} +{%- endmacro %} + +{#- Schluessel einer Kamera in #arCognexInterface -#} +{% macro cognex(sc) -%} +#arCognexInterface["{{ sc.interface.value }}"] +{%- endmacro %} + +{#- Traegerkorrektur nach dem Scan (FC_CARR_GLOB_CORRECTION); Traeger am Eingang -#} +{% macro correction(t, titel, einzug=" ") %} +{{ einzug }}REGION {{ titel }} +{{ einzug }} "FC_CARR_GLOB_CORRECTION"(xInStart := #{{ t.id }}.xOutCorrection, +{{ einzug }} nInBarcodeScan := #{{ t.id }}.nBarcodeResult, +{{ einzug }} nInStation := {{ t.correction_station.value }},{{ todo(t.correction_station) }} +{{ einzug }} arOutEventLogInfo => #arDummyEventCorrectionInfo, +{{ einzug }} InOutCarrierExpect := {{ t.jam_in.carriers.value }}[1]);{{ todo(t.jam_in.carriers) }} +{{ einzug }}END_REGION +{%- endmacro %} + {#- REGION Direction: je Weiche ein FC_Direction-Aufruf -#} {% macro direction(t) %} REGION Direction diff --git a/tests/fixtures/scl/HundM05_FB_Main_templates.scl b/tests/fixtures/scl/HundM05_FB_Main_templates.scl index 8eaf49b..c8ce91a 100644 --- a/tests/fixtures/scl/HundM05_FB_Main_templates.scl +++ b/tests/fixtures/scl/HundM05_FB_Main_templates.scl @@ -16,8 +16,8 @@ // Reihenfolge der REGIONs = Materialfluss. // Anfang bei TRO20: Materialeingang ueber SYS1, SYS2. // -// Aus Template : FB_ILS_MTRO_1Sep1Swi -// Generisch : FB_ILS_MTRO_1Sep, FB_ILS_MTRO_Vario (kein Template - von Hand pruefen) +// Aus Template : FB_ILS_MTRO_1Sep, FB_ILS_MTRO_1Sep1Swi, FB_ILS_MTRO_Vario +// Generisch : - (kein Template - von Hand pruefen) // ============================================================ FUNCTION_BLOCK "FB_Main" @@ -53,9 +53,10 @@ REGION TRO20 (1Sep) Sep 0007 // Vorgaenger: SYS1, SYS2, TRO19 // Nachfolger: TRO01 // Einstufung: mittel + // Aufbau nach Template FB_ILS_MTRO_1Sep.scl.j2 (Referenz: doc/TRO_Katalog/scl_templates) // Separator 1 = Bauteil 0007 aus dem Layout - #TRO20.stInSeparator1.Settings.nSeparatorNo := "cSep_____"; // TODO(E-Planung) + #TRO20.stInSeparator1.Settings.nSeparatorNo := "cSep_____"; // TODO(E-Planung) #TRO20.stInSeparator1.Settings.tDelayToNextItem := "TimeForSepWaiting_Short"; #TRO20.stInSeparator1.Settings.tTrailingTime := t#600ms; // TODO(E-Planung): pruefen #TRO20.stInSeparator1.Settings.tHandlingTime := t#200ms; // TODO(E-Planung): pruefen @@ -64,28 +65,32 @@ REGION TRO20 (1Sep) Sep 0007 #TRO20.stInSeparator1.Settings.xPluggedPart := FALSE; #TRO20.stInSeparator1.Settings.xPluggedScanner := FALSE; #TRO20.stInSeparator1.stSenInSep := "DB_Inputs".Sensors["cInBG____"]; // TODO(E-Planung) - #TRO20.stInSeparator1.Settings.tSenFree := T#1500ms; // TODO(E-Planung): pruefen - #TRO20.stInSeparator1.Settings.tSenWait := T#4000ms; // TODO(E-Planung): pruefen + #TRO20.stInSenJam2 := "DB_Inputs".Sensors["cInBG____"]; // TODO(E-Planung) - #TRO20.stInPriorityManager.xReleaseOk := TRUE; + #TRO20.stInSeparator1.Settings.tSenFree := T#1500ms; // TODO(E-Planung): pruefen + #TRO20.stInSeparator1.Settings.tSenWait := T#4000ms; // TODO(E-Planung): pruefen + + #TRO20.stInPriorityManager.xReleaseOk := TRUE; // braucht keine Vorfahrtsregelung #TRO20(nInMainTroNo := "cMainTro____", // TODO(E-Planung) xInSftyOk := "DB_InterfaceSafety".stFromSafety.EStopMain.Q, // TODO(E-Planung) xInAllRdyToStart := TRUE, + xInCarouselRun := #fbCarousel____.xOutConveyorFullSpeed, // TODO(E-Planung) - nur am Kreisel, sonst Zeile loeschen xInRelease := "DB_TRO_TEST".TRO20, - stInOutMachineState := #stInOutControlUnitCabinet, + stInOutMachineState := #stInOutControlUnitCabinet, // TODO(E-Planung) - Schaltschrank stInOutCognexInterface := #stCognexInterfaceDummy, arInOutJamEntr1 := "DB_JamArea____".stJam____.arCarrier, // TODO(E-Planung) - Staubereich von SYS1 (Station, kein TRO) - stInOutJamEntr1 := "DB_JamArea____".stJam____.stData, + stInOutJamEntr1 := "DB_JamArea____".stJam____.stData, // TODO(E-Planung) arInOutJamEntr2 := "DB_JamArea____".stJam____.arCarrier, // TODO(E-Planung) - Staubereich von SYS2 (Station, kein TRO) - stInOutJamEntr2 := "DB_JamArea____".stJam____.stData, + stInOutJamEntr2 := "DB_JamArea____".stJam____.stData, // TODO(E-Planung) arInOutJamEntr3 := "DB_JamArea____".stJam____.arCarrier, // TODO(E-Planung) - Staubereich von TRO19 - stInOutJamEntr3 := "DB_JamArea____".stJam____.stData, + stInOutJamEntr3 := "DB_JamArea____".stJam____.stData, // TODO(E-Planung) arInOutJamExit2 := "DB_JamArea____".stJam____.arCarrier, // TODO(E-Planung) - Staubereich nach TRO01 - stInOutJamExit2 := "DB_JamArea____".stJam____.stData, + stInOutJamExit2 := "DB_JamArea____".stJam____.stData, // TODO(E-Planung) xOutStopper1 => "MB____", // TODO(E-Planung) - stInOutHMI := "DB_Interface_HMI".stTRO.TRO20, - nOutStateLast => "DB_GLOB_TroState".arTroState["cMainTro____"]); // TODO(E-Planung) + nOutStateLast => "DB_GLOB_TroState".arTroState["cMainTro____"], // TODO(E-Planung) + stInOutHMI := "DB_Interface_HMI".stTRO.TRO20); + END_REGION REGION TRO01 (1Sep1Swi) Sep 0008 @@ -152,52 +157,64 @@ REGION TRO02 (Vario) Sep 0025 // Vorgaenger: TRO01 // Nachfolger: TRO03 // Einstufung: hoch + // Aufbau nach Template FB_ILS_MTRO_Vario.scl.j2 (Referenz: doc/TRO_Katalog/scl_templates) // Separator 1 = Bauteil 0025 aus dem Layout - #TRO02.stInSeparator1.Settings.nSeparatorNo := "cSep_____"; // TODO(E-Planung) + #TRO02.stInSeparator1.Settings.nSeparatorNo := "cSep_____"; // TODO(E-Planung) #TRO02.stInSeparator1.Settings.tDelayToNextItem := "TimeForSepWaiting_Short"; - #TRO02.stInSeparator1.Settings.tTrailingTime := t#600ms; // TODO(E-Planung): pruefen - #TRO02.stInSeparator1.Settings.tHandlingTime := t#200ms; // TODO(E-Planung): pruefen + #TRO02.stInSeparator1.Settings.tTrailingTime := t#800ms; // TODO(E-Planung): pruefen + #TRO02.stInSeparator1.Settings.tHandlingTime := t#300ms; // TODO(E-Planung): pruefen #TRO02.stInSeparator1.Settings.tJam := "TimeForSepJam"; - #TRO02.stInSeparator1.Settings.xPluggedJam := TRUE; + #TRO02.stInSeparator1.Settings.xPluggedJam := FALSE; #TRO02.stInSeparator1.Settings.xPluggedPart := FALSE; #TRO02.stInSeparator1.Settings.xPluggedScanner := FALSE; #TRO02.stInSeparator1.stSenInSep := "DB_Inputs".Sensors["cInBG____"]; // TODO(E-Planung) - #TRO02.stInSeparator1.Settings.tSenFree := T#1500ms; // TODO(E-Planung): pruefen - #TRO02.stInSeparator1.Settings.tSenWait := T#4000ms; // TODO(E-Planung): pruefen + + #TRO02.stInSeparator1.Settings.tSenFree := t#2000ms; // TODO(E-Planung): pruefen + #TRO02.stInSeparator1.Settings.tSenWait := T#5000ms; // TODO(E-Planung): pruefen #TRO02.stInVario.Settings.xContinousEmptying := FALSE; - #TRO02.stInVario.Settings.tWaitForJog := T#300ms; // TODO(E-Planung): pruefen - #TRO02.stInVario.Settings.tConvEmpty := T#45000ms; // TODO(E-Planung): pruefen - #TRO02.stInVario.Settings.nCountCarrier := 1; // TODO(E-Planung): pruefen + #TRO02.stInVario.Settings.tWaitForJog := T#300ms; // TODO(E-Planung): pruefen + #TRO02.stInVario.Settings.tConvEmpty := T#45000ms; // TODO(E-Planung): pruefen + #TRO02.stInVario.Settings.nCountCarrier := 1; // TODO(E-Planung): pruefen #TRO02.stInVario.Settings.tWaitForStop := t#3s; + #TRO02.stInVario.Settings.tCarrierInPosDelay := t#1200ms; #TRO02.stInVario.Settings.tCarrierInPosEdgeDelay := t#100ms; + + #TRO02.stInVario.Settings.tRasterHigh := t#5s; // TODO(E-Planung): pruefen + #TRO02.stInVario.Settings.tRasterLow := t#5s; // TODO(E-Planung): pruefen + + #TRO02.stInVario.stSenCarrInPos := "DB_Inputs".Sensors["cInBG____"]; // MT in Pos - TODO(E-Planung) + #TRO02.stInVario.stSenFinger := "DB_Inputs".Sensors["cInBG____"]; // Pusher Dog in Pos - TODO(E-Planung) + #TRO02.stInVario.stSenLastPos := "DB_Inputs".Sensors["cInBG____"]; // Conveyor full - TODO(E-Planung) + #TRO02.stInVario.stSenJam := "DB_Inputs".Sensors["cInBG____"]; // Jam detector - TODO(E-Planung) + + #TRO02.stInPriorityManager.xReleaseOk := TRUE; // braucht keine Vorfahrtsregelung #TRO02.stInVario.Settings.xJamSenDelayActive := TRUE; #TRO02.stInVario.Settings.tJamSenDelay := T#2s; - #TRO02.stInVario.stSenCarrInPos := "DB_Inputs".Sensors["cInBG____"]; // TODO(E-Planung) - #TRO02.stInVario.stSenFinger := "DB_Inputs".Sensors["cInBG____"]; // TODO(E-Planung) - #TRO02.stInVario.stSenLastPos := "DB_Inputs".Sensors["cInBG____"]; // TODO(E-Planung) - #TRO02.stInVario.stSenJam := "DB_Inputs".Sensors["cInBG____"]; // TODO(E-Planung) - #TRO02.stInPriorityManager.xReleaseOk := TRUE; + #TRO02.stInSettings.xIsBorner := TRUE; // TODO(E-Planung) - pruefen - Bedeutung mit SPS klaeren #TRO02(nInMainTroNo := "cMainTro____", // TODO(E-Planung) xInSftyOk := "DB_InterfaceSafety".stFromSafety.EStopMain.Q, // TODO(E-Planung) - xInAllRdyToStart := TRUE, - xInRelease := "DB_TRO_TEST".TRO02, xInMotorProtection := "FC____", // TODO(E-Planung) - xInAutomatic := #t_automatik, - stInOutMachineState := #stInOutControlUnitCabinet, + xInAllRdyToStart := TRUE, + xInReset := "cTodoFalse", + xInErrorQuit := "SF____", // TODO(E-Planung) - Quittierung + xInAutomatic := #t_automatik, // TODO(E-Planung) - Automatik des Schaltschranks + xInRelease := "DB_TRO_TEST".TRO02, + arInOutJamEntr := "DB_JamArea____".stJam____.arCarrier, // TODO(E-Planung) - Staubereich von TRO01 + stInOutJamEntr := "DB_JamArea____".stJam____.stData, // TODO(E-Planung) + arInOutJamFinger := "DB_JamArea____".stJam____.arCarrier, // TODO(E-Planung) - Staubereich nach TRO03 + stInOutJamFinger := "DB_JamArea____".stJam____.stData, // TODO(E-Planung) + stInOutMachineState := #stInOutControlUnitCabinet, // TODO(E-Planung) - Schaltschrank stInOutCognexInterface := #stCognexInterfaceDummy, - arInOutJamEntr1 := "DB_JamArea____".stJam____.arCarrier, // TODO(E-Planung) - Staubereich von TRO01 - stInOutJamEntr1 := "DB_JamArea____".stJam____.stData, - arInOutJamExit2 := "DB_JamArea____".stJam____.arCarrier, // TODO(E-Planung) - Staubereich nach TRO03 - stInOutJamExit2 := "DB_JamArea____".stJam____.stData, - xOutStopper1 => "MB____", // TODO(E-Planung) - xOutVarioMotor => "MA____", // TODO(E-Planung) stInOutHMI := "DB_Interface_HMI".stTRO.TRO02, - nOutStateLast => "DB_GLOB_TroState".arTroState["cMainTro____"]); // TODO(E-Planung) + nOutStateLast => "DB_GLOB_TroState".arTroState["cMainTro____"], // TODO(E-Planung) + xOutStopper => "MB____", // TODO(E-Planung) + xOutVarioMotor => "MA____"); // TODO(E-Planung) + END_REGION REGION TRO06 (1Sep1Swi) Sep 0010 @@ -266,9 +283,10 @@ REGION TRO03 (1Sep) Sep 0026 // Vorgaenger: TRO02 // Nachfolger: TRO04 // Einstufung: mittel + // Aufbau nach Template FB_ILS_MTRO_1Sep.scl.j2 (Referenz: doc/TRO_Katalog/scl_templates) // Separator 1 = Bauteil 0026 aus dem Layout - #TRO03.stInSeparator1.Settings.nSeparatorNo := "cSep_____"; // TODO(E-Planung) + #TRO03.stInSeparator1.Settings.nSeparatorNo := "cSep_____"; // TODO(E-Planung) #TRO03.stInSeparator1.Settings.tDelayToNextItem := "TimeForSepWaiting_Short"; #TRO03.stInSeparator1.Settings.tTrailingTime := t#600ms; // TODO(E-Planung): pruefen #TRO03.stInSeparator1.Settings.tHandlingTime := t#200ms; // TODO(E-Planung): pruefen @@ -277,24 +295,28 @@ REGION TRO03 (1Sep) Sep 0026 #TRO03.stInSeparator1.Settings.xPluggedPart := FALSE; #TRO03.stInSeparator1.Settings.xPluggedScanner := FALSE; #TRO03.stInSeparator1.stSenInSep := "DB_Inputs".Sensors["cInBG____"]; // TODO(E-Planung) - #TRO03.stInSeparator1.Settings.tSenFree := T#1500ms; // TODO(E-Planung): pruefen - #TRO03.stInSeparator1.Settings.tSenWait := T#4000ms; // TODO(E-Planung): pruefen + #TRO03.stInSenJam2 := "DB_Inputs".Sensors["cInBG____"]; // TODO(E-Planung) - #TRO03.stInPriorityManager.xReleaseOk := TRUE; + #TRO03.stInSeparator1.Settings.tSenFree := T#1500ms; // TODO(E-Planung): pruefen + #TRO03.stInSeparator1.Settings.tSenWait := T#4000ms; // TODO(E-Planung): pruefen + + #TRO03.stInPriorityManager.xReleaseOk := TRUE; // braucht keine Vorfahrtsregelung #TRO03(nInMainTroNo := "cMainTro____", // TODO(E-Planung) xInSftyOk := "DB_InterfaceSafety".stFromSafety.EStopMain.Q, // TODO(E-Planung) xInAllRdyToStart := TRUE, + xInCarouselRun := #fbCarousel____.xOutConveyorFullSpeed, // TODO(E-Planung) - nur am Kreisel, sonst Zeile loeschen xInRelease := "DB_TRO_TEST".TRO03, - stInOutMachineState := #stInOutControlUnitCabinet, + stInOutMachineState := #stInOutControlUnitCabinet, // TODO(E-Planung) - Schaltschrank stInOutCognexInterface := #stCognexInterfaceDummy, arInOutJamEntr1 := "DB_JamArea____".stJam____.arCarrier, // TODO(E-Planung) - Staubereich von TRO02 - stInOutJamEntr1 := "DB_JamArea____".stJam____.stData, + stInOutJamEntr1 := "DB_JamArea____".stJam____.stData, // TODO(E-Planung) arInOutJamExit2 := "DB_JamArea____".stJam____.arCarrier, // TODO(E-Planung) - Staubereich nach TRO04 - stInOutJamExit2 := "DB_JamArea____".stJam____.stData, + stInOutJamExit2 := "DB_JamArea____".stJam____.stData, // TODO(E-Planung) xOutStopper1 => "MB____", // TODO(E-Planung) - stInOutHMI := "DB_Interface_HMI".stTRO.TRO03, - nOutStateLast => "DB_GLOB_TroState".arTroState["cMainTro____"]); // TODO(E-Planung) + nOutStateLast => "DB_GLOB_TroState".arTroState["cMainTro____"], // TODO(E-Planung) + stInOutHMI := "DB_Interface_HMI".stTRO.TRO03); + END_REGION REGION TRO07 (Vario) Sep 0031 @@ -302,52 +324,64 @@ REGION TRO07 (Vario) Sep 0031 // Vorgaenger: TRO06 // Nachfolger: TRO08 // Einstufung: hoch + // Aufbau nach Template FB_ILS_MTRO_Vario.scl.j2 (Referenz: doc/TRO_Katalog/scl_templates) // Separator 1 = Bauteil 0031 aus dem Layout - #TRO07.stInSeparator1.Settings.nSeparatorNo := "cSep_____"; // TODO(E-Planung) + #TRO07.stInSeparator1.Settings.nSeparatorNo := "cSep_____"; // TODO(E-Planung) #TRO07.stInSeparator1.Settings.tDelayToNextItem := "TimeForSepWaiting_Short"; - #TRO07.stInSeparator1.Settings.tTrailingTime := t#600ms; // TODO(E-Planung): pruefen - #TRO07.stInSeparator1.Settings.tHandlingTime := t#200ms; // TODO(E-Planung): pruefen + #TRO07.stInSeparator1.Settings.tTrailingTime := t#800ms; // TODO(E-Planung): pruefen + #TRO07.stInSeparator1.Settings.tHandlingTime := t#300ms; // TODO(E-Planung): pruefen #TRO07.stInSeparator1.Settings.tJam := "TimeForSepJam"; - #TRO07.stInSeparator1.Settings.xPluggedJam := TRUE; + #TRO07.stInSeparator1.Settings.xPluggedJam := FALSE; #TRO07.stInSeparator1.Settings.xPluggedPart := FALSE; #TRO07.stInSeparator1.Settings.xPluggedScanner := FALSE; #TRO07.stInSeparator1.stSenInSep := "DB_Inputs".Sensors["cInBG____"]; // TODO(E-Planung) - #TRO07.stInSeparator1.Settings.tSenFree := T#1500ms; // TODO(E-Planung): pruefen - #TRO07.stInSeparator1.Settings.tSenWait := T#4000ms; // TODO(E-Planung): pruefen + + #TRO07.stInSeparator1.Settings.tSenFree := t#2000ms; // TODO(E-Planung): pruefen + #TRO07.stInSeparator1.Settings.tSenWait := T#5000ms; // TODO(E-Planung): pruefen #TRO07.stInVario.Settings.xContinousEmptying := FALSE; - #TRO07.stInVario.Settings.tWaitForJog := T#300ms; // TODO(E-Planung): pruefen - #TRO07.stInVario.Settings.tConvEmpty := T#45000ms; // TODO(E-Planung): pruefen - #TRO07.stInVario.Settings.nCountCarrier := 1; // TODO(E-Planung): pruefen + #TRO07.stInVario.Settings.tWaitForJog := T#300ms; // TODO(E-Planung): pruefen + #TRO07.stInVario.Settings.tConvEmpty := T#45000ms; // TODO(E-Planung): pruefen + #TRO07.stInVario.Settings.nCountCarrier := 1; // TODO(E-Planung): pruefen #TRO07.stInVario.Settings.tWaitForStop := t#3s; + #TRO07.stInVario.Settings.tCarrierInPosDelay := t#1200ms; #TRO07.stInVario.Settings.tCarrierInPosEdgeDelay := t#100ms; + + #TRO07.stInVario.Settings.tRasterHigh := t#5s; // TODO(E-Planung): pruefen + #TRO07.stInVario.Settings.tRasterLow := t#5s; // TODO(E-Planung): pruefen + + #TRO07.stInVario.stSenCarrInPos := "DB_Inputs".Sensors["cInBG____"]; // MT in Pos - TODO(E-Planung) + #TRO07.stInVario.stSenFinger := "DB_Inputs".Sensors["cInBG____"]; // Pusher Dog in Pos - TODO(E-Planung) + #TRO07.stInVario.stSenLastPos := "DB_Inputs".Sensors["cInBG____"]; // Conveyor full - TODO(E-Planung) + #TRO07.stInVario.stSenJam := "DB_Inputs".Sensors["cInBG____"]; // Jam detector - TODO(E-Planung) + + #TRO07.stInPriorityManager.xReleaseOk := TRUE; // braucht keine Vorfahrtsregelung #TRO07.stInVario.Settings.xJamSenDelayActive := TRUE; #TRO07.stInVario.Settings.tJamSenDelay := T#2s; - #TRO07.stInVario.stSenCarrInPos := "DB_Inputs".Sensors["cInBG____"]; // TODO(E-Planung) - #TRO07.stInVario.stSenFinger := "DB_Inputs".Sensors["cInBG____"]; // TODO(E-Planung) - #TRO07.stInVario.stSenLastPos := "DB_Inputs".Sensors["cInBG____"]; // TODO(E-Planung) - #TRO07.stInVario.stSenJam := "DB_Inputs".Sensors["cInBG____"]; // TODO(E-Planung) - #TRO07.stInPriorityManager.xReleaseOk := TRUE; + #TRO07.stInSettings.xIsBorner := TRUE; // TODO(E-Planung) - pruefen - Bedeutung mit SPS klaeren #TRO07(nInMainTroNo := "cMainTro____", // TODO(E-Planung) xInSftyOk := "DB_InterfaceSafety".stFromSafety.EStopMain.Q, // TODO(E-Planung) - xInAllRdyToStart := TRUE, - xInRelease := "DB_TRO_TEST".TRO07, xInMotorProtection := "FC____", // TODO(E-Planung) - xInAutomatic := #t_automatik, - stInOutMachineState := #stInOutControlUnitCabinet, + xInAllRdyToStart := TRUE, + xInReset := "cTodoFalse", + xInErrorQuit := "SF____", // TODO(E-Planung) - Quittierung + xInAutomatic := #t_automatik, // TODO(E-Planung) - Automatik des Schaltschranks + xInRelease := "DB_TRO_TEST".TRO07, + arInOutJamEntr := "DB_JamArea____".stJam____.arCarrier, // TODO(E-Planung) - Staubereich von TRO06 + stInOutJamEntr := "DB_JamArea____".stJam____.stData, // TODO(E-Planung) + arInOutJamFinger := "DB_JamArea____".stJam____.arCarrier, // TODO(E-Planung) - Staubereich nach TRO08 + stInOutJamFinger := "DB_JamArea____".stJam____.stData, // TODO(E-Planung) + stInOutMachineState := #stInOutControlUnitCabinet, // TODO(E-Planung) - Schaltschrank stInOutCognexInterface := #stCognexInterfaceDummy, - arInOutJamEntr1 := "DB_JamArea____".stJam____.arCarrier, // TODO(E-Planung) - Staubereich von TRO06 - stInOutJamEntr1 := "DB_JamArea____".stJam____.stData, - arInOutJamExit2 := "DB_JamArea____".stJam____.arCarrier, // TODO(E-Planung) - Staubereich nach TRO08 - stInOutJamExit2 := "DB_JamArea____".stJam____.stData, - xOutStopper1 => "MB____", // TODO(E-Planung) - xOutVarioMotor => "MA____", // TODO(E-Planung) stInOutHMI := "DB_Interface_HMI".stTRO.TRO07, - nOutStateLast => "DB_GLOB_TroState".arTroState["cMainTro____"]); // TODO(E-Planung) + nOutStateLast => "DB_GLOB_TroState".arTroState["cMainTro____"], // TODO(E-Planung) + xOutStopper => "MB____", // TODO(E-Planung) + xOutVarioMotor => "MA____"); // TODO(E-Planung) + END_REGION REGION TRO09 (1Sep1Swi) Sep 0012 @@ -416,52 +450,64 @@ REGION TRO04 (Vario) Sep 0027 // Vorgaenger: TRO03 // Nachfolger: TRO05 // Einstufung: hoch + // Aufbau nach Template FB_ILS_MTRO_Vario.scl.j2 (Referenz: doc/TRO_Katalog/scl_templates) // Separator 1 = Bauteil 0027 aus dem Layout - #TRO04.stInSeparator1.Settings.nSeparatorNo := "cSep_____"; // TODO(E-Planung) + #TRO04.stInSeparator1.Settings.nSeparatorNo := "cSep_____"; // TODO(E-Planung) #TRO04.stInSeparator1.Settings.tDelayToNextItem := "TimeForSepWaiting_Short"; - #TRO04.stInSeparator1.Settings.tTrailingTime := t#600ms; // TODO(E-Planung): pruefen - #TRO04.stInSeparator1.Settings.tHandlingTime := t#200ms; // TODO(E-Planung): pruefen + #TRO04.stInSeparator1.Settings.tTrailingTime := t#800ms; // TODO(E-Planung): pruefen + #TRO04.stInSeparator1.Settings.tHandlingTime := t#300ms; // TODO(E-Planung): pruefen #TRO04.stInSeparator1.Settings.tJam := "TimeForSepJam"; - #TRO04.stInSeparator1.Settings.xPluggedJam := TRUE; + #TRO04.stInSeparator1.Settings.xPluggedJam := FALSE; #TRO04.stInSeparator1.Settings.xPluggedPart := FALSE; #TRO04.stInSeparator1.Settings.xPluggedScanner := FALSE; #TRO04.stInSeparator1.stSenInSep := "DB_Inputs".Sensors["cInBG____"]; // TODO(E-Planung) - #TRO04.stInSeparator1.Settings.tSenFree := T#1500ms; // TODO(E-Planung): pruefen - #TRO04.stInSeparator1.Settings.tSenWait := T#4000ms; // TODO(E-Planung): pruefen + + #TRO04.stInSeparator1.Settings.tSenFree := t#2000ms; // TODO(E-Planung): pruefen + #TRO04.stInSeparator1.Settings.tSenWait := T#5000ms; // TODO(E-Planung): pruefen #TRO04.stInVario.Settings.xContinousEmptying := FALSE; - #TRO04.stInVario.Settings.tWaitForJog := T#300ms; // TODO(E-Planung): pruefen - #TRO04.stInVario.Settings.tConvEmpty := T#45000ms; // TODO(E-Planung): pruefen - #TRO04.stInVario.Settings.nCountCarrier := 1; // TODO(E-Planung): pruefen + #TRO04.stInVario.Settings.tWaitForJog := T#300ms; // TODO(E-Planung): pruefen + #TRO04.stInVario.Settings.tConvEmpty := T#45000ms; // TODO(E-Planung): pruefen + #TRO04.stInVario.Settings.nCountCarrier := 1; // TODO(E-Planung): pruefen #TRO04.stInVario.Settings.tWaitForStop := t#3s; + #TRO04.stInVario.Settings.tCarrierInPosDelay := t#1200ms; #TRO04.stInVario.Settings.tCarrierInPosEdgeDelay := t#100ms; + + #TRO04.stInVario.Settings.tRasterHigh := t#5s; // TODO(E-Planung): pruefen + #TRO04.stInVario.Settings.tRasterLow := t#5s; // TODO(E-Planung): pruefen + + #TRO04.stInVario.stSenCarrInPos := "DB_Inputs".Sensors["cInBG____"]; // MT in Pos - TODO(E-Planung) + #TRO04.stInVario.stSenFinger := "DB_Inputs".Sensors["cInBG____"]; // Pusher Dog in Pos - TODO(E-Planung) + #TRO04.stInVario.stSenLastPos := "DB_Inputs".Sensors["cInBG____"]; // Conveyor full - TODO(E-Planung) + #TRO04.stInVario.stSenJam := "DB_Inputs".Sensors["cInBG____"]; // Jam detector - TODO(E-Planung) + + #TRO04.stInPriorityManager.xReleaseOk := TRUE; // braucht keine Vorfahrtsregelung #TRO04.stInVario.Settings.xJamSenDelayActive := TRUE; #TRO04.stInVario.Settings.tJamSenDelay := T#2s; - #TRO04.stInVario.stSenCarrInPos := "DB_Inputs".Sensors["cInBG____"]; // TODO(E-Planung) - #TRO04.stInVario.stSenFinger := "DB_Inputs".Sensors["cInBG____"]; // TODO(E-Planung) - #TRO04.stInVario.stSenLastPos := "DB_Inputs".Sensors["cInBG____"]; // TODO(E-Planung) - #TRO04.stInVario.stSenJam := "DB_Inputs".Sensors["cInBG____"]; // TODO(E-Planung) - #TRO04.stInPriorityManager.xReleaseOk := TRUE; + #TRO04.stInSettings.xIsBorner := TRUE; // TODO(E-Planung) - pruefen - Bedeutung mit SPS klaeren #TRO04(nInMainTroNo := "cMainTro____", // TODO(E-Planung) xInSftyOk := "DB_InterfaceSafety".stFromSafety.EStopMain.Q, // TODO(E-Planung) - xInAllRdyToStart := TRUE, - xInRelease := "DB_TRO_TEST".TRO04, xInMotorProtection := "FC____", // TODO(E-Planung) - xInAutomatic := #t_automatik, - stInOutMachineState := #stInOutControlUnitCabinet, + xInAllRdyToStart := TRUE, + xInReset := "cTodoFalse", + xInErrorQuit := "SF____", // TODO(E-Planung) - Quittierung + xInAutomatic := #t_automatik, // TODO(E-Planung) - Automatik des Schaltschranks + xInRelease := "DB_TRO_TEST".TRO04, + arInOutJamEntr := "DB_JamArea____".stJam____.arCarrier, // TODO(E-Planung) - Staubereich von TRO03 + stInOutJamEntr := "DB_JamArea____".stJam____.stData, // TODO(E-Planung) + arInOutJamFinger := "DB_JamArea____".stJam____.arCarrier, // TODO(E-Planung) - Staubereich nach TRO05 + stInOutJamFinger := "DB_JamArea____".stJam____.stData, // TODO(E-Planung) + stInOutMachineState := #stInOutControlUnitCabinet, // TODO(E-Planung) - Schaltschrank stInOutCognexInterface := #stCognexInterfaceDummy, - arInOutJamEntr1 := "DB_JamArea____".stJam____.arCarrier, // TODO(E-Planung) - Staubereich von TRO03 - stInOutJamEntr1 := "DB_JamArea____".stJam____.stData, - arInOutJamExit2 := "DB_JamArea____".stJam____.arCarrier, // TODO(E-Planung) - Staubereich nach TRO05 - stInOutJamExit2 := "DB_JamArea____".stJam____.stData, - xOutStopper1 => "MB____", // TODO(E-Planung) - xOutVarioMotor => "MA____", // TODO(E-Planung) stInOutHMI := "DB_Interface_HMI".stTRO.TRO04, - nOutStateLast => "DB_GLOB_TroState".arTroState["cMainTro____"]); // TODO(E-Planung) + nOutStateLast => "DB_GLOB_TroState".arTroState["cMainTro____"], // TODO(E-Planung) + xOutStopper => "MB____", // TODO(E-Planung) + xOutVarioMotor => "MA____"); // TODO(E-Planung) + END_REGION REGION TRO08 (1Sep) Sep 0032 @@ -469,9 +515,10 @@ REGION TRO08 (1Sep) Sep 0032 // Vorgaenger: TRO07 // Nachfolger: TRO09 // Einstufung: mittel + // Aufbau nach Template FB_ILS_MTRO_1Sep.scl.j2 (Referenz: doc/TRO_Katalog/scl_templates) // Separator 1 = Bauteil 0032 aus dem Layout - #TRO08.stInSeparator1.Settings.nSeparatorNo := "cSep_____"; // TODO(E-Planung) + #TRO08.stInSeparator1.Settings.nSeparatorNo := "cSep_____"; // TODO(E-Planung) #TRO08.stInSeparator1.Settings.tDelayToNextItem := "TimeForSepWaiting_Short"; #TRO08.stInSeparator1.Settings.tTrailingTime := t#600ms; // TODO(E-Planung): pruefen #TRO08.stInSeparator1.Settings.tHandlingTime := t#200ms; // TODO(E-Planung): pruefen @@ -480,24 +527,28 @@ REGION TRO08 (1Sep) Sep 0032 #TRO08.stInSeparator1.Settings.xPluggedPart := FALSE; #TRO08.stInSeparator1.Settings.xPluggedScanner := FALSE; #TRO08.stInSeparator1.stSenInSep := "DB_Inputs".Sensors["cInBG____"]; // TODO(E-Planung) - #TRO08.stInSeparator1.Settings.tSenFree := T#1500ms; // TODO(E-Planung): pruefen - #TRO08.stInSeparator1.Settings.tSenWait := T#4000ms; // TODO(E-Planung): pruefen + #TRO08.stInSenJam2 := "DB_Inputs".Sensors["cInBG____"]; // TODO(E-Planung) - #TRO08.stInPriorityManager.xReleaseOk := TRUE; + #TRO08.stInSeparator1.Settings.tSenFree := T#1500ms; // TODO(E-Planung): pruefen + #TRO08.stInSeparator1.Settings.tSenWait := T#4000ms; // TODO(E-Planung): pruefen + + #TRO08.stInPriorityManager.xReleaseOk := TRUE; // braucht keine Vorfahrtsregelung #TRO08(nInMainTroNo := "cMainTro____", // TODO(E-Planung) xInSftyOk := "DB_InterfaceSafety".stFromSafety.EStopMain.Q, // TODO(E-Planung) xInAllRdyToStart := TRUE, + xInCarouselRun := #fbCarousel____.xOutConveyorFullSpeed, // TODO(E-Planung) - nur am Kreisel, sonst Zeile loeschen xInRelease := "DB_TRO_TEST".TRO08, - stInOutMachineState := #stInOutControlUnitCabinet, + stInOutMachineState := #stInOutControlUnitCabinet, // TODO(E-Planung) - Schaltschrank stInOutCognexInterface := #stCognexInterfaceDummy, arInOutJamEntr1 := "DB_JamArea____".stJam____.arCarrier, // TODO(E-Planung) - Staubereich von TRO07 - stInOutJamEntr1 := "DB_JamArea____".stJam____.stData, + stInOutJamEntr1 := "DB_JamArea____".stJam____.stData, // TODO(E-Planung) arInOutJamExit2 := "DB_JamArea____".stJam____.arCarrier, // TODO(E-Planung) - Staubereich nach TRO09 - stInOutJamExit2 := "DB_JamArea____".stJam____.stData, + stInOutJamExit2 := "DB_JamArea____".stJam____.stData, // TODO(E-Planung) xOutStopper1 => "MB____", // TODO(E-Planung) - stInOutHMI := "DB_Interface_HMI".stTRO.TRO08, - nOutStateLast => "DB_GLOB_TroState".arTroState["cMainTro____"]); // TODO(E-Planung) + nOutStateLast => "DB_GLOB_TroState".arTroState["cMainTro____"], // TODO(E-Planung) + stInOutHMI := "DB_Interface_HMI".stTRO.TRO08); + END_REGION REGION TRO10 (Vario) Sep 0035 @@ -505,52 +556,64 @@ REGION TRO10 (Vario) Sep 0035 // Vorgaenger: TRO09 // Nachfolger: TRO11 // Einstufung: hoch + // Aufbau nach Template FB_ILS_MTRO_Vario.scl.j2 (Referenz: doc/TRO_Katalog/scl_templates) // Separator 1 = Bauteil 0035 aus dem Layout - #TRO10.stInSeparator1.Settings.nSeparatorNo := "cSep_____"; // TODO(E-Planung) + #TRO10.stInSeparator1.Settings.nSeparatorNo := "cSep_____"; // TODO(E-Planung) #TRO10.stInSeparator1.Settings.tDelayToNextItem := "TimeForSepWaiting_Short"; - #TRO10.stInSeparator1.Settings.tTrailingTime := t#600ms; // TODO(E-Planung): pruefen - #TRO10.stInSeparator1.Settings.tHandlingTime := t#200ms; // TODO(E-Planung): pruefen + #TRO10.stInSeparator1.Settings.tTrailingTime := t#800ms; // TODO(E-Planung): pruefen + #TRO10.stInSeparator1.Settings.tHandlingTime := t#300ms; // TODO(E-Planung): pruefen #TRO10.stInSeparator1.Settings.tJam := "TimeForSepJam"; - #TRO10.stInSeparator1.Settings.xPluggedJam := TRUE; + #TRO10.stInSeparator1.Settings.xPluggedJam := FALSE; #TRO10.stInSeparator1.Settings.xPluggedPart := FALSE; #TRO10.stInSeparator1.Settings.xPluggedScanner := FALSE; #TRO10.stInSeparator1.stSenInSep := "DB_Inputs".Sensors["cInBG____"]; // TODO(E-Planung) - #TRO10.stInSeparator1.Settings.tSenFree := T#1500ms; // TODO(E-Planung): pruefen - #TRO10.stInSeparator1.Settings.tSenWait := T#4000ms; // TODO(E-Planung): pruefen + + #TRO10.stInSeparator1.Settings.tSenFree := t#2000ms; // TODO(E-Planung): pruefen + #TRO10.stInSeparator1.Settings.tSenWait := T#5000ms; // TODO(E-Planung): pruefen #TRO10.stInVario.Settings.xContinousEmptying := FALSE; - #TRO10.stInVario.Settings.tWaitForJog := T#300ms; // TODO(E-Planung): pruefen - #TRO10.stInVario.Settings.tConvEmpty := T#45000ms; // TODO(E-Planung): pruefen - #TRO10.stInVario.Settings.nCountCarrier := 1; // TODO(E-Planung): pruefen + #TRO10.stInVario.Settings.tWaitForJog := T#300ms; // TODO(E-Planung): pruefen + #TRO10.stInVario.Settings.tConvEmpty := T#45000ms; // TODO(E-Planung): pruefen + #TRO10.stInVario.Settings.nCountCarrier := 1; // TODO(E-Planung): pruefen #TRO10.stInVario.Settings.tWaitForStop := t#3s; + #TRO10.stInVario.Settings.tCarrierInPosDelay := t#1200ms; #TRO10.stInVario.Settings.tCarrierInPosEdgeDelay := t#100ms; + + #TRO10.stInVario.Settings.tRasterHigh := t#5s; // TODO(E-Planung): pruefen + #TRO10.stInVario.Settings.tRasterLow := t#5s; // TODO(E-Planung): pruefen + + #TRO10.stInVario.stSenCarrInPos := "DB_Inputs".Sensors["cInBG____"]; // MT in Pos - TODO(E-Planung) + #TRO10.stInVario.stSenFinger := "DB_Inputs".Sensors["cInBG____"]; // Pusher Dog in Pos - TODO(E-Planung) + #TRO10.stInVario.stSenLastPos := "DB_Inputs".Sensors["cInBG____"]; // Conveyor full - TODO(E-Planung) + #TRO10.stInVario.stSenJam := "DB_Inputs".Sensors["cInBG____"]; // Jam detector - TODO(E-Planung) + + #TRO10.stInPriorityManager.xReleaseOk := TRUE; // braucht keine Vorfahrtsregelung #TRO10.stInVario.Settings.xJamSenDelayActive := TRUE; #TRO10.stInVario.Settings.tJamSenDelay := T#2s; - #TRO10.stInVario.stSenCarrInPos := "DB_Inputs".Sensors["cInBG____"]; // TODO(E-Planung) - #TRO10.stInVario.stSenFinger := "DB_Inputs".Sensors["cInBG____"]; // TODO(E-Planung) - #TRO10.stInVario.stSenLastPos := "DB_Inputs".Sensors["cInBG____"]; // TODO(E-Planung) - #TRO10.stInVario.stSenJam := "DB_Inputs".Sensors["cInBG____"]; // TODO(E-Planung) - #TRO10.stInPriorityManager.xReleaseOk := TRUE; + #TRO10.stInSettings.xIsBorner := TRUE; // TODO(E-Planung) - pruefen - Bedeutung mit SPS klaeren #TRO10(nInMainTroNo := "cMainTro____", // TODO(E-Planung) xInSftyOk := "DB_InterfaceSafety".stFromSafety.EStopMain.Q, // TODO(E-Planung) - xInAllRdyToStart := TRUE, - xInRelease := "DB_TRO_TEST".TRO10, xInMotorProtection := "FC____", // TODO(E-Planung) - xInAutomatic := #t_automatik, - stInOutMachineState := #stInOutControlUnitCabinet, + xInAllRdyToStart := TRUE, + xInReset := "cTodoFalse", + xInErrorQuit := "SF____", // TODO(E-Planung) - Quittierung + xInAutomatic := #t_automatik, // TODO(E-Planung) - Automatik des Schaltschranks + xInRelease := "DB_TRO_TEST".TRO10, + arInOutJamEntr := "DB_JamArea____".stJam____.arCarrier, // TODO(E-Planung) - Staubereich von TRO09 + stInOutJamEntr := "DB_JamArea____".stJam____.stData, // TODO(E-Planung) + arInOutJamFinger := "DB_JamArea____".stJam____.arCarrier, // TODO(E-Planung) - Staubereich nach TRO11 + stInOutJamFinger := "DB_JamArea____".stJam____.stData, // TODO(E-Planung) + stInOutMachineState := #stInOutControlUnitCabinet, // TODO(E-Planung) - Schaltschrank stInOutCognexInterface := #stCognexInterfaceDummy, - arInOutJamEntr1 := "DB_JamArea____".stJam____.arCarrier, // TODO(E-Planung) - Staubereich von TRO09 - stInOutJamEntr1 := "DB_JamArea____".stJam____.stData, - arInOutJamExit2 := "DB_JamArea____".stJam____.arCarrier, // TODO(E-Planung) - Staubereich nach TRO11 - stInOutJamExit2 := "DB_JamArea____".stJam____.stData, - xOutStopper1 => "MB____", // TODO(E-Planung) - xOutVarioMotor => "MA____", // TODO(E-Planung) stInOutHMI := "DB_Interface_HMI".stTRO.TRO10, - nOutStateLast => "DB_GLOB_TroState".arTroState["cMainTro____"]); // TODO(E-Planung) + nOutStateLast => "DB_GLOB_TroState".arTroState["cMainTro____"], // TODO(E-Planung) + xOutStopper => "MB____", // TODO(E-Planung) + xOutVarioMotor => "MA____"); // TODO(E-Planung) + END_REGION REGION TRO12 (1Sep1Swi) Sep 0014 @@ -619,9 +682,10 @@ REGION TRO05 (1Sep) Sep 0028 // Vorgaenger: TRO04 // Nachfolger: TRO06 // Einstufung: mittel + // Aufbau nach Template FB_ILS_MTRO_1Sep.scl.j2 (Referenz: doc/TRO_Katalog/scl_templates) // Separator 1 = Bauteil 0028 aus dem Layout - #TRO05.stInSeparator1.Settings.nSeparatorNo := "cSep_____"; // TODO(E-Planung) + #TRO05.stInSeparator1.Settings.nSeparatorNo := "cSep_____"; // TODO(E-Planung) #TRO05.stInSeparator1.Settings.tDelayToNextItem := "TimeForSepWaiting_Short"; #TRO05.stInSeparator1.Settings.tTrailingTime := t#600ms; // TODO(E-Planung): pruefen #TRO05.stInSeparator1.Settings.tHandlingTime := t#200ms; // TODO(E-Planung): pruefen @@ -630,24 +694,28 @@ REGION TRO05 (1Sep) Sep 0028 #TRO05.stInSeparator1.Settings.xPluggedPart := FALSE; #TRO05.stInSeparator1.Settings.xPluggedScanner := FALSE; #TRO05.stInSeparator1.stSenInSep := "DB_Inputs".Sensors["cInBG____"]; // TODO(E-Planung) - #TRO05.stInSeparator1.Settings.tSenFree := T#1500ms; // TODO(E-Planung): pruefen - #TRO05.stInSeparator1.Settings.tSenWait := T#4000ms; // TODO(E-Planung): pruefen + #TRO05.stInSenJam2 := "DB_Inputs".Sensors["cInBG____"]; // TODO(E-Planung) - #TRO05.stInPriorityManager.xReleaseOk := TRUE; + #TRO05.stInSeparator1.Settings.tSenFree := T#1500ms; // TODO(E-Planung): pruefen + #TRO05.stInSeparator1.Settings.tSenWait := T#4000ms; // TODO(E-Planung): pruefen + + #TRO05.stInPriorityManager.xReleaseOk := TRUE; // braucht keine Vorfahrtsregelung #TRO05(nInMainTroNo := "cMainTro____", // TODO(E-Planung) xInSftyOk := "DB_InterfaceSafety".stFromSafety.EStopMain.Q, // TODO(E-Planung) xInAllRdyToStart := TRUE, + xInCarouselRun := #fbCarousel____.xOutConveyorFullSpeed, // TODO(E-Planung) - nur am Kreisel, sonst Zeile loeschen xInRelease := "DB_TRO_TEST".TRO05, - stInOutMachineState := #stInOutControlUnitCabinet, + stInOutMachineState := #stInOutControlUnitCabinet, // TODO(E-Planung) - Schaltschrank stInOutCognexInterface := #stCognexInterfaceDummy, arInOutJamEntr1 := "DB_JamArea____".stJam____.arCarrier, // TODO(E-Planung) - Staubereich von TRO04 - stInOutJamEntr1 := "DB_JamArea____".stJam____.stData, + stInOutJamEntr1 := "DB_JamArea____".stJam____.stData, // TODO(E-Planung) arInOutJamExit2 := "DB_JamArea____".stJam____.arCarrier, // TODO(E-Planung) - Staubereich nach TRO06 - stInOutJamExit2 := "DB_JamArea____".stJam____.stData, + stInOutJamExit2 := "DB_JamArea____".stJam____.stData, // TODO(E-Planung) xOutStopper1 => "MB____", // TODO(E-Planung) - stInOutHMI := "DB_Interface_HMI".stTRO.TRO05, - nOutStateLast => "DB_GLOB_TroState".arTroState["cMainTro____"]); // TODO(E-Planung) + nOutStateLast => "DB_GLOB_TroState".arTroState["cMainTro____"], // TODO(E-Planung) + stInOutHMI := "DB_Interface_HMI".stTRO.TRO05); + END_REGION REGION TRO11 (1Sep) Sep 0036 @@ -655,9 +723,10 @@ REGION TRO11 (1Sep) Sep 0036 // Vorgaenger: TRO10 // Nachfolger: TRO12 // Einstufung: mittel + // Aufbau nach Template FB_ILS_MTRO_1Sep.scl.j2 (Referenz: doc/TRO_Katalog/scl_templates) // Separator 1 = Bauteil 0036 aus dem Layout - #TRO11.stInSeparator1.Settings.nSeparatorNo := "cSep_____"; // TODO(E-Planung) + #TRO11.stInSeparator1.Settings.nSeparatorNo := "cSep_____"; // TODO(E-Planung) #TRO11.stInSeparator1.Settings.tDelayToNextItem := "TimeForSepWaiting_Short"; #TRO11.stInSeparator1.Settings.tTrailingTime := t#600ms; // TODO(E-Planung): pruefen #TRO11.stInSeparator1.Settings.tHandlingTime := t#200ms; // TODO(E-Planung): pruefen @@ -666,24 +735,28 @@ REGION TRO11 (1Sep) Sep 0036 #TRO11.stInSeparator1.Settings.xPluggedPart := FALSE; #TRO11.stInSeparator1.Settings.xPluggedScanner := FALSE; #TRO11.stInSeparator1.stSenInSep := "DB_Inputs".Sensors["cInBG____"]; // TODO(E-Planung) - #TRO11.stInSeparator1.Settings.tSenFree := T#1500ms; // TODO(E-Planung): pruefen - #TRO11.stInSeparator1.Settings.tSenWait := T#4000ms; // TODO(E-Planung): pruefen + #TRO11.stInSenJam2 := "DB_Inputs".Sensors["cInBG____"]; // TODO(E-Planung) - #TRO11.stInPriorityManager.xReleaseOk := TRUE; + #TRO11.stInSeparator1.Settings.tSenFree := T#1500ms; // TODO(E-Planung): pruefen + #TRO11.stInSeparator1.Settings.tSenWait := T#4000ms; // TODO(E-Planung): pruefen + + #TRO11.stInPriorityManager.xReleaseOk := TRUE; // braucht keine Vorfahrtsregelung #TRO11(nInMainTroNo := "cMainTro____", // TODO(E-Planung) xInSftyOk := "DB_InterfaceSafety".stFromSafety.EStopMain.Q, // TODO(E-Planung) xInAllRdyToStart := TRUE, + xInCarouselRun := #fbCarousel____.xOutConveyorFullSpeed, // TODO(E-Planung) - nur am Kreisel, sonst Zeile loeschen xInRelease := "DB_TRO_TEST".TRO11, - stInOutMachineState := #stInOutControlUnitCabinet, + stInOutMachineState := #stInOutControlUnitCabinet, // TODO(E-Planung) - Schaltschrank stInOutCognexInterface := #stCognexInterfaceDummy, arInOutJamEntr1 := "DB_JamArea____".stJam____.arCarrier, // TODO(E-Planung) - Staubereich von TRO10 - stInOutJamEntr1 := "DB_JamArea____".stJam____.stData, + stInOutJamEntr1 := "DB_JamArea____".stJam____.stData, // TODO(E-Planung) arInOutJamExit2 := "DB_JamArea____".stJam____.arCarrier, // TODO(E-Planung) - Staubereich nach TRO12 - stInOutJamExit2 := "DB_JamArea____".stJam____.stData, + stInOutJamExit2 := "DB_JamArea____".stJam____.stData, // TODO(E-Planung) xOutStopper1 => "MB____", // TODO(E-Planung) - stInOutHMI := "DB_Interface_HMI".stTRO.TRO11, - nOutStateLast => "DB_GLOB_TroState".arTroState["cMainTro____"]); // TODO(E-Planung) + nOutStateLast => "DB_GLOB_TroState".arTroState["cMainTro____"], // TODO(E-Planung) + stInOutHMI := "DB_Interface_HMI".stTRO.TRO11); + END_REGION REGION TRO13 (Vario) Sep 0039 @@ -691,52 +764,64 @@ REGION TRO13 (Vario) Sep 0039 // Vorgaenger: TRO12 // Nachfolger: TRO14 // Einstufung: hoch + // Aufbau nach Template FB_ILS_MTRO_Vario.scl.j2 (Referenz: doc/TRO_Katalog/scl_templates) // Separator 1 = Bauteil 0039 aus dem Layout - #TRO13.stInSeparator1.Settings.nSeparatorNo := "cSep_____"; // TODO(E-Planung) + #TRO13.stInSeparator1.Settings.nSeparatorNo := "cSep_____"; // TODO(E-Planung) #TRO13.stInSeparator1.Settings.tDelayToNextItem := "TimeForSepWaiting_Short"; - #TRO13.stInSeparator1.Settings.tTrailingTime := t#600ms; // TODO(E-Planung): pruefen - #TRO13.stInSeparator1.Settings.tHandlingTime := t#200ms; // TODO(E-Planung): pruefen + #TRO13.stInSeparator1.Settings.tTrailingTime := t#800ms; // TODO(E-Planung): pruefen + #TRO13.stInSeparator1.Settings.tHandlingTime := t#300ms; // TODO(E-Planung): pruefen #TRO13.stInSeparator1.Settings.tJam := "TimeForSepJam"; - #TRO13.stInSeparator1.Settings.xPluggedJam := TRUE; + #TRO13.stInSeparator1.Settings.xPluggedJam := FALSE; #TRO13.stInSeparator1.Settings.xPluggedPart := FALSE; #TRO13.stInSeparator1.Settings.xPluggedScanner := FALSE; #TRO13.stInSeparator1.stSenInSep := "DB_Inputs".Sensors["cInBG____"]; // TODO(E-Planung) - #TRO13.stInSeparator1.Settings.tSenFree := T#1500ms; // TODO(E-Planung): pruefen - #TRO13.stInSeparator1.Settings.tSenWait := T#4000ms; // TODO(E-Planung): pruefen + + #TRO13.stInSeparator1.Settings.tSenFree := t#2000ms; // TODO(E-Planung): pruefen + #TRO13.stInSeparator1.Settings.tSenWait := T#5000ms; // TODO(E-Planung): pruefen #TRO13.stInVario.Settings.xContinousEmptying := FALSE; - #TRO13.stInVario.Settings.tWaitForJog := T#300ms; // TODO(E-Planung): pruefen - #TRO13.stInVario.Settings.tConvEmpty := T#45000ms; // TODO(E-Planung): pruefen - #TRO13.stInVario.Settings.nCountCarrier := 1; // TODO(E-Planung): pruefen + #TRO13.stInVario.Settings.tWaitForJog := T#300ms; // TODO(E-Planung): pruefen + #TRO13.stInVario.Settings.tConvEmpty := T#45000ms; // TODO(E-Planung): pruefen + #TRO13.stInVario.Settings.nCountCarrier := 1; // TODO(E-Planung): pruefen #TRO13.stInVario.Settings.tWaitForStop := t#3s; + #TRO13.stInVario.Settings.tCarrierInPosDelay := t#1200ms; #TRO13.stInVario.Settings.tCarrierInPosEdgeDelay := t#100ms; + + #TRO13.stInVario.Settings.tRasterHigh := t#5s; // TODO(E-Planung): pruefen + #TRO13.stInVario.Settings.tRasterLow := t#5s; // TODO(E-Planung): pruefen + + #TRO13.stInVario.stSenCarrInPos := "DB_Inputs".Sensors["cInBG____"]; // MT in Pos - TODO(E-Planung) + #TRO13.stInVario.stSenFinger := "DB_Inputs".Sensors["cInBG____"]; // Pusher Dog in Pos - TODO(E-Planung) + #TRO13.stInVario.stSenLastPos := "DB_Inputs".Sensors["cInBG____"]; // Conveyor full - TODO(E-Planung) + #TRO13.stInVario.stSenJam := "DB_Inputs".Sensors["cInBG____"]; // Jam detector - TODO(E-Planung) + + #TRO13.stInPriorityManager.xReleaseOk := TRUE; // braucht keine Vorfahrtsregelung #TRO13.stInVario.Settings.xJamSenDelayActive := TRUE; #TRO13.stInVario.Settings.tJamSenDelay := T#2s; - #TRO13.stInVario.stSenCarrInPos := "DB_Inputs".Sensors["cInBG____"]; // TODO(E-Planung) - #TRO13.stInVario.stSenFinger := "DB_Inputs".Sensors["cInBG____"]; // TODO(E-Planung) - #TRO13.stInVario.stSenLastPos := "DB_Inputs".Sensors["cInBG____"]; // TODO(E-Planung) - #TRO13.stInVario.stSenJam := "DB_Inputs".Sensors["cInBG____"]; // TODO(E-Planung) - #TRO13.stInPriorityManager.xReleaseOk := TRUE; + #TRO13.stInSettings.xIsBorner := TRUE; // TODO(E-Planung) - pruefen - Bedeutung mit SPS klaeren #TRO13(nInMainTroNo := "cMainTro____", // TODO(E-Planung) xInSftyOk := "DB_InterfaceSafety".stFromSafety.EStopMain.Q, // TODO(E-Planung) - xInAllRdyToStart := TRUE, - xInRelease := "DB_TRO_TEST".TRO13, xInMotorProtection := "FC____", // TODO(E-Planung) - xInAutomatic := #t_automatik, - stInOutMachineState := #stInOutControlUnitCabinet, + xInAllRdyToStart := TRUE, + xInReset := "cTodoFalse", + xInErrorQuit := "SF____", // TODO(E-Planung) - Quittierung + xInAutomatic := #t_automatik, // TODO(E-Planung) - Automatik des Schaltschranks + xInRelease := "DB_TRO_TEST".TRO13, + arInOutJamEntr := "DB_JamArea____".stJam____.arCarrier, // TODO(E-Planung) - Staubereich von TRO12 + stInOutJamEntr := "DB_JamArea____".stJam____.stData, // TODO(E-Planung) + arInOutJamFinger := "DB_JamArea____".stJam____.arCarrier, // TODO(E-Planung) - Staubereich nach TRO14 + stInOutJamFinger := "DB_JamArea____".stJam____.stData, // TODO(E-Planung) + stInOutMachineState := #stInOutControlUnitCabinet, // TODO(E-Planung) - Schaltschrank stInOutCognexInterface := #stCognexInterfaceDummy, - arInOutJamEntr1 := "DB_JamArea____".stJam____.arCarrier, // TODO(E-Planung) - Staubereich von TRO12 - stInOutJamEntr1 := "DB_JamArea____".stJam____.stData, - arInOutJamExit2 := "DB_JamArea____".stJam____.arCarrier, // TODO(E-Planung) - Staubereich nach TRO14 - stInOutJamExit2 := "DB_JamArea____".stJam____.stData, - xOutStopper1 => "MB____", // TODO(E-Planung) - xOutVarioMotor => "MA____", // TODO(E-Planung) stInOutHMI := "DB_Interface_HMI".stTRO.TRO13, - nOutStateLast => "DB_GLOB_TroState".arTroState["cMainTro____"]); // TODO(E-Planung) + nOutStateLast => "DB_GLOB_TroState".arTroState["cMainTro____"], // TODO(E-Planung) + xOutStopper => "MB____", // TODO(E-Planung) + xOutVarioMotor => "MA____"); // TODO(E-Planung) + END_REGION REGION TRO15 (1Sep1Swi) Sep 0016 @@ -805,9 +890,10 @@ REGION TRO14 (1Sep) Sep 0040 // Vorgaenger: TRO13 // Nachfolger: TRO15 // Einstufung: mittel + // Aufbau nach Template FB_ILS_MTRO_1Sep.scl.j2 (Referenz: doc/TRO_Katalog/scl_templates) // Separator 1 = Bauteil 0040 aus dem Layout - #TRO14.stInSeparator1.Settings.nSeparatorNo := "cSep_____"; // TODO(E-Planung) + #TRO14.stInSeparator1.Settings.nSeparatorNo := "cSep_____"; // TODO(E-Planung) #TRO14.stInSeparator1.Settings.tDelayToNextItem := "TimeForSepWaiting_Short"; #TRO14.stInSeparator1.Settings.tTrailingTime := t#600ms; // TODO(E-Planung): pruefen #TRO14.stInSeparator1.Settings.tHandlingTime := t#200ms; // TODO(E-Planung): pruefen @@ -816,24 +902,28 @@ REGION TRO14 (1Sep) Sep 0040 #TRO14.stInSeparator1.Settings.xPluggedPart := FALSE; #TRO14.stInSeparator1.Settings.xPluggedScanner := FALSE; #TRO14.stInSeparator1.stSenInSep := "DB_Inputs".Sensors["cInBG____"]; // TODO(E-Planung) - #TRO14.stInSeparator1.Settings.tSenFree := T#1500ms; // TODO(E-Planung): pruefen - #TRO14.stInSeparator1.Settings.tSenWait := T#4000ms; // TODO(E-Planung): pruefen + #TRO14.stInSenJam2 := "DB_Inputs".Sensors["cInBG____"]; // TODO(E-Planung) - #TRO14.stInPriorityManager.xReleaseOk := TRUE; + #TRO14.stInSeparator1.Settings.tSenFree := T#1500ms; // TODO(E-Planung): pruefen + #TRO14.stInSeparator1.Settings.tSenWait := T#4000ms; // TODO(E-Planung): pruefen + + #TRO14.stInPriorityManager.xReleaseOk := TRUE; // braucht keine Vorfahrtsregelung #TRO14(nInMainTroNo := "cMainTro____", // TODO(E-Planung) xInSftyOk := "DB_InterfaceSafety".stFromSafety.EStopMain.Q, // TODO(E-Planung) xInAllRdyToStart := TRUE, + xInCarouselRun := #fbCarousel____.xOutConveyorFullSpeed, // TODO(E-Planung) - nur am Kreisel, sonst Zeile loeschen xInRelease := "DB_TRO_TEST".TRO14, - stInOutMachineState := #stInOutControlUnitCabinet, + stInOutMachineState := #stInOutControlUnitCabinet, // TODO(E-Planung) - Schaltschrank stInOutCognexInterface := #stCognexInterfaceDummy, arInOutJamEntr1 := "DB_JamArea____".stJam____.arCarrier, // TODO(E-Planung) - Staubereich von TRO13 - stInOutJamEntr1 := "DB_JamArea____".stJam____.stData, + stInOutJamEntr1 := "DB_JamArea____".stJam____.stData, // TODO(E-Planung) arInOutJamExit2 := "DB_JamArea____".stJam____.arCarrier, // TODO(E-Planung) - Staubereich nach TRO15 - stInOutJamExit2 := "DB_JamArea____".stJam____.stData, + stInOutJamExit2 := "DB_JamArea____".stJam____.stData, // TODO(E-Planung) xOutStopper1 => "MB____", // TODO(E-Planung) - stInOutHMI := "DB_Interface_HMI".stTRO.TRO14, - nOutStateLast => "DB_GLOB_TroState".arTroState["cMainTro____"]); // TODO(E-Planung) + nOutStateLast => "DB_GLOB_TroState".arTroState["cMainTro____"], // TODO(E-Planung) + stInOutHMI := "DB_Interface_HMI".stTRO.TRO14); + END_REGION REGION TRO16 (1Sep) Sep 0018 @@ -841,9 +931,10 @@ REGION TRO16 (1Sep) Sep 0018 // Vorgaenger: TRO15, TRO18 // Nachfolger: TRO19 // Einstufung: mittel + // Aufbau nach Template FB_ILS_MTRO_1Sep.scl.j2 (Referenz: doc/TRO_Katalog/scl_templates) // Separator 1 = Bauteil 0018 aus dem Layout - #TRO16.stInSeparator1.Settings.nSeparatorNo := "cSep_____"; // TODO(E-Planung) + #TRO16.stInSeparator1.Settings.nSeparatorNo := "cSep_____"; // TODO(E-Planung) #TRO16.stInSeparator1.Settings.tDelayToNextItem := "TimeForSepWaiting_Short"; #TRO16.stInSeparator1.Settings.tTrailingTime := t#600ms; // TODO(E-Planung): pruefen #TRO16.stInSeparator1.Settings.tHandlingTime := t#200ms; // TODO(E-Planung): pruefen @@ -852,26 +943,30 @@ REGION TRO16 (1Sep) Sep 0018 #TRO16.stInSeparator1.Settings.xPluggedPart := FALSE; #TRO16.stInSeparator1.Settings.xPluggedScanner := FALSE; #TRO16.stInSeparator1.stSenInSep := "DB_Inputs".Sensors["cInBG____"]; // TODO(E-Planung) - #TRO16.stInSeparator1.Settings.tSenFree := T#1500ms; // TODO(E-Planung): pruefen - #TRO16.stInSeparator1.Settings.tSenWait := T#4000ms; // TODO(E-Planung): pruefen + #TRO16.stInSenJam2 := "DB_Inputs".Sensors["cInBG____"]; // TODO(E-Planung) - #TRO16.stInPriorityManager.xReleaseOk := TRUE; + #TRO16.stInSeparator1.Settings.tSenFree := T#1500ms; // TODO(E-Planung): pruefen + #TRO16.stInSeparator1.Settings.tSenWait := T#4000ms; // TODO(E-Planung): pruefen + + #TRO16.stInPriorityManager.xReleaseOk := TRUE; // braucht keine Vorfahrtsregelung #TRO16(nInMainTroNo := "cMainTro____", // TODO(E-Planung) xInSftyOk := "DB_InterfaceSafety".stFromSafety.EStopMain.Q, // TODO(E-Planung) xInAllRdyToStart := TRUE, + xInCarouselRun := #fbCarousel____.xOutConveyorFullSpeed, // TODO(E-Planung) - nur am Kreisel, sonst Zeile loeschen xInRelease := "DB_TRO_TEST".TRO16, - stInOutMachineState := #stInOutControlUnitCabinet, + stInOutMachineState := #stInOutControlUnitCabinet, // TODO(E-Planung) - Schaltschrank stInOutCognexInterface := #stCognexInterfaceDummy, arInOutJamEntr1 := "DB_JamArea____".stJam____.arCarrier, // TODO(E-Planung) - Staubereich von TRO15 - stInOutJamEntr1 := "DB_JamArea____".stJam____.stData, + stInOutJamEntr1 := "DB_JamArea____".stJam____.stData, // TODO(E-Planung) arInOutJamEntr2 := "DB_JamArea____".stJam____.arCarrier, // TODO(E-Planung) - Staubereich von TRO18 - stInOutJamEntr2 := "DB_JamArea____".stJam____.stData, + stInOutJamEntr2 := "DB_JamArea____".stJam____.stData, // TODO(E-Planung) arInOutJamExit2 := "DB_JamArea____".stJam____.arCarrier, // TODO(E-Planung) - Staubereich nach TRO19 - stInOutJamExit2 := "DB_JamArea____".stJam____.stData, + stInOutJamExit2 := "DB_JamArea____".stJam____.stData, // TODO(E-Planung) xOutStopper1 => "MB____", // TODO(E-Planung) - stInOutHMI := "DB_Interface_HMI".stTRO.TRO16, - nOutStateLast => "DB_GLOB_TroState".arTroState["cMainTro____"]); // TODO(E-Planung) + nOutStateLast => "DB_GLOB_TroState".arTroState["cMainTro____"], // TODO(E-Planung) + stInOutHMI := "DB_Interface_HMI".stTRO.TRO16); + END_REGION REGION TRO17 (Vario) Sep 0043 @@ -879,52 +974,64 @@ REGION TRO17 (Vario) Sep 0043 // Vorgaenger: TRO15 // Nachfolger: TRO18 // Einstufung: hoch + // Aufbau nach Template FB_ILS_MTRO_Vario.scl.j2 (Referenz: doc/TRO_Katalog/scl_templates) // Separator 1 = Bauteil 0043 aus dem Layout - #TRO17.stInSeparator1.Settings.nSeparatorNo := "cSep_____"; // TODO(E-Planung) + #TRO17.stInSeparator1.Settings.nSeparatorNo := "cSep_____"; // TODO(E-Planung) #TRO17.stInSeparator1.Settings.tDelayToNextItem := "TimeForSepWaiting_Short"; - #TRO17.stInSeparator1.Settings.tTrailingTime := t#600ms; // TODO(E-Planung): pruefen - #TRO17.stInSeparator1.Settings.tHandlingTime := t#200ms; // TODO(E-Planung): pruefen + #TRO17.stInSeparator1.Settings.tTrailingTime := t#800ms; // TODO(E-Planung): pruefen + #TRO17.stInSeparator1.Settings.tHandlingTime := t#300ms; // TODO(E-Planung): pruefen #TRO17.stInSeparator1.Settings.tJam := "TimeForSepJam"; - #TRO17.stInSeparator1.Settings.xPluggedJam := TRUE; + #TRO17.stInSeparator1.Settings.xPluggedJam := FALSE; #TRO17.stInSeparator1.Settings.xPluggedPart := FALSE; #TRO17.stInSeparator1.Settings.xPluggedScanner := FALSE; #TRO17.stInSeparator1.stSenInSep := "DB_Inputs".Sensors["cInBG____"]; // TODO(E-Planung) - #TRO17.stInSeparator1.Settings.tSenFree := T#1500ms; // TODO(E-Planung): pruefen - #TRO17.stInSeparator1.Settings.tSenWait := T#4000ms; // TODO(E-Planung): pruefen + + #TRO17.stInSeparator1.Settings.tSenFree := t#2000ms; // TODO(E-Planung): pruefen + #TRO17.stInSeparator1.Settings.tSenWait := T#5000ms; // TODO(E-Planung): pruefen #TRO17.stInVario.Settings.xContinousEmptying := FALSE; - #TRO17.stInVario.Settings.tWaitForJog := T#300ms; // TODO(E-Planung): pruefen - #TRO17.stInVario.Settings.tConvEmpty := T#45000ms; // TODO(E-Planung): pruefen - #TRO17.stInVario.Settings.nCountCarrier := 1; // TODO(E-Planung): pruefen + #TRO17.stInVario.Settings.tWaitForJog := T#300ms; // TODO(E-Planung): pruefen + #TRO17.stInVario.Settings.tConvEmpty := T#45000ms; // TODO(E-Planung): pruefen + #TRO17.stInVario.Settings.nCountCarrier := 1; // TODO(E-Planung): pruefen #TRO17.stInVario.Settings.tWaitForStop := t#3s; + #TRO17.stInVario.Settings.tCarrierInPosDelay := t#1200ms; #TRO17.stInVario.Settings.tCarrierInPosEdgeDelay := t#100ms; + + #TRO17.stInVario.Settings.tRasterHigh := t#5s; // TODO(E-Planung): pruefen + #TRO17.stInVario.Settings.tRasterLow := t#5s; // TODO(E-Planung): pruefen + + #TRO17.stInVario.stSenCarrInPos := "DB_Inputs".Sensors["cInBG____"]; // MT in Pos - TODO(E-Planung) + #TRO17.stInVario.stSenFinger := "DB_Inputs".Sensors["cInBG____"]; // Pusher Dog in Pos - TODO(E-Planung) + #TRO17.stInVario.stSenLastPos := "DB_Inputs".Sensors["cInBG____"]; // Conveyor full - TODO(E-Planung) + #TRO17.stInVario.stSenJam := "DB_Inputs".Sensors["cInBG____"]; // Jam detector - TODO(E-Planung) + + #TRO17.stInPriorityManager.xReleaseOk := TRUE; // braucht keine Vorfahrtsregelung #TRO17.stInVario.Settings.xJamSenDelayActive := TRUE; #TRO17.stInVario.Settings.tJamSenDelay := T#2s; - #TRO17.stInVario.stSenCarrInPos := "DB_Inputs".Sensors["cInBG____"]; // TODO(E-Planung) - #TRO17.stInVario.stSenFinger := "DB_Inputs".Sensors["cInBG____"]; // TODO(E-Planung) - #TRO17.stInVario.stSenLastPos := "DB_Inputs".Sensors["cInBG____"]; // TODO(E-Planung) - #TRO17.stInVario.stSenJam := "DB_Inputs".Sensors["cInBG____"]; // TODO(E-Planung) - #TRO17.stInPriorityManager.xReleaseOk := TRUE; + #TRO17.stInSettings.xIsBorner := TRUE; // TODO(E-Planung) - pruefen - Bedeutung mit SPS klaeren #TRO17(nInMainTroNo := "cMainTro____", // TODO(E-Planung) xInSftyOk := "DB_InterfaceSafety".stFromSafety.EStopMain.Q, // TODO(E-Planung) - xInAllRdyToStart := TRUE, - xInRelease := "DB_TRO_TEST".TRO17, xInMotorProtection := "FC____", // TODO(E-Planung) - xInAutomatic := #t_automatik, - stInOutMachineState := #stInOutControlUnitCabinet, + xInAllRdyToStart := TRUE, + xInReset := "cTodoFalse", + xInErrorQuit := "SF____", // TODO(E-Planung) - Quittierung + xInAutomatic := #t_automatik, // TODO(E-Planung) - Automatik des Schaltschranks + xInRelease := "DB_TRO_TEST".TRO17, + arInOutJamEntr := "DB_JamArea____".stJam____.arCarrier, // TODO(E-Planung) - Staubereich von TRO15 + stInOutJamEntr := "DB_JamArea____".stJam____.stData, // TODO(E-Planung) + arInOutJamFinger := "DB_JamArea____".stJam____.arCarrier, // TODO(E-Planung) - Staubereich nach TRO18 + stInOutJamFinger := "DB_JamArea____".stJam____.stData, // TODO(E-Planung) + stInOutMachineState := #stInOutControlUnitCabinet, // TODO(E-Planung) - Schaltschrank stInOutCognexInterface := #stCognexInterfaceDummy, - arInOutJamEntr1 := "DB_JamArea____".stJam____.arCarrier, // TODO(E-Planung) - Staubereich von TRO15 - stInOutJamEntr1 := "DB_JamArea____".stJam____.stData, - arInOutJamExit2 := "DB_JamArea____".stJam____.arCarrier, // TODO(E-Planung) - Staubereich nach TRO18 - stInOutJamExit2 := "DB_JamArea____".stJam____.stData, - xOutStopper1 => "MB____", // TODO(E-Planung) - xOutVarioMotor => "MA____", // TODO(E-Planung) stInOutHMI := "DB_Interface_HMI".stTRO.TRO17, - nOutStateLast => "DB_GLOB_TroState".arTroState["cMainTro____"]); // TODO(E-Planung) + nOutStateLast => "DB_GLOB_TroState".arTroState["cMainTro____"], // TODO(E-Planung) + xOutStopper => "MB____", // TODO(E-Planung) + xOutVarioMotor => "MA____"); // TODO(E-Planung) + END_REGION REGION TRO19 (1Sep) Sep 0020 @@ -932,9 +1039,10 @@ REGION TRO19 (1Sep) Sep 0020 // Vorgaenger: TRO16 // Nachfolger: SYS3, TRO20 // Einstufung: mittel + // Aufbau nach Template FB_ILS_MTRO_1Sep.scl.j2 (Referenz: doc/TRO_Katalog/scl_templates) // Separator 1 = Bauteil 0020 aus dem Layout - #TRO19.stInSeparator1.Settings.nSeparatorNo := "cSep_____"; // TODO(E-Planung) + #TRO19.stInSeparator1.Settings.nSeparatorNo := "cSep_____"; // TODO(E-Planung) #TRO19.stInSeparator1.Settings.tDelayToNextItem := "TimeForSepWaiting_Short"; #TRO19.stInSeparator1.Settings.tTrailingTime := t#600ms; // TODO(E-Planung): pruefen #TRO19.stInSeparator1.Settings.tHandlingTime := t#200ms; // TODO(E-Planung): pruefen @@ -943,26 +1051,31 @@ REGION TRO19 (1Sep) Sep 0020 #TRO19.stInSeparator1.Settings.xPluggedPart := FALSE; #TRO19.stInSeparator1.Settings.xPluggedScanner := FALSE; #TRO19.stInSeparator1.stSenInSep := "DB_Inputs".Sensors["cInBG____"]; // TODO(E-Planung) - #TRO19.stInSeparator1.Settings.tSenFree := T#1500ms; // TODO(E-Planung): pruefen - #TRO19.stInSeparator1.Settings.tSenWait := T#4000ms; // TODO(E-Planung): pruefen + #TRO19.stInSenJam2 := "DB_Inputs".Sensors["cInBG____"]; // TODO(E-Planung) + #TRO19.stInSenJam3 := "DB_Inputs".Sensors["cInBG____"]; // TODO(E-Planung) - #TRO19.stInPriorityManager.xReleaseOk := TRUE; + #TRO19.stInSeparator1.Settings.tSenFree := T#1500ms; // TODO(E-Planung): pruefen + #TRO19.stInSeparator1.Settings.tSenWait := T#4000ms; // TODO(E-Planung): pruefen + + #TRO19.stInPriorityManager.xReleaseOk := TRUE; // braucht keine Vorfahrtsregelung #TRO19(nInMainTroNo := "cMainTro____", // TODO(E-Planung) xInSftyOk := "DB_InterfaceSafety".stFromSafety.EStopMain.Q, // TODO(E-Planung) xInAllRdyToStart := TRUE, + xInCarouselRun := #fbCarousel____.xOutConveyorFullSpeed, // TODO(E-Planung) - nur am Kreisel, sonst Zeile loeschen xInRelease := "DB_TRO_TEST".TRO19, - stInOutMachineState := #stInOutControlUnitCabinet, + stInOutMachineState := #stInOutControlUnitCabinet, // TODO(E-Planung) - Schaltschrank stInOutCognexInterface := #stCognexInterfaceDummy, arInOutJamEntr1 := "DB_JamArea____".stJam____.arCarrier, // TODO(E-Planung) - Staubereich von TRO16 - stInOutJamEntr1 := "DB_JamArea____".stJam____.stData, + stInOutJamEntr1 := "DB_JamArea____".stJam____.stData, // TODO(E-Planung) arInOutJamExit2 := "DB_JamArea____".stJam____.arCarrier, // TODO(E-Planung) - Staubereich nach SYS3 (Station, kein TRO) - stInOutJamExit2 := "DB_JamArea____".stJam____.stData, + stInOutJamExit2 := "DB_JamArea____".stJam____.stData, // TODO(E-Planung) arInOutJamExit3 := "DB_JamArea____".stJam____.arCarrier, // TODO(E-Planung) - Staubereich nach TRO20 - stInOutJamExit3 := "DB_JamArea____".stJam____.stData, + stInOutJamExit3 := "DB_JamArea____".stJam____.stData, // TODO(E-Planung) xOutStopper1 => "MB____", // TODO(E-Planung) - stInOutHMI := "DB_Interface_HMI".stTRO.TRO19, - nOutStateLast => "DB_GLOB_TroState".arTroState["cMainTro____"]); // TODO(E-Planung) + nOutStateLast => "DB_GLOB_TroState".arTroState["cMainTro____"], // TODO(E-Planung) + stInOutHMI := "DB_Interface_HMI".stTRO.TRO19); + END_REGION REGION TRO18 (1Sep) Sep 0044 @@ -970,9 +1083,10 @@ REGION TRO18 (1Sep) Sep 0044 // Vorgaenger: TRO17 // Nachfolger: TRO16 // Einstufung: mittel + // Aufbau nach Template FB_ILS_MTRO_1Sep.scl.j2 (Referenz: doc/TRO_Katalog/scl_templates) // Separator 1 = Bauteil 0044 aus dem Layout - #TRO18.stInSeparator1.Settings.nSeparatorNo := "cSep_____"; // TODO(E-Planung) + #TRO18.stInSeparator1.Settings.nSeparatorNo := "cSep_____"; // TODO(E-Planung) #TRO18.stInSeparator1.Settings.tDelayToNextItem := "TimeForSepWaiting_Short"; #TRO18.stInSeparator1.Settings.tTrailingTime := t#600ms; // TODO(E-Planung): pruefen #TRO18.stInSeparator1.Settings.tHandlingTime := t#200ms; // TODO(E-Planung): pruefen @@ -981,24 +1095,28 @@ REGION TRO18 (1Sep) Sep 0044 #TRO18.stInSeparator1.Settings.xPluggedPart := FALSE; #TRO18.stInSeparator1.Settings.xPluggedScanner := FALSE; #TRO18.stInSeparator1.stSenInSep := "DB_Inputs".Sensors["cInBG____"]; // TODO(E-Planung) - #TRO18.stInSeparator1.Settings.tSenFree := T#1500ms; // TODO(E-Planung): pruefen - #TRO18.stInSeparator1.Settings.tSenWait := T#4000ms; // TODO(E-Planung): pruefen + #TRO18.stInSenJam2 := "DB_Inputs".Sensors["cInBG____"]; // TODO(E-Planung) - #TRO18.stInPriorityManager.xReleaseOk := TRUE; + #TRO18.stInSeparator1.Settings.tSenFree := T#1500ms; // TODO(E-Planung): pruefen + #TRO18.stInSeparator1.Settings.tSenWait := T#4000ms; // TODO(E-Planung): pruefen + + #TRO18.stInPriorityManager.xReleaseOk := TRUE; // braucht keine Vorfahrtsregelung #TRO18(nInMainTroNo := "cMainTro____", // TODO(E-Planung) xInSftyOk := "DB_InterfaceSafety".stFromSafety.EStopMain.Q, // TODO(E-Planung) xInAllRdyToStart := TRUE, + xInCarouselRun := #fbCarousel____.xOutConveyorFullSpeed, // TODO(E-Planung) - nur am Kreisel, sonst Zeile loeschen xInRelease := "DB_TRO_TEST".TRO18, - stInOutMachineState := #stInOutControlUnitCabinet, + stInOutMachineState := #stInOutControlUnitCabinet, // TODO(E-Planung) - Schaltschrank stInOutCognexInterface := #stCognexInterfaceDummy, arInOutJamEntr1 := "DB_JamArea____".stJam____.arCarrier, // TODO(E-Planung) - Staubereich von TRO17 - stInOutJamEntr1 := "DB_JamArea____".stJam____.stData, + stInOutJamEntr1 := "DB_JamArea____".stJam____.stData, // TODO(E-Planung) arInOutJamExit2 := "DB_JamArea____".stJam____.arCarrier, // TODO(E-Planung) - Staubereich nach TRO16 - stInOutJamExit2 := "DB_JamArea____".stJam____.stData, + stInOutJamExit2 := "DB_JamArea____".stJam____.stData, // TODO(E-Planung) xOutStopper1 => "MB____", // TODO(E-Planung) - stInOutHMI := "DB_Interface_HMI".stTRO.TRO18, - nOutStateLast => "DB_GLOB_TroState".arTroState["cMainTro____"]); // TODO(E-Planung) + nOutStateLast => "DB_GLOB_TroState".arTroState["cMainTro____"], // TODO(E-Planung) + stInOutHMI := "DB_Interface_HMI".stTRO.TRO18); + END_REGION END_FUNCTION_BLOCK diff --git a/tests/fixtures/scl/mubea_FB_Main_templates.scl b/tests/fixtures/scl/mubea_FB_Main_templates.scl index fa112bb..eb02b33 100644 --- a/tests/fixtures/scl/mubea_FB_Main_templates.scl +++ b/tests/fixtures/scl/mubea_FB_Main_templates.scl @@ -16,8 +16,8 @@ // Reihenfolge der REGIONs = Materialfluss. // Anfang bei TRO03: Materialeingang ueber SYS1. // -// Aus Template : FB_ILS_MTRO_1Sep1Swi -// Generisch : FB_ILS_MTRO_1Sep, FB_ILS_MTRO_2Sep2Swi, FB_ILS_MTRO_PinStore_Auto, FB_ILS_MTRO_Vario (kein Template - von Hand pruefen) +// Aus Template : FB_ILS_MTRO_1Sep, FB_ILS_MTRO_1Sep1Swi, FB_ILS_MTRO_PinStore_Auto, FB_ILS_MTRO_Vario +// Generisch : FB_ILS_MTRO_2Sep2Swi (kein Template - von Hand pruefen) // ============================================================ FUNCTION_BLOCK "FB_Main" @@ -51,9 +51,10 @@ REGION TRO03 (1Sep) Sep 0042 // Vorgaenger: SYS1, TRO04 // Nachfolger: TRO05 // Einstufung: mittel + // Aufbau nach Template FB_ILS_MTRO_1Sep.scl.j2 (Referenz: doc/TRO_Katalog/scl_templates) // Separator 1 = Bauteil 0042 aus dem Layout - #TRO03.stInSeparator1.Settings.nSeparatorNo := "cSep_____"; // TODO(E-Planung) + #TRO03.stInSeparator1.Settings.nSeparatorNo := "cSep_____"; // TODO(E-Planung) #TRO03.stInSeparator1.Settings.tDelayToNextItem := "TimeForSepWaiting_Short"; #TRO03.stInSeparator1.Settings.tTrailingTime := t#600ms; // TODO(E-Planung): pruefen #TRO03.stInSeparator1.Settings.tHandlingTime := t#200ms; // TODO(E-Planung): pruefen @@ -62,26 +63,30 @@ REGION TRO03 (1Sep) Sep 0042 #TRO03.stInSeparator1.Settings.xPluggedPart := FALSE; #TRO03.stInSeparator1.Settings.xPluggedScanner := FALSE; #TRO03.stInSeparator1.stSenInSep := "DB_Inputs".Sensors["cInBG____"]; // TODO(E-Planung) - #TRO03.stInSeparator1.Settings.tSenFree := T#1500ms; // TODO(E-Planung): pruefen - #TRO03.stInSeparator1.Settings.tSenWait := T#4000ms; // TODO(E-Planung): pruefen + #TRO03.stInSenJam2 := "DB_Inputs".Sensors["cInBG____"]; // TODO(E-Planung) - #TRO03.stInPriorityManager.xReleaseOk := TRUE; + #TRO03.stInSeparator1.Settings.tSenFree := T#1500ms; // TODO(E-Planung): pruefen + #TRO03.stInSeparator1.Settings.tSenWait := T#4000ms; // TODO(E-Planung): pruefen + + #TRO03.stInPriorityManager.xReleaseOk := TRUE; // braucht keine Vorfahrtsregelung #TRO03(nInMainTroNo := "cMainTro____", // TODO(E-Planung) xInSftyOk := "DB_InterfaceSafety".stFromSafety.EStopMain.Q, // TODO(E-Planung) xInAllRdyToStart := TRUE, + xInCarouselRun := #fbCarousel____.xOutConveyorFullSpeed, // TODO(E-Planung) - nur am Kreisel, sonst Zeile loeschen xInRelease := "DB_TRO_TEST".TRO03, - stInOutMachineState := #stInOutControlUnitCabinet, + stInOutMachineState := #stInOutControlUnitCabinet, // TODO(E-Planung) - Schaltschrank stInOutCognexInterface := #stCognexInterfaceDummy, arInOutJamEntr1 := "DB_JamArea____".stJam____.arCarrier, // TODO(E-Planung) - Staubereich von SYS1 (Station, kein TRO) - stInOutJamEntr1 := "DB_JamArea____".stJam____.stData, + stInOutJamEntr1 := "DB_JamArea____".stJam____.stData, // TODO(E-Planung) arInOutJamEntr2 := "DB_JamArea____".stJam____.arCarrier, // TODO(E-Planung) - Staubereich von TRO04 - stInOutJamEntr2 := "DB_JamArea____".stJam____.stData, + stInOutJamEntr2 := "DB_JamArea____".stJam____.stData, // TODO(E-Planung) arInOutJamExit2 := "DB_JamArea____".stJam____.arCarrier, // TODO(E-Planung) - Staubereich nach TRO05 - stInOutJamExit2 := "DB_JamArea____".stJam____.stData, + stInOutJamExit2 := "DB_JamArea____".stJam____.stData, // TODO(E-Planung) xOutStopper1 => "MB____", // TODO(E-Planung) - stInOutHMI := "DB_Interface_HMI".stTRO.TRO03, - nOutStateLast => "DB_GLOB_TroState".arTroState["cMainTro____"]); // TODO(E-Planung) + nOutStateLast => "DB_GLOB_TroState".arTroState["cMainTro____"], // TODO(E-Planung) + stInOutHMI := "DB_Interface_HMI".stTRO.TRO03); + END_REGION REGION TRO05 (1Sep) Sep 0044 @@ -89,9 +94,10 @@ REGION TRO05 (1Sep) Sep 0044 // Vorgaenger: TRO03 // Nachfolger: TRO18 // Einstufung: mittel + // Aufbau nach Template FB_ILS_MTRO_1Sep.scl.j2 (Referenz: doc/TRO_Katalog/scl_templates) // Separator 1 = Bauteil 0044 aus dem Layout - #TRO05.stInSeparator1.Settings.nSeparatorNo := "cSep_____"; // TODO(E-Planung) + #TRO05.stInSeparator1.Settings.nSeparatorNo := "cSep_____"; // TODO(E-Planung) #TRO05.stInSeparator1.Settings.tDelayToNextItem := "TimeForSepWaiting_Short"; #TRO05.stInSeparator1.Settings.tTrailingTime := t#600ms; // TODO(E-Planung): pruefen #TRO05.stInSeparator1.Settings.tHandlingTime := t#200ms; // TODO(E-Planung): pruefen @@ -100,24 +106,28 @@ REGION TRO05 (1Sep) Sep 0044 #TRO05.stInSeparator1.Settings.xPluggedPart := FALSE; #TRO05.stInSeparator1.Settings.xPluggedScanner := FALSE; #TRO05.stInSeparator1.stSenInSep := "DB_Inputs".Sensors["cInBG____"]; // TODO(E-Planung) - #TRO05.stInSeparator1.Settings.tSenFree := T#1500ms; // TODO(E-Planung): pruefen - #TRO05.stInSeparator1.Settings.tSenWait := T#4000ms; // TODO(E-Planung): pruefen + #TRO05.stInSenJam2 := "DB_Inputs".Sensors["cInBG____"]; // TODO(E-Planung) - #TRO05.stInPriorityManager.xReleaseOk := TRUE; + #TRO05.stInSeparator1.Settings.tSenFree := T#1500ms; // TODO(E-Planung): pruefen + #TRO05.stInSeparator1.Settings.tSenWait := T#4000ms; // TODO(E-Planung): pruefen + + #TRO05.stInPriorityManager.xReleaseOk := TRUE; // braucht keine Vorfahrtsregelung #TRO05(nInMainTroNo := "cMainTro____", // TODO(E-Planung) xInSftyOk := "DB_InterfaceSafety".stFromSafety.EStopMain.Q, // TODO(E-Planung) xInAllRdyToStart := TRUE, + xInCarouselRun := #fbCarousel____.xOutConveyorFullSpeed, // TODO(E-Planung) - nur am Kreisel, sonst Zeile loeschen xInRelease := "DB_TRO_TEST".TRO05, - stInOutMachineState := #stInOutControlUnitCabinet, + stInOutMachineState := #stInOutControlUnitCabinet, // TODO(E-Planung) - Schaltschrank stInOutCognexInterface := #stCognexInterfaceDummy, arInOutJamEntr1 := "DB_JamArea____".stJam____.arCarrier, // TODO(E-Planung) - Staubereich von TRO03 - stInOutJamEntr1 := "DB_JamArea____".stJam____.stData, + stInOutJamEntr1 := "DB_JamArea____".stJam____.stData, // TODO(E-Planung) arInOutJamExit2 := "DB_JamArea____".stJam____.arCarrier, // TODO(E-Planung) - Staubereich nach TRO18 - stInOutJamExit2 := "DB_JamArea____".stJam____.stData, + stInOutJamExit2 := "DB_JamArea____".stJam____.stData, // TODO(E-Planung) xOutStopper1 => "MB____", // TODO(E-Planung) - stInOutHMI := "DB_Interface_HMI".stTRO.TRO05, - nOutStateLast => "DB_GLOB_TroState".arTroState["cMainTro____"]); // TODO(E-Planung) + nOutStateLast => "DB_GLOB_TroState".arTroState["cMainTro____"], // TODO(E-Planung) + stInOutHMI := "DB_Interface_HMI".stTRO.TRO05); + END_REGION REGION TRO18 (PinStore_Auto) Sep 0066, 0069, 0072, 0075, 0078, 0081, 0084, 0087, 0090, 0093, 0096, 0099, 0102, 0105, 0108, 0111, 0114, 0117, 0120, 0123 @@ -125,45 +135,339 @@ REGION TRO18 (PinStore_Auto) Sep 0066, 0069, 0072, 0075, 0078, 0081, 0084, 0087, // Vorgaenger: TRO05, TRO12 // Nachfolger: TRO07, TRO10 // Einstufung: hoch + // Aufbau nach Template FB_ILS_MTRO_PinStore_Auto.scl.j2 (Referenz: doc/TRO_Katalog/scl_templates) + // TODO(E-Planung): 2 Zulaeufe / 2 Ablaeufe im Layout - + // der FB hat je nur einen Staubereich (JamEntr/JamExit, dazu JamBypass) + // Linien (Separatoren aus dem Layout): 0066, 0069, 0072, 0075, 0078, 0081, 0084, 0087, 0090, 0093, 0096, 0099, 0102, 0105, 0108, 0111, 0114, 0117, 0120, 0123 - // Separator 1 = Bauteil 0066 aus dem Layout - #TRO18.stInSeparator1.Settings.nSeparatorNo := "cSep_____"; // TODO(E-Planung) - #TRO18.stInSeparator1.Settings.tDelayToNextItem := "TimeForSepWaiting_Short"; - #TRO18.stInSeparator1.Settings.tTrailingTime := t#600ms; // TODO(E-Planung): pruefen - #TRO18.stInSeparator1.Settings.tHandlingTime := t#200ms; // TODO(E-Planung): pruefen - #TRO18.stInSeparator1.Settings.tJam := "TimeForSepJam"; - #TRO18.stInSeparator1.Settings.xPluggedJam := TRUE; - #TRO18.stInSeparator1.Settings.xPluggedPart := FALSE; - #TRO18.stInSeparator1.Settings.xPluggedScanner := TRUE; - #TRO18.stInSeparator1.stSenInSep := "DB_Inputs".Sensors["cInBG____"]; // TODO(E-Planung) - #TRO18.stInSeparator1.Settings.tSenFree := T#1500ms; // TODO(E-Planung): pruefen - #TRO18.stInSeparator1.Settings.tSenWait := T#4000ms; // TODO(E-Planung): pruefen + REGION Encoder Settings + #TRO18.stInEncoderParameter.nPosActDif := #fbEncoder____.nOutPosActDif; // TODO(E-Planung) + #TRO18.stInEncoderParameter.nPosPitchPart := #fbEncoder____.nOutPosPitchPart; // TODO(E-Planung) + END_REGION - #TRO18.stInBarcodeReader.Settings.xActivateCheckASCI := TRUE; - #TRO18.stInBarcodeReader.Settings.tTimeout := T#3000ms; - // TODO(E-Planung): Cognex-Interface verdrahten (#arCognexInterface["cScanner____"]) + REGION ConveyorStation Settings + #TRO18.stInSettings.nDestGeneral := "cDest____"; // TODO(E-Planung) + #TRO18.stInSettings.nConvStations := "cHooksSorterMaxPin____"; // TODO(E-Planung) + #TRO18.stInSettings.nStationsMax := "cStationsMax____"; // TODO(E-Planung) + #TRO18.stInSettings.nStorageThreshold := "cNoPositionsBlock____"; // TODO(E-Planung) + #TRO18.stInSettings.nNoOfLines := 20; + END_REGION - // TODO(E-Planung): Linienspeicher mit 19 Linien - Parametrierung je Linie + REGION Pin Query / "Zappler" + #TRO18.stInSensorReference := "DB_Inputs".Sensors["cInBG____"]; // TODO(E-Planung) + END_REGION - #TRO18.stInPriorityManager.xReleaseOk := TRUE; + REGION Barcode Reader In + #TRO18.stInBarcodeReader.Settings.nStation := ____; // TODO(E-Planung) + #TRO18.stInBarcodeReader.Settings.nScannerPurpose := 0; + #TRO18.stInBarcodeReader.Settings.tTimeout := T#5s; + #TRO18.stInBarcodeReader.Settings.xActivateCheckASCI := TRUE; - #TRO18(nInMainTroNo := "cMainTro____", // TODO(E-Planung) - xInSftyOk := "DB_InterfaceSafety".stFromSafety.EStopMain.Q, // TODO(E-Planung) + #arCognexInterface["cScanner____"].xInCamTriggerReady := "bx____-TriggerReady"; // TODO(E-Planung) + #arCognexInterface["cScanner____"].xInCamTriggerAck := "bx____-TriggerAck"; // TODO(E-Planung) + #arCognexInterface["cScanner____"].xInCamResultsAvailable := "bx____-Results Available"; // TODO(E-Planung) + #arCognexInterface["cScanner____"].xInCamGeneralFault := "bx____-General Fault"; // TODO(E-Planung) + #arCognexInterface["cScanner____"].hwInCamInspectionResults := "BX____~Ergebnisse_–_64_Bytes_1"; // TODO(E-Planung) + END_REGION + + REGION Separator Settings + REGION Sep Pin + // Einschleus-Separator = Bauteil ? aus dem Layout + #TRO18.stInSeparatorPin.stSenTrolley := "DB_Inputs".Sensors["cInBG____"]; // TODO(E-Planung) + #TRO18.stInSeparatorPin.stSettings.tHandlingTime := T#0ms; // TODO(E-Planung): pruefen + #TRO18.stInSeparatorPin.stSettings.tTrailingTime := T#50ms; // TODO(E-Planung): pruefen + #TRO18.stInSeparatorPin.stSettings.xPluggedScanner := TRUE; + END_REGION + + REGION Sep Store 1 + // Linie 1 = Separator 0066 aus dem Layout + #nActNo := 1; + #TRO18.arInSep[#nActNo].stSettings.nJamLength := "cStorage____ExitJam"; // TODO(E-Planung) + #TRO18.arInSep[#nActNo].stSenTrolley := "DB_Inputs".Sensors["cInBG____"]; // TODO(E-Planung) + #TRO18.arInSep[#nActNo].stSettings.tHandlingTime := "cTimeSepHandlingStorageLine"; + #TRO18.arInSep[#nActNo].stSettings.tTrailingTime := "cTimeSepTrailingStorageLine"; + #TRO18.arInSep[#nActNo].stSettings.xPluggedScanner := FALSE; + END_REGION + + REGION Sep Store 2 + // Linie 2 = Separator 0069 aus dem Layout + #nActNo := 2; + #TRO18.arInSep[#nActNo].stSettings.nJamLength := "cStorage____ExitJam"; // TODO(E-Planung) + #TRO18.arInSep[#nActNo].stSenTrolley := "DB_Inputs".Sensors["cInBG____"]; // TODO(E-Planung) + #TRO18.arInSep[#nActNo].stSettings.tHandlingTime := "cTimeSepHandlingStorageLine"; + #TRO18.arInSep[#nActNo].stSettings.tTrailingTime := "cTimeSepTrailingStorageLine"; + #TRO18.arInSep[#nActNo].stSettings.xPluggedScanner := FALSE; + END_REGION + + REGION Sep Store 3 + // Linie 3 = Separator 0072 aus dem Layout + #nActNo := 3; + #TRO18.arInSep[#nActNo].stSettings.nJamLength := "cStorage____ExitJam"; // TODO(E-Planung) + #TRO18.arInSep[#nActNo].stSenTrolley := "DB_Inputs".Sensors["cInBG____"]; // TODO(E-Planung) + #TRO18.arInSep[#nActNo].stSettings.tHandlingTime := "cTimeSepHandlingStorageLine"; + #TRO18.arInSep[#nActNo].stSettings.tTrailingTime := "cTimeSepTrailingStorageLine"; + #TRO18.arInSep[#nActNo].stSettings.xPluggedScanner := FALSE; + END_REGION + + REGION Sep Store 4 + // Linie 4 = Separator 0075 aus dem Layout + #nActNo := 4; + #TRO18.arInSep[#nActNo].stSettings.nJamLength := "cStorage____ExitJam"; // TODO(E-Planung) + #TRO18.arInSep[#nActNo].stSenTrolley := "DB_Inputs".Sensors["cInBG____"]; // TODO(E-Planung) + #TRO18.arInSep[#nActNo].stSettings.tHandlingTime := "cTimeSepHandlingStorageLine"; + #TRO18.arInSep[#nActNo].stSettings.tTrailingTime := "cTimeSepTrailingStorageLine"; + #TRO18.arInSep[#nActNo].stSettings.xPluggedScanner := FALSE; + END_REGION + + REGION Sep Store 5 + // Linie 5 = Separator 0078 aus dem Layout + #nActNo := 5; + #TRO18.arInSep[#nActNo].stSettings.nJamLength := "cStorage____ExitJam"; // TODO(E-Planung) + #TRO18.arInSep[#nActNo].stSenTrolley := "DB_Inputs".Sensors["cInBG____"]; // TODO(E-Planung) + #TRO18.arInSep[#nActNo].stSettings.tHandlingTime := "cTimeSepHandlingStorageLine"; + #TRO18.arInSep[#nActNo].stSettings.tTrailingTime := "cTimeSepTrailingStorageLine"; + #TRO18.arInSep[#nActNo].stSettings.xPluggedScanner := FALSE; + END_REGION + + REGION Sep Store 6 + // Linie 6 = Separator 0081 aus dem Layout + #nActNo := 6; + #TRO18.arInSep[#nActNo].stSettings.nJamLength := "cStorage____ExitJam"; // TODO(E-Planung) + #TRO18.arInSep[#nActNo].stSenTrolley := "DB_Inputs".Sensors["cInBG____"]; // TODO(E-Planung) + #TRO18.arInSep[#nActNo].stSettings.tHandlingTime := "cTimeSepHandlingStorageLine"; + #TRO18.arInSep[#nActNo].stSettings.tTrailingTime := "cTimeSepTrailingStorageLine"; + #TRO18.arInSep[#nActNo].stSettings.xPluggedScanner := FALSE; + END_REGION + + REGION Sep Store 7 + // Linie 7 = Separator 0084 aus dem Layout + #nActNo := 7; + #TRO18.arInSep[#nActNo].stSettings.nJamLength := "cStorage____ExitJam"; // TODO(E-Planung) + #TRO18.arInSep[#nActNo].stSenTrolley := "DB_Inputs".Sensors["cInBG____"]; // TODO(E-Planung) + #TRO18.arInSep[#nActNo].stSettings.tHandlingTime := "cTimeSepHandlingStorageLine"; + #TRO18.arInSep[#nActNo].stSettings.tTrailingTime := "cTimeSepTrailingStorageLine"; + #TRO18.arInSep[#nActNo].stSettings.xPluggedScanner := FALSE; + END_REGION + + REGION Sep Store 8 + // Linie 8 = Separator 0087 aus dem Layout + #nActNo := 8; + #TRO18.arInSep[#nActNo].stSettings.nJamLength := "cStorage____ExitJam"; // TODO(E-Planung) + #TRO18.arInSep[#nActNo].stSenTrolley := "DB_Inputs".Sensors["cInBG____"]; // TODO(E-Planung) + #TRO18.arInSep[#nActNo].stSettings.tHandlingTime := "cTimeSepHandlingStorageLine"; + #TRO18.arInSep[#nActNo].stSettings.tTrailingTime := "cTimeSepTrailingStorageLine"; + #TRO18.arInSep[#nActNo].stSettings.xPluggedScanner := FALSE; + END_REGION + + REGION Sep Store 9 + // Linie 9 = Separator 0090 aus dem Layout + #nActNo := 9; + #TRO18.arInSep[#nActNo].stSettings.nJamLength := "cStorage____ExitJam"; // TODO(E-Planung) + #TRO18.arInSep[#nActNo].stSenTrolley := "DB_Inputs".Sensors["cInBG____"]; // TODO(E-Planung) + #TRO18.arInSep[#nActNo].stSettings.tHandlingTime := "cTimeSepHandlingStorageLine"; + #TRO18.arInSep[#nActNo].stSettings.tTrailingTime := "cTimeSepTrailingStorageLine"; + #TRO18.arInSep[#nActNo].stSettings.xPluggedScanner := FALSE; + END_REGION + + REGION Sep Store 10 + // Linie 10 = Separator 0093 aus dem Layout + #nActNo := 10; + #TRO18.arInSep[#nActNo].stSettings.nJamLength := "cStorage____ExitJam"; // TODO(E-Planung) + #TRO18.arInSep[#nActNo].stSenTrolley := "DB_Inputs".Sensors["cInBG____"]; // TODO(E-Planung) + #TRO18.arInSep[#nActNo].stSettings.tHandlingTime := "cTimeSepHandlingStorageLine"; + #TRO18.arInSep[#nActNo].stSettings.tTrailingTime := "cTimeSepTrailingStorageLine"; + #TRO18.arInSep[#nActNo].stSettings.xPluggedScanner := FALSE; + END_REGION + + REGION Sep Store 11 + // Linie 11 = Separator 0096 aus dem Layout + #nActNo := 11; + #TRO18.arInSep[#nActNo].stSettings.nJamLength := "cStorage____ExitJam"; // TODO(E-Planung) + #TRO18.arInSep[#nActNo].stSenTrolley := "DB_Inputs".Sensors["cInBG____"]; // TODO(E-Planung) + #TRO18.arInSep[#nActNo].stSettings.tHandlingTime := "cTimeSepHandlingStorageLine"; + #TRO18.arInSep[#nActNo].stSettings.tTrailingTime := "cTimeSepTrailingStorageLine"; + #TRO18.arInSep[#nActNo].stSettings.xPluggedScanner := FALSE; + END_REGION + + REGION Sep Store 12 + // Linie 12 = Separator 0099 aus dem Layout + #nActNo := 12; + #TRO18.arInSep[#nActNo].stSettings.nJamLength := "cStorage____ExitJam"; // TODO(E-Planung) + #TRO18.arInSep[#nActNo].stSenTrolley := "DB_Inputs".Sensors["cInBG____"]; // TODO(E-Planung) + #TRO18.arInSep[#nActNo].stSettings.tHandlingTime := "cTimeSepHandlingStorageLine"; + #TRO18.arInSep[#nActNo].stSettings.tTrailingTime := "cTimeSepTrailingStorageLine"; + #TRO18.arInSep[#nActNo].stSettings.xPluggedScanner := FALSE; + END_REGION + + REGION Sep Store 13 + // Linie 13 = Separator 0102 aus dem Layout + #nActNo := 13; + #TRO18.arInSep[#nActNo].stSettings.nJamLength := "cStorage____ExitJam"; // TODO(E-Planung) + #TRO18.arInSep[#nActNo].stSenTrolley := "DB_Inputs".Sensors["cInBG____"]; // TODO(E-Planung) + #TRO18.arInSep[#nActNo].stSettings.tHandlingTime := "cTimeSepHandlingStorageLine"; + #TRO18.arInSep[#nActNo].stSettings.tTrailingTime := "cTimeSepTrailingStorageLine"; + #TRO18.arInSep[#nActNo].stSettings.xPluggedScanner := FALSE; + END_REGION + + REGION Sep Store 14 + // Linie 14 = Separator 0105 aus dem Layout + #nActNo := 14; + #TRO18.arInSep[#nActNo].stSettings.nJamLength := "cStorage____ExitJam"; // TODO(E-Planung) + #TRO18.arInSep[#nActNo].stSenTrolley := "DB_Inputs".Sensors["cInBG____"]; // TODO(E-Planung) + #TRO18.arInSep[#nActNo].stSettings.tHandlingTime := "cTimeSepHandlingStorageLine"; + #TRO18.arInSep[#nActNo].stSettings.tTrailingTime := "cTimeSepTrailingStorageLine"; + #TRO18.arInSep[#nActNo].stSettings.xPluggedScanner := FALSE; + END_REGION + + REGION Sep Store 15 + // Linie 15 = Separator 0108 aus dem Layout + #nActNo := 15; + #TRO18.arInSep[#nActNo].stSettings.nJamLength := "cStorage____ExitJam"; // TODO(E-Planung) + #TRO18.arInSep[#nActNo].stSenTrolley := "DB_Inputs".Sensors["cInBG____"]; // TODO(E-Planung) + #TRO18.arInSep[#nActNo].stSettings.tHandlingTime := "cTimeSepHandlingStorageLine"; + #TRO18.arInSep[#nActNo].stSettings.tTrailingTime := "cTimeSepTrailingStorageLine"; + #TRO18.arInSep[#nActNo].stSettings.xPluggedScanner := FALSE; + END_REGION + + REGION Sep Store 16 + // Linie 16 = Separator 0111 aus dem Layout + #nActNo := 16; + #TRO18.arInSep[#nActNo].stSettings.nJamLength := "cStorage____ExitJam"; // TODO(E-Planung) + #TRO18.arInSep[#nActNo].stSenTrolley := "DB_Inputs".Sensors["cInBG____"]; // TODO(E-Planung) + #TRO18.arInSep[#nActNo].stSettings.tHandlingTime := "cTimeSepHandlingStorageLine"; + #TRO18.arInSep[#nActNo].stSettings.tTrailingTime := "cTimeSepTrailingStorageLine"; + #TRO18.arInSep[#nActNo].stSettings.xPluggedScanner := FALSE; + END_REGION + + REGION Sep Store 17 + // Linie 17 = Separator 0114 aus dem Layout + #nActNo := 17; + #TRO18.arInSep[#nActNo].stSettings.nJamLength := "cStorage____ExitJam"; // TODO(E-Planung) + #TRO18.arInSep[#nActNo].stSenTrolley := "DB_Inputs".Sensors["cInBG____"]; // TODO(E-Planung) + #TRO18.arInSep[#nActNo].stSettings.tHandlingTime := "cTimeSepHandlingStorageLine"; + #TRO18.arInSep[#nActNo].stSettings.tTrailingTime := "cTimeSepTrailingStorageLine"; + #TRO18.arInSep[#nActNo].stSettings.xPluggedScanner := FALSE; + END_REGION + + REGION Sep Store 18 + // Linie 18 = Separator 0117 aus dem Layout + #nActNo := 18; + #TRO18.arInSep[#nActNo].stSettings.nJamLength := "cStorage____ExitJam"; // TODO(E-Planung) + #TRO18.arInSep[#nActNo].stSenTrolley := "DB_Inputs".Sensors["cInBG____"]; // TODO(E-Planung) + #TRO18.arInSep[#nActNo].stSettings.tHandlingTime := "cTimeSepHandlingStorageLine"; + #TRO18.arInSep[#nActNo].stSettings.tTrailingTime := "cTimeSepTrailingStorageLine"; + #TRO18.arInSep[#nActNo].stSettings.xPluggedScanner := FALSE; + END_REGION + + REGION Sep Store 19 + // Linie 19 = Separator 0120 aus dem Layout + #nActNo := 19; + #TRO18.arInSep[#nActNo].stSettings.nJamLength := "cStorage____ExitJam"; // TODO(E-Planung) + #TRO18.arInSep[#nActNo].stSenTrolley := "DB_Inputs".Sensors["cInBG____"]; // TODO(E-Planung) + #TRO18.arInSep[#nActNo].stSettings.tHandlingTime := "cTimeSepHandlingStorageLine"; + #TRO18.arInSep[#nActNo].stSettings.tTrailingTime := "cTimeSepTrailingStorageLine"; + #TRO18.arInSep[#nActNo].stSettings.xPluggedScanner := FALSE; + END_REGION + + REGION Sep Store 20 + // Linie 20 = Separator 0123 aus dem Layout + #nActNo := 20; + #TRO18.arInSep[#nActNo].stSettings.nJamLength := "cStorage____ExitJam"; // TODO(E-Planung) + #TRO18.arInSep[#nActNo].stSenTrolley := "DB_Inputs".Sensors["cInBG____"]; // TODO(E-Planung) + #TRO18.arInSep[#nActNo].stSettings.tHandlingTime := "cTimeSepHandlingStorageLine"; + #TRO18.arInSep[#nActNo].stSettings.tTrailingTime := "cTimeSepTrailingStorageLine"; + #TRO18.arInSep[#nActNo].stSettings.xPluggedScanner := FALSE; + END_REGION + END_REGION + + REGION UnloadingStations Settings + #TRO18.xInQuitLocal := "SF____"; // TODO(E-Planung) + + #TRO18.arInJamSensor[1] := "DB_Inputs".Sensors["cInBG____"]; // TODO(E-Planung) + #TRO18.arInJamSensor[2] := "DB_Inputs".Sensors["cInBG____"]; // TODO(E-Planung) + #TRO18.arInJamSensor[3] := "DB_Inputs".Sensors["cInBG____"]; // TODO(E-Planung) + #TRO18.arInJamSensor[4] := "DB_Inputs".Sensors["cInBG____"]; // TODO(E-Planung) + #TRO18.arInJamSensor[5] := "DB_Inputs".Sensors["cInBG____"]; // TODO(E-Planung) + #TRO18.arInJamSensor[6] := "DB_Inputs".Sensors["cInBG____"]; // TODO(E-Planung) + #TRO18.arInJamSensor[7] := "DB_Inputs".Sensors["cInBG____"]; // TODO(E-Planung) + #TRO18.arInJamSensor[8] := "DB_Inputs".Sensors["cInBG____"]; // TODO(E-Planung) + #TRO18.arInJamSensor[9] := "DB_Inputs".Sensors["cInBG____"]; // TODO(E-Planung) + #TRO18.arInJamSensor[10] := "DB_Inputs".Sensors["cInBG____"]; // TODO(E-Planung) + #TRO18.arInJamSensor[11] := "DB_Inputs".Sensors["cInBG____"]; // TODO(E-Planung) + #TRO18.arInJamSensor[12] := "DB_Inputs".Sensors["cInBG____"]; // TODO(E-Planung) + #TRO18.arInJamSensor[13] := "DB_Inputs".Sensors["cInBG____"]; // TODO(E-Planung) + #TRO18.arInJamSensor[14] := "DB_Inputs".Sensors["cInBG____"]; // TODO(E-Planung) + #TRO18.arInJamSensor[15] := "DB_Inputs".Sensors["cInBG____"]; // TODO(E-Planung) + #TRO18.arInJamSensor[16] := "DB_Inputs".Sensors["cInBG____"]; // TODO(E-Planung) + #TRO18.arInJamSensor[17] := "DB_Inputs".Sensors["cInBG____"]; // TODO(E-Planung) + #TRO18.arInJamSensor[18] := "DB_Inputs".Sensors["cInBG____"]; // TODO(E-Planung) + #TRO18.arInJamSensor[19] := "DB_Inputs".Sensors["cInBG____"]; // TODO(E-Planung) + #TRO18.arInJamSensor[20] := "DB_Inputs".Sensors["cInBG____"]; // TODO(E-Planung) + END_REGION + + REGION Aufruf: TRO18 + #TRO18.stInPriorityManager.xReleaseOk := TRUE; + + #TRO18(xInSftyOk := "DB_InterfaceSafety".stFromSafety.EStopMain.Q, // TODO(E-Planung) + nInTestTarget := "IBN".nTestTarget____, // TODO(E-Planung) xInAllRdyToStart := TRUE, + xInCancel := "cTodoFalse", xInRelease := "DB_TRO_TEST".TRO18, - stInOutMachineState := #stInOutControlUnitCabinet, - stInOutCognexInterface := #stCognexInterfaceDummy, - arInOutJamEntr1 := "DB_JamArea____".stJam____.arCarrier, // TODO(E-Planung) - Staubereich von TRO05 - stInOutJamEntr1 := "DB_JamArea____".stJam____.stData, - arInOutJamEntr2 := "DB_JamArea____".stJam____.arCarrier, // TODO(E-Planung) - Staubereich von TRO12 - stInOutJamEntr2 := "DB_JamArea____".stJam____.stData, - arInOutJamExit2 := "DB_JamArea____".stJam____.arCarrier, // TODO(E-Planung) - Staubereich nach TRO07 - stInOutJamExit2 := "DB_JamArea____".stJam____.stData, - arInOutJamExit3 := "DB_JamArea____".stJam____.arCarrier, // TODO(E-Planung) - Staubereich nach TRO10 - stInOutJamExit3 := "DB_JamArea____".stJam____.stData, - xOutStopper1 => "MB____", // TODO(E-Planung) + xInConveyorRunIn := #fbSortConv____.xOutConveyorFullSpeed, // TODO(E-Planung) - Foerderer am Zulauf + xInConveyorRunOut := #fbExitConv____.xOutConveyorFullSpeed, // TODO(E-Planung) - Foerderer am Ablauf + stInOutControlUnitCabinet := #stInOutControlUnitCabinet, // TODO(E-Planung) - Schaltschrank + arInOutStorageLines := "DB_Storage____".arLine, // TODO(E-Planung) + arInOutJamEntr := "DB_JamArea____".stJam____.arCarrier, // TODO(E-Planung) - Staubereich von TRO05 + stInOutJamEntr := "DB_JamArea____".stJam____.stData, // TODO(E-Planung) + arInOutJamExit := "DB_JamArea____".stJam____.arCarrier, // TODO(E-Planung) - Staubereich nach TRO07 + stInOutJamExit := "DB_JamArea____".stJam____.stData, // TODO(E-Planung) + arInOutJamBypass := #arCarrierPlaceHolder, + stInOutJamBypass := #stJamDataPlaceHolder, stInOutHMI := "DB_Interface_HMI".stTRO.TRO18, - nOutStateLast => "DB_GLOB_TroState".arTroState["cMainTro____"]); // TODO(E-Planung) + stMFRStorageRemovalInterface := "DB_HandshakeStorage".Str_StorageRemoval.arrudt_StorageRemovalHandshakeTROsLvl1[____], // TODO(E-Planung) + xOutSeparatorPin => "MB____", // TODO(E-Planung) + stCognexInterfacePin := #arCognexInterface["cScanner____"], // TODO(E-Planung) + stConveyorStations := "DB_ConveyorStations".stConveyorStations____); // TODO(E-Planung) + + END_REGION + + REGION CARR_GLOB_CORRECTION + "FC_CARR_GLOB_CORRECTION"(xInStart := #TRO18.xOutCorrection, + nInBarcodeScan := #TRO18.nBarcodeResult, + nInStation := 0, // TODO(E-Planung) + arOutEventLogInfo => #arDummyEventCorrectionInfo, + InOutCarrierExpect := "DB_JamArea____".stJam____.arCarrier[1]); // TODO(E-Planung) + END_REGION + + REGION Barcode Reader Out + "bx____-TriggerEnable" := #arCognexInterface["cScanner____"].xOutCamTriggerEnable; // TODO(E-Planung) + "bx____-Trigger" := #arCognexInterface["cScanner____"].xOutCamTrigger; // TODO(E-Planung) + "bx____-ResultsAck" := #arCognexInterface["cScanner____"].xOutCamResultsAck; // TODO(E-Planung) + END_REGION + + REGION Separator Store Out + "MB____" := #TRO18.arOutSeparatorStore[1]; // TODO(E-Planung) + "MB____" := #TRO18.arOutSeparatorStore[2]; // TODO(E-Planung) + "MB____" := #TRO18.arOutSeparatorStore[3]; // TODO(E-Planung) + "MB____" := #TRO18.arOutSeparatorStore[4]; // TODO(E-Planung) + "MB____" := #TRO18.arOutSeparatorStore[5]; // TODO(E-Planung) + "MB____" := #TRO18.arOutSeparatorStore[6]; // TODO(E-Planung) + "MB____" := #TRO18.arOutSeparatorStore[7]; // TODO(E-Planung) + "MB____" := #TRO18.arOutSeparatorStore[8]; // TODO(E-Planung) + "MB____" := #TRO18.arOutSeparatorStore[9]; // TODO(E-Planung) + "MB____" := #TRO18.arOutSeparatorStore[10]; // TODO(E-Planung) + "MB____" := #TRO18.arOutSeparatorStore[11]; // TODO(E-Planung) + "MB____" := #TRO18.arOutSeparatorStore[12]; // TODO(E-Planung) + "MB____" := #TRO18.arOutSeparatorStore[13]; // TODO(E-Planung) + "MB____" := #TRO18.arOutSeparatorStore[14]; // TODO(E-Planung) + "MB____" := #TRO18.arOutSeparatorStore[15]; // TODO(E-Planung) + "MB____" := #TRO18.arOutSeparatorStore[16]; // TODO(E-Planung) + "MB____" := #TRO18.arOutSeparatorStore[17]; // TODO(E-Planung) + "MB____" := #TRO18.arOutSeparatorStore[18]; // TODO(E-Planung) + "MB____" := #TRO18.arOutSeparatorStore[19]; // TODO(E-Planung) + "MB____" := #TRO18.arOutSeparatorStore[20]; // TODO(E-Planung) + END_REGION + // stMFRStorageRemovalInterface koppelt an FB_StockRemovalBLKModul / FB_StorageManagement END_REGION REGION TRO07 (1Sep) Sep 0045 @@ -171,9 +475,10 @@ REGION TRO07 (1Sep) Sep 0045 // Vorgaenger: TRO09, TRO18 // Nachfolger: TRO04 // Einstufung: mittel + // Aufbau nach Template FB_ILS_MTRO_1Sep.scl.j2 (Referenz: doc/TRO_Katalog/scl_templates) // Separator 1 = Bauteil 0045 aus dem Layout - #TRO07.stInSeparator1.Settings.nSeparatorNo := "cSep_____"; // TODO(E-Planung) + #TRO07.stInSeparator1.Settings.nSeparatorNo := "cSep_____"; // TODO(E-Planung) #TRO07.stInSeparator1.Settings.tDelayToNextItem := "TimeForSepWaiting_Short"; #TRO07.stInSeparator1.Settings.tTrailingTime := t#600ms; // TODO(E-Planung): pruefen #TRO07.stInSeparator1.Settings.tHandlingTime := t#200ms; // TODO(E-Planung): pruefen @@ -182,26 +487,30 @@ REGION TRO07 (1Sep) Sep 0045 #TRO07.stInSeparator1.Settings.xPluggedPart := FALSE; #TRO07.stInSeparator1.Settings.xPluggedScanner := FALSE; #TRO07.stInSeparator1.stSenInSep := "DB_Inputs".Sensors["cInBG____"]; // TODO(E-Planung) - #TRO07.stInSeparator1.Settings.tSenFree := T#1500ms; // TODO(E-Planung): pruefen - #TRO07.stInSeparator1.Settings.tSenWait := T#4000ms; // TODO(E-Planung): pruefen + #TRO07.stInSenJam2 := "DB_Inputs".Sensors["cInBG____"]; // TODO(E-Planung) - #TRO07.stInPriorityManager.xReleaseOk := TRUE; + #TRO07.stInSeparator1.Settings.tSenFree := T#1500ms; // TODO(E-Planung): pruefen + #TRO07.stInSeparator1.Settings.tSenWait := T#4000ms; // TODO(E-Planung): pruefen + + #TRO07.stInPriorityManager.xReleaseOk := TRUE; // braucht keine Vorfahrtsregelung #TRO07(nInMainTroNo := "cMainTro____", // TODO(E-Planung) xInSftyOk := "DB_InterfaceSafety".stFromSafety.EStopMain.Q, // TODO(E-Planung) xInAllRdyToStart := TRUE, + xInCarouselRun := #fbCarousel____.xOutConveyorFullSpeed, // TODO(E-Planung) - nur am Kreisel, sonst Zeile loeschen xInRelease := "DB_TRO_TEST".TRO07, - stInOutMachineState := #stInOutControlUnitCabinet, + stInOutMachineState := #stInOutControlUnitCabinet, // TODO(E-Planung) - Schaltschrank stInOutCognexInterface := #stCognexInterfaceDummy, arInOutJamEntr1 := "DB_JamArea____".stJam____.arCarrier, // TODO(E-Planung) - Staubereich von TRO09 - stInOutJamEntr1 := "DB_JamArea____".stJam____.stData, + stInOutJamEntr1 := "DB_JamArea____".stJam____.stData, // TODO(E-Planung) arInOutJamEntr2 := "DB_JamArea____".stJam____.arCarrier, // TODO(E-Planung) - Staubereich von TRO18 - stInOutJamEntr2 := "DB_JamArea____".stJam____.stData, + stInOutJamEntr2 := "DB_JamArea____".stJam____.stData, // TODO(E-Planung) arInOutJamExit2 := "DB_JamArea____".stJam____.arCarrier, // TODO(E-Planung) - Staubereich nach TRO04 - stInOutJamExit2 := "DB_JamArea____".stJam____.stData, + stInOutJamExit2 := "DB_JamArea____".stJam____.stData, // TODO(E-Planung) xOutStopper1 => "MB____", // TODO(E-Planung) - stInOutHMI := "DB_Interface_HMI".stTRO.TRO07, - nOutStateLast => "DB_GLOB_TroState".arTroState["cMainTro____"]); // TODO(E-Planung) + nOutStateLast => "DB_GLOB_TroState".arTroState["cMainTro____"], // TODO(E-Planung) + stInOutHMI := "DB_Interface_HMI".stTRO.TRO07); + END_REGION REGION TRO10 (2Sep2Swi) Sep 0005, 0036 @@ -303,9 +612,10 @@ REGION TRO04 (1Sep) Sep 0043 // Vorgaenger: TRO07 // Nachfolger: TRO03 // Einstufung: mittel + // Aufbau nach Template FB_ILS_MTRO_1Sep.scl.j2 (Referenz: doc/TRO_Katalog/scl_templates) // Separator 1 = Bauteil 0043 aus dem Layout - #TRO04.stInSeparator1.Settings.nSeparatorNo := "cSep_____"; // TODO(E-Planung) + #TRO04.stInSeparator1.Settings.nSeparatorNo := "cSep_____"; // TODO(E-Planung) #TRO04.stInSeparator1.Settings.tDelayToNextItem := "TimeForSepWaiting_Short"; #TRO04.stInSeparator1.Settings.tTrailingTime := t#600ms; // TODO(E-Planung): pruefen #TRO04.stInSeparator1.Settings.tHandlingTime := t#200ms; // TODO(E-Planung): pruefen @@ -314,24 +624,28 @@ REGION TRO04 (1Sep) Sep 0043 #TRO04.stInSeparator1.Settings.xPluggedPart := FALSE; #TRO04.stInSeparator1.Settings.xPluggedScanner := FALSE; #TRO04.stInSeparator1.stSenInSep := "DB_Inputs".Sensors["cInBG____"]; // TODO(E-Planung) - #TRO04.stInSeparator1.Settings.tSenFree := T#1500ms; // TODO(E-Planung): pruefen - #TRO04.stInSeparator1.Settings.tSenWait := T#4000ms; // TODO(E-Planung): pruefen + #TRO04.stInSenJam2 := "DB_Inputs".Sensors["cInBG____"]; // TODO(E-Planung) - #TRO04.stInPriorityManager.xReleaseOk := TRUE; + #TRO04.stInSeparator1.Settings.tSenFree := T#1500ms; // TODO(E-Planung): pruefen + #TRO04.stInSeparator1.Settings.tSenWait := T#4000ms; // TODO(E-Planung): pruefen + + #TRO04.stInPriorityManager.xReleaseOk := TRUE; // braucht keine Vorfahrtsregelung #TRO04(nInMainTroNo := "cMainTro____", // TODO(E-Planung) xInSftyOk := "DB_InterfaceSafety".stFromSafety.EStopMain.Q, // TODO(E-Planung) xInAllRdyToStart := TRUE, + xInCarouselRun := #fbCarousel____.xOutConveyorFullSpeed, // TODO(E-Planung) - nur am Kreisel, sonst Zeile loeschen xInRelease := "DB_TRO_TEST".TRO04, - stInOutMachineState := #stInOutControlUnitCabinet, + stInOutMachineState := #stInOutControlUnitCabinet, // TODO(E-Planung) - Schaltschrank stInOutCognexInterface := #stCognexInterfaceDummy, arInOutJamEntr1 := "DB_JamArea____".stJam____.arCarrier, // TODO(E-Planung) - Staubereich von TRO07 - stInOutJamEntr1 := "DB_JamArea____".stJam____.stData, + stInOutJamEntr1 := "DB_JamArea____".stJam____.stData, // TODO(E-Planung) arInOutJamExit2 := "DB_JamArea____".stJam____.arCarrier, // TODO(E-Planung) - Staubereich nach TRO03 - stInOutJamExit2 := "DB_JamArea____".stJam____.stData, + stInOutJamExit2 := "DB_JamArea____".stJam____.stData, // TODO(E-Planung) xOutStopper1 => "MB____", // TODO(E-Planung) - stInOutHMI := "DB_Interface_HMI".stTRO.TRO04, - nOutStateLast => "DB_GLOB_TroState".arTroState["cMainTro____"]); // TODO(E-Planung) + nOutStateLast => "DB_GLOB_TroState".arTroState["cMainTro____"], // TODO(E-Planung) + stInOutHMI := "DB_Interface_HMI".stTRO.TRO04); + END_REGION REGION TRO01 (1Sep) Sep 0040 @@ -339,9 +653,10 @@ REGION TRO01 (1Sep) Sep 0040 // Vorgaenger: TRO10 // Nachfolger: TRO10 // Einstufung: mittel + // Aufbau nach Template FB_ILS_MTRO_1Sep.scl.j2 (Referenz: doc/TRO_Katalog/scl_templates) // Separator 1 = Bauteil 0040 aus dem Layout - #TRO01.stInSeparator1.Settings.nSeparatorNo := "cSep_____"; // TODO(E-Planung) + #TRO01.stInSeparator1.Settings.nSeparatorNo := "cSep_____"; // TODO(E-Planung) #TRO01.stInSeparator1.Settings.tDelayToNextItem := "TimeForSepWaiting_Short"; #TRO01.stInSeparator1.Settings.tTrailingTime := t#600ms; // TODO(E-Planung): pruefen #TRO01.stInSeparator1.Settings.tHandlingTime := t#200ms; // TODO(E-Planung): pruefen @@ -350,24 +665,28 @@ REGION TRO01 (1Sep) Sep 0040 #TRO01.stInSeparator1.Settings.xPluggedPart := FALSE; #TRO01.stInSeparator1.Settings.xPluggedScanner := FALSE; #TRO01.stInSeparator1.stSenInSep := "DB_Inputs".Sensors["cInBG____"]; // TODO(E-Planung) - #TRO01.stInSeparator1.Settings.tSenFree := T#1500ms; // TODO(E-Planung): pruefen - #TRO01.stInSeparator1.Settings.tSenWait := T#4000ms; // TODO(E-Planung): pruefen + #TRO01.stInSenJam2 := "DB_Inputs".Sensors["cInBG____"]; // TODO(E-Planung) - #TRO01.stInPriorityManager.xReleaseOk := TRUE; + #TRO01.stInSeparator1.Settings.tSenFree := T#1500ms; // TODO(E-Planung): pruefen + #TRO01.stInSeparator1.Settings.tSenWait := T#4000ms; // TODO(E-Planung): pruefen + + #TRO01.stInPriorityManager.xReleaseOk := TRUE; // braucht keine Vorfahrtsregelung #TRO01(nInMainTroNo := "cMainTro____", // TODO(E-Planung) xInSftyOk := "DB_InterfaceSafety".stFromSafety.EStopMain.Q, // TODO(E-Planung) xInAllRdyToStart := TRUE, + xInCarouselRun := #fbCarousel____.xOutConveyorFullSpeed, // TODO(E-Planung) - nur am Kreisel, sonst Zeile loeschen xInRelease := "DB_TRO_TEST".TRO01, - stInOutMachineState := #stInOutControlUnitCabinet, + stInOutMachineState := #stInOutControlUnitCabinet, // TODO(E-Planung) - Schaltschrank stInOutCognexInterface := #stCognexInterfaceDummy, arInOutJamEntr1 := "DB_JamArea____".stJam____.arCarrier, // TODO(E-Planung) - Staubereich von TRO10 - stInOutJamEntr1 := "DB_JamArea____".stJam____.stData, + stInOutJamEntr1 := "DB_JamArea____".stJam____.stData, // TODO(E-Planung) arInOutJamExit2 := "DB_JamArea____".stJam____.arCarrier, // TODO(E-Planung) - Staubereich nach TRO10 - stInOutJamExit2 := "DB_JamArea____".stJam____.stData, + stInOutJamExit2 := "DB_JamArea____".stJam____.stData, // TODO(E-Planung) xOutStopper1 => "MB____", // TODO(E-Planung) - stInOutHMI := "DB_Interface_HMI".stTRO.TRO01, - nOutStateLast => "DB_GLOB_TroState".arTroState["cMainTro____"]); // TODO(E-Planung) + nOutStateLast => "DB_GLOB_TroState".arTroState["cMainTro____"], // TODO(E-Planung) + stInOutHMI := "DB_Interface_HMI".stTRO.TRO01); + END_REGION REGION TRO02 (1Sep) Sep 0012 @@ -375,9 +694,10 @@ REGION TRO02 (1Sep) Sep 0012 // Vorgaenger: TRO10 // Nachfolger: SYS2, SYS3, TRO13 // Einstufung: mittel + // Aufbau nach Template FB_ILS_MTRO_1Sep.scl.j2 (Referenz: doc/TRO_Katalog/scl_templates) // Separator 1 = Bauteil 0012 aus dem Layout - #TRO02.stInSeparator1.Settings.nSeparatorNo := "cSep_____"; // TODO(E-Planung) + #TRO02.stInSeparator1.Settings.nSeparatorNo := "cSep_____"; // TODO(E-Planung) #TRO02.stInSeparator1.Settings.tDelayToNextItem := "TimeForSepWaiting_Short"; #TRO02.stInSeparator1.Settings.tTrailingTime := t#600ms; // TODO(E-Planung): pruefen #TRO02.stInSeparator1.Settings.tHandlingTime := t#200ms; // TODO(E-Planung): pruefen @@ -386,28 +706,34 @@ REGION TRO02 (1Sep) Sep 0012 #TRO02.stInSeparator1.Settings.xPluggedPart := FALSE; #TRO02.stInSeparator1.Settings.xPluggedScanner := FALSE; #TRO02.stInSeparator1.stSenInSep := "DB_Inputs".Sensors["cInBG____"]; // TODO(E-Planung) - #TRO02.stInSeparator1.Settings.tSenFree := T#1500ms; // TODO(E-Planung): pruefen - #TRO02.stInSeparator1.Settings.tSenWait := T#4000ms; // TODO(E-Planung): pruefen + #TRO02.stInSenJam2 := "DB_Inputs".Sensors["cInBG____"]; // TODO(E-Planung) + #TRO02.stInSenJam3 := "DB_Inputs".Sensors["cInBG____"]; // TODO(E-Planung) + #TRO02.stInSenJam4 := "DB_Inputs".Sensors["cInBG____"]; // TODO(E-Planung) - #TRO02.stInPriorityManager.xReleaseOk := TRUE; + #TRO02.stInSeparator1.Settings.tSenFree := T#1500ms; // TODO(E-Planung): pruefen + #TRO02.stInSeparator1.Settings.tSenWait := T#4000ms; // TODO(E-Planung): pruefen + + #TRO02.stInPriorityManager.xReleaseOk := TRUE; // braucht keine Vorfahrtsregelung #TRO02(nInMainTroNo := "cMainTro____", // TODO(E-Planung) xInSftyOk := "DB_InterfaceSafety".stFromSafety.EStopMain.Q, // TODO(E-Planung) xInAllRdyToStart := TRUE, + xInCarouselRun := #fbCarousel____.xOutConveyorFullSpeed, // TODO(E-Planung) - nur am Kreisel, sonst Zeile loeschen xInRelease := "DB_TRO_TEST".TRO02, - stInOutMachineState := #stInOutControlUnitCabinet, + stInOutMachineState := #stInOutControlUnitCabinet, // TODO(E-Planung) - Schaltschrank stInOutCognexInterface := #stCognexInterfaceDummy, arInOutJamEntr1 := "DB_JamArea____".stJam____.arCarrier, // TODO(E-Planung) - Staubereich von TRO10 - stInOutJamEntr1 := "DB_JamArea____".stJam____.stData, + stInOutJamEntr1 := "DB_JamArea____".stJam____.stData, // TODO(E-Planung) arInOutJamExit2 := "DB_JamArea____".stJam____.arCarrier, // TODO(E-Planung) - Staubereich nach SYS2 (Station, kein TRO) - stInOutJamExit2 := "DB_JamArea____".stJam____.stData, + stInOutJamExit2 := "DB_JamArea____".stJam____.stData, // TODO(E-Planung) arInOutJamExit3 := "DB_JamArea____".stJam____.arCarrier, // TODO(E-Planung) - Staubereich nach SYS3 (Station, kein TRO) - stInOutJamExit3 := "DB_JamArea____".stJam____.stData, + stInOutJamExit3 := "DB_JamArea____".stJam____.stData, // TODO(E-Planung) arInOutJamExit4 := "DB_JamArea____".stJam____.arCarrier, // TODO(E-Planung) - Staubereich nach TRO13 - stInOutJamExit4 := "DB_JamArea____".stJam____.stData, + stInOutJamExit4 := "DB_JamArea____".stJam____.stData, // TODO(E-Planung) xOutStopper1 => "MB____", // TODO(E-Planung) - stInOutHMI := "DB_Interface_HMI".stTRO.TRO02, - nOutStateLast => "DB_GLOB_TroState".arTroState["cMainTro____"]); // TODO(E-Planung) + nOutStateLast => "DB_GLOB_TroState".arTroState["cMainTro____"], // TODO(E-Planung) + stInOutHMI := "DB_Interface_HMI".stTRO.TRO02); + END_REGION REGION TRO11 (Vario) Sep 0058 @@ -415,52 +741,64 @@ REGION TRO11 (Vario) Sep 0058 // Vorgaenger: TRO10 // Nachfolger: TRO12 // Einstufung: hoch + // Aufbau nach Template FB_ILS_MTRO_Vario.scl.j2 (Referenz: doc/TRO_Katalog/scl_templates) // Separator 1 = Bauteil 0058 aus dem Layout - #TRO11.stInSeparator1.Settings.nSeparatorNo := "cSep_____"; // TODO(E-Planung) + #TRO11.stInSeparator1.Settings.nSeparatorNo := "cSep_____"; // TODO(E-Planung) #TRO11.stInSeparator1.Settings.tDelayToNextItem := "TimeForSepWaiting_Short"; - #TRO11.stInSeparator1.Settings.tTrailingTime := t#600ms; // TODO(E-Planung): pruefen - #TRO11.stInSeparator1.Settings.tHandlingTime := t#200ms; // TODO(E-Planung): pruefen + #TRO11.stInSeparator1.Settings.tTrailingTime := t#800ms; // TODO(E-Planung): pruefen + #TRO11.stInSeparator1.Settings.tHandlingTime := t#300ms; // TODO(E-Planung): pruefen #TRO11.stInSeparator1.Settings.tJam := "TimeForSepJam"; - #TRO11.stInSeparator1.Settings.xPluggedJam := TRUE; + #TRO11.stInSeparator1.Settings.xPluggedJam := FALSE; #TRO11.stInSeparator1.Settings.xPluggedPart := FALSE; #TRO11.stInSeparator1.Settings.xPluggedScanner := FALSE; #TRO11.stInSeparator1.stSenInSep := "DB_Inputs".Sensors["cInBG____"]; // TODO(E-Planung) - #TRO11.stInSeparator1.Settings.tSenFree := T#1500ms; // TODO(E-Planung): pruefen - #TRO11.stInSeparator1.Settings.tSenWait := T#4000ms; // TODO(E-Planung): pruefen + + #TRO11.stInSeparator1.Settings.tSenFree := t#2000ms; // TODO(E-Planung): pruefen + #TRO11.stInSeparator1.Settings.tSenWait := T#5000ms; // TODO(E-Planung): pruefen #TRO11.stInVario.Settings.xContinousEmptying := FALSE; - #TRO11.stInVario.Settings.tWaitForJog := T#300ms; // TODO(E-Planung): pruefen - #TRO11.stInVario.Settings.tConvEmpty := T#45000ms; // TODO(E-Planung): pruefen - #TRO11.stInVario.Settings.nCountCarrier := 1; // TODO(E-Planung): pruefen + #TRO11.stInVario.Settings.tWaitForJog := T#300ms; // TODO(E-Planung): pruefen + #TRO11.stInVario.Settings.tConvEmpty := T#45000ms; // TODO(E-Planung): pruefen + #TRO11.stInVario.Settings.nCountCarrier := 1; // TODO(E-Planung): pruefen #TRO11.stInVario.Settings.tWaitForStop := t#3s; + #TRO11.stInVario.Settings.tCarrierInPosDelay := t#1200ms; #TRO11.stInVario.Settings.tCarrierInPosEdgeDelay := t#100ms; + + #TRO11.stInVario.Settings.tRasterHigh := t#5s; // TODO(E-Planung): pruefen + #TRO11.stInVario.Settings.tRasterLow := t#5s; // TODO(E-Planung): pruefen + + #TRO11.stInVario.stSenCarrInPos := "DB_Inputs".Sensors["cInBG____"]; // MT in Pos - TODO(E-Planung) + #TRO11.stInVario.stSenFinger := "DB_Inputs".Sensors["cInBG____"]; // Pusher Dog in Pos - TODO(E-Planung) + #TRO11.stInVario.stSenLastPos := "DB_Inputs".Sensors["cInBG____"]; // Conveyor full - TODO(E-Planung) + #TRO11.stInVario.stSenJam := "DB_Inputs".Sensors["cInBG____"]; // Jam detector - TODO(E-Planung) + + #TRO11.stInPriorityManager.xReleaseOk := TRUE; // braucht keine Vorfahrtsregelung #TRO11.stInVario.Settings.xJamSenDelayActive := TRUE; #TRO11.stInVario.Settings.tJamSenDelay := T#2s; - #TRO11.stInVario.stSenCarrInPos := "DB_Inputs".Sensors["cInBG____"]; // TODO(E-Planung) - #TRO11.stInVario.stSenFinger := "DB_Inputs".Sensors["cInBG____"]; // TODO(E-Planung) - #TRO11.stInVario.stSenLastPos := "DB_Inputs".Sensors["cInBG____"]; // TODO(E-Planung) - #TRO11.stInVario.stSenJam := "DB_Inputs".Sensors["cInBG____"]; // TODO(E-Planung) - #TRO11.stInPriorityManager.xReleaseOk := TRUE; + #TRO11.stInSettings.xIsBorner := TRUE; // TODO(E-Planung) - pruefen - Bedeutung mit SPS klaeren #TRO11(nInMainTroNo := "cMainTro____", // TODO(E-Planung) xInSftyOk := "DB_InterfaceSafety".stFromSafety.EStopMain.Q, // TODO(E-Planung) - xInAllRdyToStart := TRUE, - xInRelease := "DB_TRO_TEST".TRO11, xInMotorProtection := "FC____", // TODO(E-Planung) - xInAutomatic := #t_automatik, - stInOutMachineState := #stInOutControlUnitCabinet, + xInAllRdyToStart := TRUE, + xInReset := "cTodoFalse", + xInErrorQuit := "SF____", // TODO(E-Planung) - Quittierung + xInAutomatic := #t_automatik, // TODO(E-Planung) - Automatik des Schaltschranks + xInRelease := "DB_TRO_TEST".TRO11, + arInOutJamEntr := "DB_JamArea____".stJam____.arCarrier, // TODO(E-Planung) - Staubereich von TRO10 + stInOutJamEntr := "DB_JamArea____".stJam____.stData, // TODO(E-Planung) + arInOutJamFinger := "DB_JamArea____".stJam____.arCarrier, // TODO(E-Planung) - Staubereich nach TRO12 + stInOutJamFinger := "DB_JamArea____".stJam____.stData, // TODO(E-Planung) + stInOutMachineState := #stInOutControlUnitCabinet, // TODO(E-Planung) - Schaltschrank stInOutCognexInterface := #stCognexInterfaceDummy, - arInOutJamEntr1 := "DB_JamArea____".stJam____.arCarrier, // TODO(E-Planung) - Staubereich von TRO10 - stInOutJamEntr1 := "DB_JamArea____".stJam____.stData, - arInOutJamExit2 := "DB_JamArea____".stJam____.arCarrier, // TODO(E-Planung) - Staubereich nach TRO12 - stInOutJamExit2 := "DB_JamArea____".stJam____.stData, - xOutStopper1 => "MB____", // TODO(E-Planung) - xOutVarioMotor => "MA____", // TODO(E-Planung) stInOutHMI := "DB_Interface_HMI".stTRO.TRO11, - nOutStateLast => "DB_GLOB_TroState".arTroState["cMainTro____"]); // TODO(E-Planung) + nOutStateLast => "DB_GLOB_TroState".arTroState["cMainTro____"], // TODO(E-Planung) + xOutStopper => "MB____", // TODO(E-Planung) + xOutVarioMotor => "MA____"); // TODO(E-Planung) + END_REGION REGION TRO13 (1Sep1Swi) Sep 0011 @@ -527,9 +865,10 @@ REGION TRO12 (1Sep) Sep 0059 // Vorgaenger: TRO11 // Nachfolger: TRO18 // Einstufung: mittel + // Aufbau nach Template FB_ILS_MTRO_1Sep.scl.j2 (Referenz: doc/TRO_Katalog/scl_templates) // Separator 1 = Bauteil 0059 aus dem Layout - #TRO12.stInSeparator1.Settings.nSeparatorNo := "cSep_____"; // TODO(E-Planung) + #TRO12.stInSeparator1.Settings.nSeparatorNo := "cSep_____"; // TODO(E-Planung) #TRO12.stInSeparator1.Settings.tDelayToNextItem := "TimeForSepWaiting_Short"; #TRO12.stInSeparator1.Settings.tTrailingTime := t#600ms; // TODO(E-Planung): pruefen #TRO12.stInSeparator1.Settings.tHandlingTime := t#200ms; // TODO(E-Planung): pruefen @@ -538,24 +877,28 @@ REGION TRO12 (1Sep) Sep 0059 #TRO12.stInSeparator1.Settings.xPluggedPart := FALSE; #TRO12.stInSeparator1.Settings.xPluggedScanner := FALSE; #TRO12.stInSeparator1.stSenInSep := "DB_Inputs".Sensors["cInBG____"]; // TODO(E-Planung) - #TRO12.stInSeparator1.Settings.tSenFree := T#1500ms; // TODO(E-Planung): pruefen - #TRO12.stInSeparator1.Settings.tSenWait := T#4000ms; // TODO(E-Planung): pruefen + #TRO12.stInSenJam2 := "DB_Inputs".Sensors["cInBG____"]; // TODO(E-Planung) - #TRO12.stInPriorityManager.xReleaseOk := TRUE; + #TRO12.stInSeparator1.Settings.tSenFree := T#1500ms; // TODO(E-Planung): pruefen + #TRO12.stInSeparator1.Settings.tSenWait := T#4000ms; // TODO(E-Planung): pruefen + + #TRO12.stInPriorityManager.xReleaseOk := TRUE; // braucht keine Vorfahrtsregelung #TRO12(nInMainTroNo := "cMainTro____", // TODO(E-Planung) xInSftyOk := "DB_InterfaceSafety".stFromSafety.EStopMain.Q, // TODO(E-Planung) xInAllRdyToStart := TRUE, + xInCarouselRun := #fbCarousel____.xOutConveyorFullSpeed, // TODO(E-Planung) - nur am Kreisel, sonst Zeile loeschen xInRelease := "DB_TRO_TEST".TRO12, - stInOutMachineState := #stInOutControlUnitCabinet, + stInOutMachineState := #stInOutControlUnitCabinet, // TODO(E-Planung) - Schaltschrank stInOutCognexInterface := #stCognexInterfaceDummy, arInOutJamEntr1 := "DB_JamArea____".stJam____.arCarrier, // TODO(E-Planung) - Staubereich von TRO11 - stInOutJamEntr1 := "DB_JamArea____".stJam____.stData, + stInOutJamEntr1 := "DB_JamArea____".stJam____.stData, // TODO(E-Planung) arInOutJamExit2 := "DB_JamArea____".stJam____.arCarrier, // TODO(E-Planung) - Staubereich nach TRO18 - stInOutJamExit2 := "DB_JamArea____".stJam____.stData, + stInOutJamExit2 := "DB_JamArea____".stJam____.stData, // TODO(E-Planung) xOutStopper1 => "MB____", // TODO(E-Planung) - stInOutHMI := "DB_Interface_HMI".stTRO.TRO12, - nOutStateLast => "DB_GLOB_TroState".arTroState["cMainTro____"]); // TODO(E-Planung) + nOutStateLast => "DB_GLOB_TroState".arTroState["cMainTro____"], // TODO(E-Planung) + stInOutHMI := "DB_Interface_HMI".stTRO.TRO12); + END_REGION REGION TRO16 (Vario) Sep 0062 @@ -563,52 +906,64 @@ REGION TRO16 (Vario) Sep 0062 // Vorgaenger: TRO13 // Nachfolger: TRO15 // Einstufung: hoch + // Aufbau nach Template FB_ILS_MTRO_Vario.scl.j2 (Referenz: doc/TRO_Katalog/scl_templates) // Separator 1 = Bauteil 0062 aus dem Layout - #TRO16.stInSeparator1.Settings.nSeparatorNo := "cSep_____"; // TODO(E-Planung) + #TRO16.stInSeparator1.Settings.nSeparatorNo := "cSep_____"; // TODO(E-Planung) #TRO16.stInSeparator1.Settings.tDelayToNextItem := "TimeForSepWaiting_Short"; - #TRO16.stInSeparator1.Settings.tTrailingTime := t#600ms; // TODO(E-Planung): pruefen - #TRO16.stInSeparator1.Settings.tHandlingTime := t#200ms; // TODO(E-Planung): pruefen + #TRO16.stInSeparator1.Settings.tTrailingTime := t#800ms; // TODO(E-Planung): pruefen + #TRO16.stInSeparator1.Settings.tHandlingTime := t#300ms; // TODO(E-Planung): pruefen #TRO16.stInSeparator1.Settings.tJam := "TimeForSepJam"; - #TRO16.stInSeparator1.Settings.xPluggedJam := TRUE; + #TRO16.stInSeparator1.Settings.xPluggedJam := FALSE; #TRO16.stInSeparator1.Settings.xPluggedPart := FALSE; #TRO16.stInSeparator1.Settings.xPluggedScanner := FALSE; #TRO16.stInSeparator1.stSenInSep := "DB_Inputs".Sensors["cInBG____"]; // TODO(E-Planung) - #TRO16.stInSeparator1.Settings.tSenFree := T#1500ms; // TODO(E-Planung): pruefen - #TRO16.stInSeparator1.Settings.tSenWait := T#4000ms; // TODO(E-Planung): pruefen + + #TRO16.stInSeparator1.Settings.tSenFree := t#2000ms; // TODO(E-Planung): pruefen + #TRO16.stInSeparator1.Settings.tSenWait := T#5000ms; // TODO(E-Planung): pruefen #TRO16.stInVario.Settings.xContinousEmptying := FALSE; - #TRO16.stInVario.Settings.tWaitForJog := T#300ms; // TODO(E-Planung): pruefen - #TRO16.stInVario.Settings.tConvEmpty := T#45000ms; // TODO(E-Planung): pruefen - #TRO16.stInVario.Settings.nCountCarrier := 1; // TODO(E-Planung): pruefen + #TRO16.stInVario.Settings.tWaitForJog := T#300ms; // TODO(E-Planung): pruefen + #TRO16.stInVario.Settings.tConvEmpty := T#45000ms; // TODO(E-Planung): pruefen + #TRO16.stInVario.Settings.nCountCarrier := 1; // TODO(E-Planung): pruefen #TRO16.stInVario.Settings.tWaitForStop := t#3s; + #TRO16.stInVario.Settings.tCarrierInPosDelay := t#1200ms; #TRO16.stInVario.Settings.tCarrierInPosEdgeDelay := t#100ms; + + #TRO16.stInVario.Settings.tRasterHigh := t#5s; // TODO(E-Planung): pruefen + #TRO16.stInVario.Settings.tRasterLow := t#5s; // TODO(E-Planung): pruefen + + #TRO16.stInVario.stSenCarrInPos := "DB_Inputs".Sensors["cInBG____"]; // MT in Pos - TODO(E-Planung) + #TRO16.stInVario.stSenFinger := "DB_Inputs".Sensors["cInBG____"]; // Pusher Dog in Pos - TODO(E-Planung) + #TRO16.stInVario.stSenLastPos := "DB_Inputs".Sensors["cInBG____"]; // Conveyor full - TODO(E-Planung) + #TRO16.stInVario.stSenJam := "DB_Inputs".Sensors["cInBG____"]; // Jam detector - TODO(E-Planung) + + #TRO16.stInPriorityManager.xReleaseOk := TRUE; // braucht keine Vorfahrtsregelung #TRO16.stInVario.Settings.xJamSenDelayActive := TRUE; #TRO16.stInVario.Settings.tJamSenDelay := T#2s; - #TRO16.stInVario.stSenCarrInPos := "DB_Inputs".Sensors["cInBG____"]; // TODO(E-Planung) - #TRO16.stInVario.stSenFinger := "DB_Inputs".Sensors["cInBG____"]; // TODO(E-Planung) - #TRO16.stInVario.stSenLastPos := "DB_Inputs".Sensors["cInBG____"]; // TODO(E-Planung) - #TRO16.stInVario.stSenJam := "DB_Inputs".Sensors["cInBG____"]; // TODO(E-Planung) - #TRO16.stInPriorityManager.xReleaseOk := TRUE; + #TRO16.stInSettings.xIsBorner := TRUE; // TODO(E-Planung) - pruefen - Bedeutung mit SPS klaeren #TRO16(nInMainTroNo := "cMainTro____", // TODO(E-Planung) xInSftyOk := "DB_InterfaceSafety".stFromSafety.EStopMain.Q, // TODO(E-Planung) - xInAllRdyToStart := TRUE, - xInRelease := "DB_TRO_TEST".TRO16, xInMotorProtection := "FC____", // TODO(E-Planung) - xInAutomatic := #t_automatik, - stInOutMachineState := #stInOutControlUnitCabinet, + xInAllRdyToStart := TRUE, + xInReset := "cTodoFalse", + xInErrorQuit := "SF____", // TODO(E-Planung) - Quittierung + xInAutomatic := #t_automatik, // TODO(E-Planung) - Automatik des Schaltschranks + xInRelease := "DB_TRO_TEST".TRO16, + arInOutJamEntr := "DB_JamArea____".stJam____.arCarrier, // TODO(E-Planung) - Staubereich von TRO13 + stInOutJamEntr := "DB_JamArea____".stJam____.stData, // TODO(E-Planung) + arInOutJamFinger := "DB_JamArea____".stJam____.arCarrier, // TODO(E-Planung) - Staubereich nach TRO15 + stInOutJamFinger := "DB_JamArea____".stJam____.stData, // TODO(E-Planung) + stInOutMachineState := #stInOutControlUnitCabinet, // TODO(E-Planung) - Schaltschrank stInOutCognexInterface := #stCognexInterfaceDummy, - arInOutJamEntr1 := "DB_JamArea____".stJam____.arCarrier, // TODO(E-Planung) - Staubereich von TRO13 - stInOutJamEntr1 := "DB_JamArea____".stJam____.stData, - arInOutJamExit2 := "DB_JamArea____".stJam____.arCarrier, // TODO(E-Planung) - Staubereich nach TRO15 - stInOutJamExit2 := "DB_JamArea____".stJam____.stData, - xOutStopper1 => "MB____", // TODO(E-Planung) - xOutVarioMotor => "MA____", // TODO(E-Planung) stInOutHMI := "DB_Interface_HMI".stTRO.TRO16, - nOutStateLast => "DB_GLOB_TroState".arTroState["cMainTro____"]); // TODO(E-Planung) + nOutStateLast => "DB_GLOB_TroState".arTroState["cMainTro____"], // TODO(E-Planung) + xOutStopper => "MB____", // TODO(E-Planung) + xOutVarioMotor => "MA____"); // TODO(E-Planung) + END_REGION REGION TRO17 (1Sep) Sep 0063 @@ -616,9 +971,10 @@ REGION TRO17 (1Sep) Sep 0063 // Vorgaenger: TRO13, TRO14 // Nachfolger: TRO06 // Einstufung: mittel + // Aufbau nach Template FB_ILS_MTRO_1Sep.scl.j2 (Referenz: doc/TRO_Katalog/scl_templates) // Separator 1 = Bauteil 0063 aus dem Layout - #TRO17.stInSeparator1.Settings.nSeparatorNo := "cSep_____"; // TODO(E-Planung) + #TRO17.stInSeparator1.Settings.nSeparatorNo := "cSep_____"; // TODO(E-Planung) #TRO17.stInSeparator1.Settings.tDelayToNextItem := "TimeForSepWaiting_Short"; #TRO17.stInSeparator1.Settings.tTrailingTime := t#600ms; // TODO(E-Planung): pruefen #TRO17.stInSeparator1.Settings.tHandlingTime := t#200ms; // TODO(E-Planung): pruefen @@ -627,26 +983,30 @@ REGION TRO17 (1Sep) Sep 0063 #TRO17.stInSeparator1.Settings.xPluggedPart := FALSE; #TRO17.stInSeparator1.Settings.xPluggedScanner := FALSE; #TRO17.stInSeparator1.stSenInSep := "DB_Inputs".Sensors["cInBG____"]; // TODO(E-Planung) - #TRO17.stInSeparator1.Settings.tSenFree := T#1500ms; // TODO(E-Planung): pruefen - #TRO17.stInSeparator1.Settings.tSenWait := T#4000ms; // TODO(E-Planung): pruefen + #TRO17.stInSenJam2 := "DB_Inputs".Sensors["cInBG____"]; // TODO(E-Planung) - #TRO17.stInPriorityManager.xReleaseOk := TRUE; + #TRO17.stInSeparator1.Settings.tSenFree := T#1500ms; // TODO(E-Planung): pruefen + #TRO17.stInSeparator1.Settings.tSenWait := T#4000ms; // TODO(E-Planung): pruefen + + #TRO17.stInPriorityManager.xReleaseOk := TRUE; // braucht keine Vorfahrtsregelung #TRO17(nInMainTroNo := "cMainTro____", // TODO(E-Planung) xInSftyOk := "DB_InterfaceSafety".stFromSafety.EStopMain.Q, // TODO(E-Planung) xInAllRdyToStart := TRUE, + xInCarouselRun := #fbCarousel____.xOutConveyorFullSpeed, // TODO(E-Planung) - nur am Kreisel, sonst Zeile loeschen xInRelease := "DB_TRO_TEST".TRO17, - stInOutMachineState := #stInOutControlUnitCabinet, + stInOutMachineState := #stInOutControlUnitCabinet, // TODO(E-Planung) - Schaltschrank stInOutCognexInterface := #stCognexInterfaceDummy, arInOutJamEntr1 := "DB_JamArea____".stJam____.arCarrier, // TODO(E-Planung) - Staubereich von TRO13 - stInOutJamEntr1 := "DB_JamArea____".stJam____.stData, + stInOutJamEntr1 := "DB_JamArea____".stJam____.stData, // TODO(E-Planung) arInOutJamEntr2 := "DB_JamArea____".stJam____.arCarrier, // TODO(E-Planung) - Staubereich von TRO14 - stInOutJamEntr2 := "DB_JamArea____".stJam____.stData, + stInOutJamEntr2 := "DB_JamArea____".stJam____.stData, // TODO(E-Planung) arInOutJamExit2 := "DB_JamArea____".stJam____.arCarrier, // TODO(E-Planung) - Staubereich nach TRO06 - stInOutJamExit2 := "DB_JamArea____".stJam____.stData, + stInOutJamExit2 := "DB_JamArea____".stJam____.stData, // TODO(E-Planung) xOutStopper1 => "MB____", // TODO(E-Planung) - stInOutHMI := "DB_Interface_HMI".stTRO.TRO17, - nOutStateLast => "DB_GLOB_TroState".arTroState["cMainTro____"]); // TODO(E-Planung) + nOutStateLast => "DB_GLOB_TroState".arTroState["cMainTro____"], // TODO(E-Planung) + stInOutHMI := "DB_Interface_HMI".stTRO.TRO17); + END_REGION REGION TRO15 (1Sep) Sep 0038 @@ -654,9 +1014,10 @@ REGION TRO15 (1Sep) Sep 0038 // Vorgaenger: TRO16 // Nachfolger: TRO14 // Einstufung: mittel + // Aufbau nach Template FB_ILS_MTRO_1Sep.scl.j2 (Referenz: doc/TRO_Katalog/scl_templates) // Separator 1 = Bauteil 0038 aus dem Layout - #TRO15.stInSeparator1.Settings.nSeparatorNo := "cSep_____"; // TODO(E-Planung) + #TRO15.stInSeparator1.Settings.nSeparatorNo := "cSep_____"; // TODO(E-Planung) #TRO15.stInSeparator1.Settings.tDelayToNextItem := "TimeForSepWaiting_Short"; #TRO15.stInSeparator1.Settings.tTrailingTime := t#600ms; // TODO(E-Planung): pruefen #TRO15.stInSeparator1.Settings.tHandlingTime := t#200ms; // TODO(E-Planung): pruefen @@ -665,24 +1026,28 @@ REGION TRO15 (1Sep) Sep 0038 #TRO15.stInSeparator1.Settings.xPluggedPart := FALSE; #TRO15.stInSeparator1.Settings.xPluggedScanner := FALSE; #TRO15.stInSeparator1.stSenInSep := "DB_Inputs".Sensors["cInBG____"]; // TODO(E-Planung) - #TRO15.stInSeparator1.Settings.tSenFree := T#1500ms; // TODO(E-Planung): pruefen - #TRO15.stInSeparator1.Settings.tSenWait := T#4000ms; // TODO(E-Planung): pruefen + #TRO15.stInSenJam2 := "DB_Inputs".Sensors["cInBG____"]; // TODO(E-Planung) - #TRO15.stInPriorityManager.xReleaseOk := TRUE; + #TRO15.stInSeparator1.Settings.tSenFree := T#1500ms; // TODO(E-Planung): pruefen + #TRO15.stInSeparator1.Settings.tSenWait := T#4000ms; // TODO(E-Planung): pruefen + + #TRO15.stInPriorityManager.xReleaseOk := TRUE; // braucht keine Vorfahrtsregelung #TRO15(nInMainTroNo := "cMainTro____", // TODO(E-Planung) xInSftyOk := "DB_InterfaceSafety".stFromSafety.EStopMain.Q, // TODO(E-Planung) xInAllRdyToStart := TRUE, + xInCarouselRun := #fbCarousel____.xOutConveyorFullSpeed, // TODO(E-Planung) - nur am Kreisel, sonst Zeile loeschen xInRelease := "DB_TRO_TEST".TRO15, - stInOutMachineState := #stInOutControlUnitCabinet, + stInOutMachineState := #stInOutControlUnitCabinet, // TODO(E-Planung) - Schaltschrank stInOutCognexInterface := #stCognexInterfaceDummy, arInOutJamEntr1 := "DB_JamArea____".stJam____.arCarrier, // TODO(E-Planung) - Staubereich von TRO16 - stInOutJamEntr1 := "DB_JamArea____".stJam____.stData, + stInOutJamEntr1 := "DB_JamArea____".stJam____.stData, // TODO(E-Planung) arInOutJamExit2 := "DB_JamArea____".stJam____.arCarrier, // TODO(E-Planung) - Staubereich nach TRO14 - stInOutJamExit2 := "DB_JamArea____".stJam____.stData, + stInOutJamExit2 := "DB_JamArea____".stJam____.stData, // TODO(E-Planung) xOutStopper1 => "MB____", // TODO(E-Planung) - stInOutHMI := "DB_Interface_HMI".stTRO.TRO15, - nOutStateLast => "DB_GLOB_TroState".arTroState["cMainTro____"]); // TODO(E-Planung) + nOutStateLast => "DB_GLOB_TroState".arTroState["cMainTro____"], // TODO(E-Planung) + stInOutHMI := "DB_Interface_HMI".stTRO.TRO15); + END_REGION REGION TRO06 (1Sep1Swi) Sep 0003 @@ -749,9 +1114,10 @@ REGION TRO14 (1Sep) Sep 0037 // Vorgaenger: TRO15 // Nachfolger: TRO17 // Einstufung: mittel + // Aufbau nach Template FB_ILS_MTRO_1Sep.scl.j2 (Referenz: doc/TRO_Katalog/scl_templates) // Separator 1 = Bauteil 0037 aus dem Layout - #TRO14.stInSeparator1.Settings.nSeparatorNo := "cSep_____"; // TODO(E-Planung) + #TRO14.stInSeparator1.Settings.nSeparatorNo := "cSep_____"; // TODO(E-Planung) #TRO14.stInSeparator1.Settings.tDelayToNextItem := "TimeForSepWaiting_Short"; #TRO14.stInSeparator1.Settings.tTrailingTime := t#600ms; // TODO(E-Planung): pruefen #TRO14.stInSeparator1.Settings.tHandlingTime := t#200ms; // TODO(E-Planung): pruefen @@ -760,24 +1126,28 @@ REGION TRO14 (1Sep) Sep 0037 #TRO14.stInSeparator1.Settings.xPluggedPart := FALSE; #TRO14.stInSeparator1.Settings.xPluggedScanner := FALSE; #TRO14.stInSeparator1.stSenInSep := "DB_Inputs".Sensors["cInBG____"]; // TODO(E-Planung) - #TRO14.stInSeparator1.Settings.tSenFree := T#1500ms; // TODO(E-Planung): pruefen - #TRO14.stInSeparator1.Settings.tSenWait := T#4000ms; // TODO(E-Planung): pruefen + #TRO14.stInSenJam2 := "DB_Inputs".Sensors["cInBG____"]; // TODO(E-Planung) - #TRO14.stInPriorityManager.xReleaseOk := TRUE; + #TRO14.stInSeparator1.Settings.tSenFree := T#1500ms; // TODO(E-Planung): pruefen + #TRO14.stInSeparator1.Settings.tSenWait := T#4000ms; // TODO(E-Planung): pruefen + + #TRO14.stInPriorityManager.xReleaseOk := TRUE; // braucht keine Vorfahrtsregelung #TRO14(nInMainTroNo := "cMainTro____", // TODO(E-Planung) xInSftyOk := "DB_InterfaceSafety".stFromSafety.EStopMain.Q, // TODO(E-Planung) xInAllRdyToStart := TRUE, + xInCarouselRun := #fbCarousel____.xOutConveyorFullSpeed, // TODO(E-Planung) - nur am Kreisel, sonst Zeile loeschen xInRelease := "DB_TRO_TEST".TRO14, - stInOutMachineState := #stInOutControlUnitCabinet, + stInOutMachineState := #stInOutControlUnitCabinet, // TODO(E-Planung) - Schaltschrank stInOutCognexInterface := #stCognexInterfaceDummy, arInOutJamEntr1 := "DB_JamArea____".stJam____.arCarrier, // TODO(E-Planung) - Staubereich von TRO15 - stInOutJamEntr1 := "DB_JamArea____".stJam____.stData, + stInOutJamEntr1 := "DB_JamArea____".stJam____.stData, // TODO(E-Planung) arInOutJamExit2 := "DB_JamArea____".stJam____.arCarrier, // TODO(E-Planung) - Staubereich nach TRO17 - stInOutJamExit2 := "DB_JamArea____".stJam____.stData, + stInOutJamExit2 := "DB_JamArea____".stJam____.stData, // TODO(E-Planung) xOutStopper1 => "MB____", // TODO(E-Planung) - stInOutHMI := "DB_Interface_HMI".stTRO.TRO14, - nOutStateLast => "DB_GLOB_TroState".arTroState["cMainTro____"]); // TODO(E-Planung) + nOutStateLast => "DB_GLOB_TroState".arTroState["cMainTro____"], // TODO(E-Planung) + stInOutHMI := "DB_Interface_HMI".stTRO.TRO14); + END_REGION REGION TRO08 (Vario) Sep 0054 @@ -785,52 +1155,64 @@ REGION TRO08 (Vario) Sep 0054 // Vorgaenger: TRO06 // Nachfolger: TRO09 // Einstufung: hoch + // Aufbau nach Template FB_ILS_MTRO_Vario.scl.j2 (Referenz: doc/TRO_Katalog/scl_templates) // Separator 1 = Bauteil 0054 aus dem Layout - #TRO08.stInSeparator1.Settings.nSeparatorNo := "cSep_____"; // TODO(E-Planung) + #TRO08.stInSeparator1.Settings.nSeparatorNo := "cSep_____"; // TODO(E-Planung) #TRO08.stInSeparator1.Settings.tDelayToNextItem := "TimeForSepWaiting_Short"; - #TRO08.stInSeparator1.Settings.tTrailingTime := t#600ms; // TODO(E-Planung): pruefen - #TRO08.stInSeparator1.Settings.tHandlingTime := t#200ms; // TODO(E-Planung): pruefen + #TRO08.stInSeparator1.Settings.tTrailingTime := t#800ms; // TODO(E-Planung): pruefen + #TRO08.stInSeparator1.Settings.tHandlingTime := t#300ms; // TODO(E-Planung): pruefen #TRO08.stInSeparator1.Settings.tJam := "TimeForSepJam"; - #TRO08.stInSeparator1.Settings.xPluggedJam := TRUE; + #TRO08.stInSeparator1.Settings.xPluggedJam := FALSE; #TRO08.stInSeparator1.Settings.xPluggedPart := FALSE; #TRO08.stInSeparator1.Settings.xPluggedScanner := FALSE; #TRO08.stInSeparator1.stSenInSep := "DB_Inputs".Sensors["cInBG____"]; // TODO(E-Planung) - #TRO08.stInSeparator1.Settings.tSenFree := T#1500ms; // TODO(E-Planung): pruefen - #TRO08.stInSeparator1.Settings.tSenWait := T#4000ms; // TODO(E-Planung): pruefen + + #TRO08.stInSeparator1.Settings.tSenFree := t#2000ms; // TODO(E-Planung): pruefen + #TRO08.stInSeparator1.Settings.tSenWait := T#5000ms; // TODO(E-Planung): pruefen #TRO08.stInVario.Settings.xContinousEmptying := FALSE; - #TRO08.stInVario.Settings.tWaitForJog := T#300ms; // TODO(E-Planung): pruefen - #TRO08.stInVario.Settings.tConvEmpty := T#45000ms; // TODO(E-Planung): pruefen - #TRO08.stInVario.Settings.nCountCarrier := 1; // TODO(E-Planung): pruefen + #TRO08.stInVario.Settings.tWaitForJog := T#300ms; // TODO(E-Planung): pruefen + #TRO08.stInVario.Settings.tConvEmpty := T#45000ms; // TODO(E-Planung): pruefen + #TRO08.stInVario.Settings.nCountCarrier := 1; // TODO(E-Planung): pruefen #TRO08.stInVario.Settings.tWaitForStop := t#3s; + #TRO08.stInVario.Settings.tCarrierInPosDelay := t#1200ms; #TRO08.stInVario.Settings.tCarrierInPosEdgeDelay := t#100ms; + + #TRO08.stInVario.Settings.tRasterHigh := t#5s; // TODO(E-Planung): pruefen + #TRO08.stInVario.Settings.tRasterLow := t#5s; // TODO(E-Planung): pruefen + + #TRO08.stInVario.stSenCarrInPos := "DB_Inputs".Sensors["cInBG____"]; // MT in Pos - TODO(E-Planung) + #TRO08.stInVario.stSenFinger := "DB_Inputs".Sensors["cInBG____"]; // Pusher Dog in Pos - TODO(E-Planung) + #TRO08.stInVario.stSenLastPos := "DB_Inputs".Sensors["cInBG____"]; // Conveyor full - TODO(E-Planung) + #TRO08.stInVario.stSenJam := "DB_Inputs".Sensors["cInBG____"]; // Jam detector - TODO(E-Planung) + + #TRO08.stInPriorityManager.xReleaseOk := TRUE; // braucht keine Vorfahrtsregelung #TRO08.stInVario.Settings.xJamSenDelayActive := TRUE; #TRO08.stInVario.Settings.tJamSenDelay := T#2s; - #TRO08.stInVario.stSenCarrInPos := "DB_Inputs".Sensors["cInBG____"]; // TODO(E-Planung) - #TRO08.stInVario.stSenFinger := "DB_Inputs".Sensors["cInBG____"]; // TODO(E-Planung) - #TRO08.stInVario.stSenLastPos := "DB_Inputs".Sensors["cInBG____"]; // TODO(E-Planung) - #TRO08.stInVario.stSenJam := "DB_Inputs".Sensors["cInBG____"]; // TODO(E-Planung) - #TRO08.stInPriorityManager.xReleaseOk := TRUE; + #TRO08.stInSettings.xIsBorner := TRUE; // TODO(E-Planung) - pruefen - Bedeutung mit SPS klaeren #TRO08(nInMainTroNo := "cMainTro____", // TODO(E-Planung) xInSftyOk := "DB_InterfaceSafety".stFromSafety.EStopMain.Q, // TODO(E-Planung) - xInAllRdyToStart := TRUE, - xInRelease := "DB_TRO_TEST".TRO08, xInMotorProtection := "FC____", // TODO(E-Planung) - xInAutomatic := #t_automatik, - stInOutMachineState := #stInOutControlUnitCabinet, + xInAllRdyToStart := TRUE, + xInReset := "cTodoFalse", + xInErrorQuit := "SF____", // TODO(E-Planung) - Quittierung + xInAutomatic := #t_automatik, // TODO(E-Planung) - Automatik des Schaltschranks + xInRelease := "DB_TRO_TEST".TRO08, + arInOutJamEntr := "DB_JamArea____".stJam____.arCarrier, // TODO(E-Planung) - Staubereich von TRO06 + stInOutJamEntr := "DB_JamArea____".stJam____.stData, // TODO(E-Planung) + arInOutJamFinger := "DB_JamArea____".stJam____.arCarrier, // TODO(E-Planung) - Staubereich nach TRO09 + stInOutJamFinger := "DB_JamArea____".stJam____.stData, // TODO(E-Planung) + stInOutMachineState := #stInOutControlUnitCabinet, // TODO(E-Planung) - Schaltschrank stInOutCognexInterface := #stCognexInterfaceDummy, - arInOutJamEntr1 := "DB_JamArea____".stJam____.arCarrier, // TODO(E-Planung) - Staubereich von TRO06 - stInOutJamEntr1 := "DB_JamArea____".stJam____.stData, - arInOutJamExit2 := "DB_JamArea____".stJam____.arCarrier, // TODO(E-Planung) - Staubereich nach TRO09 - stInOutJamExit2 := "DB_JamArea____".stJam____.stData, - xOutStopper1 => "MB____", // TODO(E-Planung) - xOutVarioMotor => "MA____", // TODO(E-Planung) stInOutHMI := "DB_Interface_HMI".stTRO.TRO08, - nOutStateLast => "DB_GLOB_TroState".arTroState["cMainTro____"]); // TODO(E-Planung) + nOutStateLast => "DB_GLOB_TroState".arTroState["cMainTro____"], // TODO(E-Planung) + xOutStopper => "MB____", // TODO(E-Planung) + xOutVarioMotor => "MA____"); // TODO(E-Planung) + END_REGION REGION TRO09 (1Sep) Sep 0055 @@ -838,9 +1220,10 @@ REGION TRO09 (1Sep) Sep 0055 // Vorgaenger: TRO08 // Nachfolger: TRO07 // Einstufung: mittel + // Aufbau nach Template FB_ILS_MTRO_1Sep.scl.j2 (Referenz: doc/TRO_Katalog/scl_templates) // Separator 1 = Bauteil 0055 aus dem Layout - #TRO09.stInSeparator1.Settings.nSeparatorNo := "cSep_____"; // TODO(E-Planung) + #TRO09.stInSeparator1.Settings.nSeparatorNo := "cSep_____"; // TODO(E-Planung) #TRO09.stInSeparator1.Settings.tDelayToNextItem := "TimeForSepWaiting_Short"; #TRO09.stInSeparator1.Settings.tTrailingTime := t#600ms; // TODO(E-Planung): pruefen #TRO09.stInSeparator1.Settings.tHandlingTime := t#200ms; // TODO(E-Planung): pruefen @@ -849,24 +1232,28 @@ REGION TRO09 (1Sep) Sep 0055 #TRO09.stInSeparator1.Settings.xPluggedPart := FALSE; #TRO09.stInSeparator1.Settings.xPluggedScanner := FALSE; #TRO09.stInSeparator1.stSenInSep := "DB_Inputs".Sensors["cInBG____"]; // TODO(E-Planung) - #TRO09.stInSeparator1.Settings.tSenFree := T#1500ms; // TODO(E-Planung): pruefen - #TRO09.stInSeparator1.Settings.tSenWait := T#4000ms; // TODO(E-Planung): pruefen + #TRO09.stInSenJam2 := "DB_Inputs".Sensors["cInBG____"]; // TODO(E-Planung) - #TRO09.stInPriorityManager.xReleaseOk := TRUE; + #TRO09.stInSeparator1.Settings.tSenFree := T#1500ms; // TODO(E-Planung): pruefen + #TRO09.stInSeparator1.Settings.tSenWait := T#4000ms; // TODO(E-Planung): pruefen + + #TRO09.stInPriorityManager.xReleaseOk := TRUE; // braucht keine Vorfahrtsregelung #TRO09(nInMainTroNo := "cMainTro____", // TODO(E-Planung) xInSftyOk := "DB_InterfaceSafety".stFromSafety.EStopMain.Q, // TODO(E-Planung) xInAllRdyToStart := TRUE, + xInCarouselRun := #fbCarousel____.xOutConveyorFullSpeed, // TODO(E-Planung) - nur am Kreisel, sonst Zeile loeschen xInRelease := "DB_TRO_TEST".TRO09, - stInOutMachineState := #stInOutControlUnitCabinet, + stInOutMachineState := #stInOutControlUnitCabinet, // TODO(E-Planung) - Schaltschrank stInOutCognexInterface := #stCognexInterfaceDummy, arInOutJamEntr1 := "DB_JamArea____".stJam____.arCarrier, // TODO(E-Planung) - Staubereich von TRO08 - stInOutJamEntr1 := "DB_JamArea____".stJam____.stData, + stInOutJamEntr1 := "DB_JamArea____".stJam____.stData, // TODO(E-Planung) arInOutJamExit2 := "DB_JamArea____".stJam____.arCarrier, // TODO(E-Planung) - Staubereich nach TRO07 - stInOutJamExit2 := "DB_JamArea____".stJam____.stData, + stInOutJamExit2 := "DB_JamArea____".stJam____.stData, // TODO(E-Planung) xOutStopper1 => "MB____", // TODO(E-Planung) - stInOutHMI := "DB_Interface_HMI".stTRO.TRO09, - nOutStateLast => "DB_GLOB_TroState".arTroState["cMainTro____"]); // TODO(E-Planung) + nOutStateLast => "DB_GLOB_TroState".arTroState["cMainTro____"], // TODO(E-Planung) + stInOutHMI := "DB_Interface_HMI".stTRO.TRO09); + END_REGION END_FUNCTION_BLOCK diff --git a/tests/test_scl_templates.py b/tests/test_scl_templates.py index 1a86955..eba7610 100644 --- a/tests/test_scl_templates.py +++ b/tests/test_scl_templates.py @@ -36,6 +36,8 @@ def _normalisiert(text: str) -> list[str]: for zeile in text.splitlines(): zeile = re.sub(r"//.*$", "", zeile) # Kommentar zeile = re.sub(r"\s+", " ", zeile).strip() # Leerraum + # "a:=b" und "a := b" sind dasselbe SCL (Referenzen schreiben beides) + zeile = re.sub(r"\s*(:=|=>)\s*", r" \1 ", zeile) if zeile: zeilen.append(zeile) return zeilen @@ -49,11 +51,26 @@ def _referenz_region(datei: str) -> list[str]: return _normalisiert("\n".join(zeilen[anfang:ende + 1])) +def _jam(jam, db: str) -> None: + """Staubereich mit bekanntem DB (Traeger und Daten wie ueblich darin).""" + jam.db = _name(db) + jam.carriers = _name(f"{db}.arCarrier") + jam.data = _name(f"{db}.stData") + + +def _scanner(sc, interface: str, tag: str, hw_results: str) -> None: + sc.interface = _name(interface) + sc.tag = _name(tag) + sc.hw_results = _name(hw_results) + + def _kontext(tro_id: str, type_name: str, vorgaenger: list[str], - nachfolger: list[str]) -> SclTro: + nachfolger: list[str], separators: list[str] | None = None, + hosts: list[str] | None = None) -> SclTro: """Kontext eines TRO mit der Topologie der Referenzstelle.""" - tro = DerivedTro(tro_id=tro_id, type_name=type_name, label=tro_id, hosts=[], - separators=["0001"], scanners=[], reason="Referenz", + tro = DerivedTro(tro_id=tro_id, type_name=type_name, label=tro_id, + hosts=hosts or [], separators=separators or ["0001"], + scanners=[], reason="Referenz", predecessors=vorgaenger, successors=nachfolger) document = TroDocument.from_analysis(Analysis(tros=[tro]), source="referenz") return build_context(document, "referenz").tros[0] @@ -105,6 +122,206 @@ def test_1sep1swi_wie_tro107(templates): _vergleich(ist, _referenz_region("FB_ILS_MTRO_1Sep1Swi.scl")) +def test_1sep_wie_tro100(templates): + """FB_ILS_MTRO_1Sep gegen TRO 100 (=A01+UH01-KF00 FB_Main).""" + t = _kontext("TRO100", "1Sep", ["TRO099"], ["TRO101"]) + t.region_title = "TRO 100 (1Sep)" + sep = t.separators[0] + sep.no = _name("cSep100.1") + sep.sensor = _name("cInBG3242") + sep.stopper = _name("MB3242") + t.jam_exits[0].sensor = _name("cInBG3243") + t.main_tro = _name("cMainTro100") + t.safety = _name('"DB_InterfaceSafety".stFromSafety.EStopMainOF1.Q') + t.carousel_run = _name("#fbCarousel0101.xOutConveyorFullSpeed") + t.machine_state = _name("#stInOutControlUnitCabinetOF1") + _jam(t.jam_entries[0], '"DB_JamArea0100".stJam0100_1') + _jam(t.jam_exits[0], '"DB_JamArea0101".stJam0101_1') + + ist = _normalisiert(templates.render(t)) + _vergleich(ist, _referenz_region("FB_ILS_MTRO_1Sep.scl")) + + +def test_vario_wie_tro115(templates): + """FB_ILS_MTRO_Vario gegen TRO 115.""" + t = _kontext("TRO115", "Vario", ["TRO114"], ["TRO116"]) + t.region_title = "TRO 115 (Vario)" + sep = t.separators[0] + sep.no = _name("cSep115.1") + sep.sensor = _name("cInBG3025") + sep.stopper = _name("MB3025") + for name, wert in (("stSenCarrInPos", "cInBG3026"), ("stSenFinger", "cInBG3027"), + ("stSenLastPos", "cInBG3000"), ("stSenJam", "cInBG3001")): + t.vario_sensors[name] = _name(wert) + t.is_border = _name("TRUE") + t.main_tro = _name("cMainTro115") + t.safety = _name('"DB_InterfaceSafety".stFromSafety.EStopMainOF1.Q') + t.motor_protection = _name('"FC0145"') + t.error_quit = _name('"SF0002"') + t.automatic = _name('#t_Automatik_OF1 AND "SF0120"') + _jam(t.jam_in, '"DB_JamArea4104".stJam4104_1') + _jam(t.jam_out, '"DB_JamArea4103".stJam4103_1') + t.machine_state = _name("#stInOutControlUnitCabinetOF1") + t.vario_motor = _name("MA0145") + + ist = _normalisiert(templates.render(t)) + _vergleich(ist, _referenz_region("FB_ILS_MTRO_Vario.scl")) + + +def test_vario_workstation_wie_tro421(templates): + """FB_ILS_MTRO_Vario_workStation gegen die Aufrufstelle TRO 421 (UH04).""" + t = _kontext("TRO421", "Vario_workStation", ["TRO420"], ["TRO422"]) + t.region_title = "TRO 421 (Vario)" + sep = t.separators[0] + sep.no = _name("cSep421.1") + sep.sensor = _name("cInBG3326") + sep.stopper = _name("MB3326") + for name, wert in (("stSenFinger", "cInBG3315"), ("stSenLastPos", "cInBG3317"), + ("stSenCarrInPos", "cInBG3324"), ("stSenJam", "cInBG3320")): + t.vario_sensors[name] = _name(wert) + t.work_station.loaded_error_sensor = _name("cInBG3325") + t.work_station.station_sensor = _name("cInBG3314") + t.work_station.station_release = _name('#"rTrig_Workstation 1".CLK') + t.main_tro = _name("cMainTro421") + t.safety = _name('"DB_InterfaceSafety".stFromSafety.EStopMain.Q') + t.automatic = _name("#t_automatik") + t.release = '"DB_TRO_Test".TRO421' + t.motor_protection = _name('"FC0062"') + _jam(t.jam_in, '"DB_JamArea4004".stJam4004_2') + _jam(t.jam_out, '"DB_JamArea4005".stJam4005_1') + t.machine_state = _name("#stInOutControlUnitCabinet") + t.vario_motor = _name("MA0062") + + ist = _normalisiert(templates.render(t)) + _vergleich(ist, _referenz_region("FB_ILS_MTRO_Vario_workStation_CallSite.scl")) + + +def test_1sep2swi_wie_tro267(templates): + """FB_ILS_MTRO_1Sep2Swi gegen TRO 267 (Scanner BX2100, 3 Abgaenge).""" + t = _kontext("TRO267", "1Sep2Swi", ["TRO266"], ["TRO268", "TRO269", "TRO270"]) + t.region_title = "TRO 267 (1Sep2Switch)+Scanner(BX2100)" + sep = t.separators[0] + sep.no = _name("cSep267.1") + sep.sensor = _name("cInBG4440") + sep.part_sensor = _name("cInBG4465") + sep.stopper = _name("MB4440") + for jam, sensor in zip(t.jam_exits, ("cInBG4444", "cInBG4455", "cInBG4454")): + jam.sensor = _name(sensor) + for weiche, ventil in zip(t.switches, ("MB4444", "MB4455")): + weiche.valve = _name(ventil) + weiche.to1_destinations = 3 # Referenz: 3 je Weiche + t.switches[0].no = _name("cSwi267.1") + _scanner(t.scanners[0], "cScannerBX2100", "bx2100", + "=A01+UC021-BX2100~Ergebnisse_–_64_Bytes_1") + t.main_tro = _name("cMainTro267") + t.safety = _name('"cTodoTRUE"') + t.release = '"DB_TRO_Test".TRO267' + t.carousel_run = _name("#fbCarousel1110.xOutConveyorFullSpeed") + t.machine_state = _name("#stInOutControlUnitCabinetOF1") + _jam(t.jam_entries[0], '"DB_JamArea1110".stJam1110_4') + for jam, nr in zip(t.jam_exits[:2], ("5001", "5000")): # Uebergaben + jam.carriers = _name(f"#arCarrierHandoverJam{nr}") + jam.data = _name(f"#stJamDataHandoverJam{nr}") + _jam(t.jam_exits[2], '"DB_JamArea1110".stJam1110_5') + + ist = _normalisiert(templates.render(t)) + _vergleich(ist, _referenz_region("FB_ILS_MTRO_1Sep2Swi.scl")) + + +def test_1sep_sscc_wie_tro105(templates): + """FB_ILS_MTRO_1Sep_SSCC gegen TRO 105 (Scanner BX1104, SSCC-Scanner BX1107).""" + t = _kontext("TRO105", "1Sep_SSCC", ["TRO104"], ["TRO106"]) + t.region_title = "TRO 105 (1Sep)+Scanner" + sep = t.separators[0] + sep.no = _name("cSep105.1") + sep.sensor = _name("cInBG3280") + sep.stopper = _name("MB3280") + t.jam_exits[0].sensor = _name("cInBG3281") + _scanner(t.scanners[0], "cScannerBX1104", "bx1104", + "BX1104~Ergebnisse_–_64_Bytes_1") + _scanner(t.sscc.scanner, "#stCognexIntfTro105", "bx1107", + "BX1107~Ergebnisse_–_64_Bytes_1") + t.sscc.end_sensor = _name("cInBG3281") + t.sscc.hmi = _name("SSCC1107") + t.main_tro = _name("cMainTro105") + t.safety = _name('"DB_InterfaceSafety".stFromSafety.EStopMainOF1.Q') + t.carousel_run = _name("TRUE") + t.release = ('"FB_CommunicationWCSBL_DB".fbTeleHandler.xOutConnectionActive ' + 'OR "IBN".xFahrenOhneTcpPartner') + t.machine_state = _name("#stInOutControlUnitCabinetOF1") + _jam(t.jam_entries[0], '"DB_JamArea0104".stJam0104_3') + _jam(t.jam_exits[0], '"DB_JamArea0106".stJam0106_2') + t.correction_station = _name("0") + + ist = _normalisiert(templates.render(t)) + _vergleich(ist, _referenz_region("FB_ILS_MTRO_1Sep_SSCC.scl")) + + +def test_pinstore_auto_wie_tro208(templates): + """FB_ILS_MTRO_PinStore_Auto gegen BLOCK 1.1.1 (TRO 208). + + Die Referenz hat 19 Linien, schreibt aber nur die Linien 1-3 aus (bei + "Separator Store Out" nur Linie 1, "weitere analog"). Der Kontext hat + deshalb 19 Linien; was die Referenz abkuerzt, wird vor dem Vergleich aus + der Template-Ausgabe genommen. + """ + linien = [f"{n:04d}" for n in range(1, 20)] + t = _kontext("TRO208", "PinStore_Auto", ["TRO207"], ["TRO209"], + separators=linien, hosts=linien) + t.region_title = "BLOCK 1.1.1 (TRO 208)" + st = t.store + st.encoder = _name("#fbEncoderGF2200") + st.dest = _name("cDest11100") + st.conv_stations = _name("cHooksSorterMaxPin111") + st.stations_max = _name("cStationsMax111") + st.threshold = _name("cNoPositionsBlock1") + st.reference_sensor = _name("cInBG3001") + st.station = _name("111") + st.quit_local = _name('"SF0121" OR "SF0117"') + st.test_target = _name('"IBN".nTestTarget111') + st.run_in = _name("#fbSortConv1101.xOutConveyorFullSpeed") + st.run_out = _name("#fbExitConv1103.xOutConveyorFullSpeed") + st.db = _name('"DB_Storage1.1.1"') + st.removal = _name('"DB_HandshakeStorage".Str_StorageRemoval.' + 'arrudt_StorageRemovalHandshakeTROsLvl1[1]') + st.conv_db = _name('"DB_ConveyorStations".stConveyorStations111') + st.pin_sensor = _name("cInBG3000") + st.pin_stopper = _name("MB3000") + for linie, (laenge, sensor, stau, stopper) in zip(st.lines, ( + ("4", "cInBG3270", "cInBG3030", "MB3270"), + ('"cStorage111ExitJam2"', "cInBG3271", "cInBG3031", "MB3271"), + ('"cStorage111ExitJam3"', "cInBG3272", "cInBG3032", "MB3272"))): + linie.jam_length = _name(laenge) + linie.sensor = _name(sensor) + linie.jam_sensor = _name(stau) + linie.stopper = _name(stopper) + _scanner(t.scanners[0], "cScannerBX2104", "bx2104", + "=A01+UH02-BX2104~Ergebnisse_–_64_Bytes_1") + t.safety = _name('"DB_InterfaceSafety".stFromSafety.EStopMainOF2.Q') + t.release = '"DB_TRO_Test".TRO208' + t.machine_state = _name("#stInOutControlUnitCabinetOF2") + _jam(t.jam_in, '"DB_JamArea1101".stJam1101_2') + _jam(t.jam_out, '"DB_JamArea1103".stJam1103_1') + t.correction_station = _name("1") + + ist, abgekuerzt = [], False + for zeile in _normalisiert(templates.render(t)): + treffer = re.fullmatch(r"REGION Sep Store (\d+)", zeile) + if treffer: + abgekuerzt = int(treffer.group(1)) > 3 + if abgekuerzt: # REGION Sep Store 4..19 + abgekuerzt = zeile != "END_REGION" + continue + if re.search(r"arInJamSensor\[(\d+)\]", zeile) and \ + int(re.search(r"\[(\d+)\]", zeile).group(1)) > 3: + continue + if re.search(r"arOutSeparatorStore\[(\d+)\]", zeile) and \ + int(re.search(r"\[(\d+)\]", zeile).group(1)) > 1: + continue + ist.append(zeile) + _vergleich(ist, _referenz_region("FB_ILS_MTRO_PinStore_Auto.scl")) + + def test_template_ohne_bekannte_namen_hat_nur_markierte_luecken(templates): """Mit den heutigen Platzhaltern: jede offene Stelle traegt den TODO-Marker.""" t = _kontext("TRO07", "1Sep1Swi", ["SYS1"], ["TRO08", "TRO09"]) @@ -121,7 +338,9 @@ def test_jedes_template_rendert_fuer_echte_anlagen(name, templates): text = render(document, f"{name}_tro.json", templates=templates) regionen = [z for z in text.splitlines() if z.startswith("REGION ")] assert len(regionen) == len(document.tros) - assert "// Aus Template : FB_ILS_MTRO_1Sep1Swi" in text + kopf = next(z for z in text.splitlines() if z.startswith("// Aus Template :")) + for fb in {t.fb_block for t in document.tros if templates.has(t.fb_block)}: + assert fb in kopf def test_strikter_undefined_bricht_ab(tmp_path):