SCL-Templates fuer alle Typen mit Referenz-Aufrufstelle (Schritt 5)

- 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 <noreply@anthropic.com>
This commit is contained in:
Samer Ayadi
2026-10-12 13:13:55 +02:00
co-authored by Claude Opus 5.5
parent 5764df1ac8
commit 41df841317
15 changed files with 2044 additions and 491 deletions
+3 -1
View File
@@ -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/<fbType>.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
+1 -1
View File
@@ -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/<fbType>.scl.j2`, Pilot: `FB_ILS_MTRO_1Sep1Swi`),
(`lib/scl_templates/<fbType>.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.
+7 -5
View File
@@ -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/<fbType>.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<n>`, `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),
+52 -17
View File
@@ -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)
│ └── <project>_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".<id>` 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<n>` 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".<id>` 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)?
+184 -14
View File
@@ -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<n>); None an Eingaengen
sensor: SclName | None = None
# Traeger-Array und Staudaten des Bereichs - im Normalfall <db>.arCarrier
# bzw. <db>.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,
)
+66
View File
@@ -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<n> 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".<id> 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
@@ -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<n> 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<n> 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
@@ -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".<id> - 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
@@ -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<n>"),
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
@@ -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
@@ -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
+37
View File
@@ -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
+355 -237
View File
@@ -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
File diff suppressed because it is too large Load Diff
+223 -4
View File
@@ -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):