scl_skeleton --eplan: E-Planung-Namen auch in den PinStore-Lagerlinien

Sensor und Stopper jeder Lagerlinie (und des Pin-Separators) kommen aus der
E-Planung wie bei den Separatorbloecken (scl_context._sep_namen); die
Zaehlung der eingesetzten Namen beruecksichtigt die Linien. Dazu die
ID-Datei cfg/mubea_tro_ids.ini und .gitignore fuer lokale Claude-Code-
Einstellungen.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
Samer Ayadi
2026-10-15 16:16:22 +02:00
co-authored by Claude Opus 5.5
parent 77c5aac343
commit 7ec2b88b79
5 changed files with 107 additions and 18 deletions
+32 -14
View File
@@ -432,17 +432,28 @@ def _jam(n: int, neighbour: str, jam_db: str, sensor: SclName | None = None,
)
def _store(tro: TroBase) -> SclStore:
def _store(tro: TroBase, eplan: EplanDocument | None = None) -> 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.
jeder Separator als Linie. Sensor und Stopper jeder Linie (und des
Pin-Separators, falls tro_flow einen gefunden hat) kommen aus der
E-Planung wie bei den Separatorbloecken.
"""
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:]
pin_sensor, pin_stopper = _sep_namen(steuer[0], eplan) if steuer else (
_offen("cInBG____"), _offen("MB____"))
zeilen = []
for n, sep in enumerate(linien, start=1):
sensor, stopper = _sep_namen(sep, eplan)
zeilen.append(SclStoreLine(n=n, layout=sep,
jam_length=_offen('"cStorage____ExitJam"'),
sensor=sensor, jam_sensor=_offen("cInBG____"),
stopper=stopper))
return SclStore(
encoder=_offen("#fbEncoder____"),
dest=_offen("cDest____"),
@@ -460,27 +471,34 @@ def _store(tro: TroBase) -> SclStore:
'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)
],
pin_sensor=pin_sensor,
pin_stopper=pin_stopper,
lines=zeilen,
)
def _separator(i: int, layout: str, eplan: EplanDocument | None) -> SclSeparator:
def _sep_namen(layout: str, eplan: EplanDocument | None) -> tuple[SclName, SclName]:
"""Sensor und Stopperventil eines Layout-Separators aus der E-Planung.
Gilt fuer die Separatorbloecke (stInSeparator<n>) und genauso fuer die
Linien eines PinStore_Auto - beide sind Separatoren im Layout. Ohne
Zuordnung bleiben beide offen.
"""
rollen = eplan.for_layout(layout) if eplan is not None and layout != "?" else {}
sensor = rollen.get("sensor")
stopper = rollen.get("stopper")
return (_bekannt(_SENSOR.format(bmk=sensor.bmk)) if sensor else _offen("cInBG____"),
_bekannt(_VENTIL.format(bmk=stopper.bmk)) if stopper else _offen("MB____"))
def _separator(i: int, layout: str, eplan: EplanDocument | None) -> SclSeparator:
sensor, stopper = _sep_namen(layout, eplan)
return SclSeparator(
n=i,
layout=layout,
no=_offen("cSep_____"),
sensor=_bekannt(_SENSOR.format(bmk=sensor.bmk)) if sensor else _offen("cInBG____"),
stopper=_bekannt(_VENTIL.format(bmk=stopper.bmk)) if stopper else _offen("MB____"),
sensor=sensor,
stopper=stopper,
# Teilesensor kennt die E-Planung-Bruecke noch nicht - offen
part_sensor=_offen("cInBG____"),
)
@@ -604,7 +622,7 @@ def _tro_context(tro: TroBase, alle: dict[str, TroBase],
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,
store=_store(tro, eplan) if items.get(TroItem.STORAGE_LINE) else None,
)