hw_import --dxf: gemeinsame Zeichnung (Layout + E-Planung) als Hardwarequelle

hw_import liest mit --dxf statt der Positionsdatei eine DXF, in der Layout
und E-Planung zusammen liegen (Dematic): jeder Block mit Attribut IO ist ein
E-Bauteil (IO/VERW/BEZEICHNUNG/KENNZEICHNUNG, Einfuegepunkt), schon in
Layout-Koordinaten (HardwareDocument.layoutCoordinates). --conveyor-from-motor
nimmt den Foerderer aus der Motornummer, wenn kein K0102/#106 dasteht
("Motor KR-MA0055" -> K0055); "ILS-VARIO" zaehlt als Strecke.

merge_hw_layout: bei layoutCoordinates kein Lagebezug (Identitaet, nichts
abgelegt); --rules findet einen blossen Namen in SKEL_CFG. Neue Regeldatei
cfg/e_planning_dematic.ini (Sensor/Stopper gleiche Nummer, Weichenventil =
Nummer des Stausensors, Abstaende an dematic_merge..dxf gemessen).

Fehler behoben: zwei Antriebs-TROs auf einem Layout-Foerderer (Dematic VF_6,
TRO04/TRO06) bekamen beide denselben Vario-Motor. Jetzt Widerspruch mit
Vorschlag; scl_context faellt dann nicht auf den Motor des Foerderers zurueck.

Dematic: 115 Namen im FB_Main (alle im TIA-Import), offene Stellen 730 -> 615.
cfg/dematic_merge_tro_ids.ini: TRO-IDs der Dematic-Anlage.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
2026-10-21 18:21:20 +02:00
parent d414bd6cf3
commit 2fbd2f119d
10 changed files with 467 additions and 38 deletions
+14
View File
@@ -120,6 +120,20 @@ def test_vario_antrieb_ueber_den_foerderer():
assert tro.vario_sensors["stSenFinger"].todo
def test_widerspruch_im_antrieb_erbt_nicht_den_foerderermotor():
"""Zwei Vario-TROs auf einem Foerderer: merge_hw_layout fuehrt den Antrieb
als Widerspruch - dann nicht doch den Motor des Foerderers einsetzen."""
doc = anlage()
doc.bindings += [
_bind("TRO03", "drive", "motor", "MA0210", "cOutMA0210", status="widerspruch"),
_bind("TRO03", "drive", "motorProtection", "FC0210", "cInFC0210",
status="widerspruch"),
]
tro = _by_id(_kontext(doc), "TRO03")
assert (tro.vario_motor.value, tro.vario_motor.todo) == ("MA____", True)
assert tro.motor_protection.todo
def test_ohne_hardwareplanung_alles_offen():
doc = anlage()
ctx = build_context(doc.layout, "anlage_tro.json")